build: reanimate the dead
Fix build with ndn-cxx 0.7.1 and ChronoSync 0.5.3
* Adapt to new API
* Upgrade to Qt5
* Several other bugs
Refs: #4563, #4087
Change-Id: Ic55d687caade08f557f9b9ec3e9569bc96798710
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..f475e24
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,27 @@
+name: Build
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ linux:
+ runs-on: ${{ matrix.os }}
+ name: ${{ matrix.os }} build
+
+ strategy:
+ matrix:
+ os: [Ubuntu-18.04, Ubuntu-20.04]
+
+ env:
+ NODE_LABELS: "Linux Ubuntu ${{ matrix.os }}"
+ WAF_JOBS: 2
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Run build script
+ run: |
+ ./.jenkins
diff --git a/.gitignore b/.gitignore
index 530be1d..051dacb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@
*.DS_Store
*~
tmp/
+.waf3-*-*/
diff --git a/.gitmodules b/.gitmodules
index e6c1609..462f6b1 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,4 +1,4 @@
[submodule "ChronoSync"]
path = ChronoSync
- url = ../ChronoSync.git
+ url = git://github.com/named-data/ChronoSync.git
branch = master
diff --git a/.jenkins.d/00-deps.sh b/.jenkins.d/00-deps.sh
index 07f904c..261097c 100755
--- a/.jenkins.d/00-deps.sh
+++ b/.jenkins.d/00-deps.sh
@@ -19,11 +19,7 @@
sudo apt-get -qq -y install build-essential
sudo apt-get -qq -y install libssl-dev libsqlite3-dev
- if has Ubuntu-12.04 $NODE_LABELS; then
- sudo apt-get install -qq -y libboost1.48-all-dev
- else
- sudo apt-get install -qq -y libboost-all-dev
- fi
-
- sudo apt-get install -qq -y qt4-dev-tools protobuf-compiler libprotobuf-dev libqt4-sql-sqlite
+ sudo apt-get -qq -y install libprotobuf-dev protobuf-compiler libevent-dev libcrypto++-dev
+ sudo apt-get -qq -y install libboost-all-dev
+ sudo apt-get -qq -y install qt5-default
fi
diff --git a/.jenkins.d/10-ndn-cxx.sh b/.jenkins.d/10-ndn-cxx.sh
index 32bc8e1..841aa3f 100755
--- a/.jenkins.d/10-ndn-cxx.sh
+++ b/.jenkins.d/10-ndn-cxx.sh
@@ -23,9 +23,9 @@
pushd ndn-cxx >/dev/null
-./waf configure -j1 --color=yes --enable-shared --disable-static --without-osx-keychain
-./waf -j1 --color=yes
-sudo ./waf install -j1 --color=yes
+./waf configure --color=yes --enable-shared --disable-static --without-osx-keychain
+./waf --color=yes
+sudo ./waf install --color=yes
popd >/dev/null
popd >/dev/null
diff --git a/.jenkins.d/11-chronosync.sh b/.jenkins.d/11-chronosync.sh
index 78aeab1..b7484fd 100755
--- a/.jenkins.d/11-chronosync.sh
+++ b/.jenkins.d/11-chronosync.sh
@@ -11,9 +11,9 @@
git submodule init
git submodule update
pushd ChronoSync >/dev/null
-sudo ./waf -j1 --color=yes distclean
-./waf -j1 --color=yes configure
-./waf -j1 --color=yes build
-sudo ./waf install -j1 --color=yes
+sudo ./waf --color=yes distclean
+./waf --color=yes configure
+./waf --color=yes build
+sudo ./waf install --color=yes
sudo ldconfig || true
popd >/dev/null
diff --git a/.jenkins.d/20-build.sh b/.jenkins.d/20-build.sh
index fca152a..4174800 100755
--- a/.jenkins.d/20-build.sh
+++ b/.jenkins.d/20-build.sh
@@ -3,22 +3,8 @@
set -e
# Cleanup
-sudo ./waf -j1 --color=yes distclean
-
-# Configure/build in release mode
-./waf -j1 --color=yes configure
-./waf -j1 --color=yes build
-
-# Cleanup
-sudo ./waf -j1 --color=yes distclean
-
-# Configure/build in debug mode
-./waf -j1 --color=yes configure --debug
-./waf -j1 --color=yes build
-
-# Cleanup
-sudo ./waf -j1 --color=yes distclean
+sudo ./waf --color=yes distclean
# Configure/build in optimized mode with tests
-./waf -j1 --color=yes configure --with-tests
-./waf -j1 --color=yes build
+./waf --color=yes configure --debug --with-tests
+./waf --color=yes build
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 3ad69cd..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-# For Ubuntu platform only
-
-language: cpp
-os:
- - linux
-compiler:
- - gcc
-notifications:
- email:
- on_success: always
- on_failure: always
-before_install:
- - travis_retry sudo apt-get update
- - travis_retry sudo apt-get install -qq libssl-dev libprotobuf-dev protobuf-compiler libboost1.48-all-dev libcrypto++-dev libsqlite3-dev
-script:
- - ./.jenkins
diff --git a/README.md b/README.md
index 7d28d23..c0a2bb7 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
1. When you switch to a new room, you'll temporarily see yourself in two nodes for a minute or so. It won't affect others, just yourself. Hopefully it's not so disturbing.
2. Sometimes you may not get the most up-to-date chat history.
-## For those who wants (or is forced to) compile from source code
+## For those who want (or is forced to) compile from source code
-----------------------------------------------------------------
### Compilation steps for OSX
@@ -48,7 +48,7 @@
Congratulations! build/ChronoChat.app is ready to use (on a Mac).
-### Compilation steps for Ubuntu 12.04, 13.10, 14.04
+### Compilation steps for Ubuntu 18.04, 20.04
1. Configure [NDN PPA repository](http://named-data.net/doc/NFD/current/FAQ.html#how-to-start-using-ndn-ppa-repository-on-ubuntu-linux) and install NFD if you don't have it yet.
@@ -56,9 +56,9 @@
2. Install ChronoChat dependencies
- sudo apt-get install libprotobuf-dev protobuf-compiler libevent-dev
- sudo apt-get install libboost1.48-all-dev
- sudo apt-get install qt4-dev-tools
+ sudo apt-get install libprotobuf-dev protobuf-compiler libevent-dev libcrypto++-dev
+ sudo apt-get install libboost-all-dev
+ sudo apt-get install qt5-default
3. Fetch source code with submodules
@@ -82,4 +82,5 @@
./waf configure
./waf
-Congratulations! build/ChronoChat is ready to use. Do not forget to start ccnd and configure FIB before using ChronoChat.
+Congratulations! build/ChronoChat is ready to use. Do not forget to start NFD and configure FIB before using ChronoChat.
+For ease of debugging, you can generate trusted identities in your local TPM using `debug-tools/create-cert`.
diff --git a/debug-tools/create-cert.cc b/debug-tools/create-cert.cc
index 09861d3..5941783 100644
--- a/debug-tools/create-cert.cc
+++ b/debug-tools/create-cert.cc
@@ -6,64 +6,50 @@
*/
#include <ndn-cxx/security/key-chain.hpp>
+#include <ndn-cxx/security/signing-helpers.hpp>
+#include <ndn-cxx/util/io.hpp>
+#include <iostream>
using namespace ndn;
+using ndn::security::Certificate;
+using ndn::security::pib::Identity;
+using ndn::security::pib::Key;
+
+void
+generateCertificate(KeyChain& keyChain, Name name) {
+ try {
+ keyChain.getPib().getIdentity(name);
+ } catch (ndn::security::pib::Pib::Error&) {
+ Identity id = keyChain.createIdentity(name);
+ Key key = id.getDefaultKey();
+ Certificate cert = Certificate(key.getDefaultCertificate());
+
+ ndn::SignatureInfo signatureInfo;
+ signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(
+ time::system_clock::now(), time::system_clock::now() + time::days(7300)));
+
+ keyChain.sign(cert, security::signingByIdentity("/ndn/test").setSignatureInfo(signatureInfo));
+ keyChain.setDefaultCertificate(key, cert);
+
+ std::cout << "Generated cert " << cert.getName() << " with KeyLocator " << cert.getKeyLocator().value() << std::endl;
+ }
+}
int
main()
{
- KeyChain keyChain("sqlite3", "file");
- std::vector<CertificateSubjectDescription> subjectDescription;
+ KeyChain keyChain;
- Name root("/ndn");
- Name rootCertName = keyChain.createIdentity(root);
+ // Root certificate
+ generateCertificate(keyChain, "/ndn/test");
- Name test("/ndn/test");
- Name testKeyName = keyChain.generateRsaKeyPairAsDefault(test, true);
- shared_ptr<IdentityCertificate> testCert =
- keyChain.prepareUnsignedIdentityCertificate(testKeyName, root,
- time::system_clock::now(),
- time::system_clock::now() + time::days(7300),
- subjectDescription);
- keyChain.signByIdentity(*testCert, root);
- keyChain.addCertificateAsIdentityDefault(*testCert);
+ // Test certificates
+ generateCertificate(keyChain, "/ndn/test/alice");
+ generateCertificate(keyChain, "/ndn/test/bob");
+ generateCertificate(keyChain, "/ndn/test/cathy");
- Name alice("/ndn/test/alice");
- if(!keyChain.doesIdentityExist(alice))
- {
- Name aliceKeyName = keyChain.generateRsaKeyPairAsDefault(alice, true);
- shared_ptr<IdentityCertificate> aliceCert =
- keyChain.prepareUnsignedIdentityCertificate(aliceKeyName, test,
- time::system_clock::now(),
- time::system_clock::now() + time::days(7300),
- subjectDescription);
- keyChain.signByIdentity(*aliceCert, test);
- keyChain.addCertificateAsIdentityDefault(*aliceCert);
- }
-
- Name bob("/ndn/test/bob");
- if(!keyChain.doesIdentityExist(bob))
- {
- Name bobKeyName = keyChain.generateRsaKeyPairAsDefault(bob, true);
- shared_ptr<IdentityCertificate> bobCert =
- keyChain.prepareUnsignedIdentityCertificate(bobKeyName, test,
- time::system_clock::now(),
- time::system_clock::now() + time::days(7300),
- subjectDescription);
- keyChain.signByIdentity(*bobCert, test);
- keyChain.addCertificateAsIdentityDefault(*bobCert);
- }
-
- Name cathy("/ndn/test/cathy");
- if(!keyChain.doesIdentityExist(cathy))
- {
- Name cathyKeyName = keyChain.generateRsaKeyPairAsDefault(cathy, true);
- shared_ptr<IdentityCertificate> cathyCert =
- keyChain.prepareUnsignedIdentityCertificate(cathyKeyName, test,
- time::system_clock::now(),
- time::system_clock::now() + time::days(7300),
- subjectDescription);
- keyChain.signByIdentity(*cathyCert, test);
- keyChain.addCertificateAsIdentityDefault(*cathyCert);
- }
+ std::ofstream file("security/test-anchor.cert");
+ ndn::io::saveBlock(keyChain.getPib().getIdentity("/ndn/test")
+ .getDefaultKey().getDefaultCertificate().wireEncode(),
+ file);
}
diff --git a/debug-tools/dump-cert.cc b/debug-tools/dump-cert.cc
deleted file mode 100644
index 7050175..0000000
--- a/debug-tools/dump-cert.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Yingdi Yu <yingdi@cs.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#include "common.hpp"
-#include <ndn-cxx/security/key-chain.hpp>
-#include <ndn-cxx/face.hpp>
-
-using namespace ndn;
-
-int
-main()
-{
- Name root("/ndn");
- Name test("/ndn/test");
- Name alice("/ndn/test/alice");
- Name bob("/ndn/test/bob");
- Name cathy("/ndn/test/cathy");
-
- KeyChain keyChain("sqlite3", "file");
-
- if (!keyChain.doesIdentityExist(root) ||
- !keyChain.doesIdentityExist(test) ||
- !keyChain.doesIdentityExist(alice) ||
- !keyChain.doesIdentityExist(bob) ||
- !keyChain.doesIdentityExist(cathy))
- return 1;
-
- Face face;
-
- face.put(*keyChain.getCertificate(keyChain.getDefaultCertificateNameForIdentity(test)));
- face.put(*keyChain.getCertificate(keyChain.getDefaultCertificateNameForIdentity(alice)));
- face.put(*keyChain.getCertificate(keyChain.getDefaultCertificateNameForIdentity(bob)));
- face.put(*keyChain.getCertificate(keyChain.getDefaultCertificateNameForIdentity(cathy)));
-
- face.getIoService().run();
-}
diff --git a/security/validation-chat.conf b/security/validation-chat.conf
new file mode 100644
index 0000000..f6ce776
--- /dev/null
+++ b/security/validation-chat.conf
@@ -0,0 +1,61 @@
+rule
+{
+ id "ALL1"
+ for data
+ filter
+ {
+ type name
+ regex ^<>*<%F0.>(<>*)$
+ }
+ checker
+ {
+ type customized
+ sig-type rsa-sha256
+ key-locator
+ {
+ type name
+ hyper-relation
+ {
+ k-regex ^([^<KEY>]*)<KEY><>*$
+ k-expand \\1
+ h-relation is-strict-prefix-of
+ p-regex ^<>*<%F0.>(<>*)$
+ p-expand \\1
+ }
+ }
+ }
+}
+
+rule
+{
+ id "ALL2"
+ for data
+ filter
+ {
+ type name
+ regex (<>*)$
+ }
+ checker
+ {
+ type customized
+ sig-type rsa-sha256
+ key-locator
+ {
+ type name
+ hyper-relation
+ {
+ k-regex ^([^<KEY>]*)<KEY><>$
+ k-expand \\1
+ h-relation is-strict-prefix-of
+ p-regex (<>*)$
+ p-expand \\1
+ }
+ }
+ }
+}
+
+trust-anchor
+{
+ type dir
+ dir "."
+}
diff --git a/security/validation-contact-manager.conf b/security/validation-contact-manager.conf
new file mode 100644
index 0000000..cb14f1a
--- /dev/null
+++ b/security/validation-contact-manager.conf
@@ -0,0 +1,117 @@
+rule
+{
+ id "ENDORSED"
+ for data
+ filter
+ {
+ type name
+ regex ^([^<DNS>]*)<DNS><ENDORSED>
+ }
+ checker
+ {
+ type customized
+ sig-type rsa-sha256
+ key-locator
+ {
+ type name
+ hyper-relation
+ {
+ k-regex ^([^<KEY>]*)<KEY><>*$
+ k-expand \\1
+ h-relation equal
+ p-regex ^([^<DNS>]*)<DNS><ENDORSED>
+ p-expand \\1
+ }
+ }
+ }
+}
+
+rule
+{
+ id "ENDORSEE"
+ for data
+ filter
+ {
+ type name
+ regex ^([^<DNS>]*)<DNS><><ENDORSEE>
+ }
+ checker
+ {
+ type customized
+ sig-type rsa-sha256
+ key-locator
+ {
+ type name
+ hyper-relation
+ {
+ k-regex ^([^<KEY>]*)<KEY><>*$
+ k-expand \\1
+ h-relation equal
+ p-regex ^([^<DNS>]*)<DNS><><ENDORSEE>
+ p-expand \\1
+ }
+ }
+ }
+}
+
+rule
+{
+ id "PROFILE"
+ for data
+ filter
+ {
+ type name
+ regex ^([^<DNS>]*)<DNS><PROFILE>
+ }
+ checker
+ {
+ type customized
+ sig-type rsa-sha256
+ key-locator
+ {
+ type name
+ hyper-relation
+ {
+ k-regex ^([^<KEY>]*)<KEY><>*$
+ k-expand \\1
+ h-relation equal
+ p-regex ^([^<DNS>]*)<DNS><PROFILE>
+ p-expand \\1
+ }
+ }
+ }
+}
+
+rule
+{
+ id "ALL"
+ for data
+ filter
+ {
+ type name
+ regex ^(<>*)$
+ }
+ checker
+ {
+ type customized
+ sig-type rsa-sha256
+ key-locator
+ {
+ type name
+ hyper-relation
+ {
+ k-regex ^([^<KEY>]*)<KEY><>*$
+ k-expand \\1
+ h-relation is-strict-prefix-of
+ p-regex ^(<>*)$
+ p-expand \\1
+ }
+ }
+ }
+}
+
+trust-anchor
+{
+ type dir
+ dir "."
+}
diff --git a/src/browse-contact-dialog.cpp b/src/browse-contact-dialog.cpp
index 481b418..bf9df24 100644
--- a/src/browse-contact-dialog.cpp
+++ b/src/browse-contact-dialog.cpp
@@ -19,7 +19,7 @@
namespace chronochat {
-using ndn::IdentityCertificate;
+using ndn::security::Certificate;
BrowseContactDialog::BrowseContactDialog(QWidget *parent)
: QDialog(parent)
@@ -106,7 +106,7 @@
}
void
-BrowseContactDialog::onIdCertReady(const IdentityCertificate& idCert)
+BrowseContactDialog::onIdCertReady(const Certificate& idCert)
{
Profile profile(idCert);
diff --git a/src/browse-contact-dialog.hpp b/src/browse-contact-dialog.hpp
index a087538..4a081e0 100644
--- a/src/browse-contact-dialog.hpp
+++ b/src/browse-contact-dialog.hpp
@@ -17,7 +17,7 @@
#include <QTableWidgetItem>
#ifndef Q_MOC_RUN
-#include <ndn-cxx/security/identity-certificate.hpp>
+#include <ndn-cxx/security/certificate.hpp>
#include <boost/thread/locks.hpp>
#include <boost/thread/recursive_mutex.hpp>
#endif
@@ -61,7 +61,7 @@
onNameListReady(const QStringList& nameList);
void
- onIdCertReady(const ndn::IdentityCertificate& idCert);
+ onIdCertReady(const ndn::security::Certificate & idCert);
signals:
void
diff --git a/src/chat-dialog-backend.cpp b/src/chat-dialog-backend.cpp
index 67305f2..234e4a3 100644
--- a/src/chat-dialog-backend.cpp
+++ b/src/chat-dialog-backend.cpp
@@ -16,12 +16,10 @@
#ifndef Q_MOC_RUN
#include <boost/iostreams/stream.hpp>
#include <ndn-cxx/util/io.hpp>
-#include <ndn-cxx/security/validator-regex.hpp>
-#include "logging.h"
+#include "cryptopp.hpp"
#endif
-
-INIT_LOGGER("ChatDialogBackend");
+using namespace CryptoPP;
namespace chronochat {
@@ -117,26 +115,8 @@
m_scheduler = unique_ptr<ndn::Scheduler>(new ndn::Scheduler(m_face->getIoService()));
// initialize validator
- shared_ptr<ndn::IdentityCertificate> anchor = loadTrustAnchor();
-
- if (static_cast<bool>(anchor)) {
- shared_ptr<ndn::ValidatorRegex> validator =
- make_shared<ndn::ValidatorRegex>(m_face.get()); // TODO: Change to Face*
- validator->addDataVerificationRule(
- make_shared<ndn::SecRuleRelative>("^<>*<%F0.>(<>*)$",
- "^([^<KEY>]*)<KEY>(<>*)<ksk-.*><ID-CERT>$",
- ">", "\\1", "\\1\\2", true));
- validator->addDataVerificationRule(
- make_shared<ndn::SecRuleRelative>("(<>*)$",
- "^([^<KEY>]*)<KEY>(<>*)<ksk-.*><ID-CERT>$",
- ">", "\\1", "\\1\\2", true));
- validator->addTrustAnchor(anchor);
-
- m_validator = validator;
- }
- else
- m_validator = shared_ptr<ndn::Validator>();
-
+ m_validator = make_shared<ndn::security::ValidatorConfig>(*m_face);
+ m_validator->load("security/validation-chat.conf");
// create a new SyncSocket
m_sock = make_shared<chronosync::Socket>(m_chatroomPrefix,
@@ -147,12 +127,12 @@
m_validator);
// schedule a new join event
- m_scheduler->scheduleEvent(time::milliseconds(600),
- bind(&ChatDialogBackend::sendJoin, this));
+ m_scheduler->schedule(time::milliseconds(600),
+ bind(&ChatDialogBackend::sendJoin, this));
// cancel existing hello event if it exists
- if (m_helloEventId != nullptr) {
- m_scheduler->cancelEvent(m_helloEventId);
+ if (m_helloEventId) {
+ m_helloEventId.cancel();
m_helloEventId.reset();
}
}
@@ -178,19 +158,6 @@
QIODevice& m_source;
};
-shared_ptr<ndn::IdentityCertificate>
-ChatDialogBackend::loadTrustAnchor()
-{
- QFile anchorFile(":/security/anchor.cert");
-
- if (!anchorFile.open(QIODevice::ReadOnly)) {
- return {};
- }
-
- boost::iostreams::stream<IoDeviceSource> anchorFileStream(anchorFile);
- return ndn::io::load<ndn::IdentityCertificate>(anchorFileStream);
-}
-
void
ChatDialogBackend::exitChatroom() {
if (m_joined)
@@ -212,8 +179,6 @@
void
ChatDialogBackend::processSyncUpdate(const std::vector<chronosync::MissingDataInfo>& updates)
{
- _LOG_DEBUG("<<< processing Tree Update");
-
if (updates.empty()) {
return;
}
@@ -232,27 +197,18 @@
if (updates[i].high - updates[i].low < 3) {
for (chronosync::SeqNo seq = updates[i].low; seq <= updates[i].high; ++seq) {
m_sock->fetchData(updates[i].session, seq,
- [this] (const shared_ptr<const ndn::Data>& data) {
- this->processChatData(data, true, true);
- },
- [this] (const shared_ptr<const ndn::Data>& data, const std::string& msg) {
- this->processChatData(data, true, false);
- },
- ndn::OnTimeout(),
+ bind(&ChatDialogBackend::processChatData, this, _1, true, true),
+ bind(&ChatDialogBackend::processChatData, this, _1, true, false),
+ [] (const ndn::Interest& interest) {},
2);
- _LOG_DEBUG("<<< Fetching " << updates[i].session << "/" << seq);
}
}
else {
// There are too many msgs to fetch, let's just fetch the latest one
m_sock->fetchData(updates[i].session, updates[i].high,
- [this] (const shared_ptr<const ndn::Data>& data) {
- this->processChatData(data, false, true);
- },
- [this] (const shared_ptr<const ndn::Data>& data, const std::string& msg) {
- this->processChatData(data, false, false);
- },
- ndn::OnTimeout(),
+ bind(&ChatDialogBackend::processChatData, this, _1, true, true),
+ bind(&ChatDialogBackend::processChatData, this, _1, true, false),
+ [] (const ndn::Interest& interest) {},
2);
}
@@ -264,25 +220,23 @@
}
void
-ChatDialogBackend::processChatData(const ndn::shared_ptr<const ndn::Data>& data,
+ChatDialogBackend::processChatData(const ndn::Data& data,
bool needDisplay,
bool isValidated)
{
ChatMessage msg;
try {
- msg.wireDecode(data->getContent().blockFromValue());
+ msg.wireDecode(data.getContent().blockFromValue());
}
- catch (tlv::Error) {
- _LOG_DEBUG("Errrrr.. Can not parse msg with name: " <<
- data->getName() << ". what is happening?");
+ catch (tlv::Error&) {
// nasty stuff: as a remedy, we'll form some standard msg for inparsable msgs
msg.setNick("inconnu");
msg.setMsgType(ChatMessage::OTHER);
return;
}
- Name remoteSessionPrefix = data->getName().getPrefix(-1);
+ Name remoteSessionPrefix = data.getName().getPrefix(-1);
if (msg.getMsgType() == ChatMessage::LEAVE) {
BackendRoster::iterator it = m_roster.find(remoteSessionPrefix);
@@ -290,7 +244,7 @@
if (it != m_roster.end()) {
// cancel timeout event
if (static_cast<bool>(it->second.timeoutEventId))
- m_scheduler->cancelEvent(it->second.timeoutEventId);
+ it->second.timeoutEventId.cancel();
// notify frontend to remove the remote session (node)
emit sessionRemoved(QString::fromStdString(remoteSessionPrefix.toUri()),
@@ -312,17 +266,17 @@
BOOST_ASSERT(false);
}
- uint64_t seqNo = data->getName().get(-1).toNumber();
+ uint64_t seqNo = data.getName().get(-1).toNumber();
// If a timeout event has been scheduled, cancel it.
if (static_cast<bool>(it->second.timeoutEventId))
- m_scheduler->cancelEvent(it->second.timeoutEventId);
+ it->second.timeoutEventId.cancel();
// (Re)schedule another timeout event after 3 HELLO_INTERVAL;
it->second.timeoutEventId =
- m_scheduler->scheduleEvent(HELLO_INTERVAL * 3,
- bind(&ChatDialogBackend::remoteSessionTimeout,
- this, remoteSessionPrefix));
+ m_scheduler->schedule(HELLO_INTERVAL * 3,
+ bind(&ChatDialogBackend::remoteSessionTimeout,
+ this, remoteSessionPrefix));
// If chat message, notify the frontend
if (msg.getMsgType() == ChatMessage::CHAT) {
@@ -414,8 +368,8 @@
prepareControlMessage(msg, ChatMessage::JOIN);
sendMsg(msg);
- m_helloEventId = m_scheduler->scheduleEvent(HELLO_INTERVAL,
- bind(&ChatDialogBackend::sendHello, this));
+ m_helloEventId = m_scheduler->schedule(HELLO_INTERVAL,
+ bind(&ChatDialogBackend::sendHello, this));
emit newChatroomForDiscovery(Name::Component(m_chatroomName));
}
@@ -426,8 +380,8 @@
prepareControlMessage(msg, ChatMessage::HELLO);
sendMsg(msg);
- m_helloEventId = m_scheduler->scheduleEvent(HELLO_INTERVAL,
- bind(&ChatDialogBackend::sendHello, this));
+ m_helloEventId = m_scheduler->schedule(HELLO_INTERVAL,
+ bind(&ChatDialogBackend::sendHello, this));
}
void
@@ -489,7 +443,7 @@
{
std::stringstream os;
- CryptoPP::StringSource(digest->buf(), digest->size(), true,
+ CryptoPP::StringSource(digest->data(), digest->size(), true,
new CryptoPP::HexEncoder(new CryptoPP::FileSink(os), false));
return os.str();
}
diff --git a/src/chat-dialog-backend.hpp b/src/chat-dialog-backend.hpp
index ae7b3da..e9543bb 100644
--- a/src/chat-dialog-backend.hpp
+++ b/src/chat-dialog-backend.hpp
@@ -18,8 +18,9 @@
#include "chatroom-info.hpp"
#include "chat-message.hpp"
#include <mutex>
-#include <socket.hpp>
+#include <ChronoSync/socket.hpp>
#include <boost/thread.hpp>
+#include <ndn-cxx/security/validator-config.hpp>
#endif
namespace chronochat {
@@ -35,7 +36,7 @@
ndn::Name sessionPrefix;
bool hasNick;
std::string userNick;
- ndn::EventId timeoutEventId;
+ ndn::scheduler::EventId timeoutEventId;
};
class ChatDialogBackend : public QThread
@@ -61,9 +62,6 @@
void
initializeSync();
- shared_ptr<ndn::IdentityCertificate>
- loadTrustAnchor();
-
void
exitChatroom();
@@ -74,7 +72,7 @@
processSyncUpdate(const std::vector<chronosync::MissingDataInfo>& updates);
void
- processChatData(const ndn::shared_ptr<const ndn::Data>& data,
+ processChatData(const ndn::Data& data,
bool needDisplay,
bool isValidated);
@@ -160,24 +158,24 @@
bool m_isNfdConnected;
shared_ptr<ndn::Face> m_face;
- Name m_localRoutingPrefix; // routable local prefix
- Name m_chatroomPrefix; // chatroom sync prefix
- Name m_userChatPrefix; // user chat prefix
- Name m_routableUserChatPrefix; // routable user chat prefix
+ Name m_localRoutingPrefix; // routable local prefix
+ Name m_chatroomPrefix; // chatroom sync prefix
+ Name m_userChatPrefix; // user chat prefix
+ Name m_routableUserChatPrefix; // routable user chat prefix
- std::string m_chatroomName; // chatroom name
- std::string m_nick; // user nick
+ std::string m_chatroomName; // chatroom name
+ std::string m_nick; // user nick
- Name m_signingId; // signing identity
- shared_ptr<ndn::Validator> m_validator;// validator
- shared_ptr<chronosync::Socket> m_sock; // SyncSocket
+ Name m_signingId; // signing identity
+ shared_ptr<ndn::security::ValidatorConfig> m_validator; // validator
+ shared_ptr<chronosync::Socket> m_sock; // SyncSocket
- unique_ptr<ndn::Scheduler> m_scheduler;// scheduler
- ndn::EventId m_helloEventId; // event id of timeout
+ unique_ptr<ndn::Scheduler> m_scheduler; // scheduler
+ ndn::scheduler::EventId m_helloEventId; // event id of timeout
- bool m_joined; // true if in a chatroom
+ bool m_joined; // true if in a chatroom
- BackendRoster m_roster; // User roster
+ BackendRoster m_roster; // User roster
std::mutex m_resumeMutex;
std::mutex m_nfdConnectionMutex;
diff --git a/src/chat-message.cpp b/src/chat-message.cpp
index 21707d2..7932321 100644
--- a/src/chat-message.cpp
+++ b/src/chat-message.cpp
@@ -23,7 +23,7 @@
this->wireDecode(chatMsgWire);
}
-template<bool T>
+template<ndn::encoding::Tag T>
size_t
ChatMessage::wireEncode(ndn::EncodingImpl<T>& encoder) const
{
diff --git a/src/chat-message.hpp b/src/chat-message.hpp
index 860ce9f..778f505 100644
--- a/src/chat-message.hpp
+++ b/src/chat-message.hpp
@@ -86,7 +86,7 @@
setTimestamp(const time_t timestamp);
private:
- template<bool T>
+ template<ndn::encoding::Tag T>
size_t
wireEncode(ndn::EncodingImpl<T>& encoder) const;
diff --git a/src/chatroom-discovery-backend.cpp b/src/chatroom-discovery-backend.cpp
index 371a119..67dd7fa 100644
--- a/src/chatroom-discovery-backend.cpp
+++ b/src/chatroom-discovery-backend.cpp
@@ -113,11 +113,11 @@
this, _1));
// add an timer to refresh front end
- if (m_refreshPanelId != nullptr) {
- m_scheduler->cancelEvent(m_refreshPanelId);
+ if (m_refreshPanelId) {
+ m_refreshPanelId.cancel();
}
- m_refreshPanelId = m_scheduler->scheduleEvent(REFRESH_INTERVAL,
- [this] { sendChatroomList(); });
+ m_refreshPanelId = m_scheduler->schedule(REFRESH_INTERVAL,
+ [this] { sendChatroomList(); });
}
void
@@ -142,10 +142,10 @@
}
void
-ChatroomDiscoveryBackend::processChatroomData(const ndn::shared_ptr<const ndn::Data>& data)
+ChatroomDiscoveryBackend::processChatroomData(const ndn::Data& data)
{
// extract chatroom name by get(-3)
- Name::Component chatroomName = data->getName().get(-3);
+ Name::Component chatroomName = data.getName().get(-3);
auto it = m_chatroomList.find(chatroomName);
if (it == m_chatroomList.end()) {
m_chatroomList[chatroomName].chatroomName = chatroomName.toUri();
@@ -163,16 +163,15 @@
}
else {
it->second.count = 0;
- if (m_routableUserDiscoveryPrefix < data->getName()) {
+ if (m_routableUserDiscoveryPrefix < data.getName()) {
// when two managers exist, the one with "smaller" name take the control
sendUpdate(chatroomName);
return;
}
else {
- if (it->second.helloTimeoutEventId != nullptr) {
- m_scheduler->cancelEvent(it->second.helloTimeoutEventId);
+ if (it->second.helloTimeoutEventId) {
+ it->second.helloTimeoutEventId.cancel();
}
- it->second.helloTimeoutEventId = nullptr;
it->second.isManager = false;
}
@@ -180,35 +179,34 @@
}
else if (it->second.isParticipant) {
- if (it->second.localChatroomTimeoutEventId != nullptr)
- m_scheduler->cancelEvent(it->second.localChatroomTimeoutEventId);
+ if (it->second.localChatroomTimeoutEventId)
+ it->second.localChatroomTimeoutEventId.cancel();
// If a user start a random timer it means that he think his own chatroom is not alive
// But when he receive some packet, it means that this chatroom is alive, so he can
// cancel the timer
- if (it->second.managerSelectionTimeoutEventId != nullptr)
- m_scheduler->cancelEvent(it->second.managerSelectionTimeoutEventId);
- it->second.managerSelectionTimeoutEventId = nullptr;
+ if (it->second.managerSelectionTimeoutEventId)
+ it->second.managerSelectionTimeoutEventId.cancel();
it->second.localChatroomTimeoutEventId =
- m_scheduler->scheduleEvent(HELLO_INTERVAL * 3,
- bind(&ChatroomDiscoveryBackend::localSessionTimeout,
- this, chatroomName));
+ m_scheduler->schedule(HELLO_INTERVAL * 3,
+ bind(&ChatroomDiscoveryBackend::localSessionTimeout,
+ this, chatroomName));
}
else {
- if (!data->getContent().empty()) {
+ if (data.hasContent()) {
ChatroomInfo chatroom;
- chatroom.wireDecode(data->getContent().blockFromValue());
+ chatroom.wireDecode(data.getContent().blockFromValue());
it->second.info = chatroom;
}
- if (it->second.remoteChatroomTimeoutEventId != nullptr)
- m_scheduler->cancelEvent(it->second.remoteChatroomTimeoutEventId);
+ if (it->second.remoteChatroomTimeoutEventId)
+ it->second.remoteChatroomTimeoutEventId.cancel();
it->second.remoteChatroomTimeoutEventId =
- m_scheduler->scheduleEvent(HELLO_INTERVAL * 5,
- bind(&ChatroomDiscoveryBackend::remoteSessionTimeout,
- this, chatroomName));
+ m_scheduler->schedule(HELLO_INTERVAL * 5,
+ bind(&ChatroomDiscoveryBackend::remoteSessionTimeout,
+ this, chatroomName));
}
// if this is a chatroom that haven't been print on the discovery panel, print it.
if(!it->second.isPrint) {
@@ -224,9 +222,9 @@
if (it == m_chatroomList.end() || it->second.isParticipant == false)
return;
it->second.managerSelectionTimeoutEventId =
- m_scheduler->scheduleEvent(time::milliseconds(m_rangeUniformRandom()),
- bind(&ChatroomDiscoveryBackend::randomSessionTimeout,
- this, chatroomName));
+ m_scheduler->schedule(time::milliseconds(m_rangeUniformRandom()),
+ bind(&ChatroomDiscoveryBackend::randomSessionTimeout,
+ this, chatroomName));
}
void
@@ -252,15 +250,15 @@
if (it != m_chatroomList.end() && it->second.isManager) {
ndn::Block buf = it->second.info.wireEncode();
- if (it->second.helloTimeoutEventId != nullptr) {
- m_scheduler->cancelEvent(it->second.helloTimeoutEventId);
+ if (it->second.helloTimeoutEventId) {
+ it->second.helloTimeoutEventId.cancel();
}
m_sock->publishData(buf.wire(), buf.size(), FRESHNESS_PERIOD, it->second.chatroomPrefix);
it->second.helloTimeoutEventId =
- m_scheduler->scheduleEvent(HELLO_INTERVAL,
- bind(&ChatroomDiscoveryBackend::sendUpdate, this, chatroomName));
+ m_scheduler->schedule(HELLO_INTERVAL,
+ bind(&ChatroomDiscoveryBackend::sendUpdate, this, chatroomName));
// if this is a chatroom that haven't been print on the discovery panel, print it.
if(!it->second.isPrint) {
sendChatroomList();
@@ -318,8 +316,8 @@
it->second.info.removeParticipant(sessionPrefix);
if (it->second.info.getParticipants().size() == 0) {
// Before deleting the chatroom, cancel the hello event timer if exist
- if (it->second.helloTimeoutEventId != nullptr)
- m_scheduler->cancelEvent(it->second.helloTimeoutEventId);
+ if (it->second.helloTimeoutEventId)
+ it->second.helloTimeoutEventId.cancel();
m_chatroomList.erase(chatroomName);
Name prefix = sessionPrefix;
@@ -334,18 +332,16 @@
it->second.isManager = false;
it->second.isPrint = false;
it->second.count = 0;
- if (it->second.helloTimeoutEventId != nullptr)
- m_scheduler->cancelEvent(it->second.helloTimeoutEventId);
- it->second.helloTimeoutEventId = nullptr;
+ if (it->second.helloTimeoutEventId)
+ it->second.helloTimeoutEventId.cancel();
- if (it->second.localChatroomTimeoutEventId != nullptr)
- m_scheduler->cancelEvent(it->second.localChatroomTimeoutEventId);
- it->second.localChatroomTimeoutEventId = nullptr;
+ if (it->second.localChatroomTimeoutEventId)
+ it->second.localChatroomTimeoutEventId.cancel();
it->second.remoteChatroomTimeoutEventId =
- m_scheduler->scheduleEvent(HELLO_INTERVAL * 5,
- bind(&ChatroomDiscoveryBackend::remoteSessionTimeout,
- this, chatroomName));
+ m_scheduler->schedule(HELLO_INTERVAL * 5,
+ bind(&ChatroomDiscoveryBackend::remoteSessionTimeout,
+ this, chatroomName));
}
if (it->second.isManager) {
@@ -381,9 +377,9 @@
m_chatroomList[chatroomName].isManager = false;
m_chatroomList[chatroomName].count = 0;
m_chatroomList[chatroomName].isPrint = false;
- m_scheduler->scheduleEvent(time::milliseconds(600),
- bind(&ChatroomDiscoveryBackend::randomSessionTimeout, this,
- chatroomName));
+ m_scheduler->schedule(time::milliseconds(600),
+ bind(&ChatroomDiscoveryBackend::randomSessionTimeout, this,
+ chatroomName));
}
else {
// Entering an existing chatroom
@@ -391,15 +387,14 @@
it->second.isManager = false;
it->second.chatroomPrefix = newPrefix;
- if (it->second.remoteChatroomTimeoutEventId != nullptr)
- m_scheduler->cancelEvent(it->second.remoteChatroomTimeoutEventId);
+ if (it->second.remoteChatroomTimeoutEventId)
+ it->second.remoteChatroomTimeoutEventId.cancel();
it->second.isPrint = false;
- it->second.remoteChatroomTimeoutEventId = nullptr;
it->second.localChatroomTimeoutEventId =
- m_scheduler->scheduleEvent(HELLO_INTERVAL * 3,
- bind(&ChatroomDiscoveryBackend::localSessionTimeout,
- this, chatroomName));
+ m_scheduler->schedule(HELLO_INTERVAL * 3,
+ bind(&ChatroomDiscoveryBackend::localSessionTimeout,
+ this, chatroomName));
emit chatroomInfoRequest(chatroomName.toUri(), false);
}
}
@@ -421,18 +416,10 @@
void
ChatroomDiscoveryBackend::onIdentityUpdated(const QString& identity)
{
- m_chatroomList.clear();
m_identity = Name(identity.toStdString());
m_userDiscoveryPrefix.clear();
m_userDiscoveryPrefix.append(m_identity).append("CHRONOCHAT-DISCOVERYDATA");
updatePrefixes();
-
- {
- std::lock_guard<std::mutex>lock(m_resumeMutex);
- m_shouldResume = true;
- }
-
- m_face->getIoService().stop();
}
void
@@ -444,11 +431,11 @@
}
emit chatroomListReady(chatroomList);
- if (m_refreshPanelId != nullptr) {
- m_scheduler->cancelEvent(m_refreshPanelId);
+ if (m_refreshPanelId) {
+ m_refreshPanelId.cancel();
}
- m_refreshPanelId = m_scheduler->scheduleEvent(REFRESH_INTERVAL,
- [this] { sendChatroomList(); });
+ m_refreshPanelId = m_scheduler->schedule(REFRESH_INTERVAL,
+ [this] { sendChatroomList(); });
}
void
diff --git a/src/chatroom-discovery-backend.hpp b/src/chatroom-discovery-backend.hpp
index d6bf843..ad471ac 100644
--- a/src/chatroom-discovery-backend.hpp
+++ b/src/chatroom-discovery-backend.hpp
@@ -18,7 +18,7 @@
#include "chatroom-info.hpp"
#include <boost/random.hpp>
#include <mutex>
-#include <socket.hpp>
+#include <ChronoSync/socket.hpp>
#include <boost/thread.hpp>
#endif
@@ -30,13 +30,13 @@
Name chatroomPrefix;
ChatroomInfo info;
// For a chatroom's user to check whether his own chatroom is alive
- ndn::EventId localChatroomTimeoutEventId;
+ ndn::scheduler::EventId localChatroomTimeoutEventId;
// If the manager no longer exist, set a random timer to compete for manager
- ndn::EventId managerSelectionTimeoutEventId;
+ ndn::scheduler::EventId managerSelectionTimeoutEventId;
// For a user to check the status of the chatroom that he is not in.
- ndn::EventId remoteChatroomTimeoutEventId;
+ ndn::scheduler::EventId remoteChatroomTimeoutEventId;
// If the user is manager, he will need the helloEventId to keep track of hello message
- ndn::EventId helloTimeoutEventId;
+ ndn::scheduler::EventId helloTimeoutEventId;
// To tell whether the user is in this chatroom
bool isParticipant;
// To tell whether the user is the manager
@@ -75,7 +75,7 @@
processSyncUpdate(const std::vector<chronosync::MissingDataInfo>& updates);
void
- processChatroomData(const ndn::shared_ptr<const ndn::Data>& data);
+ processChatroomData(const ndn::Data& data);
void
localSessionTimeout(const Name::Component& chatroomName);
@@ -228,7 +228,7 @@
shared_ptr<ndn::Face> m_face;
unique_ptr<ndn::Scheduler> m_scheduler; // scheduler
- ndn::EventId m_refreshPanelId;
+ ndn::scheduler::EventId m_refreshPanelId;
shared_ptr<chronosync::Socket> m_sock; // SyncSocket
ChatroomList m_chatroomList;
diff --git a/src/chatroom-info.cpp b/src/chatroom-info.cpp
index 81302bb..aa8efcc 100644
--- a/src/chatroom-info.cpp
+++ b/src/chatroom-info.cpp
@@ -25,7 +25,7 @@
this->wireDecode(chatroomWire);
}
-template<bool T>
+template<ndn::encoding::Tag T>
size_t
ChatroomInfo::wireEncode(ndn::EncodingImpl<T>& encoder) const
{
diff --git a/src/chatroom-info.hpp b/src/chatroom-info.hpp
index dca4090..81e0fde 100644
--- a/src/chatroom-info.hpp
+++ b/src/chatroom-info.hpp
@@ -95,7 +95,7 @@
setManager(const Name& manager);
private:
- template<bool T>
+ template<ndn::encoding::Tag T>
size_t
wireEncode(ndn::EncodingImpl<T>& encoder) const;
diff --git a/src/common.hpp b/src/common.hpp
index c8461df..3b14f79 100644
--- a/src/common.hpp
+++ b/src/common.hpp
@@ -28,7 +28,6 @@
#include <vector>
#include <string>
-#include <ndn-cxx/common.hpp>
#include <ndn-cxx/interest.hpp>
#include <ndn-cxx/data.hpp>
@@ -61,7 +60,6 @@
using ndn::Interest;
using ndn::Data;
using ndn::Name;
-using ndn::Exclude;
using ndn::Block;
using ndn::Signature;
using ndn::KeyLocator;
diff --git a/src/conf.cpp b/src/conf.cpp
index fba36b8..d02fe08 100644
--- a/src/conf.cpp
+++ b/src/conf.cpp
@@ -23,7 +23,7 @@
this->wireDecode(confWire);
}
-template<bool T>
+template<ndn::encoding::Tag T>
size_t
Conf::wireEncode(ndn::EncodingImpl<T>& block) const
{
diff --git a/src/conf.hpp b/src/conf.hpp
index 0626bf1..3b4f394 100644
--- a/src/conf.hpp
+++ b/src/conf.hpp
@@ -60,7 +60,7 @@
setNick(const std::string& nick);
private:
- template<bool T>
+ template<ndn::encoding::Tag T>
size_t
wireEncode(ndn::EncodingImpl<T>& block) const;
diff --git a/src/contact-manager.cpp b/src/contact-manager.cpp
index 811130e..2bb5153 100644
--- a/src/contact-manager.cpp
+++ b/src/contact-manager.cpp
@@ -19,9 +19,11 @@
#ifndef Q_MOC_RUN
#include <ndn-cxx/encoding/buffer-stream.hpp>
-#include <ndn-cxx/util/crypto.hpp>
-#include <ndn-cxx/security/sec-rule-relative.hpp>
-#include <ndn-cxx/security/validator-regex.hpp>
+#include <ndn-cxx/face.hpp>
+#include <ndn-cxx/security/validator.hpp>
+#include <ndn-cxx/security/validator-null.hpp>
+#include <ndn-cxx/security/signing-helpers.hpp>
+#include <ndn-cxx/security/verification-helpers.hpp>
#include "cryptopp.hpp"
#include <boost/asio.hpp>
#include <boost/tokenizer.hpp>
@@ -31,8 +33,6 @@
namespace fs = boost::filesystem;
-// INIT_LOGGER("chronochat.ContactManager");
-
namespace chronochat {
using std::string;
@@ -41,21 +41,13 @@
using ndn::Face;
using ndn::OBufferStream;
-using ndn::IdentityCertificate;
-using ndn::Validator;
-using ndn::ValidatorRegex;
-using ndn::SecRuleRelative;
-using ndn::OnDataValidated;
-using ndn::OnDataValidationFailed;
-using ndn::OnInterestValidated;
-using ndn::OnInterestValidationFailed;
+using ndn::security::Certificate;
ContactManager::ContactManager(Face& face,
QObject* parent)
: QObject(parent)
, m_face(face)
- , m_dnsListenerId(0)
{
initializeSecurity();
}
@@ -64,76 +56,11 @@
{
}
-// private methods
-shared_ptr<IdentityCertificate>
-ContactManager::loadTrustAnchor()
-{
- shared_ptr<IdentityCertificate> anchor;
-
- QFile anchorFile(":/security/anchor.cert");
-
- if (!anchorFile.open(QIODevice::ReadOnly)) {
- emit warning(QString("Cannot load trust anchor!"));
- return anchor;
- }
-
- qint64 fileSize = anchorFile.size();
- char* buf = new char[fileSize];
- anchorFile.read(buf, fileSize);
-
- try {
- using namespace CryptoPP;
-
- OBufferStream os;
- StringSource(reinterpret_cast<const uint8_t*>(buf), fileSize, true,
- new Base64Decoder(new FileSink(os)));
- anchor = make_shared<IdentityCertificate>();
- anchor->wireDecode(Block(os.buf()));
- }
- catch (CryptoPP::Exception& e) {
- emit warning(QString("Cannot load trust anchor!"));
- }
- catch (IdentityCertificate::Error& e) {
- emit warning(QString("Cannot load trust anchor!"));
- }
- catch(Block::Error& e) {
- emit warning(QString("Cannot load trust anchor!"));
- }
-
- delete [] buf;
-
- return anchor;
-}
-
void
ContactManager::initializeSecurity()
{
- shared_ptr<IdentityCertificate> anchor = loadTrustAnchor();
-
- shared_ptr<ValidatorRegex> validator = make_shared<ValidatorRegex>(boost::ref(m_face));
- validator->addDataVerificationRule(make_shared<SecRuleRelative>("^([^<DNS>]*)<DNS><ENDORSED>",
- "^([^<KEY>]*)<KEY>(<>*)<><ID-CERT>$",
- "==", "\\1", "\\1\\2", true));
- validator->addDataVerificationRule(make_shared<SecRuleRelative>("^([^<DNS>]*)<DNS><><ENDORSEE>",
- "^([^<KEY>]*)<KEY>(<>*)<><ID-CERT>$",
- "==", "\\1", "\\1\\2", true));
- validator->addDataVerificationRule(make_shared<SecRuleRelative>("^([^<DNS>]*)<DNS><PROFILE>",
- "^([^<KEY>]*)<KEY>(<>*)<><ID-CERT>$",
- "==", "\\1", "\\1\\2", true));
- validator->addDataVerificationRule(make_shared<SecRuleRelative>("^([^<PROFILE-CERT>]*)<PROFILE-CERT>",
- "^([^<KEY>]*)<KEY>(<>*<ksk-.*>)<ID-CERT>$",
- "==", "\\1", "\\1\\2", true));
- validator->addDataVerificationRule(make_shared<SecRuleRelative>("^([^<KEY>]*)<KEY>(<>*)<ksk-.*><ID-CERT>",
- "^([^<KEY>]*)<KEY><dsk-.*><ID-CERT>$",
- ">", "\\1\\2", "\\1", true));
- validator->addDataVerificationRule(make_shared<SecRuleRelative>("^([^<KEY>]*)<KEY><dsk-.*><ID-CERT>",
- "^([^<KEY>]*)<KEY>(<>*)<ksk-.*><ID-CERT>$",
- "==", "\\1", "\\1\\2", true));
- validator->addDataVerificationRule(make_shared<SecRuleRelative>("^(<>*)$",
- "^([^<KEY>]*)<KEY>(<>*)<ksk-.*><ID-CERT>$",
- ">", "\\1", "\\1\\2", true));
- validator->addTrustAnchor(anchor);
- m_validator = validator;
+ m_validator = make_shared<ndn::security::ValidatorConfig>(m_face);
+ m_validator->load("security/validation-contact-manager.conf");
}
void
@@ -144,11 +71,12 @@
Interest interest(interestName);
interest.setInterestLifetime(time::milliseconds(1000));
+ interest.setCanBePrefix(true);
interest.setMustBeFresh(true);
- OnDataValidated onValidated =
+ ndn::security::DataValidationSuccessCallback onValidated =
bind(&ContactManager::onDnsCollectEndorseValidated, this, _1, identity);
- OnDataValidationFailed onValidationFailed =
+ ndn::security::DataValidationFailureCallback onValidationFailed =
bind(&ContactManager::onDnsCollectEndorseValidationFailed, this, _1, _2, identity);
TimeoutNotify timeoutNotify =
bind(&ContactManager::onDnsCollectEndorseTimeoutNotify, this, _1, identity);
@@ -163,19 +91,21 @@
m_bufferedContacts[identity].m_endorseCollection;
if(certIndex >= endorseCollection->getCollectionEntries().size())
- prepareEndorseInfo(identity);
+ return prepareEndorseInfo(identity);
Name interestName(endorseCollection->getCollectionEntries()[certIndex].certName);
Interest interest(interestName);
interest.setInterestLifetime(time::milliseconds(1000));
- interest.setMustBeFresh(true);
+ interest.setMustBeFresh(false);
m_face.expressInterest(interest,
bind(&ContactManager::onEndorseCertificateInternal,
this, _1, _2, identity, certIndex,
endorseCollection->getCollectionEntries()[certIndex].hash),
bind(&ContactManager::onEndorseCertificateInternalTimeout,
+ this, _1, identity, certIndex),
+ bind(&ContactManager::onEndorseCertificateInternalTimeout,
this, _1, identity, certIndex));
}
@@ -202,7 +132,7 @@
m_bufferedContacts[identity].m_endorseCertList.end();
for (; cIt != cEnd; cIt++, endorseCertCount++) {
- shared_ptr<Contact> contact = getContact((*cIt)->getSigner().getPrefix(-1));
+ shared_ptr<Contact> contact = getContact((*cIt)->getSigner());
if (!static_cast<bool>(contact))
continue;
@@ -210,16 +140,17 @@
!contact->canBeTrustedFor(profile.getIdentityName()))
continue;
- if (!Validator::verifySignature(**cIt, contact->getPublicKey()))
+ if (!(*cIt)->isValid())
+ continue;
+
+ if (!ndn::security::verifySignature(**cIt, contact->getPublicKey().data(), contact->getPublicKey().size()))
continue;
const Profile& tmpProfile = (*cIt)->getProfile();
- if (tmpProfile != profile)
- continue;
-
const vector<string>& endorseList = (*cIt)->getEndorseList();
for (vector<string>::const_iterator eIt = endorseList.begin(); eIt != endorseList.end(); eIt++)
- endorseCount[*eIt] += 1;
+ if (tmpProfile.get(*eIt) == profile.get(*eIt))
+ endorseCount[*eIt] += 1;
}
for (Profile::const_iterator pIt = profile.begin(); pIt != profile.end(); pIt++) {
@@ -232,35 +163,36 @@
}
void
-ContactManager::onDnsSelfEndorseCertValidated(const shared_ptr<const Data>& data,
+ContactManager::onDnsSelfEndorseCertValidated(const Data& data,
const Name& identity)
{
try {
Data plainData;
- plainData.wireDecode(data->getContent().blockFromValue());
+ plainData.wireDecode(data.getContent().blockFromValue());
shared_ptr<EndorseCertificate> selfEndorseCertificate =
make_shared<EndorseCertificate>(boost::cref(plainData));
- if (Validator::verifySignature(plainData, selfEndorseCertificate->getPublicKeyInfo())) {
+
+ if (ndn::security::verifySignature(plainData, *selfEndorseCertificate)) {
m_bufferedContacts[identity].m_selfEndorseCert = selfEndorseCertificate;
fetchCollectEndorse(identity);
}
else
- emit contactInfoFetchFailed(QString::fromStdString(identity.toUri()));
+ emit contactInfoFetchFailed(QString::fromStdString(identity.toUri() + ": verification failed"));
}
catch(Block::Error& e) {
- emit contactInfoFetchFailed(QString::fromStdString(identity.toUri()));
+ emit contactInfoFetchFailed(QString::fromStdString(identity.toUri() + ": block error " + e.what()));
}
catch(EndorseCertificate::Error& e) {
- emit contactInfoFetchFailed(QString::fromStdString(identity.toUri()));
+ emit contactInfoFetchFailed(QString::fromStdString(identity.toUri() + ": cert error " + e.what()));
}
catch(Data::Error& e) {
- emit contactInfoFetchFailed(QString::fromStdString(identity.toUri()));
+ emit contactInfoFetchFailed(QString::fromStdString(identity.toUri() + ": data error " + e.what()));
}
}
void
-ContactManager::onDnsSelfEndorseCertValidationFailed(const shared_ptr<const Data>& data,
- const string& failInfo,
+ContactManager::onDnsSelfEndorseCertValidationFailed(const Data& data,
+ const ndn::security::ValidationError& error,
const Name& identity)
{
// If we cannot validate the Self-Endorse-Certificate, we may retry or fetch id-cert,
@@ -278,23 +210,23 @@
}
void
-ContactManager::onDnsCollectEndorseValidated(const shared_ptr<const Data>& data,
+ContactManager::onDnsCollectEndorseValidated(const Data& data,
const Name& identity)
{
try {
shared_ptr<EndorseCollection> endorseCollection =
- make_shared<EndorseCollection>(data->getContent());
+ make_shared<EndorseCollection>(data.getContent().blockFromValue());
m_bufferedContacts[identity].m_endorseCollection = endorseCollection;
fetchEndorseCertificateInternal(identity, 0);
}
- catch (tlv::Error) {
+ catch (std::runtime_error&) {
prepareEndorseInfo(identity);
}
}
void
-ContactManager::onDnsCollectEndorseValidationFailed(const shared_ptr<const Data>& data,
- const string& failInfo,
+ContactManager::onDnsCollectEndorseValidationFailed(const Data& data,
+ const ndn::security::ValidationError& error,
const Name& identity)
{
prepareEndorseInfo(identity);
@@ -308,7 +240,7 @@
}
void
-ContactManager::onEndorseCertificateInternal(const Interest& interest, Data& data,
+ContactManager::onEndorseCertificateInternal(const Interest& interest, const Data& data,
const Name& identity, size_t certIndex,
string hash)
{
@@ -350,10 +282,12 @@
interestName.append("DNS").append(m_identity.wireEncode()).append("ENDORSEE");
Interest interest(interestName);
+ interest.setMustBeFresh(true);
interest.setInterestLifetime(time::milliseconds(1000));
- OnDataValidated onValidated = bind(&ContactManager::onDnsEndorseeValidated, this, _1);
- OnDataValidationFailed onValidationFailed =
+ ndn::security::DataValidationSuccessCallback onValidated =
+ bind(&ContactManager::onDnsEndorseeValidated, this, _1);
+ ndn::security::DataValidationFailureCallback onValidationFailed =
bind(&ContactManager::onDnsEndorseeValidationFailed, this, _1, _2);
TimeoutNotify timeoutNotify = bind(&ContactManager::onDnsEndorseeTimeoutNotify, this, _1);
@@ -363,10 +297,10 @@
}
void
-ContactManager::onDnsEndorseeValidated(const shared_ptr<const Data>& data)
+ContactManager::onDnsEndorseeValidated(const Data& data)
{
Data endorseData;
- endorseData.wireDecode(data->getContent().blockFromValue());
+ endorseData.wireDecode(data.getContent().blockFromValue());
EndorseCertificate endorseCertificate(endorseData);
m_contactStorage->updateCollectEndorse(endorseCertificate);
@@ -375,8 +309,8 @@
}
void
-ContactManager::onDnsEndorseeValidationFailed(const shared_ptr<const Data>& data,
- const string& failInfo)
+ContactManager::onDnsEndorseeValidationFailed(const Data& data,
+ const ndn::security::ValidationError& error)
{
decreaseCollectStatus();
}
@@ -409,28 +343,30 @@
shared_ptr<Data> data = make_shared<Data>();
data->setName(dnsName);
+ data->setFreshnessPeriod(time::milliseconds(1000));
EndorseCollection endorseCollection;
m_contactStorage->getCollectEndorse(endorseCollection);
data->setContent(endorseCollection.wireEncode());
- m_keyChain.signByIdentity(*data, m_identity);
+
+ m_keyChain.sign(*data, ndn::security::signingByIdentity(m_identity));
m_contactStorage->updateDnsOthersEndorse(*data);
m_face.put(*data);
}
void
-ContactManager::onIdentityCertValidated(const shared_ptr<const Data>& data)
+ContactManager::onIdentityCertValidated(const Data& data)
{
- shared_ptr<IdentityCertificate> cert = make_shared<IdentityCertificate>(boost::cref(*data));
+ shared_ptr<Certificate> cert = make_shared<Certificate>(boost::cref(data));
m_bufferedIdCerts[cert->getName()] = cert;
decreaseIdCertCount();
}
void
-ContactManager::onIdentityCertValidationFailed(const shared_ptr<const Data>& data,
- const string& failInfo)
+ContactManager::onIdentityCertValidationFailed(const Data& data,
+ const ndn::security::ValidationError& error)
{
// _LOG_DEBUG("ContactManager::onIdentityCertValidationFailed " << data->getName());
decreaseIdCertCount();
@@ -472,20 +408,20 @@
shared_ptr<EndorseCertificate>
ContactManager::getSignedSelfEndorseCertificate(const Profile& profile)
{
- Name certificateName = m_keyChain.getDefaultCertificateNameForIdentity(m_identity);
-
- shared_ptr<IdentityCertificate> signingCert = m_keyChain.getCertificate(certificateName);
-
+ auto signCert = m_keyChain.getPib().getIdentity(m_identity)
+ .getDefaultKey().getDefaultCertificate();
vector<string> endorseList;
for (Profile::const_iterator it = profile.begin(); it != profile.end(); it++)
endorseList.push_back(it->first);
shared_ptr<EndorseCertificate> selfEndorseCertificate =
- make_shared<EndorseCertificate>(boost::cref(*signingCert),
+ make_shared<EndorseCertificate>(boost::cref(signCert),
boost::cref(profile),
boost::cref(endorseList));
- m_keyChain.sign(*selfEndorseCertificate, certificateName);
+ m_keyChain.sign(*selfEndorseCertificate,
+ ndn::security::signingByIdentity(m_identity).setSignatureInfo(
+ selfEndorseCertificate->getSignatureInfo()));
return selfEndorseCertificate;
}
@@ -501,7 +437,7 @@
data->setContent(selfEndorseCertificate.wireEncode());
data->setFreshnessPeriod(time::milliseconds(1000));
- m_keyChain.signByIdentity(*data, m_identity);
+ m_keyChain.sign(*data, ndn::security::signingByIdentity(m_identity));
m_contactStorage->updateDnsSelfProfileData(*data);
m_face.put(*data);
@@ -510,11 +446,14 @@
shared_ptr<EndorseCertificate>
ContactManager::generateEndorseCertificate(const Name& identity)
{
+ auto signCert = m_keyChain.getPib().getIdentity(m_identity)
+ .getDefaultKey().getDefaultCertificate();
+
shared_ptr<Contact> contact = getContact(identity);
if (!static_cast<bool>(contact))
return shared_ptr<EndorseCertificate>();
- Name signerKeyName = m_keyChain.getDefaultKeyNameForIdentity(m_identity);
+ Name signerKeyName = m_identity;
vector<string> endorseList;
m_contactStorage->getEndorseList(identity, endorseList);
@@ -524,10 +463,13 @@
contact->getPublicKey(),
contact->getNotBefore(),
contact->getNotAfter(),
+ signCert.getKeyId(),
signerKeyName,
contact->getProfile(),
endorseList));
- m_keyChain.signByIdentity(*cert, m_identity);
+ m_keyChain.sign(*cert,
+ ndn::security::signingByIdentity(m_identity)
+ .setSignatureInfo(cert->getSignatureInfo()));
return cert;
}
@@ -535,7 +477,7 @@
void
ContactManager::publishEndorseCertificateInDNS(const EndorseCertificate& endorseCertificate)
{
- Name endorsee = endorseCertificate.getPublicKeyName().getPrefix(-1);
+ Name endorsee = endorseCertificate.getKeyName().getPrefix(-4);
Name dnsName = m_identity;
dnsName.append("DNS")
.append(endorsee.wireEncode())
@@ -545,8 +487,9 @@
shared_ptr<Data> data = make_shared<Data>();
data->setName(dnsName);
data->setContent(endorseCertificate.wireEncode());
+ data->setFreshnessPeriod(time::milliseconds(1000));
- m_keyChain.signByIdentity(*data, m_identity);
+ m_keyChain.sign(*data, ndn::security::signingByIdentity(m_identity));
m_contactStorage->updateDnsEndorseOthers(*data, dnsName.get(-3).toUri());
m_face.put(*data);
@@ -554,8 +497,8 @@
void
ContactManager::sendInterest(const Interest& interest,
- const OnDataValidated& onValidated,
- const OnDataValidationFailed& onValidationFailed,
+ const ndn::security::DataValidationSuccessCallback& onValidated,
+ const ndn::security::DataValidationFailureCallback& onValidationFailed,
const TimeoutNotify& timeoutNotify,
int retry /* = 1 */)
{
@@ -563,24 +506,25 @@
bind(&ContactManager::onTargetData,
this, _1, _2, onValidated, onValidationFailed),
bind(&ContactManager::onTargetTimeout,
+ this, _1, retry, onValidated, onValidationFailed, timeoutNotify),
+ bind(&ContactManager::onTargetTimeout,
this, _1, retry, onValidated, onValidationFailed, timeoutNotify));
}
void
ContactManager::onTargetData(const Interest& interest,
const Data& data,
- const OnDataValidated& onValidated,
- const OnDataValidationFailed& onValidationFailed)
+ const ndn::security::DataValidationSuccessCallback& onValidated,
+ const ndn::security::DataValidationFailureCallback& onValidationFailed)
{
- // _LOG_DEBUG("On receiving data: " << data.getName());
m_validator->validate(data, onValidated, onValidationFailed);
}
void
ContactManager::onTargetTimeout(const Interest& interest,
int retry,
- const OnDataValidated& onValidated,
- const OnDataValidationFailed& onValidationFailed,
+ const ndn::security::DataValidationSuccessCallback& onValidated,
+ const ndn::security::DataValidationFailureCallback& onValidationFailed,
const TimeoutNotify& timeoutNotify)
{
// _LOG_DEBUG("On interest timeout: " << interest.getName());
@@ -621,6 +565,29 @@
emit warning(QString(failInfo.c_str()));
}
+void
+ContactManager::onKeyInterest(const Name& prefix, const Interest& interest)
+{
+ const Name& interestName = interest.getName();
+ shared_ptr<Certificate> data;
+
+ try {
+ ndn::security::Certificate cert = m_keyChain.getPib()
+ .getIdentity(m_identity)
+ .getDefaultKey()
+ .getDefaultCertificate();
+ if (cert.getKeyName() == interestName)
+ return m_face.put(cert);
+ } catch (ndn::security::Pib::Error&) {}
+
+ data = m_contactStorage->getSelfEndorseCertificate();
+ if (static_cast<bool>(data) && data->getKeyName().equals(interestName))
+ return m_face.put(*data);
+
+ data = m_contactStorage->getCollectEndorseByName(interestName);
+ if (static_cast<bool>(data))
+ return m_face.put(*data);
+}
// public slots
void
@@ -632,22 +599,42 @@
Name dnsPrefix;
dnsPrefix.append(m_identity).append("DNS");
- const ndn::RegisteredPrefixId* dnsListenerId =
+ auto dnsListenerId = make_shared<ndn::RegisteredPrefixHandle>(
m_face.setInterestFilter(dnsPrefix,
- bind(&ContactManager::onDnsInterest,
- this, _1, _2),
- bind(&ContactManager::onDnsRegisterFailed,
- this, _1, _2));
+ bind(&ContactManager::onDnsInterest, this, _1, _2),
+ bind(&ContactManager::onDnsRegisterFailed, this, _1, _2)));
+
+ Name keyPrefix;
+ keyPrefix.append(m_identity).append("KEY");
+ auto keyListenerId = make_shared<ndn::RegisteredPrefixHandle>(
+ m_face.setInterestFilter(keyPrefix,
+ bind(&ContactManager::onKeyInterest, this, _1, _2),
+ bind(&ContactManager::onDnsRegisterFailed, this, _1, _2)));
+
+ Name profileCertPrefix;
+ profileCertPrefix.append(m_identity).append("PROFILE-CERT");
+ auto profileCertListenerId = make_shared<ndn::RegisteredPrefixHandle>(
+ m_face.setInterestFilter(profileCertPrefix,
+ bind(&ContactManager::onKeyInterest, this, _1, _2),
+ bind(&ContactManager::onDnsRegisterFailed, this, _1, _2)));
if (m_dnsListenerId != 0)
- m_face.unsetInterestFilter(m_dnsListenerId);
-
+ m_dnsListenerId->unregister();
m_dnsListenerId = dnsListenerId;
+ if (m_keyListenerId != 0)
+ m_keyListenerId->unregister();
+ m_keyListenerId = keyListenerId;
+
+ if (m_profileCertListenerId != 0)
+ m_profileCertListenerId->unregister();
+ m_profileCertListenerId = profileCertListenerId;
+
m_contactList.clear();
m_contactStorage->getAllContacts(m_contactList);
m_bufferedContacts.clear();
+ onWaitForContactList();
collectEndorsement();
}
@@ -666,9 +653,9 @@
interest.setInterestLifetime(time::milliseconds(1000));
interest.setMustBeFresh(true);
- OnDataValidated onValidated =
+ ndn::security::DataValidationSuccessCallback onValidated =
bind(&ContactManager::onDnsSelfEndorseCertValidated, this, _1, identityName);
- OnDataValidationFailed onValidationFailed =
+ ndn::security::DataValidationFailureCallback onValidationFailed =
bind(&ContactManager::onDnsSelfEndorseCertValidationFailed, this, _1, _2, identityName);
TimeoutNotify timeoutNotify =
bind(&ContactManager::onDnsSelfEndorseCertTimeoutNotify, this, _1, identityName);
@@ -725,11 +712,15 @@
void
ContactManager::onRefreshBrowseContact()
{
+ return;
+
+#if 0
+ // The following no longer works as we don't serve such a list anymore
vector<string> bufferedIdCertNames;
try {
using namespace boost::asio::ip;
tcp::iostream request_stream;
- request_stream.expires_from_now(boost::posix_time::milliseconds(5000));
+ request_stream.expires_from_now(std::chrono::milliseconds(5000));
request_stream.connect("ndncert.named-data.net","80");
if (!request_stream) {
emit warning(QString::fromStdString("Fail to fetch certificate directory! #1"));
@@ -800,15 +791,16 @@
interest.setInterestLifetime(time::milliseconds(1000));
interest.setMustBeFresh(true);
- OnDataValidated onValidated =
+ ndn::security::DataValidationSuccessCallback onValidated =
bind(&ContactManager::onIdentityCertValidated, this, _1);
- OnDataValidationFailed onValidationFailed =
+ ndn::security::DataValidationFailureCallback onValidationFailed =
bind(&ContactManager::onIdentityCertValidationFailed, this, _1, _2);
TimeoutNotify timeoutNotify =
bind(&ContactManager::onIdentityCertTimeoutNotify, this, _1);
sendInterest(interest, onValidated, onValidationFailed, timeoutNotify, 0);
}
+#endif
}
void
@@ -823,7 +815,7 @@
ContactManager::onAddFetchedContactIdCert(const QString& qCertName)
{
Name certName(qCertName.toStdString());
- Name identity = IdentityCertificate::certificateNameToPublicKeyName(certName).getPrefix(-1);
+ Name identity = certName.getPrefix(-1);
BufferedIdCerts::const_iterator it = m_bufferedIdCerts.find(certName);
if (it != m_bufferedIdCerts.end()) {
@@ -901,7 +893,7 @@
ContactManager::onUpdateEndorseCertificate(const QString& identity)
{
Name identityName(identity.toStdString());
- shared_ptr<EndorseCertificate> newEndorseCertificate = generateEndorseCertificate(identityName);
+ shared_ptr<Certificate> newEndorseCertificate = generateEndorseCertificate(identityName);
if (!static_cast<bool>(newEndorseCertificate))
return;
diff --git a/src/contact-manager.hpp b/src/contact-manager.hpp
index 5ef7983..b475eb4 100644
--- a/src/contact-manager.hpp
+++ b/src/contact-manager.hpp
@@ -22,7 +22,8 @@
#include "endorse-info.hpp"
#include "endorse-collection.hpp"
#include <ndn-cxx/security/key-chain.hpp>
-#include <ndn-cxx/security/validator.hpp>
+#include <ndn-cxx/security/validator-config.hpp>
+#include <ndn-cxx/face.hpp>
#include <boost/thread/locks.hpp>
#include <boost/thread/recursive_mutex.hpp>
#endif
@@ -54,9 +55,6 @@
contactList.insert(contactList.end(), m_contactList.begin(), m_contactList.end());
}
private:
- shared_ptr<ndn::IdentityCertificate>
- loadTrustAnchor();
-
void
initializeSecurity();
@@ -71,12 +69,12 @@
// PROFILE: self-endorse-certificate
void
- onDnsSelfEndorseCertValidated(const shared_ptr<const Data>& selfEndorseCertificate,
+ onDnsSelfEndorseCertValidated(const Data& selfEndorseCertificate,
const Name& identity);
void
- onDnsSelfEndorseCertValidationFailed(const shared_ptr<const Data>& selfEndorseCertificate,
- const std::string& failInfo,
+ onDnsSelfEndorseCertValidationFailed(const Data& selfEndorseCertificate,
+ const ndn::security::ValidationError& error,
const Name& identity);
void
@@ -84,11 +82,11 @@
// ENDORSED: endorse-collection
void
- onDnsCollectEndorseValidated(const shared_ptr<const Data>& data, const Name& identity);
+ onDnsCollectEndorseValidated(const Data& data, const Name& identity);
void
- onDnsCollectEndorseValidationFailed(const shared_ptr<const Data>& data,
- const std::string& failInfo,
+ onDnsCollectEndorseValidationFailed(const Data& data,
+ const ndn::security::ValidationError& error,
const Name& identity);
void
@@ -97,7 +95,7 @@
// PROFILE-CERT: endorse-certificate
void
- onEndorseCertificateInternal(const Interest& interest, Data& data,
+ onEndorseCertificateInternal(const Interest& interest, const Data& data,
const Name& identity, size_t certIndex,
std::string hash);
@@ -111,11 +109,11 @@
collectEndorsement();
void
- onDnsEndorseeValidated(const shared_ptr<const Data>& data);
+ onDnsEndorseeValidated(const Data& data);
void
- onDnsEndorseeValidationFailed(const shared_ptr<const Data>& data,
- const std::string& failInfo);
+ onDnsEndorseeValidationFailed(const Data& data,
+ const ndn::security::ValidationError& error);
void
onDnsEndorseeTimeoutNotify(const Interest& interest);
@@ -128,10 +126,11 @@
// Identity certificate
void
- onIdentityCertValidated(const shared_ptr<const Data>& data);
+ onIdentityCertValidated(const Data& data);
void
- onIdentityCertValidationFailed(const shared_ptr<const Data>& data, const std::string& failInfo);
+ onIdentityCertValidationFailed(const Data& data,
+ const ndn::security::ValidationError& error);
void
onIdentityCertTimeoutNotify(const Interest& interest);
@@ -156,22 +155,22 @@
// Communication
void
sendInterest(const Interest& interest,
- const ndn::OnDataValidated& onValidated,
- const ndn::OnDataValidationFailed& onValidationFailed,
+ const ndn::security::DataValidationSuccessCallback& onValidated,
+ const ndn::security::DataValidationFailureCallback& onValidationFailed,
const TimeoutNotify& timeoutNotify,
int retry = 1);
void
onTargetData(const Interest& interest,
const Data& data,
- const ndn::OnDataValidated& onValidated,
- const ndn::OnDataValidationFailed& onValidationFailed);
+ const ndn::security::DataValidationSuccessCallback& onValidated,
+ const ndn::security::DataValidationFailureCallback& onValidationFailed);
void
onTargetTimeout(const Interest& interest,
int retry,
- const ndn::OnDataValidated& onValidated,
- const ndn::OnDataValidationFailed& onValidationFailed,
+ const ndn::security::DataValidationSuccessCallback& onValidated,
+ const ndn::security::DataValidationFailureCallback& onValidationFailed,
const TimeoutNotify& timeoutNotify);
// DNS listener
@@ -181,6 +180,9 @@
void
onDnsRegisterFailed(const Name& prefix, const std::string& failInfo);
+ void
+ onKeyInterest(const Name& prefix, const Interest& interest);
+
signals:
void
contactEndorseInfoReady(const EndorseInfo& endorseInfo);
@@ -195,7 +197,7 @@
nameListReady(const QStringList& certNameList);
void
- idCertReady(const ndn::IdentityCertificate& idCert);
+ idCertReady(const ndn::security::Certificate& idCert);
void
contactAliasListReady(const QStringList& aliasList);
@@ -263,14 +265,14 @@
};
typedef std::map<Name, FetchedInfo> BufferedContacts;
- typedef std::map<Name, shared_ptr<ndn::IdentityCertificate> > BufferedIdCerts;
+ typedef std::map<Name, shared_ptr<ndn::security::Certificate> > BufferedIdCerts;
typedef boost::recursive_mutex RecLock;
typedef boost::unique_lock<RecLock> UniqueRecLock;
// Conf
shared_ptr<ContactStorage> m_contactStorage;
- shared_ptr<ndn::Validator> m_validator;
+ shared_ptr<ndn::security::ValidatorConfig> m_validator;
ndn::Face& m_face;
ndn::KeyChain m_keyChain;
Name m_identity;
@@ -281,7 +283,9 @@
BufferedIdCerts m_bufferedIdCerts;
// Tmp Dns
- const ndn::RegisteredPrefixId* m_dnsListenerId;
+ shared_ptr<ndn::RegisteredPrefixHandle> m_dnsListenerId;
+ shared_ptr<ndn::RegisteredPrefixHandle> m_keyListenerId;
+ shared_ptr<ndn::RegisteredPrefixHandle> m_profileCertListenerId;
RecLock m_collectCountMutex;
size_t m_collectCount;
diff --git a/src/contact-panel.hpp b/src/contact-panel.hpp
index d164391..7eec224 100644
--- a/src/contact-panel.hpp
+++ b/src/contact-panel.hpp
@@ -14,6 +14,7 @@
#include <QDialog>
#include <QStringListModel>
#include <QSqlTableModel>
+#include <QItemSelection>
#include "set-alias-dialog.hpp"
#include "endorse-combobox-delegate.hpp"
diff --git a/src/contact-storage.cpp b/src/contact-storage.cpp
index d59a707..d5e0fe2 100644
--- a/src/contact-storage.cpp
+++ b/src/contact-storage.cpp
@@ -13,11 +13,8 @@
#include <boost/filesystem.hpp>
#include "cryptopp.hpp"
-#include "logging.h"
-// INIT_LOGGER ("chronochat.ContactStorage");
-
namespace chronochat {
namespace fs = boost::filesystem;
@@ -25,8 +22,6 @@
using std::string;
using std::vector;
-using ndn::PublicKey;
-
// user's own profile;
const string INIT_SP_TABLE =
"CREATE TABLE IF NOT EXISTS "
@@ -159,7 +154,7 @@
static Block
sqlite3_column_block(sqlite3_stmt* statement, int column)
{
- return Block(reinterpret_cast<const char*>(sqlite3_column_blob(statement, column)),
+ return Block(reinterpret_cast<const uint8_t*>(sqlite3_column_blob(statement, column)),
sqlite3_column_bytes(statement, column));
}
@@ -257,6 +252,27 @@
sqlite3_finalize(stmt);
}
+shared_ptr<EndorseCertificate>
+ContactStorage::getSelfEndorseCertificate()
+{
+ shared_ptr<EndorseCertificate> cert;
+
+ sqlite3_stmt *stmt;
+ sqlite3_prepare_v2(m_db,
+ "SELECT endorse_data FROM SelfEndorse where identity=?",
+ -1, &stmt, 0);
+ sqlite3_bind_string(stmt, 1, m_identity.toUri(), SQLITE_TRANSIENT);
+
+ if (sqlite3_step(stmt) == SQLITE_ROW) {
+ cert = make_shared<EndorseCertificate>();
+ cert->wireDecode(sqlite3_column_block(stmt, 0));
+ }
+
+ sqlite3_finalize(stmt);
+
+ return cert;
+}
+
void
ContactStorage::addEndorseCertificate(const EndorseCertificate& endorseCertificate,
const Name& identity)
@@ -283,7 +299,7 @@
sqlite3_prepare_v2(m_db,
"INSERT OR REPLACE INTO CollectEndorse \
(endorser, endorse_name, endorse_data) \
- VALUES (?, ?, ?, ?)",
+ VALUES (?, ?, ?)",
-1, &stmt, 0);
sqlite3_bind_string(stmt, 1, endorserName.toUri(), SQLITE_TRANSIENT);
sqlite3_bind_string(stmt, 2, certName.toUri(), SQLITE_TRANSIENT);
@@ -315,6 +331,27 @@
sqlite3_finalize(stmt);
}
+shared_ptr<EndorseCertificate>
+ContactStorage::getCollectEndorseByName(const Name& name)
+{
+ shared_ptr<EndorseCertificate> cert;
+
+ sqlite3_stmt *stmt;
+ sqlite3_prepare_v2(m_db,
+ "SELECT endorse_name, endorse_data FROM CollectEndorse where endorse_name=?",
+ -1, &stmt, 0);
+ sqlite3_bind_string(stmt, 1, name.toUri(), SQLITE_TRANSIENT);
+
+ if (sqlite3_step(stmt) == SQLITE_ROW) {
+ cert = make_shared<EndorseCertificate>();
+ cert->wireDecode(sqlite3_column_block(stmt, 1));
+ }
+
+ sqlite3_finalize(stmt);
+
+ return cert;
+}
+
void
ContactStorage::getEndorseList(const Name& identity, vector<string>& endorseList)
{
@@ -375,8 +412,8 @@
sqlite3_bind_string(stmt, 2, contact.getAlias(), SQLITE_TRANSIENT);
sqlite3_bind_string(stmt, 3, contact.getPublicKeyName().toUri(), SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 4,
- reinterpret_cast<const char*>(contact.getPublicKey().get().buf()),
- contact.getPublicKey().get().size(), SQLITE_TRANSIENT);
+ reinterpret_cast<const char*>(contact.getPublicKey().data()),
+ contact.getPublicKey().size(), SQLITE_TRANSIENT);
sqlite3_bind_int64(stmt, 5, time::toUnixTimestamp(contact.getNotBefore()).count());
sqlite3_bind_int64(stmt, 6, time::toUnixTimestamp(contact.getNotAfter()).count());
sqlite3_bind_int(stmt, 7, (isIntroducer ? 1 : 0));
@@ -433,7 +470,7 @@
if (sqlite3_step(stmt) == SQLITE_ROW) {
string alias = sqlite3_column_string(stmt, 0);
string keyName = sqlite3_column_string(stmt, 1);
- PublicKey key(sqlite3_column_text(stmt, 2), sqlite3_column_bytes (stmt, 2));
+ ndn::Buffer key(sqlite3_column_text(stmt, 2), sqlite3_column_bytes (stmt, 2));
time::system_clock::TimePoint notBefore =
time::fromUnixTimestamp(time::milliseconds(sqlite3_column_int64 (stmt, 3)));
time::system_clock::TimePoint notAfter =
@@ -445,6 +482,9 @@
}
sqlite3_finalize(stmt);
+ if (!static_cast<bool>(contact))
+ return contact;
+
sqlite3_prepare_v2(m_db,
"SELECT profile_type, profile_value FROM ContactProfile \
where profile_identity=?",
diff --git a/src/contact-storage.hpp b/src/contact-storage.hpp
index aa137b4..10bb117 100644
--- a/src/contact-storage.hpp
+++ b/src/contact-storage.hpp
@@ -44,6 +44,9 @@
void
addSelfEndorseCertificate(const EndorseCertificate& endorseCertificate);
+ shared_ptr<EndorseCertificate>
+ getSelfEndorseCertificate();
+
void
addEndorseCertificate(const EndorseCertificate& endorseCertificate, const Name& identity);
@@ -53,6 +56,9 @@
void
getCollectEndorse(EndorseCollection& endorseCollection);
+ shared_ptr<EndorseCertificate>
+ getCollectEndorseByName(const Name& name);
+
void
getEndorseList(const Name& identity, std::vector<std::string>& endorseList);
diff --git a/src/contact.hpp b/src/contact.hpp
index 8583d16..b0fe674 100644
--- a/src/contact.hpp
+++ b/src/contact.hpp
@@ -12,9 +12,10 @@
#define CHRONOCHAT_CONTACT_HPP
#include "common.hpp"
-#include <ndn-cxx/security/identity-certificate.hpp>
+#include <ndn-cxx/security/certificate.hpp>
#include <ndn-cxx/util/regex.hpp>
#include "endorse-certificate.hpp"
+#include "profile.hpp"
namespace chronochat {
@@ -24,39 +25,51 @@
typedef std::map<Name, shared_ptr<ndn::Regex> >::const_iterator const_iterator;
typedef std::map<Name, shared_ptr<ndn::Regex> >::iterator iterator;
- Contact(const ndn::IdentityCertificate& identityCertificate,
+ Contact(const ndn::security::Certificate& identityCertificate,
bool isIntroducer = false,
const std::string& alias = "")
- : m_notBefore(identityCertificate.getNotBefore())
- , m_notAfter(identityCertificate.getNotAfter())
+ : m_notBefore(time::system_clock::now())
+ , m_notAfter(time::system_clock::now() + time::days(3650))
, m_isIntroducer(isIntroducer)
, m_profile(identityCertificate)
{
+ m_keyName = identityCertificate.getKeyName();
+ m_namespace = m_keyName.getPrefix(-2);
+ m_publicKey = identityCertificate.getPublicKey();
+
m_name = m_profile.get("name");
+ m_name = m_name.empty() ? m_namespace.toUri() : m_name;
m_alias = alias.empty() ? m_name : alias;
m_institution = m_profile.get("institution");
- m_keyName = identityCertificate.getPublicKeyName();
- m_namespace = m_keyName.getPrefix(-1);
- m_publicKey = identityCertificate.getPublicKeyInfo();
+ try {
+ m_notBefore = identityCertificate.getValidityPeriod().getPeriod().first;
+ m_notAfter = identityCertificate.getValidityPeriod().getPeriod().second;
+ } catch (tlv::Error&) {}
}
Contact(const EndorseCertificate& endorseCertificate,
bool isIntroducer = false,
const std::string& alias = "")
- : m_notBefore(endorseCertificate.getNotBefore())
- , m_notAfter(endorseCertificate.getNotAfter())
+ : m_notBefore(time::system_clock::now())
+ , m_notAfter(time::system_clock::now() + time::days(3650))
, m_isIntroducer(isIntroducer)
{
m_profile = endorseCertificate.getProfile();
+ m_keyName = endorseCertificate.getKeyName().getPrefix(-1).append("KEY");
+ m_namespace = m_keyName.getPrefix(-3);
+ m_publicKey = endorseCertificate.getPublicKey();
+
m_name = m_profile.get("name");
+ m_name = m_name.empty() ? m_namespace.toUri() : m_name;
m_alias = alias.empty() ? m_name : alias;
m_institution = m_profile.get("institution");
- m_keyName = endorseCertificate.getPublicKeyName();;
- m_namespace = m_keyName.getPrefix(-1);
- m_publicKey = endorseCertificate.getPublicKeyInfo();
+ try {
+ m_notBefore = endorseCertificate.getValidityPeriod().getPeriod().first;
+ m_notAfter = endorseCertificate.getValidityPeriod().getPeriod().second;
+ } catch (tlv::Error&) {}
}
Contact(const Name& identity,
@@ -64,7 +77,7 @@
const Name& keyName,
const time::system_clock::TimePoint& notBefore,
const time::system_clock::TimePoint& notAfter,
- const ndn::PublicKey& key,
+ const ndn::Buffer& key,
bool isIntroducer)
: m_namespace(identity)
, m_alias(alias)
@@ -126,7 +139,7 @@
return m_keyName;
}
- const ndn::PublicKey&
+ const ndn::Buffer&
getPublicKey() const
{
return m_publicKey;
@@ -224,7 +237,7 @@
std::string m_name;
std::string m_institution;
Name m_keyName;
- ndn::PublicKey m_publicKey;
+ ndn::Buffer m_publicKey;
time::system_clock::TimePoint m_notBefore;
time::system_clock::TimePoint m_notAfter;
diff --git a/src/controller-backend.cpp b/src/controller-backend.cpp
index a432366..7c6b8a5 100644
--- a/src/controller-backend.cpp
+++ b/src/controller-backend.cpp
@@ -13,22 +13,17 @@
#ifndef Q_MOC_RUN
#include <ndn-cxx/util/segment-fetcher.hpp>
+#include <ndn-cxx/security/signing-helpers.hpp>
+#include <ndn-cxx/security/certificate-fetcher-offline.hpp>
#include "invitation.hpp"
-#include "logging.h"
+#include <iostream>
#endif
-
-INIT_LOGGER("ControllerBackend");
-
namespace chronochat {
using std::string;
using ndn::Face;
-using ndn::IdentityCertificate;
-using ndn::OnInterestValidated;
-using ndn::OnInterestValidationFailed;
-
static const ndn::Name::Component ROUTING_HINT_SEPARATOR =
ndn::name::Component::fromEscapedString("%F0%2E");
@@ -39,7 +34,6 @@
: QThread(parent)
, m_shouldResume(false)
, m_contactManager(m_face)
- , m_invitationListenerId(0)
{
// connection to contact manager
connect(this, SIGNAL(identityUpdated(const QString&)),
@@ -48,6 +42,7 @@
connect(&m_contactManager, SIGNAL(contactIdListReady(const QStringList&)),
this, SLOT(onContactIdListReady(const QStringList&)));
+ m_validator = make_shared<ndn::security::ValidatorNull>();
}
ControllerBackend::~ControllerBackend()
@@ -141,31 +136,32 @@
invitationPrefix.append(m_identity).append("CHRONOCHAT-INVITATION");
requestPrefix.append(m_identity).append("CHRONOCHAT-INVITATION-REQUEST");
- const ndn::RegisteredPrefixId* invitationListenerId =
- m_face.setInterestFilter(invitationPrefix,
+ auto invitationListenerId =
+ make_shared<ndn::RegisteredPrefixHandle>(m_face.setInterestFilter(invitationPrefix,
bind(&ControllerBackend::onInvitationInterest,
this, _1, _2, offset),
bind(&ControllerBackend::onInvitationRegisterFailed,
- this, _1, _2));
+ this, _1, _2)));
if (m_invitationListenerId != 0) {
- m_face.unregisterPrefix(m_invitationListenerId,
- bind(&ControllerBackend::onInvitationPrefixReset, this),
- bind(&ControllerBackend::onInvitationPrefixResetFailed, this, _1));
+ invitationListenerId->unregister(
+ bind(&ControllerBackend::onInvitationPrefixReset, this),
+ bind(&ControllerBackend::onInvitationPrefixResetFailed, this, _1));
}
m_invitationListenerId = invitationListenerId;
- const ndn::RegisteredPrefixId* requestListenerId =
- m_face.setInterestFilter(requestPrefix,
- bind(&ControllerBackend::onInvitationRequestInterest,
- this, _1, _2, offset),
- [] (const Name& prefix, const std::string& failInfo) {});
+ auto requestListenerId =
+ make_shared<ndn::RegisteredPrefixHandle>(
+ m_face.setInterestFilter(requestPrefix,
+ bind(&ControllerBackend::onInvitationRequestInterest,
+ this, _1, _2, offset),
+ [] (const Name& prefix, const std::string& failInfo) {}));
if (m_requestListenerId != 0) {
- m_face.unregisterPrefix(m_requestListenerId,
- []{},
- [] (const std::string& failInfo) {});
+ m_requestListenerId->unregister(
+ []{},
+ [] (const std::string& failInfo) {});
}
m_requestListenerId = requestListenerId;
@@ -210,11 +206,10 @@
return;
}
- OnInterestValidated onValidated = bind(&ControllerBackend::onInvitationValidated, this, _1);
- OnInterestValidationFailed onFailed = bind(&ControllerBackend::onInvitationValidationFailed,
- this, _1, _2);
-
- m_validator.validate(*invitationInterest, onValidated, onFailed);
+ m_validator->validate(
+ *invitationInterest,
+ bind(&ControllerBackend::onInvitationValidated, this, _1),
+ bind(&ControllerBackend::onInvitationValidationFailed, this, _1, _2));
}
void
@@ -248,20 +243,20 @@
}
void
-ControllerBackend::onInvitationValidated(const shared_ptr<const Interest>& interest)
+ControllerBackend::onInvitationValidated(const Interest& interest)
{
- Invitation invitation(interest->getName());
+ Invitation invitation(interest.getName());
// Should be obtained via a method of ContactManager.
- string alias = invitation.getInviterCertificate().getPublicKeyName().getPrefix(-1).toUri();
+ string alias = invitation.getInviterCertificate().getKeyName().getPrefix(-1).toUri();
emit invitationValidated(QString::fromStdString(alias),
QString::fromStdString(invitation.getChatroom()),
- interest->getName());
+ interest.getName());
}
void
-ControllerBackend::onInvitationValidationFailed(const shared_ptr<const Interest>& interest,
- string failureInfo)
+ControllerBackend::onInvitationValidationFailed(const Interest& interest,
+ const ndn::security::ValidationError& failureInfo)
{
// _LOG_DEBUG("Invitation: " << interest->getName() <<
// " cannot not be validated due to: " << failureInfo);
@@ -317,7 +312,7 @@
}
void
-ControllerBackend::onRequestResponse(const Interest& interest, Data& data)
+ControllerBackend::onRequestResponse(const Interest& interest, const Data& data)
{
size_t i;
Name interestName = interest.getName();
@@ -344,6 +339,7 @@
if (resendTimes < MAXIMUM_REQUEST)
m_face.expressInterest(interest,
bind(&ControllerBackend::onRequestResponse, this, _1, _2),
+ bind(&ControllerBackend::onRequestTimeout, this, _1, resendTimes + 1),
bind(&ControllerBackend::onRequestTimeout, this, _1, resendTimes + 1));
else
emit invitationRequestResult("Invitation request times out.");
@@ -384,11 +380,11 @@
interest.setInterestLifetime(time::milliseconds(1000));
interest.setMustBeFresh(true);
- ndn::util::SegmentFetcher::fetch(m_face,
- interest,
- m_nullValidator,
- bind(&ControllerBackend::onLocalPrefix, this, _1),
- bind(&ControllerBackend::onLocalPrefixError, this, _1, _2));
+ auto fetcher = ndn::util::SegmentFetcher::start(m_face,
+ interest,
+ m_nullValidator);
+ fetcher->onComplete.connect(bind(&ControllerBackend::onLocalPrefix, this, _1));
+ fetcher->onError.connect(bind(&ControllerBackend::onLocalPrefixError, this, _1, _2));
}
void
@@ -411,7 +407,7 @@
ControllerBackend::onInvitationResponded(const ndn::Name& invitationName, bool accepted)
{
shared_ptr<Data> response = make_shared<Data>();
- shared_ptr<IdentityCertificate> chatroomCert;
+ shared_ptr<ndn::security::Certificate> chatroomCert;
// generate reply;
if (accepted) {
@@ -422,8 +418,8 @@
// We should create a particular certificate for this chatroom,
//but let's use default one for now.
- chatroomCert
- = m_keyChain.getCertificate(m_keyChain.getDefaultCertificateNameForIdentity(m_identity));
+ chatroomCert = make_shared<ndn::security::Certificate>(
+ m_keyChain.createIdentity(m_identity).getDefaultKey().getDefaultCertificate());
response->setContent(chatroomCert->wireEncode());
response->setFreshnessPeriod(time::milliseconds(1000));
@@ -433,7 +429,7 @@
response->setFreshnessPeriod(time::milliseconds(1000));
}
- m_keyChain.signByIdentity(*response, m_identity);
+ m_keyChain.sign(*response, ndn::security::signingByIdentity(m_identity));
// Check if we need a wrapper
Name invitationRoutingPrefix = getInvitationRoutingPrefix();
@@ -451,7 +447,7 @@
wrappedData->setContent(response->wireEncode());
wrappedData->setFreshnessPeriod(time::milliseconds(1000));
- m_keyChain.signByIdentity(*wrappedData, m_identity);
+ m_keyChain.sign(*wrappedData, ndn::security::signingByIdentity(m_identity));
m_face.put(*wrappedData);
}
@@ -469,7 +465,8 @@
else
response->setContent(ndn::makeNonNegativeIntegerBlock(tlv::Content, 0));
- m_keyChain.signByIdentity(*response, m_identity);
+ response->setFreshnessPeriod(time::milliseconds(1000));
+ m_keyChain.sign(*response, ndn::security::signingByIdentity(m_identity));
m_ims.insert(*response);
m_face.put(*response);
}
@@ -491,6 +488,7 @@
interest.getNonce();
m_face.expressInterest(interest,
bind(&ControllerBackend::onRequestResponse, this, _1, _2),
+ bind(&ControllerBackend::onRequestTimeout, this, _1, 0),
bind(&ControllerBackend::onRequestTimeout, this, _1, 0));
}
@@ -500,10 +498,10 @@
ContactList contactList;
m_contactManager.getContactList(contactList);
- m_validator.cleanTrustAnchor();
+ // m_validator.cleanTrustAnchor();
- for (ContactList::const_iterator it = contactList.begin(); it != contactList.end(); it++)
- m_validator.addTrustAnchor((*it)->getPublicKeyName(), (*it)->getPublicKey());
+ // for (ContactList::const_iterator it = contactList.begin(); it != contactList.end(); it++)
+ // m_validator.addTrustAnchor((*it)->getPublicKeyName(), (*it)->getPublicKey());
}
diff --git a/src/controller-backend.hpp b/src/controller-backend.hpp
index be2cf25..18b1cd8 100644
--- a/src/controller-backend.hpp
+++ b/src/controller-backend.hpp
@@ -20,10 +20,10 @@
#include "common.hpp"
#include "contact-manager.hpp"
#include "invitation.hpp"
-#include "validator-invitation.hpp"
#include <ndn-cxx/security/key-chain.hpp>
-#include <ndn-cxx/util/in-memory-storage-persistent.hpp>
+#include <ndn-cxx/ims/in-memory-storage-persistent.hpp>
#include <ndn-cxx/security/validator-null.hpp>
+#include <ndn-cxx/face.hpp>
#include <boost/thread.hpp>
#include <mutex>
#endif
@@ -74,11 +74,11 @@
onInvitationRegisterFailed(const Name& prefix, const std::string& failInfo);
void
- onInvitationValidated(const shared_ptr<const Interest>& interest);
+ onInvitationValidated(const Interest& interest);
void
- onInvitationValidationFailed(const shared_ptr<const Interest>& interest,
- std::string failureInfo);
+ onInvitationValidationFailed(const Interest& interest,
+ const ndn::security::ValidationError& failureInfo);
void
onLocalPrefix(const ndn::ConstBufferPtr& data);
@@ -90,7 +90,7 @@
updateLocalPrefix(const Name& localPrefix);
void
- onRequestResponse(const Interest& interest, Data& data);
+ onRequestResponse(const Interest& interest, const Data& data);
void
onRequestTimeout(const Interest& interest, int& resendTimes);
@@ -166,12 +166,12 @@
// Security related;
ndn::KeyChain m_keyChain;
- ValidatorInvitation m_validator;
- ndn::ValidatorNull m_nullValidator;
+ shared_ptr<ndn::security::Validator> m_validator;
+ ndn::security::ValidatorNull m_nullValidator;
// RegisteredPrefixId
- const ndn::RegisteredPrefixId* m_invitationListenerId;
- const ndn::RegisteredPrefixId* m_requestListenerId;
+ shared_ptr<ndn::RegisteredPrefixHandle> m_invitationListenerId;
+ shared_ptr<ndn::RegisteredPrefixHandle> m_requestListenerId;
// ChatRoomList
QStringList m_chatDialogList;
@@ -180,7 +180,7 @@
std::mutex m_resumeMutex;
std::mutex m_nfdConnectionMutex;
- ndn::util::InMemoryStoragePersistent m_ims;
+ ndn::InMemoryStoragePersistent m_ims;
};
} // namespace chronochat
diff --git a/src/controller.cpp b/src/controller.cpp
index b45e1dd..d41b65d 100644
--- a/src/controller.cpp
+++ b/src/controller.cpp
@@ -28,7 +28,7 @@
INIT_LOGGER("chronochat.Controller");
Q_DECLARE_METATYPE(ndn::Name)
-Q_DECLARE_METATYPE(ndn::IdentityCertificate)
+Q_DECLARE_METATYPE(ndn::security::Certificate)
Q_DECLARE_METATYPE(chronochat::EndorseInfo)
Q_DECLARE_METATYPE(ndn::Interest)
Q_DECLARE_METATYPE(size_t)
@@ -57,8 +57,8 @@
, m_discoveryPanel(new DiscoveryPanel(this))
{
qRegisterMetaType<ndn::Name>("ndn.Name");
- qRegisterMetaType<ndn::IdentityCertificate>("ndn.IdentityCertificate");
- qRegisterMetaType<chronochat::EndorseInfo>("chronochat.EndorseInfo");
+ qRegisterMetaType<ndn::security::Certificate>("ndn.security.v2.Certificate");
+ qRegisterMetaType<chronochat::EndorseInfo>("EndorseInfo");
qRegisterMetaType<ndn::Interest>("ndn.Interest");
qRegisterMetaType<size_t>("size_t");
qRegisterMetaType<chronochat::ChatroomInfo>("chronochat.Chatroom");
@@ -126,8 +126,8 @@
m_browseContactDialog, SLOT(onIdCertNameListReady(const QStringList&)));
connect(m_backend.getContactManager(), SIGNAL(nameListReady(const QStringList&)),
m_browseContactDialog, SLOT(onNameListReady(const QStringList&)));
- connect(m_backend.getContactManager(), SIGNAL(idCertReady(const ndn::IdentityCertificate&)),
- m_browseContactDialog, SLOT(onIdCertReady(const ndn::IdentityCertificate&)));
+ connect(m_backend.getContactManager(), SIGNAL(idCertReady(const ndn::security::Certificate&)),
+ m_browseContactDialog, SLOT(onIdCertReady(const ndn::security::Certificate&)));
// Connection to ContactPanel
connect(m_contactPanel, SIGNAL(waitForContactList()),
@@ -322,15 +322,15 @@
else
m_nick = m_identity.get(-1).toUri();
}
- catch (tlv::Error) {
+ catch (tlv::Error&) {
try {
ndn::KeyChain keyChain;
- m_identity = keyChain.getDefaultIdentity();
+ m_identity = keyChain.getPib().getDefaultIdentity().getName();
}
- catch (ndn::KeyChain::Error) {
+ catch (ndn::security::pib::Pib::Error&) {
m_identity.clear();
m_identity.append("chronochat-tmp-identity")
- .append(getRandomString());
+ .append(getRandomString());
}
m_nick = m_identity.get(-1).toUri();
}
@@ -423,8 +423,8 @@
void
Controller::updateMenu()
{
- QMenu* menu = new QMenu(this);
- QMenu* closeMenu = 0;
+ m_trayIconMenu->clear();
+ QMenu* menu = m_trayIconMenu;
menu->addAction(m_startChatroom);
menu->addAction(m_chatroomDiscoveryAction);
@@ -448,23 +448,18 @@
menu->addAction(m_updateLocalPrefixAction);
menu->addSeparator();
menu->addAction(m_minimizeAction);
- closeMenu = menu->addMenu("Close chatroom");
+ m_closeMenu = menu->addMenu("Close chatroom");
{
ChatActionList::const_iterator it = m_closeActionList.begin();
ChatActionList::const_iterator end = m_closeActionList.end();
if (it == end)
- closeMenu->setEnabled(false);
+ m_closeMenu->setEnabled(false);
else
for (; it != end; it++)
- closeMenu->addAction(it->second);
+ m_closeMenu->addAction(it->second);
}
menu->addSeparator();
menu->addAction(m_quitAction);
-
- m_trayIcon->setContextMenu(menu);
- delete m_trayIconMenu;
- m_trayIconMenu = menu;
- m_closeMenu = closeMenu;
}
string
@@ -616,6 +611,7 @@
void
Controller::onProfileEditorAction()
{
+ m_profileEditor->resetPanel();
m_profileEditor->show();
m_profileEditor->raise();
}
@@ -770,6 +766,8 @@
void
Controller::onRemoveChatDialog(const QString& chatroomName)
{
+ emit removeChatroom(chatroomName);
+
ChatDialogList::iterator it = m_chatDialogList.find(chatroomName.toStdString());
if (it != m_chatDialogList.end()) {
ChatDialog* deletedChat = it->second;
@@ -804,7 +802,7 @@
if (m_isInConnectionDetection)
return;
// begin a thread
-
+
m_isInConnectionDetection = true;
m_nfdConnectionChecker = new NfdConnectionChecker(this);
diff --git a/src/digest-tree-scene.cpp b/src/digest-tree-scene.cpp
index 17bc67a..55d9a36 100644
--- a/src/digest-tree-scene.cpp
+++ b/src/digest-tree-scene.cpp
@@ -12,10 +12,10 @@
#include "digest-tree-scene.hpp"
#include <QtGui>
+#include <QGraphicsTextItem>
#ifndef Q_MOC_RUN
#include <vector>
-#include <iostream>
#include <assert.h>
#include <boost/lexical_cast.hpp>
#include <memory>
@@ -28,7 +28,7 @@
//DisplayUserPtr DisplayUserNullPtr;
-DigestTreeScene::DigestTreeScene(QWidget *parent)
+DigestTreeScene::DigestTreeScene(QObject *parent)
: QGraphicsScene(parent)
{
m_previouslyUpdatedUser = DisplayUserNullPtr;
diff --git a/src/digest-tree-scene.hpp b/src/digest-tree-scene.hpp
index 0e69528..562feeb 100644
--- a/src/digest-tree-scene.hpp
+++ b/src/digest-tree-scene.hpp
@@ -12,7 +12,7 @@
#ifndef CHRONOCHAT_DIGEST_TREE_SCENE_HPP
#define CHRONOCHAT_DIGEST_TREE_SCENE_HPP
-#include <QtGui/QGraphicsScene>
+#include <QGraphicsScene>
#include <QColor>
#include <QMap>
@@ -44,7 +44,7 @@
Q_OBJECT
public:
- DigestTreeScene(QWidget *parent = 0);
+ DigestTreeScene(QObject *parent = 0);
void
processSyncUpdate(const std::vector<chronochat::NodeInfo>& nodeInfos,
diff --git a/src/discovery-panel.cpp b/src/discovery-panel.cpp
index b7c0ed6..06c7cf7 100644
--- a/src/discovery-panel.cpp
+++ b/src/discovery-panel.cpp
@@ -21,7 +21,6 @@
namespace chronochat {
-static const time::seconds REFRESH_INTERVAL(60);
static const ndn::Name::Component ROUTING_HINT_SEPARATOR =
ndn::name::Component::fromEscapedString("%F0%2E");
@@ -91,7 +90,6 @@
void
DiscoveryPanel::onIdentityUpdated(const QString& identity)
{
- resetPanel();
}
void
diff --git a/src/discovery-panel.hpp b/src/discovery-panel.hpp
index 1b5bd92..473283f 100644
--- a/src/discovery-panel.hpp
+++ b/src/discovery-panel.hpp
@@ -13,6 +13,7 @@
#include <QDialog>
#include <QStringListModel>
+#include <QItemSelection>
#ifndef Q_MOC_RUN
#include "chatroom-info.hpp"
diff --git a/src/endorse-certificate.cpp b/src/endorse-certificate.cpp
index cbeb18c..f9286c6 100644
--- a/src/endorse-certificate.cpp
+++ b/src/endorse-certificate.cpp
@@ -12,6 +12,8 @@
#include "endorse-certificate.hpp"
#include <boost/iostreams/stream.hpp>
#include <ndn-cxx/encoding/buffer-stream.hpp>
+#include <ndn-cxx/security/additional-description.hpp>
+#include <ndn-cxx/security/validity-period.hpp>
#include "endorse-extension.hpp"
#include <list>
@@ -20,16 +22,9 @@
using std::vector;
using std::string;
-using ndn::PublicKey;
-using ndn::IdentityCertificate;
-using ndn::CertificateSubjectDescription;
-using ndn::CertificateExtension;
-using ndn::OID;
+using ndn::security::Certificate;
using ndn::OBufferStream;
-const OID EndorseCertificate::PROFILE_EXT_OID("1.3.6.1.5.32.2.1");
-const OID EndorseCertificate::ENDORSE_EXT_OID("1.3.6.1.5.32.2.2");
-
const vector<string> EndorseCertificate::DEFAULT_ENDORSE_LIST;
EndorseExtension&
@@ -51,107 +46,132 @@
return endorseExtension;
}
-EndorseCertificate::EndorseCertificate(const IdentityCertificate& kskCertificate,
+EndorseCertificate::EndorseCertificate(const Certificate& kskCertificate,
const Profile& profile,
const vector<string>& endorseList)
: Certificate()
, m_profile(profile)
, m_endorseList(endorseList)
{
- m_keyName = IdentityCertificate::certificateNameToPublicKeyName(kskCertificate.getName());
- m_signer = m_keyName;
+ setName(kskCertificate.getKeyName().getPrefix(-2)
+ .append("PROFILE-CERT")
+ .append("KEY")
+ .append(kskCertificate.getKeyId())
+ .append("self")
+ .appendTimestamp());
- Name dataName = m_keyName;
- dataName.append("PROFILE-CERT").append(m_signer.wireEncode()).appendVersion();
- setName(dataName);
+ m_signer = kskCertificate.getKeyName();
- setNotBefore(kskCertificate.getNotBefore());
- setNotAfter(kskCertificate.getNotAfter());
- addSubjectDescription(CertificateSubjectDescription(OID("2.5.4.41"), m_keyName.toUri()));
- setPublicKeyInfo(kskCertificate.getPublicKeyInfo());
+ setMetaInfo(kskCertificate.getMetaInfo());
+ setContent(kskCertificate.getPublicKey().data(), kskCertificate.getPublicKey().size());
- Block profileWire = m_profile.wireEncode();
- addExtension(CertificateExtension(PROFILE_EXT_OID, true, ndn::Buffer(profileWire.wire(),
- profileWire.size())));
+ ndn::security::AdditionalDescription description;
+ description.set("2.5.4.41", getKeyName().toUri());
+ description.set("signer", m_signer.toUri());
EndorseExtension endorseExtension;
endorseExtension << m_endorseList;
- Block endorseWire = endorseExtension.wireEncode();
- addExtension(CertificateExtension(ENDORSE_EXT_OID, true, ndn::Buffer(endorseWire.wire(),
- endorseWire.size())));
- encode();
+ ndn::SignatureInfo signatureInfo;
+ signatureInfo.addCustomTlv(description.wireEncode());
+ signatureInfo.addCustomTlv(m_profile.wireEncode());
+
+ if (m_endorseList.size() > 0)
+ signatureInfo.addCustomTlv(endorseExtension.wireEncode());
+
+ try {
+ signatureInfo.setValidityPeriod(kskCertificate.getValidityPeriod());
+ } catch (tlv::Error&) {
+ signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(
+ time::system_clock::now(), time::system_clock::now() + time::days(3650)));
+ }
+
+ setSignatureInfo(signatureInfo);
}
EndorseCertificate::EndorseCertificate(const EndorseCertificate& endorseCertificate,
const Name& signer,
const vector<string>& endorseList)
: Certificate()
- , m_keyName(endorseCertificate.m_keyName)
, m_signer(signer)
, m_profile(endorseCertificate.m_profile)
, m_endorseList(endorseList)
{
- Name dataName = m_keyName;
- dataName.append("PROFILE-CERT").append(m_signer.wireEncode()).appendVersion();
- setName(dataName);
+ setName(endorseCertificate.getName()
+ .getPrefix(-2)
+ .append(m_signer.wireEncode())
+ .appendVersion());
- setNotBefore(endorseCertificate.getNotBefore());
- setNotAfter(endorseCertificate.getNotAfter());
- addSubjectDescription(CertificateSubjectDescription(OID("2.5.4.41"), m_keyName.toUri()));
- setPublicKeyInfo(endorseCertificate.getPublicKeyInfo());
+ setMetaInfo(endorseCertificate.getMetaInfo());
+ setContent(endorseCertificate.getPublicKey().data(), endorseCertificate.getPublicKey().size());
- Block profileWire = m_profile.wireEncode();
- addExtension(CertificateExtension(PROFILE_EXT_OID, true, ndn::Buffer(profileWire.wire(),
- profileWire.size())));
+ ndn::security::AdditionalDescription description;
+ description.set("2.5.4.41", getKeyName().toUri());
+ description.set("signer", m_signer.toUri());
EndorseExtension endorseExtension;
endorseExtension << m_endorseList;
- Block endorseWire = endorseExtension.wireEncode();
- addExtension(CertificateExtension(ENDORSE_EXT_OID, true, ndn::Buffer(endorseWire.wire(),
- endorseWire.size())));
- encode();
+ ndn::SignatureInfo signatureInfo;
+ signatureInfo.addCustomTlv(description.wireEncode());
+ signatureInfo.addCustomTlv(m_profile.wireEncode());
+
+ if (m_endorseList.size() > 0)
+ signatureInfo.addCustomTlv(endorseExtension.wireEncode());
+
+ try {
+ signatureInfo.setValidityPeriod(endorseCertificate.getValidityPeriod());
+ } catch (tlv::Error&) {
+ signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(
+ time::system_clock::now(), time::system_clock::now() + time::days(3650)));
+ }
+
+ setSignatureInfo(signatureInfo);
}
EndorseCertificate::EndorseCertificate(const Name& keyName,
- const PublicKey& key,
+ const ndn::Buffer& key,
const time::system_clock::TimePoint& notBefore,
const time::system_clock::TimePoint& notAfter,
+ const Name::Component& signerKeyId,
const Name& signer,
const Profile& profile,
const vector<string>& endorseList)
: Certificate()
- , m_keyName(keyName)
, m_signer(signer)
, m_profile(profile)
, m_endorseList(endorseList)
{
- Name dataName = m_keyName;
- dataName.append("PROFILE-CERT").append(m_signer.wireEncode()).appendVersion();
- setName(dataName);
+ setName(keyName.getPrefix(-2)
+ .append("PROFILE-CERT")
+ .append("KEY")
+ .append(signerKeyId)
+ .append(m_signer.wireEncode())
+ .appendVersion());
- setNotBefore(notBefore);
- setNotAfter(notAfter);
- addSubjectDescription(CertificateSubjectDescription(OID("2.5.4.41"), m_keyName.toUri()));
- setPublicKeyInfo(key);
+ setContent(key.data(), key.size());
- Block profileWire = m_profile.wireEncode();
- addExtension(CertificateExtension(PROFILE_EXT_OID, true, ndn::Buffer(profileWire.wire(),
- profileWire.size())));
+ ndn::security::AdditionalDescription description;
+ description.set("2.5.4.41", keyName.toUri());
+ description.set("signer", m_signer.toUri());
EndorseExtension endorseExtension;
endorseExtension << m_endorseList;
- Block endorseWire = endorseExtension.wireEncode();
- addExtension(CertificateExtension(ENDORSE_EXT_OID, true, ndn::Buffer(endorseWire.wire(),
- endorseWire.size())));
- encode();
+ ndn::SignatureInfo signatureInfo;
+ signatureInfo.addCustomTlv(description.wireEncode());
+ signatureInfo.addCustomTlv(m_profile.wireEncode());
+
+ if (m_endorseList.size() > 0)
+ signatureInfo.addCustomTlv(endorseExtension.wireEncode());
+
+ signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(notBefore, notAfter));
+
+ setSignatureInfo(signatureInfo);
}
EndorseCertificate::EndorseCertificate(const EndorseCertificate& endorseCertificate)
: Certificate(endorseCertificate)
- , m_keyName(endorseCertificate.m_keyName)
, m_signer(endorseCertificate.m_signer)
, m_profile(endorseCertificate.m_profile)
, m_endorseList(endorseCertificate.m_endorseList)
@@ -161,25 +181,22 @@
EndorseCertificate::EndorseCertificate(const Data& data)
: Certificate(data)
{
- const Name& dataName = data.getName();
- if(dataName.size() < 3 || dataName.get(-3).toUri() != "PROFILE-CERT")
- throw Error("No PROFILE-CERT component in data name!");
+ auto additionalWire = getSignatureInfo().getCustomTlv(tlv::AdditionalDescription);
+ if (additionalWire) {
+ ndn::security::AdditionalDescription additional(*additionalWire);
+ m_signer = additional.get("signer");
+ }
- m_keyName = dataName.getPrefix(-3);
- m_signer.wireDecode(dataName.get(-2).blockFromValue());
+ auto profileWire = getSignatureInfo().getCustomTlv(tlv::Profile);
+ if (profileWire) {
+ m_profile = Profile(*profileWire);
+ }
-
- for (const auto& entry : m_extensionList) {
- if (PROFILE_EXT_OID == entry.getOid()) {
- m_profile.wireDecode(Block(entry.getValue().buf(), entry.getValue().size()));
- }
- if (ENDORSE_EXT_OID == entry.getOid()) {
- EndorseExtension endorseExtension;
- endorseExtension.wireDecode(Block(entry.getValue().buf(), entry.getValue().size()));
-
- endorseExtension >> m_endorseList;
- }
+ auto endorseExtensionBlock = getSignatureInfo().getCustomTlv(tlv::EndorseExtension);
+ if (endorseExtensionBlock) {
+ EndorseExtension endorseExtension(*endorseExtensionBlock);
+ endorseExtension >> m_endorseList;
}
}
diff --git a/src/endorse-certificate.hpp b/src/endorse-certificate.hpp
index 51b3b50..defc8a8 100644
--- a/src/endorse-certificate.hpp
+++ b/src/endorse-certificate.hpp
@@ -16,14 +16,14 @@
namespace chronochat {
-class EndorseCertificate : public ndn::Certificate
+class EndorseCertificate : public ndn::security::Certificate
{
public:
- class Error : public ndn::Certificate::Error
+ class Error : public ndn::security::Certificate::Error
{
public:
Error(const std::string& what)
- : ndn::Certificate::Error(what)
+ : ndn::security::Certificate::Error(what)
{
}
};
@@ -32,7 +32,7 @@
EndorseCertificate() {}
- EndorseCertificate(const ndn::IdentityCertificate& kskCertificate,
+ EndorseCertificate(const ndn::security::Certificate& kskCertificate,
const Profile& profile,
const std::vector<std::string>& endorseList = DEFAULT_ENDORSE_LIST);
@@ -41,9 +41,10 @@
const std::vector<std::string>& endorseList = DEFAULT_ENDORSE_LIST);
EndorseCertificate(const Name& keyName,
- const ndn::PublicKey& key,
+ const ndn::Buffer& key,
const time::system_clock::TimePoint& notBefore,
const time::system_clock::TimePoint& notAfter,
+ const Name::Component& signerKeyId,
const Name& signer,
const Profile& profile,
const std::vector<std::string>& endorseList = DEFAULT_ENDORSE_LIST);
@@ -75,21 +76,10 @@
return m_endorseList;
}
- const Name&
- getPublicKeyName () const
- {
- return m_keyName;
- }
-
private:
- static const ndn::OID PROFILE_EXT_OID;
- static const ndn::OID ENDORSE_EXT_OID;
-
- Name m_keyName;
- Name m_signer; // signing key name
+ Name m_signer;
Profile m_profile;
std::vector<std::string> m_endorseList;
-
};
} // namespace chronochat
diff --git a/src/endorse-collection.cpp b/src/endorse-collection.cpp
index c8dafe6..9b937a7 100644
--- a/src/endorse-collection.cpp
+++ b/src/endorse-collection.cpp
@@ -23,7 +23,7 @@
this->wireDecode(endorseWire);
}
-template<bool T>
+template<ndn::encoding::Tag T>
size_t
EndorseCollection::wireEncode(ndn::EncodingImpl<T>& block) const
{
diff --git a/src/endorse-collection.hpp b/src/endorse-collection.hpp
index 42a0979..dd16bc3 100644
--- a/src/endorse-collection.hpp
+++ b/src/endorse-collection.hpp
@@ -60,7 +60,7 @@
addCollectionEntry(const Name& certName, const std::string& hash);
private:
- template<bool T>
+ template<ndn::encoding::Tag T>
size_t
wireEncode(ndn::EncodingImpl<T>& block) const;
diff --git a/src/endorse-combobox-delegate.cpp b/src/endorse-combobox-delegate.cpp
index 1888baf..319135a 100644
--- a/src/endorse-combobox-delegate.cpp
+++ b/src/endorse-combobox-delegate.cpp
@@ -68,7 +68,7 @@
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
- QStyleOptionViewItemV4 myOption = option;
+ QStyleOptionViewItem myOption = option;
QString text = m_items[index.model()->data(index, Qt::EditRole).toUInt()].c_str();
myOption.text = text;
diff --git a/src/endorse-extension.cpp b/src/endorse-extension.cpp
index ac862ac..0c9f6c4 100644
--- a/src/endorse-extension.cpp
+++ b/src/endorse-extension.cpp
@@ -23,7 +23,7 @@
this->wireDecode(endorseWire);
}
-template<bool T>
+template<ndn::encoding::Tag T>
size_t
EndorseExtension::wireEncode(ndn::EncodingImpl<T>& block) const
{
diff --git a/src/endorse-extension.hpp b/src/endorse-extension.hpp
index 844c55c..c8bd11e 100644
--- a/src/endorse-extension.hpp
+++ b/src/endorse-extension.hpp
@@ -57,7 +57,7 @@
removeEntry(const std::string& entry);
private:
- template<bool T>
+ template<ndn::encoding::Tag T>
size_t
wireEncode(ndn::EncodingImpl<T>& block) const;
diff --git a/src/endorse-info.cpp b/src/endorse-info.cpp
index 985c304..1aa9385 100644
--- a/src/endorse-info.cpp
+++ b/src/endorse-info.cpp
@@ -24,7 +24,7 @@
this->wireDecode(endorseWire);
}
-template<bool T>
+template<ndn::encoding::Tag T>
size_t
EndorseInfo::wireEncode(ndn::EncodingImpl<T>& block) const
{
diff --git a/src/endorse-info.hpp b/src/endorse-info.hpp
index 921e711..a794c63 100644
--- a/src/endorse-info.hpp
+++ b/src/endorse-info.hpp
@@ -60,7 +60,7 @@
addEndorsement(const std::string& type, const std::string& value, const std::string& count);
private:
- template<bool T>
+ template<ndn::encoding::Tag T>
size_t
wireEncode(ndn::EncodingImpl<T>& block) const;
diff --git a/src/invitation.cpp b/src/invitation.cpp
index f311ad0..e7d2ac5 100644
--- a/src/invitation.cpp
+++ b/src/invitation.cpp
@@ -18,7 +18,7 @@
using std::string;
-using ndn::IdentityCertificate;
+using ndn::security::Certificate;
const size_t Invitation::NAME_SIZE_MIN = 7;
const ssize_t Invitation::SIGNATURE = -1;
@@ -51,7 +51,7 @@
Invitation::Invitation(const Name& inviteeNameSpace,
const string& chatroom,
const Name& inviterRoutingPrefix,
- const IdentityCertificate& inviterCertificate)
+ const Certificate& inviterCertificate)
: m_inviteeNameSpace(inviteeNameSpace)
, m_chatroom(chatroom)
, m_inviterRoutingPrefix(inviterRoutingPrefix)
diff --git a/src/invitation.hpp b/src/invitation.hpp
index f7967ed..c9d3731 100644
--- a/src/invitation.hpp
+++ b/src/invitation.hpp
@@ -14,7 +14,7 @@
#include "common.hpp"
-#include <ndn-cxx/security/identity-certificate.hpp>
+#include <ndn-cxx/security/certificate.hpp>
namespace chronochat {
@@ -58,7 +58,7 @@
Invitation(const Name& inviteeNameSpace,
const std::string& chatroom,
const Name& inviterRoutingPrefix,
- const ndn::IdentityCertificate& inviterCertificate);
+ const ndn::security::Certificate& inviterCertificate);
Invitation(const Invitation& invitation);
@@ -85,7 +85,7 @@
return m_inviterRoutingPrefix;
}
- const ndn::IdentityCertificate&
+ const ndn::security::Certificate&
getInviterCertificate() const
{
return m_inviterCertificate;
@@ -109,7 +109,7 @@
Name m_inviteeNameSpace;
std::string m_chatroom;
Name m_inviterRoutingPrefix;
- ndn::IdentityCertificate m_inviterCertificate;
+ ndn::security::Certificate m_inviterCertificate;
uint64_t m_timestamp;
};
diff --git a/src/main.cpp b/src/main.cpp
index 9674146..90f1d9d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -10,10 +10,9 @@
#include <QApplication>
#include <QTextCodec>
-// #include <QSystemTrayIcon>
#include "controller.hpp"
-#include "logging.h"
+#include <iostream>
#include <ndn-cxx/face.hpp>
#include <boost/thread/thread.hpp>
@@ -43,9 +42,6 @@
{
NewApp app(argc, argv);
- QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
- QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
-
chronochat::Controller controller;
app.setQuitOnLastWindowClosed(false);
diff --git a/src/nfd-connection-checker.cpp b/src/nfd-connection-checker.cpp
index 023c0b2..eda7197 100644
--- a/src/nfd-connection-checker.cpp
+++ b/src/nfd-connection-checker.cpp
@@ -42,6 +42,7 @@
[&] (const Interest& interest, const Data& data) {
m_face->shutdown();
},
+ NULL,
[] (const Interest& interest) {});
m_face->processEvents(time::milliseconds::zero(), true);
}
diff --git a/src/profile-editor.cpp b/src/profile-editor.cpp
index a55a12c..f0b067d 100644
--- a/src/profile-editor.cpp
+++ b/src/profile-editor.cpp
@@ -40,26 +40,31 @@
ProfileEditor::~ProfileEditor()
{
delete ui;
- delete m_tableModel;
+
+ if (m_tableModel)
+ delete m_tableModel;
}
void
ProfileEditor::onCloseDBModule()
{
- // _LOG_DEBUG("close db module");
if (m_tableModel) {
delete m_tableModel;
- // _LOG_DEBUG("tableModel closed");
+ m_tableModel = 0;
}
}
void
ProfileEditor::onIdentityUpdated(const QString& identity)
{
- m_tableModel = new QSqlTableModel();
-
m_identity = identity;
ui->identityInput->setText(identity);
+}
+
+void
+ProfileEditor::resetPanel()
+{
+ m_tableModel = new QSqlTableModel();
m_tableModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
m_tableModel->setTable("SelfProfile");
diff --git a/src/profile-editor.hpp b/src/profile-editor.hpp
index 5323f5c..a18f8fc 100644
--- a/src/profile-editor.hpp
+++ b/src/profile-editor.hpp
@@ -39,6 +39,9 @@
void
onIdentityUpdated(const QString& identity);
+ void
+ resetPanel();
+
private slots:
void
onAddClicked();
diff --git a/src/profile.cpp b/src/profile.cpp
index 38f7b63..dc89fa9 100644
--- a/src/profile.cpp
+++ b/src/profile.cpp
@@ -11,6 +11,7 @@
#include "profile.hpp"
#include "logging.h"
+#include <ndn-cxx/security/additional-description.hpp>
namespace chronochat {
@@ -18,8 +19,7 @@
using std::string;
using std::map;
-using ndn::IdentityCertificate;
-using ndn::CertificateSubjectDescription;
+using ndn::security::Certificate;
const std::string Profile::OID_NAME("2.5.4.41");
const std::string Profile::OID_ORG("2.5.4.11");
@@ -28,33 +28,34 @@
const std::string Profile::OID_ADVISOR("2.5.4.80");
const std::string Profile::OID_EMAIL("1.2.840.113549.1.9.1");
-Profile::Profile(const IdentityCertificate& identityCertificate)
+Profile::Profile(const Certificate& identityCertificate)
{
- Name keyName = IdentityCertificate::certificateNameToPublicKeyName(identityCertificate.getName());
+ Name keyName = identityCertificate.getKeyName();
- m_entries[string("IDENTITY")] = keyName.getPrefix(-1).toUri();
+ m_entries[string("IDENTITY")] = keyName.getPrefix(-2).toUri();
- const vector<CertificateSubjectDescription>& subList =
- identityCertificate.getSubjectDescriptionList();
+ auto additionalWire = identityCertificate.getSignatureInfo().getCustomTlv(tlv::AdditionalDescription);
+ if (additionalWire) {
+ ndn::security::AdditionalDescription additional(*additionalWire);
- for (vector<CertificateSubjectDescription>::const_iterator it = subList.begin();
- it != subList.end(); it++) {
- const string oidStr = it->getOidString();
- string valueStr = it->getValue();
- if (oidStr == OID_NAME)
- m_entries["name"] = valueStr;
- else if (oidStr == OID_ORG)
- m_entries["institution"] = valueStr;
- else if (oidStr == OID_GROUP)
- m_entries["group"] = valueStr;
- else if (oidStr == OID_HOMEPAGE)
- m_entries["homepage"] = valueStr;
- else if (oidStr == OID_ADVISOR)
- m_entries["advisor"] = valueStr;
- else if (oidStr == OID_EMAIL)
- m_entries["email"] = valueStr;
- else
- m_entries[oidStr] = valueStr;
+ for (auto it = additional.begin(); it != additional.end(); it++) {
+ const string oidStr = it->first;
+ string valueStr = it->second;
+ if (oidStr == OID_NAME)
+ m_entries["name"] = valueStr;
+ else if (oidStr == OID_ORG)
+ m_entries["institution"] = valueStr;
+ else if (oidStr == OID_GROUP)
+ m_entries["group"] = valueStr;
+ else if (oidStr == OID_HOMEPAGE)
+ m_entries["homepage"] = valueStr;
+ else if (oidStr == OID_ADVISOR)
+ m_entries["advisor"] = valueStr;
+ else if (oidStr == OID_EMAIL)
+ m_entries["email"] = valueStr;
+ else
+ m_entries[oidStr] = valueStr;
+ }
}
}
@@ -77,7 +78,12 @@
{
}
-template<bool T>
+Profile::Profile(const Block& profileWire)
+{
+ this->wireDecode(profileWire);
+}
+
+template<ndn::encoding::Tag T>
size_t
Profile::wireEncode(ndn::EncodingImpl<T>& block) const
{
diff --git a/src/profile.hpp b/src/profile.hpp
index a89a800..43dba96 100644
--- a/src/profile.hpp
+++ b/src/profile.hpp
@@ -18,7 +18,7 @@
#include <ndn-cxx/util/concepts.hpp>
#include <ndn-cxx/encoding/block.hpp>
#include <ndn-cxx/encoding/encoding-buffer.hpp>
-#include <ndn-cxx/security/identity-certificate.hpp>
+#include <ndn-cxx/security/certificate.hpp>
namespace chronochat {
@@ -44,7 +44,7 @@
{
}
- Profile(const ndn::IdentityCertificate& identityCertificate);
+ Profile(const ndn::security::Certificate& identityCertificate);
Profile(const Name& identityName);
@@ -54,6 +54,8 @@
Profile(const Profile& profile);
+ Profile(const Block& profileWire);
+
~Profile()
{
}
@@ -117,7 +119,7 @@
operator!=(const Profile& profile) const;
private:
- template<bool T>
+ template<ndn::encoding::Tag T>
size_t
wireEncode(ndn::EncodingImpl<T>& block) const;
diff --git a/src/tree-layout.cpp b/src/tree-layout.cpp
index 166019f..9bf3627 100644
--- a/src/tree-layout.cpp
+++ b/src/tree-layout.cpp
@@ -11,7 +11,6 @@
*/
#include "tree-layout.hpp"
-#include <iostream>
namespace chronochat {
diff --git a/src/trust-tree-scene.cpp b/src/trust-tree-scene.cpp
index 718b207..3a23718 100644
--- a/src/trust-tree-scene.cpp
+++ b/src/trust-tree-scene.cpp
@@ -11,6 +11,7 @@
#include "trust-tree-scene.hpp"
#include <QtGui>
+#include <QGraphicsTextItem>
#ifndef Q_MOC_RUN
#include <assert.h>
@@ -21,7 +22,7 @@
static const double Pi = 3.14159265358979323846264338327950288419717;
-TrustTreeScene::TrustTreeScene(QWidget* parent)
+TrustTreeScene::TrustTreeScene(QObject* parent)
: QGraphicsScene(parent)
{
}
diff --git a/src/trust-tree-scene.hpp b/src/trust-tree-scene.hpp
index c8c21c6..0412914 100644
--- a/src/trust-tree-scene.hpp
+++ b/src/trust-tree-scene.hpp
@@ -11,7 +11,7 @@
#ifndef CHRONOCHAT_TRUST_TREE_SCENE_HPP
#define CHRONOCHAT_TRUST_TREE_SCENE_HPP
-#include <QtGui/QGraphicsScene>
+#include <QGraphicsScene>
#include <QColor>
#include <QMap>
@@ -29,7 +29,7 @@
Q_OBJECT
public:
- TrustTreeScene(QWidget* parent = 0);
+ TrustTreeScene(QObject* parent = 0);
void
plotTrustTree(chronochat::TrustTreeNodeList& nodeList);
diff --git a/src/validator-invitation.cpp b/src/validator-invitation.cpp
deleted file mode 100644
index 20d7116..0000000
--- a/src/validator-invitation.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- * Yingdi Yu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#include "validator-invitation.hpp"
-#include "invitation.hpp"
-
-#include "logging.h"
-
-namespace chronochat {
-
-using std::vector;
-
-using ndn::CertificateCache;
-using ndn::SecRuleRelative;
-using ndn::OnDataValidated;
-using ndn::OnDataValidationFailed;
-using ndn::OnInterestValidated;
-using ndn::OnInterestValidationFailed;
-using ndn::ValidationRequest;
-using ndn::IdentityCertificate;
-
-const shared_ptr<CertificateCache> ValidatorInvitation::DefaultCertificateCache =
- shared_ptr<CertificateCache>();
-
-ValidatorInvitation::ValidatorInvitation()
- : Validator()
- , m_invitationReplyRule("^([^<CHRONOCHAT-INVITATION>]*)<CHRONOCHAT-INVITATION>",
- "^([^<KEY>]*)<KEY>(<>*)[<dsk-.*><ksk-.*>]<ID-CERT>$",
- "==", "\\1", "\\1\\2", true)
- , m_invitationInterestRule("^[^<CHRONOCHAT-INVITATION>]*<CHRONOCHAT-INVITATION><>{6}$")
- , m_innerKeyRegex("^([^<KEY>]*)<KEY>(<>*)[<dsk-.*><ksk-.*>]<ID-CERT><>$", "\\1\\2")
-{
-}
-
-void
-ValidatorInvitation::addTrustAnchor(const Name& keyName, const ndn::PublicKey& key)
-{
- m_trustAnchors[keyName] = key;
-}
-
-void
-ValidatorInvitation::removeTrustAnchor(const Name& keyName)
-{
- m_trustAnchors.erase(keyName);
-}
-
-void
-ValidatorInvitation::cleanTrustAnchor()
-{
- m_trustAnchors.clear();
-}
-
-void
-ValidatorInvitation::checkPolicy (const Data& data,
- int stepCount,
- const OnDataValidated& onValidated,
- const OnDataValidationFailed& onValidationFailed,
- vector<shared_ptr<ValidationRequest> >& nextSteps)
-{
- const Signature& signature = data.getSignature();
-
- if (signature.getKeyLocator().getType() != KeyLocator::KeyLocator_Name)
- return onValidationFailed(data.shared_from_this(),
- "Key Locator is not a name: " + data.getName().toUri());
-
- const Name & keyLocatorName = signature.getKeyLocator().getName();
-
- if (!m_invitationReplyRule.satisfy(data.getName(), keyLocatorName))
- return onValidationFailed(data.shared_from_this(),
- "Does not comply with the invitation rule: " +
- data.getName().toUri() + " signed by: " +
- keyLocatorName.toUri());
-
- Data innerData;
- innerData.wireDecode(data.getContent().blockFromValue());
-
- return internalCheck(data.wireEncode().value(),
- data.wireEncode().value_size() - data.getSignature().getValue().size(),
- signature,
- keyLocatorName,
- innerData,
- bind(onValidated, data.shared_from_this()),
- bind(onValidationFailed, data.shared_from_this(), _1));
-}
-
-void
-ValidatorInvitation::checkPolicy (const Interest& interest,
- int stepCount,
- const OnInterestValidated& onValidated,
- const OnInterestValidationFailed& onValidationFailed,
- vector<shared_ptr<ValidationRequest> >& nextSteps)
-{
- const Name& interestName = interest.getName();
-
- if (!m_invitationInterestRule.match(interestName))
- return onValidationFailed(interest.shared_from_this(),
- "Invalid interest name: " + interest.getName().toUri());
-
- Name signedName = interestName.getPrefix(-1);
- ndn::Buffer signedBlob = ndn::Buffer(signedName.wireEncode().value(),
- signedName.wireEncode().value_size());
-
- Block signatureBlock = interestName.get(Invitation::SIGNATURE).blockFromValue();
- Block signatureInfo = interestName.get(Invitation::KEY_LOCATOR).blockFromValue();
- Signature signature(signatureInfo, signatureBlock);
-
- if (signature.getKeyLocator().getType() != KeyLocator::KeyLocator_Name)
- return onValidationFailed(interest.shared_from_this(),
- "KeyLocator is not a name: " + interest.getName().toUri());
-
- const Name & keyLocatorName = signature.getKeyLocator().getName();
-
- Data innerData;
- innerData.wireDecode(interestName.get(Invitation::INVITER_CERT).blockFromValue());
-
- return internalCheck(signedBlob.buf(), signedBlob.size(),
- signature,
- keyLocatorName,
- innerData,
- bind(onValidated, interest.shared_from_this()),
- bind(onValidationFailed, interest.shared_from_this(), _1));
-}
-
-void
-ValidatorInvitation::internalCheck(const uint8_t* buf, size_t size,
- const Signature& signature,
- const Name& keyLocatorName,
- const Data& innerData,
- const OnValidated& onValidated,
- const OnValidationFailed& onValidationFailed)
-{
- Name signingKeyName = IdentityCertificate::certificateNameToPublicKeyName(keyLocatorName);
-
- TrustAnchors::const_iterator keyIt = m_trustAnchors.find(signingKeyName);
- if (keyIt == m_trustAnchors.end())
- return onValidationFailed("Cannot reach any trust anchor");
-
- if (!Validator::verifySignature(buf, size, signature, keyIt->second))
- return onValidationFailed("Cannot verify outer signature");
-
- // Temporarily disabled, we should get it back when we create a specific key for the chatroom.
- // if(!Validator::verifySignature(innerData, m_trustAnchors[signingKeyName]))
- // return onValidationFailed("Cannot verify inner signature");
-
- if (!m_innerKeyRegex.match(innerData.getName()) ||
- m_innerKeyRegex.expand() != signingKeyName.getPrefix(-1))
- return onValidationFailed("Inner certificate does not comply with the rule");
-
- return onValidated();
-}
-
-} // namespace chronochat
diff --git a/src/validator-invitation.hpp b/src/validator-invitation.hpp
deleted file mode 100644
index 03890a0..0000000
--- a/src/validator-invitation.hpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- * Yingdi Yu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#ifndef CHRONOCHAT_VALIDATOR_INVITATION_HPP
-#define CHRONOCHAT_VALIDATOR_INVITATION_HPP
-
-#include "common.hpp"
-
-#include <ndn-cxx/security/validator.hpp>
-#include <ndn-cxx/security/certificate-cache.hpp>
-#include <ndn-cxx/security/sec-rule-relative.hpp>
-
-#include "endorse-certificate.hpp"
-
-namespace chronochat {
-
-class ValidatorInvitation : public ndn::Validator
-{
- typedef function<void(const std::string&)> OnValidationFailed;
- typedef function<void()> OnValidated;
-
-public:
- class Error : public ndn::Validator::Error
- {
- public:
- Error(const std::string& what)
- : ndn::Validator::Error(what)
- {
- }
- };
-
- static const shared_ptr<ndn::CertificateCache> DefaultCertificateCache;
-
- ValidatorInvitation();
-
- virtual
- ~ValidatorInvitation()
- {
- }
-
- void
- addTrustAnchor(const Name& keyName, const ndn::PublicKey& key);
-
- void
- removeTrustAnchor(const Name& keyName);
-
- void
- cleanTrustAnchor();
-
-protected:
- void
- checkPolicy(const Data& data,
- int stepCount,
- const ndn::OnDataValidated& onValidated,
- const ndn::OnDataValidationFailed& onValidationFailed,
- std::vector<shared_ptr<ndn::ValidationRequest> >& nextSteps);
-
- void
- checkPolicy(const Interest& interest,
- int stepCount,
- const ndn::OnInterestValidated& onValidated,
- const ndn::OnInterestValidationFailed& onValidationFailed,
- std::vector<shared_ptr<ndn::ValidationRequest> >& nextSteps);
-
-private:
- void
- internalCheck(const uint8_t* buf, size_t size,
- const Signature& sig,
- const Name& keyLocatorName,
- const Data& innerData,
- const OnValidated& onValidated,
- const OnValidationFailed& onValidationFailed);
-
-private:
- typedef std::map<Name, ndn::PublicKey> TrustAnchors;
-
- ndn::SecRuleRelative m_invitationReplyRule;
- ndn::Regex m_invitationInterestRule;
- ndn::Regex m_innerKeyRegex;
- TrustAnchors m_trustAnchors;
-};
-
-} // namespace chronochat
-
-#endif // CHRONOCHAT_VALIDATOR_INVITATION_HPP
diff --git a/src/validator-panel.cpp b/src/validator-panel.cpp
deleted file mode 100644
index c3c429d..0000000
--- a/src/validator-panel.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- * Yingdi Yu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#include "validator-panel.hpp"
-
-#include "logging.h"
-
-namespace chronochat {
-
-using std::vector;
-
-using ndn::CertificateCache;
-using ndn::SecRuleRelative;
-using ndn::OnDataValidated;
-using ndn::OnDataValidationFailed;
-using ndn::ValidationRequest;
-using ndn::IdentityCertificate;
-
-const shared_ptr<CertificateCache> ValidatorPanel::DEFAULT_CERT_CACHE =
- shared_ptr<CertificateCache>();
-
-ValidatorPanel::ValidatorPanel(int stepLimit,
- const shared_ptr<CertificateCache> certificateCache)
- : m_stepLimit(stepLimit)
- , m_certificateCache(certificateCache)
-{
- m_endorseeRule = make_shared<SecRuleRelative>("^([^<DNS>]*)<DNS><>*<ENDORSEE><>$",
- "^([^<KEY>]*)<KEY>(<>*)<ksk-.*><ID-CERT>$",
- "==", "\\1", "\\1\\2", true);
-}
-
-void
-ValidatorPanel::addTrustAnchor(const EndorseCertificate& cert)
-{
- m_trustAnchors[cert.getPublicKeyName()] = cert.getPublicKeyInfo();
-}
-
-void
-ValidatorPanel::removeTrustAnchor(const Name& keyName)
-{
- m_trustAnchors.erase(keyName);
-}
-
-void
-ValidatorPanel::checkPolicy (const Data& data,
- int stepCount,
- const OnDataValidated& onValidated,
- const OnDataValidationFailed& onValidationFailed,
- vector<shared_ptr<ValidationRequest> >& nextSteps)
-{
- if (m_stepLimit == stepCount) {
- onValidationFailed(data.shared_from_this(),
- "Reach maximum validation steps: " + data.getName().toUri());
- return;
- }
-
- const KeyLocator& keyLocator = data.getSignature().getKeyLocator();
-
- if (keyLocator.getType() != KeyLocator::KeyLocator_Name)
- return onValidationFailed(data.shared_from_this(),
- "Key Locator is not a name: " + data.getName().toUri());
-
- const Name& keyLocatorName = keyLocator.getName();
-
- if (m_endorseeRule->satisfy(data.getName(), keyLocatorName)) {
- Name keyName = IdentityCertificate::certificateNameToPublicKeyName(keyLocatorName);
-
- if (m_trustAnchors.end() != m_trustAnchors.find(keyName) &&
- Validator::verifySignature(data, data.getSignature(), m_trustAnchors[keyName]))
- onValidated(data.shared_from_this());
- else
- onValidationFailed(data.shared_from_this(),
- "Cannot verify signature:" + data.getName().toUri());
- }
- else
- onValidationFailed(data.shared_from_this(),
- "Does not satisfy rule: " + data.getName().toUri());
-
- return;
-}
-
-} // namespace chronochat
diff --git a/src/validator-panel.hpp b/src/validator-panel.hpp
deleted file mode 100644
index ab42fe1..0000000
--- a/src/validator-panel.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- * Yingdi Yu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#ifndef CHRONOCHAT_VALIDATOR_PANEL_HPP
-#define CHRONOCHAT_VALIDATOR_PANEL_HPP
-
-#include "common.hpp"
-
-#include <ndn-cxx/security/validator.hpp>
-#include <ndn-cxx/security/sec-rule-relative.hpp>
-#include <ndn-cxx/security/certificate-cache.hpp>
-
-#include "endorse-certificate.hpp"
-
-namespace chronochat {
-
-class ValidatorPanel : public ndn::Validator
-{
-public:
-
- static const shared_ptr<ndn::CertificateCache> DEFAULT_CERT_CACHE;
-
- ValidatorPanel(int stepLimit = 10,
- const shared_ptr<ndn::CertificateCache> cache = DEFAULT_CERT_CACHE);
-
- ~ValidatorPanel()
- {
- }
-
- void
- addTrustAnchor(const EndorseCertificate& selfEndorseCertificate);
-
- void
- removeTrustAnchor(const Name& keyName);
-
-protected:
- virtual void
- checkPolicy(const Data& data,
- int stepCount,
- const ndn::OnDataValidated& onValidated,
- const ndn::OnDataValidationFailed& onValidationFailed,
- std::vector<shared_ptr<ndn::ValidationRequest> >& nextSteps);
-
- virtual void
- checkPolicy(const Interest& interest,
- int stepCount,
- const ndn::OnInterestValidated& onValidated,
- const ndn::OnInterestValidationFailed& onValidationFailed,
- std::vector<shared_ptr<ndn::ValidationRequest> >& nextSteps)
- {
- onValidationFailed(interest.shared_from_this(),
- "No rules for interest.");
- }
-
-private:
- int m_stepLimit;
- shared_ptr<ndn::CertificateCache> m_certificateCache;
- shared_ptr<ndn::SecRuleRelative> m_endorseeRule;
- std::map<Name, ndn::PublicKey> m_trustAnchors;
-};
-
-} // namespace chronochat
-
-#endif // CHRONOCHAT_VALIDATOR_PANEL_HPP
diff --git a/test/cert/endorse.cert b/test/cert/endorse.cert
new file mode 100644
index 0000000..0f5396a
--- /dev/null
+++ b/test/cert/endorse.cert
@@ -0,0 +1,15 @@
+Bv0CpQc5CBdFbmRvcnNlQ2VydGlmaWNhdGVUZXN0cwgDS0VZCAg2x+MG7IxCPQgE
+c2VsZggJ/QAAAXXVNWGzFAkYAQIZBAA27oAV/QEmMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv3BM/bpWTmcKTeOzykiFm/GWYnhJgTQxQlRp4mQHsEmH
+SFmrCtx2g0mwoPUPwjBhXuH0J4PSIuudb8VLiPGD03/gFUeGtY9VRrH5dZuIOpHT
+tklBz8rA3DsCf0rMggU6IrYd6Vjlk+hseoAlKvVVgmGT+NXdmtO+Xhxt16S2jPUs
++ZxKc+gBGKEHKKZkEDlRWzWrj+hBKasOic3v7Lc22M4tvjANxyMApZ/rXKdIi1rN
+Da0u4dk6lL/qW5fIEQEjsf4dngZkHaHkpK6wEnXyTQIX71/cmMB42xggfZ7YAvfO
+smuc0mg3fuuwTMo5fKxHCES14i6y7TMhqlxkgdb66QIDAQABFv0BDxsBAP0BAqP9
+AgBc/QIBCDIuNS40LjQx/QICTC9FbmRvcnNlQ2VydGlmaWNhdGVUZXN0cy9LRVkv
+NiVDNyVFMyUwNiVFQyU4Q0IlM0Qvc2VsZi8lRkQlMDAlMDAlMDF1JUQ1NWElQjP9
+AgA//QIBBnNpZ25lcv0CAjEvRW5kb3JzZUNlcnRpZmljYXRlVGVzdHMvS0VZLzYl
+QzclRTMlMDYlRUMlOENCJTNEiCaJJIoISURFTlRJVFmLGC9FbmRvcnNlQ2VydGlm
+aWNhdGVUZXN0c4wRiwVlbWFpbIsIaG9tZXBhZ2X9AP0m/QD+DzE5NzAwMTAxVDAw
+MDAwMP0A/w8yMDQwMTExMlQwNzU3MjYXIOzz9eftz8S3vFHaq8yVJalZzs7SPtvo
+7Xu8QhXQq17e
\ No newline at end of file
diff --git a/test/cert/testid.cert b/test/cert/testid.cert
new file mode 100644
index 0000000..849ab19
--- /dev/null
+++ b/test/cert/testid.cert
@@ -0,0 +1,16 @@
+Bv0Czwc5CBdFbmRvcnNlQ2VydGlmaWNhdGVUZXN0cwgDS0VZCAg2x+MG7IxCPQgE
+c2VsZggJ/QAAAXXVNWGzFAkYAQIZBAA27oAV/QEmMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv3BM/bpWTmcKTeOzykiFm/GWYnhJgTQxQlRp4mQHsEmH
+SFmrCtx2g0mwoPUPwjBhXuH0J4PSIuudb8VLiPGD03/gFUeGtY9VRrH5dZuIOpHT
+tklBz8rA3DsCf0rMggU6IrYd6Vjlk+hseoAlKvVVgmGT+NXdmtO+Xhxt16S2jPUs
++ZxKc+gBGKEHKKZkEDlRWzWrj+hBKasOic3v7Lc22M4tvjANxyMApZ/rXKdIi1rN
+Da0u4dk6lL/qW5fIEQEjsf4dngZkHaHkpK6wEnXyTQIX71/cmMB42xggfZ7YAvfO
+smuc0mg3fuuwTMo5fKxHCES14i6y7TMhqlxkgdb66QIDAQABFlkbAQEcKgcoCBdF
+bmRvcnNlQ2VydGlmaWNhdGVUZXN0cwgDS0VZCAg2x+MG7IxCPf0A/Sb9AP4PMTk3
+MDAxMDFUMDAwMDAw/QD/DzIwNDAxMTEyVDA3NTcyNhf9AQA0C8yYGgrruSJe1n5q
+oTSdmomnRdZgdczblgL5jY9dP9OAUJL6vy5bHwnjFU484T6vKANETL/BZfnkI/h9
+39gMjXiqaQ4zStuSNBVO/41IyOzDbg2KyQk41mB1M1r7pvzIziNM//ammYBzaQN/
+ixlKPrReUIypEswYnCXaw4VZPLkReR8yjVqLW2B6X8a1zfDWMOyv39Gayhpfcvbo
+2juJZ75JTk6KL8lEO8KO84M2ym/VABDZUHbXnMPYmqU4aMRRLfytzeZlLOdRzLpb
+FrE4AHwudakhruPB39NluYu2IHhyIB0x1u4xxyzGfgoIRIPXnW4zoulFn9RFgg9A
+6lNM
\ No newline at end of file
diff --git a/test/cert/testid.key b/test/cert/testid.key
new file mode 100644
index 0000000..0be9558
--- /dev/null
+++ b/test/cert/testid.key
@@ -0,0 +1,7 @@
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv3BM/bpWTmcKTeOzykiF
+m/GWYnhJgTQxQlRp4mQHsEmHSFmrCtx2g0mwoPUPwjBhXuH0J4PSIuudb8VLiPGD
+03/gFUeGtY9VRrH5dZuIOpHTtklBz8rA3DsCf0rMggU6IrYd6Vjlk+hseoAlKvVV
+gmGT+NXdmtO+Xhxt16S2jPUs+ZxKc+gBGKEHKKZkEDlRWzWrj+hBKasOic3v7Lc2
+2M4tvjANxyMApZ/rXKdIi1rNDa0u4dk6lL/qW5fIEQEjsf4dngZkHaHkpK6wEnXy
+TQIX71/cmMB42xggfZ7YAvfOsmuc0mg3fuuwTMo5fKxHCES14i6y7TMhqlxkgdb6
+6QIDAQAB
\ No newline at end of file
diff --git a/test/endorse-certificate.t.cpp b/test/endorse-certificate.t.cpp
index 5fa5c79..baa2ecf 100644
--- a/test/endorse-certificate.t.cpp
+++ b/test/endorse-certificate.t.cpp
@@ -30,122 +30,37 @@
using std::string;
using ndn::KeyChain;
-using ndn::IdentityCertificate;
+using ndn::security::Certificate;
BOOST_AUTO_TEST_SUITE(TestEndorseCertificate)
-const string testIdCert("\
-Bv0DXwdRCBdFbmRvcnNlQ2VydGlmaWNhdGVUZXN0cwgDS0VZCAxFbmNvZGVEZWNv\
-ZGUIEWtzay0xMzk0MDcyMTQ3MzM1CAdJRC1DRVJUCAf9AUSVLNXoFAMYAQIV/QG8\
-MIIBuDAiGA8yMDE0MDMwNjAyMTU0N1oYDzIwMTQwMzEzMDkyNzQ3WjBuMA0GA1UE\
-KRMGTXlOYW1lMBIGA1UECxMLTXlJbnN0aXR1dGUwDgYDVQQBEwdNeUdyb3VwMBEG\
-A1UEAxMKTXlIb21lUGFnZTAQBgNVBFATCU15QWR2aXNvcjAUBgkqhkiG9w0BCQET\
-B015RW1haWwwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQDYsWD0ixQF\
-RfYs36BHNsRNv5ouEL69oaS6XX/hsQN1By4RNI6eSG5DpajtAwK1y+DXPwkLHd5S\
-BrvwLzReF7SsrF2ObawznU14GKaQdbn+eVIER7CWvSpJhH5yKS4fCPRN+b1MP8QS\
-DLvaaGu15T98cgVscIEqFkLfnWSQbdN6EnodjOH27JkBCz8Lxv9GZLrhfKGzOylR\
-fLzvCIyIXYl6HWroO+xTJQaP+miSZNVGyf4jYqz5WbQH56a9ZjUldTphjuDbBjUq\
-QaNVOzoKT+H4qh8mn399aQ9/BjM+6/WgrSw7/MO2UCgoZhySQY4HVqzUVVWnYwOU\
-NYPoOS3HdvGLAgERFkEbAQEcPAc6CBdFbmRvcnNlQ2VydGlmaWNhdGVUZXN0cwgD\
-S0VZCBFrc2stMTM5NDA3MjE0NzEyOAgHSUQtQ0VSVBf9AQARSwS/CelRRSUO4Tik\
-5Q+L5zusaqq5652T92/83S5l38dO41BOf5fBUb3RtnFSbS/QaBCRfRJtDvkN2LhE\
-vksJjSAoAKUzx27UyM1eq7L8DDvsvC9mbwxGzTK2F1t3Jy81rk5X34MecvztlILs\
-nLqzqqiwl3dS1xyvg9GZez5g1yoOtRwzkHaah6svLVwzwM7kECXWRf4NoHTazWQo\
-Cs6s60F9I/xBRKJ4Cw2L/AzvB5sX1J4HvHCsplbR/GdvA8uW6i8pp7kjIhjCGewK\
-uNfH/4lHxzTl3pjsVy+EHKmwSlZ+T8cy5qaIEHxhbOzMNNVdit7XEwexOE66AVza\
-92On");
-
-const string testKey("\
-MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEA2LFg9IsUBUX2LN+gRzbE\
-Tb+aLhC+vaGkul1/4bEDdQcuETSOnkhuQ6Wo7QMCtcvg1z8JCx3eUga78C80Xhe0\
-rKxdjm2sM51NeBimkHW5/nlSBEewlr0qSYR+cikuHwj0Tfm9TD/EEgy72mhrteU/\
-fHIFbHCBKhZC351kkG3TehJ6HYzh9uyZAQs/C8b/RmS64XyhszspUXy87wiMiF2J\
-eh1q6DvsUyUGj/pokmTVRsn+I2Ks+Vm0B+emvWY1JXU6YY7g2wY1KkGjVTs6Ck/h\
-+KofJp9/fWkPfwYzPuv1oK0sO/zDtlAoKGYckkGOB1as1FVVp2MDlDWD6Dktx3bx\
-iwIBEQ==");
-
-const string testEndorseCert("\
-Bv0CYweICBdFbmRvcnNlQ2VydGlmaWNhdGVUZXN0cwgMRW5jb2RlRGVjb2RlCBFr\
-c2stMTM5NDA3MjE0NzMzNQgMUFJPRklMRS1DRVJUCDMHMQgXRW5kb3JzZUNlcnRp\
-ZmljYXRlVGVzdHMIBlNpbmdlcggOa3NrLTEyMzQ1Njc4OTAICf0AAAFMoXR8NRQD\
-GAECFf0BqTCCAaUwIhgPMjAxMzEyMjYyMzIyNTRaGA8yMDEzMTIyNjIzMjI1NFow\
-QDA+BgNVBCkTNy9FbmRvcnNlQ2VydGlmaWNhdGVUZXN0cy9FbmNvZGVEZWNvZGUv\
-a3NrLTEzOTQwNzIxNDczMzUwgZ0wDQYJKoZIhvcNAQEBBQADgYsAMIGHAoGBAJ4G\
-PkeFsjQ3qoVHrAMkg7WcqAU6JB7riQG76ZuywyKsaOPwbALOaKbE0KcGkJyqGwgd\
-i0OaM2dEbSGjG4ial15ZxBUL2Sy9UQdhgq3BuNe/m899JMJj85cX6/5iJbpbTYrC\
-er1Dio+48vHFajDTUIzImt/v7TXnemLqdny7CCbHAgERMIGcMGsGBysGAQUgAgEB\
-Af8EXYhbiTGKCElERU5USVRZiyUvRW5kb3JzZUNlcnRpZmljYXRlVGVzdHMvRW5j\
-b2RlRGVjb2RliRaKCGhvbWVwYWdliwpNeUhvbWVQYWdliQ6KBG5hbWWLBk15TmFt\
-ZTAtBgcrBgEFIAICAQH/BB+MHYsLaW5zdGl0dXRpb26LBWdyb3VwiwdhZHZpc29y\
-FgMbAQAXIHalD2NUzM7abX6QY+2qWNLVMC+ch2xnVyrlf89ZH/IV");
+std::string
+getTestFile(std::string path) {
+ std::ifstream t(path);
+ std::stringstream buffer;
+ buffer << t.rdbuf();
+ return buffer.str();
+}
BOOST_AUTO_TEST_CASE(IdCert)
{
+ const std::string testIdCert = getTestFile("test/cert/testid.cert");
boost::iostreams::stream<boost::iostreams::array_source> is(testIdCert.c_str(),
testIdCert.size());
- shared_ptr<IdentityCertificate> idCert = ndn::io::load<IdentityCertificate>(is);
+ std::shared_ptr<Certificate> idCert = ndn::io::load<Certificate>(is);
BOOST_CHECK(static_cast<bool>(idCert));
- const ndn::Certificate::SubjectDescriptionList& subjectDescription =
- idCert->getSubjectDescriptionList();
- BOOST_CHECK_EQUAL(subjectDescription.size(), 6);
-
- ndn::Certificate::SubjectDescriptionList::const_iterator it = subjectDescription.begin();
- ndn::Certificate::SubjectDescriptionList::const_iterator end = subjectDescription.end();
- int count = 0;
- for(; it != end; it++)
- {
- if(it->getOidString() == "2.5.4.41")
- {
- BOOST_CHECK_EQUAL(it->getValue(), "MyName");
- count++;
- }
- if(it->getOidString() == "2.5.4.11")
- {
- BOOST_CHECK_EQUAL(it->getValue(), "MyInstitute");
- count++;
- }
- if(it->getOidString() == "2.5.4.1")
- {
- BOOST_CHECK_EQUAL(it->getValue(), "MyGroup");
- count++;
- }
- if(it->getOidString() == "2.5.4.3")
- {
- BOOST_CHECK_EQUAL(it->getValue(), "MyHomePage");
- count++;
- }
- if(it->getOidString() == "2.5.4.80")
- {
- BOOST_CHECK_EQUAL(it->getValue(), "MyAdvisor");
- count++;
- }
- if(it->getOidString() == "1.2.840.113549.1.9.1")
- {
- BOOST_CHECK_EQUAL(it->getValue(), "MyEmail");
- count++;
- }
- }
- BOOST_CHECK_EQUAL(count, 6);
-
BOOST_CHECK_EQUAL(idCert->getName().toUri(),
- "/EndorseCertificateTests/KEY/EncodeDecode/ksk-1394072147335/ID-CERT/%FD%01D%95%2C%D5%E8");
-
- ndn::OBufferStream keyOs;
- {
- using namespace CryptoPP;
- StringSource(testKey, true, new Base64Decoder(new FileSink(keyOs)));
- }
- ndn::PublicKey key(keyOs.buf()->buf(), keyOs.buf()->size());
- BOOST_CHECK(key == idCert->getPublicKeyInfo());
+ "/EndorseCertificateTests/KEY/6%C7%E3%06%EC%8CB%3D/self/%FD%00%00%01u%D55a%B3");
}
BOOST_AUTO_TEST_CASE(ConstructFromIdCert)
{
+ const std::string testIdCert = getTestFile("test/cert/testid.cert");
boost::iostreams::stream<boost::iostreams::array_source> is(testIdCert.c_str(),
testIdCert.size());
- shared_ptr<IdentityCertificate> idCert = ndn::io::load<IdentityCertificate>(is);
+ std::shared_ptr<Certificate> idCert = ndn::io::load<Certificate>(is);
Profile profile(*idCert);
vector<string> endorseList;
@@ -153,32 +68,37 @@
endorseList.push_back("homepage");
EndorseCertificate endorseCertificate(*idCert, profile, endorseList);
- boost::filesystem::path keyChainTmpPath =
- boost::filesystem::path(TEST_CERT_PATH) / "TestEndorseCertificate";
- KeyChain keyChain(std::string("sqlite3:").append(keyChainTmpPath.string()),
- std::string("tpm-file:").append(keyChainTmpPath.string()));
+ KeyChain keyChain("pib-memory:", "tpm-memory:");
- keyChain.signWithSha256(endorseCertificate);
+ auto signOpts = ndn::security::SigningInfo(ndn::security::SigningInfo::SignerType::SIGNER_TYPE_SHA256);
+ keyChain.sign(endorseCertificate, signOpts.setSignatureInfo(endorseCertificate.getSignatureInfo()));
const Block& endorseDataBlock = endorseCertificate.wireEncode();
Data decodedEndorseData;
decodedEndorseData.wireDecode(endorseDataBlock);
EndorseCertificate decodedEndorse(decodedEndorseData);
BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("IDENTITY"),
- "/EndorseCertificateTests/EncodeDecode");
- BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("name"), "MyName");
- BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("homepage"), "MyHomePage");
+ "/EndorseCertificateTests");
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().size(), 2);
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().at(0), "email");
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().at(1), "homepage");
BOOST_CHECK_EQUAL(decodedEndorse.getSigner(),
- "/EndorseCertificateTests/EncodeDecode/ksk-1394072147335");
- BOOST_CHECK_EQUAL(decodedEndorse.getPublicKeyName(),
- "/EndorseCertificateTests/EncodeDecode/ksk-1394072147335");
+ "/EndorseCertificateTests/KEY/6%C7%E3%06%EC%8CB%3D");
+ BOOST_CHECK_EQUAL(decodedEndorse.getKeyName(),
+ "/EndorseCertificateTests/PROFILE-CERT/KEY/6%C7%E3%06%EC%8CB%3D");
+
+ const std::string testIdKey = getTestFile("test/cert/testid.key");
+ ndn::OBufferStream keyOs;
+ {
+ using namespace CryptoPP;
+ StringSource(testIdKey, true, new Base64Decoder(new FileSink(keyOs)));
+ }
+ BOOST_CHECK(idCert->getPublicKey() == *keyOs.buf());
}
BOOST_AUTO_TEST_CASE(ConstructFromEndorseCert)
{
+ const std::string testEndorseCert = getTestFile("test/cert/endorse.cert");
boost::iostreams::stream<boost::iostreams::array_source> is(testEndorseCert.c_str(),
testEndorseCert.size());
shared_ptr<Data> rawData = ndn::io::load<Data>(is);
@@ -191,12 +111,10 @@
Name signer("/EndorseCertificateTests/Singer/ksk-1234567890");
EndorseCertificate endorseCertificate(rawEndorse, signer, endorseList);
- boost::filesystem::path keyChainTmpPath =
- boost::filesystem::path(TEST_CERT_PATH) / "TestEndorseCertificate";
- KeyChain keyChain(std::string("sqlite3:").append(keyChainTmpPath.string()),
- std::string("tpm-file:").append(keyChainTmpPath.string()));
+ KeyChain keyChain("pib-memory:", "tpm-memory:");
- keyChain.signWithSha256(endorseCertificate);
+ auto signOpts = ndn::security::SigningInfo(ndn::security::SigningInfo::SignerType::SIGNER_TYPE_SHA256);
+ keyChain.sign(endorseCertificate, signOpts.setSignatureInfo(endorseCertificate.getSignatureInfo()));
const Block& endorseDataBlock = endorseCertificate.wireEncode();
@@ -204,17 +122,15 @@
decodedEndorseData.wireDecode(endorseDataBlock);
EndorseCertificate decodedEndorse(decodedEndorseData);
BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("IDENTITY"),
- "/EndorseCertificateTests/EncodeDecode");
- BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("name"), "MyName");
- BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("homepage"), "MyHomePage");
+ "/EndorseCertificateTests");
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().size(), 3);
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().at(0), "institution");
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().at(1), "group");
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().at(2), "advisor");
BOOST_CHECK_EQUAL(decodedEndorse.getSigner(),
"/EndorseCertificateTests/Singer/ksk-1234567890");
- BOOST_CHECK_EQUAL(decodedEndorse.getPublicKeyName(),
- "/EndorseCertificateTests/EncodeDecode/ksk-1394072147335");
+ BOOST_CHECK_EQUAL(decodedEndorse.getKeyName(),
+ "/EndorseCertificateTests/KEY/6%C7%E3%06%EC%8CB%3D");
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/waf b/waf
index ef9df38..a1c5c96 100755
--- a/waf
+++ b/waf
@@ -1,7 +1,7 @@
-#!/usr/bin/env python
-# encoding: ISO8859-1
-# Thomas Nagy, 2005-2014
-
+#!/usr/bin/env python3
+# encoding: latin-1
+# Thomas Nagy, 2005-2018
+#
"""
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -32,12 +32,13 @@
import os, sys, inspect
-VERSION="1.8.2"
-REVISION="a01aa13963437a19e5d8748cf2afd71b"
+VERSION="2.0.19"
+REVISION="1f3c580272b15a03d2566843c5fe872a"
+GIT="61ee22b598cf80e260beb64e475966f58b304d0d"
INSTALL=''
-C1='#/'
+C1='#6'
C2='#.'
-C3='#)'
+C3='#%'
cwd = os.getcwd()
join = os.path.join
@@ -139,6 +140,9 @@
if name.endswith('waf-light'):
w = test(base)
if w: return w
+ for dir in sys.path:
+ if test(dir):
+ return dir
err('waf-light requires waflib -> export WAFDIR=/folder')
dirname = '%s-%s-%s' % (WAF, VERSION, REVISION)
@@ -164,5 +168,6 @@
Scripting.waf_entry_point(cwd, VERSION, wafdir)
#==>
-#BZh91AY&SYÉLt"ïÿÿÿ¼@ÿÿÿÿÿÿÿÿÿÿÿ¢¦x#)!2Xaé\÷x¬#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)/ºúÕ=[Ý{{Òá¯Z»må˳]9yo3ÏZÝ»½õ÷SÒû5Km»¶÷×£ß4àÖLÕsª_^/^Ü&.ëm}+Üe#):z{·¡íªì÷ºìUg:vÚi>{××ÍÞçÁï>jWlúûí÷Æ»·}Ýw½öpôYÛÆÞÚîÇ>ï¯m¼Øv,¶uÈ#)#)#.#)#)yì#)Él#È(MÛÞÂÀYÆ`Ë'F]Ûg¹î¡ ¶\ê¶#.Bí©¡I#)×Cvf(ªR]íÒOcATQZÉI#.7 mËmªéíÜ<z÷½[vÎìê¬d¶hÒMyU,j¦zS/ݽ{wß};}ÛºÜ{|û^ÖY}k¼íó7Zö³Nì»[Vónßb¾÷s¯WÛ¶hä#)R¦Æ¨#/¢{$QÜ»¯3Æ#)¡{w³%¶dk{Û½Ûp $UPÞg»][i½º'¹ÚíÎÞðÉÞ·[½n÷ÝæÛ·ÎßYUH:lVÖíÔ×mòÝom;gps³:ÉßõOkl®õãxß{Ü÷ÚµÞÞõXZcÊÜצ¼J@#/U&ûÞ<5õöó½=P®Û½Ão³¾òv}{Öw\ç{ÛÞíu=鯽ï5>÷w³×¾ÖiÛ{ºgº»Þì}ëÜoJíâ®yíÅv;·ëÛ6÷¼jöª´¥¼u¶Îí¾ªBn7nï}Ís³ïï]{çÝÙïI^ÞÎ>ÙãåÛ4¸·Ý£]´wvÙ]Ëî6½ç]½wÓ0zOó{ÌöoÛtÜÓP¡P Øwf²i»r¶#/¹u´çFæù=öò<ºUó½çÛÒ¥8¬Á¥¶ÆJ¾,¶Þ|sß4PSß\èT#)ÞÍîå}ÝÞw¾>ûÛ\àxï¾îñ{D½Ø[®ºÓïmµowbn£#/6Ï^»µÙɫɽ¾ïuWÑ_{®ó>öñ2}ëáôÕëï®ïW¯Q×»Ð=öo©_}»°zµ»j[}híîç½÷}öíÝ.·ºÜ÷[Çw®u·´ßl6µçw9á{[NOrÙµäﶪÒ6önæPO¬Ó,ë}x>& ÓCê¼5[´ØÕ÷ló{ÞÁð¢@iñ#.:ù¦}s{¸>ÊvçNÞösÓÅ[q«ßmn÷w½ÙõõióÎ7½'ßX}÷»A·\¥Ë)¥¢ûío}bù÷Tõ½Å)õ¡î¶Èè)¥³%Ú³Þó»°6Nîw¬i¼û[ï¼à2BÍT+g!÷°ãåÓ·¬vîw4=.s¥soºYÝÖÝé½´(ªH½vâv·*Ù÷ìçÓݬ«¯s{¬®ûÙïww¯¾õÞ;_ëßN¥_z·fçÞÚ÷n©N;ÞÝäS½ÓªÕé^¾Þ2Ýv{ÞíÉ÷ûìKQm\¯#½zÝäÝêø´%4B#) #)#) É£@#)&L&¦©£O(PÓMSÐÔi)'¦5£M©é=!§¨hz¡ê#)#)#)#)#) #)"b2#jTü§µSÍÒêizFÔòS ¨#)È#)#)Iê ªj~Tª=¥6§¦¡§©£Ò#)#)#)#)#)=@#)#)#)#) ¦M#)M`M&OLQ²iP#)#)#)&¢ #@&4 éSõOh¦ÔeêÕz¦ÒP#)#)#)Ð#)#)û|Ûú¶ÛWtI?³wV5sZÍßom©»%£á¶Ôå)) Z$¢#){V@åöüòÎX?æì¿eB?8ý0LØã©.$
5dÆÅ3doç÷Aÿ´Rù¤ :]XA#)»/¾_ÝsE¾M̺Ôq·ª¥Ò8æÈó+¹I0zË|-8Þ]YÔÁt>±q/eBJµJÄâqQa³[à;Æöu8@!ÿÄð¿äÈx±!4
(ÒDa*¨¥"CJÌJ@Ä"*® ÞI#)iD(ÞE(#¢UHû! °¤ª8¤#/AÔ )æUÛ%P`ÌJC3LHÈ
Í£fh)©±2RÅ-¤¨je,P4$&©Q´DJ¢l¡lJÌ L)A±¤hÅI)iª$%5$`Ê"F¶T,liblPRJ)¤HÄÓ6-SU¦ª¥$ÖX$j6¥«³4¦©,fª%M±1³TTI5ÌHÍhÔlf(Ñd´Z)J¤lb`
LM6(`)°L f*d%²@KÉdI)%%6)2AQ)Iµ j1¨l,L(¢%iDÆ,LTlM¢e¤4²4T¢f¤*iM$Â@¦ÄjK#.Dl&**"#/ɦl`MIE$dBDÌÍ I31³)¡,b$"HJa I4ÒÐbL,¥0lÚ#M"¢¤J3A¤IRÍ,¥K$Ù¦Q 5,RY±£+$ÌI"À3c,¨È*#/Y1´YCd£24IKZlÊc$jL
2RÍFÊL ¢QdA%() FHi¤H45¤Z¬34&aJBI²E²E£I2I(J,4`",E#.6k1RXÐJl2¥1 #.
¦MRÆ,ÔؤÊ,ÒbJÙ$
TbSLh Å&M)&a²l2d*#)k$ÊÄÃh,%!K&Qi ÉL¤eÁi)TÙ¬mLdJHѱ¤¬LhÂHaQ¤2@KÑ´jR1EbKI¢ ,!Y#)Z4eFi#.U-m ¤ª(É© k%ÊHÚ)&1¬4HÓLÓM¢ÔÈÆͱ(Щ²ÊFh¡K_ѲVÈK(ÉMbÖÅ¢£BfTDÓlTÆ¥ªb(lX4¤IÌld1¢¡¡5EMdÈleE¡bdÌjZY¨°ÌÊj³FY©¥°Ö4ÙDTe*±MZM¤+6V³RRÃm1Bb´i©Q%¦QDe¢±¶f²UfjV*J6ØÚ6%CDB¨¤*#.±ª5ÔÖ!5E´Ñ¥QH&Ã5(ÚF£dhƤ,jLÚµV±aÆË"eMdIaI3j¥¨¦ÌÔÒ¦kJ¥dJÛJJM©¦ÔÙlR#.lÖfd²ÅÁ©-¥´²ZFÄ@`i±¤£HQ°D1mÉ0)µRD¢Å2ÆÒMh4Â
eDX¤cBi¢)ÊlÐÆ CbÅ!R³RXmdË,Ì!#/RÉ ±QFÆÄdh42S1³¤¬iÍFMlËP)¢±DE")´d,Í¢Å4"¢4H¦`´)e ÂHJFS`ÉlBÒ$f¥¨Ò©#.Òl¤Ê,ÑV(Ì(I$ÙI4%£)3H5lme6V*16)4Ô,É¢¦[R2e-%%²$K1 Ó(ÑD#.ed¥LDÔh¬FØMEF6ÄVL2LÑ%&h¦#)6)"±`Û-4T£Y3#.%,Èl
hѰѨFË#/ÐDEd¶*c()5JQ5cXÊfhB¢¤i
IDÑY¶©2j,Q+%¡¥4±¥%4IRÉ*JR£VÄ¥"%+e%²i*,m¶f)l¦²¨i&lI±aB"ÅLÉC4`ÚLL±"Õ(0Kf"j6¢ØªHB¡c@FÊj£iX©#)ÐbL"MZPQiMRIQ[ÆÖf+%¬È#/ÑlÅ(#4cfI 4`ͱhØ¥6ÚJh±É¨¨6Ë-FÑX±kI¶¥³d4²±*Z)*¦¤Ò²£E(LYR¢ÒVM¤Û%dÕM¥3(²mEIFF¶Û54f¡²X*eEF° Z#.&¥³VLS*ÑDUѶŢÛhÚ¡MkjDÙH6cÊÂÊQdTEÌlII"!jMb̵L|>ó~i¯éyÛÇð{ßÍ\«E½fý;i6N£#ý¿òþÞS´W d]j¢$LLY¢ÒEpÿ«ýT|#.¥)°T\AÈúgQlÿ©ö+Û=i÷é8ÈnT-²Q¥U¥uI¦éDn#/·ÿ5_Ͼ!kÒîÿFÃû>û®ÃüëI2hÌäDL³¶»Yb"< #.¶nà]uø^Ì?v§;q0¶ã?¨
NéÇX;£QLC§6íéTf¥5Fª2Ù$¤©·_Bðjck´ðb¡Ø£Â¢5 UwCkJÉTe0ÀÙ¤J5äØ2¨
*(Ä´ÊÍh¥P5W³Ñü½Jô·³ÍÍFÉk1Q$âQb-ÀFiw.u@(þó«ÝçlËÙ¹I¼ëÅ4â" ÿïCýª0+1j¢AÄ6.ZÑ1íÃxÑ#.-WÇýº4=þÂv#/
µÚ*6P
²P§t+üsãLãPºÑí}[ï ÿi<;ð:N¤¥!V&CSMõlJ=i¦äâ+kqeÿ7ñgH\Zp»PD(aB1¼Üó®ît]Ææå&¤ÊDUCBWÂyChJ;sÑ§Ó ¡ì(*H#(k=?#/\nÔØ28¸o}up#§²®ó@ñkñÛ^éé{®¥·³PhmØ£Ö21ðùÞÞHê4|:EZ9`ÜZ©R²ä 7n\w]uÓEA½ê·w÷/«H(¡ä%³[5¸NDÅ~uKꢱü+LySÿ5éeÿB©6J®YÆ*%¡x¨ÈI+ù1ϳ iuÔÎ%É
VQøUkÛrú#/ç÷EÏèñéìâ£Ær2?f_C<á²B8ãzçÿR¹5NÆ¡ßÆdÏ>5~ıqC¡.çíí}ËPÎo¢÷Ìå!³Pö`rÆw¸C:¥ÓÖèÛAÙÙW0´d;Ò×¢ÆÑX»0¬MÖ/RPX%ç¥ãèü1F*'Mh³f ØÒÆçµS+áîß¿ZÄ#.KHíÿ!¾ëØc$4Ù&27åúí221ÀÍì¢aÍ×e/)Qì´½ÅFv¤8ÆäÈÈY[i¯ÙÒcB'ë!î.êm+Ç3,Ås]He ¡»¬ªJ]§<0=¨ÿ³wîÄê71)¬$LÀÅ¢Ñ`Æ# Rzrå}_?·ª¶±¡[ByÖ '
-%$"K<P4«µËcIÌ2ø3\Ï%²aj#/Î,³$©±6ØÀî5#CÅ TX]Q4£¶ôõæþ¢è),ùPöÍåDå¡DJÚÍéjõ(µïï´ò76êoº
4£ÜîÅq¤Þ¨.´BÒ$¸àPj{)²#¿¦kJlÍFd@îª-¥Q4í»¿,ªJgoeYRLHÀ]ë²áͺ$cb}¤e|¦x<C%¨÷b#.²µ¶eL5|HÙæᶺk#/ÓÙÖDVxvT<YQâµôáF$Nú¦ûª_
QÑ}ÎS3»{ÚG½W'²¬äéZ
WµÍòÂ?ÁVS:иí»áW'h#.lÌMZÆÕåPý¤óڦì!aç7?Òú_}ÓGúzô¾m.¨l8ã]Y?ÇÒ¹3L4ÃÉ Xm½§"úr±5¸uìFÀ*Ð!¡ÈiZ¬mØ\¤<ad¶AëÙÙY.ÞðÁx#/åÄÈq0ÝM6á¯GÊCay¯õ'h L~²XG=ñö«>^3ßa·ÊÌT;ïLq»óÆV1^75&}U4B?->Ó36T ¿sª#!slÏdª¤?¦Bü<ªô©«(uÉ=Ròx6£WÍüIFY¨è_ÚnõÐh¸ùyϳwkÇ'~jKOWáÇY/(yå
ÂHÎl4cxf|%£>ïÎìË[mâg
ª¦nìeÕDî©H/ÃÝVûÚ¾6Ý$µEX¹ñycüõÎ`æÕ.9=}T
Ì¡LÆR
Ö¿
ú´£GÐp\¥dFz}yp2f({¥Oì8kÏ|zm¼!ý¸iÒ#.4ÞþüY4P¹ãs]#/<oµÁ*>ík¯0ãU¶&#/jb<}L¹yò©¨È ´ã\\¢;mãÛ3FSj´Bþÿ×ý92±|pÆ8¡Kj¹æËõwÅù´IGAAH¬ÂäûÔëPsçFÔú?Ó¡ÑÙÑc Óó:ß(õ&#.êë&s!檨MFT¹¥M϶*¢u!;®¡Â>xÃIj²<n+t6=Ýè± 0aZho/3S%»Îø¶PýÓ0ðJmb¢iSvÁwnÄ4ønîþû}¯HÕE×évCf8&gKUßtÍúãdÔ¤æHÄFÜñy½:#ÌËâÝë»by±Á
"nÞ4Aoå.^&z´Ñi¦4?eÿ)³üPÇP(uÅ#.ÄÑòµXÜöTWX¯«_2ÏÉÿ)có{ !Zè\G7®pckçká³+|ÓgÞ«$lõ#.Ù¸¸jÉÄ<Ókªbð{5÷E|¡¶:ñÖðÁµù2ÈÑù:qøQʦ QШ|¸[:8txSíÌU5ú:ô«ÙýJ,å¥y÷ Gz°ü$lÏv»àiÕ ¦$EüÛáO¾¦÷QbêÀA¤nI q1ð=éèü§Þ(T:pIG<}/\±5áÖÔûxãòoi_¤Ãæ{÷¹©F0lÅÖ1ÓuDÏëe5iUB5âÑkÙl8ÉQýÕ{çÌtÅ<6Ðg#<gZ·HßyùJØtéjA;3bìÄÀ() ^ʪ0ófp4(ǹ<w/¹w||¥;¸Æ.e¿Ã®ÎÞÜÄÌr²í£¦6mê±!Âò
©Æ»éRAv¦ÿ½g
ií©< æiaRòXDHw!ÿróÖ"ɺ<Ù/ázwÉ;oÂ)àòÓï¢Ã
æ}5¬Ò¥YQaàG£PEbY¿yê?¦2
q<Á÷$¥ûç[¦t@"xÑ#)x±üHªÊßL¿¨Â®·+o~AlÔl¾ü6þRdSÕûEËü%§äÊ4$!£y¨¤g ìz ÿì¹zowtK¹ ÃR(Î:EÚéú\*;ÕI'˯,ÓS4!7#Ï6b®,Áf®xlU%jòkÒSÂéݾ#.sW¥z©" ¦Ì<tsÒâä£ò½¡ÒúÂ6=4A}_QÝFï¿ÞxÓWtã6L'&çUñö2Ü÷Ìz£(ÝÁ'\£7g^¯öÍÐW`s^ï#/íýQvúúÀÆpóÆA«åýEêªù~[«=^áÕneø¾aÚÔ.?#×}$çÃ~ aJkH§®^ä￱øשÀìès»¿¼ê¼«=?}U½CdòDöTÓêåGÄY ç£T~{¨]Úk¿ Z8¿tµ¯N2[ªº4nz^oßÿbmÙ¨&i£lÜñ©³oÜ Å÷u3ýÃfèóéA@ÕòJQ!«»Ä8e6'Íà¬BPzvþîß®XãÊO@ÇDÐÁÇ8×ñ! +j>ÞÞºv2xñÁd&Cçì°³#.$7ùÔÖôzÖ³ã9Z¹#/ë;ëLGÁ½g&B6È[)ÒÄú¸úïçi"zös lÍ"8ÈÚîglÁ®={r¬øHÐ<×ç¦#«=
#â8mÓDDm´¶Òùõ¨¸#.öð³··¦}:Rn`P°þ®Mh:¸uÞà§mÀ~#/cõkú÷=cåïÿ ,s5¥TÔV¯3Å#3Ò±*(â&zQqdUAL¡ªéüjϣݤ â`¨ÁéÉÕ§vö=&·«} 1wd¿[&\2¦/Íé1È߶Ï#/uµÚÜ#ï¤bÓGáôÂÉTSææzPC¹ÿ#)ìUoü5úñ
½¹®\¨vÑÚ%ËPöùÑGªQÄب%û9×Ä´¥öÊçãMbüÙ$6Ñ(üiÝ!7 OZü¡î<ÊÌÖÖV(bVõBøRÊùm~uÂò? ÏW5¨ÖOVcµwÙçQYÆlck ÍðËWÜçl¿§"½ofÚE`Ùf-±dÉGåj}½U&<*YÁ¯QiJÝRx7=×>6¼Ýx4 À¶#/å5âçM?~äß$Þ#ÔÁÉTãÇ.}T¯'rÅ8¸ÃAôx@Pè¸s®wábìm (¶ÀB#0[²óMÌ&0]ÄCµ£¡G£ÍÕªÆF>ä5ß3Qýyã#/³¢vT¡ÕTÚÒcùeld/g²Êba¢vbYíáAöí#/öpyÜm,r2óÝTúĵ¬V¹¬mÕË?XfÝÙ4ÃTÚ#.}ù)qSA}ZQZï§éÂYì|ùÀë'®ÈF>öJz5z÷[R°*¨¶]Ê>§=kX¢hÐè²V-<M`T¢i¦¤ :5 ÓEðÅe ©(R¨(¢7WRõn©*JR¯<\®FVi¢ `%1ª²Ëúû»=1£¤)ôw|ü +îNjµÑuÂIyÓ¤Ý$«VßuU f%fv!Ë¥ºï»íffYÝ4¼í$awÄø³zMq3Iìßöüÿ4IÎ[Ö»5Ñùj×ãÓ».ß:§°ïæm_{®h¤µ
±É¿ÆVE½¹<íÔÉÝL1¤Î¬½Ùhm[¶#/9º)l¤J¢j
Ý$nMD»dYdoM£_=ßîvæ#)x~ÝX«WY!8ÊÞ¶úWZ) ñ˶ÓoRõèEOYÏ$àóR£ü\_Ü¿®WüWê¤:?ªZ
ê6Lñ±£Ï¬hƵ;4L÷á-?¢s×*r¾ªÓTbuúëÔ¬¿/1Â|Ý&Ëgí¤(ÆG#.ßf}Mê»%®\Ü×G«3·ÌU¾¬;g«û¹Qú·©uôïvڿӹܴ+×¼4&á4SöNºS|Y> Í»¸«#ÛõÌЧt»Í©6»hõuÊ->§Çßø½ÛÇoõöâë̽Z©{EöÃ^³äÈÒm%m¢¢x(6ßH»k@\öKÉ+uý« K<¹·PùYÃöã<çã¶Ìô\0úTå)LïWÖ°ßJø5e
3ävi't:«Êû^w¡¨fo~÷Z(4²á+á¶#)²9eKuoÛ[z³-uð($!ݵ¨?J°ïæIy)Kyê!w6¿AeR(;Cój®G#/dÒ_LY+Óñß\¤;+Øbï¢}eYØñ>ZøÖ@î¥qFZH×ä Ù
KÚ µ9z{ÊТø#/M'cxgcBªAgÆ'Þ×Y¦wå^(#.ÆCäã#.Pk#.Î,$Û]Ðìæ±;4é^jÙ¿Zr¶0luÎ¥²t5ô<VúÐЧér$³ª»øèÝKÝú4G7>õ¥ÑË7Ä̼Lß =·¹ÂuWE²Uï¿KݶxðÛ_£)ùÿ#/ùÕBê8rþOúx$ìéuR¡GK:<HU#ö,µEó_Ù®DÜìc;/D³íªÒç£ð(ÿéY{ºlÝëåÒ|$¤0}1Cúpóû¾Qâ'÷á»KBk :H#.C«ûüÜûíêæJQµRöàùÞsâ½Lgò_m»I8ôÂë.®WlFçù<ZôÆWæO·ûc®7øUaP_2ô¤ÊòSTZG.æxD|Îó(vòî:ë¤Å"ðöC®ïóóxífºiÛé¦ì¬[M
5_YiÛ§ÀèÉ«9L|³Ì6,KϺº´þõ÷a Ôó2I^´Ãf-ͪ«E%
#/¹<w;§·Eæ]ÆÝ/µÃ;gX²$
Mðbrzc©Ô~ÒÇ´°ÒÓFvÈÀ×[Wv+6Ò¬É_§Zìwt̹UT¬°ÆnüÜo%¢§Ô0²nqݺU0µ·µòU*â¥×\u¢ð$þàÇ#²Iû¶Õ¢tK\4ûËoyXo:<ìÔÍùý{³ñG2µ\t¥§Gÿ *Ý'×þå6qÍJBa2m¬c5ÅæGɪÇUÐÅɸ»ÈïüûÄb¹º1Á.¼9Ùï{30]ØÄØl|>éL 0I±¯ü®ÓÖÌNÖ«¤¨üþKwYkS²õsèÞ`u"I¥È¸6ÓËÒl×meQËDvzõz}_U§Wfãh3Ïs»÷}=É´®EhlD ±3¡ËFCc£Ø|b¨háÇ¥UL*ÊÓakÍ[3ö]u¨vÞÒ`ÒUrn!ªLÀßóýõÅÏù^ë®(4h`tÀÈsR>{e;«Îª`1íTjÐE =¯íA!õtVùpqWÛ*ÔÎÞSµiWùù\÷¨HU{®áÃÇJ¤gÜ_É3)$⮯½èJ½ëÕ*úAËërb¤«p EáѸüLHíð×y´'~{c;um»D®Mßø;·ÛTËu±Fìêµy xcnßM=4²]dóù#)ÿm<ä&Bmv6z»óõ9mA
v^®rjQêCÎ ¸ÞþéâMµYPö4?
ãuÒwæÕÆRV7\ÿWÅ<m¿Å^Ï»Æe{ÇäòàÆê³TÙk]³^2yþ$ÿOôÛ#/í}?íiÓ¸û.ÖyxÊæìý^n©dT]1³Eùè[&_Ǫ¬6(hrBäxÙ¡ózñÄ0HÍþßw=³ª£$2HÇæ?È¢öˮҿæçFt¶fÍ2²eC¤ï¨UªGû_l:¡nî÷ÛôVÝ»áBq0{zÔaLt¹Se¿Ãøçé,ÔoT¾Ï óÞWl^ÎÔ@cRÜjKÏdêMmýHvhíÇû}M[5`ÂôçÚ»#>^lÎðÖûfo #)Ü«·»_ÄñðöÀfW1¦!´-8éÏHþg¨25|btx;²ï9¥?§Ö3ðëaÙ4$u^0x>ÐhlËãìgï¹i-¶]¹7åÕxü{þ§H@û|)_.4´'?â
2kÖÃ?=Nñ~96àhê4ÆúESõ]5ÏÞ.Ò=ñþþèá±}Z¬3;ºb~[}íÝ>P4?EÄ[c&´9÷;Q#¦çÒò{iËóý¶qn,.ñ'º#/¥D0ÿ¯#/j{äW¸za«IÅÃÔj-;xÇ40öýùÅj4Ð-DZp¶[êÁ~êÑyE9z¦ótÕv+ÅV¾×úrÿH,ÙÉÌ.¦F4Ï¡o²ºm4Ê#.Ø°MÚóq]sû,Ccèumîäg#âU,z¢éü¹é®ÿcºk\.L!#ú~Ë#.mþK楽cúv]îA¤u&#)íùMÿáño§u¥Ðê5)hXÙÖ#)bE#ÌuLíeD÷"mÎÑoCMK¢¬k!SÇ0öèê}Îef»¨%sÐß;ÀAÁ(Q^y¼=ÝÂo²ºjË'a²aØ÷<wÑÆìzbºFõaöïXΰäC¿v¤Øè$LLÀâÏÀ#.UÑnúaÄÕ´aÔZ¬½åHDË»ûÞÕ¾þvÝ3}Z&6é<74©êUܦÓÀ×DÒn!Y¹"i@IêØsá÷¼õ5ç·nniÝÙÚ¡ÙðÎ7¢¥æX-$KY>sòûÍkÜm'¢ëª4ÄjÐXÎo¬Å)#/Åf3#/-Ƥq1Û4ZÍ6´Ò'N÷ø^¦qðºüü%D!,wÍP%£`°ùã8o°ß§QÆÿ·ûd=ûä$ÜvÜQ`ß>Ü\#. Îb§û^Y;I¤cé8ã°ù#.BÔºË;üíØfÌ°DÌ 2T!3÷·ZÓéyÔ0òÜëßÔ
'gÏê^õÛâ|bôvéCòîZ)63ðÔ¿Wöt3ÆÚí§×ü±qéK¥.`M¹ØEý?:ØL+´s¦ò8êlLhÏZ¦],ÓÔTq~Ñ»bçÎâÔóåÒ+#.æz¶F-ÚåâæoÝxì`ÌõM4?%Â4ªaB<Æòé£×ÏÔÄÜüS§°=,óÈß·6åÂwÏ]ôbôÍ{oN Mc:¶be¦áÈ#.pöÌ(éäkÏÅ4j 49³/;D·Z$:ÈpR)Â2¨ØÓRÂI98h¹·#\åêÄz£ ¥Ub¥çÙô¹Tþ_?±~Û=®®Ó½tccÍÈHâ*½ÁÑÜÛ½º Úë#J»)ÂVäkqZ×±;ïÎæÓ${ôtCúuI©ÔgøêîÜ·×íº8st1øÿ¤Ì5óÞu|=dëEr{^
¹r{o¨!ßTÉÇ_UÆÙ7(® þT¢\¾Éɤ³ÔnöòÞL0Ý5ÝWÈÓFvì9nTX«Åðñôùîtk_~·Û=Ú|8ñCCCJB(±«ÆÚ¤Àx`ÆL>:òÀÍmImª(¸$]JÜËy.a<¹òÎ+#.ß;-%Ú$ÒîqC#/ÔQêRrIþÿåElÀþ"²QùaÀäº#
o"1ë$kÖØEÊb¯=c»c²êýÙªÊÎZ<#/¸´hn`»É«ª#/wCYq¢yóÓóFKn9¦µJ:¸Ø¬'O´c\C¦Lë¦7ñü{d¢ùó$Qßî#/yöõ4Qµ§fv×Tÿë[ã¿®´5q}y¾ÛÀfHÍzø¿Ç.÷÷M$t#/wfqø3ñ¡Ø¸":à1QÁÖmhÌj|o6°eÖh:Yо)ªÐжªqL oZc'0'cÔ¤ê% ØÌ ?1QëU MC¤Ó¢KE ÎUî±ÓL¬/¿ÃZM3ÏéS?v·§àAz°#/(#/00Åkç[x$¨´S65¶¢S%i9Í'Ú#.f ´¦³2C
j]âáè! Z¥{Ócl樺¹ZÒ#¿VáÇl@JÄ㫳íS½Ê¢¼Öå×
zð*¿2ºcv+l¾$ø"¤¬úgÌã^v¶ô|Þ`¹¥\·;7Ë·g몽øõýûÛ
Á¶#/Tðk#y~ZGý®Ä«C¹ÛÚ÷¢ÿ¬¾¯W«NY¢üÝyµfÈ:nê9_Ç3¹º¬fÆFF6164XDVBð=ì³åó¿¶z²n¦+Fª%ºUn]¢ÑÁpÊÃ1LáÏ52ZíT¿åIõÌÅ`(5"ÉÎ$%Çúa¹¬|·çË¢Xû>«å°îDpÚL/Ë1§¨óPÉL78=:Ú¶sê ÚAÐÛÞqOã¤åü;<uZ¶çl»úOÅ1>½s1C8ñ³e °î13wAH¶j*à?»¦Í<#.ãU6üdQ7Ôô3XÇ÷j·cH?³L<1ác¤ëk«înؽµUR!ù2`«_¼úã<5éÚp:Ù姼¡ê°Àå!ЯIº?R1 èÂF¾/R8d[ÝDp}ï»ËázP©ÿy³ªKLÓ´Ó(4íe²*Òè2×%¦ºa¬FÂrVí&cE{O^têivºv#.{¼f¨ÝPél"~2 cHÆ dF¦Z7ÒbÕ0ÊZ#.³#/$ÈMÌ"ÂÈÐ SW,*+)I´ÐÄlã>קffÜW,תWÀé=Ä[ùÍUî×v÷ØñèÆ¿Èè#ÎsD»OGÉùbÑq7"Ã8Õ_fúêð#9´.«ÛËNÌ=Ϫd>?«ìåPÉäm3 7Ô-k5Ét
M#/ìY5¬ß¦}¹AÐ8^Í&ó:Ô¿NTxÿXàÁ¹räC¼öºaaÔ±o#)£±R0Úz¡ð¿â¹º|rÔQQLÉgCö+¦ºvÆ0ùJ#¨¶ãÄÝL{Q)[Éã%k0_¶}}Õ»wJ*øÚIU´hÂdÔï¶%89<®«¥Ö§:¾;>¾8IÝ0mæI)x|S2Î1B55#/³ü/Q1#)òjy!¼ó(LídGu÷YÙ=øÖ3FÙL#.3ãè¯'®ßgùÁo|'hÆ)t:ãKk*RDÐîÔR~G2óÛÁ^ÌÌÖ%jcÂñ;Þ<Þmì9dÄoe+<îìG8ª×ÞÙ}u"¡`ëO,çò½`¥?°ð¢x³éè¾R)c.DýØøaSaÿ«%:ÒöLÅÁ:ñ9÷ëÖÿaÛgܪ`i#)×bÖkã>4q³+Óì¶Y~Q%euc4é´¶=*ΨhNa¥ ²(¦Æsm®m$UѶå¡2l¸m³EYdôÍi(b²P¸î¸%¤]~\sÌ>YÆÓ(@GIÍv1cjíuüÎÆn«);~!Sä|Uqff¤ff#.:ºþ|J4´SP}-Ìyýä¹q'÷sfÝ/-ß±Âøt1Õ=fF'4LÖuÕcZ6Ó|?.æüõµì=:ð;ÒdÝÚíÐnôswº·ËéÍüÕpòójùµo¥rfrØ#õª½;PÿuAéG+5:Ø»#/üèâfY×åÆqµúå Q¹NÉ9Uu:úêà;rIÞ°ò#/G_²xË<ñȬ¸¤ÂB6Ô8ç»/·DLÆûú%,¤â½y&S¦®¼iè½â{ë¼b¤Wäæj>¿&1ÏY Ög4Û³Ï?®©×ò@dЪ¥½;¬«Íó¹¦Å#/¦ôz»;{·h¿ô.®cÃ#)𼿦¿Å\î§gQpa´üWºu[øpüü4Hü§¤î÷³Zþ¾?ÃÉöýÒm:#.=ÇÃÕMô¡Ü½ÍÕ|G±Ü-¨l¤*^Õ´ÓG ðÀîÝåøm¶eå©d2Ó_ÏîÓCrqy+#.ükËhBSNXZ²"Ië¯cÓLè´~Xüo¦»ëOí³¡ÚZ³D!Ódj'ôjÕ窼cÒP'oá(ÞZF@²RF(K¬#?Oò#/¡ÕûCäþ¬Ú2®_¿ý_Ëçåðff#/µZ0; a+K¥Ìv¿8¿Ïº,ù[Ãe9sÿ~¡_Wzû¾»b,*k§kAËRY>
s&$T©bT]Æbi-*6¿SíÖ.A@Á8@äªÿÔ?ö%ÑãÚ`]=ßôd~U`W
¶
\'IÝa-X'ïCgá}nh¬¶(¢´Qfo¤~¶45ålMyÇ®w³ÉÈa¤5êHú,Kövý÷õ÷¾mõÏPHò·ÝnW«÷uÖ×ÜõÔFÚ#,-x=áeeÿV6FЦsBØÚvÂbC]¢"x²ÉØ
w#.ñ0(7Ún?âü6us:ÌÕQ²]G6(Ðm8&ðäjqÙÆеbb%ûÊ3©ëmDÿ¾DL~"RÎç#.PQ¿a(y·Jeß°üîÞæx"R;æÎͳªm À!³LScñ˱ÿpO¦%3¾T}IgÉ=æ¼V¹?[:$?q
ÑAC×ík§¥\ Ûí&1JÌ)$8³¬ÁBúâ
ÃÒUJæñÓ·ë7=ÕÐþ$Ø¿^¸é\H2* è¼Èf7Ñ1ä¥ÈzxÜÿl&©ø?Vc¶%ü°ÂÎ(óÙT¥'Ù
?wì¢ÖOÕa]YÒ9fm!¡ÓAzlP»³ýÖ)§=°:Qïcåhùiïü]öuïô{CçÌùðý¾xþúsÛÄ]GDº%乤X^:~J[øÏÏ_ïúðê;ÉËк×ã}z5Jr«êªÅ÷Sç>"²2ýo§ð¹óçùú-%¢þþæ3²¨é¸îýôéA nìó"³¦õ¼nÏ?aW×YDë¬UB³£>Ý},§ë©Ã¬U¶c~!9ÊõÃã-ÙÛQùâ¥Ém¯ë??®U|q»'yúe©#/Îh7hÙærÂÔ±IØ#*Ù÷aØÊGñgTÐj^3¬>f£ÚÎÎ~].K£Ø£L>{64#)Ô%í3#/NÁðñ2EQ5|&ä~«l«TDsêè¾ÆS¶;ºßVZ½ÛÆÈltjl9§Þ®Y*8èò<ËM:U*â#ÜkÐ}·oåsÓ~#´ôJ ÷)Í#.·qåÔÒ!Òn«øêö¯²ÈRÞ&í³DV±M^½@R}¸´¤j¡¥yÚvãì\ÙÎÂÿ_¥øjÉ¿Nµ¹NÆS¶Æî$ðèã©ËÆôÔ9m&={p#I¯·×O'©G÷ýp\ÖÙ®,7Á°éûª
±pR?¦>,ùÚ]+dWz"¨>Tà"NV_**5Læ,v!c6xØ>É<|>hi§Éʪc:´!<DøÙVgáX3L 4B@a"Úg·÷½}g[Ïä ²sf´Û®Çb¸?Ó¦Eø'nC¸¡$[ì½ç±Ûõ#)È×Ý¡$±@bdu°iÌÂÀ)F"*«Ýíó&ÉáÞhçTF«ýÌ°üðR-C3Íx3þ,ö3lLÅUàØ[%6Û%,@.K÷¾R0@d¤Zç'¶2&1&É6 úºË#/~Tõ¯øpþóû»ø>ú¹ëöy²o³Ö}>À;yíëÉw·Å}¿#.í¿ß¯â¾óç5Ü`÷éÂÌMò5z*¤ªÛ£ý#ÐØgyú¶nÓ¨ÃÇn5ß®¿ÅJ³çÛö½Ê§ý+ÏüiUÇ ~ÿí1Lú#.½ÜÔþü;é§LZ±Ý©ÈÓ)b½ÑC~2Î|Û»þÍÜÇ/Zú5ïü;ú8õrÝöSxâ?\⮯NÝ>~cY¯ÙëÔz4iØ|2ïý±©rowö|=:«M+vTà¾Í^Mï§;z¶_ÊT-DzM§¿ Vèíëvô³súul<7òãÝÑú§ªôI½þ>ز¢»1Ó.çµÅãÛù°Ë³Ç¦Ñý*ѲVØGÉö+ôU×»~Þ©>Ü·×Ê¢ÔÙ«×3A>ÓØ]3èý]%·ùÕUxtïç¯^È×`å²Þ»)æuâ´³FïöÔí¢éUÃCiôYW¦«òeÍÖtm¿MCÌÙ·¾EPñÎ>¢)4Y)K¹çÇ#.»å:o[UkÏÕNû|jÆíÞíZ¿Xüü¾ý·ù/ÙíèòÜ[£=Ú^~#Û\ýØsðçéªÃ¢Ü7{o®[ÄÊ¢KÕà(Þzâ+V/×Îì£T¿Ý;êáÏò¦t"NK·èðk¥4?·ôLÝøFÖz½ËÑßú7¿òÈÓ¡ÕN=F0^l)9yôÙ¿ÑÅÙ§ê=$]§\YçÛ9Å[lê³ «ÿÇã®ïÅaÃ*»ÿÌ4\~<ò«³|·|^{£~Ë×áòùùUVNÝ?ÅÍ ®±ºrò>ßêÓ|Íß?öZ`Wæ³=*e¤ô5éÇÊúýóÕËë×fê#.o/ì÷`å¾£ñmoM<~Üï»_mOúe´ÿ
NÿåöôÕ.GQU¾Ëå2naF /u±µÏöûîÒÉ®sÆâí#.²§¿@wÝ£v;ÏWô·êÓjÑÀé>Sû¿¿íú,#.çëË£nçëç©özýµuø££ÑûJ|ÝH¨Ä¿A#.åÏ7ìþogÕþ_ÝáýÍ'é°t_m£k¦0ôFÓÍ¢KßÔíµ}âE¹9"7ÓÐ?71îø¥EYø§D;"ökÓÔ%a¥ö|úþ@×É÷UÑÞuuëú½|×ò?Çß÷z>ݾîóÕæÞAùäpî<+¦ê÷O´/ÄȮηݣnÍ[>¿·Ôµ!÷t·ÄoÇgu¿ËGQåîñø¬îý}\çgÃóøþâ)ÜzN®öM÷7cc¯oÕk=gðú<8·Ùøÿ5\mËé¯|6Ù«¢ÿ
gÄVkò·öáÕëôt+Ïm;¾ywióì<ýâ©*/hµHvGÚk_»àë^v±»;ø@ÄyùSöʨGë«lQ©¶+?´d; BèúèYäÓ°aݱ¤7"?«x9o»»«¸Þ`ÏåýÕ®mûþûdñÇ)m«î÷×t¿E®±*ßç^aml¾txÿ×Ö5hòvYñÕ¬}=Xý;
Nnv×ì²þ:Ï<3VÇ?ÏmÛ}Õõ¬0&gv.jãu-«â/Ão]ºõX\Ý$°ÒÕܺzê!«µ¬nOUMïغ³å²[Vx%ñí«áΪªzõìïEüøg_89_µ8l¯Ï4§(;yþØ;sEÚ[¢!Rßìæ53F&«fNEÓ£²{I=ÿ¿=
z7{Y_/f¿¿Ý~úªð{C}{BuJÂmVø+£Xh·<UðßðG6]Ý<piY-zéJøÃC/¬ï9\1ØÍnµpõz1ó¾Gír1nÈÌOøïXÕÀÄzâ;Euêý;l>*<îÓq®_-c,#:ë%$
Âýwpû½õÚ-ú85×è1/È·ÛîÙÏ}2ÛyÒgìñÉoóð)²Òþ_ÀfsB¶§`¾ô um£I¹íW-,« -ÕYâ|¿³}¢Ó-NûMùPìî²ë:[âÙ㲩쿾êí®Öç~xÞÎqsU¢=\¥õj|PTe9¦íYýý¶`Wá+úð
øòÕgg½·óüß5,S9×V¹»Ù(§/!xó8ÿ?Ý:nôþ3«åÏÍ¿Út7¼Ð#Îl_§Ûº8Aë\%áû÷ÆJÙ§ý}ùýYö_Ï·m\§òÞËÑHnª7Ãð¬Ë¹t~{³¿Ç×Øg/ foSë°èô$ùó?¶¢Á5 óä`¼þ>¬y±%ûJL²Üî¯ê¯ØÙv{,}k¨|þ«1ÿ?¨$`L/ï/óa]µs#u·!O*ìD<>ýb1£PaX#ia4(*I&ØácPbaDQSR&Ò0a¶rôÖÚÛZÜNK£2-`Òl4É4b,¸ÈȶYEÚ,Y+tÔºéåFºIJxÍ
ü±ýxÄâQ3EFßdD?¥S&Ó¬_oYÜÞ³!¹á%þ9guíS$ÏÓ4Ö]'ßüöµQâq8Òn]ÔEQE"YC äÄSÇCô_$t/=åØp¼X`8hÒ$HGJ²¯n
¡ldcf*Õ#.45v§FÊéÚ( ÿ$8ÉǦ¿ |8Ýôao
YiÕ¿ä+ütøS¥yO éٸ驪yìصëu*Óð®ß&ûu}µg³b_»×æ»?9é\Oâôéû²³iÛSroÕ«¿>ÚU_Íjw=þÚ}¶ãï¥#/°{¦²E ¿©½m&¢HVóKÖ¥ê1kÆyû=ߧô=^ÍZý]HkÙ] ý'_)0ÚÎ÷þ.0Ø`¶}º?/åǧ¯«*¹-·Ôߺ.RyIâ+\AyÑÿo<~/GìÕZåãDR]ßÉôoÞêý¾ñÕl¿M^Þ¿å_U{7nþº¿n¿fYé"v9øÉeÁó|®A©ÚVÿaàcM)IM9üø¹Aúîcé°ñÈË
&¸Á,m+G#.à©.¦¥#hxÊ4F²·#)i³ÜBÃ#ÀlLH0¬r %bs«IµÎÚ.ñ¦Ûw5§Y9##/)Z%¡`È¥M¦ÄÂ¥bi¦¸°lxVZÒ}1òu%{Rop¦ù¦ÌðmÑV#.×#)°u12(8ÛC¡GtqF$Þw§£X>#.#/9QB!Ò0!¦¹D»mÀiJ ³G\Uñ¨vJh à)"¨1£2#.e"æ¥#."N*FÈl©bl8$XµÈÃX0a°i&PNÍÖÂÙ§¶ö`4Á²Æ*«H!SÄH÷bÇÚ¢·fHþÖ(LÔUV¦®Â$Ô(¡Û:Ã#)h K+Rñ#/Ü(qN;pGÃq6µ%M3ME^nÞ1aß°ä})ðØÿs<ëoð\:$^}nöWø×¹¶ì˷˧ýU}]Õ|Íä[ððd·öçç(~+¼w¼í¿è?ø[uåvkõ#.^q®õÖ¬RYÏ-2«ë×Ý«ò¯Û»»íÃflݳG#/ÆõÛ¤¡QüÛÎC~÷×.úJR8·îcʯêµv]ZêQnúT¨P·«]JÎÖtèof']Õ}Iϧq®ÝrO®¯ÙmU#/Úü$å³<nå7ëfÑÇSʦéRçM*#¿/Ä.z\¾KpÁÊÞÀä7ò÷1|Yé#m»d³#/»ô>Ghª^¡¥aùý/?Ìþ}¿Ò¯-Ï»OÑÔ0#.ûÔ´<RgÕ9ïòÝQvYz Ås¿a뤳j'C.|j©¯ØaXÁÌ7·E2pd5RDs&xÉ:ÎõéT¼#EÙ$pâÄÁþ o¾täyg$C¦¥æ%ó·Í.Rèà[]ÉÉÉ=®EÁØîÌyS3AoEpµü=Ýìåÿ?M¯ÁÊN?l~$ 2Ë$èuk\£s1¯YÄÏf#.þ£Dç¯'³áÄÆ7ðmÛf°»WHl{#."9ëû&K'²9Üz57QÊ©{n~V»ùå4ÞjÃV½Á͵8ôlQ=¯RÚ×ÌVÖ>ºoÅöWºqÄx¢nr'ª^>6]õýn9½3¢ TÎìüºÆj¢#.HG©bj%þ+bSöJrT&5TãûD éÃï«Ñîü=V|ýçãô=ï¦?TþmN&aHBh«%#/ßh&4Î ì4õL1 åXjgLclm
õä&fĺb5MXÀDI<ÓcÅì VÜ+ÈÅrLÂÄI]ËA¤T`ÐÊ+Q`|¢E7NÙ´¡®\»ÑÁq ÕyU²Ý@QÛ½`³¶ðù¤#/R:ÊÁ¢Ðà¿3H×-¢VbëL{Dm,âÜð6@«A_#)ÌÉcà´õ¡j¡íéÚvZÊÆ8`Ø8´Ôé¨ Á±D´VJ,±#.6ʵ;RFEÎ #.S54©.m´Z1"q² c/©8LÎQ-#/ó×ÿI°çN.1yÞJÓK±TXÃ-dJV(ZÅJÃ#/ ðÈ<-[s#.>û%f»#.øºp6L©ÓΡÇ!ÑþûþË®3{{Àòç§ÍÆèüõìs#.V±½&tÑ-*ìèu"!AöC²$Oûºº,cH1î=¼:×ä×»]Þ»¸4åª<a+¹/Æ=0ö`~ê/Ð~ÂlåwAm Çó£0EHp¼àÃÓa|*LMj³è^½Øh$¥±0,N×R#N@"G`Æ¡ªOMééθ¯÷vIBN¶5¦¤Ê;t¦ÁÐÍJcÃâĺª4´h¡El$méÚ,]峫mNÝ=~ãUP%Y6DÑszhæÔDJoö~Ü~úéèκþI}]tüÕ_Gu5ãöù<Myxz¿Þ]{CÌBnn¢ûiúmâËÇh$\´ R76:6;nÏöÙã²L(#/R0v*º·bRÐ"kT)c9TinQi7D#!
qUúª&W*-c§KÀÅ[¯eK!¦®.gH²dÄ
9¨µL<LË0,ÊØ0ZÓ:Ò·ÀצzZyCZU`ùoF?Á¤e\ÊßÓæpï;,.ï1u6N½¹ß4iÈÈR§'v\$Þ"hàÃ|PëR+
ñI9±iÆ/&\~º»4_Ä(tN lièÈ(¡v)7dC¨BqÞ¥é9~xG{|µ^ÚiNº´W¨7Îd{!¿ÏåìÄvû^ùÌRýbfÜÞ5³U±±zÌ°ÐpêÕÎQÔ2³MØj#|ÁÅêòzMܪw±oÊNÅ˹p9SÏXí'`ëÞG³ =&Áä¼Ó0Ô¿L¤¿¡Í3ömoWä ©¤#.ÚBvnt\¤Ä´ÖY1ÙѾQ&ÑG#.Bã¼åcë#c#.MãjÆÜ©J÷0̬26ÈÑ!U*°!ªDK(VÍ#.²f:e¹«}nùÎþª¯#.w+_Ç¿9Î Æ#-4ÇA²ÀÛLÕmX¦S¥R ]dÓ×GÂuø"$ÀôR<¦aÆå$iökÞ\Ø¡ha)Û[çLo;Á#/S,f2ᦢ³|ßÀím¼·ÃfLÖ*£7G|¸g0ÂoFbJCâ³"ÔyN¹b4#.2MªNǽ!&hL$$z;u²
óãe`Û_/ïÀ]´íý8ók]M¡+Á¾_(ÖYâI, é¢ßòåPY;]°Ü0¸8-ùF¼!ßpG#qnÍгk=k¤C\#/'"#ª;kSFí|o]a<2EhJî+¯'M:ÞÛg|8,Ò¹ÀMÙ¬97Hyg:b¡Çü1¬Û8MÁ×5K°Ô¢I Ô!¥Ð,^(± ¶C´³nÄbú9%¸µr`j¹¶|,(#.5d àêÎLÒb0 ð(°úqïÆ"])¬± LNµ~6ðõZ\7¨tôMAÓeÆy~^öÛ^Ö'¶ò¹ÇöuæSãè±=í½æF[säå½QÃøl*Ñq|éb6/áï¬Yãqô>&3²G"ñ9_è"»«÷%ô<C ¢vز&´bfÐbî ¹UÜGpVªûÛ©·r©ðøe#/ÀeF1µU|S¶,
Ò1PI@ñúWÒ×Õ¦¬¼eånú¬©#)èB`I{e2mCª5äë7t9Ðæ0@ÓÄrCwÿyvËùCÅ÷§ñÓ½^ôÜ>HOØôv-ðñ1}Npg3/Z¥äµVËSÎB2#¬9Mýí,OyJZq\äíªÁ¢YDaâNm¾ûkÊsÕðãùбk<2C÷¬Ëèáâá@ÚZVÃÅ<»:=ï<4ó65Hk
)^áW±íæó#.uÁ*q²|bLÑ(:?¬\õé0#.àÀÕ¨7R¦z6篫Bc5%&çûܸoº.2tÍØ»·+³J(ì}ÚµªT9ݪ
ã§m¡(º^l},$AîÖ»èËa§-xk185BçÚD£°{ôrÉËcDsqR©k¦*krwd×ËBµR\Ú«¿ù¾çüí=ÿîí´=õCLGñð¶×²Xâe0Oï3¡U1êCÀtÆãÿ{óþ/2}ÞI4Ú±ö7§ÚKì%géW|KÈYu6¶psik#)H9r)&a4:8#EÝ<k)^vb¾×6J£ 7·îêª<þù#.sIÝi\¢W¿½EXwùZüô·&·Þò²\#мީÏ\cJ^©âËM³õ-#.~DsÑÞÊɺIJ_³#)/¦ªT¤æ ãSy,äMc!UË@,S(Ë>ü»(*=KÎUÊ]u¢IÌwC°ú´:PÒÄÅ^j¿~8^]ýÚ¶jl qÇ#.#.çá"tmãØ#.CËà#/êÚYu#ºe§YÎé8`®Mq¿¦)m^ç½ØØ|ï×"üÃWJ³¸÷P¾Ñ2íp®Z=$öàÉ´Ïa*°K;'=ÚD;¼¾.çôi(7úvçx0N<ñ$ºtàä¹d<±%¼|ð8»ûá«;Òy^=ÏÌ8û/sÖþ¼ÿ[uR$%åÉA]ºÌ&b©ò
ódrÙþäl¶ÒVØGä sR ñª-#/[ck8gcò ²ÒrŸ?Tî°zßè:<GÞôwÈ<(
<µdÕè;á?¡«¬yI×6*R´Q¢}IÌ'ªcbü+Çk3·!Ð påÁóÀôT¬µ "¦Ò+^Å)ÊW)<w¢Ó+u¸òi½ÿÃEGIJZÌù¾Ïë]×IÚÏSÚ$øvv{¥ü#/dü5á÷gHÑzëºV!DN¢Ì;xÄ&JÛÔ²ì¹óG©'Azb>]VýÁèJIíÁ^è,àz<¡ØHtfjÆëJ³7ÍÝTÆS=¦M;ô3ÉonÏÄ~7Ý{¬9sÎɦ ä4ÎÓå³+Ùi¬üÓÓ%!âNFÛèÀ»Ã½Á[¢ð)H¡Ììv¾Ï ñ}°Â³þiWÒ6!Ý-°º9ØULP!r<ã¹,£õÃ$ÔÓáXcý²§4¹ei8ìè»h÷©RÂ\T~µpUÅÞpºÂÍ&¨«0v QfºÞdrL=æ)ºµ©síe2mt:pü7\.9ßËmðùk'C|Æ6* %ª»_-bÿä#+ȪÓdû4[}ʲ³å¥wG²Õò ø|t£ÍÛÔØZÆ<g)·Ñq-º¯sp11$Nâ=|¹¹õÖbCoºUëäp)Ätî ¥µ÷²B>G³Túy·$±Qs ð¬ÉE¶vÖM_zw!î2å"] ©gÌà°~é¤$ÅðyJ¦ÚJ8ÊàrPGëf{dVì»''=OÓ·½±äíFZ6&ÇRø3Yùþ£÷Oq#.Å®êæ&¢½^Q'î<ÿVx±°&ýò?jhNâ/ðÕª»DIúv½»dy̸¬a¬ËÞÙ×-vC¹áðà<Ø1ìÓq/ùbôÙmFîÖWnv¾³æ9}ª{¯rµÈ\ØØ°ðáèªWëã¦çÑZ®T2!Çx!;÷N'ÅÊFÕ)¸¼îV
J¢+ãi»}[G¥#MVL;ñqòñùKÛê0ÙhQcË BâÝ®î×wÃvï8³/'/%2G<¿6S6°Cý¬}hÚp®MäLOctIÊ¡s
ÍθÒì¸ÜÇëºpËìøI(K®õ8þOä¹ëíy>»â}uÝtáñd ¤Mþ°\ãïQj)·N$S-Ød f¸LÀÁXs5ÐÙyAÄòÕ~Dã;T»ó>kº5Ê:7QÜi¤MYÕ/8^ê¥o}¨Þïäíå[]u>º3mtW!Ní#.Ç~Â#.Saà¬<ïm(äscÿ*|/+Í¡ÛÄþß¿_3^סuùkÍM!ÀóýÉ»¿kó²öî"ËtÕþåëÄi<SÌ÷Ç^Ïvù¯òDµkÅvE¶ßðM´Ô¡âF½òEç¬{3¹K¶J6ØE¥LØóíÛ\ê0á32>)GµÍEuª?Ü4s®foY={ÏëÄ·FÖõ0MÒ×WËSbG¹3{¿³ÝMST×ÛôÛ]ùÍÇÊlëàö#.©G$p?ÀåÌãÞ=8¯Neùëá/|¢T±Øàóϱ¤º"Yhá®ÈÑq¼zU»Ð÷ìç*J;©s$Süáçâ3¿64M¬fØÁhùÆþ#.¾f)½Ë7ä#O¶3uìÖCpv6øâìÎäQ/6¥¡µq$H¥¤|&z*ʲ#,-.X%fn)æÞ#NÒTüHÙØ8ù§G®5ÖjDé'í.J}ùÛHukdüø»¦øT?Ï|ç ÁQy#/ëÆS2Ê[Áï·#.øK?éý©_Ð|uÔ|HkQÇÍKc¿¥xnªÇuÚÀ¾,À¨/yâlÓ~8C Ø·HY¤äfi_7ò5¦d·Çù¹Ïnç^³®ÚS#/ÇÅ·v"#)ýÒ³ÙÆQñ-ùT^æl)¥¨MÍZ+«áB2çRiS¤9â·MM¯Éö>{pK¦&Ã1Çü´¢©Éü¢I:«¿ö}5]±Ø³Róæ]®éó~âÉ¡¸bJÙ+¬õON){êtx<âjÂÔ+Ô4d7pó4Ük±hÂÖºáÇz
3K«ì)NXKúÊפÔXÑ"
×ÍÔeú9½<ù®3HÕvvèQ[ywPûéû{BºÂùU}k¾9;â«6TS~ÒYa_Ç »_ãýðÛ,Ó´XXøsòñ$MU~WiÓ{V*aȦüÕ[y&²(à®Vs1ÓmªñªßßÊ«ËZÌÞ¹øRÚ¨ñp,*-tôè®%T¤§;ùÊE¾©gÝqMéÅþHÁkÄ\Gw2ºkö¢zù¿IæØø¢e'mÿtç?«^m]><õØ´pàålvÔH´Æ1¨}è{¹ã65XÖU'Ç,nÁ%}ik®2[VZSÊíôÓÀt[ñsº=qDG¢ Ùý^ií·`j®Eøg"Í JI÷#Î\ÀîÝ5%íúçõQ]ÌG]öçsT?ªkÇ~ã9$G¿Î³fKêQáù]~Ö`ÛyùðÊÆ|¬UêƤDSG**wsGf©ñï¦{C:U-®pZQN1Çê7çeB#/M ¢ysgê7k¦©Ö$[ü-æIKç8öÿÙìffyo/2ãÕq«NTK"-Þg<ñ.Õá92Â×k¦äÛ§gÉZ»Ç2¢¿]=%à/O«2¾*û÷Çn?5]ò²È½Ð*K7nkÎÍÜ®±¥Ê/èüa´AÎoÃ϶±õ"W¤¾mÓ:[Ó?_kÕõ¹XõìYEuÜô¼Õï'Ux6þ>¾xç¥öPµ:çùoÒ¥g{ðù»Îr=ûãNÏáÚræL¶#}ÜÑÒ#.]®»ê·ÁÍssánB¡ ¾%áUsx¹ée®&ìy»¢ªåîéå}K Æ¿Ö·¦cªÞ¬öÅñ»^»¥VáËm.)Üd-T¾T¸FßLañÓ|Öyn5xóùûN¹Éï]Üìäûÿ]1Å¿ÓÎ1'g 8<\λfÖ>Owgðkçç¿Íay`~:{ÅspÞHi#/3º7E¿ËÃóY4-jcʳïÖ÷íÄËI]ü5-¼:ó|ôùc}½£ëçá,>ì¼ùò¹ózx
D:hv]ËÉæ¥Éü áw?ZQ¸W=:ôyj=}Î;ïÝõzÖ}÷R5þg¶HI4·¯]W¯m¢î³M欫¯9½8Lé¥×J¢<±¬Ðþű2dsgn[n1*é*ÝÈs§¦Ü¬wéÔ}¸èɤԯD_[Aå·3ïç83=Üüã·§Ö³¸Îwt\¯[p£¯
G*n§ó¯Uz* p ñ«hhÕjÆ5jÎ-×˯#/±^Ô¤<¯£(_t
ç¯E£äÐ\o9Ád|öNº§ÏM
t«K|'#/k¥ëvÛícõ·O tñ?Á·§¢äܪ"WÖg\¦ÕµÕ@pÅWµehÀZ¼b»´td<êeO>#/}þgJÖµ³ØQß×[4G¯}Ã#/$dËôüt¡´Ùà1HRc¤"Õ.iÞÅE¢¾dmº**
$x>|r²ªø]ogàµ#.Áôxõý#.o¿ß}w¯¢®yè¡ä-ÊO#Â5ôD-X|Ua-IêTÑÐiÂz²"Ý*å<Û¥×U³w]d¬Z']#.+,4çÂêêÉèúÏÌ>?wNþaNüùzFëÞ¤Ë$®×ƸÊÇ_èÇmÎÙÓ{û1ÒC°ºg]=²OáFºÃ?Î|TßÉEwÌt£,ªúPªz£ XXÁ;»â,ºj1TRÜúêëdÉÝ`HªæØõg¾3X£ÿGÖwÉÞ*ä¶ÃªÆ\½Ý©é úô¢y{I lt/Ê7ßeãçøâõòÆ»È\¹¯ÎI;Ïr¾[wäÎ÷)JVmÛwÖwMÙÍeÙ1Zí»ßÝÉÓY;ñÖ'TücO§CÖ» Ë|øû¿f£]ú3É]ЩrâÅÇÏÆ!N3íÃÅ^%8PáS#.fIy×ipZ»ÄëXcöæýþ2Óï[ƬèõdÖõijË2â³#.eÑ®<=|!ø×z}Çx³9;u®î_áuÛ³Ôû-Á×À}9m!eåãëYCû½#. [D|Üß%+^ºÁTú¼ÇX¬K»S¦KúºlfSBáT¢ìó7H<±ÊÝKÊí~H¬lýº\ú~QÎ:EF
¼?Íþ#/1yGØMûÙ&ÆÝÐDLõ,SD\@s=¹ñèÜ©l<Ô)&¸qå~ép<eù±ÛÝúü<5õÞâ[[î*®Zºï¬å¢ÚQÇ´±¸ÏO¥XÖx-õ¬§?ON;'渲É[&Åaë«tUejþ3¸¬ö¡Ñãnõz`º§}ô«-5=U«T¿ns²Ôü÷êïíCÖ>Kõ&Åå×(ý÷ßÞÜa_OO|íVîâÝ\¯bËEWó¤]^ç6Úúòvx¾ù;Lp¹7qF
γ²Þ¢L@©ú¼_mtn(ùjv<s,%¢çUtâR¯ vºf¨³ÑÌûeÑã:KFìqåöB¦ÏÊ|Zö +zbw4ò\ek»ÒC*ëUùz§Ï±é÷s-ºÏɳ×ëyjö+ËËÕ@âG¢ÈÝg(ÊJ:3Pîä ©Sõʼ;5]3~¯ÓêûóÎê|¶Ó+ìÙþPÓÝva"Htæ5ú¬f0'æÄCOuÊÕj#/¤¼°Eo7ß+®îì)gIJøÁ§]tÄTþÙ¹?WhÉ÷ü{¾&s°ÉiÊÙÊãK¸ÔÍ5ª{ËMvvßWÑómÖÏ6W»~ÍP÷ôÅ/kNªC'B4h£µÅþzñ¶³{åËâ'Éßîèùx¸+n7溸®i=YNùµx½S&#jæSÎ,nZõãU*µE2uv¥²odÝ[óÄWu|ñ=çé¯U2îº~®Þ¢RçnÎ/}xø_ß[{z=G¯Âtuq|×nº¨ë½Ë;ü0åó\Ñ&sÍßSÍ¿éGN»õ~ã2I±ñÏYªÉÞ·í[%}ÔyÖûâjeT5è!ɽü°¿9ü>Øú¤·¼ÀO®äúPøvô:Ïõ¼·¨TXÙVHBJ!Ú%a#.ÀÞRíAZÞ´×äzãø-,MA2IÖüÏ47 ìlFÛ¢þgÄyf?@eðf}s^.ÝÉê»C-)\W$kl,ÔíÙo[<+<,#/i»¥ï¦5Ëgξ%uFº¯ÝKyUäÈc{ïÇ="òWE´Ëyo§¾¾þ¯~k<>=2täð{oÓëÑ,FC ËߦTÔi,CUÑ_#.Ô«ñÖ|e¿N^¨½¯A5¨k¤ÉÅ4fÚòvm´f4:êîÒ±=Ö½u¬÷HÎO»½oÑ`Åô¶:ébé×tQÇ2ðùOýNìVtÖs:Mè÷>WR«ÓOeA¢Ø'Zí]ßíu¯Q¢JQ».§´bD¤Ô5Tª¬ù>~n`|æsK¥ÖåѬ¼¦|'Fæ¹NµkÜBí¾=Õ>©§NQj+Ã=$ C KúHY:(ðÕ=ëÅ~'Ç^3¾õJsÖè[Áñ$uéüÑéð}S6<òj8>
'
ùçÈUÑEDYµKuN¼}0óov÷SáØVú%Cr<jye©lìZ0¾h´$Õwõöíåëu(KÑs¡Ü:ÜmÈç"ñOzï#.1¦ ùh÷>Ô?¯ñĸ³p^"1Ë®³zû¤rãÉÔõekà]tfм«K Î&a:11ÙkµÂ5k¾%§BO½r©íÙSѵ§4úJ@䧤J:«EÏö@âêð@±¾Ú}®ÑëѲÕïÄÚíOÚKÚNjýk+ë}i¦YÜKKrÓSٷľº2±a¯à±È¥NqqËÓ K¦étãvzº4'to´ÌÉÇ~µñVÖ|¨ Ll|âDf%Ϋ~`÷nëï_BùÏÝN#*9z\$^IÂßC)
Ôô¹uò¬¬nÔ["â´Ììó=þyZivd$ørÇÇå7¤«ÍÒ0ó#/Ç-¢tÝô¢éôfæ lÄÌ/6
@ÙõNRï]!ÓBö½ÁÎxM¨Î´k¶þéÎïׯDþOé±¼&<¢Ëýs¹:lR#)¼¨±ÝïÚomŨ·tSõ"¢àunì).$ô^}ý4Oë-ÒUwÖRì/VL]ßYÓ7tÃ?n¿nvÌPÇC²c%SmøMÃ&¥£kí¹ËÖåXÉ!)$ÏmõgYwÃÓÐ.¼·êQÅùèQZYpíþîoìÄ>ã>Ìn.²ëzÓ5zqLñ£~ÜuV 6ü<±Î^ÏÚG.þ£¨BWTÏ;ð´øµÓº·]VaìwbÕÊ\}9PÖßYÇ
<¾åò0×fsHR/]üÿD²cØñ:ªúÑK|*ÐXlò©8´U§L¾ÚNÛ¬ó»ÕÞÙµ±Ádî`'{ ¤°ßxTz¼'yÎMÈEêSØ bîp¤ÉÈâ°*zî§ðÅö«ý<¨:yïüM¿:q²¶·Ü\Òf¹¥
âW®ÑU8Rw¾¼ñ©®Û¶µmØbJ½öHº§d.9¹¡IÇAkéÔõÄæ´'=¾·ô?F×{û9Þk±4Á2ý1ø}WÝäó4ñ®{g5Ï·vÔÌ&úÞ´~ÓóeøEáÌÑ:Fõy>+~êËmµÛ#1t<Úß#.W*T!¦12=Øþh¼ó[ÔU$ 5ºùÈu/Ïý'H3!hH ?*é#/&jF0À¬ë¬9Ù@Àâ5¸R Xþng3@§"i#/:fõíÉß©ÂOÚôØûΦ ub ÈRTÃIQûåÊ÷ÔfÝü¢5¥qñ|üFñáÎh-¦Êê³*4¦¨R
ð&Ú
KªAûÄÙ³öÎg÷`¦_Üô´ýA1f>ï=&Tí©
Uþ'6¸Æî5Aö?ª<é"¬àÒ*\®GøOMp\
æOõ³74_¦®_hªîNêúErdù=D®Ô>½ÍÙ»¤¿«æøï·ÈÖ>T|ãåøC_'Ýåæ,Àù
®vûXe÷á#.ö¼yZëY¥·'«Eභþ¶«sèßYÑÙTlaO9U>Y½µÏðîàÇ¿°ÏÀ1pq ´A6BESéx>[ñîgcH'êýþüUÒbï"mYánñԤ!;M#/? @ôfÈ<£½uôàsmkÚóp@îñÞsV_Kýýÿ'LRIâìFùW#.ÆþægÓª~¾5Ik¨qF×KSqñº¢ekOÊjªêøH+@<a9Ù¢ }Û¹¦4 h(=Ò9@üçÈ0þhù@òöBykíÒ=ñç9ÉúvòÅCÙæÅâtpxFqyå!û¡ª7¼D·ÑYvÎnAu#)Õ@lbÍE°èjCø D¼zú:aäFÉ0ø@{î¼0Gù¤8Cùõúl¦µôªfd 9×ü{#.¬T2ª³à÷ÙVçåFoªhxTÈïBÒé礰ÀDS{|û®ÁíóðÛ¦úkµÁa#.J*#4«àWµ¤µOJ7ÀW^úâ£7eòÞä5ýºváðcÒ<¸Xhla'ï#îàvxYAu+ÄqþêÍÉAîU³
«§îÛÓ±´ÛLX#)°Â
/#/:Pp[å3õÕ1ß4l!¬¹;¯ïBöª@ÈúXy8ú9º¢û*0,yÍå9¤Ù4AÏ6}à´wF:4&û¯u;ÿá×Ë|lñwúHÃЩJB
£©^yÚ2Ì"J=£æÞ§lÜõ7Þ¦@g_`ÛN¦M^ß½°ãK¶üGÕ cçÂ-7ÄS^Ú£T21!±KS°ÜÃwO%2Ò&NY!5MPRùQØ9Ú+¯L°è?
rЧ£}ò³hÖmÉFuÊ«Kê÷VýÔ¯føîpxÐÑ47ÁMíA7}#UTE*Äá)G7#/¯°õñwA1ºnl1t°LØÉ~~×ü¥åuJ¦®\¹»ññ±°Îy×Ï#.¼ªÏâètþ#/ѳ=¤Á$,PÚVAÆÐWÒ8ÈyÌDù#¹ëïï3í-Ðß!ðïe~tÒ1ËGm÷~þwÙð½»òIË?C¾Ï-#.Õ#/,4¤Y9&.Î8¾Å ìÆó%0zòÆLzö6¢zúüÐ`»>J'rJÇÃ<¹*Àõ}h4Ìy]\ùÍ2eµÁ«ÖùV ¥¬xÖ!µ8ó.:éÃ]H4¸ÏêgU¦Ý']õy7Uv:V`ó¾í5gQÏÓ¹0}9kÈM:ÎÓÛN#)Õs¢WÂMlur×¢·Ç})m»}n_9·A5¦ C×uóiCt¶l¨Ñ3©kõe˨ÌiÈÅ®ü¹¹<â,ì¶XGqVÂLLĦí2zgB߸ªøfm5Øe"(Ó$êsîÆÃ*8Åwn¶Ý#)Æ{þßMå7)ã]Ý«KÜRµø¸ÙU}Ô'L(ý×ÇnÖmhÎgô.tõpWFd*{34ìƺ°Ê¢VO*ô0§ö¬ãJ0êm 2Ùb2M##.³Õݺ»ÕCð>¬fA¥îÆm:8'¼ålLb¿Q;v;±ø»9O¹ûÙ}¢(Oª¬9ÁÕåüÈ`8C%·Ü6@øг-d©Xjµø;åVD§¦Í5¶uêãÃà³À×BäÓjcN¼*#.rÐD¥« es1CÌ&bhضʹo¦Äh¤Çç×~\(v[y°ÎÕ®f`óÏwuÖLCµfRÆeÚ `ûËBÖåË´'gů¨ÌÁ,]õ±¡WQp#/ëo%*7ð¦ÉÀ#.ù(¡4ñ"r1ÙËMx§È}ÊBLU
ÆtXa'9ÀAP¥Õð¬¿]=xâC³M¡Ûs£0#)ÂÈËwiÞ^$chB¹kÃf¨Àn±ªÍ½Ze«Nô¹ÚÄNò0ʼ¸BPÒªËP])ÒP·Ý¥Áµ7×ÚÄbùdIi5:¹K¼£¦!úkÒƱdïvýJ1A¨¬òFpMmsº|¹ø¢$3$9AÄ9$Ìyº¡XÝÆÄæáãi¬køl<ÑÑ~S$p5½ÔýaäðuìtÄ#/¾k2ùõ=Sa{ùÆ0Í7Ýã{ãßÀuCÞé×Ô?'تNÃƨ¿8ðTråRlpêaÇî×LàºlÜÉ{{a·ÒzØA漧r¯3;ø®Ý©6#/¦]\Ñð1mGe5µ ¿$ɲ篾,Ý[ñ±½!Û*®¨9l¥f*¼5ëËÏÝi-Zíh³$6à¹Nfú³ÀØt°-×Ü[Á¢§«`RQE«Pðf§^4¹éüì°â R_q®~b¼%°¿:õÙZ(øÙ±t´·ÆÕÒÖ³uãÌUn¢ÅÝ^1× ZÍ-A¿N55ô»L4ì8Ùä°f]ô:Jzkkv8[o®Æ.%B÷Ö#ªkT¢¥°¦Ó~¿Ó¤5g^[ó8:lʸtØõrdwf9ÊÝëF#/Û¤NHz.Õ$ª45p*¾öÝ#.]òVÚÚÕùZbogø&t^²<ý|xÇ#.¯íSJôeE1JI.9®lp#.Ði,2C¿ìûûQ¤4;§F´|àÅuíVþ'y½8¬è1Oø{"DÏËÛo[ûp-`{:*÷:@ïe·£3-'·&ýH9&ëã}\¨!QR'Ñ|?wþ\Px!ýÇß÷µ9cS{½^Éã}4v¬:«¯¹SoÒàÅÓ¢`xíSvÞ®íÍÐøý÷È~«a&ÀÕbv©còÉ|]ðÃCtÌOÌZìNµÔ~=~é¬gf³BsùïcùWÈd
ý¾òÏkîJ!îî¿1ÇeÌôáXLU!.î(×52ïgj¢lÇAÓ¢*T"jx#."V5ùY/CyË]ÆWÔÚÄÄÁL.è×#.PÜt!÷Të5ʤ³výÇá"¦üè7881`sóq¬¬éóòSﶲ£)É÷¦Æz?=µÍ*¾Ho8 ¡æÄûþTyh7i¦ÐqÌ9ÈgûÏ.E9½&Óêvɲ=*ö.Ä94Ëhßúª$Ä&b¼4|ILúq=³f
ù¿x\êòûc½>bG³ô'Ô!6#)¡9º}Hi±#.ûöÙj#|@Ýö#)Å:Ô¥YÑ#2¬BiþX9|l]baÁ!@òÛä±¥ÈÒ(Xatª P¬\öî%ÁÆvØBº#.qÙ±;*¢9.È V$VO¼ó·Ê¯×÷fûº6üXâËÜìeÎìÚÐ}9CBO R\µ¼¦ù×S/@Zs5ZKê{×Baa2y&!g£ ØêÁ¡ù¿¦·7'õ0ìùhðzGeãèqN°ÒyÝKRlr-<+ÄLÎj¦WPÊ£Êcj£*ß0(ÿ¶x¬êù,êWôÜG[²¤6¾HÀâèË9T3¡´6{\=9rÛ%ìvb²×ÞdÞS`Ä*E)3DÖ±ÕÕm#.Þý/#/Q&¢3+U£m+=3*Ö/V¼3»ÂoÈ;¤tð7ay¼ð«`l
uÎ#/8!sE;M13¡ÑX.6N¬Ì#."åËÞ
ÕCvNá©e
'û.é~57¢tÃ/?¤<èq#»[ܵör±$[»±q`_`ûÚyûN½O÷(_qÞóV{Ü'Fqn¦ák>®) FDûëÉ0^Ú¹kÞê]84l±aQY`I$ðµÀ;FûØ0YEJF()ET,ìÛËY9Ì3k5wær·±è§_Làv¯>NÚWn/d´Ä.ÛL
©¨ç8æ;DÜ ÔìÓJ+Ug#¤«h#.¢s=*B@´;ù)xrBàn©èûØÌ8Á[iÂjÝÃmÇ ^1#.:äP÷¾v:ñÀúm5@æÅ"àÞVal:Æ ×U#.akk´3tè7ìh§sÂHZÉÓ3ï°tBRÚ·è&}ö: ÁBb¨2a1Ö1ÐÁTv *LÅí+s¾ùZ"Uû¬ÎxËðÍyÝ&Ôw{8JóÖx4·y8ÍæÀ>¢8r0P#/(KËTrbU(¤P] L$aKYlbHB¯Ö·1¶Èe°">úæ&$ÑáORw°¦`ºÕ
ïÒòA#.hæòaàóÓ· te*6åjik37yyB:0XÔõw¦L÷³å±9«.©ùéÆ>ý9[Äü\×£ÓØmâü½¹G¡-PÒPL@4«rzIqð/;ä¦)c¾\ÃHqÁ¤ß GÏ¢AWÀÈ¥H,]CpÅ¢&6<Ê°a¦ I5HÅ[öD ÖYäÏSwÈçIB:ÏÐmÆ-0ýxt#©#)àM´`9#/å@
,BR*rAÿ `N(ç¯_QÐVØ»¡¹gid2AªØ!I3¸ùÛ{Òbl=#AD¡Û±'vµ×9¤£2§0å{àë¯
ü¦*ëÅ!ÙJ²
´#.0 צa!¨·=`b«ÕîMÛ°Ûp×xC¯CU¿ÒU=aä%@ @ØfPÃÝïñÛï¿£ÇÀ9*V<ÎÙ~²ðO¿¨k³0¨ºqãZdÀR|£"`ßÎ\yì½&àÄ31 °Õ¦½Ó ³2·3¹è^H¢`Ìf tsf0j,ç/½X¯.äQ÷ÙS(zó'wFP5æ]²õl®[²á=ws¤ÛBZRc)R], ^³cÈ xøæmRÂ
LÐã&mÂY¸aËkXxø¥q#½:64Ï-¬åhG êTÃ_J#)¡$øÑÁ)=|wâ;¬Ð÷z:|gVüÎÎ0îã:q}WØÛtèoíi5È@ÞKê-í±òHª]ä{bÃGÇå HIuÃQ¸ãê³+Ñ£ó4Û#.ÍÏÓ¥´¦Âδ +ºCÒÑåèÛsÑ5v=ú [¦aRÓÝ.À©½0ß?ËÁ¿¤qÆÝ8öæûCþNâ¡Oy¼Ü¶¨è«×)×åÌÝÀ$Ì6A§,C~#/±\@@ìÏBþ·8ËöTçvÄi¥®áó>{xÑ]FÊH·MôyÑ"¯:¸¢#Hï¾¼ç&Ø¢Ü\êÙÅÇÉÓ³ÓF%@$àþÔI¯
@R" N{ü1!Î¥Ê8A:9+b¨è"ν½¼sæ#)«1$«R
!f&¼¤2D´=¡%7y,GµÚCäÉæMP³öÐçvÈ*óúa{¹·¾XìS§p>=Õ¸øfÃ<¤><)Ú$I
P¢aÝ6ðq i¡&BÍÀp}|ô^½½øK)[S£yûþ¸÷UXÉòû¡,Öÿ>:ÎïwçQsâ"ÇZÖ.ó|ôö¾¾
¶Ù;j¨¯q½Jé ¨m»¤I1{«ªÒp8à©ðBÁª¡(Ø%¶w+Ø«îõKf»(á&wÜ)A6¾WgÐïÉ3´Ô¸§âHJÄì¿"zúÔcæ'Kðõòå³ùmïmÄßå6LcÉÌÊÍ>(Õb1]JÒ¨7M!²m~Ñvpøo44qãCM6åKvñ/w±VÆ3Åü<~økj;à8¡¯-ol Ïr_Î`þEâ«ÜSCt4>?P=IÈ_FM!5HªÈÌvéZ&)lÊ«K©Ç]!ç2lE0íÝF0qäæ>µÓv}mgnÚèûÛlxk#.*Ìuðàaï±ïJJb--,àZÌøý°4ºm3³1Ò¼&íØty5·O9´[Âײ°·iÀ¼Ø©ðL̲:ñ%$Äf³yø:Ø!C;5ñ*%§#.»ãvóɦ©ëbÐcpm-ç<s àìb5&ÞªCÁó"hɲsÜÐDwçb0û4óc0e!pÚn)°ClC!½×uß%¼ZE4±hô×U%Jf]^øm_;/Oä.»L¨Ø7q¢ìhÓX¸Ü7¶æ$üâG«Ël:R^ûgC¿úæÓEEèÃíÌÖ
Ø`ÆcÞkÐ@ÜæªüûFMdaáܺpgGó/3`T ùúô*@ºú{QÉ¥
Û!øM.Qy3ÙÏ=c¢Wç~ʦÞYµ¨LlLnÂL,S}Ö]¶û®c5Öö#)@Àáö·#)Å5}]4~;·àû ýr4lx§ ìHJ#.¢ÄQcïíÓØ$Ð&ý?)`ZQÅoÅ¢gÙ£O¡*ÈÞìÜè*LÄÏkßÚª¨wñáé\y9Ð~H ûtȺ#˼ôÇÝååå¥ÔÍPÂñ_)äÅÐ>ÐdÏR6ïcßnÛ[ÒY½ÿzS±û3ôb©½ðuÑóí#)b@ºÓA<8«w«@S#)b±5hö¿·ìÝ!×gÔ§*¤Wù? zGÈR©Vûc´oÓèòêÂ,®°ÐÚÓh½}](lQò_ö°èk2pÆÖIk¿ãL¬òÞ_w»¬kùý¼\éÚf,¹óL4¯ò_>í8k"Ýr0ͽö(f½ò_ùþ¿Ûùÿb_ÎSJÿH§BP
#/ÈgW;'dk¡}òü×WuÕE'ùålºÆ|ÚMAý3$Ã0ßíU M¼þ(l6ù×#)áí~þ·úK`%NØîp¥ÜuvèlOù
úÿ#/ÇaYNgbgÌèýïÃKìä¢ñAü?'±÷ù:AÌ!3sõwsîðëãYÉMxÍ"ÁHcvngôIÙ&B?ïÆFA1%ddP§FS?¿%6¥HWó{ãýw~´Ú$ǬLÍïjßñ»ßL¾8dÏÓ³qØY¢WÙ02>wn¸µÞ6º£GäµNy[q]ÙeZO»ZÊk1f¶£~uÜÛÇØîõµÌd9ÒvèÇF»ú«ú§Þ¬êzåC°ð6Ûåò°qþ8y-²3¦éÐùV-±×¿VÏ&AÙ30GÃÕbFÂ-wEsùO
X¹Ûìu¾$!ãÓi¶º}Á»àã Ðrwr6L¦<ØvìOÌbaëXbUkÅÑóøôû3'úÊëøqÀtäÄ6Æ`°V@aÆÛS#.ÃêOôêèç·ÎVòµ&§2(ùýªËiØ<[C½1ÅK?7óÐK¿ý?¶>0u\|1?¦xmÍÓHlöyïí¿"Ø¾Ì µ¡Ë]ìUƾÈ+¼ªWëñð/? ºÿO?÷VºNmÚâÌÅcês®ÛÜÝüýüǤØo#/ëñ¬½R444XLúD%k0Éu¦Â1<0Äqk0ÏfsÁyÂÏÝøêx@;ï8ÇìÿAJ#.q+61 'SÒ^ßc3#)½oj½ÞÅúdNrtL{XoÄ).Ý@v#.åê¦.ݯÔB*3î'T°µíó~¸|RòyFØ3½>f¬ý\ÚÃC5>vCk`xSǹáww'¨ï
JUW#.}=:¸¾VK©Þzõ¬?·ø[]øÓ5ß³[úXJéÍÆ äøTsS½ô;º?^ÙK÷í)ñÊ*~ü-ôOÎð¢ë|§~,>DZNA43Ì9Û÷ûüÌ?Ïk#.çÒû=|ìcgA\_T©7¨ê¤qÎz%Õe´¥W"C1ü*{*Vz«¤·üzÉg»Õ³Ýë=^¹úu+à粯aôéú¹·"x¸Ì$ï®oGìÕ9Fɪëvv©#.¿{gGî\×ÌÉ.rX¿
ÿãçèÝYÐ^ç³WnRLS¯?'FOK!oÕ&>h:ï`l?÷¿xÉ- ËÌ¿?àåÞaIM;Ó#/È"HW}]uâu>¾[4êð׬+ÊdÈ\Ã7Á®Û,1×®{M¤°(«ù¸
á$ߣ³·Ñ7çÉ3¼_¯=2ìå_u`à}+5Ád§1ä¤C6ªIQÞëªú«ß0æý÷?~L¼>¢+7¿·÷ÌÄô À8¢4®uÝ)D¿Kòa^ÿ«ç l\!#·=½ÄÛ³¶-÷O2¨èÄçÜ]-Þ«®¿ä#)¤oÎL1NêEÒéN rc{|bVãÓñsRÇ"½T¼`Õò0þÑ~¼0¿}è¿f½g©öün1/R=þ\oá¨@oqÓ¬Ï.L+õúÃ/_UÆø_4°¥ØaN áâ1wâ`ËK_Ëä¼çXzïúØÁúuóõÛÞÌ̤ãu\¼7í7MÏB¾¯Õ~¼.÷#Ù§@ÅÌ$Û¾(Ç$y4§Óý7¸èÙ§e¼¸qãX1Jåöf6&ºÍ?3oÚ3KÓ®¬å£Zh&#/ãbý´üc³û¾_Ûüwɽ3Ô ÆïÍ*Ð(㩾8¾*díÕø<kÊËyx×M5üHµSAö+XÍÞ+ÌqTRÑદtéIß%=/úäÒêUQä°NεKþ4¸ËÜÿgI¾M¸ëN#[²&æ?·y òg5/¯8Â<µHþÉéßõ§J³ê,å·gd!gß.(tǶço?]nÉßhU¸åùÂb§0öðÞz=/\×¹1Kû_×êÓzü²ÐÌíâ©R Ez?½ºBH÷âå¿Tt(ZÂ_ëÓUaiåðAèS9§£ÅùC¡¦>ò·s_7í@â:ôY#$<ÕÞggÉÕR/&¶ãüWØÉ÷ãP}Ê«iµ-R'M°Ú,Rîÿ2æ«ÓYû1->}TÂÜqKËÞÉQ{,ðæ%ÂfÊ%LÁéûÝ&á±+9¤~[>
+_óO¿¢Æ3VÚ4?Âÿr:Äryázµí,þèfzuîºLzà}Û>í OdëñD-Üt¾.§½eG<qÄpù:¾¼øé%´hæ)VTæ÷R8[¦3Ã#/rrÍøÄ& ®¸ê=º;¢Sºéõ÷æè*Ý%ùÃÃ?~㼯#¸çgK®n}pW̬ù\ÁäºÎïW1EKyÝ%;òBë×YívN£A
OØ\Èêxñí¡|Áw-EDWN"P[@ÉtwbÏ_<yYie>;LHHB¹vøöñUì/)Ne`´·TFÙÂÒÃnXV[Æ#שàÜÛDc<VýM5)íñèÎ0Ý#)¼®xèz5Cê_·SËá?[J£'NÓ¡0ãZc»<ÛüÙ¬øwáÂRBþ0SQÿSåqW©¾tº÷;µIÛëã+ÈÕOgêöÎZyzüØ^-ûæsˤëë¿aøËOÄôð4^·ÆdnzN~Ëçê§NLT÷Û]ýªq,»ÏDU"ÄÍ=~ÏG¼uyÀ÷¶Ã¿ÅñåGã¼YìF2î¦IqDçɧØÞó°' £ß÷¦>èJ=4uu¤8
rÅr®Í;[Ì ðç÷slÃÛÊѮڢtøÿ$?!çÎsNï»Ìy3ÊÒúö0N·¬'ïæ^RX^¦Ùý8¨1Ñ?EÉûzÃdüpý#.T_OÒ·.L¦u»Î®+ Ù4¹RGÇ£ím3²?ÜGϧÃ@Òâ¥Çú®¿3Ó;öGvËüÑ#/@Öð }9Ö¶/S×zÜ
»éøYf9#qÍ«¹ÑiUJ DÉht¶þX¸¸<ÊééT¾|Îú\kÕÝñõÍÔ¶ß:Ì9àôòkâ|ß+éno¥qº¦ùaüaòØÇm4õ/d"U#TãBvM±=5kh?µàGjÚÆ ð$í6¨hÝ«(Rì5êE»æô`Va~(iñàõ* m¨ïªPö¾)Óa]$QY3}*mN§E¼NЩ®¿TBá!èH(m:úü¿¸Æ·
.ÚA¶Ò³5ígO®1ç®ajQåµÜíý\ÃÔ`¾Wºû¸fùkp'¹ÜÜ¥ Ëç]".Tý.¦$[#fÿB,ÑÓ±3Ö¸kÝpÚNÁöò¬d¢Xwó<õ«iÓ% ãçùláôã¿$z9À»=Gú?Z#.ò½íÁàr¿·ß#/Ì ¶~w #bµ]WD¥´v¡óëTÇKµÇ6wi÷0jȳ»ãl÷\/®¡ÇçñÅV4!F#.Åãz|ûøI·ã9§Ò"ÉTZ!ãP$Êt&®Îü`½eu»lcØLg9xÑ4'C£ò@Z=QÜÓV»öQ¿Ê·fRvÜyã\ÐR¡\gÓ2¡xåq/1d§'ØÅ\ªÈ©è»Ç£Uf7ZRv£¼isJÒîÃ&#/ÜxWJÌ=õâïÏßgÅêÉswwgwÖÂQÛYGÕ¡y2J1FfXI)Lè1¤`MÇÚ¹}åo«²®²pd½Ûûº·Yã¤#/Ð,ÇJÒçø1@4qÌ#/#.r#.j£;àZUÔìCùd^CÑ )Ø/oðJçü³§qW×ø×MÞ
ÆÁâkûúv äZQ)÷øü¦xF³=ty]`¨É2Ä"JÛʬ2vÃ;LÑk^_7{òÀ[30}Uh×ùOom_ÕK~ôô.W!Ó#)²»èé*{£»°È@ÀoýØH·óý?¨·qOI:üi:Î$?ãGþÍöÕ<Xó3TÏ PÇã Gv Ì¿o¼Bb;äÔÊrIûÐû¤TE?s$ 1æÇ<Áß)>®)*¤$̶°õ´A~TQ[åèzÛQ¬RòØH:Ë5¥C#)ÜSD¯Q[!KÉþÏgýæûu¡-7µrE>ù:µÒÜ5cêòÐú;FóFa´+¯´®VÐ2±Î¨Hv_8¢@@«Ë!Ë¥ÖWXtõúÏÕ]á§OÆCwg³D¦á¤ ?¨ny¡µËÎömlGæZ/ÖÁíöãsmôªÈù¾XàýtùûæØÌ*Gíå+Òv·Í)}_³EºNäÕõ#/5j<ôhü)ëEÓ¶vi×í7Õ[*Ap³ô±Ýó°ÏØE1¡ÂbbÈÓ+,bRF[NmîæüÊÒI©Ã#.#.ÿÙ濽ÉÛðú˺xy08DØûÇñj~4óå_Í¥)`d©9UYëÓþ'Éz¬¨5pû¥ØýõÉ(,I?z)óüô"KÈys<ÇÌøbW·ÂºÈhÞ©ô/kܹj1ÑI3})Uî^u{ ºunëd]¤³wÖ1lfdjDQ÷ļ÷~}·é¥;¥ñKNgnã#.Q¹Ø\_;'UMO@é´6>¯:Tn´VQØ·#±°1òùßù|.ôá;îlúÅѾbPwwáª)]^æ½8HTzzg>½u61T*#/§ ñ¨¬¥¥y¿ÄJ¥làHÆCÜ6¡ÓÌB T1XC²°,F(k?ãáÏ&~y*d<ËÆÌQëBk¼úXݬ1²·¯ØoáPëÉ.nâ{ÏÕ½®Á¤]۶ݼ²¾s5¶p±;Èg,]ã|¥~¿6E$#.3çxäáÉ>·ôéÃö£ðZë{n9°è¤Ofì`3¬ßuK¬`Ó/ÍÑ>[xHÞh½ ¡ÜüáÐZþpYòW4ÛJËå³2mtD¤¹ö\®áÊ3]:ÐõfEä#+M¿òeÝ>{<·ÃwnÈjOÚ[ǪÉØ|WGEüæó«AØÛ£äéÛÏ͸ÆÂYJ¦©²vXk®7\ûª åVÊôwY«Ëµæ$%ØËÜîsÍéü¸®¯ø3ÍÍjO]Hx2Ðòí«>뺥qª&ýVmú}ô¡9ÜeÆÓ½iézB^¾Nu.¬/8võGäüÎ^yJã Q?õ{=!íß½7Êv§OÕäýÒxÈ"¨&{zç:xè^«áαìYϼýN¹×ó]5Òï±eóûuX¼DM´5Òüq"WV2>Eýé¨5hy&.3-ÃÉSzgê,G®ÌêèßI:¶ûWjRx'<±Çó#ÓßsåUíÒE{óδ¬eQýü&éÂoèÑÊìàéÛÅ2G×:ÉíLÞHãçFiû5ZÞZgÑ®r#.h9{|Op±Ðk³[éÒji²W¡0uJÓ«MYí¤ùÝ÷D2`x+TÅcÅLü~û5íÚÛÆù\òêðG=ÙÄÊ&ç*Ü÷k¸×+bH¯*JÿØÑ[qNdÁeB¾¯Úæ3=}o\èaSìÌl¶ºVË+jÚªáUÂ_ºQÏ%SjwjÅ®Ó,3öî?ÊNÜ|WÝ<vÌ*}`ñYó·Æ¯3o£Ñu xÃ:tFª;Yü{0@Qå#wSºð÷,çô5T>Nß?DnÕç\n%éÜÛÎÔ´¦îÉ̯áFô¨0UrOÍ8ÒÉkQmÅÈÅéNýºb+¾XY</Õ#.{óÜòF·ªÜTFXU:ô#m`xpsÕ¾õlzmºèãÂ4þÞ§tGt´ZϺp£aùºEçMSN7]°3ÍúkKn=ä}fÍDJKºH르1xRmdÚÅ2Ñ_¿q¦*HâÔ)ªS]7ò~¿¤Ø¯ûOÔk½xöñ5@sW¤ñÜF*ã¿zýö5öÄm§ºÈ¤,¨]K¥éz#/ÜB@N>úpóIÄíÃúÙ©I¼ÓocPÏ#/KnÊÞ¸îq/t¾¿ÜV;Q³ÏmbqÎmN;$ÛQô`ø(s¹¹0F¡$ݬ)õÖz¶+µ3öHoõ§Û n3ø®5½£#ßÓÌÆUhÎÊÂÅ÷ÐQÀø½ggäúʵȾû·æÁTÉ1Ü ôâc¤Õ[ÖþJð7l§º³ÏËêÑjÖV]ÔÏ=0b*k5¨EÇÉì÷XZÅÉ[Í;7b+O/³4Ú5Ðäç%F²¦óhgöàã+uLY"ä¤ê4×жzOEÍíUJºàv>uwÁã§9&Ö)Îà åÎÄx;¤Sº;Í8èk#)°ò_PyõÙiæ¥ipm®ã Ý×IJae¤ðÕÒlL- #/ܲ§}½"ôÖDɵm¤åáÂï¦Xµ~7-·z{I³xw])¸b.y
M0«.º·½öð+ê7Ç}T£WFa©öRîV¶+µêÂ
¯>óñmM;´ÒÄ!»VîXíÏ;êèÙq¨s#.,iaûÿ½:ðûUL~}ÐS]ûVi*Ês»û)ÑÏt`ÖurÏG-jæ4Ù\m}Tý¸_©j&ÕÚÉs!3Ã"âÐFD& K¯!Wøm`á¥
«MxäYJNewøQW²ªBØ?g;°Ú§äEÛtt<wÞépgÑ>48\)6eªÂQ¡ýZMüW#.u6þ®ùJ½; %¸½©-ó5!õ&Lorv#/©&Éo2§X·E¶éÝÄ:gÌÔF>lª¸<[±ìcSuJR6ÉP¼Ç·8ËqGR¹@dNòÏÃÄüòÏßßpçQÍ Í7¬Èws*¾ÈÏ¡¥¾éÛ¨äqø_Úcê}ùÉÉìNTéo,»ANFðê¥$ª7DxµQPÐv©Jà¼ÀbTòªN¢îû6 én¾ÐÛ[üU:ð·£Ê»âº/ÒìïuäèlÇ2Ío¾.ª»¥"EThV!!àp£Ð#«uôÜ»iÈÑÙª~&³H95á®6×Ó"~AÕMÑײ±õ½BYáKÛÂèÞ<ägd¦òå2YãÐRÌaÝ]
:Ï5ïN¡j¼â4&µ6¢+5å*zl:õL»LîÑ]÷H0¼å}kñÓ¶óÏNîÇÖýPØxÆ+#.ÕÎF[AåEpô¬@ûØûqÈ/ÓË<^þmhh7Üë:0QzzyÉÝjNÙèuáì#)_ë»ñÇ(ýÖC®ÊwE¦û&9ôÁ\2¾ÏÒ=ç¿Ë«³C!ï ³]n´¥RcZå«ÛÜÇw^î.Æ_ï¬ÕB;â¢Sþaþû<ξ½Ã&öxqüÅæå_Þ=+È«UD®'~z/¡½iG¡ÃS³t&(Mø
µðÈÒº5åãG#7ÖäÉ£M$Û(_áu-Æ»\Ê%ª¥ÉCêÚäpÖÀ$ T}G5ÈM~)]Ö
à~;L#_»Uý²SðßMë;EùáåÙ-Ó¤Ñn#/1¸MiÙµṲ̀]çÝY#.ñq~X_v¡_»YçRùg#.ëªú1Äe}µ>Y8oÏgÜt9_FT·TôrÒLúìc©1sH²õ~/áÒRP;»Í;dÇg%+¿.7I]üoÌ]=ì þ± |õkÃSÙ£AV<4Ëþ1 ßÜ,ªÆ5qáNó}j»nM´eª×¦[1é6=0MRftYd
*bKôüÛ7~oä>?!ñýc:ØêÁ'ü$¬úDµÁßü^uãA÷#é ûnB½Ýrô³y:ìÉ9ç~è~æówdI©¬ÛJ0+ꢪ+=.)|}£N>pqaq¯[NpI~ìÏ)H\6ótÀ¥>8ê}o*×Åalô==ß¹û<Øxrý¯?¡OgñlmÜÖË"îx<ËFýFcêXãÓ0`VØ×\CHþ§kå¿ð}"ÅçTÿYa¼ÝR÷H`eÉØcc¸ÃÈpc)ÌÑç+¯ý¢]ïêÁá=Ù¿òwýjð_±ô#.ò³%Aa¯ª@éÃçôöñ$ü¯÷Ûa4#)ìæ¯Æê ëb¤;Rz
4Xiw,/ö¿Öjaä8ÿþsË~üw$Ò7Ø@ÅÈ¡þÈÃä#/5ÄÆ©©»`2%~®#)1`ÀÅLZ@2CÙÔñ#ÏW²Í©õ("`ÓiÚy0UîÅõ$÷{P³:É"bv`l þÏÐzGkæAô¾Ju{_ zÌ~/·âÁ~Gçy(#|:£§ø Öbf{ÎC`¹*h1ñÃÿX8*¼yg@ÓüÕÏ*|vÛ¤Dyüß»©äÓÞؾ#¸/ópôüiÌöÅå³pöwë*OK=ñÑV®ÿËOQ`ÄfVw§ÐÁ®
iúZ4ÇA#.k&æa®sHÂuxgï6aÖá¸æü\P¤)#/f©©ÔÍ£A_Ûýgñû¨sý*?<LëF¾WÙ)m;ök//Ùw°^IQ Çè?6áúͦ³0@aJ;YþýÅ;pwä^T('ýH(3¶@ÈÁØÿ#)ÏgØ`'>î¯&¸Ê-b2'vkC ¯`$?BÉHhiaÛ#/ûâO#.C<ªh®*Ç[¿ûÏ Òóyâ}aäMû±1áï©UZvTÂ"ød÷ Ä<@ð Ô7ÛC®1ÜѼÆgá-v±nñyÛ´ÃÉæ¯À褢j9#)s0$ ÈcXv®þñì}&À½´qL#.ÁÒAõ[®"L>!ã±Á<ÀéÄæ9ØÅØc)ÃÚa¶I::ë#/Ó+z'iøAúÈüþßfÙ°KùLËú¾^ͽÞÅ£'àdÚ«ÞdnË¢uñì2QæVì0RRHÔE¶Õþ¶oÈþÄ
KðâT1óÿ,.Éd¬Ò${ZBͱó7ÃÊåMx¤¥ýz®Yùμäk;¬tvb) C©%îàÚeLøÊÏûúñôVY}¬¢Óáiue²Âu§§.LÌC{WßäsÛÆçéòû@ùÙCGÜA±ÒWñ7Ø°nµÞ|çJÏmY²4½"*TnÓ¡:®ì"C
ÈLi§åß9 ¥ÅCÖÍøMìo#.!TQ#§OªãíwaÜI¬mm0ô!ÜáïΤL©ÂÖ¾ã·ÁâuÛ±v~ǵpN¸{qï0ÈCýÇÛâ êã;ÌÏ÷[#.æµ2\uÿ¤ªªz§t¡Oæü®æN6õtEg7né$°ïwË¿ÍìÔa°¾sÃ>ÌðM¦w6NÅ»K2mYºöð3âÅ;õÚxé×CTæQË@Õ'9Ï3RÆMBÈ s£cyü)×Mæ<IIOÖ|§¹*!IGùÌô÷@ Èýïø|üó>£Ë+'çQ'ÍþÆ\`T0¥ÑGÜnãû´P#.ÛÈr¦¾F÷Ýqã:¾bñ´"jîîÃòÙ}ZV¢ÏÜ´ éX²H=ßÍçû¿+újbæEdPjÐMü,í#.ë¹;çÈÄ?ÚxS~3þloRoPä7ã~#/¢àvB¦*ÀKÚOè4áÜ#ÕÖÒ#ÚöF}þçñ$8#aæÇäÎ?§ôÿ³Å¯Ð£»ØHIcBxúë;ûÜ<àw¡è<ÈèC°m°6=¼Ò¨nÎÎ`ý!SØ`9H§:wX>34#.TßêqÛ&3Â$åd ©S@"ùsSrñÎ'.æãäx>^³>Áâ]%ûÑîÞ¢b+«õùîwwq#/ÚÒän`lÚ#.ú8¶Ö¦oP=K2[àövÁ,Å2hB¡{¦&Ì}Ò6Æ,¦àÿ#.!ØB?§¯÷¡(û2ú8@»@W"MܲK4æü95i6uÍwÖs¼WZOzDz=Å®öÓq»ÖWFVì|R°cÓ&ââMqRñ2©eÔÐÏæÑrhm2ènØöfhåj)YD"¦+±à-8R|J7T\v¹Ê´e¤ØBj1±k6ÛPqñáö~$|ò6CH#)þè_Ïû@iÓDþÆvýl§»¸_§3·ÕÕcw[PÏò·×ÜýúY¤ÜϨØ×HOß8ðî¯ÖÈ*ª«t:HIrA6 I'g6ïîcÖÇw±'l²O0¨ý$|}¢×Ð^¢¢5ìêCã»?
þ??.9±ýÙàÚäÚE¯Z+WqåWÑü÷y8ÆpSÍû\qÄ]àõuwtà#.K¼)çÙô"&,Ç`æÌÚ(¸ÝEìÜN®¼²Ò¦.³%#5{on¢Ã¤LÂ1øeXoÔz§ÐtLblÇ@~qróCsP!°pù}þT̨D7Ü¿¹ÐÜÉ#JIC!¡ømÛá£Ãñ@}÷qÃÌÝíåèd×|U*ucùMÃÛv¸ÈB0ùrd_x|`!¬ÛÉ*\¸éôßqÿ&¦üç¨4%!û³ã¿¨Óõ2ùNEG\íËsÝ7)Åà!I$è
.H´#)}BÎ#.Ih~cºX}à×Ö7Þyô#.ÖÄ>A¤Ò$Ìq%¸KæIÜ°Cyö¼#.¥Ùª
Ù÷ÒTÐ6¾Ê#áô?,C·päÌÿà?ü}]ºø{¿.á20ËÊÝǤ#.ÆKí${5">'<sÀûzrÌH»ÓVï¡ÛÌy²©éTkZ ìoHiú°DpDØêø>có÷ê`éCtýMè'çKųÚ[¸g A£Æ°"aIeaý¾!AüooGÈë?Gr{ÓüLÎ5A¿gÔÞüâµê a®ý°GÌÁØ]w>3!´õ"zIt{#)î}Á·¸®C|Aʺ2Õ±óäÍ`Ï1s¤®íØÀT 4ñ\3¡'_¸Èè½-
ì¦ÍAh<©¢#/(b¨¡ä/NFBæ=²{_ÀÁ«ß£Î±<Ï»õò;ï#)8°gà>Í1#$>/|}?!à¡?¤Dµí=ÔÞTµ~Pp÷¤Èú=/é7ZUYßfi&;C|2o·g¥0Þ~G?U§©¬â½goP~cÄ_N´]#/9ü¾ÁvTO©C¿ú5Í[ðTäé#)1Ó÷ý#)ß óq#)nanrð¥¼gxòñõë}Ô.5õµ®É99gòtAmEèè©Ì#)põö`ÃXL3TþéÒyNÿÈ53ÞúìWùÔ}gj1ÑO×d$Ô#.¤!»]H¬j¨3;q«Èkø¿:Mõã$ÕXF%²Ân@¤é#"ô¯NcÁþkLÂÉÍq4©TN9ã#.QC +===ò fzAEQ1!®qãÊñ#&Ë9«#.gt æSÀ×¼9O7íèe `Näoá=7ÝÙû¼¤(Ï«¹ñ=,`ÂD¡ÀýiVÕ.ÕVU]ms]ÍÐèný/°ên@q*ÍFàlÍ3v*´#)õAéèdzö§yì`x£ÜN9z|í}mùêîÖΫå!#)òb3&¤¾k?²Oó0%Sþ[»O÷î]X©Æ, ÃÍ8Ù©LÑåy/WiOSPÏÌ8¬M0·^Íë¤ÞÕÏø7 ²Ã¼¨"Ã3éåâ³MÞDÇ?Ü1wk`ÍaÉ5ÝÉÀc´Äuõ_ä:Î¥O=EM#.DPâÙ+x§æcóîÁ:¶OAèÅ<ÇåÍ[H̬B4XXAÉ·FÉ:_í{n«ÞQù fâ4&sblÈ<ù#ÈõÈÍV3ëCM¹1úlÙÈ1äü#.f1AØrÙis¤8ãæPDfvèÂAA1 4&õ£a¦Ö,WZ´´|ÜF.=CúHcÐvqüqòÐlÀ/2Z8²éd+l±´ Jûäy¢D
GiBN!ÐA8ô?(À< ±D´æ¶'®öEbhj<¦ÿ¯T*c`tKv*âBõ1¥<1ÊCðøè§òùln\(*wä#)á&|ÿo£Y§§ãÅÑØ
=¡à¢&îÌãp¢©K¡z4d>Û8×LEdÊfc/yWÃ×k;µr׸ګÑ*fÕ62L¤i¤Øÿ#)æM¤:}]~ºåÉîß( #.H$Óê¬;Û°éô PdçÔÄÈCõh~c·¥±EZ VÙì=Õ³käÁô:¯CuÃ0¢R$#)ä±UO¶l#.$1½CsÉ"Õ3¹¤àm~ìF\ôÇU6Õ¤fÅd þT\^!à=c<];7£±þôaY¾Hn#/#.«Kk`¸Äjm#)E¤Üð#.´ÍWXûå¥Â{3i¸Ø:¡[$Øî½þ\ÂyùÙ@)\¯´Ö8FäòD¾Yµh£5TÕHBªÇìÿÚæql^ÙÌãuÃAöÎpÆÅÏõðiùú¾IVaèt#.A¡#.¦a$#$Z6ÙEîÏyïü Ðjo½F§O3!une0(ÆKÂ*QA¡ ÚºnP2'wé#.ƨ릡3¯÷Cµ'!L¤C¦ù"$?0(òÇoÏùIúv&"/SÓäçèL@dòãàpe²=aQ¿äþä¯Ë»ûbëÇaÅ=®îO§Pg}ÑÕ4öÚI"\LÉ9¶Ä}ÈRkÖ{ãð6ûBU0Oä`oßñÏèÈhÈ(Ø©ü?~vaÉþ#çÀ3:y]âUÅÞÈQ0ò;pëN@,Í8?àý<ß(o¨Ã?<=ííônkDa%Æ a#2JÅö²%jJÍÈiË¥P¿©ú¡-öÖðôAò=?xaì=cí=G#GÞx#/¸*bÂÒ'»ø°Ó´7v=õ61æâõ^Cû8;òÇgÚ'hB¾GbAú]ÍÀIGB¯¯óh6RMÄ«K#.Ï°È1¤:î¬mLͤ5íÁ(VéHP,!0ÕrC$p<x:,õÙRx`çaËÖ¥ ]x·¬ñºÄQV3&îlxyùtºÃ¿âè¥èÔï#/#/å$»òÐÆ#):dØöp>î[èP²ÉY#.ðrzÔÏjZ¤©GZV
úpï£#/b¼^¿;HÁ£ltwD³e¤Qøþxª¡w¶A! tE¦5s~xuNm£YÌ×úâ?½l²}pîÚÂ"ûçM\Ï CÊS¦©v¦Îk%eQðöîËóöÕèÑæ:/ ûz½Ù2A^-QÈ<#)úv[]z&áCÖ{_G{Ô«ð zßxóTÅ/סåSýÍt¥W= rÂÈ2°{Àì^_¿Ómwjâ><U(ôä¾k°â±Æ¢D¸³iÔC°Ã$ãâ}]@rlÆmÈ#.ÀùðÌ33@¤ªÉtÉaVd9OWC§lóÜñAhã°6 ù¦-)lÃ0c¶1ÍVÞ¾äN1Úy'÷¬_r³ñ#.ÌîûMLz5\»ðH/·c ¼>F=þ¡oêèåÂgòÖ3Q[À¥Ý¿Ô¨fzån,ÄWغ«?¶W òÕ#)ö~Ûèêò±³^Âzø&æV|ýSó©P÷ýúÜÁ¦¬g4_ìûò~Hï)Øç}&Í_¼U=rþk/8ê¥}åS¤ÇÄ-ÎÔ[³v@&)¨®Zô1קçS
®kªÈ¿¨Àïs@¸,cdÑ\T@BÓ§nt~Í°ÇÖ#.L#¨3.èb~é«=ÎãÈcHh<Ï E1?$ùÒ=Glþhd 3 Åõ#.#)ôP÷/ô?8ø\E¡´:}W°õÞ#/x?é¼²|záï&çdÓÙ=5ìØBC3þ~§¼ Ä¿åEo< }¾AQ!e·%Ðìç;&`N¤È{ h4Eø}_#ÙôÖ¶ØE¾¡¦&6ö¦([¼Õ·Ü½W³zúAWi;'p>j^rä!AæóaL7-íci«þTY8"éÏ97Û.ùÆWÕîàü=§üì§éÖS
sOçËMl p|0IÑË îWbV ¨!¢h=±{¨(òÅQñHæaÛ_oÖs âfê³U÷}p2¶nÐX8² D~DÐ@ôûPôDGÈüó¼Z#)]äBek6Þè#)Ä/<k¼9öô9Õìè=LgÃnÑèz¡:ØF×ýï>ÿôwEæUØ~4$êFvbí¬ÁMÓµ
dD÷ýîÍ Ï4Īðg4ÄoÀ¹[»þM«lOoþò#))0]5ß÷êC+Pf#.£NfEPïm8É'V&âÊÿ%&bEa Ö)eÔ3jÓ©ÝÝßp&c»æãæ&'ÔÐî®W[#ó©Áå[*¼jÈqd6'9yÚ_γ1óç$¿ Òc¿ÃõµE<*@±0~Àß>¯4ò~Ä8C'nóy÷вòE2=m½h8ÌmÙ÷[¡Ihy~M³ÔÃ#)_#~Ïeô?§Zû[«ü}QÙÌT¡÷ÏGÐ>%ËÛ£INØáääÀ>è1ÙÅìÖé³AähÅìö4ÃE"I¢ò0Òí¾ ôQþçþ8èè-bÍ^ÜÅ® 5`Öóßï÷ïpÈGï¥Ü5ð¶5Øò1>gÌRe¡0!#)Æqa°aèÖ·¾RNÛSjÐ{=õÉjiûÞëæïRgþñ@Uʺ?#/¯¢±ÚiþÇïíC§ôJa0!3£,¬&ab#.f´ Q@hÑdÞ)_é$7ØÃsLQ0àJjD^JĤh+1T¨Äi´PdAF1RÄ¢S4йô 5éÌ4ÿ±j3å#.Ü+ÿ¤$-ßzxÙº%)A~ø~nñÛvt
þ=ªJÐ1+~k;k#.0ÅÞÝÀ8$0Ü2I1â#.ïº(äZ9&¦Tê4ÄrqUDÁÂM|ä«(;7Æ;/¦ãGÐ8~6åä%-@Ó8¡Ð"ëúpúó7íýØþÅÈQ×æð¡ç&{§l%ÃL××ý<gI]ÿ-éF¿wèñtc;±°øЪ1QÁZoæ!(¦¢´%°4äÔìíì²vÉ[û?jBO\ÊÒLÎü9ÍT¡¨| ]!G"#)*¤vPüVN÷«4e*v±EÈåÚ¡¡ÄÎcÈÅGåÏ¥-+×óáBlEÐÊÒ©PÏßùú&¦ò~ï<òy÷o[D32øÊ:ørT2D°¾}tþd@.ARDsüûl,ZÌéñ7·ÏThdy¤9Xüü¥aG¡ìDù¸ ±¹Z3iÛ¾¿ò¹Â[nV¥ViÄPb4è²b¨ÐÚ0Çîv`â)Vr `÷lv¿¼túWHüC$ÝÓ _LteÃc¹% +Õ×I##mï#.^N#C«ïZAL]§\TòrøéôÉË*fÐ| ¤*é¤EêBÑ,¤7Bâ#é8ÁMoPüämÞ§BÆPl\`\·úÐÖ<Ö¼ ê&iZr úKÙNOðP¿Ó4×ôîÿ4sÞùrߦ!ß\#åöyd©ÚçÛ1ã8òE>fñ¾Æ|´ÃdkûN[×|Ù¶éÍ.¡2Ú#fwGËæ·Ë\ôKضA\ócSä¥ÿOð+h×êf!¦nÍñc«Õýjÿ_-î9>S6#RNç`²,6µÏÂY)jöK`Ãg,O(j+'BB£Í¬Ø&çmþÆ+áÍÖ¨[0ítn¸ïÚFZj?.&õgy±´2i«Ûîª)ѱ¶«m#.h,×8ª®±2+òL²~¨!9øÐË·úõ_ ÿo8Kâæ«£Lé¥û#)Eç9±[1¹ãÐØòÖ¼ÊôÊÃIïíð>Y#Í80Ü_Īk᤾QoÕnîR¢>{>¨Ã¦¼È,Ì·)}¥ù¼ðy?ëÇ`¬xéH5ÕY2¿Øé®ïI¢ÇÜíët¨ÔgRæºÏmÖ]¶×ÏçË]Ö$ªiJÓ`¹¹e*¢éÙ{_á/8k¶R´¶ÃeÙ ÊoÚ/Go3£öçZÊ5ÇLwƱçãwÇI2[i®»¸èâe¡¯;¯#.7£2õRÁ$ÆSÝæýÏ=N4köe´©fÝzÔ!A¢Ò ?%5Æû"I¥M¼Â2WcÓð§=5ZѪ¹lI«´Æ!6Jù6Äa1ÌÓäû£Vr%N/yyS^YÞîq/!0;dC»«æepÕt9s
RG1ëØÆÞyÈgX5<ÇûPÁë9<¿8¼§¯A$!LÓR¢¦hÐjRTÔ}÷KO4ãÓÇ7Uî®\b¦½K ®}ïÚ¡£ó¸Ï.KfáÃB³Fáæµ×wù8X5L§9ú?YèùÀ¿§å³ç¿J4"óO[È|%Ͻâ>ø¦ÐÝ5»ÕÓ;å\ô8Ù/¾î¼í¾ü$øÕf¸ZEç7¿'mͦîÇm6ôoôÅiõ;ãSùtr²îÇ#/ +ü½;Cë&³÷syºãÌ`X©UöcdÛó»Þo¨Õ~aÖ;Y)z\!%! ì\¬ÍÀ1ó»S_Õð°1ÛÇ4PøÖ'&RÄ?c&6®ä2Éé\ÒùW^¾Õ×^iÁ8²ië`h1lH(ñøQ}Ã?×Àÿù¯pûîûïºxÇ 9H¸Çºí¼ØÙ¨°èå<5»ôCúJÞ¦'ê¯k³0j:^@K£öAÖR²@ÍjÜ`ûÇ,béUOàïdÇf;ðÃ$YÑöÎ|Õ
-ÅúqéM¶ÒAãá!Þ_<YÞlÒ#{h9øL1<·è]¡l#©Q]+2FS'È1XMÇM9Ä3¥ËyQ¼Ï´ùèì
Ä dáɤÓFzÐ6,HÀG#ß@S °ì6tfJ©Öï§ù¨ ®#.b´)u-Bív4ò* ȹWPåÄ;H\qÕ9ÁÇÈù`ÃM#)ØÁb3 - áíe|ó~ntþFX²d4·ìüÍæý3-½7iÀÔ8r9KE²jó9ßoËÓ;DÇ7#/ îrtlÎÉK(gWÊôÄvvGá@ãF³ùoù/¦üE¼w0Ó_R¨ü&Kóõ9#«¦ýÑ]xµ ÊÁÙùv±/í¼ÿ«DÆu¡aÆå¿õã¢jYm?W³ì1²²´`ú¿³ë&¦ýýñ©AÀQD3¯ï³|Ïßø¾¯Õùi0ßAɺüj_1úÝâ¶ýÁ&bdÛñ AÃ^à+Zæ/LhE¸ Vj? ^6±(èzù?ÞÃg}Îã´Ä+&F"qòlÏÓi!²#.ö¬ÑÇk¨!àØ=eG]0`nÈh`ßnf¼yQõHx@ oÞ¬"ó8ض¦|É[Op0Ô#.áÔÅø^1ïÁþÓCP##.ŶhoÜtõâÔ£Ö*)dPVà! lYÐäwÿ¸lUUyÕ7$SÄ8aÌ^§<®@Àqíóö2,Í,^ÆgÚ}Zý°Ñí?HCBv`$KZ Úñ<¨ééh¦³Ú÷yâ°NÒGÛ»úÇËçßVñ
föE¶¾Ã>QNê5SfXñþ:?®;¤i0F#u²°ÃAR#)ÃÆ#.@ ZTÈrh ^É1ÙE3¶q2#)àúÓ#.Á§\ì.þis.¸âØaµ`5«±ë6Ìa%( ÐEñ]ín;6JMö£½¹¹õ+×;%Ç×ùçÓÃ\}Ûü^ÚÖ_/nooß:OݪÍuÎ_]l¼}·MJï3Øî¢hüçcz¶rW¤æc¨8dÍÒþiu±¸j£#.õ£RFádA ò¤f¿PÃJñùPIHÅU!#/êýeüVõ3YK¥úÌJ0`Neæa¡1>ï¼üíeTUYjÖyܳùa ªú·2£3HtQ¦Åߣ¾XïßD;Gúçgag uT%¬&¥¡}¿ÊÜ;-®§@éP6ÄLXtY ªöb¶Õ/^)#/y4>¾æB½68FÒr#.5¨4Îbq©%MÈaÿ~¸ÀYM²sx!QYÆ;wÖ&ǼL3{s#)"ÈI¢?q£ì8Ði¦#.?O¾I°÷ý{$qϯieìË()+Û«mðÏÀáq¶Ò+pA1h=¼ðH`x£»Mùg¦ðòè)ºÇþ¿Ñ&Is:ûXÎ?$ÝD0IüCÄ#.!Ì´É´±#^LÓV¥#.¯ÓÝî[6õìx<Ux#.*¡M#/±µ±qSndk1°@¤^[_#/Òwqù7IÛ%¯vPv>¨î²(ãÆtiM:t¯:3&7vÞ;V<$qÅàHñë\]G)ËgMÌÎDbuLßæ6á"ÜÑ)²½8غ±0u"q]Ë÷NàÝìÞC§b1BÓ5kmþÙæxÌľ밨} f£l`â!´j#)có¨·ww}¥Zð,qmf5b#/LÌÀµÈìËE[ø×}¸ã9;dÕCdÚª¨_.¼{¼9:né·Ó^÷7L4ÐijrW/OÔ6oÅÄìÎê{®R &TƹÍiÔÙPHÝ;åÄpM/£¾zè·#Ûíägóöz"T$5ÜíÐéÑPÓì§w+#½#/1hJ£h}û£Pà»És}r"lh@â
¡áÐÚùÈéÒæÔ!31¼´´0°Ô·èë¹s2P^m#.PÃ=¢ÃSF¤Ëz·¨sëÊIô&¸JâÆ9MøïtbP^#/¦$9^Ñâ1/غã»K2÷DÌ2ØóC j)®ÐÜ} t×Æ·ü`¸w¤S0
³ØçÁºm¹¢ÂÜcÂ2Û:KEJìF bhnÍê¼ùûS^ÓZv¼'/N8jöæ9ÂÅ9>ñòÛ}°ðò³mÅ%J#.¼ÜqóεªiSnS-.·HÙ KÄ=O³´dÔ¡Ô§óJÒ%è<¢âYÕêr^£#"0Új;8¯d{NæCðÏMZ=F¨ê4çlt'&¢Ê#/rù<mç+»Ëç>vòcv #bfF|ý¹©%#..f\y.ffeÌÌXÌÆècÌËà-Í>yµS=ÙÒ#/@ânú2ç!1¬X !ßT ^o#/ºdÑWÀïǨxS<äLr9Éåì?²âãßåÔ
½y×>{ä]:é,F`ÑX¢¯Y8ò¥qX~*ºu¶pºó¾"µlÝáÏDΰL.Ó:ÐØjebÆ*Ya2ALät[Ãçcã¥g»L¸»K3ù4AP;o#/U3DÇm½¾Êë»2qÝ(.Î ÅØ.b[Ïá·VgaØ¿#.Òñµé!ÇFjFlf XÀÚ-ê´µâKÜ#/Î
)·Ï¶ùUFÑT±¦XmRðN&ðÚwC.¨¦³²Ä¿óÉ PN³¬åª**ò,gR¼å±qª &â¬$U»ûe¼´FÁÒà×#.!c°èLK
9bcÃ1!=üþ.ôÀ{7~¼òOïX4OoªqX9lÏ4|K3î'áø·« 6ÇÜ m£¦³è#)¹Iáãzc¨iÒºtvðQy/%ò]ØFê4sÒÇË#/eOtÕñD=¦å!48(ÒEtTêѺ+gqØêuÒÙ)ZáFRg?Ûûæ¯AÄEPãXN=÷Xté"¦#/Ý`îU3´0h/ð&N§WLr,d#.qéCCiC'xCi1AÂQÖ.Åøf®é,9PFô2c`ÒÆg·¸-b*þ}#/ ³,YHɹ#)ÆMÇtóN¡ØÎí8ç5u)Í2ØÆó>ß^ÌôƲÚbÍgá`Öð)Ï°Gx£#ôÐÑcÚ1@5ÆÚâÆÆ2dLQ+"©h@ÕÚ:Ül°ÁrÉMVÎ2¢x£$ØîÁXm¹¹MR,Èftö¶ð¸¦©D½ÍM{,k>o@v+r¤S¶Irû²`dSp7iï1â;j]ó;[1õÆÐ;?XïÔfZgPd#)Û>F¡ìÃ9KÐb'Àc÷À[o°wrÄ`²5y¯áòØÆ¡Ï(:_ШR<Î8âFùÉdmº{U¶ÛUV¿?qÙË¡e#Û:öùÓtg Êy3D]v$¹íöbÛN'V1Õ¶Çxy-ÛÚ¯xpi2.ÚÀ1=ÁPZo±oAAap¸%WEÐo÷â4;SÉ3ÐÉ,Ðð@öq5¯->|#/ôó*JvI¢BÙU÷k6ÜÆäÓ?qBhÈ°ä¹Úí*#/éÏÒhé§o®´
Ò·3ÇëÔXº*ÑÔDÈ2ü@º´ÕlÉk£WeÛ#ù#÷ ´®Á ðàÚï}+¥xöfÜðOùd1©ZZùÿó±µyu#)Å©L8WxÚgvmÜ ôI¾ÿ"8||ÌÃ#/&&"2 (ÓI&in!ãÔåQ23¯ýë¸ õÙ] + ¸
J@ør<ßÞ_,AÑäå( L?½äú/ó!àÿ§þ´²Ñä#.Y"0ýùßwÁEosnHc0D ÿ->¯W¿ù')]_«àà{¬Çbäy1åæÆ|iaI¥jM¼îÖRl¥·Ïn¼9ÒpKº¡¾pFjÄQ¦?Ùïk×5´[D¸~Rúì³·³8;CTjÀ]øí{4©ü Oí©6eÁÉ#)pQO.¬#)âxkç_,<4â¾×£6öóÂ'¡ÚóÙ+H{Åüþ,A;8C¨_#.Ñû¸ò"Vô|Ê E@êSÐèù 'ÕbA #)öóª¹þ-E#)ÉLËærÒ¥$KZ_y°Ì[1Í^û¶ñZ"]»iò8ÃÉÀgcÈéD$ÁnÞFHä
ãO&Xûsdï3ªÆhÇ/?°Ä5 $¯x«Àð,ôcðàãÌñÃQÁׯhúè<¨*®Ø#)´L¸{Y¸ÒÌe7Ãò#)7¹ÝÝòBösÛ²àöH@Ð$C #)ü#.ìíDª¿ßAAXGx*À£Üpû`Owz/Âùß;ê`K\ë
Dm¥©DP)ö²¶×ÄëP5°¦1#.ÂAØô#)¯NåÊôúzôèÝÚõ"ñ¼4¢Mõ×o¹z©skéwW+ÙÞy¯;®ºãJÍÝbå>3¯3"¬8#)Ä#.<J&-x8<Bjø÷ãß)3$l(&&¼´¡ô}#)ÆÂȧ×nÂqÿ#. êñcþTU¨ôÂ!=-lÿ.C³ë\(¦ÛNHx%#.2´§hðÏb1-0?9%°Õ8b-]#UI¥¸ú5èÕ¤éÙuÆYòÀ8î2¶íñ,#.ã¬0n¸Gp(Tãv lêfIß?w¼åx}|ûD×T=à`¯õ±÷XAêývaä%òÙ-ø*êÒ)ÀÊG£$6INM#)®¨"¤mX±´qëÀÇbz,b`W½E-©´¡Âó/+Ieæ¦ö#Z?"Mb¬8ý8%sS&ø»Ù¬ü¿llc°õt¦> £k#1ípÞØ[ë#.½%áÛñ8¿zôyø¥={ùzÓ,ô9 ñxÿYáôÈ·MD>í&L0j¤Ì¯vJêÅÅ^Hyüì~?wäA¦2ßOw`wy- èNX¾ÐÙbhÈQùÔÞ鸣@Øâ£ðTîïXãdó³(§´NÒ¯w_s«#/DÂäÿ#KªÅ×¹ùOÇKi¹.k#.43°¦xp¯ÉÝ´ýÐÐÌÓ$8îÊD{`»Ø^ÉÕ@ùJ
m¶6Ú1KTdT¢MlU#.µ#/m¦¶5e*X#/#/e
XE$D~rWuø®ý~HÊðî>ÐÈFiCÇæ¡á$ÁêõrÑ?#:hÙF
¬a¤FüoGR£[Ø5¾Ï-6ÈËðõ¨uE±^¨$#.à$Ò257Ðk©²bzf¦ãe¨øXÀ0xÄpÆ8ò
Xjhi)îäº\_p±Æàzó~@IÅWåù»j¢«Ô!"¿(S©Xv3ÎÒ0s¥Z"ÚTºpb!døaGßôGÌa0 !¯ÀFöâ c!7]ìf ´hÅfUôg5#)ä¹$AL´%*{!2JT5'Næ}öm¥㧹ÅC±öEa¨B«ì^jx·Stl"þ£lã7gg0PþdÚrÆ36¿?3B}oÃ>¹_fH
?z¡÷tBùi¿éÃg»Ñöý½Ýý÷\çC+DHfâ"$
÷yàÛÀÊL°¦Ö+dÀxNH§Ø#/ÉøÞjHa1(dÚ¢n{ù]_3Ìïïí³YÁo62ç)BþñEÓõr´?þïõhüZÄóÀ Å;x«mÝÕÙ2è>±¾êÒú~zÕû±Që`ãuÂ(îgÛæ5 -$´õú_¨Já pÂ.g46þfvÇkÂФf@zÊXj(¦N ɼÖ^N]ó²ÿ_»ó£È`qæTY²ui"wi;K#.¨ß~ÂßÏJOòI#.ê#/ü¶×ÔvâÔA¿«a[HÐÝ.6¸k'Û3©àV#/|>/¼ôûds%¼8B`þHoL'´ùÓ~%cxLÑðæ¢Zà(i©³O9''M0jë`fþr)ÓÏæ%¤8¡á)HuÀû5Ö+ÔØS/¡âÕ 1¬QµYâý#.¹o<òk{DrAg/)HB1¦\áëðÐR? þ»®9ç3Ø
bMÛ¢sUkImD*QÃ7Bf¨§nðYìHù´Õb_°ÄÉPø¾ÀöaøÕCÔýI¶¡õ ù°oujB~>ßýå=raû#gø¿#.n®ÃQÉ¥Li:þ?³·¸ôçî("Z<0Ä"V! ¥óü|wAS¡ÂX:q@¾íct´ç¥Lp¥NÐ ¥ÐÌK0Z =õí¢§*p7x;âÔ¿x?pÅUó- ÆC²/i»#/ÚÝýÏðë È8.ú"dÛÛ¹ìW®ë¦+ä"PrËád÷xèhÞÚ#/ÑÁúôiÆöÒøWe7ÉèrKæÓɳ¬´¾&B´#PrAãßÞ$¬»{ù\q2q<Ô¡0ZØÓÊD±d´&ø¦àÓ;*^ù5ÙÆJý:és°Ö·Ô<_Fð7ÞB 6wSMWã~K5[ãv%oC¾
:gk#,´avéâ¬Va¢´A#.2Ü5M°¦WÏ<G¶» 4jÐâû¶ÏîçZnëtÆuof~\L%ÃÖXK9^ÊÞ¸®UpׯzñÒ¬ÑXèHØÌLÎÑÞ#ÖübVÓaºSÏW*àb<²|~8Í/Ïîû!¯åæcdjÖwn®ó;v·«mLXÆ«¼[Øv®#°ë;yíñ+2÷«#.ÑqsEÕ&µ[~>ËÉmש¶;ºZºlBy®\·$Å#)çf÷óÙ¢Ü +¬òÙåé« =£°ð¹p<áyllÛ³Ñqb~æ·¼0ä\×>ñµÆ@£á¤àW¦ËPd$¸úp׿+$àg6LË`×YGT8ÎýÏ?oÙðO3,;4ÈànÝ[«`=/s'äÒòKtF(,Íí ^îØ!~ÌÝõhkSMZ.B²GT8HÙSfF±ðá¦øf$#/@íV:L17$K8Læõ©ÝÖ5:&&$Ü;ûý+×Ë`°Îe}õâbjJPVÛï÷}tõú+{6ß!" Á0Á1êzÐ#.|sî{+71CÂ0Qßy0É!°³Ôɱ?×O ¡ÆÍc#.×fhÁh;m.#.ë´ÛWI]U5ôçîR2SR´ê¹ ÷ª¬à¿HƽÓn|uGI.ü#K·ÎM1ï^ý96gußJõQÞÐ7Õøû%`³tÙy4Èd3r6 K_n׳3-aÙ·ü¢QzCt£¨`V×0ZI AÌide)65t×dî·Rd¢,ÀC3<¡²pÌ0MNNHVBj0Ö-!]¾cqwLv4¼=®ZKTsàxj¢¤#/VQt'dzv ©¢(&B@À$Ør¥ùÖ ù$ÒÐÅ$ó×cËÃð:ñèÅð¯»Ës6ç88Û Y=ÒÊeeWÕ]v>ÇtNfzõSSÄÁõíA(õÇgì7=x}ûÍ^Rÿ )E/pÃ@¨nï' ]_ªÐ*ÝÙaÍh¤cÍCF!nÅ»~Õb³~úI_8©RnSB ½3| ³[Fq'ÅM´-:*Ó^wÞħ߹æ§$2*YÇ*å»rÝnÕÚÝÖò)yqw&61ÅYUÐèÓõìçB×¼aó ;æ#)¾!SÚw!ICa"P>mìyå]BÑ.A#/Ä#ó£põ¬Ë»*ú¯Àíñ}xª°¶ìú)ûª¯^Ç5+Ù¥yè? ÆϪb Wyfåyð%yd¤L6£k#)mdÃ0n`øHÌ}»5㬵ÛxãQû½úWHT û³o Fqµ# ÂH1R;#.4Óu0HL7±ý¶°R¤Ù|g(z|zy··&<©pØF»UÎýg8¨Ì·èM½z㥵E2h¡P=GG$hÏ1÷5I®Pç²]oÇ× ZOß#/¥%þ̨I'9¸¦!_SØ{{róû%q Ý#/d)#/>Rñ8qÏW&|@ùó9w.p.NÓÙ÷r#GF qÛ7 Û¾1÷èþ3Ϫ{ÇCõpÀC^*ªÚî¬8ÌV£#)Vy¶ÒR¸h)6pÙEëÂ4Âji4+ºl ]ÂRbÞ!ù è:#/,ü;Ë5rnP@Û(¢NIB<¤ dÅåÎ÷e+ögÆ3ØÜtÛíÇF{S)|ê¦Bà<ÆqT $.¡¬K!L!#)È$#/ãl1Ù|ÌYL;µQ²VUFYH#/7àqSWIСen6\$Ľ¡¤)*Æ«x¥hcemðÖL#/xÎ-CÛ]»µééÛ^/ É>¨>Ü÷4_áqè6Ù'×Áv8óôQ||ÙQÓΡiva-á}§FÚÌNJC&`ÄFËÌû,gÒzËd@Ø©T1
1z»PIó0vzjáétQEvH[aÄäpÔ=ë4,ñF(&¸g"Vè<'6h KAHíãÇÕ¹ë¦ÍÇ6ÚVd6p³Àâ9¬ê@vP¨ d?Ndë´ÞNe²s( U¢IKÒøúÏìHJJ jyO2ôø~n¹Óba_¤<Ó¨lÛÉÛDÌÌêàWhÚÜåîT§Õpg&¨)F""(´]ºÝ¨bÕ`&(~4`pS#.ÃÓQÆçëÍ(,Ä{¤Ð3 Px9ÉÞÁý×F\"°qcÄJqS\%Å`ÈDÀhT#/=bQ©2ÈÞyESdq³[ùnÐ 1:yÝç¯Di%ì #)ÂÇ$úðMâ,TfrOÛÎ`Ú0öïpÒ u½¦ÿZßt4ĸ0º©@øÝuçV|ÖéÑ'|W¸ØA %<çwv¤ÃcvZÃ9
"§½[&úRÍÝc½}#Å·ÀÜ`³§·MØç-'Dm¢242àB0æË,¢C¸')ûOCåx°=BL2 îcúüAðhõOVNmÙ#/v`Òlu¨jG,ºdÔ$ÕèS¡.6ÎýbÆhÔ0eV"Pû³ÍÑi7Õ@j{¦ÒåRAqväiÇj¯DBQé#/°¬ædd#.²Öbe¥h¥(`Fiié=iê`*êÊ*¢XôUٴа<RQÖó>ºçq&èÿÉõ#ÃoݬO´oäÝ](ÜL½dÈ¥7GðJsqÇêm!¸¿<©Ph+wb;Æc+gWtF¶ïtpï®ÿk?ÌÌcqÖ#.bÃ~u#)à `'@d ¦É 1 ï$g±Êá#.Â4¢ 6ÍlXW &C¡d©·7@C³
»gDPPA±#ÎBè-#.`µ°©";FÛ/BkLFØÌDZcð8ÓThfáÈ4Ú5ìJ!8Á½®X®HPpLn;`ëéî%Í?§_©;wÆqëÌÄt\b#Tfè!UÅF`Å¥1xäÔJ®F»CSj$þ`¤4Âé¡ï698Ǥ³:-èpÀKz{ËÁÄ(Ç\l³·ªa²È¸:tôÒs,1ßÌ·|0Qó&=r!¨®'°ÐNRwèM¹çÊTê;°vë:s #.
ÅUVÉ@cÐã\ÚºêJoãÆÜ;¡ªNaFn]ZLb]7(áhM LÛcLYö2#.þÈm²ÈãǾ<±V}%ØOvÁÝ¿dæ»a¦6 4øRÌ.¸tªl!ñ8g8Çp&À8¿ÚæÈ)hÜëøs6ÃÞ&Ñ]¤ ³2L2XgBà#.Ïyd[qÌã H@À|CHðZ#)ÄÏÑì
Z÷¨ªt6a¥.Ë8¨ò6f{ffY²o&àÀ®M½Üö#)ù;t]ä\XA@hÇ=²dßB0«5 ,RIRl#¹¸ î/_HØ8àA%`=t$7X40uRÎÆÕ#)îú9)º¶ç_Àh) È%õWݼßÃOäm5G»fI¼Çò÷Ss$ÿ)ì.ï#.´V¥sÚáX¼Õøºãì'r@F «Ñ ±Â÷`zTÕS4-_SxÚñ&Q5¢¶Â¥¤r#)JU"EZT¤¬%Ô¢êJAÂ01zÏ¿ówªð°Cç_áRM«CØ$²·D°otóYÛ¡#)ß(@©¶|¼a¥NãÚûWܾ}&Ûo¯%!F ÉA¦ÔdÌRmI%m(d6T!%4F`IQ³$kæíÓ%i4lÒ«,Ó(ÉFZM¾=Ú ±³B$RI,¢6£$ Ôh%%)LQ¡1VR¶Be4FÍFbC(4$l,EËÄì@×nt:îhzÁÙ!5ÑTÁ2O
ÚN»}¾ÚèV#ü#/ãÑÞ²F¡J&K¯ÄåYÁRC2ºÖ³2¦ºO¯ ªY4czKë'sLI1eF{Cv!&ÒÎ:câMÒÝÌÃa9G#)n¢¢lËEÂÑËm/¶¨kG*$k¹ññôÒÍ£IpS?Gêû9çú*&;%M m°Ç*1½#)l#)àxt_Á_=SR±Ò[4ÒXѦZ&ja$LLÔÞëÚú;áôîøÜLÆ(Òq8ù-ñî5ê58·ZèzøiiðÑeàL>ݹÌ1&¤>{|0¶¢¦-'QÀÒڼà Lgà#.k¸êØÇ¥°f_rÑÍpⱩܢj{gÈ4kû,ÀG7îÁ{="@hû¶~K:|9:þ#/uQaBI!¿1èí?çùiÉ[þG^ËmqzbóÇcÐÉà©r×®Ì'iGwÅ¡_TÇ{Õ[ѹu°èÓ&lé6½Ì3ÁÂ׿8]¿ÍhôGU´â<6ìÿ^&>·¹ö 5Åûiï¦ýyå½zK¬ÇCÉn¶ÃxÞàæ#.OÚôk2`ºa&P/º`çî|n×g§Kùè»âCÈÃá3ÏNa¹j{Ív\y%Ù òI7"m^Fûe5uvvZOµÈï;¡Ç¥·zÍ-ª`@èsÜ÷ÖN#ÂHK½O)AÌ£½N«M²ènÏ×2R7;¯v@\ÃslêLfe3E,~{òspÔ3i.v0Ñ[E`Ç[õo2#.`÷õ0Ã@Üà²äû=C+¬!©LZô,g`öÀÍÖzp<Øõ¹ìÒãy_à3bh¨#.£°ª§~wiSjý
/ÓÇÒþM3r«a%&P¤ù4lòÆFN¶ãݹ¢-¿ÛÉ#)Á'0cgi¢75ÜiÞ3älz#ähjt'n:¢¾¾#.)'C¤
lå_ß#.Üø\@oíôìBLÝîñ#/Ý¥(:O ÑÁpBV6¨íh¥0|Ö¤û2;ÅãXMñbÞhlÉUGÑ{Vz¹Æk#RÜã®Â¡º^_ªf\ÍÌ5/2åÐóL£BÒÅ.K¯ËR½)Lf{fñì¦,ëÓ3Dt
.þIzM!8y/[µ,33ËL,¾Üêâÿ8Põru/
ÍNXΣ92L3Hà])éjã<¢Q¹¤ÿÄh Öյ˿32b]eØé/5Q
Æ3dîv]SaRfsWLfKÚV÷-Ö*MÿlàËÂ9THó3o Ga¡ó¡áÙÍ'˼óÜ7nø2ÐŲê;Uq¢6§$jæ8ÝîuB <Íâ1WLÈWÞÔj2a2&¢ÔÉÝAÁ×ç3©¶qYÎÈ>.¯7ÍÚ?»ÕÛ²ÞÙ'81G^|ʾ}\ÚÔRd+ìäÖn×ÎÛÿ!öìy(¢)Ãï ÚÐp¥>$çfl¤Åü»Æ!bÞôN§8|ñ½Á¥·8:gW!ä/>7S¸xíÇ)Þns/x.ï>¦4tI&ÚaÔ:ÞÄq²fç¡7b§#LüT8»ð,ñWSyv:¹ÔÁÒûpBÎ{ó'%¶:<n GtÆïvèç£w^ÜL;¾Û·àwÙÁnÛA¼²{(ÆPïU)ѺlââÓ*tciã3j¥ \4Í(,dÄB,¡åijíqW¢ð¸ÅCîoq$,p
±3È5µª¶92D½pCgV,7Å*h(ô4ÕYi»â«PzjkÏænJ 3»Hhîõ¹«uÉ5uÒbôál¦!¬6#-¦|Gnû3S®Ñ[¨ùO,º¼jT4ã}ø}ìH\hfngW~OMÌæ¦/®èL¢çÞé°È.ãvVͼàÊ˾èuÐG4ç&ÍSËL1sº²Î,Ës,)Ëf6hHè;WPÐìO#/÷Ww-RVðéÓ{ÞlÖ ÇÙxPVI証pçHÜX¹¢@G°D&ÞÞy[Àªgv̦QAÃå¥Áa±·J^º4q¬å--Qi¦g*XÙ8#9S"ALòíP¹á#/°H§)úé¹yÂè*Ðí©§$$?÷[²lU«!¶û»Öçs7k?Nò\8|pbÙ9ú xñ«¨ÆBÂ3z~Ìb,¡Ó»¹s
?ÀOË7¤*ãn,rÏ®ím]j³£#.à L(ù×9àûfzdM®xx(áàùÉGh,¬Ta¨µa©aáazÀ»á^.²ëL¦7éÒI8ÉBn×á»GèB±Ø£îɨøöP>=/Û¾O>`únîæ°Ê[«;rö]n}Éá#âõ(Núví3x·HÄa¢ÑyÍÕ HK*2cV1ïÃh(¡ß|c aÑuL%¾dnE¦pÅÇ;©ºefXÛoÌ4êd ddºæQö2½Üvï%ÜÇMh®ÍÙ4Ìu¹kDÈJ6ÉFPw1fûomYah£3Z¶Ú¶²Ãú¨¡n-§@+DñnulÅ[ÒøñÚ6BlÛêð4Nñiiäa¤·D¦`Í=á
ÔçqÔRvÈÙ#Ú|ÕÉBᣨÌJÖîÛkÆD6BnË[LQ$Ô¹8Xj0]#.IªðLΨÔÂ-1FL"&ÞDª% ªtM8
bqLÏgö1y®!ѶæÕ·ÎyÉ0&A·Òm :\±¨B Ý:tfù6¸#.Ô@Áç`#wVHwξìoßÒkè#/<q#$WN ÅÞ "&$.ú#.5ÂrÑ{bðàÙFGX@põÂNbAÆ:ç:®â'< C29ñw 7R¾{ö3%w&b¶(ûX#a®×¦A¦Á²NÎeM2:°§#/Þ°áÐiÈÀX$È1anC
BÒaÏX
Ú¬lQ$#.M5#.´3UHlBÞII#.¬lÚMUÑÂJ`±MÕ<4¬¢lÝ-Y¢Ù³&P7fqG'jȦª8ììÔeÐÔtt:è?X0¤F¨]eKÁà]D7F!{µI©UNØ:äuuGç´p0ØàØÞÍ&Ó¡2jlkÖqÀt2&Â\!áò·¡k8ÐðÜBÃåò_ÅuHsCºi]wCÃÅ cÐdÒi´;¬FhiBàÙº5lÚiÕ¶yx¦dC2rHâhHHQq/´ÄÉf^q(äCøèµêP
Ml$H&ÓspÐYª®9(yê
âì>Î, È/(wÇ¿bü_NÁ:K`d¯)h"6$4Dý#¶Cº]û»NÅÆxð\¶ £¢;y[â÷dyËióJv!¶; ½Ú
Èqç[¨Ìt&#.dCQ#2:t61Hp¤à{¨¨7:rä´á÷"äMeïrb74!#.Qõ`½,]¡)TD:9GL¬më¬Ò½©{^A¾_aÚNKuÄFX`§IËD+¦RÙSã5:Q½g Á(&f9®zM4Î3#.¼ã ¨ÄMFáÎ(LZ¶Áa:¡ÇI3³dpjЮéVBØ»´w±8Ùc PÜ#. æ©¥¶26Æ)$sËãß¾Ûã<É6 /²Û\]CÄÏÖÒÃ)Xа:ÓÁ$gTXix`©D©õ°YÁ´(à½
©¨¡oõ¦"¦ÃÏûõ?°>ß?#)èTm}WUÍ3Z22#/6ÊÙÀü¯ônRô è0Aá(w 'aÌÙ%3?#.È ³DÀQÃg.êìi¨EÑ
®¥ý±{¾aðê\Q¦FO>8ÌƵ:85Îâr9ÕçûO+ú¾
ÏG®èv{©´"ʪ1nð¸lrN.8´Sv!Ôôvv]Ð6äÓM {Ø¿i`eV$<5èB(ts1uY¼¤ÊÒò0ßj`Í°¿t4%AÆbJg¸ý]x¨ì8á`×ñlC0D ;°D¨èæ ðøB`î"ù#.Ö^¡6ÇO¥7Ð÷qÄR¢ÕTcïQ jÓn}>À8)ÁbýÓðØMJ¯à½?_@å$û$Ô:5DdI64×vg7D±mÒýóSñ)³ Ê\õªJ¡â=¥÷ê]?Ì{® بuviü[#ÞðOyÜñ$îîÅì
ñ6Ú_´þDð'\Ì È>I¥a&ùIPÀÒaìj7© «ÝCý?O¡ðî«ðÔÔ$gaÓy®!Ñ+«'9ZÒÄRVÏ P¼| 7¢½fÌMvd6cê.ØFz# TïÐÚäî:3',Aâl»)º©>>?o¾)4·ÈÅÈè8ùµ/0û³éûá£-u&µ£3à}}ðyÉ%)+lm¥+FµTRÓ3Q&6ÑfWÆ÷ÛP"{èYÇCóúQ×O·«Íä¼@ÒN!<¸C÷r8yÉã¦~W{`¤ãS% ©T4iK}dæÐ 3RÔaì=37S¬ñÔZúݤÿbï¼À;¥=Ñ(ACôJA)W¹ªKêUHÜÖú»9i« ØV,2¬ëª ¬Ðë°ºpÒ*o*lBBrP%¬¤Rj¥·´#/Døíø F(Ð=7ÁÌÌT2HeüvÈi«9;ó`{ ᪷4Ö5©ØM¿óXMÄCVrú»u#LäØ#)²k*°ÙÕÏ,$¬RäkÅy7ÔW¯«ã@4Å·,ÙÛJIu1MÈA¶ÈÈBû¯aÄ7ÈÇÄ8Úã¢ñÉÚVÚS¡¨4îÓß¿èûÕït8{=æ;l Äê\Ñ:1ȾõÈ1b[1(¿iZÁVÒ«ôÒr qQAQyÃh?FIîÜ¿c7F¥_N·5T+¨IùX±¡0KÃ7Ò35oÖC Êlý£nß6éÓJ[imSÏClc]º-í¬n°62´6&$ih{kqÂÆZƱbò"gúôÔt3¤3ÎU3¦ãÓ#¾ï<f6]s0RÊ´<l<5æTwu8~Véú4Ó«ùÄÕ#QùöÉ£cÝeÜsmÃØáRä d;^C§:>#.EÂ"bèsµ#)ÐÎÈØ.BPsONIDn.¶Ê°8ËwbÂÊ íJ0ÙÐÎxô#.ÍÕäǸB¦#);`¦Âà@cò^FÀ!·4È@¢hì0l÷Ç`oÓsÃüè°¤ýLÜ(Iá×Ú^WÕª_äúõú:Û}Åv¨=GúÏ3ª?\°¨¸}Ç0á¢ýþà#/ܾ^yCgû 9GD#)H°þkúîÄ4CÍo"Á3ÌÌÈÌÔuý£B¥"%@£ï ìö¹úxIb·û§#/óúàZ¢§5ßê?»Æ1Hûsq»N++ñÜLµÙñÙhâ×A±UbW*9g]8c}IºÓj)%
«§|V)³ØL>SÜj¦MØF#.äÀ<4À`CÅLeN^ÓA¤AÆp1IMW0·î7ÆÓ©iD)zº¯·zè9²LSN±yâG#/ª6©#.0åØìÍaÅ!#FdËÔCD^e±j´§Qó¦¾0½¬9ÇG#.#.ýn@t~npË$OÝ<PmN8°Å)ón4ÛÛnµ®d©X3ªÓî"1&JðÇX$©ìAxJ3·Ó)N%÷d®'Î"¸I]5Ù@wM¶$z8ÉÁâ¸.#.g°ßìL«ñZï#)ÐÐ2ó³m ÞÙÏU£EÆXrfD8$§Í8üÍÖ¥aâÔnb£
2¤Ø´7[µÖj)bÚøW<Hà#/ÄHÒ7ËO{¶k^5ý-Mè=·jr(cHËkl]µw%Û®3YÎשιÓ;tÇ]ÆUå«¥A]jí%`Ü®ë·wi^wJ¢d,Kg#.RP#¸,ITºsóòऻ¸c©Öâ½v«xØÊlÓ)2&ÍlVjh¦k©jéZY¨I"eZH÷û»®ðßHÓ5£RÕ¤¨ÖÊH#/ð6ùüÎ0U¶Ä¸'$S#/çMΩ®ìÒht'yá©b#.P(1Å'l3iAºN'tI.¡Û]gÎÈvdnÎÁ$6#.¾Ù¤ìÞI<#.Ï.EPÕÅ_8¯ÅÂ#/C ¤Î^CíöæadÎfaY4}¶uI©6(ª+ÇM±Ç4ÅS´hØU#.ÙíJâc°ã{Â@ÀmLLLÃ[`;²¨#.I´JFæäo#K`¦EÓª;0¾/SqìÀq*fs mMXç0pßʤ#/)¤RÚ[ªi¤XoR£¢ó]& o5XïzóD!¡7DÇ'4Yn=ÜÊíµêÅÓ
Æ9fWhXòtÐÃ?>Oâ»?D¿øM+Öð4x{#.`0èÄ¢Ö0xÿ>å§v"ï*U4${Ú@Äá3ýAC¯âÚç|ðP»Tt02®#/Èdrp²@fÉÉ/ñ"aG©£©&èm<¤íüÓ¦ït±ÆÀ·]]Þ´?@?Ê£*ÈJ§³åøséú<Ý(ÚTìÃ{¶ÜyAOÝm¿*8{¿°ÔþË4,¨*ùäG§dSXÚi,Ê%Ië®Û7msDe(JªbBÍB,¤JeÊdÓQFÖIL°¬³jISj(²Ö¥Îâ$Ì$¢è mT¢1jbU4ÚØ©dÅM·án«âä£I6AkXµ«dU5V÷+ªm¤¬yç^Y¤Ë-,£&ÍXV²¢{FU¢Ô8P뫧ѥTÄ+v³TÁuËI¡*ÜMqM!*×÷·mO¦n"i.S]þ~. >±ëª@6XTy¼ÞV}vj-¬ÄgJâ×rI¦ìÔÅ%a6ïMÑn#fÈ~¿gOÃîZ f+媻8aÛÆÐo#.4D#ðá(#Àª#.¬&(IH¢i¥¦Z#ÒÛ7Íhô{1OL#Â#))7
G{c#N@tÌL!(#)P*aÛ.:Î °Ò×v£Á æ¤&@5ilÔJm%%«Õ§M!Á* +$À±#)ȦTÅLQ-²¶&ÐÂPÚR©3e3,BÛ%T´jMIRm`ÒkJiE d¦¦)F¢KRÍ#e¬VFJ"i#.²ÌJX*+eÊTPe)3fM³jÆ*Ðd*jSVmK2jY Ý%\¤P)IHTêS!#)QÞCK P¡¡`§#)dB I:6CþI_TÄ7§ª[oOga½ñ~#.qr¨7]tøØÀ#.õ3Òmbßk6mQÌ:"y;:wpIJ½áìg#){b¤¢?ǻ۷nGç'¿±T=ÿ§ùGmÑH¨=Û¨h% Å~Ï/³kÃg^8bÀ͵ËîÈÏUЩ¿n@î!ÖY!¾Û4õ6ëíýÕuÎ4Hѱ/1P%¡¥FÄÒÎaÃlÁ;ÀÂ5Àï*¦ª{@<[ÀÜ6!õ Fðf`ë-lpF¨à½0OÕU43èG@õ(¸Ü2¯.¥ðxü±.3Aû¾AïMÖ êÄ©(wvÚ+y4Ô¾t~#.ÝSÖ#Èòé§ÞSÃ#.äê0z¤¥{]kÈ@!b{NÑ6r6ßÕQ»Ü]ÃbòÄûªt4I}XpV_|!F{8÷Îkò@°I¦ø,Bv²Ã96>ÓéÒfwõCÀ£I2ÞGËc#.²¨áFEÙ"o´Ý8\¶Þé±8ºBK#)è2@<!~¥ñ{½[{vÒà"¢¤]À#)#.Qjm¶ù*§oUß<¬C@1Ô f¡À³31Æwæô25×)xóÍ ¾ËÊÛ¿À÷¡¡ei9ÙéØ èâR8%¦ÔÍw|ÇN}üJ¿9Qñ?.»¯ïff`;kÉ6<ÍËyþ+ÔR}ç¯=íØôý0äbQYÑÛ¢!µ.Ô dßÄþÀqä¼3ÄQ´Eøú×µíØ×¥²^NÝÑ\µ×¥úvåËÚCßØ&CeT`11²m$,2%PÉ&(èØ`ÇˬAZ"(«Fã#.ÊÑ#.Hä#[éª#Zp`á$f¯Z@ÍT6&iV*ÍN¹#.Gm5¸«E°M n#/?;Âq$Õ#/p1qÍaàÒ·ë 2Á® ÇKðíMlØ'¥ý>°³=°:õª#.ÆJ-p*U0ÍʱäqÁ#)3o#._ÛqdÖ=&#ØLÉGsï·!¨9$ØFë2;ÔÆÍËl=ÖÒìLijM]qâ_#)ýÞKC)Â>ÖÕûüåÀd{ñnx$và,3A®X°)kóúaéê£b9hýù§Qo}àïzî߯qWÞ5¬W|ßQÇóu¼]0иXZê8«¬]#/#.kßಶð·eÎ}Í
·ßÙkÓpÚ°B8míSæç2"pê»óV#¿ò*LïÚì PáhjCi½ýh0|¤Úÿ=1êX!*IT«MÎþÙ8¦~/zź©#Q© Ð!2Xèªbmt&U¨8°`ÆYG¡àf X¦Þª**ÐÌ"^Ó0án.gCÝÏO|êá.GV,¡T2`ÂÈäW:áG@Qudiº¼âóâ.ZѦë9+*ZÓ«zÃE,7DÕ+^u\)¥hv©¹G¡ª:ÊSKCR,¼ju#.N;¾öíõ&}HÑ,,°¬deØpLª:o,ÕRÔÉYÄTÅ^Õéüýû ù§éÚ©4¢=óÇÌÆÉàLìÒÄ©4=°i*&qëEuɳTf(D÷g¼ì6ðÓR=ùj,a§a;è«:MGJ$gÃ/MEÙw^«×TÝDtríÉèeʾì1î0¶Úgüñ¶Fìí]*wpÍèﯲ¦¯SÂzq©<fR`ÓqI<_yË:N2µfê¼ÂÇç@å±àuÁHØÒD)×C/rí4?.ÌHØÀñLì®`/ÍãÎäÎbÎ|xð½Aîí¡8½àKÜu=ûK"ã#'oQ£!¤ZJ¦¯9YyÞ÷uǺÓÓÝ]ÈÀÃ9¢®³
R#.æLÊÖh)½Ìu/«¾3ƯeÍáÙp¨*Èn¾6²"aª/ÂíÕçiÜEÇ®]®L¦étÔn¹iy®õ¼ÝÍ#.#)ävÄJ7*R(ÓLí!îZ4ìaÑGßóM$ͧÑyhû@ô¯#×ÇÑáZÃsÚüS×ÑßZù òß+Ñ
\zó×¹ìÁÜÚç@'Ò` fÀAæ[:3}±JxantŪbajbu£ùþïBoõò{á>¼¿¦ZAÝMÑ@òJÖÕÊ£[l`/f²§-N>!1 s/(&s `1Y#)ëØÃÊ)#.(¡Öd²Läq7ðèÎÖâÀIIPKçb!²L8©
¾dI¡ofaÛjʪְÙC`ÂqA+yf(ZiÍãM«01%ÈpßT¡#/©HÑ] Àbi°:ôøN¦Ðú
ë4§Rôî{î#ïü}|NåPd]þï© ¹¾õøÎ}YÜ©q¦¸Àætî;º{½yx^w%éÀÒÓ>Ü8°fè±
ÈæäÈ?ä±,#.1Nó×¥àAÄ{Ó¾*´¡¨ ÚUkXÙ¶XR®.m;®Ú5{æKkßSÄbÄ^K\µ{RÛï ÑA!_Ýþ\Ô#)ÀmDÚâh7Ù0à;äÞ=ÙYûÖo#)ÓãG¨%¡®±l(d5×]"É>ÈhB¢§¯DV¾z×#)#qZ\B,!Òn'©>fÄÁ°üÍÃBdàDC¤ù±° =¬íè´Rm ùÁ¼#)(#/#.yQH°m×Ûv~º¥"ïS2k.G9@ã¨G§qçñÄþ>¬±¤$0À) ©#/H¡#/BÅAÅPëûÞ<í»Lt ¦8FâjÑ.èxaåâü{^$,Ç ã¥C_Ý·iö_Qvá áÌT¡ü$¡æÑ£Xøý½]À÷IÀömú:½7Tô#.Ór]Fè(_/¼é¶Ê¦¢®HaýRg$7W¯6½V}Ç8¢4û¨ Wª#/JU?R<ô÷Þ\ *-H¼¥ÕYsSï¨çcÏjözkÎR?tM_<"V3îM½3bºIIÝ
¤~è¶Íôm
Àðnãa Þë|ÃÐLï»ÞV"6·íæö#´pvv/¨°³J >FÞ©èr·`Tg[1n¬Tk¾î°þ¹iÐAyĬ/`«4;;Ð!µ|¶rfo:ìÃò®À>¯uë%@b#)¤È@ÁÂZR0pG%(R8Ú2#)m!@Pá&BñU[øO¯^!kZÑ®úRÁÀÂrÇxM Ù-cP,#/ÍLj=pu7{1a»ã/Ñx1ݱü§v'Åù¸s|áx=çAðÓÀÎå»Ì{#/<ÙT@¯â<ÆÓ{àÑ#."ª¤ßöÀyó#Að?,ïe¬i²Ò|út`EC2{Û#¤èløÐì9hãèC-c¾µçZüX~<ÇÔåÆÛÑÜ|ö,Ä
éà#/D#)ÍîMòã¤0íÄ#.fI¨`ÜÝúN®W£õ}G×÷ty/^ݱ Pf.¿ZMåÈßs2ÉÊ@2£a->2EM+þc?uÈÓ)dsÊ0æ#.«|¤+ü¦)¬Ö=5íMËNJ¹á!iºB¾ÕDY) n
$èD`ôÐØ¡ÃÍ&:J£´d<õã«yÍܽ¤x¬ÌD2R
¹a`2)M¤4Ò[xÒÎ cM-RÄé4C'©Jr®ª@Ë«tÿmµI pX.CQÈë0e² #:<cy27ÑædU4V,k©½PÖDîQȼ^yÛ=yyà]9ȶ9j#.nîÛsjå2½zïOFOR¸bcJ#.afä3¦pÕ§XhÞDº"íþ}fe820³8¸p¢/2дMqk:7Zé8 8PÒ½°&¼,£ÔTÚR@RAlL»_<âÉ#.½GÀV= æD?xêÄ÷hê¯~ ö'24~
öÑí¢oÏ5JÉ3HS1+E:°TÍf&dÄÇvM_ð¦Á¸×>;gYöG¾=Ü^*ö#)£àsÀ¾°ðëêÁÂÕ@¨/åRúOâ D°ÊGa2ZY65¼Ú¢¼êädÚ+¹[n¥EX1,p!!\WR¢tB@Ò04°zÁ7c£ ªQh¤.ügë
ì`#b¡ùÓnc_fúE³/jz:ê¨bÀåk0 \3¦#.A"ÃRvl9#)
A¶ë ®9éùþ|uZ/:ÒùÏõþ^¹í=Æð?'Cö!¢âbëG«®â®k½äYXª-yBäÃJí!Û"h#{¡5cZÍm¥cbº®À(SûFø8ËHG]¼ÝÑ¢#/I¥6©6Ú#.ÊG,v¢ãP BÖ"¸å,åøÁ©¨[FÓF#m«Hß³A¬H²e!Oð@rÝ`w!Ý-n@;À´è¥C©J×.%Aev4P%s0àþDi Á©vúC\ö8scl:;VLCì_J@â°Ú7w»G¬fÓU=§10æÕ'wGeE°)kù{ºiðÒ}ä I±Gìó'Kj»t1.(:õãAU ¸6õâ{û½í$FìÝ3dÞû;steõÒoLPÄÓÃP°Cà GÑ4ú÷²ÀÅÌ)(ÙZ6Êif5i¥e<ÒZJ² ¢JÓéöútéÎ L·YøNU P`« }?rï>}oWyB7GèGñò°ýçc6âb_mùôaÉÊ¡1¤.¡yÆìýò¯ xÑu¾R¸²k¶úeG¦Õ{ º,TIA:µ¢HxÒÅË¡*Ψ\k´5è#.2<É{> ëø>¯P# ¤ªäðËîïËêéÛÃÚ}_=|û c}ÝÉ¥_oYùôNBÍ9°!&ÌIþß×$ÎFûnuü,ò6än˾»ÀÓê©ÐSù³Ð´Í%"èÆ×H?DI¯ïV£TéfÍ@NÜîkÃETüYШe4a³Ä¡w´{~[pþÍ;¯q»ñÚLi¤#.&ÃaÕ¡àëVhi¹où¢TâªTgeö}Ia±Ä8©¤öi
¾ñòÄt¿-dµëô1Ø3ÚÞYXÚ_+Jz5®ÉݼßgÐ"ØHÂPµ&DÈÚ¥ZZj5£#üäÝ4%EK?DsmMÑQE0$"¦Fh%FQ©¦´Q6+FÚÍhikH¦k-6k[¥JýÏ@éIþ§ð&÷uÚáÍ"Nh<#)ü¥L(E1G%hÉB#/@¤S qÁ¨°$ôõùû8Ø¢Ò¤) ¦$ö!;#/ùâ÷^¿¸ØÆìïÒ¿_^PRñ0,"5ñqÙ>ß¿bàå_NÔÄ<лuõ: ]xüUWËt¯üï#¼!è#)È~PÈçاÖé§úN?%ýàa`ºC$2\ýPìBÚÅ6PïÅ~ ½¡¶;Hiñ{¦Ü/íâYÖv]8í¥P±Üò½QEzutª'
ÉS&® ¾å¹2{çË\&¿¤#.¤
Àñ?1öùÄÒ9ð7}ÀøÂs¸ë<lÌtXm©ÄÀtêxy¬è$æ Q`pBÃAØ#/»v/9,k9ÄB ;é#.ÐÕ?yâÂËjf"´Á¢AÆbPþúÏÍ!pI4Èú<6Ãs&;X>/¹5+«ÉeTé]û8ûb¶O·¡ ñÑú¶£a4÷#¢uÑ,Õ´e$C\[Çñ度I#)£$ßýmxqÏ¿ÒͧØNS×9òk
]:ÿYÉ®Så!¼»^Ìummj)[h"#üÔc!Ï¥÷lq~\÷~[®AÁ((ð¤&bA&IÖ!éQÙdVÛ8*scCAÐßþ:àiw9xa¬Ñ£B,PQJíTlòZ¶2&*e4MîÇo,fRQuâyäÑ(S[íi ]=Òd0PÒ,iì01CL#f÷pa¾ñ-îß5u#)%ÛjÄ`ÆÔâOåµBçAÃü»· Z$4C¨E¾`Ñ$ãÈrù<:IúWJ&ðèqÂ5ns#zjƬàJ)ÊeËGC[läÚXͲN AIHÍ4fCÀ°ÒEìÓµæ%åÖz»ÑÂÌBòÓ&:M,²À¡byÜ#.;#)ãë<{ôz=å Õ··@jëõúN#/BSØ{föÙQKG´,Gs2C;ïn'~úqöqóv#)aÌä2îiô à¯,<ûzqâºÐY å#)÷Hi¦lôÒ¢Ò"Zõ*]×&j£z\8g4O=Ûɵöp|v¨CÕÝ PU,BÁÞàQKHùôÎЦÄe*ÝÐ!ÞÐ8¥¬±ôD
z|/·DÅs[høf#/-vÊ#/i°évÉc9Ҧâqs8[)% ºaú4´ÍëóØ÷£]nKîïñ¼ð÷+T#gÖ&t Ä5ÍÇT5¡ÇvC@ÄÒÍ1@pLÆØ®®\§îfqô«ûiº¯ÙÀâ¨q&÷O{Xߧ²¦½.è°óÀq$#ýÀá¶H¶ëÈlÑÔ:ÁѵÉUS#/nªPß{϶}¦ñ#6ßÝBCe<¶¯À1È&æDØV"ëV#.ðÑBxk£EãIà3OG,¨9àè$A½%,J~üéÕF$il]×Y-%eêq|7½Û%BÓ£T=)NnÛ]6>^äæïÅ\°ç®UÉT³¦c¹çü_Á>Æß_¯@È£]HP,.;#.d\ÌE#/Ù0"U¥JÑàQQ!=Mh#/cðò0=ñ§èHèy=]¿]èüà"ø½}cîÍÐÉFÞF0?¶]~;·SÁÃÅMÎÏ7ÅØ?É($@)ÔwG¢G³ºÎîí¢pQÐì²ÝæI¨ n~,ûõoC©Î$á>wpö*üOGVhÔBV1T@Ð8X#/#.Ejm¸mØb!ª"ã#%\#@**¢eQ3ñýÞóÞytmîú&/½¡i *!vGx¬$rHÐ fÙ>zX4BL.ùp<æjra-)©Q»óáÂk9\uwXKnà 1¶¤i3/2ÞK%«ËÊM|G¥W§¦Ý¬2M°$:ãQMcÐR&7¢mpbGdÆR³ç$¦äUeàjèÎ4òîêôòÈmÖÕ"j4ÛfN,Ä/íÚ´ÐØa¤ãs`Ö¤UD,³Í1wèÈptê¤q]j{àOñ÷ é:ÓÜXâv¯//¹~/Ú÷þXi/òþm¯å>wm?µðªNf]8f£ü\ÇS¢t>Aê#)/×ê" 6¢%}¡D¬È@PLÈ¥#)A(zàöÂ>¤Jë§v®X×5ºh×+Eú¼!ééý<ÈÏÈNöYéä£.ùn¦qòw³0ÈæßÏÕ`²Ögß'¨ÃãÏìåËÁUàb{äÎ7L=ýA1÷#)Hl$,L8oN >|Ïè°ërÛmdâ¤Hº¹{'ÕUm¿Mm¾QIÉÈÎ8Hù©A(0çQmZIáÐ8Y6ë M6Èm¤.z #)D,¡óTÝ!ÂyÃÎÓOI͸BôçûÀåË1BÇEFúáÇKS$è¼L~iÖrßÌÑLïÎø<éÚ)S5ô'Õ4£é³ûÒüqMÛñ#gz8ðCO½Ødòaä|40;ýù×£ì"'¡|½øY£C%[¾¸àWKç#)Õ0rÄHg-nÍ°ù¤ÄßÍ6`yzPßE9¡¢Óp£ÚDcÝ6BdQê7 l´æÍ#&\Î_{áJÌjjíÇgÔgÔ1ëCI,",ªÕ¬è·4#.+Fä?*sNødÕ¢=éO&+#)É>I!{P[_óóïÃ>#/èm¤3Ù¾N2²Xèñ,Ô{-hÄñZ:ó)JZSh*:áuvD84'w7÷#cñûºg¯D#)È
~K°ºN¾ßÐT·÷¾Ô7ée¡uRÄH*rµ
Ô$@qÛ#/$#.ºÛ 'br`*ý¬!$Äa¼Yäé$q6OÒÆCP¤ÔÕ¶33£ôI¤·¤ãwyÇdIñfh&nÁß0<s»=]Ò`¬iIIµß&=åFäây§xR¤,YD #ÆRk9é]"sÉ3B0ñ(ÓcËU±ëóhõè¾°JÇ>'¾øw½çËñu¥*6ßVò!ØýgvQb(XYlJTÑVúÒjCs0ÈfT#)"¶e[u[7JRñrMuXâ@LÒªBÐ#/;nöc¶óÐ;àxýsCOÑ©Raæb6#ÀHçãQ@¶MR@Ϧ¹¡&¢FHºýöæ¤ölÏÀc4Ì$¯g¹ËâlM¢3<Û£R5u%"0I2Ëþ¾JÑ'r¬ÌG}ðMÍdÚSjÃAæp}V¬èbE,
Æ4ù#.Uq0Ùó`ÝLpC4îl³E}ã/ÞÓÓ¹öb8+ö§î>»·ç¯§µdî:JìI¥ÓØÍsgKvZÆ|ïåòAi&`.fa³~}¥v¾ç]?x¿}%sI m
wS"ÆÙYü×®ÒàÑÞN&Ãcø&,±$õ±ÇÊ[.ÖFD½ñwýî~ïðþü-kè±Z&|â5¢QdtÉ@ÓC$µýâäb1#.D2V¶Ää?i«{@#.YûöÜ5¬¥+Éo`PgSPÕÎ5ÐSçV¼J¢;©*®ç"`®úZOÑÙÝÜqAú,|i¦9:Ñ3D¦5õV@îæOâÔ÷µi& `+záÒý§HÝÈy3d(ghc"Ó5ÂQýawLÐÍî¶ùT©æðÈÀ:ìCB«BÃFØ*Ì,°óûÏî5Ë29#!Ì6#<Âðî¢
ª¡*ê[}½æqX_vG\°oïÎu¥YÒ·ÏVÂjf zË%È2gªÑÿraB;)ç=¾YËbB\Z{óÛ0t/ÊHÍnIèPÑÇð}Ía äÓæ³ÉÄNþ,m1ð #/Hi#.neÐ]=ômü-|i÷q=\ge
ou·I¡¤jì}ÓÄ÷Ò[Iæ÷õ?]ÞåÞ_ÈAæ*"7}/Ø; üÜöu; bwCJ©UJVZP#/DE5d©¢s.Ïn<Mx¯×Û]#/¡dÛùd
TIÌã0 nkÇ^ÆYZ!D6Ó¬q #.÷#)5#/$y¾Ð#.ó»õñüøuuÞ
k¯ã,º):ñ#)ÊÆ'@TjºeHVÖ9©ãyào#.ÐíÒOépwOÓÌ>¡ã kt<§ù¿ø_Y9#)aQñWëíæèsÅ%t#/apPxYæQ7¼Cø ³#/ý
Õ#.¿Õ6Ì.3îw?ÑÇÃl9è#TWÁßë#)Ìó1UHLÈc~%"üSWmÚQoÛµí¶% ¿ê4Úd>'_¬#)³ÐÞk{JÐÃ>l´
¡É#/±IèܸPú7ôùÛõSÏÃ"¤4å:È<Ò¿
©5ÒÃ9hÄIÇüFÈb APIÔé8Ö?wê°&Ä6Dº±Dï²ÈvT,©kÅ>Þß^höíËÒWyIþfWÀÌÅÃ(Ìc*"båÒß]îÓ£5!²µ^üÍy<M¶Þ¢Ï´ã<³ øùðÓ§ig1?oó»t49UG«q#.=C<çôúµö÷⤠û>êì.¡$Hôi0v)¶÷#/Ïìçöw³7³È¥iáeûØ¢|6:ö9uųÙÙ±¬©»kiûD8Îbi6VÐam4Û¬»#/Dµ`SZ4ö¶¶ÞÙ âm#.bqYjuè66hY
3«¶HÛL´ReE×uÈöbX
£)cíÄÖ¨¨j&(fÚÃgrÇM.o¾ÙÈ Â ÓlAêÚ7&¡D2hª]âf89¾ }0ÉHFÅl^Û°K'Â[#)/÷ù#/h&)@£a/QAt껬´ÊY4·weдKÊÛia&«VGV8@h3$ªÞTpm:ÅÐ#.MÊbÔÓKe$£&6¨Pf[6)j10ÕJZ^ÝÇ©ÚÊu$F4CP1±F#.P¬-FÒd+S·ÁÞß|`©¡ êt·%0dc9ÅÌ´Öå00tm§G³W#.!4 A ²*RáeN@25º©8áSoCL»P£#.4lQÖ-Æ+¶13q]f 4ðg¾}´PÜSpZkC&æ,¥TDQí*T(³S$ÁrÀ1jKÛk
#.½wJÍ<ÎêmÃDÁè0Ó¬"¢¤Û²ë,n<¦0·4HîAFøî1B¶¸hÈ M#.#/ÐÂTBÑjX²)X1.ª
F)¥cÚ]X4Ñi-+HIÔæ61¡X¢Lhc3µ3~̹²¡
Á1/ J%´]PÈ
áÈÆÕªM*Ð1»g²î{°Ó?C¯ovMU
=Dx#.7&ÈxE×ðdÍl%iáDÉìÅc1>3gA[ÊáUa#.CÃbðe¦¼sÏ#/½&4e¬DkCÒ7á¤bÐh´ø1ب޼Þä44ZJßÝpŲL'£$â~î¡ÌмoZàÉ!ÄÜNÍÁAÕJð¨K|jB]Ä0 -1)ÂJd¡!£#/V%ËhO0EFX¶AªÄ¨ÆVo¦Þ·¢HÉîBtÎQY¸ÒÌV!c
gè(ëL.سZo/GÊ$¿|XAb R_Ù0@»C]H mkPN£n ËQiHÆǯ }°¶á.Â<L4&V Ö@é 0eÑ#.d"bQ62&D"¢ J¸FH«t6¾ê§«·»Ïñ=ÔtE3å~Úb®ñ~XCçúæëë`=îk«÷°òj{¤6~24p#Lx}¿rÞôk9ÏëõnzÒ7!Ê?dLJï=ZBÈw~Ý»JªhJ
éAjÉ¥z¸wv\EJqB§«0ÉG~Ð×|&ß5¨¤¢pxx KSMTðdNf½{ì|ïFÕl×ò.Ì%Ä(#q$Oqyèá½(®ùéÁ¾XMÑÈD:,Dn1#¥¬òÙ¥DÒÂ1ÁÂCrÀãMFÉæzeÊå«ô¶úñð:lç°º(êQG|Ü"¾êÜ6¸Á¿ârÊ~ÜùÃ[ÃÌò*¹=QÍ};3¯dtç!^\08|1Ľ}ªìd÷¢3âÍÇ6ÛA"Âu)¾åU|d6BFbÒ{a¬}3ckܶ@âFùnúÕöÓV=/p;ÆN\Ô~?¦qø¶ãëS¼~ tÚRR¨!è?5#/Dvc и)¤Òá7J}Ø#/º@í<º³h2·#.6TM$:´¬$YuP&M®ñɱj6òêK]µNÜÍÝxª+«Yf¤Y±³f¹Â§uZ+ITªËr\%B#DaÒä¥"º,0]PybjdûøCMÑéCÌvªS\Ï~ë9ÉÊ£Ê@ F7U#*HÀÖ/BÄlÁ@téc¡g¤-6&êh(
M`!ñ»9ìq-I`!8ðB¡ÀZ/õ»T2lVLÊl[Ñ´ÍFÑQTVÙ#.Ffd¬ÊI0¶hѵ&¡FÛM@£ÀÊ0:ß··BâàpOGÜÒ5ÐM$R¢jt¿CÍt½kÛÆ[ùSG;ÉβM#øî¼U]³¥fÓJ@¶ID&¯M Jö@úeW(MJaß9yuÒj»©6»v¦0¢Ä@æ8$ªÁ´ª) RKÿ®ñî:÷Ñø7 ó*÷&*âÃÂ#)u$Õ!Êk׺)¥b°kDë.ýiÌòïë/* ì3×¾<ÐÈX8>Ócm*pÑ鼧êMg³¥{wö`£òá¦_-#¢z üqEÞ}ö¥ÑÄϬ'-c³1bÆ1ÈVðûìªH61ªðcÙ PBÕ«2¨=²º$ad§ò²õâ¹:[¸|¦¬ öç.0XfKyÇ/SÛë1°èrJÑÐ2]Ønú[¦~·å¥±Õ(àctwaI¼e0C±v9³W\(6á¦ó~«ë²,NDjº§;Îf²u,¢/jh%¢°Ã!V=º/6PdK%´ËºÙâðMþpí¸¨*Ä~DéèàÝ£ÇòØóLë"wÊnÉɼôç¼Æáþ±ãCúV?@äÄñì#.&#/y2o:;66¸÷%è¨þKìAù$¾ðäÚÂE~1#/(P#.D/ 4¨| 4AACýÄ%ã#)abwÌ#/#/#)É4_Æ'¨a§_áÏ_LÑ(}^:ÜÀ}#)ù'
}3ÎL\ûHb2KIÚhÉ8J#.#)@;A¢6ÁihѨqÌì¥ Ó¾æÛûCn*Hl¨æÈ#ÛU 0DÑM*®¡ç³@Ìr(å*Ø¢UÙT½ÆîBaÛP¯vV=è¥cUá@b#.36ËFjÒQ² ¸«XDÌ1È@aERDEj`¸O"¤$5ôâQ`#)&pQ 91xÒ>¡ûï·1 I4ÄÉí£~»öðòq%'®f÷D?yÛ#{ §FMBRs¬íbø,IÇçÞr#. £ÅãÇøyz;ÀÁ#)C¸T}F¢bd#.m&bi á¸ÕO¹¸ÝÇvM3âÙò´þ¨Ü×¥§É¡¬@¿s30wMv#.?rÄÈÊtü]ÈsÞ;àÇ$ù§lýr4¢gÕüüÒÕ<ÕkðFïFúgj\cüÜs[,¬é$ES6s|¨\{7äÙ4¾M¿4ÄÍJWD,¢yS? õHäZê½Õ#¾>Ú}04~ ðX#TRÔÒ[r@ ¶Èaä`±PhfBzµ¥]G·ñ*&óú±31ST?=ºVõÁ{6Dy¢±Ðïð·\<?¾æmÙ£#))%j_ö?hÇPó&óRfXádHà!ý»¼W$ÈOYä@WñrnÃhÕ&eTÊXÂ8Dß Ó¥Ó÷¾¾Æ©¥£f³ZÒM¹RFç̨SºójeF%±ÕxÖëKX´PIcFÁotÖhîuy¼£¥Ö×6îíÒ+¥âÞ6¯r$Ñ£Ë!fJ+@¸(j×5;¨Ö¢³MN×T*Ƨw.»Ý×[¢ÊÎë¶æ®¡ÎÍÄVB.$¡Ý vºAMWëO®`ê7N aôõý]¢üt ù½A@èãó{ð(zÔÿ7#.J1æÙ#/·Ø¡ëe#.Üñüê>ñ<SÓÄGßû'<iAÐÕ;"Ø)Xïôù¾¼õf9î³äkê߬ëïL±ï[7½ê«/cÉá&öÖg¤=β%Rª¥@¢ #©#.õB&\k5ÇüfÆü²Lr¼ÿo~DܨbQ¨§ð$úÏdm/Ôª<r1¥ªX2À0Ì $(YÌ%pôiÑQQ¾7×fcÄã´¿"@N1ÂP-bUH&1-ªù½ûuËW[A¾àíP14ÀRj6Ð`E*!!#.Îtä@²R4 ØÈ'÷óç#.B}VÔ/ùü__¸¨AÂC9(ZPÉ(,Éõ?Ùþ×såYP#.»ÃpȶhTaTdZU a#´#.¥xtüfÉ£ÎBÄâÈVV d#/X Z@BT#/|}ǵø 'hJ¡Ù~ͽ墤ÒU0SJe*ÙH
P @FÆÁÚ*/úaßÕ¬o¿<.ptCë,xÀ N"Ô?o3#vèH(XPíðÙ+X.m¦û:|rÃàÜñ¯ê)à¿#m¶û¯Ý¯#.¡Hä¼Pz°ã?;0pl&`_×ͺò#)+!!ÝU(k|ÖÀÚD4¶kLá´38ù£^-dGø!a¸0¬
qk0TLF P$P¹6àë4á"ÓF*§RÁu¤J7Ac³$*FÔ±âÄX@i lv¸#.#/¶Ä6ÔxªåÅ\£oVjÕÊÚ#/ÆÑ¥ö¥clÎs'G>OmÍ]]«ÜªÁÀ8QlÂM Ì60[K¯#ÞI#.kùEQ£MQhÓÕL ¬µ4d¤`ähÛc&EZ@"iPÀà &$Ð ¦-06ì«°c°Àhv9ç. 3cäòfÖ°ûðo(¡ä:TA'"Zh FHÄvtÈm££Ëu¢õÌT(vtHlG BI ¢¿ëTüA!Æ>øPÈZH9 ÂZ21I9²P+\ÑÌ÷Å'8¼ñwÜ#)SâSþ^<öUîìX£i$-|`´T¡ÇÊSèÍ&Ë\Häc#@66Ùd²a ¢úU1ÁFL¸W¬alÿ«
ÓifU§Éý'gýR|m¡óÈ:%Z-äÞ¶ç#®Ç·ü÷0Ú²Rõ6¡µ6n×RÉm#/Æ9Øa1éÇ#¦Ðõ)HÕ¼& ä¤wôªPØxv" Ø©H¿²A#)£#)û0pQ%¯#)õ4öM¥õ æhüâ¡î_ÎÄ-_ï¯kHc·¼8×/8öÿ§éoCâ"JHJ¤ /¹BÄB]ùíBÀò°ÌÌXóNh\=Û¸^ÞÒmOÜdÍ樮~%44j@¹Cìû¦Æ¯¿7àÁÑÓ (z^5!]IéTÝd©W¾ 1ÒA©>©ÌfüùÕrøÖ¬Í8Ì~©qn»5ÈO¢5²-aFyÐ+#ID ¥ ã
2¦ÌÍyÜM£ÏàÃDZò$ÄH1&áÐf¥é0pÃySèB¹Û¿)0îêù[ïKbücÚùÍÁ¹Êª£ÚG9Ë(¸Å^ȨwråÔ1üöDÄ#.øÖ{VÊgBÝY<o,?¿Éa#)ÐØ0 ,#.iÔYfÒ4ÔÊ-¸áØQMëhÆÒÓi5}RI"'c¾l¶d~ÌÃ:4NxÜ8ÖçØÄ«NYÍt¸õ#/l½`±qRºNåûCÏG=¾nÌZd}hÛvGA÷8×)k{#/r§©«Ó¯1åÜï)ß²Ú¤LýÓ*öö!þ¾s§°±, °véÆÌILÌ]Ú$p@e!#/,!ȯ²¹ñæ<=½Ïd.ý5ëÐåÛ©E:o2a8!èTûU ÀV¦#@TSÄ#.ü}¶iÐpLqÝøÂNä>Å^ËeíSàx¥ô7ºõßKÀN¼m(LÍ¥D4ÄbÝ.q¨Q¼ÒÜåÌla«@l±ÙÃÛ$gh¥3\_3=©i=IÔÿwED¦$ÃP B+>éÓ[5ãcñæ1ÓÜ`±FØGii¬C`¢a$ #.±Ôõ÷ìMÚlA@Ú2=qY;Wkôkáéôg¨MQQÃCZO]iUVQUF-¯_·:Àf©¨³êÛùjÜUä©6°îÕÈFÖã¹#.RÚÎÊa¸ðs%~#.{ðÖÌÝvï¥9:,²HÿZ<æÚRǯNþ-IÏv.Èá}$íU-ñ8Ôáιi±p¡A-¥ÐÞ)¸ºÛÈ ×=M°Â"#)a #/E'x\¢3°èaÃN.§|Fëwëfõ]¤2Ç)¶]ÓnIñËÒ0î´ ë£ímúeÕ°'VIß~:÷%TIÄç8Ä0<Ã]K`~ælÇ&̵92¬PCOF`ø7ã!Uw=]+`N^¾8gN^&.KÇé;ªª©,ºØ`>ûC+ñ×Í÷øü+ÖëÔ^¡vaJÔ#T¨{Ôþd¼ÛöÇäÿ;>D¨)@ÐÄ)D_Y¬ÙPêú{¶;i¿9úñø?Ühë`Åh½ñdÉaÜzçê;Ú¤ÀÍüÏ6£´Aʦ#)ÌTwô·+¶½Ç´¬#o%òøq;ýáÊEwÒ:>ÙéÉW4Ûëa¬Î9lyxM?m¹%]XÑOzuÄÉO#)Or)#.6þêûtJëË_CïI#.w9Óq3#.ÐÍoeoÝpðoÞnZMzý<»r4+ mz°}z2þÕ¯fàE#)"$õÈ°##Ð< ükÁÛé6;Xá^3qô;ÒЬLzyPäÈAôDaV_Ñþ?±NøwTý0
Ô#)¦Ù#/JvpCº^]^ààe#)rUЧ4î¶$@ÉÍnhúÌ Ú]
ÞI'÷t¾éøAAS3÷¨&xÌV|tÿKHÈå©èT¨àÇBº;!X
zÒ4_G©N±ì@/#)
K¢Ô#ÜWÎ#.ÿ¢*Ô¯aU(41üÍ4L6múÜ#)Ökí[æ¹5íKºIZLõ©ù}>#.@5Öí$Ýók;úßág#/RCºeùʤU¦Ün(ùBG2#髬Jc¹>Ïæ8ö¡Êj:q0O<ïC4TV·¨»¥ È¿#.
Låøô4x$;9-öP?YËQ´û7Ëã4½:%)E,ÔÙÜQ®¿V bÃP9µbÁO}BF1~Yts.|íaHÈ":qôùpâÂÔRUHÒú@)h BZPPÈ÷rápå:T u4>zý}ÁOâ¨!=ü>ܦøz-UT³3#-$iIB)°ÃRJ4ÉÙfÌbY¢PJe@IUTä^ÞP~)*@iHH;u&c±6zêë¤öDÔµÍ\»qµµ8msÄQLà#.s®Z#)cM{AÎ ;ú,¿¸¾ÄÃ+*qÝíc³ß©Yyx²ñZ ¸c3å9ÌöNÚMâìM#/ébÕeÐТibêCØ0Ã9ÀPö#.E#.¤g(¢F$f£òæ|É!Üwõ!®¬8IbpáEkñ"Ëéդ¼÷$³¯uüÓáMP¥Ú<úþa×ðcÞ¢Ö pY¼"çÆÑ"|ÿv×JÉÖ¡²ØÒH)?z«mdÜ` àF``+b¨he&q }vÊçQjå¥uÛdÙÉsp`Äf梡H,MÍHA0YjD¦#)´ÂF;á@ð¡uDB;JDÜ~LÚ*
&CRäDàãCPbäqLÒ&üŦ=#á0F´0AX¹iA=ÕÃ4ÇèUkrBÕáTÈ3VSüÒ¿o¸ÖHGÝÖ±ó0ê®Ñ£¸x1øD¯Ü^#/ß,6ŨÛE(òPNÈ,2XBµMM#.&´g@ÉJ#.H0\ÝÅÙ)ºé×OVÝË(íÕxÀxÙ9£¢SFiIh!ÜHVè&6°pP#,E$Pæ(°ÌÕ±±&áci,¤sYTL®V,ydÊ̼$Fn",TÊ4ä@©ÖÕGJ±²më-(ÍHc£qD Ñ)4(AÕ_#.½<æÖÓ¹³oZÖo(jï7»Iî4Bbml¦ðS.]-OÀåM¦ÈbRdum[ºQ6G>rVðh+U8æXd#Ã!KÀF@zÄo mMaÉjNí¾ZTÔÉ{$z!°\
Fmd¬éT 5uCtµ22WF4<Ý¡£TÆ6uÖ¬ÄÜQÒE½³DÀ`27nÑ¢ç.r0$yªJ±¤¸l#/F³pa£IƨÀÐÈEè\Ò[3Db¸àp0Þ¶8\m àÑÆA_/Î@'¤×BõÄKHoRÚ,ʤ»²#.T,`eÕË][¤ðßxD¥Ú@È2Y2LLÂÊcH`ìmV$û¶&B}ÅÄ#ot7ÀÇFµg #nVÆÉFÖ:^²12"D¥
+ÕWãÛJH}Xk#.#ÃXÓLÛé¼#/ªl¯JcÍLX0Ü#`¸g Y0©4Å2Æã[¤è`FfÙçcÓÏ0æÓEÎQÖýód«ÀÇ|@,=¹3#.J4²lFâ*¤'¢<ðá×^àè5FiEµmºXâ8×¹¶&0<]4n#-8ÅRE!gRf%£ß¤#)Ò\@cB(m*!¨ EK#)Ãj´»@Ðw9'çìí,©þÉ4þ¼È2mfB¡ ÛLòºH¨B0Æ«59Ìèa( ªT(¤¨BZ!&Z&!N?ÈTè©P?Z|ý`(yy/àôOwîí×ZTz ßùaÃ@è7öo3F »É»;].Zz!Ç* `2fX
¡RaL9§i+± ê9hùD?3ÁÂ{øì.<>:k*h#bS¿f?yÜ·"sQ.!Ê Bí*,7NÙζ ÕÕÒÚÞÛ¥Yè!B<\ÃPy3°`ï§u´'®¼òQ±l_#.ñPrçk9Xþ
,òÎÊ$¸njnËpÈÁlÞtB8ÚS®aÇþU ·KßÖé`oy¶5Â\æõÃ]O¥Ä´¿CéåcØA#.%¹³#KõòZýÍuhÃL_BÐ(ç=±&EüBúvÌø ñ:2¯ìþÔïÜF ¬Öu/0èaÁx(a£ïf#.&¢Ö¿SÈ$çxeô¯SÏ`=WiõÀ3ZÃ}ßSî=#ü}¾îÌKñüRÄVìø0Þ¶Õ=ì0ÙcÐÕ²aeÄæ³#/¦ÀõkåeÅEà1'=£Ád× d!±(ÌÅT4mkí=31#Ï|ö»~"THXWê#.] ʨò+¦z&ªÿݹ²?ËÌôÙË«lO#)ÉW±päpùjêT >¯ê çVëÏ)o³ÄíccT8î²TJUÒSÝ°p5TG>é7Kï?GWY«rÒª"pbÃM°A@-#/a³ )¥Q6xáØoÎ' &¸Îþí)RRBsl#/©ýUAª¥íÀÞM4k2W³SX`ãT¤[FAK½:ÜwvhkQIµxæ®Z,oʼmX£¢V@á#/jRê@) #.k!ÿa(ºF- ´¨3cDa#.Àèz4TÂØvÕ"}#)ÙsñN_X{ζÃ#)i¤ #)xÈ)í%u#)âªæØÖÿFãÀ6q&NÏ.¿NgíâÓ=Ïm¿CÅç)ÜÇö(Î@éÌ¥þILÑøó¢§d´F7W¯4õdB8É BáS
åë6ö`.!Ø ¤8Ñ7%(¥U#/q¢T2!ªBDè&©4éXPÄÜ'y¼=rB¢xQ"ãìÈ®BÌ<ØöÕCàªÂOò?nÆÀûÈMÅ>Aî3᣹Í#.Þ#/ <' |¸·x¢^£©3oJ¯àx7ÞaBxâø_PqeõÈû¤DááP<ë5Rf¥Ee6R"4¨ÄM#.´Ë)Ðʵm¡ IZV@ hX6#ÜMRØ ³ VÈLb#er$ØO³#/\ÔPËâ(Óc¤d
a¬#¸!+DI1ct!E#)l5Dbjij#/34ÚEÆ0m;Æ죥d*@¸B̨0Ð#.¸#/©`ãþ:ÙwòÀt #Èc0"îa# PÌ5g¨íCW\*>\±¾|>Ó»Ìëðõùg#.>QUwõ³Jíû²e\ëi¾äá,(¬¸µfc>ÇG(ÛB`3eMeK(Aí:Hëuí1ÆC5xRbHÈ-Ì*1¡²ÕµÇÁ:Ì¡S¼)ÒEff¢§BF@LÌíÙÜG$iA¡i\p3cBSº;·cÿÍ 3ý)éOý¹ÁcZ×jkÚÅ (ÌÕ"»÷kffå#)m#.Ú#.@çÑ}`w>Îç]ÜÊ?§/(í¬Á$;7H3ã¾®'q#²Öúÿ/¾¹¼Õ6öé=tDÏ^qPzig;A¾gDívH#ìîo§[£ó°t §\èJâ-¥A#.4.Äë|o²<\!5×9§ìv¢½
4òEïÁö&Ç#/ÈÁÞ'Ì|Y§*;¡ÐC'R¢iÖ a)(ýaã_Gh˹Úä;¢uÝ3áøD bà®ß±ì¦#/°ÏôÁ;8Æ-58ýß;®FfnÓ%OÛTdÍ{xȩ̀å?
às®Z¶4@âqº;hDôdS Mµ®ü^æ滸8¼Os£Jt7;Q k©Ò¼ß#.v±1ðZ-ÎoáªóåîKèܵôô¹:§ç!/Ëwß¹÷ï ý1)ÖaÙóç×^ RçåórÀhG ÃËÃó·ÂÑFDÁ$}$R@;Úf#)ÚfKtìÁÕ03ÊÏ['×ÛüuíLR=Ò·äz»m 'óÙ:X£È]f#/rA(éP±þ.áãÐ îþ2kn><
;¶0øôbJv&»|ïÐ
aY~¥Î\[2ÎJ_~níeSLðÇr1=ÕIÝÇX¸(wö£¾Tu1𢢲TÞæç^Ý&ºwMôHFQdÂéTOX;wÕ°vÖñ`äØÉÆjn<]õ/qÎs%Áë¸}ý0êéÁ0cFÐßIÕI²´¬¿Øª×BM`¯ÀN<¢NtNÎfp¶9òæHunÎJCÂ%¼¤êjí¶pÃwéÇl)8g4a´cEar#¥CIº/4ê¶À×Gtøhµ§7k8'Z3-tyM#.«wÂpw#G/®Úö {I¾¼¥<ó$¬Wrõ½©ÑóÄÍyq«ëÓñhuz&
sg>ÞbÁPã@×Ü[[üÏ'Y"äø÷ßuFÇ<Aàäç©7ë}ðiï´»w<½¶sEwv÷¦é»ýW¾$Á'~îHñðíD{*¼v]þ(wî±è3tOß#*NÇì¹ØTç#ú68mL£<£ÉäZMâJÔõ¥Wb-÷Ã)3Èt:ôm_-¸ºLxMu¯ö¸V$AífºOëyHñ~Gz#/Ý3éõªe,¶å³\ï°7Û#.¤C q¢#.&/"¢+]$r(FÝr1¹jÖÚho#£2)ï:f°üÏ#©Éq¾£·°³Ð äFªc"hjXÁåGbDqS"Jç}1`Ç£¹C¥×ÌìÝîCÚÎAMDQ ÛEÙ#/
òI@äöë4ÑØá%Ï;:1!û/88Ï,Aé¼³TO_:0K#.äøà)~±)°â%nÊàp¸¢]ÈæWFÿC4¨Uâ.MÀÂÀ¾ÝC»@:ÁD&>>BÖ$ì]£CDB¡Û°ÑßÂtrÅÀ{rÛXÕºòaK. £79z²ûk»ÜJ[i å¶É°v²X^Mb¸x¹lhD D"#)¡#)g¡cªhÑíûiUsfvÍaa´p#/,ØMûëÑïñ7#)Ð8pGd@0{lÛ{éËYZ$¾;>¨3C ç6Né¸Ó³èGòCÖoI'|Ò\"z§¨AÖ>}Å
ÓÞwìíõ«D´Á©Slä¤JLr\p÷CýävMd¸~¶×8[lÌ<o18¨ò8r]ùÇRy®è»qê(=Áøw1'ïlê%â3®'Éaí8ñÄUè;'ðç?+Â3Þh&*K4L·KóPtcbr<·{s©ÇÓA×£ôÂXætr>ÎUôö¦¥âÉK/cºãæ»Ç<Ú.Ä%t»S\Á;§z;ÆaQ©ó¤û.5o`#/$Ñ#)tïÒRöá!úpSÄæZyvvÛ½Eò5ݬ×IÆæ4èímÞÙ9â2#.F5Þë¡ ÑïOº¼é»Wæ+#4bô
-²K6¶Mºv]VU`¬):l½Ö=iØÃj¥×Lõl;¦Ö¾8[,³DBæ¡°VçÞpê8¿ÝX1³Ê¸£ËOÕPùëÚ%ÝRzÑI« P{¤BÕz³=bÑv¸Î6e*ÞN.Eú¨[cXEfða¶##. ú$_Q[0^çOqyh÷¾ñ^2äjS¯Y4Áý8úi=%¹dZÑV|q?gNB:ZQJ0IIcC8N#/©ÇpÂ@H=W©êi²´V0úívÊÝ{<=zS:d´`VòºR$e¹;1F@¼,'Ê·Å`zxèPIĺÀÁ'¤n¦ Q,¹KÔçÕ|`i9¤õN6C¿smØÃÖçD6Å®MиÂ礸hk²WÛÃCº)*©2Aл¯Äæi#. 0S´_2f Ôw3 ,0JÙ6È7hfÛ#.¥3ÎÎqì%º+åvpÃY0\Ì<g§ÑJo'Dyâ ü0Τå|QJLzyfägjj£¿óèæBqæ1¥ÕOzÂ{4Ã4_;|Ìmû'fi 50qíÖmÄLÐÁQÞ2®®À5^¶-5°¸m[Ç_â>y(a Hd&èDm0Ì3V0x5PÍ#.4Í4¥¢ÒU1iÇN(Èb«oMh Ö5ÍÄæ×6Ç¥Ö 4´Ó@>Éfi©«mé®Æ¨ÚµÕÐ@¨Ei>*¨*ä38Àz3§7WÈÇ:mÌàcgTâÝ2Æí¶_ä×Zbu#/F;eC¨!Ȭ´0¤ª¡ð)(E\d7ÙÌÂÍÏ~úvÊFpÙ÷Ã5öÝcÇ-.RSHaüaØ,ëÇ^TbÁòÜ4Üü2aÃþïå0lálYÑ2|Ъä;æ4T(ÉIc#.pòµÓcP)Kϯ&R#/8H©#"W´Ê FË=Hîx±í¢0 ÂdCÊðÅvè=HWM¤Úlh$0¥j)ÍÄU9¹FÓc±àì&®]uªcWc;ÖúÌζ֣½ÂÅ´HJ8ir(#.ªXb3%¡ÈØef=íêõ¤âdâÆÁ²ÄfÈW+ qåàÞ,æF#x¸ê9|¬Á³Í¡¬Ë82,u®5µ:Ä77»L¶ÔM¢XjBÂYw-Ö®g^¤`*uvf¡tíV'T©aH# Nia#)j#.A¶1´ÅÄ#f¤#.0ÔÒíRFT.¯&¬×®%:5qÀÃ%Ùä!2êT1¶@Óæ+\ФIÛR¶Â7vÕÛmá¦o´¨#.)Á6RCc´È;Ô¬#/ ³#)È´8%S)TTT*ÃÞ Òic#/Æ6óQe¹yâéhá
ÜÆFÆ.JCi50um#.7IÂ-Æ9¦î³ hrÙH4ÃÀv3k?é90²üÃq9:aض@êf,yµ#.ªQ¬Ë«p&3ÜA.âà7f]é©H®qt2ÐJQK#F6È5aB
hmFLD#.¡$Íä墩©¹ç ÖnÜÒ«Ë28t"'®G¥×F[ Õ¥iGʪ©µ@¡Ę̀±Äel«ËèøL!XîE®öªã)ÓiUß¼\R[Zr<bÖæ¶ëCá½,-J`pÍ:_ÛF÷aZ³ JFÙÜ$éÝ)µe7L¤Ñ1Ìî°ÄÅÆ]¯OÒ"Ò ¨`¨×]Z·ÑÂ#8ÆÂPùdÛØ]"I¢K;j8n<½$f>¿7×ÌEUA0Y#/½åÝm~a·¼þàÉR¨'~ðê"S#µ1ÄÈ2ªñó¹/öX{qÀ?A¼'zö*5;k.¦b¥1Ý¡È ÂEUTd£$=Þ¢§¹%}ƯÁ9¦?k§ekeÓfq3 ý â@6ýÞ äêA"pm!7'³Üõì!賦 qnqa²Þ7ê[x³ ~B°v±¡ÿ¢³|³Áb"²¦«Ç[o ÚcFÄUªoq+³F*.¥ª"ª5AæÄ[;^Þ3¯I{ØäDøÛå4èpçRB k2ÙMT?9ûq$ý~þjny×_2xôSÚ?zd¤÷ª#/ì¾e'i2¥Q eB¹ N¥@Ô#)>)ϳù-ÓàâJ~ùìô{,9ßÔÌT¬¨Ù¤«h(Ô!BÊL*ÔÊ0Ê(C-,0DìIRbÊLÒÍQJSI¨Y¥JE1PR´RQ±¦ÉJh³iRHÙ2ÄÂÌURLLH#Mózi69k/7j2pïж²ÑîX35ulr˱Qüxó9'g¬EáÔÄû®Åu'±-ð4ØR<rO´×1qèJbËõ÷| ÃqMvÁ2ÃmvÜ/ßF2Ýæ H(Éð,9J{Níü!Ù`Bh\ÞpêX¨$ênC1ì>~ïM¤|øxÄÝ<
B¹-`Êü?zÁ¾}MÖ·c/8+ýQ |ÄÒÒ %w ¬k#/L#VL·Ö¡ !b´Å4cí#.ÐøÄÙ¤#/&"#'ÒUû)py7ô.5"#pY1ü#.èsïË£E`ÔLåÅFQÑèìr#fÆðqÒ,b
Þnde0lY¶´.Ò¤x#.#AU>Ûó8.õÝB}=ì×¾WªM#.OnäÀcXù¤K_d0hÆ'ª±ÔÕe§{ÒR¡cH1¤B$&FE`EwqíèkNÇʲÂqaý&X·CmN( Ñ·LÆÖP©f¢Ê4å¡8»;jÿb.V@{zðeÔ·öCh7¥¶DÙ¢bv½:D ÈÛ3)öIQ 4î;&ScuRâàkà$IUSº"××Ýé¯;ÕC Ü'Ã)¾¯A }ð|Í#ö:¿cÙÀ<=¨oZÌéã¯KV}ìÇT;¸nL$Oß9w4¦È©øü!å/ܾ(Ç=0ÜØ9ÔpÙçÊO~U6Y7õbºÓ
½WPsÞVÃ+G¨¼@#`Y)¾½8¯Þñ^mÆêQJ-Õ¼1ë?/Ç]t5*¨¥vÕÐˤé>âàpÓ³1tGyÆËoäb=/POZ8>é§3ñË>7%t¯l±zT\ç0\èb+0 góÏj¾»Ã-D¿_Ô|´äóv}Pô¦~ ø¿[/Ýb¹H4öäÑã<Å,=#.ÊçÄ}wÙæµ~Õ{3ÜÅÌÌz)HI®âÎ^o*ÈoØUbX5{. ÷cÂý\JÜÌ#/±ùwd³CO}XïÐo
Ø#Cý?9nì;£¦·(Q¼0õ0Òc±0ÌÅ4=ÚÐ ¢(Èo?Hõ/mRF_C/ì6&\#)|N)²÷^5òü(ç ">¯1läé#)°üÓE(cD$+ÖLG$`³E#.BÛ<ðÅèçõ¢IÛø!h%UO½=µ.+[ÂgL¯ü.U¨¢]B7A®T&X6£Zs¤Q£n¯Ø¼``Û\[üòk·U*©Ò¦\)T,ÙqQÃÄâ±ÄÎÐ'NW¶-41Ä!¸ 6 NØ2 ¡"DÎlÓSúKJÁhaþR$EF9ȸd\rõÓÇz6^ÈßtÙBBÉÜ4BôBiAG>Ö(įHnç40Hgf]¥¯@Àg^¶pA»f!!¦RĹZq·Ó¡D·nD>ÕNÜH§FaÎ#)Þú]X:ìÐÕe*<L:ÏaúÝh#.%ß0r£NÒ=<Z9«[ØÝWÄ`ÐÓuÇy±Ól¢b+"E¹FÜ72`ÓÆÅÄÈ#/Lj#)ÙÆÖk5X6ëi´lå:N+ûÞO®v²ß[é\. JÃAM*ÅPö¥ÝÑAIZjÝõçv*ü *ºo#)±y-Fár,nÙvì<»Á·ÅüõÀtä¦b^ÓÔ7yÒHpÜ §lT!íYíÕ9ÍÕ¡6.(ÑG$y¡é°JA¬Ù#.ÃI@ôd`å#)o3ZV-!*åS©qÒW>uEaÓáÔÇML{»#.)ª\ãz=7»2¸íÇ'[Ë2eÚöc³K@:6ÛÃ#)ècMB2¤!Ç=Ñ]v`Áë¶"aic&TPõÌè3i´¨CR#);9stB¦Hae°b|ErEbÓ±¬e´è;.Q0éJ£$À§3©2÷k¦LAzîÎ#.iålÓ÷ÍC6Í éÝXܦM× ûA[¤ÙgDØ6@%j%+xVÏ(réUTîåF5Mn¸HÚ?_<c×t!£2u"eñ×1µ»áV^éº6ä)g(XW¹#.FìN¹kµ·\¥»îL`Þj"ì=æ®uV»*6úaSKxQÃtInCÎE?b1&iÓSÕËÅjMë`WËxé°²+ f@!Òõ8
ÔðF¸
¢,;,YBú8ò¾Mt×'plØèr6:Í!4,ÓàTÊ73&ÁÐ9§kégÈkYfhPâë:Ç(:@÷GlÕ§§<é¶m.#T²ÈOøôX¶þòIK+ßqr- ÃÑ?$Cãf#ÈgM6vÕb)(B¢#)ÚÉÃSÓÆ-Î(0
tÌf$áÜtCÉ)xy·AèðãÅ^åÐg¡.PîQÊ¥#.4¨,VO3±ßò\ï:Óð1 ¸ë\Zg;Ø0SC3&3TQUÚBI²pÛ ä¼±j%Í\
u;0e"ÏÎÿðilå3dPå5¥â~>F¯ìoò<4#)ÂL&N¬Õ|îf,E¸C9©jÔÃ2´¦>Fdº¾Ñ²ü¡·îk´õÌØßhæ+,"áÙ¬¸AÁbw°j>yn%[Þ5ÃÊ"0{OCïIõçTbåh"l\D¥!ÈÌN~K´f5½Å¡¶éêÞsEbÑv»û-Z á9hß,§È°ï|('«ñFìÜ0ã2bBÂ0È"ÉJMNKÕÐß©ÃX^ÌY7¥Cf÷G4}@ËDSX:ªÜlÛÄí0á×\µÌæ_ÊȦtê`,Hõç}0jÌÔÁ¿"µÖ$»6qëÛMܹ}#.%Ð$Õ9Ô.poJ
G+§Èb´#.qV= ¼J1Xo ³J©·Á0_£Õäb·N&ñl}i©F"PÈy¡ªhEçAFH"¸ªPÝÔlÙúAÅâ^-µé&Èm#.(.9u =Ó+ÀØáÔ¯ ! ØÐsnúñ%Ha173º1bETcQªdÉ/U!¹È2#.)ª^¥RË]ZO·Cb*Hlik¯°3Là %Ú£B´¢hëC°ø±4uÔ#Æ#.Á9uTUSSx`0G©1 Mc'²õ¸fIRÐv$fé¼lR¥õSgc¨Ç9gc¡ë:*×ÜÄÐi64é:)AÒ"1´|½}¯ËovâHÌ1o_Z4ëãðôWÈtwû{ÉT#ÒÀ$è¦@+âJþßíøõkuP÷ÆÚ}yµÞøØk_¿âLĹ_Lmt¶±þEà1rJo)¬§ÀéglR¤l#.»ÊêinÅxÅØÙ&ªÄÎSÐÄÛ4R¢=míñ¥L3¡m[CÕø¼½£§fÖY?#XAûù£Ê¡ó$_N'ÙÍ4% Ù'1îg:è\?Wæ;£
Ð]Jc²¬©@ñ,TÐiZ ü¬²ýÑ¥÷èáaÝ=¸#.(´,Ùh®
æ¹+©Ü1àT§-ZÊZ÷Áa5_nK!¥^êUq,¼¡ï0}a;]æl©»¬3fcI×=âÿËö/Ùí@ЫóÃyøÆ âwoÙI¥v¸ß<à}RB þöB9î>Úèáp`îP9GhÐÄ8(1²Bd}§p)±¤ç&ðÆcF,ÂE%RÀ!nbhb)Á5¢4æ5.Ö1F!!K(ÆG
#)J d: ´à,c"ºÜ#)°äÐì`a6>#.hÚK(4]mʨ¾+6Û#.ËÁw78ÝR×$¥a#Üûnæ;·òà©ÄáeàÉÐ6Ä31ÁwòiýÆj"W8,èTp RKs1µU º!Êeyð¬ØÎ
N.~I8Ló÷Ú`0]BxÂ:FBuÞÙæÌõhës )ºDßlóë{i*¸ic8x yg8·¢t×N²'<í!ßÝeëû´i³;å4Èdoo=Núñ'Ðv^]nؼáæz=3Õ^lÁA5áÓcØñÈÐHO0s¥1õjÚ²`Ó¥LM¶Ò¿lúãx,¨eõ;O-ÃCpÑî|<g¯åÑø4ú%A fÕe#/YU)o·MdI´EÂ!)àB"jßqÀ#.@ma!úá¡\#)ÒB3¼Eë|¤±T]êBþÚ0ÌÍàÀ0_h¯£qùô¹ÜëáùMòmK2hÕ&C¸û|Þ'ÅN*#.ôÆîóñþH @hA)é÷ïöÛëðÀáñð5_Þ/Zû¼éµóîî?fÜ&HJæHLx!Pm¤B+.e#/(ÅG|Ó8賺UvÞ6®h«¤¸!ADc cL&0
ÁXEw7Á&9#.Êg#.ô!¨#)`ÀìÒ(C jÞþæ`c¯I´éÉ´¶ÆÒ£ùä|?i÷Ðé¨:TÄ8@aªA+XWFÊ$@6m§°{y´1îÚfà`D11#)êã˾ð˾Æ}}E<ø!Ðb!V"á&#.3ºÂ°Ð^¹<xtd37ÇmBÀ(x îr2úÿ.þÝZ¹a#.Ñhäôºòt×¼
gÍ7ß°
l·Íc]s¿"Öv7U0ZT`:Fõ׿³OÃ*²¹ÄZSµäÄÛOGj2EC¡ÎD´Ñ"m8iÇ #/PμÑù,ûÀ¸é,üµðë>=SîìBd~¤x·\"HHmL¦hÌT%ª¶c5¨hÙµ#_u±néI«\gMÓ6»Sk¦Ä-\.ó2Y¾ÆfÁÄæÒórÖ¹ékçí2HÏaM»@#)¯¨alð×6ó½Òd`1#.ÞAãÀèxÌrf;ÃÇÆ`̨fAA0µúîlöï¯}Ý/Ôà&i}#.pÖõYt®HcÉêr½±²m?1ù(Âäq´·¨bwAMÂÍXé΢(4W!ß--¦x£¯êÐJhKwήxCà.[ÎI6`ïRÒS,Ý7èXÖq¹¹¦tØN&6äï¢\7ÎéREYnåɹ¹d£ý~3åÎèxzà0ûU@#)GÍ\pAlj ;LÖÑÆ¥Fà7eÑfCRè·ÛUüÝÉIPË%!OÄ¥AÊgÐÍÛPlö{¼ÐDD½Ç¹kÔz<@ÄHkò(&È#)?Â#/°Ãi«=^u»rÓ³&*k¬Ö§3X ©¬bÌ{HP qTRzýçïC±ãÐ;0ÌûÌu0BN8éHr°ö ¼j#/}þ^äzzà°LLBxzxl=õÅ8V)RÕ\auùPàÖÄ@fR
ï=ã1hw÷ú7ß×¢,L!ó³)²}¿©Èqê.ïäÇú#øÕÑìâÑ·#)íÛºj}dè=àh"Chk?L(¸5ô?··ûÌýfd{AÛ>ø:<¤b'h¿ÝèÐlè$ô÷ô@X4u²ÆBBF$V5È#/·T;¦\U!wRÐüF]Ðkmie1(¡jX¤#.@<ÑhÚdcs]¥ILbSøÀc!õÆ@f'þ"¾ïGz9s$@!»LÄ9mä ÜÁw!2Ï f§ áäGYZE£eOyìA#.ý$´J&D±RjÉfBÉzþ¢Ð¢ bÆm4_^·ñ·y@£´T9~ÅÏGÌnC°FÀü t!Ù#)öcTÄÅòx aÈ5k6Æ*¥¦HHª¢ÛZÒ ,éÀP!/jÿC^" Óýyýe÷?Ãùɵ´\Ŷ¶-óFìõ\zë+7éêÙHCð·©ì( #Ôöäx^#)§6ü¤úÁwŶf´H9Iɧï}#/õÑ>[bF0øíAÄMϸ¹Brd
\òzµÓçX|8h0qà(}f
8dù®Ä/Í1LNI¢®¼LXRM\.MU*Ѳ5¦©Åp ¤Øè미·E7þÂUæ°:C#.Ë1ÃÛRG×8öᬼ×Þã$l-[¢'ÊoÚcÁØÕBÙÕÏÕB>¿Ý/HEùì\¹m/5àÃK#/37â,ú>H°ÅËfÍî- À7Óùÿr¨`{ÀæG·+#/jd¡©M5%ƬdÚ£Yö;[ó-^&°V¥O¦Þ ¬ñnç8bÊpdàÎü1Âåßíé¢4ª¾ ®ü±ºõõF§³g¤¢hJ(h£TR&Úl£Y¤9Ë]}ý.3ß
U9oÕðý[¿l¡©Qûþþ~íù|H¥ß»@¦ô#/:ïPæɪ=õ2ÉôW×ÈnË`¢¬G#.*ó!LÚÓ`4 ÛCGgPFFkþ=#/í"´<¢ #)ܵ¨Æ2Q9ëCE,Ñ*:ûNXn@tïT/HMHìGxç¾I¨s#@Ĺ3·ücAZM±¦ÛcÛ1#)®|ø·#.õ¹¬rÔÂ#/((+SoÝ5êDÑ¥5©;¡Á#.&Ö2Js3 ÚM:hqfeWs¦*7®ís)`! ¥¤u¦ fÚ#.ê¯=uzyåØÝ4¤RX!$YÂ\sË Êd9Êεm!ÄïC¸Ó{Á>¡^á:øÿFê»<=|O¢8c :à¸Âµ'B"ÁSníòvðçvìßä8ù9Âh ;XGDZª±-ÂJ¬3ë8qPàU¯]zqÂf¨þ$-U#(Þ4~%',ÔL'bI~0m/èܱǢF+²¤¥¼¶ú¦É
e²£±\^GÜtwçKæÐq¤F±/SJ¶ý äL¦ÝR¡¾;N ¹ä_<#.Cµß·Xx=;z(©ª?c"ä¡XÝ0íf\kÂ#.ÁpÏ#)äJôÌ«Gà@Å^'"%2ÙPÂàÛÏpðM<.Ûñ#.ÖEy°´:B)clWr<¤Õ±/$Âa#X&ÀwÓà{:|nÿçcWlãꪤ2îz?2P?ó}f1~ûrȤTÚàØ÷#$ ÿ£èy,»móÅr¿4â¯ùøñ=6Çé%Ì¡ý°ªØÆ(Ûv!oÖ#)½=ó«YÑ¥$âIÓmÀLàÅExÁ¨7Cc sÖº;õªdiEàt²jw»l¿Fo3ò ª9%.ºwC¼öBÌ»#.Ný6÷ïk!!×Oé÷óxÜQO3¬Çd!ÔäÎw¢dÍ.ýA6#.P;p-!¯ÛÛ#.VúX7çÒî¥ý!ÔJ!ûxãóà8§+ÝZaH%à÷m7ìýáJw#O$i$#.µüf=múI |ýZz¸pùcm·Ìv3$V:þ¾½5¢ßø¤^É@å £ÿû¿èÿWãÿ§þüßøÿ«á÷í÷ÿïÏÉïÿ³þ¼¿ýÿßÿúü?ãÿ»ÿ/oñÿùÿãnÏû¿íýñÕÿüGü?öõ~ÿöÉÿþÿ¿þüãÿoü¿òÿÏÿó§Ç¯çÿÏããÿ/'ýòìü«ýÿýß/OåýÜïýe¡WúÀýu0 NGötäÌØ?Ò<OéÀÄL¡¹ýÏüb§p_îª":Í>ö»ïy㻦L$Êeõ}7¶#)<ÀéhYéG]¡Ý¦Ñ#.qârB¦¢#)1|ïáüßô`Ò>ÿ«ãÏt¤N=ÁÏ;ó±ëÅÿ3#/ÙnÉéßàÓר7/kLfv̧¾#)c_Ûå5åúûÇûóô¼<<ýÜM*,ɪHÿ xLÑ7AÐÆ@ÊÖÞì?ãp·_GÿË]ç¸Ì+LpÔgR¬Ï÷¸»#)ÞëL*ú²5ìÚÓlkzY(ÁÀïâÄÆlÿgµb¥±tÓ1ì²" «¿¦wpZeX´h=Í0Ñ&5IË7j²î=Ê:2Ãt#EÛ/5£zÚa¦<CêF2UÜFÄ¡®kÙâ°wÌÈ?w&±db:4rø>G7®'?ÕfÀ¾G
ÝÊÄÌY³DÁ¦.^x1«k##½pWÛ!ÑúQÀçfò]d½æ¬ßÝ«¦8±Ï\û·ûÂLGÃð¡ØÕKÛ×{RW_Ç=h¦'b¢:ävvÙ4ÂQªâÙ0Qdæ_i¯wÃpÛYQFîɵÐÓÓ¯.ÏÖc©øi0<X¢1FBß:©Îûs#1ïÎËXÍ¡&Hc|·E!l$zQõ«B$/c^:tmRPL(Qþq±ç³³ð´ªØF%½D«ï&fÿî¸X('ÎñÐ+éÉë:X ÜCæ#/=9À ÛLY¡**#.¨ÖÒ+Y-IjdË1QÏ#1ANùSDlýí!ã ý'üD®Ç4f£¼ô¸PAMècÂØ,1Y>z¨}áåïÏ4ߥ¤üÊËdüæ¾÷å5Ðÿ¿Lcåu¦|àmð5OÏë;á³OVöÊgé·]Æëf~ºWÖ!z ÖÊÞË5»§[3^Á£N#.*cÜAy9·¶Hs¿ÇbËï*ºQHYX .0é¾]qdc"d:,¶¤Ú¾CÞÆÙÊß"Ømþ¿oGÓ;¦¹VÓ£9õ,)$Îò=ܼó¨ÔmË^¼Z´¥¶¼oUxµ&ÅQª!¤¡@ÞéÇZ#.Û!ÛN´e×÷ñàmÒbÄãþìCþsaî&©HÆ.á.òÑUAN6ѧ¨¸ÿã1GTxJ®|*s#/AÇÿûoÉäw×pûmÿ#äzÈ÷ñ<QìGòïÛ¯üàÀgpz~C ÿÑÁ"oZ=¦æ b
#/I)Hs» ©`7Ð{â¡f#)x«åôà{??ãé¬ µs ç\8§;úÕ)6¢ÆÛ&ÚÉ÷É7Üb{??ë°B½?¦^ `ÿÃS3¿ýEÇbËþáÝ«èÿçP½ëåÿ|gøYñ?êßB¿YnýKOü<õxÿ×÷FÏ[ý^¯Á6sìk;ts#©m·¢ òcÛZ=>©(|è'¥A³Ûêæ8¥óTlâs¹ÿêóÑÎmÿ¸¢oívö&j BøÓ6 dJ?C"ϧoÿ5°ü¥kÝqEcõxæþ[¾rÂsóÄ%ÿ©Ä,¨IÔ"Åɲe¾Jíã%S8 új¹åË5ïpCÙõÑ9vÙ8ÊÉN`þçIbðë-bYãhTKY¸Ä!kÁåôéË0"°ÉB7§ÆGBYÈJU3D!×{`&øVW´Ð7-ìÓîÿÑYóâ;×)UEø¿íëzÏÞ"ýß_à`aÿâîH§#/¹)
+#BZh91AY&SY9 ½´\¥ÿÿÿ³DPÿÿÿÿÿÿÿÿÿÿÿm (¬#%00e(b÷/mÐ#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%öÞúzómmkîÖZÞæ²U#.´[iÚ¾îõ¹±µú:¥'kdî7{ÛïoºµÛ¶ÖµK¹]Øvµ'ÛßO¾ö¸gv÷s½÷¶N)#.Q+Ù½íp·µÞ]/{m»<{guÒ@Ýó{§«vo;¾ø;vÎiîáÉî44lºï{ß|ûïëËßÚU9íõÝÝî·¯y½÷½x#%#%@(}ìh#%` ï²=âwfí:4§[aÓ¹½ y©³A¦¸ê»´ö4=¦öìd+Ö¨ª)íf0#6 *¢{Q$#%#6#%YJzÚV½%çÍíîæ}»j½êºaïjÚØá3TTf˦Iv×]s}6óu7¾÷z:#.ÎxûÝW_=³ÛzÖåZ;Û»ÍÝÛ}Þsy¾¯³»ß{¸ûíÖîiÉÔ÷Ëzõ¶§rç>^æû}ñ¾íóÛa zúz{x¹-ìzÍݳֲ4÷³¼ÛÞ÷fÞÏs¬ô`u¡ÒãF°Û"EE7w¼#%(J*OCÀ#%lîè=÷n{Ywº¹½»ÐdÜöï>}Ü[vÇGÐ`>ÛEmk®¥ÑMãW`×LæyÛãÚ^u½#%}÷aît;o¶û}|{mçOvpòǼÎo·*WµíÆܶ2>öí®®òÏwÖõ»]´î;ºjîí9QÚt×·Zt>÷»Ü®¨ÜÙu÷ß|}í«×ܬ&ÞíN«îq\îû½:¾Ã.ñ^ÙéyaC§¶Ó¶Û³®÷Ð¥&nCzî¤|öilöͶíÝîвë[¸÷»³Ûºû5ÖkoX«èqØnöÐlîõÞÞ/`{´ó½wÌ>ïÐê¥PJªPTT´jB¹7uÐv&i¶vÜèº]vúÝ:kÛkÔØëUUÜ{x÷)º¼»HкÚɯfw#%7ZI#%#%;Ü^êåÉÎó²û3ÊF-m½ÜözÔíÝÜì_U.us[¶õv]]ó¸|Hû,ÍqÑ»ÝÁæñ{c;úçvåJº{+¹éÔ²õ§l÷+ªWg¡»`úùÛÙ;{n#î²Ç]÷}çww»{»»xîvÛ#.¾Øú½mÝEfù"s¼ï¯¼ùÚÀ°ËlÐú$/g¬íÑx<ïÜë°VØ6EǵޮÚGxO{×>öø½ïwÞ´#%À*×Û;Fªµíí7¶;g<ÂÀëu´oSk´ÝëÓmï 9.ó®Ú×ݬ»Ý¾çwÅówwtåvë¥Þç:#.[.ëwc ÓàéÕhÁgu½Þ^ïnØu¼ÓÐ
/=ÝÚ4#%c¹éî½Mö{ÜàìJ
U )½{xW»´×`ï{®ñÝÊäÅÖÃV¶U[}÷IzovuÇH*í·u$ëIÒÖªîúãÞncÚ[ÓµÛ× &Æ»»}öøø½óí·³acÜ| ìÁG»îñÌͼÜ&:·»}½í6µîÐíç;ï¹ßvÛRÀîï·w}-âòó[ãnh &#%& £CBa0#.#%äPÏTzÐ#%õ§{SÔõA) B @@©©á$zzIâ é4#%#%#%#%#%#%#%D! M5TÿMoU<ÔôzTý(òÔõ)é¨mG¨#%#%Ñ£@#%#%'ªRD!4dÐODõ$ÙOF¡£õM#.ò@#.Sj#%#%#%#%#%#%$!#%&@bh&M#%M#.4SÓi4 ¢ #%h#%#%#%I¨ L#A&¦=&õmê{SIé h#%d4#%È#%ÿÓ?£Uirê\ÕQWwk¹úµZvhÊ>5Zu!LA³ ,LQ*")æ°Pcõ§óü Zü5OùÓ¦¸ üæJt¦î£Ä8WoT"¢]^SÌÆ´_3ýos2ìÀlDs4;m»qE6®ñÎÊ´ÚMíÖØ`Vd
â]jíâ5o# åñ÷UI7wD¼áÌKUå¦/Ý~«oÔBäE"ªSº»U¦ÖÖ5k3khÈ 7#%H*-E Õ:¥$H& " HåP° !ß#%h¡#%ª$@dPÉ@mªfL
ÍCLÓd@M$Rj6Ñ3525)FSm&Â$ÐJ2ZQ°h[Fi,i¢Z!#.F)iMF¥#.1eM£DRl¨ZSMhYi#. (ÌÌcRF£Qµ&JlBjcI@hÒËHÆRF¦"[M¶³U´iÆfLÈM&²m¦ÛM65%)-5±¦Û3fZL1f´ÄÑd¢lB!Qf´R`4TH!`ؤ©fJb0lB XhdFIR&B4±ClÍ&)BFRÊËf$@ÒYY5ccE#6dK) -)¦ ±%&ED2hhÉIF($@VAME¢fRÒ¦`ÉØ1MÍab6¤ØV$$´PRD%¤Q0EaÆIL# &RJME±£XHÒjHb iM$"H²[bË2F̲3bdE(Í&U4Ä)A³Q`,i¦Æ"5+%6(R"I&¤a³LcI¡ &¤QÔi3HÚ("h¢kP,&YA¤²2%&DÐM2*4f6)1¨6ÄÊA! "1F4,Ë Ù&TÌÕ£l¥±(#.H¦!HØСYM$QF¤É&ÉØÆJF¦h±b2²2³i¬D`¢JM52i!¢)#.1Sb5*R)#.2)´
HÅ(ÊHR"E$M)´i5DFÀh&Ti¦DÚ#.,ÒeDÈY¦ÉJbD!f k6lmd°$4Ld5EPZ XR$Ècc1 Â2RXÔY¤J&E©M(ZhII$2ɲ#)E,Ñ¥15²e"$4M¶¦¶´`Bjf¦F&RLÈ¥6À¥,Å&%TÙ¢-L¬-bCØRD#HJm~Ãk¢¦©aÍ¢lVƶ*6L¥4ÔR¤44´
¨ØFÉ5Y¡¦c(ÉS*H¶D¦[%´QIKQµ
£&D±5±acR#6e¥2eI´*Ò4TÙB+dË"©TÒTÂ63¶,YL¬S,¦ÖJ²ÙJSLlµ)¬±%¤2RÔZ ª!¨Õ£%AEVMd£jÅEHkDÑ$mhÅÔl2ѵ´0°U@iR £F2&¦±Æ¦&±di Õªµ* ÍKY4IR1!M¤lY"¶¥Y¶1Jm*R¦YaZDF¶K"e5MM¶Êk,Xl²k+,
lÓ ¨ÒD
bÃ4!´
-£T%¢KQY&6LJ,&Ël¤#."+,E1ÌJlÓ4AE¢Ó$&Fm6F6ÆÈS¦cE%bHÌÔ#!4LÔQ¢JdRP5BTÀ4Ó J²Bj-#636£)F̤£!HbÊkÃi4F5&Éa$YP
-4)Ä4Y©²d¬a,±jE¨Õ5£4ECF¥)6b¥fQj4 2ÆA¦&Ä%I1Rcd¤Ía)ME`Û0Ù¤²lfECJ2ZfµhTÍ2Hl£0D2hªih¬ÒlÄ,LDÒRBAh´[ Q¨ÔQÆ-ÃIM#6LR#b-fC26*2%,¤©Ñ´k£TI¢Ë5E$Ô£Pdðj¡kA¥4Ë!E$¦Ih5E±JÛ"¥F±¤ÁdÑÌ¡jQHfJ$©±(j#V#.2,Y*6)4¢Ù2V-&)+)¶D¶M¡¢TR¢Âccd£dÑ&#¶HÔRLÁ¬ÉA#6)³6&"ƨ©Y¤)¤¢&RV-ÆÉ£F42JÔÑie£he¨Ñj±£i5²
Q¶5%)ÐÈÌÆLÙ&kDlU%hÔ,«&´LÚ1lj £cc$UE2©¥XÚ6¶1mIÊQ f²±-F+iQµ´©QJVf*B(4X"J&ØÖ,Ê+I[M²+FbbÑIE[l¶¬R&T*&$¢1PÀ"CFi&ÔÃ%XÛØ´Í[F5¬´42ÖÊY6ÔÔÛ!mI¦¬ME26QA°ÖjMI²Ê B¢LI&RLÈÄd"Ù-¢Ñ±þn··ýÔ¥C)þB51jÄÿTqôe+(a(Æh÷!þ§ ûbåÕ LÿL$hÒlùNzí¿Îó±½9¿øºô·¦SUIPª?ë[lÈÎÿ·ÖYLâsÈ ßùë;L(0\:8À¥pÁI äd*Ãß±¢rý*¤çÿ3ÿ³ôZÑÿÊI(R×+½g,$b/Í0ÿ-npz%ZM¼íõâ8ßwB¹Á¨d~ËÕNØÆZþ,3cRR(lrrXþúݳf¤áV
cÈÌ`I¥Û"lÆLhcôzçG]¼îÞ¹w§¥^¥ã\³Ë/âuçåuÍ\LëP¦"W4LªvcK@¥JAF&ÄMê×bÈÒ3(êñç]¨eñnY½74h6m`Ù(c2@sªªzoþÝ( 7pÊc#6Gv
)ì,`¼rÂü®R[R}ßÒëdzçgsÅéÐN×VÄQL0¦Ð¤Y;ùd«Ïô8$ÚÍÏ£ØÐØj¤Ï(%?·râþ°ÃµºÀ¡
JÅxß÷k¶¶cÂx-2KËw%¬C°UyáyÜíÞw^Qrè»esnCQW6éçqllO²ëå5¼Z4EA¯»º?_ÆWò-ȦWÅȶÆåÈIºÕø¼u¨Û?Go*Èyùæ|m<b#4L9cuPEX°«©#.¹t@#6A!´ä#ñÆ#.¯)ÎãÂHÃz^+Ý\Ѩ8ëÞwcrË(Ë®é$s5öøZAÿhÿJrÈ.YÚlCÙ,0!MðÛtÉÈe«#6ýRÁÃ79ô,ýפ¾ìÉþFtÃÏxV¬@Gô¡d%lþ «p<kìÄ9 c£ðÐÃ|¶Ç#tE]HP0îT[æÈØÙ_#¨½zírH ȦwâÔÍW7mxþVYê?)Ärvj³oQwE¦me#.¿ÂdÔç׶b²àþN!ïe §&¢øuû/ÑÏKà`ö§nínùT)"*¤#6d9#c*w&ébÛÉðfR6z®:'ï.àûì¥k,YL#6N*}±ÆyÞ>ÇãUË"õÖUO«pi)8ªâ+ñ §Ó¬,±Èj[þv¼lQôÇôa1Kèë¯Ç×FÌ÷¿SªÄ7ÍmZ½*£N¼Pâ-#6¬AË@*{iX<ÙZøW÷»(Éðâ»EEE¼nY5ÆÕ͵þìw>ÇS6½ß«¦öøÿMfhF¨%2+zmýW!bSQIðîÜ®÷uVé(i%"÷@X'+¬¥&D§)J²å¢¶/]öï^¯"R¬k¹bÑ_·-×»±öõÆ*|ý{ü=o÷îèëØÔl|ÏÀÞ1¨4ü>õÝ>¬ýóLÖȲ"4£~"Uä¨ræPaLÖ¶jϹ$Â![ÙùzÛ²F²lWßî«âøùÑÊW=ì¼4DÁa«lAHÒPŤ'Ò'mBµ§
C×G¶éE2R]U¥"»wÕ¬ü*ÔðХ߲²ôî²Á¨ÀSE#6lÃQMZH"JuëJ»*Ã#6I¢L²íãe¥ÂS²$+b¨¬N¬<ÙkH](©É#6<*oÐçAJõÂü/;q°óap×^Ro^XjÅÄ"_gñË<TCª¼s×y¬Xq&ýqK\:05aáeF1PXäiMö÷3g{O4ÝurgúkßÙóôoÄï3Ã)#åªiÔö¢'־ʣôwr³éº8;+¹+oìÑ®Há m^L¯q#.1¼öÊIr%ÉnCMÏ}×ì6q¸v~ØÆ5.|båÙåAÅ#S<*Jtªð¡áô\äáDäÑö%*Éú9ß<}/²Á"#.L3¦ÙúÀýv½ëå+ù§T-±·,»í¶g)õïD!;SñŵaÊà=±3ÏDKA´](´¸åHvÈÍRß#v/6P½E#Ç
8qêΰâKè(q<åÅð¹ý>¼ê÷:+#%ñ²(\HÎpÊ6ç´zmï*'Ü©×1Ù»á?_k#.êV£ÊFyûeoÐæ$ê?ßjfAvß¾ÚNü£z
$
!¨.fä³Ü¡Ï\iÌ©Ê#.#¥ÉE0F:E&©¯}Ù
µAîg]°éÃp?X7d1á\NB=}ÙILÆ#6P#6íç;¢gäý=«»"<ú¹áïïRî:I2Éð\õq.V)gÉ
,Õ8`¬=jPûíÞèqëZ®#.þø¯,nM´B8÷8»è¸×µÛºä1il÷õm±Ï׺|5Ì=Zí鵦üLuÙ $(w0©WX uÒBdN>ù¢Ü¸I¸ì¾½iíEéËÒêwë+Õ^{å5ÁZU{)ãÉÂé¨c¼Tìí§ @^Ç¡=4´îç ÊÂZÛoý4^Û1¶Ã±öíªÆË ò-îûâû§õoÉÜn¬æU>õéºiúK|e˨J/±ßåÇ}m}w*IeQ92e@êÛíhQAA9¼CrºõÝO¡¸Ëðuu5¤&÷JÃF}w/Å¡j©jÿ}
(© +þ«¯½û¿éºÚ|~þëÇTöµö°ù¥±GR{¨«E ¢úªS>,õ÷öæß»åj»çíjܱ¿Yõ¿¯õâú·+$þ.hÚ>n·ªôj£]Pê©¨Æ ×¶{âÝûïgå mk4µO§k{ÑÇÛEË£õ;ndm¥AyÑQ#6ÚäúÓ«fͲãX8T¾NL\ðôPè1 ø63Yî y²úUM3¦ùÝ#.X|è¤TWù7ìÍÇÎD^jÀER,)9Õß¹ÊÈ·)óÜÑûúuO³~¾$_¶Ï ÊsãÆ4?Zu>ì]1yÅøÚükÓEµÛX)>óOÖâm8s´ÌëéÞOz\àÚÄÚ¸;â¦R¸Á1~FS_tíÂRn(ØPñ¼b¤RfWYüÊ¡êôcì×ùúù«ÜËÎP¼B´ úY×
é¤DQQe0¨x~Û{*©nf £ªwiXT¯)6-Ï;Ë£êw³$3Ê¡¶Ö}TÛÉ|-ºz²8ï5`BüéÝââêÖh¢
Ò¡¸É~¦JΤZ+¯¦9r¬èlÿV´xð¨#6h6ÀêD¶x0¥Ë)AX³£*0²¹ë¯_#.Ç·È÷zìe¥HÙÓ,¿µñïñ²5AòõÁÞ{eÔË7Súþ¡&yÖYñ¯¥³LÅS¹¾Ù?¾ÙÊ-y¯69^è}¦pàBIiK&±nÎǨþ³
éÝs»Î¹ße²ð,¼&2:LäßÏå[«¸óxHÇ®*Ø×ÒU9åé1äDL5;þ²ÏiîÐåQT nUÙ`Ò#ÍoJò41Sºëïv馫ÚÕéa離Mô4O|®I${U½órà¼0;0©*ÃzG/½7+#%Qb ]öÙK\.ª¸ÌÖ÷) I9q×ëa¾¡¼òó#.ÑýýïÞ5оä¬×w*8ÙA'<ß:¥bÊï¬2×ÂxÕQn:ú,öTl8:<ôáyï9ëCÛ¢M\¡"#.JvX¢=Êóðw¹Ô%g±CÍP´GhaÑû£ªºÅH
ö)¬¾U.ÎõÛÂîA=sÈ«ÔsH]#.¤ú$¢8.\Ó³Mìòõò³Þ TÑTaÓM}ªP «½È¥>?¿½¨èØkÕborR#Rñ/Ìç*3ÔÆѦøÚ4u©ð±ocÈÞéñÇ#.vnV»pÁáã)r³Z,ª£.OêÀ·}zwîÝlnª¥.LQøy×@EHiwýÐçç=Qq§"%V2&0+Vq¬¨w=Pë¦uÁ7ºV^-Eu©QQ'çU0D}ÏéÞNi×ôñ$¤úÊ'1ÎK¯U=_lS#6´í0ã×D1zßÆǾ+âdpÚô±æZ?wéx½\`<+½fJøã×~WKËÕ¸îáÝ8n©$z«G»à<c½Ì/Yá÷Ó vfz3ó¹L´cz7kù%ûÚEÎY¥ñ¹-J`]ÞBvP\ÃÚïHm2LMßwðrÈ÷4:ðŵ¼`¡¯\Ô½u}<(ñf`¨Å³÷ôͽUQ9c:ªO+%öPiP/º°<H¬§`±È6,I<Ye"4ECØ@fzÝ«ÉbFõG¡B>q¡z<À®÷±¢Ù èì#á?}ûI¡ÓL»_KÃ'ëB¶Øÿ#É+ù¢ËÖò|Ñúåµöm±×ª©ü°áÇ7û"ònþ½bô#sh¡¶¢~¥?~´V]6k)0úô£ ¦ÙUBÕñ °U¢,õ'«@5ûÜ+ÏÕl±X6µÉ n.ö{pùèü}´:ÑÚðy¥ªbsf19%¢ØñZ³æ#Ô#6 ê,&Ñ3|#6y"ú.$#.#.æuµÅ.÷ éÙ×»*{gd¾evKfûQοí¶ÒÌð7N hÃe hP"1b±êL`ÅMm¬"ã-ÅX]#6=©Õ)«Î#.äÓ2¿+]øºtÉg:Ô00Y½UDàÆÛHIå#LÇÍ6\j¾}Þ#.Û»Æ6Ñ=U S¿ÑÏÞtÌ4såÙº"ïg³.¾t(ÄÉ:qþ²c1û¦³^¹ÙÈÕýÉn*fb¢fÛã;èXhêöÛ÷Ç1£a¼s>¬=N#.ä÷Áý(ûqÃÙfT`ÒalÚÞ~2å8Àr¥¦!:Y@àe¨Öj¡Á¥N¬Íec±;8`ij%ÉÓcW?äDM¶@0L¸¤\Þ'kK«®NºËϧcV*±FÖÒßãñð³Ô9OäÇ»éìåôÁõ*5,<:Ø|EI$¹$G4¡Õ{âS§#%beÙTö¯äìÚÈQ·Ø!ûPveòóêÞ6^ø\F´÷fX=*´nïú>Q/ãnNQ#64
¯¦E¼×^Æ~ú`GÈ'0õÍ\PDØLÍÕ7ØKuÑohsyÛÝQ¼ã*Sçs;5XvPÍf8uÁ®[ÂÝÒS¬ÝϳÔÍ4¹²s?
'ÚÝiÎ;¾n)tYG.å¯K|íMÆ×6AâÖuü×8'¶¿UÊÒ»*se¦ÜL)e8«|ãý×W#%}O`×|AÊ>bmfò\sIÑO##y3£Bé#.â }ÏÕ¡n«r£CDb+ÂÛ`ìúÛn¨>O½Õqòh¼×59·b¢ f~~V#+bç±^Ug:^ó×ÿxºTq(Ū¿1y{TáâzÒÔ²?[좧sÔ5YÿÆgkqjûWXvã_WmMÆñuÍZ3¥Q_{=ì㳦(5#<IÛD9Ü÷3Ï^y%0IjÂÉ[J3NMíT¦nPÿG4_oñï=BÚÓK¤JÍ¿ï¹¹oÕa^ݶxe@eëªã8GHºê½ÙGÄÆÀú"ûÞ° £wñý~Sa¢v®4L§Uz°ÎÞÛß²+fy´Þ¿#./wWdË«^úPÄ´¤áYKAq:;åG2jT wÌC{¿ÚC¥k5PuÝrª0àÒs¢l+«3Û¬#Û8]ÅTò»Ó:úûâ$KÈr0Êâ(\ñ>Âæ©CÞØ ¥Î]«m9¹ÙãH X1ºÈ½7¸ÙdÉ-KOèÜû¿qÛDËâíÜ×s²ó#%$ÌØ@²%"£ÏiñÁGn¦·ÿ¦ågsáºÖÉÑosã¢Ñ+-¯m%b"¹mofÁfm{pYpÐØoÃZ̸Â4¸b³Øúxì^SÎuÜÛzVþîlbݵ Ï°POæÀ:»¾Zn(Ô#{7)×¹LùÏãÕñÁ÷YÓ¡áõ"6zXø£°ébcGë-þ7J-YSÕ#.[òw_#6}P$RFÂ/þª:üó²§HèCþCo:Të=49yz¿ÃÃÊræÄ{´R4IÖÌom¨3 ]Fm;Àuc£tÇlozÁ`(]ô¿5¨å¥÷!.º¿»ZUǤe(®¯ùÊ<V+Î3¾ÒÿÓ²uèæ:»bà-¯°F|¦WìºS·§µ]ëÑöá« Ø·M(Wù¯:ýuÊ:jÝÚÌ£H¹EÑ£8`ñÅتá¨à³ýk £Ã7c¤ü¶<ÎW=ëS¼qé4§5#.-Úß¾öÝE3ÂcÈär¨Äù§L¢^3ýÞ®§r"ßM¼}1(gËDôÑ%¯PÄI¶ôÄ`³CȲ-G%nG5lV°À(#6QEcærÚéͬ١C8z³`Cß½u.7ªY`ÞD,UGÊRÌÑvp«Oøg[\þ]EÅ@Bcvß8èÕñ]Ñ·7Bov?Uëì?ëo;2ëðÿ
¾>^R÷ FÖ\«ÈÞ¬Ãô²Ct½F«X 8,Ò;hXj¾$8ÍûYùüxpå»È6püà ·Ý¤$ÀA7ýc%#%%"A/üÕê¢cå9Xãßá]5GóÚY"E5É#ÁÛ/*9/QÉ?BuîjÑm-Ã&é;ýz|¯££Õ¨l@'ñ(¢¹*öúi|GÀS«êÓ©ÝKð!7ÕmVÐÒ×>ø³9&u È#% ûÿÕ»Ñþ-¢îÕáøÇîäévÞ»¥ #.cc¢¼¢ ÎD×Ì@?Ç4#6¡o轶j0ê**¸ÙsóîÅÃ#.¾º"M\îª"¤ò©¹#%gíÞá4yRb(Ñ>@òtÆ¡R¿Ò]eÑ·äsvÓ Én(+VpäÿE®+ü'6¹ðN°¢3¤Ä[(ZaÉ»I{Þa½x=9"1[ëJ¯lê1H#.ªñ%OÃ#%ì#%ÄcÏm¾ÿ¶çaùã¤þÑIç³ñåú#.5ðׯ_ó~µ?èÌOHÅGTUÙÀM¿ðý¶y´»õ¨5Ñ6¥Ãcjb²ø§¹$|_Cºu0^~c_ñd°"w#%°>×j>ðõER=Sþñ¶s|º5ÛåÃm¶fÕ¿.Õ4|åÝj]³¨:;£ún>ñ:ÿn@ é)ª×fËw#.·l¾¡ßþ0}÷îâ£(WÏÎüoNßÛès{G4ÆÞ|ö0t9×bbÎ?GÝ÷k_ÁÉfª "@îkòX/E÷;¥fL¡¦¿qößÕ5¼8±d¢*¡â{/Ìë¿D4áÅtÉûàûoötgS³wÓ>¬XB§<ÈIÁMmGýùu
9£>¿zsáþ¸'^Í¡c®¶7Bª+Ã
À3ïr\«poª_PÜâÛô=TÁÖæõ§º»¶4ZMI:îäÙ³[Ê+YòÈ{QÓho³
`#67]±áÄRd1ÌU
²[d"b$#6Jk!¬gÛªLk $,¸ûÌ£Ö[ËúP&¶Ï¢U´ð¼U1#ÅË;§¿&b±A
1dy%*üüóî¨"/Z7cûÿuËBsr§¿-$ýþ~
mLÀ:z®X»U ÄDq#6Ïß©s <=U¨~L
¯R5¸}ÛVIé³íLgï ¦aóÓáåvºÿ_EF -áG8?ûmRGÒ=bSfqÖ7¶ÆAi+sèü"Ê|;O¦$÷#I±aiñÓíÁº×®[Hå[#.ºuÆƲX[È¡J×<óÙT¢ ÞºÆÕQjª@Jßü.Å#%
W&û9o
èîD@¾Àß#.âë
cû§A,BCG:l¡úkLuÐ#6Õž?; éõæk¬©÷#.qÌvÊÐ3:^LUÈk4#6`#.~H5ðÏÙ>Ãõ÷þ}¾Ó¯[hyѺBJ2\¡~¬dâe#/¯ÿa7·§4ãYUáCÇMs÷þ{¿ÍcB'$Å;Ç©·8¦ø¦#.{,µjweß#.røâ^˾<0fxþîÍÎ5&Ī¦6P·cQÇ"5Uô÷êE7¥ãyl)pÚ7úµ!$Ó8>{K2®rãyòUçD#¯lüw¯åzã=wÊÝ#6Dn
¸}^æ¡}ªé«)D¥Ð]âuq·à¿çÛ³2±³
®\ÚS{ûìSXãÅY%qßÀn©ÇA#°óÑUá]=@tÔ³Åj&»Æ5&fîðpK ¶Sd&vEÚ}´zGYÌ*B#6 ìÃQ>Gêp¬vþÛ
m}Mææï¤É*Ý0ÞþÓpì÷Æûè|A²vB0;½k[Èé#6¦h"#_ ßzéòøÍ3ã 2&BÑ
5Â6
ܦ2,,»¹Ç|زØR¢"ÈQæY¼° ÆÒÇLkG>'ôj1* ÈéôuüiS1ëu\SdIiÆT°²O¨6ÆÚ±Ôᢻµázl_gêÿ8hxMöX0-ôî ê#ôésüKòÿ5ö¨»?#%Ýyx®)À7 y#%í2òw ÐPc± Æ#%tÀ`=!#.fîÁN¯%Ò[^v
'k³Q÷Þ´Ŗ`ÆzÆ) û¼nuí¶#ÎÃí?.ÒIpJ[¥iB¡×*,ÂÒÅ =ÕÕ`ìQ×pgc¼Iâèez«ôC,Áf{Ê2ѪRuÆú ë¹7©Óyå_æ>£vöt
µÆ|ú9´VKâR;#6(<äwãC)ª((FÏv0ñ2hÊÐDÊ#0+C9°z¼]>ÄlÑJYb¦ÒT-¨¦Å¾bàèÁFrÐpõ*(~¨Ñäû£sÐÌêÊ4 u»y!jÐ#8±sy#.bn=>tzËÌhÁ¡ÈÌ\åê¦å
bPõYÄËþ:¹ÂnTÝÐ`¨éÕñí±Ö½nz1»DRÅ+GèobÊØÛÑ£U$2Öå#tóëñØó^¸émÖî²½¹ªO8«,}YEÏ{^ÜIfxOÐpLÂÅG#.pßú¿¸ÊYE³>vKUÓç¼çû}gا©Ú§^ÏÜøÌÍ+#%®[a:9Þ9ÉÃd×+àB~e.wµ¼qalñwE#%{j,dº*1®íwyæ]®îëOÀFnsnZ*4xm1|F¢ ªÝ4s¡ÊýÖ{ι,äl D {#%ÓDhM´ÔD)$CTÅVƨʣ}íÁ14LT.%"¸ã#%l@'D188Ö÷#.A³èòñ®$Õ^¾0Ʊ³\´h${Þ®#.NUzJ);I?×$è±ØíJö»? v#.êÙöT«T¾î°¦ãaÆ»EÀø5vÈbãlyA}·É¹»Rò¢C÷)K.Ç(
ösN\0p¨¨S"Ðo*ñ!WTðCyp2b2è/mû¬kÙÓY¢Kn9¦µJ:¸Ü³\ü{oMh]¥ÂfXn#6àÛ¯d ÓÂ/QèØ
E®KNÀá®WöÙ=þ=^u¶Ã?×íÆÊ5çã+8~Ñ
ZF0oÑ48Ã@òð_¾*Çc0Z4ÛþþJ°q
áFÃ=tÌÐÔ%Îln¶bæ¦ÀéJÞ(BwyÉ.ÅBjÜxHÃQTÊ8¦4c#6Å|mñd@ñ#%Òå¥c6PºËÈaFÄ`]ÿw&ÅççqÕ2ü2GµÐQ˯Û1R^+¦¯LZ¾yïÛn@m2(Å£-eFK`²(euDÕ8IwN`;ª4,:$VbV66ÄPEBD 2ÙNßYö;üó6é}rÛ=ùk²#6_³S0¢³*¸B¬¥yÔy¥,ôS°X¾.9¶¤Ëuªë@+ë#%)|ðÆÔÔ@zæX"% F#%Às´õ&Á;Æzüiûç|ú¶&íïöí0t 65à1L Þ=Ùôãõ¹H9ív ¥RÜð¿4Þ{mÇnpíÔ+ãÍ=Sº!tî#6oÅgcìtn
©t,ÜluVFƱ#.Ù%Æ·©_NÃÕsËÏù*\¶µ8r&Aö²ÕÚ¨N6÷KY¾#¥öZÔÌì:w¬9§Uf Þj Íñ0ÀF+Iu,<H¿ý
ÍF;ù]õ½ =ci?kÓ]w©XNÚÃC$#."oáo+wÖÓý6Ì<ärÿg·²ln{²ïé£ú/ä#%Ưۡ¬ÏªÜåô¥ázY].Lè®k¥èÐk#.Ï·
g/!¡5ªJ ±R%KA¾Ç³8Ávk#.î#ßxÄEûÈ¿÷þÎÈÚìv`ÁÕåEjÜ¡øØ¢Öö%#d¶{äs1ÜQãËðÓøÉÏe·&¸r¦¶Äj¡ýÓ;¤5wÙ1#.Ä)rÁ·÷íÌiò/:'D\ÿlÌm#.¦2!1Mäñ&¬¬F)èdXUK¤@md2,ÈtëE4'ÖFÁ°5F:Ep[ÌÙRMÔ0õoïº5"HJ)#.í¤#6)$Õ¤o.Ø
)Ú"0Ñ¥bÈèQѸ&bÄÌ´cu·^Øj5 ÔF=3#.MC]o/Õïâ÷~ÞaÆDbÃ'¢Yé±ÍCB&g×LF[o×QLiÂ4òìÏËGdÛ78¬Hý]Ñãg(q5ÆL¯;ÆÎEêRiü\©Dyb9iȦa<µL£Õö½w±Í£ÅBM"1¸È¥Yi]Ã\¶
Ýb»/Ì]NçúséÇp#fâzÜòëÑFßÄå .¡IÛµË#.oQævyÙxq=L°¤XÁMÀ7E+_î9x:ãOF#äøT`¡Ü³µqùCåÊjm·}#6±;¤½dJHµ!MSxLÍÁÁàé#6\³*"ÿ©©eãÂ;ßÏxý#.q#Ö§i¸>NcUGEæÿÏ^Û¤Éà4ó$Á;>)Ín$"Ëýȵ7æÍÑ ÷ÈÙf1¡ýê(v h«éC5×`ò ã{Ô R#7(HTZ'ÖcJ:7Zf6NGÌQä8@ªsIÊÛ¤ÜjìÚ#%;qÂnwjÙQ±¡3¿Áaªê©i·(Vj¡(bõëVðÖ\ÓâM´0kD>§¶UzpNzb#.ý:ë8áâJï}CñOv(ÀäO˦Ãÿ¡68H^&ì×¥±Ó³?òtÇyë°#%#ûý¶¼·6é³]Vâ¡3éeÁ×GY`IÁ´ÚÎ%® ¼ï|HsϺÛEH:uÅ) ²,Fj0ËsVºY#W6éÑ(4ÐÅ"´4YadtªÙ#6#}´Ü¶`Ø5Mõøf¤ëÀºfmjÎ(#.árµ¯V¢¿í;'\ãS´)=ǸöòÒ#%'Ü#%½zÜ\n@|ʼîmÛ¿6ôÙ ²êö¶¾7Ç¿ eÊçó)vaÒ¡ÃHFÁ XÏÛwêÖ?!¿òÑ©ÂâýjÌxOuÖwð4r }ðÛãæá7>ñ§Æ(8Ñ_Ì]`#÷úv#%HÑ=©U°Q0
þrm¾H%x; Öõý¹
.?½VI|gxûq¨[$î}PT=]#6Lk+ì Ïãý¯²K»d9r_ ¹bD³åAÍÝðü(òìù· #6#føåðÝÿ¯c»ì²BÜÖÝÕÏtê~jðêêçßlúü3~i»Ónn>ûy¾{çñ~ùë] Þn¨`"1Ø{ô°õ¯©Y.HGs$å<Æë½\G<Dºáëߧ=~ÏÕþÓCrqy!áã^H³U$ÅÕ2Änà cèúÔb3AÙîù½ùa.ÁGc@õ¼#6\Q\RÒ9¼ôUäÎ)uÛ¯ëqVÂRVÜ°¶·úûJ#%Gh¡ïÿÒ#%f÷,ÛQ¾ß·èøvKx#% è¡#6»wE·B¸cÖáÄîâ§Ï¹øj<}Åz¤4:CíÖï÷7¥dBb3Ôíh"µ%DÍ,J/Îã14i±WöÑÛv¢e»véRIKûR
IXñ¥·õjý_È^ÖÒVÅ&.Ìýü²Ü2SQui¶ø]!Cû^~7²^4snë«u*ä©ó«º±5øuåw?çÔÕû%`¢åÑ©ÉãüjRD>=>ÿòu>i>ÊÊ:##69dc|Vþénmü/®~çú´J:3#Þ'$!éþÝPY]oR®m½$òZ¯&Ö¯SQUQF@ö#Ûá aøè}ÎÙCui±b)f¢y&¨D é*þn&NSìÓ°%ö$¨áTò¹^%\
ýÖwbIlI{VTeùä§îjÅçÞ¥Ô:±
Ø1µ&óWR÷ñþÑùùÜ>2
ÿ#.#ú6q4¿~¿ù·X30~>êí{P?ëF(¢,Ö>_#6à3~Ú#6 ï0\îrfÁ«#6CõÃü j1T,j¥q¾#6Û6Od'@h'Á¤¢$Kð²åª¯1¶ ½ô±ùË=rÿ2·æðWÕPÅùw©1P°æ(óÚùP´îÎVåRh!0ÁVñJ@-I[ú¤\T(#6N=>$o¿ï-#ëüþoÌ}÷~?©¿SÄ>áçú}+ãäSÖyà-[O¯?8Ñ[úF©î»ÏDÐÏcÒÿ½tz/º~ùÓïá7|çé6`¶¹ðÍVúö«Ãñ˹G8©ç°híýqpä"#.ó$`{zEÂêVsãbÆG¹ÄL¯<OeпõIGá=}}ô,k±Þá<öv}²#.¹iÒåýº{ã¶+¦p±ß³0éý¹@ÒÍîÎÃ{¶uÁ#uwDa n'ª@ÆpTÏÝc#æPOR1ß@y÷^¥ïPÊí8jßeÖÑnvµåô¸aËA¸cüU&dã#6V]#ÛêG²S "Í÷ÙKÎw-ÃÑ4¾Pdé9ïÏåp.Q¯~9ra#.xR^öseH»q(â>ýºë9ÕÜ{Ϭý°±øï½áäÞQEV§ì±p2/Xu|¶]æ¢c=!U%äi?Cù
CØcX¦ËìÆýýøPRv²Ä
¥24q`Þam;ÿÕÛ¾×Î_\P Wë¾ëÝ2ÒÓÄ«>îþë¤îº~¤>¶=TM@òjj*©¢³ÒB''%=-uûûHkû8ܪpÿXËؼ¡&>]°CÒp}!é8BvþZ>Ö-øÛê¶*äÄǸ$M®p9@øIHg2q#.SýuFfÑýÿ3ñyXx{Pî-ô2Ñ°oõIöO¶$¬'Ñ¿Æâ4ÊÑÅ ÂCcíÔÓ×å óí5±y¿oü|zÚ1QÈøÎóK,,$o_»Cd ÌbWά¯¥éÕáZ¿V3XÀÓÐôü¹CE.}<åÔtÖv¹W:ìN#K»aÝÙ<ïíáËXÿZ0þ:4°4n'ô)¿©cç£*(ÑZ1F ©ûÍIp[Å ]E}¹ýææzï ½ÔÈ@x#Muaͧøô÷{»þyú¾oÓé6låÕTÏG7°èôÓ6Õò}Y]ûü¤~zú)ùí`¯]$Æ×=ù\¹µYÖïS"Ëàîýßê#õoÛ}¶?=º;~ÎícvÏ\·X!kÊôCÍ~8ED´Õí«ù¿]mRáã>^Õçá&÷_#68êpbo×;ëvدµZSq§iûöÇ÷oöjíôgËÈmysrËG÷t{vÇh²à¢á`×æÒúôÏG7
m óSÜpa»£:H~ êþRöÄj9\RAï·î~^ÌîéçÇ]%="Ëùé»íxâ¦É hæ^LGëe#.·s-ëÝÑ3Ú÷ÙÌêÏæ|Û%n³¬|ðjãWuzµ}F×péÌ°çþS¶1¶¯ãLSèyµìÑ}í{ù`-¼-§z9Ðó%[¶5¡v»º½2Î;§'D?/Ã?ÀØ}öÛfª]wT¸(9=E)#.]ÙYYxôpaòÆÁ¿E3Æ£Ü0¹ÏѼF%Ì.lAÀ>2.sºUÍ?¯Öç½F6e2w?.ì·Å¿=ÛüÇn¢n;å"^¯Nù]¦ëûi=Ü[ºó´<JsCÆÉÝác!»
-9ý6G£M\RD8½;ä¬Dèà¨Xhÿk¬1ÛÝîöj|G#àef®zu?|{?b죩]÷<qáóØ2óyúW»î4öùüãØìsfö_IÄdaÀíÔ2²#í·Ù#.ªú«¾û+ôçñé¾ÎïÒ-«alÙÞ¿(ô/£#.l<tìß+{t¤3.üÂó/°Ú 2´@ÎôcL|>y8bºwc|{a²rÜÞÁÐ#gwùv[
qýª$R¿Sú>]ÚwæÿÔtf¶³×ÖOåð{£<î¾ßÇKjØtcú ®ê]·yïìDZ¡¯Úÿ°Ëà F«àËÕ¤pøzì¡Aó:Ð}Ù"¼p+QÕß_«ÐÃ^/±m&îù<7;(|]oÎÇO%~Wûß2lS7µ|r¯ýæï»,èávENJÞá^[#=6{}¶uým`óùÌ~ÃýîÑÛ]nåÌ)ÖÿîËÕè¯m¶ÿ£Ïª£ò©#6ù¿GFqÂ^FÌÒìò7ðü4µ?w·ö¡(?1½è®ßçõ`¶úO·¯¯Ûï)ÍÓ["ïÆH#%õ"ÕËÆÐ2Æ P~kZ#%RE¦)#%é:³»ÿ£O2ìôý½£<Ý~¯Ïî·üs?·åõuåÚ%÷WwPì»4ô¿IÛø×~÷%IôiÓtêüÚoæòº³¢qüµiA£ªÇçÃ@ïîøgÕÓùj¸aõv{À>ÑÀu.Þ?üB
Í´t¶¿®gºç*¯õhÛDAþóSöäyGÇbeÎ>Í_ÝøþÌ)Ón¢¹8h¾>#.[¿g®øÔjý ¿º;¾0v½=áÑÉñ¯ìá¡>1û4ðx÷ gP#÷h÷óñÙÀpý_Yõ¥©Ü;ü|PåVQóñ=ê?~u±ßåmAì#6`¿Ç«+¿÷¶ÔºÇ%ð#.ýìóS³÷wt÷/vÎná#Ͷ?!b¿pv ùlîâ¹ù;òêÌ/Ð|S¶9¢ ãþ?»"(H;G¾÷*t<&/»éÖûçëGK÷Dj`àõç9K#%#61ÜT'&D¯ñª¤½[-2è+`IBfH&ùÚ~;AÎwù´Åð8,È¿{#Y^ýÙátÁôMÏý®7Ü}·»,°§EÜÜpà
#.±JÔÁÐúìR#ÕÃîá4¶LÜhâ+µw».©ÀXê%äqh !ô¦ÏÇ~Ièù}A7®«wèüº!À²h;ÐÁà·->ðÐB)ؼ³»¥JÒ®Ç>;ÚëZÁZ;|%9µdCPSx½ósZËËgDås£wr×+)°±¶1/1B+SéÏkÍÞ<k«ïQ}=:ÕѧBxóÃ&ýÇï"÷´¹8KÎ.óÉÞiYÉê¤kÍÍê BI×eWRÍ ÷z4åµ%fj|x¥¹êÎ0Ϩ]¸RÃbo£<±Ã<âñrgóa^ç£Ç¼;y-¾çYð&aÈI$¤í"
:¶¾ 8wÔu²æ\ËÆv³i¯oM°Õ¥|Yïæ1xÑÀ{]°2Çã×^þa»Pëø-z×ã¾4-]»l¥_3T¿*|õ)8óÌõ:aÎÉ>·_!(£«F+~4sgì¶W×M«°ìÆç/Ïö´©Ý߶£Ní3¡hl3ûÝ-ÌØm=O£Ûóp>Ø#&þQ¬½0â/Sß3 þ>mM©ñw÷ì\î¢ý\}ÿ$Ùwü÷y¡ÔR$ìØú|¡ô_ÓIØÈDí'¶1ulu³L×ãÏú[=8á'x¿ôúè3úA¼#%Éé/SØC¡I%yb1ÖFÉ¥Góü*åbGѺüCª öIO4|ÿHï½cÀøò»ÚcY|u·>Sþÿæ#`ó²{ÑÊÌáþBÔfeÌ©cv²Á¨9G
?G¥F5¨4iTlT Ô¢¥nØÐæ7#6ªÒÀ¢¢,tþÍÚHÁ¶¸}=3´Ö¤On`a´Å-À¦°Aȱ¬a¦ILA«"hhn)"4±[VWcì'Ë#.Ss¬6ÐÚ]&6)":ýº[ÅÖ¡É \6öB{qZ8dÚuýÿ¶ø[Ñã"?9ÌgBPP}¨üÖÊS<¦³ =a5þrÐÍAÉ]E··cXw\1´ac0]WëøoýOSø\ýVæ#¯#±E4DCÄHèé@Öbï¡i7¨1lXT¥Q&FÈCV ±6ÆfJ¤ÿj*P´Y¶Oà9þ¬éq·ßåñãrÌÓÜïëûpìA¾öFþÞi|-'Ôl³D±çj·UuwåËu¾_
ãÉfºòöWV¯Ùãõlò:ëôeñÖ1ýèæÕ»ê(¦áLS·ñþ>ܬù±ý9Hþÿ<·jÄU±Ýmù}ZbçvùU²«&¸ê²·ü³×íú¡[GmC
fj#6#Ò$pçwÔ]uGÜ<Ý~ßÓø¯Ó§Ù£O«¸¢Zxûþ#%8g#65U6ü;ܶ>®aL~ØY¿w?VPèÁwÙu~Uwö¹\ç3Ü®ÀÂÐÃÉÑkøÿ.¬&5)n|?±½¿>¯&¿án®nàM>äM¹¬ýûôwL[%û"ûBßæ<ëά#6)_@è¸à\S¼|8¿ÁéÎØÄÑ^F+rEµh[J%c§lõX*5¢gtõu¼^´yçÛÆ9ÍfRÉ¢((©[\0°Ä£#6 ÙiéÈ¢ Ôch¥b
È£°µÂÂ44W VR²ÙÿÒ£FÁ÷R\æmFAKTQeBÑlB#.°QtêMæîy3wä%r(*`¥2shÙÀX;Ýg6®¶JhÇTChÆ%8Ì+:ª-!ñiÜtu,¥µÌà#.óÅ!ÚÐ@AFþ§YÙ¬uD³mé¾#.äQ¡±$I8ì~UÒI#ü,D¢Ö%\ȪrF(3*®ÔÊp#®²R1l°b¹ÓòJ®x3¸ø!U$IsJCÙõCID&é½ôAô;/ôôÆNô}Ë ´íäë-ûLH ¬^Þ@ u3ÇD>Õ÷z´ö#.QùUôhÉz°÷ýOT=¾÷góxá$g±SóPü-ÎÃáÉj»#6ý£×£LPL*øý§f¶£Ô§ü!½ëÉ3§F9û§ùj~¸îîh¨xÊìÍcÔºåøËãïÏ""'NõOU87«6«üVûúÖY´¹ÄÞÏÇñ}NO#ûjÒõ@Tõ¹â9ØsûÊvA#%_ï${Ó«ÔVì6TÖÙõ¯=óø~ç{àäm·l_/ÊÙµÇÒBÐÄ'pâqCó9Ëèæ÷¯!üyI£×<³ì©«.V|¾ÇÕ!檣#6u¬êyÄC¸î'·>Åþ¹õüܯ±öÝAe;6LèǨ4«9ÎCH¡QH2t2wT9"+1r_uLUv¹ähì¯F¬ÿÂÅêwf\F±>[î÷QâZ%T»
#6ÏÕ¬ªÿM[hÅe£$#ܱ#.D¿ºÅlÅ˦ómòØÊBYQYCFF¶Ï7®_ËäÇÝã³áê_{HUuí;wùüÿ§OÉAó¬º!BAT1saèsÊ,¿] WÚh&6p¦41-6·nÑHÚ)¬1=j ±o\ËAy©Y¦=ZﶰÌ#6Ô«ÉgAèpE30ËBH¨ÁV¢À*ø¹¢hâÒñ/mM}RdCÝ7Ìy#6Ú´s¶jdßå$ 8ÛAmb{&ãìͬo*©H¥·86AU³àrYbÍZ¨¬ÛÕ§hCZ¸ÆÛ
2SSDÍ#.H#6J lXdL1a4KDã#.Gí3³u#.Ðá1¶¡×l°lôÝXÊ-m(Uz§ûÿñhÉäø1µ(UX¬0âØ©DlópÈ#.Ìi@¢OlÂÕ·åtS¼'Þ30<sÁlPt⢲o»ø¿Õæ#6 !B#6-ê»o.O6öÚº<AÿlqgºØÏwìèõfñf4ÙËÆbýÖ}æSuT044V\áÿwáîÞ:ÙìÛé{yзc(~Qïɨ<Þ O û¹ñÓÍ«ÑJtzAíÜ'ku#%ùÇ"#,,6űaiUSõÒª4ã÷]áv,ÄDjGH¸¸ÂðâÒi§O®|´°UdN¤G#"DÔÂfýV5[ÒDê*#.m4&Wç§(¡ßÅÆ_t5³
¥3MéСÅA!ðy½ÀÐÑK¥¢#.T£¡·ÆóÌU:¼]*«EPTå·ôùdì×k»¤kmó0¦T¨J5Ël$2~ßØ?sÏêê¿g¯Ì:?.\`<<øâï«@»6ñ>\G¯øøJ½µ`CT<ʤ2+ri÷M -+A¸·Tc£´øìz^ǶòÅG=Úæ4Rë«Ùî65ÚatHǵ0 óFÞG[q·º¨ÊN𮳠þü¥Å¶<ª¢¨6Ó®Ç!#6^¹"XÞ<(²ÀÐk]o3ÆÌÀãH5KK¸´pLÊ,°¡+&°,Êp#.#Za¿*V>#%ÐÎýhÂ8pÍK§9æe¼õ².lm¬8ÁV6>d4#±C§à¶ÔAܺÉ&Fèé ᦦ¬ÒKbíV4Î Ø=ÕÝ ¸Døn$DN÷»A£PÓ+gbXÌ®çFPá2-îc¶+P¥ò)2ÉÂ2+ç*³v»öw?Ãzwò_Ûü9ô[ߣo×ûiþnþAý èyÔÆÓýb'j¼ç3Xtß1ám¦,¼3êtäzÉù~îìa#.6uqöMÛó¦q9°gì,ªÄÊ;÷ ÁÍS¹(v-ª ù`kbô»6ßV۾ϱ£)`åÈf=NÜRäòAUHtF¨ÚEë1ÕOSxWxe¶ãjh¨ô©Siyiºf6äÜR®©n1v6«DE¼ qìT'wÜÏ.gÊh#i£^ÞM¼h½óé¶3`ìQ±q&Úri3haÔ9ÙÆbX±AO}`PwÍUí«3Û¡~ÕoÒ_ÇúFÅ°¤<N=¦,Ü9}Ð'pøF_smÕA#6#.¬:M³±¸-µÉ°àzÌ! 1IË(Dâ8ìMpî@Τ2ìl+ñ"V½Üq·*t;$î§i¨Åo;n3Ù-Ïu#.põQ
boyN×?u°L
#.¹}#.IM¤$Á x¶ï)Ï®v¼îѱnú¼
Ë@:kï¯#.K¨iccndëÔªÞAåj«[ÉP]ÃK©)pU7UØ"wW;´ÇÁßÛÄ!ÜÔr7 JQoùŲmÛZé\¨ÂIAÆàQÞ#6:26#.]î;ñ´ïC®â¶£¨ë³º ¬ÌK%c¸Tnq°QÍ峺mñÙºâã!X ÷Ðk¶Ö·ÚåÇF=ˤV¬vNSuÕÑÆs'&vl©4µrÍb< vjN19ÆbÉÃ"°Ë0NrcZ6ßW$ãdB\ÜÖëwl#6Ó¨cÇ.Ûldå¤É6µ&Dm<Íc/³Ür±±5ß ÕoÓ:ÙD$âoµ}ä«ÅÇy溽<¸üþY·íhÕ@óμKaNâÒWGiÝ/_³ym§,qGr0÷GÂÜFDdªõçV×¾¿òÜdIÄäF6$«,©
5·\m4üb-ßöÐTM^í¶"R§".få½ÿ¾ºáwu
¹RM|an¸ê!Ô¥ÄAl©·KÆ<F°´¼)ÁF§P6ø¤,½¬-®eß4ð¡RàoNYyÉ\#6wæïÆ·¶¨ÅÎîn,ÿ
ÒÛ§GtïJLL kÞ8!ÉLº÷m?oõxtîåöÅa^øñ×4@üÃe¥nÓ8¹búÇUÖµÕim;'Âyhz7,íÎ+¿öÉ«þÇyDCá÷TToÁ89I°Y¾ç´<ß\±`%dn½;,ù²BÂå68ãu6«7'}ÆôÛ^÷YtNÃWdÓ;=ä/fRͲºòc p®FiùUóísk[áü3¦¯²77Ð{¬1F.LÍÔ4éç¤<³§n#%·SáGFÓ9fài©CÓzÒ¯,6õbi#6aÝì®îÊómàò7ù¾ÅÚOf#.5Í`ùfz×¥qaôËÊǵ¦ô»u×[A(g×zÿdÅGߨrt5:Ú'à®üc´vP¢¨$ÞìÛ³FáàtxÃù]L@¢Ùù¨öVA¬^yw17sGqìAÙÉdfÒÒ_Ä£¯Ãó7n·hÓ'²8u,Ü.¤ñy¿0t¾óO`D
Tò#63ɤ@ºÃjúP3<#.þFRØ/(?7óGá:ix¤ú{¹Dç#%²yþ¼#âôØ¢8=lè{ý}å¥r¸¸éñ¾áç\Íï>ïø2Ýä¹ÐiߥþCÒKíWnר>áüpbx_9³å¬×WÎ@TÛBðÑZ·¼Bìb>ß_§çcOVz|ymx#6fǼYJ
²-Ê 0#6@wßwvOóÓ®ËÒëÎ!ÞöxnpF°Q¨#%²Ýj«ÀÎÇ·e#1T´ËRV¡Ö1(3È40° cpç¯Tô沪ÎAϨ9zâ"3áÅNÇíí<·¹ycÐrv>óZªQà:¹ýí%ÖÐ~ND|²EÊÉ´à÷Ô%¸< &ÙÚq4öÁ
)UyøèÌùÿ_óÆu«޼?ßàzg nõ¼;qËô;åÞÒ&LÅSå1ºúeÃyg²)IVì\.Bm0J°þ[qkdÅ°ó#´-©`®Rb]8ð3ÏcÝÇÊûO¥]ÝB$ÄKÁÇ|\ÀÈ|jÌÅg}'ò$ja±áêȵ¿<4Æ=6=&¹|§ð»®6
]ºÔOvé¸pX»Ü=ôTÖV*yumì
+¾â1e¼#µöÚgDt,DãFQiwqlÞäÀþµ#.س^O¢àô.é¤îÝϪ-ÇIÐ÷]ÔAõõ
îÆQ72I8ïxLjoLk.Ë¢MDz=ýtï&½ó:o$48;!Cªpóa}j bÝ94gÖ|«¯3ß½µ4#.ÒOè%èÛÔØ¡ñÓÞ:Î<4ÅôE#.54òì3R¬úTW-Çðk¥³øyçÈcUéN-<#.'çiké;!:-D¤§ 7)%#.M;î·$®Â÷h.ØCpíJi5Ðéï¬Zñ9þ®ß#%ÿ7±CðÉêpC Ï#òÁ´ð ü¹ßrÞÓ¬Grɧå¶9¶EJ¥ÍaÕ
ë¶ú`xf¤-0è´%ùkö2#¼üx#.|^:+Ð ÒÉùÌÛS9lVoazâ3!m²<
¦y©CÞo{vþ|eûüÿdQè¶F÷T½Ä½Ïá~;¬wÚjl.r<0XîÍ1`à1ß¹iê1æйºKj¶Ó§\¾¯å;ådý|:ó»OeÑ¡ÌìÉâcs§ãò²ÍcâZøô<«LÁQÖE-¿Æa Hàòµ0·Nõ3\JÜrSs t UýÒ>\}[ìäåúÞcríàXZ.ê,¥¯Ô#Îfi?ú'î¤èDÁµÊ©æÔ÷½`£Ñ@¨úã´#6oÍÇ~ÏhÊ0*Ü×ã:Ö hïÿKC¼i´Î|½_ðÍÓÃ_.¼71¼§½Âu"¹rFxôâ ç#LþÒ¹Ækyóé>Q9¬Àȳ÷#%hÍÊÈ(²
¨+fLmìßãh}ãÄuÚBN[ëR fJé{ 2ñªA·Pjפ/ñté£YÚÚ$ùyPñÖøêúë¢@
)Õ§)O~U$BO3âud¾Û1/5¿<k«æU«xdí¬½ìu¶ø¦ta>y6¡û5ÍNîQápNHèºeò¸è>·D.÷*EdÌn2,Y(è¿fñ/¥sµÒñDµÒÓôÌØЦwN¯®ÖIóíîç#.¤PBbÛV¦u]íUn=Elã·ï¿>JªE·":ÇÌ[~ÊÚÄ&ÂO¨ÁÄ)%&UrfIJNgq¾aCF¦pzPvß·SC
:l#:=ɪ/¢6<ç0DU¼F9¦îÅR3}m¡ð6£y)¤8Õáà7Õ¿QúÜñeìî#$ã\¦Æ§ò^q1®J=f3£ÕÍkÆÝ$·LùÎã{¦Ö=Jìm&@×vµÑ|^m÷"Xî<ºãcèQÕ¨RHyrÕòá#6̪\hlæÏ#6Qɺ*h9·¹52g(eG=¦!B-½FäÈ= *\¨½[=Ù4³Ê
ܧIm¯Ðã¹Fo%ë*¡açgþsé7s¾ð¤ß>üç:¶è$qCñntl ûÜÂ=³DOåùÅ@à}Äýó;Â_+'ç» EFÍÇD_½@Ê´Î/HÌ(¹%üñãÖÛ~!ÞʨÁõsÉMªG4E8yKåÒØÚ¾ôc6Ãä´ÜàÎû6vâv¥l½Ë#.gt>";¢ïm¼Ùu¼,ÉvõutÁ=;2hä!0ßH¿(âÞ}´s^G ap%N=¬c¥çµQ»<dZfÛêïÞWå=¾ïy±[g|̥ÿi¼å¤2ÖÉüLøÅ7¯#.¿nßF0r ðI8TÝÌ·6µD$M/#6oñ@üÑHÜ¡ÈYeV×ÛrÁD¨ïDÔ_MºpàütC¯y°ý:Ç1_G ¦h.:üzÑÓ«&~ÐbªÒqëMN6kÕmcí99º×ļkgX3sS§¶ûtc¼/+ÍìF!ä÷ø2xìåX?]¤BM#%èìùRÔöÁ3. s®)©³ù3F~~!Äi9þ×8ÁIütgHC©B³Ê @éFº×E¸éÆÉÔtÎxêýbT{ÈIZkÎérÎ[J(7ÕZÇפÒé½¥°ô4%ngW³U¡pÂzÜÆ.D
c·Fó\Ïå¢ê ÑsT»f«øW#6/á9=jÑ´S¹eEØàö¹ÑãÈB#%ÈX±uÏÊÖ¬N,&6#6Bõ=p]Ù#6f§|:×D¹aêF/þ¿©+6Í|Õ,2Ø'7;5mÌ©ÙÂû]Ü`x¿2°²k\U_v¬X)æûêëò°,àµ{wï
ñYÞ%åq\jµ|ßxèªÌÕ,`RWn²Æ°øÙÍËM0º <X5
UÛo6<-¨Ç)d^÷Ýb#%ûðçÚ°ò®[£±õ¾·>Iz]¸lð«°S·#6eh´³$'°´¬çíHf#6^Uî
Ðt..k¤ö#.п4âî6zÛXÛPÅ¥½\9Û1mðR´t}yUQ¯}[;î¨Æûáos-÷À<¤¦TvZ§H¤sÄéïã寻Ë&?ÁßÆf}ôèÁ>WÞ³ÅøÕOÙwbe'½øëåÆqçtÕÑ_I&5q¶"æ¹Öçgõj2àE°©£½"*[WÕn¬2¾ëAá¦ÐM*aFkmö0*áe"ë²°I@.µq|%hy±gt>ûõGÌ0ÍxQ¨ZQ]~¹
LfÏ9ÖÑhjÀ®'»YtX?PØçÜôTðQäj?¬½Èo]YQµfÐ[DÔ³áGçtP?ÒóèþØÎeϤ;ûmð÷\ã4§áx§5¨íÍKèÒ@¥ÛY ü°¡³([¥uã`£"ñ%K ¢%b5j!®#TRé,Ы©ªö`A¬5w,åu1
¶K#6¯uÌÍ+;¼òzÜÇEºâko¡.¦ùÕÏVÍßÇ>ëä(úXòV÷9Cg ôuª<²w]ÇÞ7ÆðÛþë+Þ#6~J¢ÖÞo8Ð#!õþ³PJ#%)W&8Ø9¢/ï®Îo7v°Ðv¸-õ 6âm¾æ¤C+«WAz)zÄêéVµ{Ñuå|NÉK¦Ò¥tßËòܹÆ"½E¦/séÑWaƺ\T:Ü©ÝÆðñ#%̹ÖovJ±$o¨e@¦ëtLE#.õHáÐæxizÎ@pßy¦M>úgV0P´¡ã/ïÚWFê ªÆê°ÊgR0y¹ö\÷Ü+nS×GJÊÕ^I¸ºY©}ªëÜè½BÎYC;-|CÄDfVsÖ#%Û5·\a?Æ ÖÖvs>×_Òë5Fó¨÷ypfÝuÓÊ#-/Í\¿Tz>#»¸dqÄËÍKÎ{e¿"ϽFòæÁ³Áµ@}#6#6pÂi1Ic¯1¡òª¯ÇÃ|èIm'T\&IËlgï´µp/jº~?5óÎvÝ ææܲÓ5b7fÓnºN3[al@}sÙ
_XFÉÆÛß'mÂ6)k4ïÞ',Ö#6ÖKdÒUÅCÞî
£¬ô#6F6¡HDp¢JÊ÷ÖÚWSä²R²sýÙí~¥axÆ«aázß5Ä7¾m.mí*E¨$CAlæ¦BIm*øÒ¡ò˳5®Ø45ÖJ·jºï9}æÖÏxôHü5Z¸Q<W÷¾»N³VDÕhU¡|ãf+ÏÆ<é¹v^-~]ðBäA`Äænð¬W
éÒô>·W«¯êñB¢(P%¶ÃD7K#..mØÎÇئ+Ô,#e3m{wl4º/}úî}¼ÎYðsEÞC9H2¶±tflkA²´ÕM1C,áî
`âlرëkù´OIiN}¥áù#6nÆ#%ààÍA^³(ÆÀl!Ê.±o7Bù[8fX»HíÚWzò2ÔÕså@ç¬É¯ËjÎc¯oN=,qkóPxÙ¡ÀË·qÊX8~ =Þ¡O½íÏÓ¯tÌqÁ8=þø´¼ÂûxÔE@é#%ÅmpÀONгÏaj¬ôe³ÊÈTI*xzÊÔ¢4äãlûGüGþÞtÐqͯ5K¯ìëâì·VÉxdÔÊ*W6XËSm³¾$ðH/᦯°Fì¤øSÙà<?zÌGP-;yZæOµD5Ë·gºë«iTÖêÏéÄ2 Á¿ryº~NKûôøÌGâkgÑêv|¿Wç¿êþÆú~xøLη²1«¨\8û}ÑÓ®ÌW¯Î6¼jS
;TǯOmæÜuW<ß±©38z%~çrý·ÙÄ¢3̦ۤïàåq^úðN¥gÑ'u±k//u65>Q²{Æhe!wº(¦±Ï]ºÈc!ïÂëOZÏ_
ÍÓy©1L6ðéP¾·«>ºÃezÑa¦ö_j¸ï©~Z^¢iJáÝtQaè[Â9ò-QÍïäzí$o±ýL÷æsaÕHR1ÒTÕ ×¡Áâè*aæu®|b¶µïææyÌ
Ä{Sê-p5cÞ§wsÕ_LÜÂGËÖôöû©å¿¦àc}± «ûû5I³©jJ#fع¾ÎM$rÂKLîg¡sß9a--JÉ,°ã¾õ½`¤Ç|ír]xä+n/ÑÖÕELm¹Èb3ÍO]aÓ(£ì!^\CὦÕ-(r"ÇFgRÒ¸nXÙ
꣥ü1½+/!ÆÃ6d#6P ÕdØIáÇTÁHS{ÚÔbÿ31æ£
N¬ù\¤ë`- xf<3·¡Ù#6 gî®Þ|Ûc$âSâ¹@ág"Ä ÀÝ:9Òà»Ý.mÚ¾|×[6âjg5sÍ¢ðºàÙ½KÚ=WæÐ#%U)Aµý³MU7/Îà³E³V¶û³õb>|ÔÔsDD°#6T2À¦yÁq¢Ð²#6èü¥Òk1~6ñ,Ñå%ØâèûgûK°¶"hÔi2Kú;e#6é f¼¬T¡ÅX]Ó¦hvÍÖ°NZPqîWP¦õáÐä²I¼|Æág¬í÷i ã¢\ÒªÊaîa·Øé8ºibP» Jr¬ÑÑkLØ0óöÖë¢vÝ\ê£q!öytØ :÷Ôܵoû<£gÏ=Éo6¼IÞbì·låHÜCZýn±ù¯Ö7Fn²d»Ê¿_¦ÖVMü£cî:v¹+F;³Ü¬)&#.M'ÁÂ#.˯£¶b»ÀYÊw:$±å½À=ëZ×û°' &hhmZñX\Ë,ÊÙ9CÆçò¤!9¹0rÊÜ=Þµm©3¾¶[
¿èZÁW©T·ÈÞÝ+(a19ÅÌáë<¥Ñéæ¡ÜvÅF³Ôè©xñè~ÅGÁB UU(;}ný½º¯àÞ¹Áµzoô]4B:Ð=.®atÏ$³ôÒeJûäí` r=q`ÉiCÂJ¿ç¼øD¡ùâÓÁ#.BY`åfYB¢òó¿Ay ±U /v¶ /C3¯¿±òÔ$¬sék:!ßr=®.ê«Y8=}«[SdÐ*¼¡÷M¹õ(ö´¯RÔxÁ5&¾GÔ¢¨)´èÉÄp¼Ió{ ã.xGtÆ¡ÿ',©iAxdÙt½×ôY»7ÓFs<dçWÙÕÈߣlõúÅ`)N}ÊèÍfK¸H}öC¡ó"qÝQ/Dq×hÞ%YNuðùËûaØÓüf6¦O}_+Ës$õÞ;öçzìm$$L·LÑáz¯bòþøË*'%$i:tÙc£yªâsQi':-'·(Þ`b6<-ã8¨ó.£uÐé¶ïËmòÚ]{¿ÜÞg·j9 ¨ ^æJª'ÎæÀo}Ò¬ÑÐñD-W8g{Èm´qnáêkÏZ9æË9òïùÖ, Cü`ÅN`[£½Ây#6Z=Ôs'´WïÏ'dë¤\¬ù¦¯ÇUÖ|MÛµÃÑé{ùËzürE÷õntwæi0²J:Ìñímã¢û åOäzã-¹|o)#XÔW·>ÅÓÐs=o¼[DØÐunÄ2¨æû`Ü1ÛNAö;ñoó$³¶¸x<¡³EüqÊíêK/¬ÙßbÐK¬/aÑt÷h$&c%n×çl#«'¬s¹â(éT¿·iاۤªËò¡^v*ø1Ö.)òFÅ<eZÝØxA)³NTÿ(ÃöAÐ?>?Ná_§X#6ãûbo1QìÐb¼DzÞÒ¸Û¾nB¬htRßM~Þ¹¼çhæ>(â= 6º6Mº1@ì|]½fÏ.×ösÛ(õ::l¬züø³jîOÁk)¾pVzקk÷û±jÔ3pV×>IÎf¥$Jý?LV2e*¤Xpå¹³nÈ(#2òY¸zk0Ö9ê<õ-w¨õ°u¡Í¶lÂnIv("`îTaÙߦ:b×däB®zíGmÚå»#6õÈyh3å³#.¡æóvÏ=ýB´Ùîïj¸+8;å>N¼Ù8dÃøݺÌu]:D£~·/Ò®*©z½pIs>ӾĶ7¢ð¾ìæ|¡Ð.ÝC×oü<©Oz¬Û5*ôÚÐ}&E§xãÑ»ó!½SbGeFI-ÉU#%¦$Ô³I ÙlM,01*Fe`÷ S~S G>»2@×ã¾~ï3¬ZÂË/ÒsÛ¤¸zµkÓÆ.xï|~ñÍD¤#%¼Ûé®u¯ÍÐ*±§Z#.ßËn¾P>¡
uxi¬ëÍÔ¨&'a¼S92)igkHÏíð|·¯`çÛÜ¡àiÖÉÛS{Æ`'+æU<:êI,öæÙ7¿_ÇVñ5îO/Iú~!®ìàZ§ºÜÁáÈR¸÷pùqyàì^Km$?«ÿr¢uà;46CR;,VÒ¤èøu'/0Î?í5¯{íÀiÎÚÞÜsü"Vîu¾ jOð3ýKÉOäýNw³ª¯ÂÛ¦/½6¨ .¡#6×XrpÑoHì~!ÑRKz¹£%dn(è)!ëßnÈrlÔ£§GÜ#DθN5çþwP$È~åtÔNBeåkµîM ÏÙènæ²1Â7_êÝóÞ¹¾?5õü;{Óº'àãÕøÏ¥¡{ùq(#%`@)ïõ(õ§áôáÔç°Ö9Mv#Õ(JL+G;I@Àðèz¼xÔ¾(H)ægëxTWÆ®òØ]÷ào»ýEkù©\ë¹lIi?K¶Wò¨ØRmcÚ-«®¯ñþ5ù³L
>(2ÍÊþbFmpßgË~:×ô@ß4>$Ë_#p¼$Å"AY ä&©×z½:Û¬-&OÈÌySµgÎ]ÜlÈþÔÃfÁõ¤^¥«Û¾÷ÊAo¼?ñxüG5ý7B÷ØHÓ\ü¯íN91¤IY[Gtþ#%²©¨qHTi*7+¡þÜõÿËò?¯YCxþöaÏ(¾zÿ~[Ûá_ÚÏ]>Nt©"rNK(ö·ËçzÔöKíd¿»æïðù´!ÚEá¹tîV}ëªÚÃÞíèÝnCiü]÷ùY??Îý
ªz¯nÇN¶:*F`6$´t%5®Ææó³\ª#%±|´ãÓ¹þ1ì?£¾í/ÒÊY¡°ê8KË,H|ñ"~¯Ð©¡ýj!#.K©wk|Y²äèYû=v&Sú7åí}f¥h¯P#6ªÌ· Ϩ:ý_Bý>¼s<7Ea§VNKÎõú](ú¶ÅÆQØ/ð~¶w+E@âõL0½Æ\üª"XÉBÌÜ!?_þG7LzßçmßÂÇ>¯+e§m¿Á÷¡Øf c(QÆ#6"ýu9¡Ñ#.P?KóO¹ êL¥09]#%n?øí®@¡/T¨#%½t xÎè"RµK Tg¹L°ÇJæhZ\j ¨µ+r¼ Lt#Èæ"#%o®¡òËÒ(~ª#%¾± ´é§ëãcßÁmÃfÿU#%èõ@ÝEôÿR ðºØÄxi¯ÐþëôBañ¾`Ù8ú&ØH¨Ù6óòP¿XøcÚi®àí´ÇK÷$qý4¹aß-)Á>ÏN99¨ÕÂ5v8ñ:je`a"ÅeOXï2~ZhCq yÏWiƺ(T¾¦Û¿ol|ïøH,ézþë(`L$¼{ 9gÕWR|1¿{Õ¹Ýø@Äyi<×Þÿ$ïèÇòS(òýäOgÏIëÕ¥OSIïôõ#Ñzüco*(B¢Êvæý?Ít,¡xë©TÏ[]3«X(~¤©R#6¥`UMKõ·;ã6Á¢(Ü£Øy·½?=ÆÝаì>©aI\öñ}V$øÁ4º2qÇm¿Êe#.fqpÚiÌkZÔ·ü(b§RfÌ%ݵEÔR1#µ¤Ûp2\4SywE9g+ìôÐmÒü!ô¯#Àè (&ë]Ì#%¹Öië
uQºâý:vêÙ®¨ÙJË5Ií4ôýn½2×mpè«¡ön³DAñ|],Ê[#6Øy`ïÄ#6PIµoßÕwÊî,ßlN¹¬ç·Ü"c;þúY³:=±Z&W¨å#6Çf½Y¦ÈÈ`¢ÃÏÅ3×8È7K±´-T"EÃvÉFQ`¹\ÏP.Dp1C¯f¶Öoe¹_}g¶âúà«âc'K³T¢©Ö¨`¢XD$¡\æ#6P8ÌüøÀ·Ì£¾ýtbÓÎOIan0aÓÖL bBç#.° ¶ö]\ñ²òBET dØÇ(°so¾)g®Ñà#.4FÌ·e¦`1ÜL`òyJIÅG§³Â¥ô ï#?øYÖzKéÄ2÷#.ÍÔþ:·Ü7ÃßüÕaÖNQżÿiË2}}Jo£Èú¯.þ³ÊÍýÇÐïL_fs@vô#6Ä¥Í7;Î_{ÉFy"]yXºmý~,@yÆNr+(kîØ®ñ3zL;,"ì¼BN3$ü÷>åq6׿yðö]|'<@¶HZ°¦ Ýè[ï*¹süÚÍæðX¤ßï@¤U-0àe{¶Ú3ÀÂÓíTÆií7q¢I¼y»Î
'íýVç?rÕëHõ!d=1#3tÿe®ÎÝ~AN{º4N¡úÓ× I5Ù(åtD# ø uÕÜ`ÔQP+&Öá`KH³Zhð!É î¾ÉA ê(e<ýd¼þ½eý÷ímÊ5^äÞ¢)?̸Úþñç6`éØÂàäâ{î£Æák¼dVÔ2SÄ;¬7ÊN¤@`wdÃ@à¢`s¤á59_E·OR« _ªzq
Ks^GlÞ<й\¡±BóBdF&!Úë\[S®~zÞd'¼¢$6ÒÙ¢½É6NX |¼¡AÀ(åøïÃrã;XËq-î¨ùöÎrI{@Î{"{íLÕźÞ5y\JEã%9×!}ÞCøI(ès=>§X.~Xp^éó{ì¨k±âøa§Ë%&âÑþWw,/òmì¥z¹Nãõ5Ç/mK¦$jìá +ÓK6L²8ª~í1o'\8¸`À- #!C<×® lá2ô×8ëõÍÙXÃN¾eÌü®R«b/!ö¥E7Â5pdp«¬BÜqÖ;»8]c5Ù½= L=«ô7#%í¾XïÃ%3#6¥,4«ã¤"»¹¼±¦ÿòuo8KÔ<׬(¸§E¤;UZÙÃoXÍ:I¬ßMejyyBþBT¥îú#6=q¨<ô,;¢ qÌ·¡Lá-á¨rjß~Ä=%³¿uû:Rcx+#.ÃVe(Jź¨C°×¦m"¯1IÃÉ2*ܼùÎÔFÆ2
?Ù0¨k˳ßïÚ?Éðý\ðßCc£{ ±¥õ>Ôå¯p/UMóè<g;e#6,Û¡¬
(àÆz¶bâJ ü¼¢®:
Öò7ã lG1Ñát¸ù|±<XÛ'M1çIñà/T½])Ïo9ìð_Urb,ÝOèL{Sá_mTܶ§ã³ZY:Tú9°Ïo¿¥ÁƳ(ul;g}m@óß¿²YµCfMjdÕó<#.x³:O)ºm÷/·ú4@[Zô;÷hÙhhP¯;wìÁÒVñ¸¥_Fm¥?ºø2_P|M9Ü©|r]¼½ko{<xrÎdLf¡,z7±¿ßg>îPxÝ,lû5=¹ËJÔé{CTjÇh÷ñbìãc°«¾DiÊî:L$eRI¦ÆÚtî×ãÄtç)¬ëÈß·ÜÑ~tÔÆãÃç£#.p²}wÍ)@))ë 2d¨
t`!.3ØYbô(%D®#%ûtdb#Ð7BÊ©'Ø«ÁYúcþõCµgïîé¬ÔMRaÿ2[þ4¤ ]gbÒ»woÕNÝ«Ï,.1D¦XËûØö¾ÛTÓ<5ÿ'Ë.¸¿¢ª×?Øä*£b¯iöÅW-«cµ@UTÙ #%AýJÌ#%î?øó>ÝÚô¯á[íê{}¾¤aªô·ï«éE aûÄEÃû(ÈõÍüÏðÝøÉöýÁä?²ÔðNxè`ß·¥"lÆPÞ·G?`lû=Úø ®j¹ËÂ\ॣ4ʤAàP(AÍ&
à¾Ê0Ax2E¼«¸Mór¹Ù2I#6Q0D%9èÀ÷¯0(^Cg~ÁÛRT:F¯gw÷Ù}}v®ÄT$/d*>Q¾4C´ãÝÞ¨¦ÙÇVÍT«ÅKv#.ïÙÊ[Tú_üúl6q½Ì:ÑAéé-¾ìE.ôñ x4àÎ2²#.±ñÞ|Â¥ÀÿóääqÚ¡K¥Èj#Åìðý3© 2r·2¢ «êÈ#6Óù¬<7ÐêYÖ1Ö$âÍh>GÛTÌx~2ããéÊô@î*%Ô39hþZ[ÃÏù`tgø·Øj«Úcü© Àïð÷Ãz¾ô! °,¹f°ÇÙèd"Ô@2 v¨0é³k(!ïh[YÙR|"h/ #.(³(00Ýú¸
Mm°¶>+dʦ²ÆDTK¥ÊGE´@Å2.¨&c¯u
ù8#aj¥6MIFEÜ.3+;bÁ$K*Ù³THBn|4D3¿Á#6Ù½3¡ç$ú{OôÙ«ÂÿHô³i"Q`UKÈ
s;$>ª¾5ñÌP({èlpùÈ?)ã¨,ý¾rb"Zô§KA±Æ;5WÚøO´~Ë~ËýOîNâ¡{Zc#1¼¦ÌÅ
P'Oä)Ï·±Î£¼M!+½E>÷TöÃßô9¶s¨ÎÞ?ä#%`cnh?½öÝ+BGG%om_}þ ¤M¼Q'ÀwG«ÏwE&h¢æÝnï%óªpmÜ"&ñõëw&©$·)¢rÛu©í³Ùí«ûÉíööñp)\uÆUüdá{KãqÚÛãE¦é]RÎ*8#.ñ6lTxÌ2i§DéÃL©Ýåj22JËïuPݹ3Tj²©ÿ:§Å¦%tCAç0Û³ô=f[ª®Û/0MksvLoTõwe1ð C¹{
ÉRâ_qýZkác>Õaü¬ûìfоáÜlJéæBBér'·;<[KåîñÛuïºä±fÈ«%3Ja1b{Ûì=G\ULj#ERXåncsÁÜrsVÓm;ÃX;MÆV ]±#.Z²·mÔ2$ g-$FÄÆñ L%ð.ª_L©§Ç6íßQSÔxÝ#.I»!¨M#.F×ϪMCêvB¶ð#%æ!qI*Øt§må´Æ¡t:CÖ\$×@0!ª#6%ÀBeV7vdÀ°ò®cÀAÖ©Fvt×FýeÐm6Û¨ëô_^qöÀ©3_éävjá:¤ö7T%â#.aû È3ÅÀã#Dõ<d!'=Ws=Ñá"{Üð±ür3»xXããÑèL#Ì{ëFÅ0ñ¹<ït²'ö(v²¢Uº¥\±ªÞËs[%k·ÁÖUÖÅZåµslUÊ®@ÁK¢¼ªÆ!E T$UhÁ^³¢eeÍq0Qj¹»6x©$ëÛAICt×M4iÁ@\!£{í!Êxt®á,ØècÄß³¡x ltH±h<ûyî̯wy£¥|®3¼¥ðìp§Õ+4ð)ÒIÍ HÂE@;Ð4['H!³¡ljÁQÎ^58uä9^çSi|£E_¬PEÜ4æÃixjRdF[ÏI)-|ÝE#.ÉBÿJÖ¢}÷Ø ÊS0+Zc8VêrØQ5TQ¨[u-¶*£guï«^2÷4¯yt£K»kvË_\h¼G}þ÷{ÇÎNÍߨV I tU¯Ìb*ÂäÚ§VKðfá,#lìÇs·©¿®üwB1óQ"¬ÝØÊN¿]S}|x×?¿ç=,%xo:!ÀI*såÑoÉ1¬J:ò¤´¡eÒB Û#.#%,þ$÷ü9g»nòyϨ7#%&êuÆ$3â6;7ØR71)¥Tð$¸¤¶§#6ø¹!ÅHTZaH$´"%;úQÒ¬ß(Z©"²(MPB0ÛËw@NÕeóñÙ{]=Üd[»ÁrÈnÀÇVoÃR@<$D DÉG׶·-"+joaÖà eSUXò'ÒòB«ÐÆ,ÚºKÔ¸g¯/7vj»ºRK]#.Ìeâ+µÿ|½xzªp®ÞERÇPig>á,üPCªÄ{Æò½½«XÜ©¦_=Þq¤¡A g6ÐO¢¦_*P!6E3Ë87Xd]ä#6æmó±2M#%áF³k#U@T¢yÂý3Ø÷o#ÖÉÐÁfÞî,Ü ;èÎm0T&â&4÷5I$Âpº~¶4Æ1rÍ/ë#6íÙj¼wüXëËh:nxfø|ñÇgXC§ÒPt/yÒ¿áìÍør#6°\ÈÆØÍ(< UTȵ\[#%^H#.}q¨ÛVFX+1á÷D¨ûºÕÓBà#..rªüm¾È½Í¡½Y]Z I¸8ÓLÓA5À×ÏN·Ó0$ÑmÅ#6æ#.Xõæa÷îÙâ.êôå\ºHÜ9T¥w_¥v¢EF`0HÊ¡E%xÜÂ+º¸öî2<õç<-#.áê}ϤÛy£¶ÙÜT[§Ï%)Ý7°40¶ãòâæÙO:§dXoY£t¢«º{{»õÆU;ªR%£D PÈÌ0ì¼Y3#%Û*VÃØq@iãAF®L`àîë´'©!ç#´ ÏAVì#º(®RÐBVcÙ3±EÊí a ¶)ÙXª`_ôÉ X¸h£Dì;£Ûe¼ô'¡4QÁJ#6Q`¹(T"@ çK¨ ®¬`²ÇînÆ´ÝïZ:uY¹í©ÆtFýðìÂ-¢RTÐfµsK>÷Bo¾Hç¼~YÅuúýsPÓÊÑ¿±ï 9:ôY&Û:öcU:çÙëBûrÎ0º>È^i
[d6p;÷6¡Oð#.¿c>ëU o*&L:ÜÁÀ.$ó³ôLx㤴»§Õ~àÂïÉ9Àë'tldæ
!¤1#.@Ìäu*n&H÷QT*ÖËCî.ì¡=9"E.Ô+ue×̪¤HÈA$}á{;~æJ²\¨MâÔDF`aÝGnJBPÁ=Ù#.ݱâcL¸¡B"Yáî¢ýYÏÒj@=½Ï<èq¾í!ÉùÆÞfl¹c\ü1GVø¦l.o6ÈêûlinDµÄ®ÌCÆD¬ïÁKøµÃÖ)Uf[(8?ìBª± §^fÀ] tJëM/BóC]é¯
è×»i¡^|ÇE7u[d¥g¥ÊZ;KÚ`¤ÆóÈ3;óæï`n
ç¯qi8ö×OB!2ÌØCP;Èä{]¡GÊ¢¼È0QvDÝ9¼¥ºËY=s³¤íEÃBî4¶:vAèC2.û\|ÓioÝv®ZFQ4ZOí²i2e67î1kÓkð/#.§]6@³4xÊ3töÕÑøelGͲÍÑ@R ])NýþüueVL5Ú)·é.´É©ü sà7§@4/:UÛË]uC<äR\wÂ'UWÞ:çQvbª§FHRÉS©Ð,wÀ×ß=uÃYV\<wWa"ä¢wÕ÷Èߤ#ö®q¿£å.#8%vÏÏíÏIúu-?µ÷ð·8>ë2RªMÄ£8{ôíåíxÍ]z¨Bì<bc«öz:yÿfáÃçGËhäbV
©÷b ÒÖéZÙÙUð%¯óèQ>V'׿_ÝSÈ2È6½_g¸ñ¢Öåä#%Æð§:¬É©£_ÑÆxÖyßÔ#%ÒéDÙ¯~ªJó$?Ù~~é8f>îÑ=G/
Þe%A7Üüq,[Y§â¿o¹b΢oªd¡Ýãà¶4CÄÀ?Æaûý?ËÉoôÝÝãèßþ$Ý6aH*2AHe,-3ôWðþ>|ðoÃpûgrñßãjËntKç;ÓøÂß%ÂòJMY¨TßzÊüúQ÷óÌ<u`ÔáXXCWKq_æA?ÛÇoMW*ôˤ,«éý£õÿ/7ö0oöÿÛöþ±/Ý8üq¤¬I&Éêe
UÕÏkôR2XIlW+YsÎC?Û äÚ¡GþeÝYg ÜÕ|ÆÚ#%$Ç¡µ¨Ãhý[<cOgöNÚk¼Mbf"\ 0íÝ{PÖõÏ?oÈGðª¡)©>p?îüy÷?=BVüsɼcýNG8(´5YyPYú¾ÎÞξ½¢jö«vÚÙÜ1¸ýË}+sk
6édص2½yÛù¯$Ü¡i)_?ï_3÷ÓÇíüûàüéC6ª?·LG÷³û_Àȯ«ï5Mu¹=!£~*+LOú¤k2¨bÄ2ðÏVÞ 7üDÏDa{ª';âû (#jº£ª%3t»¬i×¥¦AQÇ®¬2ÕYhqß´w/ùøã¦Z7¤Åö#6uÑiM«ZÎ0XL¡ë!
9¼zóüª ²zYÏ¿hnÎHr`§fá5©¯N$fá"ßæßV Þ±Æeî>¥?ë.3/«ð>KÔ6½M(Â9OÊK#6=mcÒï¾´'ª¬§J¦1Eæw³g¶ËO
õR¿Õó°"ûå m"À@¦D¡È_ßØ_éú«ÕÈqè4é|`òßRì+´j`Q(âL&ÂÐK#.FM=3ÿ§úñ3£I¢Sø¦Ø¥cÒ ÈȹÄþ~î>ÜþËqU×-Ã^ËuèàH19ôêaY?¸NN·Ñ¯¨]ó#.y·Ûßù `2É/ÃDÏàê> #6m*ÕHç<\2ê=|.mcÅw~÷w§`PòMêÆ9^Þj¼=ÐXÂfulDRÀç,±þBpRHúÐÝîµ)_Å®ðߦ.üîÏÏôúýà|Iõü¸ò»ãMJîëáEO×ñ"aÚOA$ÉFï5ýéúxqçÐû¦Fwd;zçСËÓ².'gòêç©äâ|9Êlråó×ê¯l¢:vGÐi2] ³ @ñ¦®3×#M»½.À;Gâ¿9BG8ý¯ý\ý»D=®h¯^þòÖØøÉýò=kâ<RÂÐäõ©DD`_êåî"xKyy+·75¼â]*ß:Îp#%"t-8¹j°ä ®Ä»ÓëRiö4úi÷>áú¿ÀØñ<ÎzüãËçò%LÑQû>\ÿ3pÓ°êvÇ1gío¡¨ÓcjÛÚï^ÿø½\¯:³Hr!i ~ZT×°-î(ÿL½þrø'@Ù·Uì:k¶+cJ©Òò]ô8<Ãr¾É¹Ð#6ÈÔ²¤ìüØõ^cÕgqÁoTÔL#6$8=Ìò<Ë1c4+?G£âòó¿x#.âÎ\ÝZs ÜÀàF)¡Ehs.²`.z´ñòÙ0öªÞÒʹQR~m+í»0Ç._¯ÛËÑåÇC«nè5 ÏutßWv#60èªZ.0òë𷵬ËðSF§NOµN®#.ÐûEÁ¤eûøÑ3¦2J¦|;ìïMmQ³ ïºvjx¼rïJ¹¾Ý~Ðpr)c§~¢;wo«j£ïïÎö1sÑõñTh#0Ò!ãóR³UW×}Úh¥bÍ exËá"æ|PH[ǧ:àJäô/°qDC×I¦uÃGµ_z§ó8XzgüÏN×È:ÎÝÓ¿¿x£aF÷Ó¤ïÅø̺["·½ò½ejøM§ÛAéA&¶²¶®6)BÐ;XGê§('ꢵ¬IB¬×(~ a{Õpß5×.êµ55½.>#b·´Þç=ÿ©]oðÃG§Tmü#%AÁP1@zsÍnál?]ÞªzxkÝ@2 eó*+hÛ:¬¿wìÝ©ÎÜ~ TJ^9¿ Í4hB&¨ï¿#.xbðPýÀ;Ô¢^Æýú}¡¥ØKÚ}´!I+ê@=ªçÏ@-êá)"-±ñ³êaå7&#.J+Ç¢ñåÏL½pæ#.uÚ
ýÏó,fò¼5à(ÌTMB³î9ál¡0á5Õ:¦sV6z=oÝür¼úÙ,åƯ÷~\Ý¿£m½ñW#úLvÅÙÏ#.{£PP·6Ú).zEËÃÂ{ï»ýÜan!Ì@ï\Nø絛*}Wÿ±þÉ3ÄÒS+ÏPhÅu·¯cãßmÙÓÚ]<ÑÒõyÅÕ'ëïztW{ÛÚ³êøÞ`Ì«í-XLm#¸Fu¢ÓZ±ä¾µïÿ9S9í¶}È8ß+äªnæÓ^ßn$ÊdE[Ó'}ìt¯íøѵK¥Q´Ûmï·ms³ñVhïU¹á _@6½oÞíöO¢êCUsªVÃú«:ÇJM,²tnOäÛä¼r'Jh±ÏªÁ¬Wè* IJTy`¸ñ´,xÂÆPèL*3(#.ÛàsÇÍ(Ç5Ã.wà~>>j;A^ZÕÂ0MÆÇ¿*vaF¸7Ï#%÷Ðg}lÌÒÌÁì-aÔz3urî#.÷?̶#6!î8P¹ò-ã¡lÕ]EïÇ®ÎZØð[¥ðRÓºÝâH53û5qµÓÝ¥¡(¨*SvAkë«Ü´iXE¦ë%qaÅn_#%ÑEò¸ÙeÑ.g}H#lkÓ>§.¿ÙÔ¯-º(2}T|pðÔ=æ ÊÓm.C:)]úÝ«ËÛyï§ÌåÝÖÇð
0«¥7§aÝçYÑóÉî®úÁÛEg'>±E®LNïzûë1Åè§âßÒ(íÓ\x¬ëµÎ©êwõÆiYئóãÊe0wóÔ%<Gz¦÷Z¿±aúÝÊéFK^Ô%zd¿M½5:îRª®cw×{Wô©hØOú¨o¯¾½löyâÍ$®¨¯zÀ0§mCÓgÀpP®¥hîÒöUA|ÊÀÝ!=yy©DzäsÎ9UI#ºêI¹#6ÉWeý¯gÍóz8V)tÇáFö®úBÜXöãfñÎþG|Âøoí.lì&)ÄpæôëøMSÓô5#.2sQ"Þw"×ju÷5ªNþº7Îåí}uKfs=}éØzÚ_C¿dlO¶¹²ªrú%§Øçß#¤¿|*¦góßsg~®ÉD\Ízw¼Ö~h鬻{xHgPî6ßÂ÷¬8¹ãß³Þt[iÖ(N
ÒIÝôпÅÜSm©ÁwtîsÄ:·'³?¬g6ã ÉÄz)÷=nçЯ[JDqDQJhµ<Â^·gPáñ%mÝäú»·n·=3¼ítd2ïäËÉAíTdýúÌù^sÙoR×j=µì\å,c¾-#%¯Ã³x©©; WÍxÙzëX\µÜéó3Õ] ΰ»«K^ûÕGª1Õª÷Ä¡k{¦1Bϧñ êY±£]é~·<ëí¬«%HºîmÆ2¡´¸U\ E\¨¥D#6Ö©ýè¥=ÿEÌã¶ÛËrëïÇYòûáã%»¾f=ÞéMÞ³KÚtZÓÈ'l8¿8{ß6TF=Eò|"#.ßßUGÙVmÏiûY'.þ÷Æ ´n¤(¦Ôh³ä\jdäW¹MØ£Ç×G¦XÒ|^uS&Æ ú]^Ñ]s}§GPWé½ÉµùÛ]¹>íîæ~çÚã¯+}ß Ùî"6ÃõµÁU=c¥Ú8j~>Ï?sÓ×Òs
Å"Cqv
?·åN=3 ÏDüÆs\ùÿ¤õ¤=§¤y-&*JýöãÃ[ÔÛwbÄØñéûDfNÖHZZÛóJQù«¿¯bÑÔ|¥¨Áv¼ê±¤z(ó±VÖÁtAµêq¶#.èÄø6ÔÔrÑþú#¸\ØÇÖgÞü},#6ÛNjBÅp®~ÃBYÅ7àÅË;æßO¶ïÃß«
Ä* Â=µ³\Fv©êÌÁRÚMܯ©øeàE\G)×ÈLÅ<ý];8iÉúÆ££í]Ä ËĺÏY\6Çg#%U¤{Ø[»¦.I<:Øg#6¨Q.AQÁ´7漯#üá#.¬h;û!]X0ÇÏçò¸mgÝ19ÍÿèmúH¾_HGYÓ¼Ï?N××wíQ:)þ$ø/KyÎi6¡+vJ¢ÕEB¹@¸ÊÆðP¢úz
¢,¡ªÙm¿¢ÛiK»eïAxý1_®ùS4`÷³
¿wÙ»N¶{PÔôÖ÷ÅTXPD]Î*çDïCEüYc¤ô¤ãð^FO¸ëz]ÕÏéæcpÈÚUÊUÐ@,#%ÂpHmUWùa±µ®*|ÛH¦Î}Úu÷'Ø2Ô¤æ¼
ìGC9BSu&3æÖ5ñh÷=3m"±|Ø\!XP.{ØyÝH¸¹[¹BJ+ÅGPÍS#.O2,,<Ó¿f;r÷ú½M`ª)
®¢Ñ@9b\m@ü @@]¶ÐئD #_K®cR(ä?µ#QQÄpFñ#%¨ªêªÄÄ:UÙ#%¨"ñÓmݲ#.·4맯É(¾Î^¬(üEJBë
23º ¬W¾\îp®4«ÎJê#.¬ËqÂ&zÐB/ò!<Ë9#.ølc´Àw£ôMzME×®#.CÁEEÁEà#%<så£ñhõyp³R¸øðá#6ÌÞO}¢åE§=ï½ï8Å»ðàÙø{q! ¯ÑÅ=ÜÆ¢Û©)êCöà?Ës_îì]#6êT?@-!öðó÷ÎÌ/¾¥Mþ¢Jk覱{Z-@?÷U§Õë¹üGê-Ç·Õ@{ª¼cnÎL§Q-ðÿúöòÎÿÛeÐFçÛAùk9ý3xÇx/À4¾ÔPÅHDÀÒ¯ §¼z@ìÓüUÿ¼x´#%o22iíé
¶z® kÒ$~ÇÙcÒ5õ«oÕöü}ù°RH1è¹çèÚ4£}çKêçÎL¥vJjþ©J%ÿñ ìøÐ}ÝAbArðQ1«o£Ú·X#66ÅH.>qÈ|ñ$T½"~ßÀ$ééí#.YqrA@f#%ûW°@Cë:ÑÐi&s7Ïôì¾&BOCüf+uÙòj Ù$ߺ×Ïíz³¾EêOæÚ$>ùhÕn¡át÷Hú§¸!#*1"Ú.Nç¸Û;]\xVÙöùú¤d^ wÏ|gO6ÃϺí;Jæ0&é5Ó#%}¡8Ur/$ß
3ì>Üx¿,Cq¨;@v/#%å@]¹C9P¤grÏþ¸(9Á Èvk$§9T¬Æ4h ÷~ÿm*ñ8ê»È`#%X}¹lJ^¾ü. #.JCVg5t^7!ß÷ eøÆe#%~zT)AY`ʼNµÂùíUö)>Sæ×rYXP\¨¢!Å&N0#6±zY*¥MtÛ ìtÊl,tgÎçg2jbOåN@Âq7´ñ&¿F)¶¦=(({;P'+ª×ÃwV_ðÀëá?tf¸@¢ÛnóX.3Q%x]]Ïv[ÒÉk¥×¡TÔ4¢¦ª%
e^ROkl(FX8g&øwå!£?géâÊ#.#íYÍïj~âieÄ×u'³Ýe;gÂTüLìq1Ý ¯#¨(òáá#É,pçtAè5+ÙldèwäÕÒ{øÞvåÆ;ÚõmP'@î}ço=pÊ2H#6OGê_0P&ÚJ#%íËTO¦\ýæÀ¢jhDp¿ÉꡧÐy©9Sr³xêÚ-ÇhvÔd#.Y|ÓãÃPmSÀ_¶V?L_"'(PvÖR«6ã$¾Z'xõ×=÷#.A='áTP)þ%¦}ýjW¿Íþ\èô´Ò¨õÑ3Ê¡â̸|ÅZ~c¡ÞFÊ0V(·ÙÛiúÿ+Þíôüt|~!s#.Ë@Å¥ÑZÃñxä·a
%»©±ªþ½GK1à*ÒpÁþ'Â=6qK½¶±/öþ®x ©®óÒ½±dRl/U¬ôdÂAÆr³#6+óÁ
GÌ&IòênçôBs\g"ìé_Kâé?§èMað{4ÃCɸü¤ý³þ~öÜ
ÚázNö}Ëê9)Jë³ÒïIÆf¸<Êw²Á»¤Æ=,µ¶&M!.üpVí±ðNtÞe°Ø²Ó¦p1ÐàøôzrżùXwÇ+8So£°y1Ï,ð#.0#йò½ÇÈB9:-{~Ã1[rµã[öÁå/{Ã" V«Ñ*&dÛëqì¶Y-Ï.õâÒÝpO5Æw;-¹¸ò ¦JÅff Ç»¼Á¤à°ÕçH|WÉ¡!I¥Æý1eEÖ¿Ö9AtP_ªÈåÐêkWHV#6%±¥ìå¬1^´#0Ó)åªùº°Eóg*ímŲÜëèûßÁVBo^Eæñ4ûyÖ°.éÄF±¾z4÷ö`¡(Ù§¢W'¨f鶹Jb®òÑ;¥:ZÑ;n»Íçe¤°,5÷¿_¡==:©8¼á*èçñ_ozâ|qä5v]QsÚö.2ß#6ïÓÓ~ýá*ÜEÛ"c¬|T=ù<³##6àÆ`Ñ-¶P¦#.
ÀLï6 ÏÜѺ Gà¨ëÔTt6k®^m¾×¡Îu¾ír%ÄD>ÚòQMã~pÝ, ¬&»_Ag¨²Naæ{¼'##6ØÊ°àYÈ#søýø²\¿ú-´Ø~mÞÂɱ*6i¨I@¡¯PUG¶/G$YYzÑÎR0úgÏüîå¯Cæô~6·ÌSPÔ^ÎÓ¤é#.Ózý¯kHmiÛm.3ÌxK¦ÜÈÿ~®%Ä"Þ+G;L¡ïncï53áõ>¬pxq¸dê}¬=ÓÓ·UýöA¶vrv¤94>üL¸½p¯´°©gL{Ùþµt6É{<]^ÒÞÓXÈÁ\ ¸ALäo¢Ïóü¢Ôð8ºÜP6;Ak
Ù#.njú«xõm©ÁäXµEÕ-">/Ñ£§5ô¦`åä[R÷6qì./Ó#%®Prö9¤¡ÏTXù8H^ôѬPòÖ~Zª¨S~§!¡<פýUîO'Uú¤0°*û¡Â!5Éåúõ
`ØY³¿ÂÁà$µD£#%¡<ç A8¤y¦ç½â±F*$PIåeÉ#%úZ;d>ý{/ón\ö»A8*#vw3
*ü5`,rØ5¦#./¾ºËÜ 4WiZ¢Gé!uá&(ÒÇ_qDå®g·3$g²a:¬ï,ÕM{ÂkÌû!ÚR [#.Mßâi a½6`3"»½§ïØÈNÐ+Ùbv§êëdëZO9ª$-]»°Ûü"üfÕÃõ¸pELÂçìîiUHE¹é±e.ÂC¼âgA¬6y¢gÃë]±éwÁ÷Uîåã½}¿)¯#.A²ÌëðÀ`lAºÁ×dí9Èãjá*ÙÝ渻²§°ñ,«hïÜ£dwÌ.°»dåyr %(sãeäFzeÚXí¼#.Kó¿iCÜÚ'~Z6´#±sYJÉaLJ¦#%39F¸¨Q" ^Då6{PSS3yÝLÝ'n'´sûõ*ãz¶«cT¸#.2!r(PhPÚë37nPáF;E6#%ò-®}]
âRkß ×ø°ç>Ðt©[â¾Ú²Ù¯kYëõÉ×,oÅѲZf°Øâ'Ìü¼üFæ"_êßv8í<[8¢XæË«É;ýÚru06fåÚ¹$£ìH½_¿ÅÌÖ_ÈB'ÑsÁ¾Wì$³m#6E]}Ñ#.~j4aÙ£ Mfù À\ö=°¶²ÔJqåÎ{ôÅOª÷Üþ§ÒjAéTPº¦Êæ}Ëã1¨ò%¦ÿ£Ì÷"ÛÍ¢1#6HsMÇ¡±Q¯5óßâ¬Ì½9ÆÂ>uRÂ#}ì3va¤gìvm¹ZUÀ#ª³qÆîëVØX®H2ÚÏßÙ#.ÁÖ@¨$7°íc<!"·ô2¯È.îöö!Ò5ÐÀ¡L÷³á±Ú¶æ
`ÆVØäºÑb#6#6õϧë(¢Ýa'9ú#6«`4Z¢ >P4i á~q\KAÔ!nAÌ)ÁÑYÅɼLèÈÉ6Þ¼44m§3r !±ééZ-*5Þ/!*kâÔVäDK¸ù°;"Ön[z2bèé}ÚÖ½ÖJ"ÃX¢Ìvh{X£è¹Øf¬b¡Zëóè¾´ò+Au~üâOÚ°Éqm©Þ:¤·C®aïÄ,«&q\ÈA̶¿n<l4(ÉÙÛÄWÎ"oí?w©zg\.Äf¾]%kÙ¢t<æÐ#.cÊá tgßr#%s-¤ ÷çmhÅ»]§N4(ãZs´cÎ.ßx*sgi5ÃÌJI@íod/(&_ÊX·éåøC¥¿ZO¹V?0Ìd<Ö¼ÌÄË0æ;bù¶ëðzàUöKd3³ Êáh@ÙQm´c`ñíYÀíÌÀNò1ª8Ø´+n5µ#ðF¼]²"RO]WQ5#.ê/Ùªß~aêÔàí#%飵âÓê(-+GcÒÐÝ`|^D]ÿ¤¿³ÄÁ#6El\q´`!zI¡¼<)MG~©oÖxEß¿øÍF'Qn#%xTL9ó¸- 4ÜÜÜÝOÂxp8Yx¶@Øo\D÷Níu§WL7COÀ»îZ¨#6iY|ÊäVúAÓ]&[óêæ¥À_5·i>sE/#6¸¹%5ÿ/ÃN¿ÃÝìï(öþlâò9Ðs7Îåú§óh£ógTHðYg}ç_Aò0¢VÅSNÄHQ'Äá×õÀ£UGJÙB3qØ÷dZÞgÅÒÐq÷q¥¢×_aÜ8#%Iü~JÚ79ÀëÒ6ò`á|û6¯/ YÚr´hÄú§]Ù3óþKÕ⻳«Ä|3ü|cÈuyb3fïíÃøÝCx-®X3ÐPXút?QÃL#6Ô28~±s;{þ|%UVvþ,¿Æpgºÿ
ÀY²Tì*Br)S0eÇûï¯Éþp>VÇù¸îü¡ü_ábÖ?©BÈrøð½C9%_ý¹$TÅIÿUP©þ·÷êYE»üZÕôAêa#°^ØXá©81#%hÿ]¡0;5gûYý¼³Ö÷vØà|ávçv
ßëûîÖáþйÞcË«±_wNóx©©A3CaÚ ï:Æ]Û¸
xn4©ã×Ìê{3 ®íH¸éÍßYTBºâüT£Ca²lÀºª<ý¼;ª§`xµÍG°{ÚÀÞõ{¯aô{ý.Aô¯³í4A#.PÈû=¨íÚ+þªYÄ; ]ÃäNÁ5%Ñ
î\þK¿ÞÍ59Í=¶Ïâ} F²¡®B Ötüû§ }ËÔ:Ð$A7ýß¾ºÏîû]MéÎÉã D|_÷*ØUÙý./ó,Õ!nÿP=`dÄ_¼çâÜ&\B7dªõ{ ²Aåý qÈP#%)Xu¬¯# #\>Ïæþ¯G¿å+÷[q7¡çb<*Ïw÷ý=OâGÔûôH|ï=áãøN®A ÊLª´RÅßzáóHò?yCÔàVøþí¼
ò>!0нÈ^ûÆÁ.4ñ6×å#.ý?ipvóÙ7ìj¢Ñ X
%.S7pÂMÞbÀò6£4¡ÖyÂCaÎ#.Ì·¨¬Qv ´&ËPÿ<#6ÃvT«±}ûXðÒ¥WÒ`_Ýä }ÝâÄì9Åwû[wmZ?¼C`ðã tÌ{àsõÛ?OqÂöVÆȨ7RÁ°Æ.¸È(H0µp½#%o{íx-)F,=ÂÙ²"ÃÌä°íÀÚæ9Níw.i
cvL0ìòÆÐ*ÚÃz}pAZsmy^®ROÅö
îNÿïòðYGÔT%X|ËBáá5¦ý4¨TÎ(ÔXÐ#ýeµeþô=]Hê#%ºwZÁÀH_6£áúl¯ïwç£èÃ0%ï»=¡iìÁ'åÇ`w%#{ì;r6,#.øÖ,Ĥzdx`¿ý9p©CYÐÒTe*ÞiD¢-&¶Ö H<>Rg#65Y$î?.ÔäxRR°Áîú=T²U}ø@ú1ME~ kmmÙGåô¨ó&FØèÃefæj²~G³M¬2ëôêYAÁwYÃâÖ÷ #%yM©o®#ÌôlBÉÕ@"Ð$eæ Ä|³5:IF~¸"Ì-¨É>¤÷x¸º"#.?â#6ª[pÆñ·æ4ï* *D¨ uåsØmos¬!ÖÃfMð*fÀo5йdãÆ¿ç=1
V·ñÚÀÓömçÊkû8
6úl£\ðgbÝK!UU;¤I#6ðïlJüý¸f¶Çí86#îuï¸öoz©àÖó×Éà<è:YhÜðyfÊçñÎSlK6ÉÆd.ÕåèSøÌöü½Aô~Ã!#6ü§ù|N3ôÿ»òï;§ÔOÚy K~ô¡
×Ä°´SêúfÄ=ºÔ#.óévdÖõò?IÆÉõáUê6üôû[~@ð@X#6Ä`ÈÃ/õ{ü>¨ #6èQÚ@Äöl²Î¦§\Ã)%±·P7À`«³¹ð×
÷C.Ðup È`güûV}¹Î|¥F1°bcC2æ²Ëæ0}"£A°o#. '#%ØÐhü÷ìÚ¹&F÷7yGÃÌ2M:ÖúD(3ü_ý}Hlû·§qE#.2+ÏM¦äûøæÖ039!×ÚFå9-Eö V#6`dêxïk #%ÔOÁ-=fq/¾Êõ¥*`k|X}yÅ^Eí!l<FDYºÓA ±¨TD â)#¢3S:i°q`wr$îï+à±">,òq$D©L#63ÎÏõkNðÍÔkÄ^!rÈÌC¹éi Ñ93C<µ½Ø2.¦#.Y$à ¸ûÙÓñoXÿËw^º#%rÿúõUvAýù+RWáóÆVoë¸q®½v¤ÞzíÛ$cÁú»eXjÿÇý1-.õXÊf]dmffµ¨Tä!Ô}§§Å´5N*näl³+¤CE×I$ª5LTËMIikm§«²Öjãzef׺:õ'«^kA«ÐÖ·¢féuG¼ÇV:ÒÄeA)2¬gøY(Î:ü¾Ù#6X#6ª4YH¹²¨éô0 AP~_bÑjTmå»2sxqnaÑXî;Ú%³ïöÞÙýµ£tGí^^ÈÂÆÛýÁ éó˼ÉI~}~ÝÕ¼QRü¾ÔúÑ÷}q§#%è!À´>Ò^¶Cwl9¨; 6ðIÝ·;¶¯¬ó·Þd]¶d>aØZjH M)ßQlЪïVY¬$ r¶PRm82d?ðÛc;ÆxézZªÎÀ«àU¶#AIE5º&W¾f^%àù§S«-5RkÓ¾]ZÍÌ¿Â19l=1IAJ~ËöêuEð4+Õ.^¿%6èßرfÆó£æg§-Ô¦ÝɽI"H±~Å÷WN3v¥7()sp*Kûû;®Î϶þÒÀû´Ûï3£ßødc_dDôvö´»~¢µQý![~Æ1mؾñ!túíÈÿ©©¿)èlHÅ3ê+ì:öK<¾¢ªQRR"äÙLÙ°LÔËsMw¶`¡º îÍieBñ@0bRòK:R¢d|~n|âWnGô ݽ}8_¨à<'¯aòV¼Qîó5¯·o\W÷Û^0'h7 2u%¸Fmîòf±0/ÍÊÀ·ió¸ò@£P.£ùbúÈ+?NÎTáõPäDs#%>!ø½Þ@Y68þçxÉ\ż.Ü?ú-¸QÙþ*°DjIôßç½a-êzÄRÏ¢*%öQ<ìr0}y,ýÂz ú>Ç[ävãò`õ#.²Â½ú&Ì2(Abã:6¿ô9v¾ðû`ç¾É±9ßÙú_¨ì>ʧ8»ÀþÉùö»6x'ã7u'{Å;H©A5twµñíPIÉ(Ö?xyX"DNþ}+»ÅÞysF±èæÆÀY3m;0#6JÊÌ#%âaAö÷D<
ÉY(Ìò ¯À.pW÷Îapõ÷lòÕs½8¾?~ç3PGÌpC© :¨3yC³ÐÕ?P«¯»/id+ä?ÇGÞÙúÉõõɬ÷V7LUQX®4=áù2»Ý£¯ëø|áçð*úÄêkCÔ¦j£I'±â©æ>·Ò »ø5UÈA°4d>/ЯãH¤Wb)ÙZ]CÝZ{_\£ßö¨0G±LùrupÖÖÆZÿG}6\ÒT
Éá åõú÷£°20®UöÊ°8MAÕñ#.7û;³¬{¯Ïàtc$:FÞ,!î:ìÎ:`âÁbqe¨s꾸äædQÒPÁNêËJCì2UÕZ*>RQÀÑЩüèeLæHãc;väáÁbNTm÷TÍ&tK£Pññø©tóUHª%HYÇW¯>nÛC-mur6ÑêE±½¹Þô+n}|=i³'2)E^úÏS<a$Ed@¡$´ZЫFþÎ)Ìí76,BĤJ(~¾'QvVôbJÁøN|À=ɯ»ß<OZ'Iâh<Þ°ö#%`íßÂs#.dòUî6ûcÁ-£È3#%§Mª¥¹ãïù¼_Øû«óåïè/_Çk/qcu¨²{¤·´?×?#%#49'öJ<ªJÿ¡ÄÃ5má¥8`«:m _\¸Í©RJJQ¸kúºu÷OIÝ'lòµ°~3áGbâ=hòäÒøj=ußËã$½!°ÔÃïLý®äwò!³Ý(TöCÇÙDåÄã÷~CÏ¡\ÈৠT £T¦!Sä§r>Ð2üY"æC}ÀíiòJ;).Ù¹½ð h_éç±¾üåw¼!,#6|õ»ùN}Cà=åË)BB¡háô"þã3ì kEµ,ãe'?`vðßù\à£öíç¶>ã(}M|)kì`éþ¹áaª]Ëàa½E½h#ãòF%LæV #%ÚI0%¾ Z\Baнìh%RÀ2` øÐlHvE6(¤\D½dó¸HÅH"8ERG5Ö ½Áù²AC DÖ55-~£¿Àú}ý#.>(#.ØÈðòÅÓ<³1Z*¦°°'Qb¨r#%*ãIé}¨kOH~)Û´ÑLAG§QbY()9gb4 ÁGô~×ôs¢×3Ü×fHz3J³íü`V߶PÁý+_>q°Ù#64XÌ¢3|»Í¯r«Ò¸n[]0ÙP²ÙmÝyæ]<(©hïôWóúý?fþÐ3MãʳìóAì};`%õñºéîfú#%½'¼YÍõù½HÃ[±#hqÃkóÔ6CôH&·j ªY1#(#.DB2`ëJhLé·E(Ò*XZÌO/' ;+óxBJ<ò9/;3§¨^-ûi^Cµ#6@Õ£wëÜ¢}RN5Â7ön9ÐõD#%ØpHo(ë u}J6öÄ+pòi:ºØç¡<½s¶Üíö[cÛ.Ó à49°¶¨<ïªÊ<Ïgã³ÙÛ;Âä=Åa¨]lùúÇ#.ÒÒá)#6(£ß½d©ý`~¯YíIæIRJìóî9\§ÃÞúî8ÿ#6Ù6zC¬÷|ý>4Ò~Á1Ø¡ð&IlLatɼ,#ZÅò4|kf_ѽ ´¸¹K\UÔ0½¼$
´UO°ßÈùq¢úHhG®¬:#Y9!|úÿró=HÍ@p2¡ «B#Øë·×îüèt*KHÍÁÙ·Z<°ïC$"4ëêëç?}z¢3Ôx'îM'oÝé#%ø÷ÿ´;)âB0®ôo%dL,6f(·Öߤ¯J¼u.î¯[<r±!J´Sâ_í#6Ïíªãø ùßïÅ#%¯PC2?¢?½öýfYÌ1?I#6¯Úz³:ÃÀÉåÖh¢"V£Ìwg#6þ¬)ʲüöTÜ0¯Á=iÚ Ï
Bi0ÖÂ%ö§gpõ c%ÌU!1¤1*D\?S:PzÎ ®þçæËÉHJM´RÁd¸¸1?;ÁcÀÌÝ°.<Îb§ Ö;nçÎN[»Ñê Ýõ{Cíz!RسãõÙ. S#6 ê=,è>½¾zDZN°ëÀàô·NV2KÀ.*Ð~ àGX5º!¶Å/K¬Û
Ø©ÓyâzK¨*üÌ`
êAnßlä¦ï/g«*|[B³¿âUBP £âÍù·4¸Åá8'Pf,Í¥dÄ1éÿkü;Ô¾Ö#ÕQÒRQñ{ùmzIIJ
0êÄ´ÃÅ
ãd
å1*ç0%v_η?nTÖtÎ#l1绸UgP=`*IùI²8¢º'ʨ´§F¥ëPØA¶_NáAJ`µ}ÿ¨|ýÅÓÚ/O>9X<ü|z`î7Éíö¤»ÍýVèt¹ úd¨HÁ^mQÔЯÒkKÖH¾ºëÓ.pâìDéGb\3>:ZA*à¡=^Wû<eÀ|ä 9 âp]û-³¦hêØy¡¥ÌÁÐðN£{q¤bB:8jð´AKF#6#}ë¸O`y½JÝüÑ<÷ à]ÈÈJ¬Êª%¤[9_Ôöì;#.HÂ.ÒPó÷áùOܶÕÜÌúQóμ8*eåàx_Xú(ÉA=ÐIÓíÉ\½èÖÈ,Råí <nÝÔn3Ûò'ÙÙéóøö_gùUJè â¯Wô(X¨7>àý<?ÔÕ =>Âcp`¾ÆøÏðAv}Ï°¦òO"¾<ªR{˦8r?Oësðo¶S·à~4Îj·¹£0gþð¢¢+dã(Z@·A}îlí
rÔåØÞ̤]×Ý®¥éÎ#%5I#%M$ee5hPmØØ5o¢àLÝpxûÂoJ#.0I Ò,6©BÈXõZªPýÑ÷w*÷o6`>Ϲ#.¨,~è¬ð!"Æ"?» Þ`]Q{jòNo.ä˾0,bd% ¯pA°kó:Î.îz³h*;¾Ï»kõê'©uÑÔ9V/N|¢½%bªdÏ¡?*=
ym+Pw!Ýd#.[*p
½ÈÁa°ln7â^öÂ9íLÀйp´4#6ú}>¿|{Vuï-¯M«¼ô©)mï¥Ývó·n°EÿQõ½Ä3t6ËnáññõÙºÈÀ®Þn]¯C9Qpë]q¾#.ãvË´[ÒQ¦ßôßõ
ÌD÷F§-hja°»^¹BVͶlØÅ#%PX°V0PPÓ®¹ø:ä nî¡zgxDeñÝÚb³ÇÐ>yÊék¦ô>z{h}Ás1óAdÑäH>Ôî£éf X}Ô¾îÍÌ#¼ð8&`ÛwÐ6pÑF¾ý
BBM¬#6I#6çá~Èë H7V%íü/Äÿxên=@çE¶¡ï=jÛQQEV$[jUUD:üzâ¤^*eVØ!ªú¿¨Ì&&r¶l|ôD\Üç´XÖi¡?«Xiê%x¯<íæ®ézîÒfSo[Ö¨ ¬s4üåú¿ä'÷åcyÜÕÕáPÐvSÓú0Ñ"#òÈðÍ~éº{ç´×Dª_*9äÕ¸S^t §(MÉg#ärö=§ßÆò}²)NVú¿A>?Òe ³èÎýPã/#.Yl{d+×V=µpø£µ0têÔ¹2ý0â{Qnwvï÷ê8KÎÛ¨àzÊk0Ó2¡#%óØéüú»#.qÉTÕK£ë±+WUÑù÷ÜxÉ°ý*(D¾Ý!Q4ãHÀ¢¤çæT,P@X$àY´5eHrëþ;lýÐèllWTKw{ºZĬû?ü£øN=ªg±\ļ3à1ê¢Il¸ùÝã'0´`°+Ãm÷@#.ÉYÇî½Éc÷µóy§#êúéàã/ê#%B§ôëé._0þjà%Æ/ò9Q»ür#6Wúÿ=
rý¥âÀ¡(#6`1M3-ÊS¼ómÛÛËÄï)sª[!÷DTL¡Y¬ß¨èhq9"ºT"Õ#6+èAá©
¤©¥q¬©æøÚàúY¡
ûfgñ ²¤(kf:ñ£ðåØÅCù¬#. çXÑa¤Å¨klmYçqÎ3Ö~73®Ô.¦Æ%½Q²: v-°r· ê0#6ÄlÖ¯H`³}gÏ¡t¼¨Lýïä|~GôÿìÛnîv<ÁÌ!ìÊù#.ÓÕwÊ,ýðõ*U0BA_Üá÷KÒ¡(æI:§*þM?µÍ®ßÅÁ5ä=½ÖN}¼NÍ\ë׳&í?z Ф´Y-
¤*¨õÃ~#%·öµ¦ÚSõ Qk#%Z
z³#%åÝÈW;Àϧm`ðÝ%#%&âUêï1ó~{ýq×ÙúùT{,eÃMÙ"bª!ÖÍÌ"qùzNº|úw¿1ÔeÉ»D@åÀy#6#°2;×â¾÷%þ÷2zTXAÄ#%28Æð*5@åï'»nÊlV#6~\bHQ^ÿ½è¿,[>G;H=iêPÈJÞ§b¨$ ¦ð¯ñLÒú.½ÕÎ`ð4Ñm°É(4^?bS*èdðpéÿ7f§Mó ÜÖñ?A£7DË$ËtÆûëÌdÞ>o#%d*6<¾Þ<Î= ͸_èyËa°aúðLfë9ßmÚíãÆxjt3û±]]î~N.5¿U4K.w¤Í
ÒG
Qëæìøæ°Þi}kCeúÉî.§ZÆ8=6t¸Yr#6%Ý7"sPDÖL1ܱ þ^'y·=ë;â*Slb¬l{¼*þR{\2î@¯çk·¨ªØPîá¬
âðDçG½#6@<0GzÂò£|~Hø¤þzN ØûcGÿÍý]bïÓcy×÷Ò
Ø!éÅ!ùÆ?í·oÙÜÙ?ÉåTQÜ)ÞQñ6ÓÒáÞú_7Ûàòà#.èðüª½ÚpÉê7?v¿~óAÞJîîç'bû,íÜz@®^í@q(M¶9T*²õÃ.Évm¶Âº9ÏY t Æ"ñÌ&÷Ä;:×ì<ÝLò0âÃñ{ü×R¬þ/$úý3Ò#6?¿>þ_Óu,6æsl»sÄlË©Å0âÕ躨sæG#ä.ñuÁgg¹mPÿk¼§l$XóüEævQ?â[òÏÞßÆIGGHNåwÒSîýçâ-¹³\Áxµ9ù¯s£{©¤`öù¤J÷ªÕ:^¶B4Ë?ÕzfêÞÿ§¥¢®¿)#.!£aû1¬KÚëõÌóê2_ã[¬{lAnµLL#6#.µ qÍ¡S'[o½ÂÓGf¬(`{JÂñwóç¦$ÛÇRu:g<®ÏðÛ]3êød¼çCpêÖ4¦8óe2övÏw]Lâ0W½k³8h[¡åÁ,¶ {ö}/l\_GH½£¤á¦#6ù^'
òlæ¢å®#6ÊÙ.rw ë0Þáü~-¼ï>]¸ãÉÀswsÜ&
ÑÜÝÛeìü§]È]2ý3Ë4Ù£UtÏ[mjpª¤9-ÐÁ@Ab#6£AkãÕÓlÔùúøoTq4°gÒ3,Îw<vâ/£Ã±ü3#6¤39ß \ëa7gÖâ¸<«I
º×$ #%!¼|_á1wç£6ôt3kì'6¥e¶>É1~¯&#Ùî+ïUÜ¿îÌ×}.µðƳӦ³K7wMïTD_UÒr{RniÐU!Üñȸ>mòi?]Ðúsyü®ç:áéõ#6õ3Pÿ[~´ìù¯§¹OÏ.pìà?h^UÚfÞ|ð 7ä¨ DN&¥6iQ-9z-¶bêwþ{£KÝ4d@òuL:ØÝrËç}ÖÓ¶æ8\à4Ý&dOËxtð£Õ1ÕoêïSßþþt¾þßã}¿FZ÷|iwïòÃ\EÂ^ÃÑq¼.Îúyµß³Ì#F×cró°Ê1J?yU`< zôê9=(ÇV#%Û»#%øÓY]¦ÆÉNIör+Í0Õ#%)aN^/X#÷$ 2ÂOaA~eoa#%aÓÃÅNÍ¿GõðãηÁ8ÝóÎ$÷ÍKs{ütJä^ôeìQú¤ê(LÌ#.!~=.gm iijÞ]¨¦b¸MÐ6Eî@ý´Þv`waY<<ëà;% Ó3!.áé»IÕ35Ç3å·®NúÇÓ(¯§ëù6c9vòD[µ4;ÈQT4¢ÆR.²aV&¤BÓÕ¯Nh¬Fz *åQH¼Õj´$fU"Â67U<yb×b® »T#.ZdK©¨å9Ì?¼TRëøq©û߯:ÌÑÜYEzhÀO¥òúÑ'Â}ßϯú¶´ã´!hRéÿgÉ8_ú+vá4¼þxÓËDçèûý]g#.ZgùPô}ý;ñlÈ°± IôKû«ôlpýHN#öþ?bpà~á¹#%$!!ûß#%ÜUl?ÚzSøól]¸~·a¶ÄÛÉkä öjk#6vè¼]ý#.çÓHIHÿ{µ?¢ËÀ;uMÎYMQÃÈÓ[qÉ[N¹´&ÚôunµÝWx¾0óÉç±×p4-çPÖ\IÁ¸7\¶Öò¨ªñô¦Ü Béǽÿ9Á¸t<#%<3§ê#. 2¿ÛÐs½k!(Ú*]𪨰©A+hXÂÆ?Úvÿ)Èi0h~~ë[v[¹a,îÍìw ÚÌÖMN0Ï|¼Ùª<ÝÐ'Qä{jWÛö[¾¿9`±Mà®P³(yÝ9qõEXós!GWQ®Ú-ñg4'io/R á«®Pï¡ØùØk¬ÈBé;"k£s_¤}5fcfS.ê²ëÃ2 `D §ÂSI0&b1"áJ5ih¤>fRàH¢Í«N¶s8¬ Fe
qWäz§d¾5àÖ
!;xÀÞ>ïçeÕeB-!Øïm§0M.Î"Éô¤à7ñ¡NõbÈ>}¾X3ýä
:²íäÖNÅÍ÷ü7º[Sòaéߦ#HáòÇéwo¦¢Ì³ÙÛ´!;Z-"¡øèzbS Á#6ª
°ÐÕ²A±¨ÛAp¥i²e¢TA Ð@h=BµËº¿ f?´5û»q&}Ûrd^Wð?üßk{K5 Ú,_Öï{¬/+Yüt1Q!%¥*d`ü¿Ú@R¾Ä9AäF"ÕÝ·fÛPàw£|}¯ôh {·g=×·½¬HER!AÓË´Ößè,?»ßØ=ËȪÄDy_7xÿ<íî,ö+ɲ.eñÖàÈÔhXØ+VBG=«ÝÛV =¼R7Áý.ÎùrõT'(f¡Úh»V7ʤsW´Ð¦À&áõQN!ëMpqZ%·då²n¶;±'Ú%1LhUQú#6l}i à ó"e¿¦<BÈ|½3®Ü<<t¹Rð`6¸Ç&ÀvîÛvyÂ8Û`«pBº¶DÆdkOVR\:¤+;ï#¡s°îÝÈãLºÅxórÇúÝkå.ÌxÔ©¸ë4Úgu"0úË!we*ñt5æ:ÝÎ&e%ßãD¬sì·.¬é5Ĭ^r)Ãg[Äb.;a3¤ðX8:^Ó·¿¡Û&ÉëÏs^½ÛÃõwG$f>Wâw}wλw̸áŶòÕY$6ÎÖa7Åç4E#v8¹omæf¸À¯C'am²H|MÜ4!vkÿ!VBÞðÙ:Æ Å]å&@Éî[ÝÈù1àô#.sµ3/MC4XÅ#6ÅE)ënØáã´'aÚ[\£Àº½fÖ@¬næ¨|?¢©£_w³Ý¨Ï¦ÐàYÎÀlô2K?*#%a8xIéç×¾=¾øs¿AÜrøfA#6¤±á·GÃM§o#.F¾Üϵ*wQ¥íè¥Tñ`Ñö7õF4kÈAËð#.2ìª0hXøT¬ZÔß´åb µØ=H<àXoA#.!rqíg#%[:yléTËs©ÓT#q¿`Z×Í^!|´Bl¶Ç¸ò´©Ê=1#ÖÑ8ÆÎ$'`äQ.º%ì+¶&À÷{¡èzy
5 °ÔmyÁ,Tí6¾$pdø(Q13(%&ŤÂBß²°Ôla¥²HrÏ#.æcÎ<BÙɤôÏÔÞ»«[°ËZPX·wouMÁÈ̪÷LÎi]©C£0=°X¨îuà]ñ»$8dï;u!ÉÒ@0äPT®a¬xoàfvfåWl× G¿àªQp@©Öö¡MÇqG{tØ&ðºSl* z½39Ã=NùÌÌÈðØy"¥w'ÐUÒq5¶Æé¹v/¡Ëà24@·øl'âlȳ§w@'©gyÂvkÌùµÒ¢¬d¤Í4ôÎ¥ë|í#6£Ðà«5t¶õMÚ]î<#6i5À{WÓêB<á¤16;¤ ²D`ª#6ÍÉN^DYuQX¥ÚhgLm¤»2îxNKaÊ£R+q õ(Xø8LÎÎoE¤hÂ.JhÚBHN_C]àYÑÉ.Åuá-,\à@ Ø+ǯ53¢,UæeÇ2æffXÛ1¬«2ÌÉ%Xì<õcûªjñl$0nÆ&z¸íü'qÚÌQ¶*WÕÜFÞz>7³w&¥éÖû½CÂ9Û#%!zlP?V[¸·=¾Û»ÊÄsÍÑÖÒ&w·áÁ"TK¯=k9çÓäôzp¼m)ðièÖÜæÄÙ3=êFC¾hYCS8G+}9ÇÏ5®ÍGÞsÔÁÐi·d%(ô#6×nÜÉBiÄháIw°P¨¡%Õ,±h¨¢^4{ûw+Ñ#6Æ]Án³ÍÊÔJ,!25.!bÌÎ[úsHƶg6|këPå¥èÐÐɪ×eìëÁéë#.dÓC¸ÌG)¢AkotcC~[^²Ù#%D¹ÞìÎBI(×¼®Ò´U6U;â´øÀ¸}=»Ï|#%Ö«Õ¬´ÑÂ7:ðäUC#6S¥Áµ;ÈèáÎ\6Fj«U*F7Û`r¹át¯äXÈë@¾v
^µG1)ã^ï4¡N)LvàYÎò`']ÑLª5m²Ý3ã}´Y¼5ÞB@-º·¦ü¦ÏFµ&¶á®) lÐÑÛµm,¹r,±aòãH }3V%O2(öÐà£J(ÐâHk2fdçqªºDôòÚy"èN5«Û¹]Æ#.¡¬Ï7Á£0¡:þÿç06î쪻BÌÙµRÉÊ$ÇcHÃáÂûJ$ètU&WD9æÏ*Ë!çÈÜåÞb<BÑ#.#.¤E¡Fy ha½¶E· 38aú-á'/JZ*V¨i4`hRq!]#6ÐΡ«0Q¢e.ÿ_B"ûÉ¥#:+R*Fä¨ãºq=r@õ¾_ 9Û!ß/¦MHYLÓÓgq.Ôt=vü7]Xu&I¯Ù(Cy¨¼°jÏ4±K¨d;Ä¢¥Ú
©#.üJ$E1ΦÚ1dk±×´³[&ᨡÁÄrGÌXÐ!"|&4ÑIr`ô<4ÒËMkWgÅ7&»Ó6ínS./ÌçÇÚÖÞ°F2õN;@ÕDf¹â»ãUëÐûÀ%NÐn_~LÀ DH²Óf©¤ß|oR½oªó æ85IF+:5_`d{ÎuȦ¾¿\·\g#_-7èõì{èìî"æ³#YCi#.×ØÊW¬¹7R¹ÉØÎ!±E¹*.I¦#6Éw×¢½³áp$Ç$#.Îxy|FÀPLZ#.°(ÌnÛm&C¶#.F´"뼡%Ï·z9¼ÒjÄ6¦Þ0ð¾oHCøÇÇ¥7L!3 0qÄ#%Æ;{[þ@o $ÜÙVI6-Ãp%A<åO××'P£ÿ¯¹Mu#%I|E>½Êõ
8q¼D¨-ê½0ÒÆ»²ô:¢äåê=¦&-Oé¥éÏÛgÆ úîí²]+<GHk%Ù¢*>ñ¬K¿·M>i#.$×ûwã_ÜóÐѸ$ëÌgñ\W«§Ñ3nWVGM§OUªy#.ñÜY7#.ï·»·=h=BÐR´gÌß»´_t=V[(@²2N. c !áHôØ>((Q6ÿÅ7Ý*
=°eHÐÿoµéÅr.#6ë\HîÚæzyðCÿ?²e³ýBÔVKÓÝò<`PA>B¢*£!>y5©÷Tõ.¥(¶fÉ(ε<Uvöú|G¼z¨lô!á×gï"ûN`´é~aõúCäD#6F [Ûº7÷«nÓ6R[êP!½ÊPE.xù®5#.+i}2AAûwR@H¡A)Ò¢+4Õ#6ÚÊ fkÙ:·oNqï$$$¥¯b¸ÎôyØöpÕ$µ@© Ò(øì¡Þ§pm`<lr°#.ú¯±òÁY±W,ï$Íø àô]CP÷À;?8¤Dv#6#bBÙ-hÐ I÷ì{ÄB"@æ|§®\¦ú¢Æ*X4GZA#.ÊÃx{i#.¤Pd ##%=ÀA`|x_äCR³¥éó4èÔ£`$kB1KºíÁ#6Xƨ1tIÅÊ»{m|®Õé¶#%¬Pº580.HÜÌö¶D[¡·¯¸ê{-Ïþ0~ðî6#.ÐÀÛuHKÓÁȬ;Æè+ù(ª°0#6AÍ£3¬%_²\$Í>&@!åÌh!7#%Ü#.[Ó]ì¸F/5û"µöi^øUÍÔdwéÖn\¶qü/ êÌpá<`bé·¤Éê5e6Û}åcj墩i,ÚAE`d;á;`þèè«UÛ4ÖÖéW¼ªÙ¬àcòz9$»u[}ÌnS(îÁG¦"uÆäMö#%²¶×/lM²`Î3 IBÅ
ÆêÜ£ÉPbî0*z*RIz»·M·7©½MÍv%»´^uå»ùÞy·¦;¹ÕÍË%ewhä½#.ºEhÒÐ% Ô¦¯>6õ|,µÁ}l@$~×Ú#%Üà=Ó$.4¡°eÏEY $$gñ¸|o'¯Øÿ&_xr¤¹ße{Ú²qõøç#Øéêô/Í9xóÏsLXËüðDoÃ7æzF%A\Gvíg}¡õ¨ÄhKmBx#6I!yb°hÚùëí*×Oé¦Ïî§{hVø¶¹[sU>þ³Ö2f00$Y§ÓÄÎ+?ßó÷ãì#%OPÐ?ÂUHïjÍgy诨·«f#.¼çr£k¸,CÇs(lÈd×XT¡
#.-¡¦êTÞè`¦`0¹þf( äC.¸hïâÜ_<rµXzèý¦.[÷9WlÑþDÝÇ~++yKÜDÝèó5Û=ÇÝåóÝæ°_uZ¬ÎûÛItï½ìßi!,òîh~aÑCåð#.ïv±ß!@»#.W8Gµä´®M[q³ó'ôÿ5çcyÎèóó\sÚUÁ´ü³1,;næ)È£D£lè¢{Â#6üýEªRNÞϤ:oNEµbz©5RöónJ¯\E k}ðGp0³5+"¾N¤z¥|JNq±z©$MÅkÔÃâÁ/H
çx8Sø{Qy´¶"ØØ}¹ú+<·1#k²*âªhü·ÖÐñÓãïí()de1*#úå¢#Ñ{<¤©#6B~´0úÑPPa¶ÉVd¢6jÆl¢JV++-«M²ZI[Ò[YQ¦ÌÐ @AdDõü8üúÒZ§U¾¹G]WHsÞ"zådHª2#%È õúÐú à×ùuÜßÄgõ¯"ÝV7Õ6?e¹¡ðÐØë£5hXdi½ú#.«,_Â*éiâ{ÒWÍíïBI*@<&k(}¼Ht¯MÍ#.%hkI/¤Ò²fI¯©ÓrÝw§º*(»w*R Z(íxÇÕN{Òup£&ݨ$[j]8l JÄ*ʽmî°uA}Cˬ ê##%©QM¢:ö捻*$g¸À½3ÂtBE ÁP'H¤!-EjæÜÙ+ܦl)S(ªf#.EI¤)¨¢ç÷O°h!ØÜÓ&²Ð8@#% HAdANÔUÔ£Êúø>|Çí½÷z»Õr¦7ËHdaÅÂ&ïfA=/Q
ywßv) ß#%ÖH}0!ÂÓã!ì?çîÿðûoçôü6*9Ã}âHß$Áßég/b¬5B^!Õ i >ÐüÝhFD"°¢#誨d|M×½÷ÇNV2]Q5J
:4¡x¡²¢(.QÒHMn]E>¶,xC6th/×áÉ»²Ô{hÍDhËþ8_£÷ùóÄõÒ+µA#.¬Zb¡ÿiÞ0"$qÝ»1ñ;£n²èÓxIx5S²ù2ûõ#.Ou *}À©9,Ê1üKûEåè')®Á²#% ÈB £Hì¶0º=IÐøõþÚ;B³q@li8"d3¿!û±Üx#.ARúì:ýØp´xÔ
$¶¯SÓÖû·¿'Cµ¥ß£sì¡ßlQñ»aúpð:rS²^uÍzë³ÃéÊdT$Ö`ý²À >·D=ÕN3%c£xIîÝøµÏʼiÄ=ÏI#.-3}ûüÉr¯ÏõÉÀÃÄ#%ÿ4vvu#%ÍNvº÷n¼BqY¼ê
(lÊSiLúÚ¥Äcí&b3ãOx±»#.k#6P2C+´ãLjAçXô9¢pªq¯ïf÷³®zçíblS¡-§Úá&+íXRka\¹ÙrÇ`X#% ⢡ë ò£À;x¦h}§6uò:«1[w~ÿòÑ ³?Ä7¯(iHPjÊj¨¨4£QPuQöt?_ïbɱù*îíw(QaDçéýM ªEbyf:öõ¯ìôeÕË8C8èPX{il[ÍI~#6!OLcì¾@#9OÓçVvÐøX79° #¡@úA¢V/5MP40#.»Bgð¸k7ÿß^×ο}Ò¯Êùñ(=côôþÁ~'¢!ÈD£v^ÿ#6îóÊ@²²ZÐXzñÍ}fT°Þ.Rá>çæÞ¤SÚ¶8ècs(:óÁ¿>z ,>cº¸½¾1Þt*U¶¼G¡ÔLc3úZo¥î«ÂÁÞµÑáè㥷;WeÓÇc¶¹åpçqF;jÌt,½ÇÙ¤mÖÙ*a\£·¶|kµÐ/ç¦ÅоÍh¯ËDP$S¡x7ãm£"ä[lmp`¯h8xÁÁ}7:Ù×líA¦ÕÃÃ|v#6õw;60ný1ljmß>øµ;QcµnÊ$[9µÚ5)ÜQaH$ì£h8âæfÏ{xÅlÔÝ.£Á°_+À£ÐÑðøbsaצóëÇ#%YbdSÎdÆ#.pûs{¼Il0ÜûÙR&ÌêAÇ#6ñÿBHjëP¹A골)HTøL3#%!+R¨Ï¢VAH©JÙêÄcv>8}¥hà÷·2Ö|ÊöçÛ!¿#%ùì÷;vÀ+
Ã"x%õéÑ×Ûc@¤«x@¥Ñ ºï¡8`Ŷoê¡ùÁS'+ä9Ùýâ6*êvòñ¹lØ6×ÆÛywPõ¤/ÊfïWÇ ¬ï¡ëµ#.W#Ãòú¾ ædôn;vêÝFl[Ú ÷w6%9ªMÛpZód½òK[?i`ë¿WúXAÔÓ}{n#.˹ÏeAÇ=ÎB:£ îÎhá#¯$ïR¥"Ã!ÙÙã>|÷É8f#.(¤SôܾöÒcC|¸á6RGdõLÅõý}ô=H )G¯÷&r 0Áôzs:ñwdêßË-㡧"Ö$3!~I$ß¿Ð4!#(í¿ Ó]àôöklÑü1v.ÂsϺ&®]Cj¤Jöm7ÊöÚ´õúAôöh)(r¡ÊVTu©£Ý55#hý~=Yäk©"N(Dï·Ká%OÔLzJ"À^q\øëÑX0¸°&ÃaÅ?Õ³hFE5|øeëëܼó¨_ ë'_·&µîP5' ;ûè`õVSªS¼ª*·Us²43d¶º\ÙIÝ]MÆÚ[]¾TR5 ²0¹`¨ÈX¬%JB¡i)¹d¥ÖpìnæDp¹f²áݳ ²XÒÄé½Vùµôh´55f¬ÊE$M¯ê ï!åÄ£c#6låÑ1¥gkÏ~ÓcíÝèginÿu[ÇPüúᤠ×#6Ê´é+¥dÖm¿JâÐÂO}gº#%¨#%ÆÙCÜ#6tü¥È|lûäðv+ªÁÂ"®Ý ÙS)D¨ìr«4óI£#gm±°æ´Sà¨P©Í×pã²µma·Ø¢ÏÎumwñ`W¹ ¤vëC0Ù_·«#%b n*F¢[föUÃÛ¦¸í<¶ÞNHONù'ùîHÙ¥#6¬
#.¬meQFªd°QB$J`ÈÓD©*X²R A¡iPbB>&í'5mÌSÀaõP#.3¼ù«¯Uõ_\ÊÆnëµXÚIét÷ÄAÓ¹jrir%§Ã^[õpÉ!1ßй×ÑXZÚ§TÙóYüÕfǦ³¶Kò`^üBþ:â"^%GPß:D×-nóD¿\iKÛ6ªª§£Ú!ÚE$H#%;±Ä+¦ûãÛþ:ÁÙ(gëw'`v2OA¸ºÚ¡bb$(cÕ¨Bô6HÐçªõ&:åÁ[ýBðn6LÙY¢&oáoÃa gZæ4ÅS$.vøü}^Gwxù?LD(:íÔlÚ£Ø|û»^ys*½ oèoè¡ýþ{o´Ò)4±"EÖ"ÎgÑf¯:ºJåM.î8gÕô8è$ÍI¬´e¨Ùò7Ú!ôäþF9Îòué¬ÌV°WT
vg÷ÙîN^»Þ×·t) Õc=#j7®çkÏgÔKm&ðßÌåܹÁ5.SêÔÆɸk4JApN:l§eÏÛÆm2LÆ?¯]°ËYØ¡¶¯Áª¤úCÝÂûªC<sLTCvêÃA ´»Ê/>!!hl5ç©\¬ÐJ\¯×¥ dHÂdê43d=BÂÁH#¢¸pK5Qz 5ÑZt%Î^EA@@È_àæ÷e{>ñ¢ ³<Ô ²Æw+¸s, "õ5#%B «Piuô+55ÁÚ4ÍÖo.Æ#*H) BFõ®¦`È`¡âÏY¥Âz¢ØÃÉj8MË!KI} A#.``(3UÀõ¶Ô&¢M·ÊêëlUj0À%Ô¥-Ù_áç;^Q=õ\¿)I#6w¬©H¹`Íöò¨Åïå|ÙF×mÐA;8ck³èÚ{Î{44 JàÉÜÕÏ}LPCæyBM±dY¾«²ábyOÄýäµý~ɹúØàÕ#.¼C"¶I<Û;úÏÕ{FÊinlü~}|ßáñBûÅÉ{øºF¾ dìàÉ#6çîà±!!1134ã¹c÷t³Ê'HC
-&Å#6°ªhvÏWqþDÈAèªt@QÙÃÇD¹Ö [!äåRÉÒs'tÃ-T#%g£èé*ªÒYKt¥ÅF"(«UV#6Ñ0&(÷&T¼Ç0}zO²Qj#Æ%
N¼±¤n²(VMBòÑsýì¬ãb¨LcC@! .¤ð¥t1'?]& Õã¶ØÀÀ¨i®(D÷¨æçÌâõy¤Z¬Ý*BèÀ½ej·Mdø¨Fí¢FtHFØÑ}ÃZ0À"'¦?ÑâÊõhØÒ;ðdYC*Ï;C¿ P
Ct_ À#%2Nÿµª©°¢dÔÔH<ü%ÝqHMÝI\uª´ßßÎ äLĦæêpÚMÒ<ëç#.ÚÊ8ôã%fLQÇ&ÑÅ\*
å01ñxaj ;ùª{è<(
pÑ®=¬¢ÿHy!wD0íµÞÇÔAc&´²b£¤Ø.5sSIý1ôj2¶EH¢¥·ÆÏ,k¬Õ=ÍñÚÍÍ2äÁE¸¨(ʽ :¡9Zkµ©´öO<שMFØÚË!Lc`0Ò3s@ï}Y÷N#6late<pÖ0÷J"DzØØÓßyCr6±Ë#%=l+§j¹0jÒOþ¯|×f>-=q¦ûÊß:Û¿עó1Èø¹¨õ ^¼P\aa£Oö¶³r@^õéu4¨ãº} xÚc4uÆÙàâ×Xgds°;îæ"ÆÖ,_ãMþºláÇtï¡ÛKV¬7LÅ¡8 9À²T(5TH ¨p_;K¦ùeÉYJ9-Uà AìXÛIò.#.áï#bìlÃIm£õU±ØdáA´Ã)jѹ ÒMF
Ý4m¦¤j!6I&ͳ¦&1>ì!áÞ¦°ãm.[¼R>Ø]Ã]+ÙÒí.ì]¥ñéx·´®jñaJ¥-#.ÐÑÇ#6%±dAafÂÈ[&fVî£ãøIå.Û¹ðÇ9ÝMLÍ5#Ô#|¼[AÚæèu_kØAÆ:QB3³eÀÔ/ð°ÎÊF ws+¡-+¬pä.QS&h%mKOÖ¨fö¬¾Ò·ñßÝä:yGÈ`ÓÂ$F
½"»|hÙàP;#.aHêÅ4¦K_kà@Çip[66y3÷óxpBÿFýfÔLâ[6ãknk׫®TãÝ¥¹ÊÊÎúNº¬Ó 2I+FÂmáØÙkå>)4+.b$馬ú¨Ë¶?m
ÃS>^O¹ðã³*0üÉÍhæ'£~;j0æÕº5-Nîe¶F¯Á³9HßGIÚÉr,=ä°4!{nî8nØýÐëÙë ~Æí:gg¿Ð`È-@Tùÿ/¯Þ?D/«¹ÕíاÁB °!D±¡DÐEÏ% #.&3í÷RÖâ6æ¦÷0Ü Éu*:hë$ÌM4h@I&
M/WX(,¹§fh#6l°#%ÌSÎ`°£X n¦yÓzÚ¹©i¥RJùkïVr2L7käÜrE¤¼Ö¦EÇRJðÉ·ÂwXU:½c7ãweûÚ(AÓ×Lo®ÜXçû¡¸×-=®1&òXËÙL9É! Ù}Á¹IǾä\y$þÉW¦G~ÃE4ªm©ëS_ÉþßÌ G®#%£sºvYBog?~ËA%*j×Ú¹âÛ,#6ѵ¨¶¼TjæÕ¶5¨ÖÕÍmͶ-V6«¥¥ÖévCÙç.'Q÷¸ÁE5bõG9;#.¶ïY4¥(ö±Ô÷u;k®Û+¦¤ùï4Ö¿D4$S&e3JÓ,É)I¦)5E¤ÍAúΤÂZÒ1Q4Ô¡"P¢´±¯~Ü¡ZLY%[4)4ÌhEQCM½ÝDFÒY)¤PÃT%¢Ò£EL¦FhÆL¦)¬TÊ&%!MA¨ÌA¦LÚcH` 4ÑÜS¹&óg¶§äe/è#6b|[|X&Aï~lU_SBÝ×ÇøfÌþ¢;708ëY!,Ìm¯ÒfvòúsÁ©Ù9`ÄÞ¬ü8Î#.©4czKÖãj\ 0¬Î]iÙ¼¼Ú(5÷ÐzàmÚn.Ö¨,mDñs0³¥xÂxâN;Z-_ßK¡# ý}úYJÒ»0te^ÎÝfw~âÅçãîùA{*ÂïÃñbm°Çªd©
ïúûZø^Ûo³_bc5 £#f²V*(i`!Faå³><9ôí0ݽò¬X #6"tXaÛô3³ÙyèNUMæçaëÔYbÂ+ÏNbC4®}û0_ê®[ç/c´yOÀôW¿¼}#êk#6xn4ëOåûÒ3Ï=GQáíPê+|ÎàÉ ÒV_£ãfåÄw&}z^Ë p{"r>Mõ£ÓG]eUY´#.q¨ E)¢AT$/rdÇ¥oKý}eÂGÝ2û¶ÛùåßXÇÆiKôô£¬Ê%x4ûmÁ÷cÇ$I*#1â8-¹¬-ߣ¼8ó#+ígÇö£dÎCìÖ÷µ« ªIm¦úõöÃ{N¹`g"âPR¨EΨ¸)µxãcB?+ç#6cguVÖˬ!çE®PÓ#6Ú+G0Âè'#66[ïG8 ápI5ö,nm_&·ÉÔè2
òí¶£·WÂc.[õ"^7L³§<1YCu-Í4î'¼Ñ¯$º41²Úîg ®Ä©OSååä½ðæ^R°öAèO?M"
CòqôÂdìNIÈDBª´ÊxK'²Ùª ÕµÞ¢gd6Eõ)×FÛÀ¹m¹¼2ÙIb=OiÑ·,(Õ5X@ý\µê{w÷7g FÊHCï:ڷשÔ'®½]Æðëì±õz¼ Ãíúëïúv¢B¤xà÷Ç}IÁ\³Âw¢âvÏ·§ÓæÖ_¯¥ø? ç§ÐªX@w Üóß5Ìííá#6áí)~¿.wðzàDà ¢nGkBkjl8ògâm»]%};àf.äIG^fPså3 jÓ5'B;Cq¬ #6;ë<rÝ &\?#EC8(p+x#.jÝ_âN®ú9pÜh>?/æåüÛ>é5ú³0ù²Yþ¥7Q6È£ö0¦Ä¦aiªF»ÔÎEL¢Ö¡Âu§÷5Ú30ÞW>ØÙÓ©ê<Ô4̵¶Í<¼ØÍ3©t,Åq4hÔQSRJbã5¬D(E
Æð¶ÒçVLÂWUÞŵ¬ æß´¥(%©ñ?ÕKľ$.¥âÃ1^{¶S{ÛeóL:Ø"a*cóuo\ a\MLËhz²IÆ´lÆV#6¶Â'¿S³;Ùï¬îç;WGÚv Òá8acgµ9t!éî^Ñ´åd»Ìê5+6É5#.ÂÉ,0&àbÛNJÒ:¤é°~g]øì`ɽ/Ü,7#6ÁR[Ì&*_¨ÊÐõ¡êìí§4ÍTo#.ª?02!ðnÐ6#.ÂΩª²æÑóÄï4Á&:ÏJFìÀ9]Ѥ]Ò¬ua®y:0jæó2w67¶LªL¹$ôgç}õ´n£ð@ußpBí
´ñÖ=,æYí?9@ôÓRP±áɬ@ºZßlAsø;oNñ©¦«¬qbÐ×gÉÙã6ô¯fl-&¢<ºF!ÏOB|VvÌïDDÆÇr¯/,¸Úz"VnöÍfrg£ÑñSëqHÎ:Óº¶6´=V_è-³eßÇ®ÚƱãæ·mO¸è¢õ¸t¤÷)0eÔj§=1åÎØÐàF§1ÜWVÕ£i7îæ)¬Rãw¾_<ã0Ý®È^ÏPÜd>ÃÜllg:ûà5Úã%¬GQÄî²a
3§¦è:Ó;1¢dÆ9°Ç¡n5´£Í']ºßÊßQt×\PÄ##.'yJX5Ñ\FÖ¸2L/Fò.ZX]ÔG¡(¸jS}5#6jåVͶã]*ïXTäðóqdßûªÚöFSBcÕ\llÏ^sÇ9*Në¡Ü,ß]ÌöO,ºK+çThu¿(vÎ[=e´Æ¹CAibuS"q0V^£ Zk¿kO+gX]°ÎNe6¼_y#nuÁÕÎk¦©Éct9)¯Y6ª9àZnl8\e¢±¿#¿A#M|fS®±*CP7ðvB¦EVöU;"áÖX.\[DY\('¹Ä>;Öï8óghh:yYzä×&YNÚ0,¶iQ!³é¥ØXlhÍÍÌpÑÓNVNÚ]#. ºÑH.q¼Å:¦ÌRIFÈ¡bÓ<P¹ÔÂÀµ)>Û4=¸ÍÃ#6Y¬ÛëEÎ&)Ä+æaõÆ0[3A@¡®bXßQÝëí*1¤X1qIN~.2ߩݨÛháÛá£Ô7á) ¬neïpOVêÑÙRQ9B&PÆ7ÊsiõncºÍ7Ûu³U·6vublâÂçìwÛsðüa½evâæfcy5Ù9ݬe|[Èu`z§ÛL>8¦²·¹O/¦ÅR=:%)Ç:Ó{¸ÜÖZÍQëF72Ìf2û"t[¸LLLb|¾ZÏÔáFcêEæðó8S7G´ÖQ²´ÓgórâÊܨ;ç¿©Ç1£W· i©#\Z%±pð²ÌÝUX6嵡s2úBº9H4qÆ:jn¬21ÉO)&PmVÌâë\[lÖfõ5,yULbÇ0vB ¢&¨©ÒªC¤r# SH^éi!°Ó×ÆÊ»I>ívÃ8YÙªüµWa²EZN©ØÏ+aì'gj0²ÕUÎâìrÓÖ*L¾#6$§Ê 3vðä{Á¨·É"aNû+â(0àe#6Bu öóRô`h©µÃpPI©,#. fFèã#6ëÚ°äÚ¸c¸M©_{RÆ£eé\½1åf2åR;ÎZ©a®f%ñÂb"âzÿºïÍ·9V¶ßé2#.¾¦¡#º@DE»ÎuBI@aàÞÔs¯#]Öhè Ph}èuz1Uõç tÍ®NzzOQ(¶Twqh÷Ä঴üÄõRù` »pZPLÒ;Ì7CN]"ÌÍäü#6.s׫ZÃ4ý½Ø'»õâÎ Ñä^île,Tm®t ìSR3@±0îÃt¬y\)&#.:b8ô!ËK@õ´]NÍc4ÜÓ@rÖà²e53Al2ÈbiA-µRrîvÖºS%#6#¥ÍÜ ¶ói"2ÐÀ
°õ3SdÂÅtvNI-"ÚS#.ó['£2ä`éRqfàd5eëRª#.XsL%q®i¶L§¤n2éÍc*±<.Gâ(N¶çc²¥i¶m£¦TéÂ&pL*[#%X*tvmÀåÈB$I3¥/ObYÚD³»w\ñ#.»dÃíxå/ºï#.Ó\lÜêÎ#6eÊ47Uç3}Ç/ÒÙlpNZÖ)£¢Ájx#u±¡öMXNRÎÒ¬³Î ÔÁ|`5`pËî¸è²3Pòàf8¬&7PÐÖÆn°Öj;Ã'CS
_¿&ÓPiIÛ+]#%ODö®÷Â,zÜÎùèe̲¤9i 7R#6tÈðS0@e°usÇùM×#6KÕ5BE¥!UAIHX.Ëb004ÚÏêÀób;àG±.NâÑÔGIF1T*©ÒNï_»;QwWm3oüòÊA8ÐTX$GaJt®ÞÁ`g£é®á N ¡}[aY¢¹I°êÒB5RÙÂ[#%l8Øq+CûÈ¡¢#.F+2fisÄØÜ l³3YÅÖ¸©Hu#.ÍîÌIawmw#6nòaæqÁÊWÃ;ÂeUô88JD61C#%CGfú1ÃgÆ$±ÆNØÃɵ#.fåî äi q¥º£ Ã0é#.(à hLÉåJII4dpjìËrÁ·i3fÕ̺ÇEÐÙ9Fm0²jJG8ÒgtÓ^Rg~V@.·uXiØl4I%ÝlK9Ã00¡Ü[Xn&uA#%0IF ÄúÈ%#6¯qCÿ$R5Á@w³;ÀiSh¦²
Ê#â1Aÿ6¾*?g|z( íW¹ *I"H#$d#%|jÇØ?´È3$ä@q:áÔ:7H¤ýhuF¤@&È4¨±TC8Ì î#%»-=Ùk<÷º~¸X$*vʪL>ô ÷ó¼JÓhiÁ×/Ô'س7®RÆM߬·YEr,;Bó®_}®P«4ó¸ëá&A±´Æ\©s'M.áiR¸k5
ÜÖBh7nÂ20+aÀ7èu%¶exnX!ÑÕöõ#%c=¤×Àæ^çõµ§4pu\0RÈpBÿev#6h"J¨ÔËkñ¦[m&òRjµ*ÕáPÙR² q¶X¡1H_§D#.o=#6JAµµÍBp5ã¡\¡íö÷¬C$;×á8·SoWÇ4íUú*#%nùnR6._¡SWwUÙn»³.nºn¨-sd¯å¯5<¿Fîȵ¾*ä}î³ÓÁAáÖ<`P¡ý÷©¬ÙLv*ôrð8«#6#%|(u/¼qz0g-Z"½(à{̸°'ìò@7>GÔ»ìo?6©2.þ0Vè<²¾Ü?Ø|~rÚ=¹ÈFÙÙwE¹µÈM44¨ÈÀ,;Si#67 P¼oÆnF¿½µ°bhÐ1D)¦ õªS@£¦n0.ÖÒ.eÆùA2Ac¿´z¸äf$YÞÐQ#.cG÷±3þ!¬:?+xø
Ë%êá¹A.¦9FòKPí?Vþ?_¶×äUi´&RkF±£Q[FÔIDL`Í3-lXÅ|ÿZ0Pì´Oïö¸ñÒ´TîRºÔ᳧zäK¼º:Øk5vz4D+ZÂ"kÂÑÄDFÓI0#%¬D¨í #E¶V-ÄÞ âêxÝïf§PD`@Ë[ÎIß3_Ùk̹<æÑÛÕ~«Qb*H²j}J²a_x;wÙ$l[^ÖAõ4ÑLÔdÂËpçb7úN(ÒcKi"ÈF'¸Üf5jå]*¾M½KÓoB5LâÕÙ1fR@l@ÓE`+K³D#0QÆR&lc8®åB+ Ö×ËHyÂ˱JEHÐq ²@Q¶Uú©o#.ê;eK¾ü'ô(ïéz#.sddÞí¨»¼è%Ï$¡ïÏë&ðÙ»#.PÔ
HåïT¥Èõ¢®î°]Æc(i°·Ej#.^&²ÐåZHp0
8Wª.¢cc#%mÆLN¨L
uÈÍY^sŲñüÞaÅ#%ò=§wKbm´lc+A)aLDHÀÆ-°5Iq0]i>â k
@ /_¢Àm!* I,Ëñ ݼ;âdç¬D©_&,ŠúMõÊ6Áý{8QÌ`o¨¹U¹¾NJÚ## qöe]²gÞRrE0;>Ç/¼Ú#Ú:í¦Æ>µîÅÇmcz"4ïU#.è§2]õÈl0ÒjøáiiZµ}køw3FC®zª¶i!KábÇgØÌ:'5bCèVmÓc{^ZÖH8 ÉË¿+#%Ó¾æÖZøAËIÃ4Áùz¶^ym£Á¬ÂÉ'Gi±êØá9E$åP«%* ÀUeYNÜBº1B)#6×6¦Ô9sypYµ.ÝUfylM¥çx¸kÈDÔëi¦lïÊ]ôÁúÑ ¡C|ÐÁÅF1#6hÊ7n®ÆbC#%ktE.J ÔDbTJ¨ Q$Ø£J#.L@Àc¤#%-P$PRÄ[¼ t`luqlg¨LÍ#6Ð?Æ@ ®åB<5í¨;+Æ>ER+ýÜÉz¹M8¤Qb{(=Gø+t Ãï ~L>±ÿWTª/¢ÒkºÓÏó<1G¦A¢|A]fsÕ10#!ëGú"dFHÅ"½«bƨÚɶ¬ZÚM« "BCÒ÷©5Ï?=xT\½KJåÈû ó[ʾ§ôÀikE/³âk|t¶u+W
þ n.¬
¨ê¬ÞÔrØr$®E#.{:iÃYÞ%leäʵS0:2¥KYk8ißjÓm&ìÙ&èdñv5-zÔbºSc³AÎ##6pHÒ.KÄÓƶð¤¶Ê>-ÌÞIS1d¼ÔèËÍ<»SâKÛ¦3Û$iÈ3̸jMÙsyô@#Dmãü¼ÕÁ(Ñíju¾N&Hmr¦=fÎþWÑÇàËNÔë5ÀÈå˵ÝÀÆi>Sæ)1jnÀI®$ÌÜC#:¨y>ÖÞ*¨i½ðyXÛzMp\ÎJù}e)ãï3Ã&=¾¢¸É&B°âðÇ"í75¬´ÝÎ+c¤ØàdÌrpQ©»M=íW0arr1Æ@Æõ«t¥XEDLXÄ%ѵeÌôö²ÒBÌ´¼ËôÖkUã\§©ê^y^¦¶¼¼âƺÜÛiÖíª ,ÜÔsK¡B4ªä!_ÁhRM¢:«#ÿRDõìͤDkm^|ÝÅUÚì"hI°1<¥jÆY*dÂK èí0]#6»jí&°nÝuÝÅ&ñ\µëµÉ§®ó*òlLi[©Ãc]¦£hÒT¼e?äÐÉHÃ
(¦Ñ³R¤me-¦U$
f±¶5¦¤S5ÔµÒ´²5¥SUF6¾^xMEª*fVÐlÒT7öy¼túccQÕ©£â`IPÀ¡Q6@bQQP´X!º+çÚD='qí°z³Äõ.kÓWéaKÞ9S@Ð×î6ýy´O;Øngq ¾ Oz³,§EÀËÂqhöëÏKS-Àº#%DFßÝOXÅ¥*jXÃɪÓm'ÓO#»;ÎLÀMÉÞ¦l1JSí"[ÕKR¥U(ÑJ01!¤Uý¨¦Ða#%¨Çj#%¨)"ìØn¢¶Í¸eµsÆòèéf´Í:ð²ÿfÂs©÷ pÝ#%H
5¦µ.Gf`#6 ò®µ2ñÞ eRD£T5ïÓ×ûûyk#.æñ#.ãÀÇ=AõÕê4\¸Twíé©Øm?2s¦O^ßnõU\«#%rãÑâuJÿo¢Æé%òÅ´AS¶(L!¯$yB`w?6Èl¨íx3Ýb
ÍÁL8o\årEÎD¹S¤,`&Q¶7ühÄ´t{Î+Áon/1~»bµxÙ#%à.jßÞ¡ö ~É0Tªþ¯æƹ¾óíèlodð8YGçÙ|fQ¯ãûô0*mùʨ< h%µj6¢ùýÕ²Eâì(eQMÍmr,¡¬ÞûµkM¥c)m&Ê6-")¦Y,¦JUÅ,µgå]aM«)lÚ1&ÑFÚ¦µMÓ+"µ+ºéµ }í®Öí^Ý»*b(2#6em¥)IkjhÆ¥Wµó¹Æ¯~íl-cd¶¶ÙHen]ihÒeRMKmçáM´Úl¡3#6°ÛilÚMìêKlcãnÍó«¯;R2hkêÍRWë5x®ØĪÂFÛÂk±Ë[L7ô®ßõLUq¼ó¾TÔÇîRÈ´,£^?/Ëá>Ïw>Bmôs'`ÆèOeÅ3$SF¯<XqIFÎzTX@÷Äñ
ª×æmã÷_NñW{<{1MEC=#%.b¤3ª#E À$T B 6Ø£Ç^S² ¤"-³JÙ¦Ú÷mªé¶±o²³KÍÚå5soº×ª¢#6²QdFAôR*fSJl)«iJ)Ô,¢
EÖÍFÌRÓ3ÚE E¥&©Kmi¶iY5°Ò)R|Vå(-EeQ-%£(ÓJHQ¡´Û)M"jLÑ°Ó1bÄa£+eØÙ2IdhXÔ±jª#6ÙRÉT¢©Y#jQ#.¨µM!BJLX)2 ¦I¦Jj¦Øƨ²$mE,LÚ$6Ö¥ÉFÒl²¶¤Z÷Õk»VÒ²ÛM¤²ÔÞòÚ×M6µ)ª²V¯f¯6{*¹zÍV-¶RÁmFÕ¤J*mm£ZúáÖÞcí³^ù6g]! n5Æx§{á·ç5ª÷è`fþÆpbÉzì7ùWkN-ÝðÞW ¸îmE<³¤!à#%¤yFäoDz¥ª$>Xqå×⢵åE÷Äô^éèøì\$1gÁÚa>®ìk£g]7bÙ 3meÌz4º:¶.L@ݤ¡áÈ"¥+´Ä»/ö7ñ_K3ü½©=Úßn9=½C#6?q°Å@P \cha!¼ )Ìæ]28ÐÆࡪ (ÁW_@pÄ$ûŽ -θ>õÒlÕsuæ°ÙåÈ)P;+ôø :ólPùÀ.3ôÑ¿I÷¾×ÅLFz%;8ã»m§f¸ñ¼õЫ´Ô¬ovÄÅ.yËg ØPÝM±"Ê~¤}þ
b\åö2eÏàØ¥WCó|såÇéл\Lu#68TóT>µKîªtJZ~ÙVêøPvÙÂíͳÏHdÖ°éè#ÅÄØÚ =õ øs«~OØõl£qGFù¬Öû#6¤Èƺjµ¤7Ò6Wi0½«#._Èé}/[onÓ @òî#%#%lj¨Ê²N"Q@R+¥rÔ'8#6Èo(Õà "2! ÖDëê¥Ñxíb¹Õu^¬U°=³¾_vóÒ
Xdé[&ya&\TCA¸!$*¨c#.ª SLÖ`O¼I.!&*x³VÏz§@â]7ù=ý«¨á×èv#.çWµ±ç]{|)LcÜÃPó fÛÊÖs²D\OúÙÀ«Îx
#6((S)øbî#úÛËRdA]%Ù@ÿgìºùaZÞåe±F6ÐÊÊHFæª&cD2L#l#6Ðh{ÄC5U.mÈÁ¶ÄH)fáu'6ÑÆ¡±ÅXVFA4^Z®¨ÆÎjv©g6& b S´·»RÅF[¢ÃK#6ª@Q®IL*cð¨Râ¿JT#.t#%6:^ôtqsèÕ(ñQ jÔÎQ§×hXÔz´A;Pl|߶¨4"ÑJÔL©ªhJ¸XÌîÁò`8ŤMýà5çñæk±°÷§ÁÜæ" k;CXxj/zø/#£Pì|
4ÉL`ZhÚ-AXAKëíÚÛ[EìÔ×9b$>#%ý0¸ Ìèª=V.ná·kmÿ>sê ý¹gźÆS®i{HÔ·t0Jc*ßÁ$çL¼·Z«ùß$!þ$ëÚwËI;àtnl øÇ-i¥!I¡#.njßRY²VTÊÁ[õððl
c0¶õ«ìXlA4(Fë¹ËÈ/n÷OdçèÊô½teú&YùA16ºa2e8 ÔÁõQv!h+åËbêÅó¿r@Ã
/¥)Æ®)iQÒÆâO±¹9&íBø>ÿ|Ép©*ÚYKmji!´:I$mDVCCpP±Èc&P1èó´âÚs½s¯gÙ².Û!H #6áPªR3ÂxQȵßxÇ¥cQ¢Á:÷Tshiß5¶JÆKF¤ÉÃ'3ÔGÃyÍãsKMûé:]û`ª§ ÃÂ2UKÕJâòÌ«ÏZ§N7~R±î(: @"¡ÌȡⶶQfíf´ÄÒiDÓ´ThA´~ù~ÿNè>èëTPåúÇQpº¢óGÇpó ¥CaFE<Q#%,2ªä°®Gíâ&±û¼á9Ťð;õ1A¾¼uÈh)¹¢`ÛkNÑD=ó§#.ùüq ¹[tcv¦¢â#.iÉÆLjÆD.Ã1ìÆVí¡¶&q±"J5Òë`Ì/¸:¯lF#6¾R¯OQz#%ñ=;NÝÖo+fy*wйçF|û Å"TX¥BSM4
DB ¥×*¯rïJZÀeE¤É@òrÎf§PÜ\/èÆQø#%»¶(tWx.ǨÚP QÕ¤BÉUN#("»ðX¨2#%LâFM`'°fT(#.à2pâ§.=ZpË×v3{×raY &&´Ú²4î¤G]:\clç¹¾,u/Ëß xµî¹anGÇå¬$46×PÁDùkIt¼îÂ2v¹ÍÄÀ+¹,Òçu ñ<xϹ½eäm "#%$lá`Ü1R ü{n×z¨¢3D¦ë2Ó#.äÅêí¤¯dòêß¹nh/!Ý]ñåîî¶Øné-ü:»+~A8uëÈN35åP«Ãp¼Cmí$/R«4²¦ÆîÁ,Ã1=;ÓPp¥'#.¾>ú UGLc0õâu{2=AÑ+½ëÜ('_¹HCX=DàmÆqzEnÆÅ$ONÃ-¥¯Ë¡e¤È#6¤ÍSY}¹YîêúÑ#6I£åíª¸%Ý£HÐÍ?]$E/]jôåå˼n¤ÛìnÈHNõæ½Z½jé%»mj©RC¤@
àmQc°^:wn) «1KÙ)y#6QÒ4lß·ºw7¥´D9;¢¾âênïÕ¢ìÑê§ëÛÄtN(Àºü5îIåÖïãrBÌ©[æq_S¾®¦Rg¿s%_Æ¥àM~%Db+)'æhwJM¬0
«ö5¯YFqtªÁÏé "ïª:ʽÕ4Ñ´L¢Z®QM4jW]6èrbK$ج[FßVäbÄVkãJ*¯KÒõ-kÆ嬳oßýþñ¶Éki¶[V½*ÝrttÊ7ĸeÀ ®h'kåг)ôãK ]¬Îe´"¶JJPÉB7&®r°2ý(-Øo)<( û7Îu¡¬²h%,3al!â ¦±hv>¹3Ù]´l4}»ÒX(¸ÐÞì½qOtT5(¿åiÀ¤(º#8+!iH@ÛaSòÕ*µVzPT*édWfTp9°ÌPð5 ëÖàtïôQìêª
¨
E#5ÝvÆÓ"£I´Ul#%&°ÝíÝ+Èt00p²Fù`Åì&á,Ü}C
pÀ×t,Våp¨CA2¬ ÛÑo¢|¸¾ÀÞï'´Pg=b,q¤ B=cik=A~x#6gLüqöÿË.×HÂà\h]IÕíø1
#%¨%æ¨&?¿dÒI¡ÏÊçÕ~¶ÔØ;Îáâ¨Ë#.ÃÀa aQúùhFÍpA24»Mjÿ-F?=+áÿûRâl~C~$4Kç^n«&ßByï(íê`=4ñ
x(«C~¿´A@TTвÏa81#6êå{ êÒB|<Luß»¤/6ìÙýðéÙÔ;Âûîpt6øSTSbGz¿Cé¿Êw.;=#%d#%RIí #6J¥*#6¡DYX@¨©PPfôlY!x¥EdBD b[3\0ù_a»ÌË÷¡ôq¸Á+£bÓIbÁNQ²Õ~«0GqÍ9e±ìSQù~ý£Ëj±DPõ$SÒÔ£C N/P¼läV_Òþ íUAd: Câ[!Üak%ªEIH®^E¿Wcâ|s¼R¨ÄÅgßêóåÅàX!`â«r'ÈàPë;OyÜbPWGçÄ>'¯¯ï`Ãæy~6×Üß=a§,»rÞtï£ÔHÄTÌI9¨¦¤¯V¾TªSRÙÍTþËÁI¦úËúPÑj,TU#6©3û®ÜSE,#6@¼I#6e,%ìZe¡Cð@ÃQ>9yñþ_¼ïÕ-6#ÆDca]ªñË<>ÙZcm¦É\ïg:F0¶ 0#BÌ £&D®¤ÍeµÄ±¡Gf4'ÔF4ÆÒqIlb-ªÍåLQX(J¶*Ef°-H#.Ôa4J@fµ@¤ ±I2ÈPµ´Ùbb$]ÌÐLïR`MS$µZLibm-äB1ç+=B`HVZM¨F`L%¥ª¤mV>Lä±¼xa¶EXVâÄÞª²¬ ÕÖAÉF¶áÃ4gJZ¢,j¨j¥0¤
'6Ñ´®è±\·6Årܾ#.ãc^»½.4<ºí¾-¹1ç4\3¨lêApÌjÓ´K&D`:3±ók0Ó,$i¾Kµbc,P¸yA®5&Ψ hÕQ.Hº5@ák[R²°ðÕ5O<#.C:Q¨6%Üe{îË]úÓN×Ò!£ Ñ uP2Ëñ»h|úim²O:4MiãÁÖÆïØøÈxÕ,#>¸Òc!I¬ÆñÛmwºòeºÍ7YºÐ«áùqüôÂ1Ó ÍÍÓ+p8ñö¼þ#.áߣ .H(ôMTØØ?9ø Ñ0À«¢¯`1 «þ8÷A%Q#FååljT²j,ªê£TIñnª0±¬QrÕ]JƬQ¶ÜÝmÓDbd@b-eAÔn*¬Z$A$TɸúÓøC )È°íDÔ@QHXÄHE¤Ç¼ð?ÙÔX#.Gê¤@ÆYÁáõ×g¿Â¬{S(±kÙæf¹!¡çò«W²®]¦Ûnºë[ÎerZOºÂ¡.TP¤IËúìÀ&#é¹ÍuÕñVã1 Ng°þ["ALàlBêPoÕTBDWáU¼ZPø¯4²mdÛÎÝJT²«æ·¯¥VòÌ¢Ù+Xl
TzÅ껪-zjö»×/]nË\Õ|×ZƯ7uY
$¶¤Õ©3Jö÷í¶ØA¦@¨¢G¶2<㥩Xý|º!ÔÑòkkE{\±È5¨p¯ÊE.I#%}3@¡ËÁ±,erIcÇQ4×´Õ0NK2#.É#%½çìè¤0#qÒòMÇnXq[l'µ}Ò@a%Ç¿¯3ËÂ74Â&iGÊ<Ø!DWbUTUðËÂ[åH=TvU Äh¸¨Z7aqP×ñ0»¹aÌ°oËuÍ>¨½ ¥ECObÈ(¿|³Mî®d=` T6qÓr.À;Q$!îa^Ò¥#.-TiKJTÕcj´×¼®ØÓUk)êWQ´E%D/åÐñ9çÙê°Ä@º5]°;c{nÑ÷µJ*ÎdBdñaöü6µñ³'¤.ÿ¤ý¾víFqp£FC²êNº3ìBKQé£4Ó]®#6¤Óý#.ËÌg8¨¼±bCÖ°¡ :ëÃPó¨êÎÉ&&42i´PËZÇ0Û#%G{ª"M18=ÉÝGÜ`Â+h}ñ¡È*Mbð]þáñOC×ÝXdI"BMçQýQ¹ì<ÏÖônå¦F^Ϻú¹!}zæ±Ë`ÉûdWß#"%54I7L0µ
°3'øþ|@å¹ÉY¶çA#6?KämÉ:®MÓûlp(¡©ÐÌÒ¸×V¹ "ÄëÔ§VlÃ@,×j°nÅF@$+ûRM6SHDÀB0 D¢¥Ø#P³N5X©Õ4O4D1öÍá=ü'§1ÀÁ55Ò¤{Û:ðeQÃýi`êñ×Kã;4Ï×ú´1$ÐÑеÊc£çF^Ó#¼ô=¥ØΤú¡©§A>iéTSíMZʸk2Pù|Tà¨ðÛÂ5¶PajJLi¶¦¶¤ØÖe5ù¥tA&2ÒÏØjܶ¦e©²-,Í`³LKlÛl6³Lµm$µJ"©µ3f«4M5M±UQli$1H³$#.GäiGåL"±£æÙ8î¸lƸÈéáü)D M´VµÔåV¢ÚÅ®¦µ®kvo^aQoѴצÕû»ËA'"vC¿¯#%#%ÛFÈD*TK[R]Kí´·µUøm~B²#ùKÐ=Q_fÚÈHEQ ÆGúZ#>ÕaõóØøá¼ådzApQÙ¸»h¥âB9¨!áOGk§!' %J¾ØÞ!¡ìNHlá`G´>ÒB zAm¨#%û¢Ü%íKtD©ìByìçxÆqä;ÏÓ×8Ï<Iµ#%CÁÕPÌżÐyzÔ´àµ!¶7$¹=É6Ý*ax2^³30xãèpþ#6XXPµÈ
p>W·ÑëU8;¡¤gê&LxÑ;QÄ7V«ZÖKè6x#6ÅéØ¡¼¸p[1v*®@â7̨·Ý£Bò8#. Ò\Ð;¤:háÜz°p!¬a#.DV#mbL¿ê¯(Ó4tì!#6°I£±
Oú;N¦ÏRbå.¡÷Ã-+?£VF0¥Vªêãì~}мáömFÂiîAÁÆQ:ïÄ#%>°Ñ#&!¦-cöðtL!/Ù¯9ãvþWà¼è¥æÔörÍù[ë9+ÁS:~râúýt&ø-tõw¼¤¦åÆåÒñL ,SÝðð4Ç]«Pø¦äºC#6(,HQXPíÇéÓ9Àóx§ï¥½#%2Oùæ&ѬHø8ÕY!D14P)#.h¤4ÉÓL*v#6HÛLMûþ¯éIJB#.üX11¾"lN9anTG§d#6ì6«Æ% `6ØÄ´wc&µi︷l¼C#.@6dÏZ«Hfh
ãëU)%E`Òc JO´'ñT¨â*cm¬hæF&(}q#%çDB ;sR; SÎTyzg?~<s/T #.\/lëã:Þo\qF(P¹¨µîâð8' ¬Jô*Æ%S ×õ-ªl;w£DÃ@äàP@4ÆB¤PEÐBÈÅPe'Î#6zx¨vi=>~¼® QÐu}Þ&`]|Ñ÷N^@ÃÕUBÅfÔUЪ`EZó}MI¢#ðGðGù$=èÞ;}%¡&ZiÁ]ä4¸¸fÇfÙ«ECn¢ÉBvP§`¾Cqh\5&+&ÉWsLjFà|Ûùfwâ{àrTPÙ#6`R#.Õ!æÊ%r)(#6a<,<Ï[ÞK:MåÊd¤.óÏ!Y;0UQT»¸Y¡õñ²"½®$D0øBR0!ÔÜD½.ØboìÀ#]Ì T`ÁѱÉ".)¢èÉdrf5Âó"^¬¿îihòÝÝ%|Á#6ÓeOuB¥´àÈ©PÚW.T²¹[#.½i?îÍL#%Ez¤#6©36¶~ôâüÞ*(Âý4Ƕ¿Í»CVnÙ=è¾»VâHfmÚ¨·aYeÖje 5VWE·[Ñ$F¥¤ÂB°NÄy3ó, /¼X¼½p 8¬§gdp¨:©´>j"ìO=H£EëeäÎh ï˧ÊgؤHÞ%?^uÝF§·ÙéV§mTS±ÄºÕ+njÜBðôÕ#6´×9ÍâBröÓ,à¾81rÂsÚU:âæìbúékÿgÖË:¼µÜ|ÖƲ:#6K%$,è`#%*¨#%ADPÐÈÒ¥h#ͨ¨In1l+p<;TÈ)í ©Ù¿Ó:þ°UyónêïæÔe³#6ÔeëÇ·VÜÞQöº1ÈßÌÕ×ë2Q#%dd!CÇBbuðE!¤G³v#6Ð($«U`ѽÀsqKòÙï Ñ£Äv\5Ê ÎÐHÒ%A#%Î|É:LòOB§¯ÆSÌN¦#64 / LdM´¼íÍr¼ó¦ëÏ5wÚëm¦ÖJI¶ÒËÇBHT*F2ÀD#6üÿ_¸÷J(-!þÚnêÖwÁrPl ´ W1¢ª`Gñúnî¿«Âb£ b´Fϸ:Ä6Ö4kR&'Ó&{_¿´)·w¶õÚV7t\-2áÖ5bB<* \KlH2Ym@¡&©ª"Ó-PÒËf{½nçØé¦{ÚG.®ÊÅz¢ç±¦&#.¼zPÕ1`W¨¬PÙ²2¸ÛO!-Ý0éàÈfÙF¢D$ #fKÀ0#.`ömZhmmèØáͳX"bͲ9PÃ(¼XmÌG0Õ.à£MËì¿Ëâ§iÅLüI!1²Éb;EP DüÀSqS¿c²vwñÄä'Ñ祥ÎUñ<þÞzªßòNuØ'úû¤ÓIáÂfÊbWGq'NÄöP!×#%ÄI¾åmøÛ^efÊdÒjØÕ)}ʾÖÚL®»U?OÇkÆÛÊæ°µ0}½ÃÞ^xÇëaÎ6<îXJ.mèÚ¦Òv¨"«Om¬Õ¨}Pr)N=\wü²Ë«(ײ|J+±±òT-ªä`UíèvÙïIð{¨óÎ!WâÛoUx$§áUýÇêYÐYy¾áa©<·ØÍn6I6=Î q.ê`Â÷ývÇ]tú¦øo¹+M`sZõQ4$n@âtÂpÅ&/m
ÇãîHF1×wë߸Æ,bÅè¬ÞBðì&Ù3°kÕ&72^A#% ·4ß¹çLÌÑL´K3Jj í>E/»ÛêÛçÌÚA!~ï,v7ÞÛ¯é#sµzø%ªì2t·Æ¶Bõ-úð*¨ð ¹FÇò,¬ðç" s^ÓÅC^´GÌñUGÝ!p6m=ßmÃÝ#6NÓ0¨^b!d%]±-Ê.ÛJZÊ0O¾^!¡ÖÂ0×bí-s¦µyäÕe´SZ·°òüXKï¾fsMÖï%ç8Tb»üè\²?}{Þ>%ËÂça8ðøqgêd;1Cð)æÁ
ªT'çd%íBnpêá·>¡¼»f>¥óèÄyKp#ÃææG³´ÕsmGyç
cQ®»·¦Û%¶Ì\U#.¡$HH0Q·KACo·UïУç»R*·µsà$.?çûõà¶KªbÓ\µ
ÅaÇY2J2ÄTX (·VyÛ¹ÖîuÞªZÛ¦Û#.1A¼A(ð ¬ ^3@¤dâÑnÀÕÁ£òðt£àyÅù¿r=÷·EI&þö01ü$Õ¥³º[Ðö"û·'Ã4|·låËMÓGÎòçQÝOgC_ù´4èÓwA0Cf±eÂEÃpÑIå¨GGè öà$ëªUèt§ÝÅÈòZ¿0óhäk>1"°Õ,W%ëFþä;ùq56z{þÎ@ @qôÙ(yCScpô_{J!0£:tª4QZ$¸ê×\×v庺ͩ¦¬¦ÛNݵu&ÄÚÛ4¶«ªØÑ\¦^.^]ÚVòµ¾l²@ Å#%C@US_BÄ«ËÚ5ê)ALjºr·S9¬¹ 5öTXlzïÀÊMu>#.3ïk¤ÁÖøûí#ÂÈÉ j÷â¿«Gí#.Ã0¾Ãnº·JYUiKí:ÍËaÛp¶<h6Ú`g5!5È0°ØzùpÕH¥²!ÍíÀuþÁë¾pS-VÞM¹dmÐL¯Üá¸6uð|#.ÊäÊÉÜ@à{&ÿ}vuÄE'sj>¦þZ2nÇË׬-å®Wâæ#%ß`+ÂÞɬí'm'·õ#.|¹_úuØÑTF#6Ì5å*oµµX~ÍóÂ\èÄgi[á4Gëk®]ä9*éitQ0#6ñ'êwÉúgúÿ§îoÛ`§ñ!(RÄæY}_bû.»áÁ5Å(,DÙéPºRð¹ßSX§%DAÀµ¶&¤?3Y{ÀZ$*Áömk_ªèzÔ.¹#mäÐl¨AAì[v,aÈ$ºvÀ¥+ã'C-®H4(an~#.ÐÅ¡´ÁëX> 7¼PÅ£ãFs¼ðEÓ£pè&¦K¨ü~iÿKn<£ª{6±gTSE_çõð¾ÌÏRI'EÔ,Ìï#.ümQºC^[ò#6Èì<¶èÝPi¥ÀûqL
ñ=Lo³#%{BhÙë Ҭܿ¶lÁs-
¯¢jgÎ0xAËÓ¥¶ßgLeXd¬b
û`Y)0(ÏQ3I!
áô®ÔùaÃý¡ø̽:ТIÅÔeÁÙ)ýÕÔ<=±®áÐÁác),·[I_òÀ3r^B8iý5³V-êWBÆCGµ÷cHgMardæ7ÝÍO1U;æf,Ý1!Èkq.ìaì£P0ëO¯võѤÈgõá§NJ±ÐèO5Ĩw¿yr²þÊçõm|µåê#%ĨÂ#%p+ÓUC'ÕG Ìñä¦j&¨ªßË ¡!ÞÀ[©#%¦B½OE«¨¶Ö+Q´Z5mdÆ©5£Y,mb¶@¢²*TEM2
Èì5WÙn¹\ê4"Ô* ARæÀá¹Uz,.ã`!i ÅòìÚp:6ßvýøg7nYÁÞúËÝ;«Üd(])5«=:C÷«7ã-\õûn}ªcâÀuÓWCÈ2ùmFmCEli î°2dS ~Õê(åíOyÖ!¤ØwF¿?´"5jùíÌ<ÁCi²RÚPl.@ä#6ê%ºéçÓ5ÊU¨ü=¹Ñ®%O×?#6\¢p`vãÇÉ@;$Ðs]_2BªPôÐöVâ¢ßÌ0`Cm¶¬×7¶Ú9FD·7|Y´&©ªVÍ,[þ}¯]tÁ(L:"W. {§¶@,ϬGüÛoÖͽ(TÐJÀÕsª¤ ó£äI/#6½y³ªîfx²&qK¨*.qß<¡¥¥LÒ®%Å#6eq}Kw4(#ÔæH ò*EZ#66°Ö-5¸éW¾`[É@DêFq#.á ̪MZ¡Pwgåõ{ö²7>Gcúìcò0Ä5µÕÔâ»×võo1kpÄ&Á|ÙôO«Y
ñ¦ãQèî>#.zÞ®ùÅ'èkj©a¨²ÐÈTÊ¥ÈläÏ$ÍíB
mÊ=·e×àY bø¿]ع`±#% ª£.êLãÅÓ?ɧtÐnòu#%NÐêØL8»1²üÁð¢zÏpÝ#.½
ÔêônêÌÇʪKq·t/Bª+5ÖkYf
2ÉUBÆÐÀù¾C®YIô ÙMIÀǵÜ$Á¨Ø:¤Â*ËuÖηL«w]¥#jff±PÑh×]uôÕ<®óõ§½æèQfðÀÆÀnBhT¬ci0xÈ`hpTZÔJÄ0`Ä28Ü«hãÕJ!ÁÑS£ ÉLkLD²üaÐ6Þ(ÚßpHìÃWÖû%°Dûo!H¤HI¬j¬¦ºUÍôMÌ6J´¥\é23Í×Y2¤
r»àd¨Å ¢#6&Û¤ 3PEÐî÷ZH ¨ÌÝZ@ë²Ä0ÂíV52 ¥l¥fSµ$e6,Û3$ÈÛe-/]Û˵riÝËrAfë®[sNݽåÍy¼ï"h¡RÔ3ùýw³Ùf¡å輸÷íï¼öÕæ"¢FJ°ë¦2Ù¬ËAÁ\µh@Ò4EÙcÄôõf1ºÔ6î#.j*Ócq¡¨ÑÈ0À×ÙUkH°[yÐ÷´IòãÁ¤óßQÆM¦Òp&äbÓ\3PÍÖúÀ4Õ½1ÎóEåêÞnÕ zÚéEF¾ÊËIµð[¤ö#6<qêTU¶ÓuÛ5!(£dbå´±#k7+®6½ª\®¦øµ]ï\÷¾¥Yâ²"°£i1yic$IÙi%ehCÑVc"sz(¤ÝT&0ÝÜD1§~/êÔaáenÃ)±²ái©Ä3aCwc®<¥j[J\Mb0s.#.ç¶ÖÆÖ¤2Eõ5ß`il(A£§£G½MÙ·¥2ATÍn¦©Ü]ÏDOµ3JiAÓ«Ê_¬Ý»8+ɳskhÁÇgjFV4Ò.#%ÖcKlÆöõTMX
,A(SæXôçzGí ºó2Ìÿ#FÜ4úf#.ndÇÕ|PÇí÷k#zLö1ÂfÝÖd6róo?v:WGÆ.5Fcmäå
tÈWÓÇ°
1¯ÝqÆM!j´M¶Vo¥Øz¦øã5 ¤§dvÎUjhÙµ#.\"ª9lT¡µ=³C#-ÃqÓéîó}&°Æ0#.7B¬¡û÷ Bì¤]¬&Áê$åÜ,eeU»cõ ¹¸GãO8a¤)¡ ä¥P4/ººëtÖ{¯5E]5fT@Ã& Â6:é `"0lU,P]§DÂQ %Ħÿ¸ tàtë=A×n¸Ø nìÁìüô³,8¤è×æ¤EþÕiqu#%T#.Pæûqb¾e4~¹(ÄHægÞ·f='³¦ÓO¾ï×q6ø¿yÃ&ÒVý?²çª+lMHÜúõCÔÞ±\öÍ#.hÅ#3ÚÚmáîÝÔÉK#{{ºNÅËÖåyºjð=y½\ÖM\l¹ÙK*̵ðòJpð÷uÐôÐïÛjØÍ-¿kÙ»£qFb!$-ÌÌۨټ讹ãÌÛF6qÇ8hPhÂ,CöºÂ7ÌÕãµCdÌqÎám#±M¥ÙBº¯¹yÐà½ë|÷3¿y!È7稺(4Q®ÛX0wù¾,h#6?äè!¸\£Êo/£÷õgg^i¹ãíÓj#.M,=6ͪë·ê³xFpSÑ4¦ì¨FÛ,~¦JôÖ±ÝrðÓ+°iá³Ýdý_>÷ÖéM¨#6îkf©l#6Ìë¡Å)êýá{Á=óùû£{ vÜé R$T@Ð# *Ì
°´%Ôl#%ú H*GåB XtL,³:jU(älFÒª®Õ`][ÖéµIµwb×r髵·6îÜÈrêñµðË%H´T©«wUÝÚ±Z¦¾+Uã[É[Iº@%rØ¡#6BKI`W(0ú6nün°££aI}ø«Jì¹X½9*ae(¡Q#P1EZÀôÉ.p»RÕ·ÓÍÆ×ZïrÐÕâ¢%&±XÑ%¨OsË}2±PBTBeEªR¤_ÂëQMZÅf&i¥E±¶5E¨¶6³+Ó5I²YLÉTÑDmLɲlklÕçjº7à¥9?ÉïÐÐ>ߺDEOjÚóÔMª+ RRËð9ì¿âÆýÝ^lxêþeËÝåEÓ¸°zÃÅ8ÓÕÝóaT9ùhì !¥ÖüíM6´ÊѾ7ѽ]Bͨûf·äV·#6µâ×OÜêêFæî¢6Ó»³®µÝ¤¥¹«Knk5]¥+ZV²½vìÖj(ÄJE¦®ÏøHf;ÙYÈIb2_l(Ñ$D@ Ä:o',ÀÕPBMÈ4p#6¡a#.§gW¶¤¡Pm+Ä4ÚÁ NκkfñÖ¶!4õ
>ûµ>ÖùñkÑ6wÄäÁí0Ϻ¼è¨
Ì]hÊ°,Ó`ûO]ÿ3]¸·7µLÌf7?,lc]ÌMBbA1H¬µ4Ýid8w&ßNÓ)Äv»Æ#.Áàu?²æñçãµì! 5éá1°<¦t2b²tÙðVþ²ðæ8ÀU;¬"ǶC}åtÈÏë|w½µ^]3aÌ8fùã=ù6´ì§Í%µ ~¹åѶ»zÊW\=ÙXÛÔZh¸Ïa°Ó(±Æmå÷<H°UýÒvЬbEÈ#6NÁÛ±=ôL~+"õÈeÛ)·È~ÏðV<0T&*ž2ÊuJÚ©X¡à÷BxQG`
×Øh -TѪKo/©ZºB2$"cü\¯IÛ\â£rh¶·{:²Ulm¨Ú¹U#U#%iy?Ò3vµÇ$eù»#%b Zü¬ßàTy/o\½Õ.@Úº[%´×]§·-lfmBÑl@Eá1Á¢#DBùRÈ8$j©À\0z¦Fü¡¸ á[oZµ¾[[fIlm\ÓX¾>Ù*¼î«Ë¼UÚDFÒæ»É×>µ¹éwWÙãKÁhã*7j*A#6´¶³V¥(1Ä*ÛAÍXU¬!R#. aS#6$DQ#6#6Æ,ÊXI
vUïDdÐÂ%¢¤äÄã0õázâhÌ RLcAA¬T#.9?³¿Ïïç*®·(øhyÒ]aöàsÖÐa`ªsêpÄ%X¬gÕ3n#.Ç#.³ÈÂêH9F1ÖKQ·níùîÑÛÌmµ¶¾©kU~[Â` #.Ä;@¸â@HnüÝ¡ã¦Qð!¼*ï'æ£[£Cõmþè¡/C ;¡ø&©òƽqj¯ù#%AD^G9ÐÀÓz*J#.¬¤,XcÍ#6Ç+Ìf¡z#%fθåC8>yóvoÖ¢J¹ÛïFØØé8ê¦bCDÐ#%ÅE7áÃGÐ*¨á%ÎÞÇ¢tºÄ÷Å4Èn#6½¡1*ÃM63âqMí!ý!ȵ¥ð¨W¬|TaøµX#»#hLCZ¢«xbi(6³±t\°èYl
EX#%$p4b9&K`È°y~5D¼_¼ #%¡ô^3Äê;HÓ× XïYU[ï"zGEMpùCݶÍêÑ|J§NqÂIß.k6#.éï?XC߶ óð&©UMÛWJ(Õ]Ûeº»±¿ºÄB¬%ò\;é(B¢ÔÈîLgÇõÙüÞôÛWÎôNÝWu\v¶Âegd!QòBt?g>YAh7vgyÝ\º2å«uÝâòÜËÍÅfË"i$l&Ê£ÆÛ´Û&S60xÜMæÜ®UÍÜw^vo.Üu×l£ÝÛ¤W/ñäª9¦Ëy<Ëurîk2ÆnójhÈó¶Úæå®VKhԥη)³,'ÝÝݧ5wft×$RÑáÊ»eγQhÑÊÔX¥"µDh´m ¹¸#6XTbzàvAØCH#%ömõoÊ´;TÄ< 8#%îGû;¾#P ¡A;XalExýª*oN¨xþÉÂ{S´pAÀúJA¸!áE ±#%ãêw'¬+Ó}Ïu¯¥hÂ%öz3ï
#6ËïÜ´æm:Ïr#%r"1 ÌÒùíêæÛVükZæ+kº¬ÿ¤¹gú£ #6Æ#%Îî6S!5²jÅjÐ¥¡·½5{Ì|1À P÷A!µ%AbÄBVçjuÝÔ²±c#.ݵêZðc^úªli¤#.÷5w!,8*àNßD l&PtI¨ÅiéÓ&I#.½Ö|ý·\{úµ¯UÑæÝÛ½(ÒDH"^b#6#.)k`ETb¤"M(0'ñn\ÄÈ)OVuç#6'÷ð=øØ 1HAcQAûj=Ôáa3¼D#%;" TÒÍÖiµJ¢¶fËMô¡!·/¤¸Y@sÑV2#Í©ZdÍQ¶Ú
DüÏ&1½#.@ §ËHH"Zf0ÚÿmFkB¦km
Ë7ÉLÍv¦vÓÆk±_T,£T ÂÊ$6#%þDûOPp%*¼CrW¿ªúÖó6óô÷}w~¢|ïd`B2¿¦gËñê´Cå#%aaÌHôÿ¹X4)RkU»M¶ ÈfÈOÆÑv`iñÎlDHI'2's¤Ñõ¡²y?Àáýb@cÈoSÑ5·câX¢^ü-ëpqûZÇ#%ÄÄ#.IÇY%¢iQ8ð$MÊ$4ªB£Q!.pK#.dÔþÕâòºmsWI*å^ï&ÅÄ*6VjBTBW@#6Ö#.c0LK½à1åËBá-$ok#%´Â "JM!hKEÌ©#~Nͪð»/8Áo:¶f¾$öû^à쪰pÐÖ 331(Ä`m¥ÁØx]âO,½).àdË0L\Ò²u"Áb
0«ÔÁh BXT°²+"¢7*© H4uÍit52LòêUÖRnݸ6Âhüt#ùÓw2¢H×`ôÂò*ù{Ntp~m£fE
DAÙ`=aPP¬&i»PE±*Ð#6E#KT-ѺZÆ^v0ù lûa£ïÄ$µb ÉS¯t·\ªvݪÊ[§.ê¾»mµõR¶¿¶×ºØ+ìfMı f#.¨-RHE9À³ÐÂѹÑxOd#.Áyþg2Å>?åDÚñçì[Ýa3FÖAÊR±1m6¥ÒqÏ#.¾r¯©×PäqPì4`!ÄFÁDm6¬¶òÉc$¦ÖcÁ¨ñ©ÛvHEJèG+ú2LÌRØ&Ç.-S9;7¶£´3P´¹-2µ}¦ÓòxPëצè!àDûOË[m4;CìAÓA?{@~¨ìFêøÊ;gèª#. #°êÞ#6&àÍdT#%¤O]#.0UXû%Hð+Qè¨÷#6'dÑg"æØ;¾#%âßh§#%6ÕáüÓ#.¶ö!þ]ßzLÉ¿¿¯¥$ÑHX*fO'Æ"°[>PAÍ#%GÉQMAû={}á§vY¬¯ÑõÖ)Ñu©A_°d FÛϲ½¿c[Ü%oEÓ,y÷¢J2&óotÜÖ;¤¼6^o´uçA(77ü) µ¶÷Y
ÄLxl+Û¨SÃù5ä4wòò$;8SVâT:<t(ñHȪ',ð³RÚÒâRgpo¤ÂÉ2"ZBÇË0/xã~æŸÇTCîûÖþIõh&"´#6béC;¾¯3¯«ÚÉÖÙ>úWûc~ÓÊqÖ'lcØÆö·0´U>L#»²8US3H¸¨wâ® B?ïkzþú&)¸Em[p´!oqÎJÐYÅ{ÙL7£LÁA¸¦ÓV0>²BG.#ÄDDJª® )æM+I¦Ík¥¦=i4b¦sì'4³>é}2ksá²HÎó|DaXéwkÎú}e°&f´RÚyiÚÎóKÛù=iæÙ°y/âu+`Çxö$ÝÀû0}]ÐJ3ñdáË-^Ýø϶Û9@Ѽ#.3]7üºÊê@óÀ¶ñXTÕ¬Fôõ{¹ë²Q
2fqLd¦ñ!»o³! ÄtÞ8<µçÂôÈ6c8Cg¥B~óQMãøÙKºËù®ÇCmª¹"9n¨¢H´<J#Öر#%×1Mn ¥ÊéÝÔxaöOÚÖNÿuQá´ÿb¨Ìñz` 74*¨9N¾tÌ Sõz¡Ö
Ë8 zJãì;EøxW´±3Cd¦6JöHå¼Òa¯`&C! íó<µ,]IZðÇáÒß:}P#6f27¢ TÍ6Eún§m¯FØØáOum×êoÙºSV#6ÌÔýìÞ×éÀÔ¶I&³#ø}3 lýCÖå¿YãµÏ]Ú6·©d·jsÝ
M)gV\ÕÛÒÕÞ,¯ßë'õr8ÃÒPòC5
U4v!yc:Îpôk¼¶ÿd^קÃD~»÷??[TôðE¶»wª;Àk½WÆÎÊ]!Aùp£Îrm°d+Û #L`± ´|P Hƹç_®gXo,¹i¹ªË\ XyËú)ò¦á4·§`8ÏkÆïgBC¹HÎçÕåNw3Uv0/ÏnñÑ8ª¡3'»=·1MwÉ1Ù}ûÒ2xÃER
¦§±PL¿@ã×¢LQRI5=û¼x_ZC#.eÒG§ïüØke(¤ÞàÒ F@½Ù¹uôWnqÈËÙþ/£ò貧Ù(oÒ`ÄH¿I/#% $;ÁðH|ëü!ôÿ8¬¾$DYDvâõtFþX*G²»ÏÅ^ÒÌÝ@E8*mì81P}°f>ÃÞ²âôs#.Anã"Ý3-½GCÔtä.9#¿å¼:ö´Ô>ÄÇpwÇÉÄP+m&#%f¶FÖ´ÑÛd92hÅ$ÑEy#6,:@ä¡í(:xÔwu#6©6Ïì¯T®Î®£Æ>ÞH{:¨óÚrz¨öY5zº¹[(úù³¨ågõ8Àu¢ÚO
±Ú¨¦ ¢0ôV#% FB$¯°Þå<jØÀOfçD¡Ð+ö8ÍÆ#%àA)hBÀÆ+ Ä®qk_g?ë?¯à̬¤ÝOÞS/P@JFÒQ?µªù±À2:ß·gdªH5R#£Ê;ãMç¾Á#%óëxN_¼n1¬ÙlX+¤g¹·ù_4k3>÷Vgl6éÎ×Ó©ñCq×ÐEúW9³v@ÓѨa´Nø¥7ìâ²ñvVù¦
éì?ÔTÆ'»e¿Ü»Ù;}`£9úì=§¦ò
A+©/þnw®Bv>û¶çU;QUΤRtÐ:`#A'BÑ1«¾ùa+Ð1 MpAH!þO«mmCPç¢6îÐ*Á#ñÈr=ñ?£?ùûKÑTHØ?ÚáU¦7ÊIÈÛXÇrxiÞ7ÎåÆ:tà^³Í£Á!Kòó©,8AüÏzßóÄw(I ìäh·ÑQúöùw,ù.1øµZw®íb!&t4!Ç.üú2E)OkR¶Ä4³¬?eBF1³öeÑ$í8xnÕnùx-PúÉé^û,ÇãXFKPÍ<Ç+wOÞ×j¤Ñ¬E¶Ëf³MRÍbZRµMR(gfísʵ$Èu.kOU;ÏïHÝEUõÔ«@È¥~Ïíýש?£ú~dmeI£0h m¨LBLhb#M*FJ&
!&Ía#6±ü$åÅögxɳ'«:û7Üo'6úÝyRMvÌ ÜÆ0Øh4MÌÝ4¢¤aKæÞ7t¶zh%*éMð·åÆ^&y}Gå1ÑÔ¦×M6`¥·m8@¨
{*E#R«5sQíøøÞ¨Ã&D¡+fCÐÄÆÛxÎ&cz\/ÓÀ[]4ª>n¨¤ôÜh#.ØL ïÖ9obkMNËÒuÕ.Âjõ!2̺ju^ëØÖ8ì3Ûë¨fèÎ[G ç_¸3ýO8°Õ Úm𦶰9ãT/èá3°ûç#6Ri¾m#%F÷"¢Ö[©¥m¦iG#%0NPÈ©-D#61u2HâëQUË;®JnVÝ®ésuu®ÈïkÎòYÛ×·7®«+lÆ4hÆ@î1A *º%*»@Âë&Mæ˪#%¦_å¬2H¢ÈAB,$ÖW¸rérÎësk$¢3ï¶*çF×2 ËLEø:UÊA-H¡K29ÇXarR×eFÉ?6¢teÌeÃÑs4Ñø©
~÷ð/c
òhâÓX!Ë#6Tr!SÑ©/Þ:ãkÃz)\QÑ!TÁ`U«¢7*âÍÒll«/c\(!¡6BÒ¼«³5A«¥¨;Í·rÊ.»xÖúÇ®î×uQõíQ°i
¢I¥Âħ%4Ъ!h¨&M9Q%²ÛSM©·LÆ<DÓÄÜ$AVeCbzŪ×*:R\£³Û+µ(mUÅ¡:ÂWT7"B¡\+-£u´66RÊó Uj
¦<«5C`À5·&Á¼éånãÀnU.à»*.ÔÝTZ%ÚÔ&#.*A±Ñ©§¼Å¶eÕÞøÁÆ1'3²9Da[#.iHH7SlYe «UÆ«A@¬;)ucÔN}fÍ=,$î|ùWoÃAR<®Ó&ÂQAgÛ#©Â\\CÑz!¦©¦GK1dR0q¨²yܦ8BÙ¼1EâMjJ#.ÁBmÌKH'
p¬J¼á*8Àpì#0oàÅ-ZN5FA4¨·Bæ 2+±Ðj!B SR1F/4Ìâ0Ê#.býßR ÷ØsȱTnͯ7nnø÷Xµä¢ÉʾNLâ!ILsC#&DVE¶Fi¨(a S#6Hƺ-¡2@aZM'"1AÆî<j¨í˧¥ÁlUòÃÃÛæM8K¤A³¡Ø¡)"ÞZ9fñJ6Þ ºÐÑê äd'Í4Ǹj¨ºN0üfâÆiûi©²°°(0ÓbÉQÑHD5qîeéån#.nèÀO\m Õà*%oC#.«ÊMïìu¦÷Â
wÀjïT¯¿&Cr@Þ±¨¨Äp6Êäøz$×&p²±@V[i¡YDæË(F )96pÒ¡&4©J¸(©0Ö\±
0¸(æ!BÐQ!bJ£"¤Á4Õ´ÈÂÓGâMI)Ǹ9pd!U!Ì[¼;îíâ+ÎòéQ×bQÁHµCTEÍIÀ;¤Úm¦Í¦l²"µj
Cñ`§ë.ÿ3#6ä4êJðüû¯Ì("Å#6H°=ùÀ=Rc·.£÷e}·ª>üRÕDôÑF¿YÚ>REB#%!T£AÜBåµé{T}µ*Àì=Uí&æë§ÎÎ00Ò °W!P'Û:D¯µg<¼ÕF rO#.4P÷¨ì¬p£þÛ2FÄÙÝÛn®®[{k®;¸[ºU0Ir
Y
vÊk^(¦µR¡LdÁ RËuB¦æ»³qP Ù(f3Т#omB7û¾¥°·°ø\¼ÌÚÒãL6-Öý"ò»-ëÛ¹Vçt$YÐIÛâóÝkXä$Y¬Ùæj±tª/vA»>#.¬½HíÓÒ1ø¶GÛ«ÃD¯PVÑõ(þ¯à© N½¤L¯ÈÏar×($ìÝÉгàw ïRb4w^×»C¾/
ìX,^¨bK\«Ù½-!®ÓlßMvª|ºõö!üȦ7@Ï_]ßÌØuåÜ(7Ñúþ©ØÁ#%Ë·I#ú;}+¾?}n*>Û±ÏÒ[ì×{oѤvÒBÅÛ³É~¹¼È?Èùc(ñG© ÔU#6+¿æd礼콦ÐðÉßzRÊ'j[br¬#.v#%ôηUûʸT71wVfºËmEÃÒXJ§^v×# ïEC°yƱ, ìA2±AETù°áòNÊR¨QeTÎÞrá\ö9Ú5jªË#.&t0ßácZb8z¤0ÀmEþf³ÈßçH°Mq4¤9 #.þ ÃUHr¢\ªévÜV^ßÈò¼QkÚr¶Kh·²ÖìKrîêÛôK\6¼UÆnVéµ·MY#.cnm&Úæ²k-µÍÞír,mjQª+;«î-Ã#.âw²Ë»$çv÷07ü<¢Í}Zk¾zÓo´=H^Êî"Øκ!7@A"ä#6´Þ=¯íÂäD´»¿vú®_oª¾ªýQy>ð)Gä#6çøÑá"É4ÖÂ=$±òSè2w@d#%Gßèq¢1¤(IBHå%J*¨Nîòá^T#6Z\# x Ùb¡*©""(¤[u#.mt¦µø~{oF®Ü¨Rd%ÛÝäT]Ñ *½Q@Q¤ÖHѶÛ%[¿~k÷!D,#6 éB?õ@Ô#%ÿ$CÏ¥'¾ûHjÆMöFÒ¶FñÇÙ{ZPuðPç¼P#%;²f_î@O÷A$;ý&Ô¬¡Ôu`¯ª¤ª£Ù¨3`Ð: H#"&Q)òT(uqe-LÍIJ1id´i66hmIEbÆÊRRJdÚ4)µ´Eª*ØÖÔkjZVjZ52¥bÖci5³[ϺÏn·$cu¬È²#.Ç"6W"Dûne6ÛaPÊAÇ$r®tëÓ£Ò®Ï=tªò®<ìiq¨ò¤©¥D£O c!&$Ü*+hlc ¬HÉ-a"#6@£`èÁi#.H
4ECJ¤P*( B*Zë0$(¾B¡ Ô#6Y2?Íü5°Á#%ô©DØ%%¦îéÝÜ:ÓõÚô·W®ìÛVÀ(@d$f2Óȸ@M°%Ä^û³B3ã`ûÇNÙ"vÔôôm÷wc¾²³Ù
QRN {ABH,O½¸VÆÈÜÐö5OÈ¡äØf2vp®§W_[,1Z%ê/-l@Ò¨±±Ü¨Mâ xFߤj¯§1pV!TÌH!PáJu0UR8Gõa£ÜµõN¦µFénãɼÖòË©R/Ú]êµsQµ±hÕZê®Á¥±ìóp9ávº?®HEÊoz¤ÑïpÛ2#6e_ìÓjÎ`»8C®+dßX{ApÂ!ê>ÿï(ü±YD©Ë³eJ[LTz÷F"Ë`ç`ÎÕRúÕ ÿùiÏJê%áMY¢ªS|²|®#6u¡àÖ½usFpÙ"}rC¼"Él³Êª<Âo×øÏMÏr§ýæØè#Æ X}¨vµºt¡;?;#'ËRùi@Ü¡ÍM¸Ôã|]?ÙÒί^¡ÔB}¨#.#%ù`ø¨ÖîAåÍã°Ï/Ñÿ|hÒl\1º**;»3Ú*¥âTþÈñÅ4¢ØìçÓ~ö3a¦)¸÷GZ³*¥zÁÑÇUƶÜ` ÂpÞ]ÎÚ£]u\ÊJãQ¢ëòUÓ3÷ðÁÆ&Òe¥ÌI#ÆåÛJ{ií'[lüÇ¿Üo5ÕÛÄîÙ¥º'Q#%ä3!O¨"e¨BG½V×ÒH#´'53×ÕîZ×#.ÃPñçRn tÈCñxm÷¦¾Ù¶Uúûïy/ãV°A<(}ZÒÙ81K²$=·E4¢Bl:EæÊSlµÉÆW_û×¹/#.ÑÛQuÔîí®:väì³G¸\§µí{KXî{îV¾¬#%¤LÒ#6Bk¬¨7â¶(/%ÀèÃà÷Ô¦Çb-¬Ä¢õÂÕÄÀÂFÅÆixå$Z³F®;ûó©vÂqÙÔ!Äg ÷7tVBZÇS¼/yÀo#ß«½Þ%&s©X½*77/²cM±ÁrøW^3Ý$"Q?:yÛ6"£éÅƺ{åøÉÐ#.ô¡¡ÌVË~ügÉgsmm9)¸®jWMöÓÃmf± è·â®8kÃÓ[éþ]»±6årXöNVRTâÌYÍZª¥;¢øùgrª³s BÄyo
,pѾa& q<£jf)ÐÙnÆÛÐÓE¥Åf5w©±ÑÄâV\º)2Æl`qÑáDë¾x¶Åf^aTûåkÄWnëh6³m<pæyßý_ZÝ>Ø[ÑÆçhNI/$ËÆf7)¤ÖôöÍGb$C¥×ÃêCC:ÚÒs/}Ñw§Êò¶DÉJnÛTóQíjP÷xÍ÷bëZ:>ì¶Êü¹9õÌW_J×°¦éyiÄÆx»uw}²×:üç´ç¼î'÷u{õõa*½^WW0ïoèÌÐâò¹ô³8ÎÜVx«¶®§|ÅtªCVo
#6åUvga*Fñêòªéïlg¢/Ç=Ã5ÅéüÔÂln÷.úþöb¢</Deìóիô<¥sï>NÎ lr²¶AÅ׬Æ<EúûcÛÔÑìôþÝ! "D^æy¾8Ü£ËB6KÛ8£,g :d©D÷ÓìLíoY°¼0PÚ/iÈÚyÔsdÛ)
7°²TîÃ÷ä&ªhdrå#6%#.-í/×Cð&d«©.]ê'O8çmÃ7£UãIð,¦`W£2êçµ8ÏNÀÅî$`.èXÌ@ð=Z¢Ãì÷mRm³³£f3g#RcÀÞQä¼b3x0óð½0_$gBÈ0íÚº9¥#6¨ÜÑ)¯±Ò'¬ÏÇ keØ yc0À)Õt±
(ßÛíÖ ÙdJݧÍ-®¯®AåÖǯ0É<¼^G¨&ê@1[õ c®UNÃcAÈn>Ð o#.°(ÐÈ#×LC÷ªó#%@:ó#6`FãaÀPa»ô:£L6ñÕýxõ»Æ`v¥¤`qG=æ26ð9èÖkSAC«#%6ªsÊ^æz±¿v Z3K3.ªÞ&ËsxÃ\ã#6?#6«_Dd\¨¡PʸG`{»u½§D¯OÆ.þîO'6÷ûÞ[°ìkÅÖÈ,½ÓÀý* GÄÂg ¾T©"Vsïδ##ËlºNÁƹÓkFÒéaùC·úÏòghæz¢:§çç>ýcETÚQSSNFüb((±SöÛMÄe²Ú{Að]Ák]zVÔ4o{#.Uû»ð*#%Å9ÇGÖôÚÏ6(¯Û#.oÏ϶;3\4¡³G>FÎD(ÖѽòçÇÑp²9fª7 Zæ0ÙºÞÝCë¡ãÖNÚ21Dª!.e-lZ'ÚUbÕõQÃØ¡ç~%@½vÝiVkQ-29¾ysæ83DñÅì^[)X×ÕÚÉ"Dv:e£;F#6Ç~Ù¸°ëíÓÓwÃãWoÕqÜ̲¿';¢Cs:ö#.aº:ë¶Y¹Tûè¯[ãÔÇ4v4n s©»x÷ÑÏ;èÝ2÷~öçsw~/´j¦<£\Wt·åómåG^5&Éoä wª7AÍÄ%å#¾Þ0Må8pqäñ<³~7SÛ»åßLóÎ¥mZ¡\dõQÐ{x09hRÄ¥µ¥«#%}¥ëôD4·bÍ
è3¨ç®E=¸¼ó ;Hðà>.Ãx[CUZØ=íô7,Èh¨·tz=<7~O ífBñEo7ê9q À°ïLBõ«³üñ6°§«YܱY
;W¸Îå\¹Þq.ï6
)sf\=®Ë#ÕV4(êvµÐ<³Ê@Ç,,¸g ¢(Ôyzw-HÕ]B¡¡¯E´öq3¤:f,öÒ'!Ñð ì@â1HóFÔó vM\;© É3@Úõì.Úg$$VtIm-äSLÛ0w0ÈÁ'#%ÕY"aÃßôèU×]õûC#.`fá+u¸mæò?N®°Cw"³0ñ²)qOn"xX í¸NÛ&Äy~å(ä·°ÇèpÅ`\r P <ßð(;ïÍVßáL{U#.>¿ãxKf°ÂwÀõüå'y;`kàýpÃhST«CÙç2°gÏ¥_V«GªG±8v'$ODMáÀÖN}®;O[Tb,ÈÃäÒ¡E~ ¯Á°e
Daì»Íml
sÔ¸ª#I#6±KºÌ0ªm&@<Æ
(Ó`YF91!²²"¨DÈ¢EXB!$JÆÕ½+F·5¨nZÊèZ©"(ØÁci¬¢ÅFPTÒ¢aQFR¥0ø!\Þg¬âþ&xØ
µ±Î@LñÜî#
# ¹vÐ
á¤é$c9ÍbÕé¼mãnEɱ*µ¯¹m¶V®UQUUé¹UײóÇÐÜÍýÐçP:þ~µÑøC5÷]cÇ-§AKxæ*Æ1K+ud×/¨ÒÁí¸i¶í®oÜ#.hÇHiþc£f-+°£W ¾ù¥SáîÀkN4bJ³ÄòÖ:¸`@¥,×cÉ (2tHqbePDiòãOR;Æ]ÓxÖa%dH°!V7VÁ·Ù(&ÓicRE,%ÝEcbi¦4C®Z*=Ê[ÌgA§ÂuwL¤td½>ùlÀöL!P9lª#6@Y0ÂfL7zUàÅ3R·XQÆ6ëØËÖ¥4ÊÑÛv²ÍîFjh£MÔU¬zmkZ¦A¸Lk.<µµcÔèç9«eoLÑ$DMqP\`SZ¨X³LÐ*±cñcix12ëBÕC$Î¥¯Õ¾5©Ï9;·hÓaYÎS¼JÎ!ª#6A,ØTP2ÇcLhÇ»*ëµs½µPAôãn²U"^Ck*êæVú%+XIwÜ&]J&0ghnÀotÇßhsiH°N'a§ïiÏ]P\ªR8ÙFö0Tj?ªãÞºÓÖcSò£µ.¨CZFLàèd¬q¨Ô"Ú7*ª#6*à ѸÐá¤0m0m15+FÞn-¼,²»zça[ ¹tùÐC 2´CdT¨£]&09ÜEZÙ*å#.hFe¡±mÝF?Sã5@LãRùg%¥¶È|4k ¸Ô Úh¦ª~¬¶Æä$¼*7Ä®é@ìzi¤<D¨°]8&è .ï®r#.VFÚqÉ#B¡ZYm rm2LäÊlbWfJÌæÚ¢&n\c§F±V=¼§^1Q¼ÁèÞi®m·X9¢VßãÞßÞ= GÕyúe}#611(÷"Ñ·e0Qsâz±Xr8cMAø¹¢@=6ñalÊS!vH#.0ÕÏ ¶û0\d#3ÉÜ$d9ö¥:é¨WbTF¡£MP1#BÌðCV#6æe´Î-ͳZ"ÛhDF¤¨b0fµ8Ҹ±¶FxØ7¨Ô{ÔË ¦A¡6Á&'"Ë9#.+µU°ÍNß!UíÏ*ªÛ2s£Û1óM`ÁC!0çrc$Ûã½n翦Ì+¾îÝiL5MÓõ6¯ÚÙH$ä´¤$zO®;ÅÝóèºbCóHwÀ©ÚªwUØÖÀ4*SmÙüç U+ {}E*ûXSÔÓ^#.ñqº²±eÓ¦3~sÈ+?2CÁûàÿÐ9¯¥Ag*Î*JAFä#.o³·Ä³Bx«ÇzQ#È»û<*±¿®væA§ öÁK?~Cóyßì¨×\UbeªÁåó>\f÷={p1¼$a¦î»¹0¿{w@y9;bƪ¦['º0ÇotÜòä<×Ñ(õÈø¦k´àµÕ÷¤qÁÎHû®øü!¬í£Q:ǧ å@Hµðç©!Í5i WjKV\Õm]7hlPPH¯Ð¬»öÐÖiä#ÔD~èì9ߥ}~vý"°R(±H#%VZÛ#61´Æ&1¤D©(Z¦Uil[%¤¶¬RQ¶$¬4(¦Ê£Í¡M5#JMQ³JHIQÓhD¤KFHS4T¦È¥SFa¶lÂ%(I1«X!#%øÞ:úxôÌÔg´ê9ÉSÛº¬î¹[Ç4UyÜÐ~ðWæòs5þW$$g1$8)×ÃÂÚµâW#o®å$îVÐElO"¨>#.¶4~ ¼Hga¡hf6ؽØLKn£R&¾~§Ûzk³pCõ%ßÚ(2ÆH\Àù9q]=½haѹS(ÂBYèâ°ª¦$ã
ß´ùû½ÂùïâsþCJFÃÅqy§üÚµù¯×ÑÖÇ{!Ãë: ûo?WÝjßµ¨Û&ÑXªKXÑ÷Ösi±©BQ£±õÝ«C!bR©bXK2ïÈ0'uàE$fPÉ#6>ÿ£"Ù)í¬÷ó.#.>+¡Q
¡¦b0ÜürèÕcD>n.5ª(àÉX¦¤Rb"©¢ªD.éÊf¡+@6lxËRXÐV,I.¾Þ1Ó{¯.íгöó«ÌѦ»6öå&ñsD¬ÊÜ·/׳PQÀº.a#%ÅÝÞ!`СGLÄĽG¾ôÓIà{è5OEÉ'&u1p6e¤J'LHQb`àËVAd¦¢ b¤
(ó©#.LáGô`6 kgìμÞ6ór1J¤N2,=¤4,°p¦| d<ÀÂÛ«6ìjHÚÛElm#6#%ÚÔ("3@pBh_²*ÁUYU¦#6!ìßÕºL@ ¦@¥+Å-= #%½]ô¿~7c¿#´
`>ϾÈ÷÷ò3þ¨Cft½B$#!¿ö?"dê
|êÙ¾~h%¡Ð{Ñæ#.,(`ä塤|ÈØn2¦LÓÈ3ÏÐ@>ã7ïØVÆiy¼Â°÷ýÞ=ßµöR|ª2Zûf5ïðñÆUo¿[52UQJm¯ZÔÆÊJýKï*G;ó&¦¥uÊqµm¢òêg*ñ4-o^
°n2nF-tiªD§7C5Æ6Ó&TS`Ò&!*Q±A÷Ärê]uâ+NA«B/¯Ô{,¢tòOئÊúÓrµÉF¯Aï J+«)è(° Éë;øNsê>«íó]ÊMË°#.L|ÊÛéRæ!Á)Bª9£^¤ÿjfÅ<Ì;¬#6Aî0xw;ÞõHA)4gfzúqòFõcÏ áØE¡kõ|¦!»°uªMG&~逸²#%Q;ú¿Üt@d"È*¦#.>¸ô/}Râb_cóÖìT#D¥:ΣʱrÖîõý'5>ç|â²âè}.àý_Tl×=ÎÜÔ²]4X`C$0ÇVêã9'HØv'F³ñIÚj&¥gõ@>3¹Ðí#%pàJrê`{ä7s@òq{ÊA/UÒ\zge)^±²=sDþXÜÆ1×Æ£Ôå°nd[wof²X²¾çg)P6B·Þ\+ÉÚEµÜ,3âÍJS»uUtDÀý19W53ÂpTlÐÈÓ#.¤ch` ñ0pP#.@ÐnªÁ`È%ÿV TU*2ìÈ/&YÛr-Þ¨»5!PÔÊ0E#Q¤Ha¸6P";^-@âYÇ1Ìnì5Í¡#%1,½!sYÚñ¾¤flzÙ¹Ôé¥ÁciDã&Ho?/3²Ð½X2(uÇÌ°´ÃdÝzYg$äÝ&Á5åDEPÚ¥HA±è~3#% LªÀC}Yf-"¼¤}q¥£ÌàIQ%¼Ø^FZTz³µHÅKÅ"@Sp¤u^<o.ÈB3@Dmï½àâ
×jta¦lrÞX@zQfkQÁ¨À½A(Ö÷óò¯n7ÛW üï¬"ù:ÈÏÓ7Ò`ÀR7{¦BdXg&ðS¨f%¤ É0ð»,íýî¶ÜD¶uS2ºcre38ºt#%aÁ%ç»#6Lp²O§pßX9¤à»WD¢vkbÔ+LÄ#.ÜË#.»³BñC7<èD©#6H2#%ë¸ïµ!£!PÅ X#6ÉH ºÄy-_F¨é<´öÝañ¿n«ÍÛµ±So1ï[ÍVWÁ¦e 2äptc¯,ã2®i²ís¤°ð4F!ÇöR¨±AV,ñ³á$Eïæm;ÖcHo!Ó@3k9Ã_'LÁYÓB¯iè1@'*kM.³Æ£66 A»m¶ÒÁL\RE΢Fe¥%oÝ*,u`Á´¾Ñ9¥É1260ìo)¯i#.&÷Ã@V«¦Ä$ltÊvÛck¦rF)ÀKE ÙM,vLí.\º{Õ[>!m´Áiå¬Þc#4Î!äkû}avÚߤljW¸ä'7qÖ$[¬vÚÜßLU»ÆD<´ÑjlìïôH=fUÌL3aè'£>4O¬ÈÐ!ZõS5{ÓX¦¹CÎ&;±8k¦î\@r¯2n&='I©Zã¤êBÅ FÕ,¹\¬*ÍV׳p`\ñ©HfJY#%êëã¨"ßkkÌ%ñO+vv&º?grà{Þºç(äUÐä×I¤ X¬E#65³6É!ÅdhmÌóÀé^]04©qs:ÙÁÇ0@ëæE}h·¨nLeÁÃ}8 Ü^-1³ñ|2£Ãµ÷@¸p´V×;"'塱X%ôºí#%í5`+IB27©t§#.NZÐÅ©ºB¸°Aø±b+m:+¤BN\¯
mgY¬ñ[6LÎÀVælåa²DgÑ@iµDбP<ýÿB㱧4ülÔ?nMÖÎðàM$ÕY'¯BÐòtoi´\Ûñ¥Ø+~8ᥢ]-YÃ[Ôtͤp?UÿÂQm2áLØqEÍ#.qíñØåÓ<<4x¨1 (3HrÞ<9²óëktò ¦Æ r³òëz]YÒ1Íñ,ÌsÕ¦)³åÈFµ.ÉzÂy|²ÂÒ+d׳ÛFó~BÀaud¤Ö lÅÇ-Å
µ¾ù3XSC´=±ùq«óëth:j=iu]p3BÀt§¯_ m}i¢2HÛ bvvÏxâ«$3@ä½Ì·gnªÕ ³ PJPÍHÆÜq!¦YÛ%j®`Þ"#I¢#P/¿=¹fgØMÁC´;,LMµM4Yp'Ò*Úúµ·ÉSìÎxÔEë¹Y¦§vMY@ôðSäÌèåå#6ݹpf#%ÊÏÚ;tíyA&w©b¥OLìO#.&Âé?8L89ÞÝM7ã%89Ê¡Ø-u#. ³/L]¯\Õ¿%Ú.cx¨b4&µ!Ò`,fÄlLMá#6Ó£p:5ÒHÄÄÌü¤dA¶¢Hø0ÌÁö4EqT¡ªk&§xÝÛ3ÅÖè)ïe£(Ã1YÃ`¢Ç6!Ý]ÛÑ.$#. àT0%DH!¹±Z¸å9Ç´ÒQ PP4wÈi8,ÑHê%Fl!6aeÈ0à\*hÛiD5Üè8hé*¢P K#6¦æÃ@ÀÀALCÄD6DáS*¸èwB]èÊ4,¨6"wA³½ò3bà"¨)ØÙÒi½ûøU«Hªå¶ÎMlEÜ 1 ÃØ#66v4#60gSP#.F¸H¶WU%0MEó& 83ÐíÄ3mÂtëÉHrºâÄ¢ BB¢ê¯3[Ò^6¼¯_#.ó±c%%¾²yyôCk£U@Ê(¨°×¦½Èn£¤±°f÷ò C°5#6,"B@MbªPê á¿öôl½Èë:½uyÑ\²íeX§ëïk°Õy+'J#.?Ö>£MÃÜ)üøx¨âÙàm&-£×B¸kMµ7âIfsQfE°ë»ºf$$#6DXÍf¿Y¯§·#%ó×W%U®ÔEüðMÑÎ^hÂò¨I#%ê¯JS°x|k0ÂJh(¨GfuaÐÆzíf?nôÓ'àÒ«¨¹*3#¼¹R'W((q#HªÕÝeiè3³%<ªÙìªJÅrØãz#ÈÄ6¹7oSñkJêF9ÌTÍ@Z¿0TV(NAqKìÍËVè+ÈämÎÜa·4}o{«;Ù¬å¦66µ²¶[[:ÁÖ®¿¢>¡DHª{hËà}*s9e¾Dʳ:¯«d{÷ÅT°3ñD#.¶CvN]GÃL@SÞ¡#%4©C»¶Çá^Wf·DîÎZ²º÷áâÔRñ7p#6ªVÚX"kÕáË»[Í$2%ñ5;Îéo7vÈ®òï^vÉåÒ¹Å×RÉ#6AÜ0@4Ð5*F ´8iQ¡øé3 iöGZK(4]-ÌUDÖ7v)<´MF¢¡ÇgV#34u*ÌÙbQ GFùèë쯷»È!ð<ýZ÷H|ÁpDäA#%¦Ï¡¦3õj¬¼dú.ÖÚ1<#P$xîam
ÁVÄ®ÉÉL+ÃàÀØÁ$p ¶((7'§¨&µ9w²#6nc±ì³êlæ!ÜúìçÙ#.:ª&ª§LYUåùû¦÷×!G´È(|#%ÉÂmr,A-Ùa
NKÎMN8ÓR0;»n[5'Ã)Lª×³¨^b>%¹C3é8]6±uLDÔ`X B!:©O¬iæç³n%Ú"öa\ÐØq¥ÑÃK×è£ñLôQ#.i1Ç¿0ÚÉ0µö~tm6V,V"$ú¬ásÈkÐÒʸ öò
0'º)HH2DO¢"öµZÍiHJÔߪXDVBEGEìE0cUÆe5@Àm©n\0P`M`¯8#%ì#%IîËÑ
*Béøah<2½Æ¦Z\ÜìȤ°² H:¯äßbX1¿8Íõ#6 #%H*¾ß[·|4ÅO4oÕå}#9Ñth¼g#.`±Þ»´Å¸3©Õñ*\žY9)h¢#65½P4a£ePM£2Xl+%Ê«EE¨íD·LNAGUÕÂë×yåmÊ^¶²VÌÝv¬V`%QV@IÅNýWPË3:È$#.EG^2S4#%Ü¥
¤M2,Às4µ§âPNÞ0:=G§Í,0!&*Ç·§ä=ÔÌÃaÂÖ
з;sHc²iÞfÍtê1ëa°SàßÚ½&ñØÒ 7!,HÈ#%5ëÃ@ä%驾EsRÏr¢Íýï_kWÏ:ó¶¶*'õÍn¥H[ïh4×·¢`wAuuÚá#.,q89 JþÏáÃ;«¯³3¯ÅO8~kÔ1 Ü$9Ê%¯«y£6ZhI¥EG!+]£fvßæoíÕ8`±Òùn¸¿¾¶^ÓötY[ÕôãBa»ÖiAà~_X>ÈH&³ìÔXb#.4Ñ©î5ë%ïë!rKïl}9úÓì='p>ýÉÔ(^7/$¤´jYiVIJ#6«bÖa´&Ä*kLmµ&ߺÑZ¸Îk¡£Y³ks¼ßÛ<ÕXªåûµ£aÞ¢þsÔæ: ÇÅ#.#.¾®¾+±;öòÃMI@\Ùô²z°/aÙ°nâ#%ÕNÑ=ǾêäKÁFzùÂFC?6ëñ(ukµÃ
XE{J9&ärÔP|üi¶öÔä4Ø-J[hyªÃ´me;;ð´#.MÓIÓqAq«)\»ÄùÑe®qÄAäÒåCD8:ß 7$l·}uf¶Û6c6ZAI¡%!pj[´-ÑÅ[åÍü¬+cTdëÔçL¨Í¶§fܤ#%PYl±Ú!VYCrhM#.ÑÞîôÅN¡êÐ0LoäÅ£JÔ1ÊȲnÅF´ýJÖbÕk#.¥ø?{5²b]%OZZl}Æ0 ¸äE!òó÷ÎÙ,"÷Ég4 )@w}* uAÔ ²$ALpIF wIÏ/©tÊð¨A°O!##Æ jU6¼ãÕt±ð<4O ¢+ÙÚt÷ aÛL;ÏX#6ɨF §ßæý#%oÙ1d@Ç! Tñ{õWnÿWòmî'yüµÍó6@gö8A°ÄZ´³0?yüä<vuøl¼ôªÄfPx"%7³0Ü'´ws7uÿê"çð¾ÞöÝfÇÓ500.=Ôl×Àþê:;Xæ¾·ÞQPñã@?LSa#%G1×#6ÜÕAf˧f¡Xùè£C&3#ÅÔlDhÒKºº #.¦WÑÞaû]Û\«õæóÏ]ųÉSd5Qy7s]¼&ÆѶñs\·Æ+»·yåv¤å[yoÑ[¶Ís!ÅSõ$S`6mÙó÷þ#6*¾%|}¶<L³=AÞIYªa<Í>é#%Å<Ô®Êû>Ê,U!¬Ûf,ÚÍ´õµ¿5÷øµj÷û"Ñ-62)E4²©³jü¿tj7ßÕ~îú#. £D1SQ¶*¥)JÚüz§hµ¼'Ìx"#%Z"göBRÖÃÖ1ȸ0ÄÐ0HrHNT$è>ä#.D1¦î¹²)±¬-f¬Q¬lÈÅc+E²ÁëÎò*(@'](]ê4{qM_îòýé©çÜOsèùfa×$ðWÀ õ#%£'¸}ËeL|ó*j¹#6ý{.³æÉxv÷,!Ú°3
óÈIÀôªyæ8öÑUãoË{Ø,EE'Fñßt &ny¤ÀÞB Q¶ÄbpüÈtî"Û@ÖôTÖ¡ódHE9§¹Z¡ ½B!JSÚjh("jKNíÒkTÛRiIª[RTl@njm¯a0¨ ÿNR(+Ô\/*SÞR¬e¬Ë/n£.ÃgUPû£ãÓdtÎ=v£9é.k¯Ni`MÄÇhú([;³RÑÖ*È5õXV²Oµ8Ð"Å
k°ÞÚ4ì#.y@^K?ÞÑïW-ï%ë¼lcúé#nìzK!ö¦ ¸X÷¢Ð§øþàêüûoçãvMÅ)¦%I²5¶1R`ÔFÕ&Û#6Z7æm¿+W°ÑZ(FAUdQ$ïî9ú»,ìi!`¡P*
û¤6+°0rBF"EHÒ(ÄÉ
)¢hlÚQ¬,#%ýhÆ}qÏzíÙ/uÝJQþÀ!"kW±mF- Ú5F«6XX«QZÊßÓ[¯3:zºüYݽ´ªË%$ÜkìÇègÍ#6Ñü5#ê1KL5VÊåF·ÓLðкùÀÆàIô÷$È«miGlý/$²ÙÛ3"*hc<jÖÓý90(8AK"
Ð2Ú·Én³I©¢-ë6ÛNìµÝÙ^5æòµÕ6&·¥\ówY³2«®nÚ¹ÚKdYµywcMk»«»¤ÙRTÈØÖóº·kΨ¬$ISa!H6Ôb£cÞMi^×jÒÙMIUéZêÞuuçj¼lm(Êe¬¶R×Ü·k»tYc)&A¢a£ÑN¡àÎ#%É#6ÛÐqVm3ø{äè5H±dÜ>²øQ¶EF*dÈÇ#%ª@ S㡬þ¤Ê[Fh¥È(1P¹{äÁ5×\É&§4)DÚ7Õ¥GôØ46àYêÓäö¢ìþ3OêÁ `>¸¯pÏ?~ðøfEº#6ݧ¾÷#R÷fìfKËÇXZ¦#.Yë9¾îã~07"ß^GÏõ¤M#.UJmG/¤lír$a®îB1ßèSJë@ë#³o($QGÊ)ļ.#.õêLo.Eä`%Áæ1¢GP5¦Õñóç/ml·pB#%|²$xk(#6(iι8>J¦ç¸iß>ÔÒ9åÈt(a
-Q¢Þ3oÐÕùUbÙõ`|¢B hÚ)I¨i¦×£|#.âöA¯qØÔùK5Ó"÷gëtód±BKûòVµw¬¢ö|jëP¤Ot~ÃìJ'`O8)¹A°.F´'RK`¨¤,n#¨f4äÈlƽQÁÑÔÂ!³n¶`¢úC#ØÇwƽ!ȱ|*éDÅaM ¶FÕÕWáuzC<óËû²kGG ÄêîéÕ]Üãjþ?70ÚEy£ÉZ$£Y¨Ï¨ÑÐǽÁäuMmÐ/÷Ð
ÄZè8@¾?jã8ùç¯fYÁêF4dý-DEC=µvNÅ|ªÖÞm¨:´Pi\Xì"ð#.%t¢#̸ÝѨU×1Qߪ
@ã[8AÀÓ Êö;÷çK¤B4Db:[nX#.édRS(´@Ír:ä|Xr×c'pdlA±ï47mà¶Ô~¤
f1ÞBG¸Ô_h½GCô"W¾s;/~D#.îfYÚÛÊÚ{aµÝ×oÊ÷}þëiäk×í¸*>ÜD-(?LþdÓ*z©Q£fÜ@ ݨþQD¢¸ß³Ñ2Tm`ô=åWì#%ÇßwïØÁ²>uLäÿl#%#%b#%?Ùÿs¿ñõÿ¿ü¿éýôÿ¹íÿóÿûýíÿóîÿ/óÿëþ_òÿHþ]º>_¿ýÙ|¾ß÷Oþÿëëÿþ?ðøÿãáÿ~#ü¿ãÿ/óþïü?ùÙÿú|åÿ/ôÿ=¸G£üúÿÓËæùGô_ôêüß_Õ¥P÷SÿLBÄ?iþ,ϳüêÈDÊy;"e\?·ûäE7¨;©sÁþ±L@ZüÄm4 þË#%öªÂ)40)*ÿþþǹÝÔI IF·ÊÙVôh #%âQ³ßÌôjB»M¢Ï¡ESY8Û,×gØ+,þûö¦C¦Òæ¨x¶æñ#.Öâ×ýÀä÷² ¢îÇ^A:Õó»0ÉæfØÝ@#Ì%*ãþUÊléÎüiÙ\¾ÅÙ»Æøyö¡ÃÉvǧ¿eÔ«jÿÝë
¥&P"ƾrÿïUËr#.ð7Ï_û«ua:XÈs+u#6Ùýþ.ÀÀ7µ*jHþ¦xiiQ]d*ieaËTÁ0ÙÿeTñhÞ¶ñïÕ¥pvîm©TYn44¼BÒÙl`
ÕÁËsO6e7ª¨5mÚ8øqíMmƶ9T¨¨ëÌFdMmTIqxÝ,ØY.ä5¨mõyõx*ŧ7FÎîs¢kCºFêâ¬#y{¢ï4êÈh2ùÃáf´Øäì¹a²
qS1a ïH²F#¸yíÈd¸ÐH?F:oÌÌü4ÃÃ)×Цë^EúîÞK¨ëN±£\-ÑNàS4'>:`«éßw´ÿJ±·ý4#.póÀ@ÄGßF;tk5SÞæ Ñë gà w#6Hp,#6¹^>`L³¬5¬R Eò "IEq¸Ov].fB¦æ<õÙ3PEATV*AB9wt¸¦cß·YÌÊ2 ¯kº\69¤U¥ >È!<NÁ(¿K61$@ 0P2îHqw;ó\¨xH1Mï}lı38bÿûKuÊɬÆ\¬îÙ ,F#6"`ºT70]#.úwóbs $LjÄÔJlkY¥3[FÔm¨ÌÒDÅ
S_EÛWZªø|:Ö¾¸:?àE3ÿt#%¿]Tµi¸#I(¼co¦üÛªözÜíSlÖÕïéñ#%Mþ}OÒÂFA~©o;|mq>§^²æF4?ícS9öɬצåU1"ü«Ç»'_û6Ä+W] æ8uîKºxteæ߶}C3¿¾zg,r.;À}²½©½Ç0À×fÜT9P^]*zgâ_§Æ³ò8ÎQHÔ¼= #6@C&9Ò#.³QÁOª#.D'ÒáG½\áUò»µP®CGݼòö²á¾¦ÕÍ-ø¾v챯¤[êkØ´|nmcãm½(ÕìµoSEªMAj½óZåUìÞÝy»¶ë]#6.æäQ#. ©| P?ç!xnãdN2Apã'PQ±Ôí±s¼p]º¡f!OVݤ¿7áUÁbÇá*J9
¨H{ÿî°÷cÍÔ¼(5É@$fáÌR¿æû'wØÊ=<ÑܧÛÈ_.EúØqPôÇX¡ÿ#"(]¨î;µ#D)Qb(ÁmLÍtÖêÕÙjûËf¤ÅÍh é! H¤ £þßÃ3ÏëÿÏئ¨¤"þ~áã(ø{fYr0ÛmCòNÀ.!xN¦ çå,A<?àáÿ¨ ýþ&^â|YY?÷ùB-Þ6áÍtçü¤ÿÿ&EÐý hNí'»ÿcÿ`[Óúl¿·@³¼%ËAú¼Oìÿ»æÿÜíe÷øCâ.ÃGéʽ1ÍÀê'¼waÕBÏ+Üã!Éä,yý>^#y;³9ø¾ÿѵú½gþs(?l-A!ñÿÔ¥ÝóG#%#%(ö#6CÛ¢ OùI[¥BY=+¨4ÃÔkéýÕsø]¯üB_F*ÀN#.ÿ6pñäÑÎJíâqTE3o¦«
ÆYÌwÈâfÓ§m3 ÊÊÇðç,Má/-±¿Ñ8¨¼§0aw<}8fJÃ$É o§ì]aðx`H$Y@zõnÒ=®Ù iÿ~é1éÿµ^#.Jz(ÎLPÛæcèªÆ"ÿâ|xãügê?I¼Ëò~ÿð"ÿü]ÉáB@ä&öÐ
#<==
+#-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCgAdFiEEivIt5aBoIuNHTzxwSbTGfAUneqoFAl3aW3cACgkQSbTGfAUn\neqruqA//Y9oJ46ZR8W7YB/e45bfrYxGbN7NnkvkwSPNziObYur+n1QpQEOaPTn/U\n5kFtPWHXRJzaG/A9poKn7pl1Xd7Edcu1aalfoEazZbuD37VOxIp9lnrefCAeICqj\nGv0SD96Zac91CbA+b20Q4xnqxKMi3LSI4NPjfFGy62FkSk3MS4p6Rdp0/WAKwwNj\nw7WEjQCNmLb37z+FGSzXg28aljYeteBZEthsVmGJ5QqVwMBwgj2+y5FOTzFfxmqB\nrWgjFYS0l85kgYRZv9yzdNmFs5SScwafwpT8Xmdr49tFn/+0LxXyRxX+rdODgrpV\nY4EOiQz0fd6mMMnaTDXlLSXls3JyVYmbTjeNL/9gcHmnStzJ851CJQfyQg7A+JoC\nc7nz0HbiFyTgB+PUZr1OhGj3A7287o8XQ0tqR3oa7jXIOX0OynrGplMQKr++0jE1\nBgKzjLoE9CTbjkQfICLG+aUy3S1ZyDk/BcO+5+Ytbru+qXuDsIgAdVosMfNSv9jJ\nXvOINsbRMekdejYMZv8fIkn5OEjCFHVhNpobEsCb768bjB3p7alQGECBvjHCm6dy\nXZPzl9cBMWIXcBjPTS+GZj+PIXGcu76pbsx6HBHWf+uJ+4xgOsUCVu//0AV09jvA\n0MjtLWwQ8mdRH6Wt4hsp4HKtSvQrhmljf2OnuYBgaFmcdJkN1zI=\n=C0oT\n-----END PGP SIGNATURE-----\n
diff --git a/waf-tools/default-compiler-flags.py b/waf-tools/default-compiler-flags.py
index 190c9a1..c7b4c2c 100644
--- a/waf-tools/default-compiler-flags.py
+++ b/waf-tools/default-compiler-flags.py
@@ -8,10 +8,8 @@
def configure(conf):
areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
- defaultFlags = ['-std=c++0x', '-std=c++11',
- '-stdlib=libc++', # clang on OSX < 10.9 by default uses gcc's
- # libstdc++, which is not C++11 compatible
- '-Wall', '-Wno-nested-anon-types']
+ defaultFlags = ['-std=c++14',
+ '-Wall']
if conf.options.debug:
conf.define('_DEBUG', 1)
diff --git a/waf-tools/qt5.py b/waf-tools/qt5.py
new file mode 100644
index 0000000..23ff0b8
--- /dev/null
+++ b/waf-tools/qt5.py
@@ -0,0 +1,816 @@
+#!/usr/bin/env python
+# encoding: utf-8
+# Thomas Nagy, 2006-2018 (ita)
+
+"""
+This tool helps with finding Qt5 tools and libraries,
+and also provides syntactic sugar for using Qt5 tools.
+
+The following snippet illustrates the tool usage::
+
+ def options(opt):
+ opt.load('compiler_cxx qt5')
+
+ def configure(conf):
+ conf.load('compiler_cxx qt5')
+
+ def build(bld):
+ bld(
+ features = 'qt5 cxx cxxprogram',
+ uselib = 'QT5CORE QT5GUI QT5OPENGL QT5SVG',
+ source = 'main.cpp textures.qrc aboutDialog.ui',
+ target = 'window',
+ )
+
+Here, the UI description and resource files will be processed
+to generate code.
+
+Usage
+=====
+
+Load the "qt5" tool.
+
+You also need to edit your sources accordingly:
+
+- the normal way of doing things is to have your C++ files
+ include the .moc file.
+ This is regarded as the best practice (and provides much faster
+ compilations).
+ It also implies that the include paths have beenset properly.
+
+- to have the include paths added automatically, use the following::
+
+ from waflib.TaskGen import feature, before_method, after_method
+ @feature('cxx')
+ @after_method('process_source')
+ @before_method('apply_incpaths')
+ def add_includes_paths(self):
+ incs = set(self.to_list(getattr(self, 'includes', '')))
+ for x in self.compiled_tasks:
+ incs.add(x.inputs[0].parent.path_from(self.path))
+ self.includes = sorted(incs)
+
+Note: another tool provides Qt processing that does not require
+.moc includes, see 'playground/slow_qt/'.
+
+A few options (--qt{dir,bin,...}) and environment variables
+(QT5_{ROOT,DIR,MOC,UIC,XCOMPILE}) allow finer tuning of the tool,
+tool path selection, etc; please read the source for more info.
+
+The detection uses pkg-config on Linux by default. The list of
+libraries to be requested to pkg-config is formulated by scanning
+in the QTLIBS directory (that can be passed via --qtlibs or by
+setting the environment variable QT5_LIBDIR otherwise is derived
+by querying qmake for QT_INSTALL_LIBS directory) for shared/static
+libraries present.
+Alternatively the list of libraries to be requested via pkg-config
+can be set using the qt5_vars attribute, ie:
+
+ conf.qt5_vars = ['Qt5Core', 'Qt5Gui', 'Qt5Widgets', 'Qt5Test'];
+
+This can speed up configuration phase if needed libraries are
+known beforehand, can improve detection on systems with a
+sparse QT5 libraries installation (ie. NIX) and can improve
+detection of some header-only Qt modules (ie. Qt5UiPlugin).
+
+To force static library detection use:
+QT5_XCOMPILE=1 QT5_FORCE_STATIC=1 waf configure
+"""
+
+from __future__ import with_statement
+
+try:
+ from xml.sax import make_parser
+ from xml.sax.handler import ContentHandler
+except ImportError:
+ has_xml = False
+ ContentHandler = object
+else:
+ has_xml = True
+
+import os, sys, re
+from waflib.Tools import cxx
+from waflib import Build, Task, Utils, Options, Errors, Context
+from waflib.TaskGen import feature, after_method, extension, before_method
+from waflib.Configure import conf
+from waflib import Logs
+
+MOC_H = ['.h', '.hpp', '.hxx', '.hh']
+"""
+File extensions associated to .moc files
+"""
+
+EXT_RCC = ['.qrc']
+"""
+File extension for the resource (.qrc) files
+"""
+
+EXT_UI = ['.ui']
+"""
+File extension for the user interface (.ui) files
+"""
+
+EXT_QT5 = ['.cpp', '.cc', '.cxx', '.C']
+"""
+File extensions of C++ files that may require a .moc processing
+"""
+
+class qxx(Task.classes['cxx']):
+ """
+ Each C++ file can have zero or several .moc files to create.
+ They are known only when the files are scanned (preprocessor)
+ To avoid scanning the c++ files each time (parsing C/C++), the results
+ are retrieved from the task cache (bld.node_deps/bld.raw_deps).
+ The moc tasks are also created *dynamically* during the build.
+ """
+
+ def __init__(self, *k, **kw):
+ Task.Task.__init__(self, *k, **kw)
+ self.moc_done = 0
+
+ def runnable_status(self):
+ """
+ Compute the task signature to make sure the scanner was executed. Create the
+ moc tasks by using :py:meth:`waflib.Tools.qt5.qxx.add_moc_tasks` (if necessary),
+ then postpone the task execution (there is no need to recompute the task signature).
+ """
+ if self.moc_done:
+ return Task.Task.runnable_status(self)
+ else:
+ for t in self.run_after:
+ if not t.hasrun:
+ return Task.ASK_LATER
+ self.add_moc_tasks()
+ return Task.Task.runnable_status(self)
+
+ def create_moc_task(self, h_node, m_node):
+ """
+ If several libraries use the same classes, it is possible that moc will run several times (Issue 1318)
+ It is not possible to change the file names, but we can assume that the moc transformation will be identical,
+ and the moc tasks can be shared in a global cache.
+ """
+ try:
+ moc_cache = self.generator.bld.moc_cache
+ except AttributeError:
+ moc_cache = self.generator.bld.moc_cache = {}
+
+ try:
+ return moc_cache[h_node]
+ except KeyError:
+ tsk = moc_cache[h_node] = Task.classes['moc'](env=self.env, generator=self.generator)
+ tsk.set_inputs(h_node)
+ tsk.set_outputs(m_node)
+ tsk.env.append_unique('MOC_FLAGS', '-i')
+
+ if self.generator:
+ self.generator.tasks.append(tsk)
+
+ # direct injection in the build phase (safe because called from the main thread)
+ gen = self.generator.bld.producer
+ gen.outstanding.append(tsk)
+ gen.total += 1
+
+ return tsk
+
+ else:
+ # remove the signature, it must be recomputed with the moc task
+ delattr(self, 'cache_sig')
+
+ def add_moc_tasks(self):
+ """
+ Creates moc tasks by looking in the list of file dependencies ``bld.raw_deps[self.uid()]``
+ """
+ node = self.inputs[0]
+ bld = self.generator.bld
+
+ # skip on uninstall due to generated files
+ if bld.is_install == Build.UNINSTALL:
+ return
+
+ try:
+ # compute the signature once to know if there is a moc file to create
+ self.signature()
+ except KeyError:
+ # the moc file may be referenced somewhere else
+ pass
+ else:
+ # remove the signature, it must be recomputed with the moc task
+ delattr(self, 'cache_sig')
+
+ include_nodes = [node.parent] + self.generator.includes_nodes
+
+ moctasks = []
+ mocfiles = set()
+ for d in bld.raw_deps.get(self.uid(), []):
+ if not d.endswith('.moc'):
+ continue
+
+ # process that base.moc only once
+ if d in mocfiles:
+ continue
+ mocfiles.add(d)
+
+ # find the source associated with the moc file
+ h_node = None
+ base2 = d[:-4]
+
+ # foo.moc from foo.cpp
+ prefix = node.name[:node.name.rfind('.')]
+ if base2 == prefix and False:
+ h_node = node
+ else:
+ # this deviates from the standard
+ # if bar.cpp includes foo.moc, then assume it is from foo.h
+ for x in include_nodes:
+ for e in MOC_H:
+ h_node = x.find_node(base2 + e)
+ if h_node:
+ break
+ else:
+ continue
+ break
+ if h_node:
+ m_node = h_node.change_ext('.moc')
+ else:
+ raise Errors.WafError('No source found for %r which is a moc file' % d)
+
+ # create the moc task
+ task = self.create_moc_task(h_node, m_node)
+ moctasks.append(task)
+
+ # simple scheduler dependency: run the moc task before others
+ self.run_after.update(set(moctasks))
+ self.moc_done = 1
+
+class trans_update(Task.Task):
+ """Updates a .ts files from a list of C++ files"""
+ run_str = '${QT_LUPDATE} ${SRC} -ts ${TGT}'
+ color = 'BLUE'
+
+class XMLHandler(ContentHandler):
+ """
+ Parses ``.qrc`` files
+ """
+ def __init__(self):
+ ContentHandler.__init__(self)
+ self.buf = []
+ self.files = []
+ def startElement(self, name, attrs):
+ if name == 'file':
+ self.buf = []
+ def endElement(self, name):
+ if name == 'file':
+ self.files.append(str(''.join(self.buf)))
+ def characters(self, cars):
+ self.buf.append(cars)
+
+@extension(*EXT_RCC)
+def create_rcc_task(self, node):
+ "Creates rcc and cxx tasks for ``.qrc`` files"
+ rcnode = node.change_ext('_rc.%d.cpp' % self.idx)
+ self.create_task('rcc', node, rcnode)
+ cpptask = self.create_task('cxx', rcnode, rcnode.change_ext('.o'))
+ try:
+ self.compiled_tasks.append(cpptask)
+ except AttributeError:
+ self.compiled_tasks = [cpptask]
+ return cpptask
+
+@extension(*EXT_UI)
+def create_uic_task(self, node):
+ "Create uic tasks for user interface ``.ui`` definition files"
+
+ """
+ If UIC file is used in more than one bld, we would have a conflict in parallel execution
+ It is not possible to change the file names (like .self.idx. as for objects) as they have
+ to be referenced by the source file, but we can assume that the transformation will be identical
+ and the tasks can be shared in a global cache.
+ """
+ try:
+ uic_cache = self.bld.uic_cache
+ except AttributeError:
+ uic_cache = self.bld.uic_cache = {}
+
+ if node not in uic_cache:
+ uictask = uic_cache[node] = self.create_task('ui5', node)
+ uictask.outputs = [node.parent.find_or_declare(self.env.ui_PATTERN % node.name[:-3])]
+
+@extension('.ts')
+def add_lang(self, node):
+ """Adds all the .ts file into ``self.lang``"""
+ self.lang = self.to_list(getattr(self, 'lang', [])) + [node]
+
+@feature('qt5')
+@before_method('process_source')
+def process_mocs(self):
+ """
+ Processes MOC files included in headers::
+
+ def build(bld):
+ bld.program(features='qt5', source='main.cpp', target='app', use='QT5CORE', moc='foo.h')
+
+ The build will run moc on foo.h to create moc_foo.n.cpp. The number in the file name
+ is provided to avoid name clashes when the same headers are used by several targets.
+ """
+ lst = self.to_nodes(getattr(self, 'moc', []))
+ self.source = self.to_list(getattr(self, 'source', []))
+ for x in lst:
+ prefix = x.name[:x.name.rfind('.')] # foo.h -> foo
+ moc_target = 'moc_%s.%d.cpp' % (prefix, self.idx)
+ moc_node = x.parent.find_or_declare(moc_target)
+ self.source.append(moc_node)
+
+ self.create_task('moc', x, moc_node)
+
+@feature('qt5')
+@after_method('apply_link')
+def apply_qt5(self):
+ """
+ Adds MOC_FLAGS which may be necessary for moc::
+
+ def build(bld):
+ bld.program(features='qt5', source='main.cpp', target='app', use='QT5CORE')
+
+ The additional parameters are:
+
+ :param lang: list of translation files (\\*.ts) to process
+ :type lang: list of :py:class:`waflib.Node.Node` or string without the .ts extension
+ :param update: whether to process the C++ files to update the \\*.ts files (use **waf --translate**)
+ :type update: bool
+ :param langname: if given, transform the \\*.ts files into a .qrc files to include in the binary file
+ :type langname: :py:class:`waflib.Node.Node` or string without the .qrc extension
+ """
+ if getattr(self, 'lang', None):
+ qmtasks = []
+ for x in self.to_list(self.lang):
+ if isinstance(x, str):
+ x = self.path.find_resource(x + '.ts')
+ qmtasks.append(self.create_task('ts2qm', x, x.change_ext('.%d.qm' % self.idx)))
+
+ if getattr(self, 'update', None) and Options.options.trans_qt5:
+ cxxnodes = [a.inputs[0] for a in self.compiled_tasks] + [
+ a.inputs[0] for a in self.tasks if a.inputs and a.inputs[0].name.endswith('.ui')]
+ for x in qmtasks:
+ self.create_task('trans_update', cxxnodes, x.inputs)
+
+ if getattr(self, 'langname', None):
+ qmnodes = [x.outputs[0] for x in qmtasks]
+ rcnode = self.langname
+ if isinstance(rcnode, str):
+ rcnode = self.path.find_or_declare(rcnode + ('.%d.qrc' % self.idx))
+ t = self.create_task('qm2rcc', qmnodes, rcnode)
+ k = create_rcc_task(self, t.outputs[0])
+ self.link_task.inputs.append(k.outputs[0])
+
+ lst = []
+ for flag in self.to_list(self.env.CXXFLAGS):
+ if len(flag) < 2:
+ continue
+ f = flag[0:2]
+ if f in ('-D', '-I', '/D', '/I'):
+ if (f[0] == '/'):
+ lst.append('-' + flag[1:])
+ else:
+ lst.append(flag)
+ self.env.append_value('MOC_FLAGS', lst)
+
+@extension(*EXT_QT5)
+def cxx_hook(self, node):
+ """
+ Re-maps C++ file extensions to the :py:class:`waflib.Tools.qt5.qxx` task.
+ """
+ return self.create_compiled_task('qxx', node)
+
+class rcc(Task.Task):
+ """
+ Processes ``.qrc`` files
+ """
+ color = 'BLUE'
+ run_str = '${QT_RCC} -name ${tsk.rcname()} ${SRC[0].abspath()} ${RCC_ST} -o ${TGT}'
+ ext_out = ['.h']
+
+ def rcname(self):
+ return os.path.splitext(self.inputs[0].name)[0]
+
+ def scan(self):
+ """Parse the *.qrc* files"""
+ if not has_xml:
+ Logs.error('No xml.sax support was found, rcc dependencies will be incomplete!')
+ return ([], [])
+
+ parser = make_parser()
+ curHandler = XMLHandler()
+ parser.setContentHandler(curHandler)
+ with open(self.inputs[0].abspath(), 'r') as f:
+ parser.parse(f)
+
+ nodes = []
+ names = []
+ root = self.inputs[0].parent
+ for x in curHandler.files:
+ nd = root.find_resource(x)
+ if nd:
+ nodes.append(nd)
+ else:
+ names.append(x)
+ return (nodes, names)
+
+ def quote_flag(self, x):
+ """
+ Override Task.quote_flag. QT parses the argument files
+ differently than cl.exe and link.exe
+
+ :param x: flag
+ :type x: string
+ :return: quoted flag
+ :rtype: string
+ """
+ return x
+
+
+class moc(Task.Task):
+ """
+ Creates ``.moc`` files
+ """
+ color = 'BLUE'
+ run_str = '${QT_MOC} ${MOC_FLAGS} ${MOCCPPPATH_ST:INCPATHS} ${MOCDEFINES_ST:DEFINES} ${SRC} ${MOC_ST} ${TGT}'
+
+ def quote_flag(self, x):
+ """
+ Override Task.quote_flag. QT parses the argument files
+ differently than cl.exe and link.exe
+
+ :param x: flag
+ :type x: string
+ :return: quoted flag
+ :rtype: string
+ """
+ return x
+
+
+class ui5(Task.Task):
+ """
+ Processes ``.ui`` files
+ """
+ color = 'BLUE'
+ run_str = '${QT_UIC} ${SRC} -o ${TGT}'
+ ext_out = ['.h']
+
+class ts2qm(Task.Task):
+ """
+ Generates ``.qm`` files from ``.ts`` files
+ """
+ color = 'BLUE'
+ run_str = '${QT_LRELEASE} ${QT_LRELEASE_FLAGS} ${SRC} -qm ${TGT}'
+
+class qm2rcc(Task.Task):
+ """
+ Generates ``.qrc`` files from ``.qm`` files
+ """
+ color = 'BLUE'
+ after = 'ts2qm'
+ def run(self):
+ """Create a qrc file including the inputs"""
+ txt = '\n'.join(['<file>%s</file>' % k.path_from(self.outputs[0].parent) for k in self.inputs])
+ code = '<!DOCTYPE RCC><RCC version="1.0">\n<qresource>\n%s\n</qresource>\n</RCC>' % txt
+ self.outputs[0].write(code)
+
+def configure(self):
+ """
+ Besides the configuration options, the environment variable QT5_ROOT may be used
+ to give the location of the qt5 libraries (absolute path).
+
+ The detection uses the program ``pkg-config`` through :py:func:`waflib.Tools.config_c.check_cfg`
+ """
+ if 'COMPILER_CXX' not in self.env:
+ self.fatal('No CXX compiler defined: did you forget to configure compiler_cxx first?')
+
+ self.find_qt5_binaries()
+ self.set_qt5_libs_dir()
+ self.set_qt5_libs_to_check()
+ self.set_qt5_defines()
+ self.find_qt5_libraries()
+ self.add_qt5_rpath()
+ self.simplify_qt5_libs()
+
+ # warn about this during the configuration too
+ if not has_xml:
+ Logs.error('No xml.sax support was found, rcc dependencies will be incomplete!')
+
+ # Qt5 may be compiled with '-reduce-relocations' which requires dependent programs to have -fPIE or -fPIC?
+ frag = '#include <QMap>\nint main(int argc, char **argv) {QMap<int,int> m;return m.keys().size();}\n'
+ uses = 'QT5CORE'
+ for flag in [[], '-fPIE', '-fPIC', '-std=c++11' , ['-std=c++11', '-fPIE'], ['-std=c++11', '-fPIC']]:
+ msg = 'See if Qt files compile '
+ if flag:
+ msg += 'with %s' % flag
+ try:
+ self.check(features='qt5 cxx', use=uses, uselib_store='qt5', cxxflags=flag, fragment=frag, msg=msg)
+ except self.errors.ConfigurationError:
+ pass
+ else:
+ break
+ else:
+ self.fatal('Could not build a simple Qt application')
+
+ # FreeBSD does not add /usr/local/lib and the pkg-config files do not provide it either :-/
+ if Utils.unversioned_sys_platform() == 'freebsd':
+ frag = '#include <QMap>\nint main(int argc, char **argv) {QMap<int,int> m;return m.keys().size();}\n'
+ try:
+ self.check(features='qt5 cxx cxxprogram', use=uses, fragment=frag, msg='Can we link Qt programs on FreeBSD directly?')
+ except self.errors.ConfigurationError:
+ self.check(features='qt5 cxx cxxprogram', use=uses, uselib_store='qt5', libpath='/usr/local/lib', fragment=frag, msg='Is /usr/local/lib required?')
+
+@conf
+def find_qt5_binaries(self):
+ """
+ Detects Qt programs such as qmake, moc, uic, lrelease
+ """
+ env = self.env
+ opt = Options.options
+
+ qtdir = getattr(opt, 'qtdir', '')
+ qtbin = getattr(opt, 'qtbin', '')
+
+ paths = []
+
+ if qtdir:
+ qtbin = os.path.join(qtdir, 'bin')
+
+ # the qt directory has been given from QT5_ROOT - deduce the qt binary path
+ if not qtdir:
+ qtdir = self.environ.get('QT5_ROOT', '')
+ qtbin = self.environ.get('QT5_BIN') or os.path.join(qtdir, 'bin')
+
+ if qtbin:
+ paths = [qtbin]
+
+ # no qtdir, look in the path and in /usr/local/Trolltech
+ if not qtdir:
+ paths = self.environ.get('PATH', '').split(os.pathsep)
+ paths.extend(['/usr/share/qt5/bin', '/usr/local/lib/qt5/bin'])
+ try:
+ lst = Utils.listdir('/usr/local/Trolltech/')
+ except OSError:
+ pass
+ else:
+ if lst:
+ lst.sort()
+ lst.reverse()
+
+ # keep the highest version
+ qtdir = '/usr/local/Trolltech/%s/' % lst[0]
+ qtbin = os.path.join(qtdir, 'bin')
+ paths.append(qtbin)
+
+ # at the end, try to find qmake in the paths given
+ # keep the one with the highest version
+ cand = None
+ prev_ver = ['5', '0', '0']
+ for qmk in ('qmake-qt5', 'qmake5', 'qmake'):
+ try:
+ qmake = self.find_program(qmk, path_list=paths)
+ except self.errors.ConfigurationError:
+ pass
+ else:
+ try:
+ version = self.cmd_and_log(qmake + ['-query', 'QT_VERSION']).strip()
+ except self.errors.WafError:
+ pass
+ else:
+ if version:
+ new_ver = version.split('.')
+ if new_ver > prev_ver:
+ cand = qmake
+ prev_ver = new_ver
+
+ # qmake could not be found easily, rely on qtchooser
+ if not cand:
+ try:
+ self.find_program('qtchooser')
+ except self.errors.ConfigurationError:
+ pass
+ else:
+ cmd = self.env.QTCHOOSER + ['-qt=5', '-run-tool=qmake']
+ try:
+ version = self.cmd_and_log(cmd + ['-query', 'QT_VERSION'])
+ except self.errors.WafError:
+ pass
+ else:
+ cand = cmd
+
+ if cand:
+ self.env.QMAKE = cand
+ else:
+ self.fatal('Could not find qmake for qt5')
+
+ self.env.QT_HOST_BINS = qtbin = self.cmd_and_log(self.env.QMAKE + ['-query', 'QT_HOST_BINS']).strip()
+ paths.insert(0, qtbin)
+
+ def find_bin(lst, var):
+ if var in env:
+ return
+ for f in lst:
+ try:
+ ret = self.find_program(f, path_list=paths)
+ except self.errors.ConfigurationError:
+ pass
+ else:
+ env[var]=ret
+ break
+
+ find_bin(['uic-qt5', 'uic'], 'QT_UIC')
+ if not env.QT_UIC:
+ self.fatal('cannot find the uic compiler for qt5')
+
+ self.start_msg('Checking for uic version')
+ uicver = self.cmd_and_log(env.QT_UIC + ['-version'], output=Context.BOTH)
+ uicver = ''.join(uicver).strip()
+ uicver = uicver.replace('Qt User Interface Compiler ','').replace('User Interface Compiler for Qt', '')
+ self.end_msg(uicver)
+ if uicver.find(' 3.') != -1 or uicver.find(' 4.') != -1:
+ self.fatal('this uic compiler is for qt3 or qt4, add uic for qt5 to your path')
+
+ find_bin(['moc-qt5', 'moc'], 'QT_MOC')
+ find_bin(['rcc-qt5', 'rcc'], 'QT_RCC')
+ find_bin(['lrelease-qt5', 'lrelease'], 'QT_LRELEASE')
+ find_bin(['lupdate-qt5', 'lupdate'], 'QT_LUPDATE')
+
+ env.UIC_ST = '%s -o %s'
+ env.MOC_ST = '-o'
+ env.ui_PATTERN = 'ui_%s.h'
+ env.QT_LRELEASE_FLAGS = ['-silent']
+ env.MOCCPPPATH_ST = '-I%s'
+ env.MOCDEFINES_ST = '-D%s'
+
+@conf
+def set_qt5_libs_dir(self):
+ env = self.env
+ qtlibs = getattr(Options.options, 'qtlibs', None) or self.environ.get('QT5_LIBDIR')
+ if not qtlibs:
+ try:
+ qtlibs = self.cmd_and_log(env.QMAKE + ['-query', 'QT_INSTALL_LIBS']).strip()
+ except Errors.WafError:
+ qtdir = self.cmd_and_log(env.QMAKE + ['-query', 'QT_INSTALL_PREFIX']).strip()
+ qtlibs = os.path.join(qtdir, 'lib')
+ self.msg('Found the Qt5 library path', qtlibs)
+ env.QTLIBS = qtlibs
+
+@conf
+def find_single_qt5_lib(self, name, uselib, qtlibs, qtincludes, force_static):
+ env = self.env
+ if force_static:
+ exts = ('.a', '.lib')
+ prefix = 'STLIB'
+ else:
+ exts = ('.so', '.lib')
+ prefix = 'LIB'
+
+ def lib_names():
+ for x in exts:
+ for k in ('', '5') if Utils.is_win32 else ['']:
+ for p in ('lib', ''):
+ yield (p, name, k, x)
+
+ for tup in lib_names():
+ k = ''.join(tup)
+ path = os.path.join(qtlibs, k)
+ if os.path.exists(path):
+ if env.DEST_OS == 'win32':
+ libval = ''.join(tup[:-1])
+ else:
+ libval = name
+ env.append_unique(prefix + '_' + uselib, libval)
+ env.append_unique('%sPATH_%s' % (prefix, uselib), qtlibs)
+ env.append_unique('INCLUDES_' + uselib, qtincludes)
+ env.append_unique('INCLUDES_' + uselib, os.path.join(qtincludes, name.replace('Qt5', 'Qt')))
+ return k
+ return False
+
+@conf
+def find_qt5_libraries(self):
+ env = self.env
+
+ qtincludes = self.environ.get('QT5_INCLUDES') or self.cmd_and_log(env.QMAKE + ['-query', 'QT_INSTALL_HEADERS']).strip()
+ force_static = self.environ.get('QT5_FORCE_STATIC')
+ try:
+ if self.environ.get('QT5_XCOMPILE'):
+ self.fatal('QT5_XCOMPILE Disables pkg-config detection')
+ self.check_cfg(atleast_pkgconfig_version='0.1')
+ except self.errors.ConfigurationError:
+ for i in self.qt5_vars:
+ uselib = i.upper()
+ if Utils.unversioned_sys_platform() == 'darwin':
+ # Since at least qt 4.7.3 each library locates in separate directory
+ fwk = i.replace('Qt5', 'Qt')
+ frameworkName = fwk + '.framework'
+
+ qtDynamicLib = os.path.join(env.QTLIBS, frameworkName, fwk)
+ if os.path.exists(qtDynamicLib):
+ env.append_unique('FRAMEWORK_' + uselib, fwk)
+ env.append_unique('FRAMEWORKPATH_' + uselib, env.QTLIBS)
+ self.msg('Checking for %s' % i, qtDynamicLib, 'GREEN')
+ else:
+ self.msg('Checking for %s' % i, False, 'YELLOW')
+ env.append_unique('INCLUDES_' + uselib, os.path.join(env.QTLIBS, frameworkName, 'Headers'))
+ else:
+ ret = self.find_single_qt5_lib(i, uselib, env.QTLIBS, qtincludes, force_static)
+ if not force_static and not ret:
+ ret = self.find_single_qt5_lib(i, uselib, env.QTLIBS, qtincludes, True)
+ self.msg('Checking for %s' % i, ret, 'GREEN' if ret else 'YELLOW')
+ else:
+ path = '%s:%s:%s/pkgconfig:/usr/lib/qt5/lib/pkgconfig:/opt/qt5/lib/pkgconfig:/usr/lib/qt5/lib:/opt/qt5/lib' % (
+ self.environ.get('PKG_CONFIG_PATH', ''), env.QTLIBS, env.QTLIBS)
+ for i in self.qt5_vars:
+ self.check_cfg(package=i, args='--cflags --libs', mandatory=False, force_static=force_static, pkg_config_path=path)
+
+@conf
+def simplify_qt5_libs(self):
+ """
+ Since library paths make really long command-lines,
+ and since everything depends on qtcore, remove the qtcore ones from qtgui, etc
+ """
+ env = self.env
+ def process_lib(vars_, coreval):
+ for d in vars_:
+ var = d.upper()
+ if var == 'QTCORE':
+ continue
+
+ value = env['LIBPATH_'+var]
+ if value:
+ core = env[coreval]
+ accu = []
+ for lib in value:
+ if lib in core:
+ continue
+ accu.append(lib)
+ env['LIBPATH_'+var] = accu
+ process_lib(self.qt5_vars, 'LIBPATH_QTCORE')
+
+@conf
+def add_qt5_rpath(self):
+ """
+ Defines rpath entries for Qt libraries
+ """
+ env = self.env
+ if getattr(Options.options, 'want_rpath', False):
+ def process_rpath(vars_, coreval):
+ for d in vars_:
+ var = d.upper()
+ value = env['LIBPATH_' + var]
+ if value:
+ core = env[coreval]
+ accu = []
+ for lib in value:
+ if var != 'QTCORE':
+ if lib in core:
+ continue
+ accu.append('-Wl,--rpath='+lib)
+ env['RPATH_' + var] = accu
+ process_rpath(self.qt5_vars, 'LIBPATH_QTCORE')
+
+@conf
+def set_qt5_libs_to_check(self):
+ self.qt5_vars = Utils.to_list(getattr(self, 'qt5_vars', []))
+ if not self.qt5_vars:
+ dirlst = Utils.listdir(self.env.QTLIBS)
+
+ pat = self.env.cxxshlib_PATTERN
+ if Utils.is_win32:
+ pat = pat.replace('.dll', '.lib')
+ if self.environ.get('QT5_FORCE_STATIC'):
+ pat = self.env.cxxstlib_PATTERN
+ if Utils.unversioned_sys_platform() == 'darwin':
+ pat = r"%s\.framework"
+ re_qt = re.compile(pat%'Qt5?(?P<name>.*)'+'$')
+ for x in dirlst:
+ m = re_qt.match(x)
+ if m:
+ self.qt5_vars.append("Qt5%s" % m.group('name'))
+ if not self.qt5_vars:
+ self.fatal('cannot find any Qt5 library (%r)' % self.env.QTLIBS)
+
+ qtextralibs = getattr(Options.options, 'qtextralibs', None)
+ if qtextralibs:
+ self.qt5_vars.extend(qtextralibs.split(','))
+
+@conf
+def set_qt5_defines(self):
+ if sys.platform != 'win32':
+ return
+ for x in self.qt5_vars:
+ y=x.replace('Qt5', 'Qt')[2:].upper()
+ self.env.append_unique('DEFINES_%s' % x.upper(), 'QT_%s_LIB' % y)
+
+def options(opt):
+ """
+ Command-line options
+ """
+ opt.add_option('--want-rpath', action='store_true', default=False, dest='want_rpath', help='enable the rpath for qt libraries')
+ for i in 'qtdir qtbin qtlibs'.split():
+ opt.add_option('--'+i, type='string', default='', dest=i)
+
+ opt.add_option('--translate', action='store_true', help='collect translation strings', dest='trans_qt5', default=False)
+ opt.add_option('--qtextralibs', type='string', default='', dest='qtextralibs', help='additional qt libraries on the system to add to default ones, comma separated')
+
diff --git a/wscript b/wscript
index ab4a0c8..e65a6ba 100644
--- a/wscript
+++ b/wscript
@@ -7,10 +7,10 @@
def options(opt):
- opt.load(['compiler_c', 'compiler_cxx', 'qt4', 'gnu_dirs'])
+ opt.load(['compiler_c', 'compiler_cxx', 'qt5', 'gnu_dirs'])
opt.load(['default-compiler-flags', 'boost', 'protoc',
- 'doxygen', 'sphinx_build'],
+ 'doxygen', 'sphinx_build', 'qt5', 'cryptopp'],
tooldir=['waf-tools'])
opt = opt.add_option_group('ChronotChat Options')
@@ -22,9 +22,9 @@
help='''Enable log4cxx''')
def configure(conf):
- conf.load(['compiler_c', 'compiler_cxx', 'qt4',
+ conf.load(['compiler_c', 'compiler_cxx', 'qt5',
'default-compiler-flags', 'boost', 'protoc', 'gnu_dirs',
- 'doxygen', 'sphinx_build'])
+ 'doxygen', 'sphinx_build', 'cryptopp'])
conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
uselib_store='NDN_CXX', mandatory=True)
@@ -50,10 +50,11 @@
" (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
return
+ conf.check_cryptopp()
conf.write_config_header('src/config.h')
def build (bld):
- feature_list = 'qt4 cxx'
+ feature_list = 'qt5 cxx'
if bld.env["WITH_TESTS"]:
feature_list += ' cxxstlib'
else:
@@ -65,7 +66,7 @@
defines = "WAF=1",
source = bld.path.ant_glob(['src/*.cpp', 'src/*.ui', '*.qrc', 'logging.cc', 'src/*.proto']),
includes = "src .",
- use = "QTCORE QTGUI QTWIDGETS QTSQL NDN_CXX BOOST LOG4CXX SYNC",
+ use = "QT5CORE QT5GUI QT5WIDGETS QT5SQL NDN_CXX BOOST LOG4CXX SYNC CRYPTOPP",
)
# Unit tests
@@ -77,7 +78,6 @@
use = 'BOOST ChronoChat',
includes = "src .",
install_path = None,
- defines = 'TEST_CERT_PATH=\"%s/cert-test\"' %(bld.bldnode),
)
# Debug tools