From a5877dde7a8b108aca3683aca78177ed418089cd Mon Sep 17 00:00:00 2001 From: <> Date: Mon, 23 Oct 2023 19:15:34 +0000 Subject: [PATCH] Deployed 0de12d9 with MkDocs version: 1.5.3 --- .nojekyll | 0 404.html | 998 +++ API/Python/index.html | 1134 +++ API/PythonDB/index.html | 1452 ++++ API/REST/index.html | 1458 ++++ Dev/bootstrapsh/index.html | 1089 +++ Dev/changefile/index.html | 1206 +++ Dev/chroots/index.html | 1141 +++ Dev/coding/index.html | 1198 +++ Dev/dataflow.png | Bin 0 -> 243058 bytes Dev/dataflow/index.html | 1238 +++ Dev/debugging/index.html | 1200 +++ Dev/engine/index.html | 1098 +++ Dev/install-with-docker/index.html | 1125 +++ Dev/install/index.html | 1069 +++ Dev/osmstats/index.html | 1593 ++++ Dev/replication/index.html | 1071 +++ Dev/replicator/index.html | 1046 +++ Dev/statistics/index.html | 1463 ++++ Dev/stats-test/index.html | 1161 +++ Dev/utility/index.html | 1312 ++++ Dev/validation/index.html | 1217 +++ Doxyfile.in | 2561 +++++++ Makefile.am | 27 + UI/Install/index.html | 1137 +++ UI/UnderpassFeatureList/index.html | 1091 +++ UI/UnderpassMap/index.html | 1091 +++ assets/_mkdocstrings.css | 0 assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.aecac24b.min.js | 29 + assets/javascripts/bundle.aecac24b.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.f886a092.min.js | 42 + .../workers/search.f886a092.min.js.map | 7 + assets/stylesheets/main.35e1ed30.min.css | 1 + assets/stylesheets/main.35e1ed30.min.css.map | 1 + assets/stylesheets/palette.356b1318.min.css | 1 + .../stylesheets/palette.356b1318.min.css.map | 1 + css/extra.css | 9 + get-started/Build/index.html | 1163 +++ get-started/Install/index.html | 1133 +++ get-started/NextSteps/index.html | 1090 +++ get-started/Run/index.html | 1071 +++ get-started/Setup/index.html | 1100 +++ img/demo1.png | Bin 0 -> 1033505 bytes img/list.png | Bin 0 -> 218872 bytes img/map.png | Bin 0 -> 480555 bytes index.html | 1114 +++ search/search_index.json | 1 + sitemap.xml | 143 + sitemap.xml.gz | Bin 0 -> 418 bytes 84 files changed, 44290 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 API/Python/index.html create mode 100644 API/PythonDB/index.html create mode 100644 API/REST/index.html create mode 100644 Dev/bootstrapsh/index.html create mode 100644 Dev/changefile/index.html create mode 100644 Dev/chroots/index.html create mode 100644 Dev/coding/index.html create mode 100644 Dev/dataflow.png create mode 100644 Dev/dataflow/index.html create mode 100644 Dev/debugging/index.html create mode 100644 Dev/engine/index.html create mode 100644 Dev/install-with-docker/index.html create mode 100644 Dev/install/index.html create mode 100644 Dev/osmstats/index.html create mode 100644 Dev/replication/index.html create mode 100644 Dev/replicator/index.html create mode 100644 Dev/statistics/index.html create mode 100644 Dev/stats-test/index.html create mode 100644 Dev/utility/index.html create mode 100644 Dev/validation/index.html create mode 100644 Doxyfile.in create mode 100644 Makefile.am create mode 100644 UI/Install/index.html create mode 100644 UI/UnderpassFeatureList/index.html create mode 100644 UI/UnderpassMap/index.html create mode 100644 assets/_mkdocstrings.css create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.aecac24b.min.js create mode 100644 assets/javascripts/bundle.aecac24b.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.f886a092.min.js create mode 100644 assets/javascripts/workers/search.f886a092.min.js.map create mode 100644 assets/stylesheets/main.35e1ed30.min.css create mode 100644 assets/stylesheets/main.35e1ed30.min.css.map create mode 100644 assets/stylesheets/palette.356b1318.min.css create mode 100644 assets/stylesheets/palette.356b1318.min.css.map create mode 100644 css/extra.css create mode 100644 get-started/Build/index.html create mode 100644 get-started/Install/index.html create mode 100644 get-started/NextSteps/index.html create mode 100644 get-started/Run/index.html create mode 100644 get-started/Setup/index.html create mode 100644 img/demo1.png create mode 100644 img/list.png create mode 100644 img/map.png create mode 100644 index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..ab8d6e7a --- /dev/null +++ b/404.html @@ -0,0 +1,998 @@ + + + +
+ + + + + + + + + + + + + + + + + import underpass as u
+
with open("building.osc", 'r') as file:
+ data = file.read().rstrip()
+
+ validator = u.Validate()
+ result = validator.checkOsmChange(data, "building")
+
from api.db import UnderpassDB`
+db = UnderpassDB("postgresql://localhost/underpass")
+db.connect()
+
from api import raw
+rawer = raw.Raw(db)
+
polygons = rawer.getPolygons(
+ area = "-180 90,180 90, 180 -90, -180 -90,-180 90",
+ tags = "building=yes",
+ hashtag = "",
+ dateFrom = "",
+ dateTo = "",
+ page = 0
+)
+
lines = rawer.getLines(
+ area = "-180 90,180 90, 180 -90, -180 -90,-180 90",
+ tags = "highway",
+ hashtag = "",
+ dateFrom = "",
+ dateTo = "",
+ page = 0
+)
+
nodes = rawer.getNodes(
+ area = "-180 90,180 90, 180 -90, -180 -90,-180 90",
+ tags = "amenity",
+ hashtag = "",
+ dateFrom = "",
+ dateTo = "",
+ page = 0
+)
+
nodes = rawer.getAll(
+ area = "-180 90,180 90, 180 -90, -180 -90,-180 90",
+ tags = "building",
+ hashtag = "",
+ dateFrom = "",
+ dateTo = "",
+ page = 0
+)
+
polygons = rawer.getPolygonsList(
+ area = "-180 90,180 90, 180 -90, -180 -90,-180 90",
+ tags = "building",
+ hashtag = "",
+ dateFrom = "",
+ dateTo = "",
+ page = 0
+)
+
lines = rawer.getLinesList(
+ area = "-180 90,180 90, 180 -90, -180 -90,-180 90",
+ tags = "building",
+ hashtag = "",
+ dateFrom = "",
+ dateTo = "",
+ page = 0
+)
+
nodes = rawer.getNodesList(
+ area = "-180 90,180 90, 180 -90, -180 -90,-180 90",
+ tags = "building",
+ hashtag = "",
+ dateFrom = "",
+ dateTo = "",
+ page = 0
+)
+
all = rawer.getAllList(
+ area = "-180 90,180 90, 180 -90, -180 -90,-180 90",
+ tags = "building",
+ hashtag = "",
+ dateFrom = "",
+ dateTo = "",
+ page = 0
+)
+
from api import report
+reporter = report.Report(db)
+
results = reporter.getDataQualityGeo(
+ fromDate = "2022-12-28T00:00:00",
+ hashtags = ["hotosm"],
+ responseType = "csv"
+)
+
results = reporter.getDataQualityGeoLatest()
+
For getting results in CSV format, instead of GeoJSON
+results = reporter.getDataQualityGeoLatest(
+ responseType = "csv"
+)
+
results = reporter.getDataQualityTag(
+ fromDate = "2022-12-28T00:00:00",
+ hashtags = ["hotosm"],
+ responseType = "csv"
+)
+
results = reporter.getDataQualityTagStats(
+ fromDate = "2022-12-28T00:00:00",
+ hashtags = ["hotosm"],
+ responseType = "csv"
+)
+
cd python/restapi/ && pip install -r requirements.txt
+
Set the database connection string as an environment variable:
+export UNDERPASS_API_DB=postgresql://localhost/underpass
+
uvicorn main:app --reload
+
curl http://localhost:8000/raw/polygons -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"area":"-180 90,180 90, 180 -90, -180 -90,-180 90", "tags": "building=yes"}'
+
curl http://localhost:8000/raw/lines -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"area":"-180 90,180 90, 180 -90, -180 -90,-180 90", "tags": "highway"}'
+
curl http://localhost:8000/raw/nodes -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"area":"-180 90,180 90, 180 -90, -180 -90,-180 90", "tags": "amenity"}'
+
curl http://localhost:8000/raw/all -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"area":"-180 90,180 90, 180 -90, -180 -90,-180 90", "tags": "building"}'
+
curl http://localhost:8000/raw/polygonsList -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"area":"-180 90,180 90, 180 -90, -180 -90,-180 90", "tags": "building=yes"}'
+
curl http://localhost:8000/raw/linesList -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"area":"-180 90,180 90, 180 -90, -180 -90,-180 90", "tags": "highway"}'
+
curl http://localhost:8000/raw/nodesList -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"area":"-180 90,180 90, 180 -90, -180 -90,-180 90", "tags": "amenity"}'
+
curl http://localhost:8000/raw/allList -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"area":"-180 90,180 90, 180 -90, -180 -90,-180 90", "tags": "building"}'
+
curl http://localhost:8000/report/dataQualityGeo -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"fromDate":"2022-12-28T00:00:00", "hashtags": "hotosm"}'
+
In CSV format instead of GeoJSON:
+curl http://localhost:8000/report/dataQualityGeo/csv -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"fromDate":"2022-12-28T00:00:00", "hashtags": "hotosm"}'
+
curl http://localhost:8000/report/dataQualityTags -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"fromDate":"2022-12-28T00:00:00", "hashtags": "hotosm"}'
+
curl http://localhost:8000/report/dataQualityTagStats -X POST \
+ -H 'content-type: application/json' \
+ --data-raw '{"fromDate":"2022-12-28T00:00:00", "hashtags": "hotosm"}'
+
This script is prepared for a quick bootstrap of the Underpass database.
+## Quick start
+
+Run the script passing region, country and DB username as arguments, for example:
+
+```sh
+./bootstrap.sh -r south-america -c ecuador -l yes
+
This will:
+-r region (Region for bootstrapping)
+ africa, asia, australia, central-america
+ europe, north-america or south-america
+-c country (Country inside the region)
+-h host (Database host)
+-u user (Database user)
+-p port (Database port)
+-d database (Database name)
+-l yes (Use local files instead of download them)
+
Use the -l yes
when you have your .pbf and .poly files already downloaded and
+you don't want to download them again. The script will look for those files
+using the -r
and -c
arguments, for example
./bootstrap.sh -r south-america -c ecuador -u underpass -l yes
+
Will look for these files:
+ecuador-latests.osm.pbf
+ecuador.poly
+
There are two types of data files related to changes in the map +data. These files contain all the changes made during a time interval, +every minute, hour, or daily data files are available from the +OpenStreetMap planet +server.
+There are two different formats of change data, one for changesets, +and the other for the actual changes. Both are needed for filtering +changes to produce statistics.
+A changeset file contains only the data about the change, and not the +actual change itself. It contains the data of the change at the time +it's uploaded to OpenStreetMap. Each change has an action; create, +delete, modify. Each action then contains the changed objects in the +action. As this file contains the data created when uploading it to +OpenStreetMap, it's the only way to access the commit hashtags or +comments.
+Hashtags didn’t exist until late 2014, so between 2014 and 2017, +hashtags were contained in the comment field. In 2017, the official +hashtag tag was added. The first mentions of the hashtags +#missingmaps and #hotosm starts 2017-10-20. A typical changefile +entry looks like this:
+ <changeset id="12345" created_at="2014-10-10T01:57:09Z" closed_at="2014-10-10T01:57:23Z" open="false" user="foo" uid="54321" min_lat="-2.8042325" min_lon="29.5842812" max_lat="-2.7699398" max_lon="29.6012844" num_changes="569" comments_count="0">
+ <tag k="source" v="Bing"/>
+ <tag k="comment" v="#hotosm-task-001 #redcross #missingmaps"/>
+ <tag k="created_by" v="JOSM/1.5 (7182 en)"/>
+ </changeset>
+
The created_by and source fields can be used to generate +statistics of editor choices and imagery sources. Underpass uses only +the comment and hashtag fields currently as a way to group sets of +changes by organization, or mapping campaign.
+And OsmChange file contains the data of the actual change. It uses the +same syntax as an OSM data file plus the addition of one of the three +actions. Nodes, ways, and relations can be created, deleted, or +modified. Multiple OSM object types can be in the same action. As this +data contains the actual change, it is used to filter by tag, or used +to do calculations, like the length of roads added.
+ <modify>
+ <node id="12345" version="7" timestamp="2020-10-30T20:40:38Z" uid="111111" user="foo" changeset="93310152" lat="50.9176152" lon="-1.3751891"/>
+ </modify>
+ <delete>
+ <node id="23456" version="7" timestamp="2020-10-30T20:40:38Z" uid="22222" user="foo" changeset="93310152" lat="50.9176152" lon="-1.3751891"/>
+ </delete>
+ <create>
+ <node id="34567" version="1" timestamp="2020-10-30T20:15:24Z" uid="3333333" user="bar" changeset="93309184" lat="45.4303763" lon="10.9837526"/>\n
+ </create>
+
There are two types of state files, one for changesets and the other +for change files. The changeset one is the simplest, only containing +the last_run timestamp and a changeset sequence number. The first +state file starts 2016-09-07 10:45. An example changeset state file +is:
+\---
+last_run: 2020-10-08 16:41:01.863533000 +00:00
+sequence: 4139643
+
The state file for change files contains more fields, but the only +ones needed for database updates are the timestamp of the data file, +and the sequence number. An example change file state file is:
+#Thu Oct 08 16:38:04 UTC 2020
+sequenceNumber=4229951
+txnMaxQueried=3081409719
+txnActiveList=
+txnReadyList=
+txnMax=3081409719
+timestamp=2020-10-08T16\:38\:02Z
+
As the 3 digit prefix in the state filename matches the data file, +this is used to get the right data that matches that state. Since +the replication files are fetched via HTTP/HTTPS, there is no +timestamp available. To find a specific replication file, a state file +close to the timestamp is downloaded. Then the timestamp in the state +file is checked, and if it matches, the the 3 digit part of the state +file name can be used to find the appropriate replication data file.
+It is desirable to be able to start processing changes starting with a +specific timestamp. This enables the end user to update databases +after a period of downtime. With minute updates, there are many +thousands of files. Since it takes about 10 milliseconds to download a +state.txt file from planet, scanning for files isn't really +practical. Once the proper data file is found, then it's easy to just +download the next data file in sequence.
+Currently, the function PlanetReplicator::findRemotePath
is the one
+responsible for returning the file path from a timestamp. It's using
+a list of of timestamps and sequence numbers stored in a local file
+located in config/replicator/confiplanetreplicator.yaml
for
+calculating the path. This approach must be reviewed in order to
+have better precision without the need of keeping that file up-to-date.
[ THIS DOCUMENT NEEDS REVIEW ]
+To distribute binary packages for a variety of platforms of varying +versions, it's common to use a chroot to build in. This is to make +sure that a the package binary is linked against the right libraries, +which is required so the user doesn't have to build anything from +source. Unlike Docker or Virtualbox, a chroot uses the base running +kernel on host machine, but provides a different set of runtime +libraries and tools.
+All platforms that use the .deb packaging format, like Debian and
+Ubuntu, can use the debbootstrap program to create the
+chroot. Debootstrap lets you pick the architect to support,
+--arch amd64
builds files for the X86_64 platform. after that the
+version of the distribution is specified, followed by the directory to
+install the files in, and finally the URL to download packages
+from. Once done, change to the installation directory, and type sudo
+chroot .
. You'll now be in a minimal runtime environment. The first
+thing I do is create a /etc/debian_chroot
file containing the name
+of the distribution. This puts the this value into the command prompt
+for the shell, which is very useful when you have multiple chroots.
As the chroot program requires one to be root, a utility program +called schroot can be used to fake root. Once the initial chroot is +created, change to the directory containing the downloaded files, and +type these shell commands. Some of the programs used to build packages +need these, which aren't present in the chroot, as they have to be +shared from the host platform.
+mount -t proc proc /proc
+mount --rbind /sys sys/
+mount --rbind /dev dev/
+
Once that initial setup is done, it's time to download more
+packages. The default config file for a chroot is limited to just the
+main repository. Not all of the packages Underpass depends on are in
+main, so add universe to get the rest, and then apt-get
+update
. Your /etc/apt/sources.list
file should now look like this:
deb http://archive.ubuntu.com/ubuntu focal main universe
+
Finally edit ~/.bashrc
and add these three lines at the bottom. One
+specifies the path to a file pkg-config needs, but isn't always
+distributed, so it's included. The other is for locale, so it stops
+clutterin the terminal with warnings.
export PKG_CONFIG_PATH=/home/rob/underpass/m4
+export LANG=C
+export GPG_TTY="$(tty)"
+
To create signed packages, you need a GPG key pair setup, so might
+as well do that now. Type gpg --full-generate-key
, and answer the
+questions. This will only work if you've execute the mount commands as
+documented above.
sudo /usr/sbin/debootstrap --arch amd64 bullseye bullseye/ http://deb.debian.org/debian/
+
Start by installing packages needed to build Underpass.
+sudo apt-get -y install \
+ git gcc g++ pkg-config make debhelper debconf chrpath ccache devscripts gpg \
+ libgdal-dev libosmium2-dev libpq-dev libgumbo-dev \
+ libssl-dev libpq5-dev libxml++2.6-dev libboost-all-dev
+
sudo /usr/sbin/debootstrap --arch amd64 focal focal/ http://archive.ubuntu.com/ubuntu/
+
Start by installing packages needed to build Underpass.
+sudo apt-get -y install \
+ git make gcc g++ pkg-config gpg debhelper debconf devscripts python3-all \
+ libgdal-dev libpq-dev libgumbo-dev openmpi-bin \
+ libxml++2.6-dev ccache libssl-dev libzip-dev libbz2-dev \
+ libboost-all-dev libosmium2-dev osmium-tool \
+ doxygen librange-v3-dev libtool-bin libltdl-dev
+
sudo /usr/sbin/debootstrap --arch amd64 groovy groovy/ http://archive.ubuntu.com/ubuntu/
+
Install dependencies as above. Note that the version of boost is 1.74
+sudo /usr/sbin/debootstrap --arch amd64 hirsute hirsute/ http://archive.ubuntu.com/ubuntu/
+
Install dependencies as above. Note that the version of boost is 1.74
+The version of libpqxx (6.x) that's included in current (Aug 2021) +distribution like Debian Bullseye or Unbuntu Hirsute (21.04) has a bug triggered +by libxml++. Since Underpass uses libxml++ and libpqxx, we have to +build a package of a newer version (7.x). I added Debian packaging +files to a git repository to make this easier, Get that fork here:
+git clone https://github.com/robsavoye/libpqxx.git
+
Once I do that, I run git tag
, and the checkout the latest official
+release branch. There's a configure bug in the libpqxx sources I
+haven't gotten around to fixing yet, so I edit configure.ac
, and
+comment out this one line like so:
dnl AX_CXX_COMPILE_STDCXX_17([noext])
+
Then run ./autogen.sh
, which produces the scripts used for
+configuring. Now that you have the configure
script, configure
+libpqxx like this:
./configure CXX="ccache g++" CXXFLAGS="-std=c++17 -g -O2" --disable-dependency-tracking
+
After that, change to the debian directory, and type make deb -i
+-k
. That'll build the deb packages, and at the end, have you GPG sign
+them. Once built, install the two packages, and you're all set to go
+build Underpass.
The Underpass git repository is at:
+https://github.com/hotosm/underpass.git
+Once downloaded, change to the source directory and run
+./autogen.sh
. Once the configure files have been built, configure
+Underpass like this:
./configure CXX="ccache g++" CXXFLAGS="-std=c++17 -g -O2" --disable-dependency-tracking
+
and then typing make deb -i -k
builds the packages, and has you sign them.
This documents the prefered coding style for Underpass. The goal +of this coding style is to make code consistent amongst developers, +and to write code that is focused on being readable and +compact. Because the existing code is written with this goal, using +reformatting tools like indent or clang-format is discouraged.
+The easy way to follow this style is to use +cc-mode +in Emacs. Spaces will be used instead of TABS, since different systems +or users may have TAB set differently. Indents are 4 spaces, instead +of 8.
+All code will use Doxygen style +comments. Classes and methods should each have a comment so a short +description will be displayed in the output files Doxygen +generates. Each file should also have a brief description.
+For decades lines were limited to 80 charcters or less, which was +based on what a CRT could display. With modern monitors this +limitation doesn't exist. The Linux kernel has been using 132 character +line length, so this project does too.
+Line breaks are used to break up long lines, with the remainder +indented to be clear it's a continuation of the line. Some times a +long line is prefered if adding a line break makes the code less +readable.
+The opening brace for most code is on the same line as the line of +code. Putting an opening brace on a line by itself adds too much +unnecessary whitespace. A closing brace is usually on a line by +itself.
+Some examples:
+namespace replication {
+class StateFile;
+};
+
+class RawChangeset {
+ public:
+ void foo(void);
+};
+
In C++ a conditional with a single line following the test is legal, +but braces should be used to make it clearer.
+if (i == 20) {
+ // do something
+}
+
Underpass uses Camel Case, +which uses capitalization instead of underbars for class definitions, +function or C++ methods, and variable. For example RawChange instead +of raw_change. Class names capitalize the first letter as well, +where the methods in the class start with a lower case letter.
+Names should be descriptive, and when possible, avoid abbrevations +unless they are commonly used.
+ + + + + + +v@P^FlX(G1qSpjLxb5_i2DZ68XUXx2fV|e_loJ z*CS4o|6fG{290xb!uwywgI;d{gUsT3f|&FA-^2?{u%jbn<-d$ah1w5{*>j3Lu&w;h zOZAtqU<4kJ|Ci-_dB>lNp`(K`x?PAP>mQf>Z^1L2thxS|@!)&x!C?gKAE2vl|6z^( ztq}ew?U4WF9pY#NrjxJ@#@LbkzrWxgrvj)N!M}U{hiUw$s-ZqYjAaS-=Sak?Zfro> z+S+)s z!^@RUW)LH=-|7g2MOoe12{9eZT>CSbZ=rQ0E%E1adjzk==TTG7a^dVYH|#-@(R$(c zZ=6D f+@7EKm)pEUT#uKF z#}-@-wD6Pf8Fg<$8v15tuy9#T#6XC+pRKJ+1y~S&ej!Krm_UV=?IlCl;C4!?t*vc$ ze`S4X@7zjOVpHfxneFm5EseNQkp%}A_px5Cs1BX{4*cn #wE UFwSmaX+&$??vBT$gyUWo;&6vclYj* zCF%A=@4AwKL|#sZt)Efp+>Y5o{t#3u1+hMvc>k~sLQ!7KS+~|EtHLS*lx~|>A&BDq z^0IfMf4%?I^Lk1Xx%l$xQ0vm2(jzmdj^4BEy=*GRpjbJ4Bl02H*dR&6uYCD(4{b9` z?)S6Tx-Q4dQ5n3hMKK2{+4SV$TM|;Y)R{z$4o1RlEm!k}8nr(3BFNbFo(+fVValdu ztGN&9ZMpT8GAS$`U@FxnvX5>?oSSx*EKm#ewpn-DtsbiFZ1Hfd@R$Q(>*8nGW@~%{ z3C#Re#?{kf{e4LCV ~z|_;h1ZytA0NdX^V-eI0PUU z#9lXc{sS+%UxG2DNQ?{zs1DT8(b3+<+8Q|b`xI?KuN&01Hh~7;XW<5UeTy&a?Lw4c z@XlYzWl68LT$Gse!_fr1V!OY1-|*3;;A9_U;MnXR`idqDt_|u&=;G+pJ5aH3A0**t z%lK3o4}rRZ5sC@19omu#bd69FOSS3^x pMam!3?QM+Uv^zbc*KW4Q`(YsW4HWh6`=@FXIL3##?kWH;34`?eqX{M# zbbqMms}ySBlZS6BlgQIZJ3eY_uQa$15x}Bkb+(D-Pv14-$T51~)f6bU!dOg~1s16m z7jY-8-#J!2zOEc^qyfL#<+0*5??!63-t&fiHWJavNFI}$FXe&H_eq=odtu?5s(EN+ zag*e^cYh{7iNFx3sbNXdgQh=PCw@fgG*00AR1? V2N3dq?-Z%S=zJW}B zPb+Jl1@YH)23*I_KSr(-3BE_yAF%A} nQ_FfGer#&3iI>Wo-?n?jpOCrj{ZTeXzy9CLcNLm zRI%zCm-YK@Xt&cvB2V#~YVTRaQ*Oi+$}xpj5B7_rB?%~@TFHOf0~)k|XP#+$$3aJe zpxy36;CXeRm_;TL9r|WZuTww^>lD)4UWHBzCy^FIG?i_|S1x_mO#+4JZv9tc8Yz@R zpF0{90lyES{G)DxRwB(OeCNFxb-@;FIt_*P)`LnGx0BB$nzbJ jNIa+F#*we(y{s&Jc^Rk >kgPUc7N#h=83j9jkSZoYD0Zm_OY;|63y>Q_wk%%iiGOd`wU>byFgeaG9Xh zvnFx{NAJYx9ywj4USMPOXf1f2{iosPDg%`o+cEZ3M|P?oA}KbnO;?M!W!(Ehw7!@u zKebX#^ZdpiuYYTYD}ejXm-N8#Vq>BC`1w^eD!m%X`1ttZmIPQgnT)236GTo8Zr`%V zHjFWdW<_aTb=z-YwRk*!7#=%Ef5MrBEmYPD^3)OG{ FH||9QqGBkB2mPdT7TnB4#H_;`A>#M|P1f7O18SLwre)q8iy+k&wZ$T%1k87t%Sg&Z?0 zcK-#>3=hkA508w9E&=ExAYGcm`|hH%_<8TKSiRh!E9i}#gF`?{;hR*BqUbvM{cNYf zvF-$K=dCxZUFi7?-(7Mt0Zaj@#+VV=R7>;TFF$&b>}MubWB8N=4Fc !f zH4>PA?SIkl&_aW1#Uz<%cAdY{vX=pgow=>f%MYWRujdKswxDJugWp|#w>BC~$E{0Y zDFma6*8uPtv2+q$MSVSX{PIGui&U&(zI>LN@K_SPmO_yjiPP~E6n&Z_=?$?Y+QDM; zPE__*YVmPrbd)cNp6)$dnWS6(Rtqb8QKFO^$`e7R+s_Mf91ahTckC8HTSLhazG+{) zL)1=^Ubp8MU_cb1g}Mb%Z@bc$C!K7!J&c>q>x%5~yw)8ed}L^05s820VgPY_F<@dE z!Dc|kKs%&jVV&|5zpzv(jEUSj*3!UYr}w;LRRSb5CJwiGeUJxNbhP#)O4Q)F95VYT z(cpRfT@$a4T09&BfE}o3+anQ+jgH0EjkX2`5OX=EJ)vl^!t(oAmrUQ}EjLHHzjci> zRxJdA <;ctfiyYe1KvyLbL@OOrTU&tq1h}2|Wx5@q|P&hY1 z`Q46a@B@Ur*o?X=YojTw`Sw@CpKf5GuD(dwBp}|NZ=w3jeYhN?nK>haB&01)K${`J zhIjK2=xM!QZrE6V^8!m;x}nQ#bnV)
a5|=Co%5aZM+&g zHu~k`C}fKm+hf%gh*P09Ta>2voO}1CizfiJGHXI8&U<~+3;hP5R#)9xiUQQ);-cMZ z2RQ!kcJ&gJ^$9~FRhkfQtO-MM+OwTO29eBzfp}KDDwEnbd7vQ2f$3@KAR$-#r8(&R z=cN$!a@~!+OI~ JeGRHY+rh zG6noRX$-NruEved_`YGXn|80@$(^$G$Q!7#^04uPHwRU}zv-5S7wF}`{h7oNBo_9z zS0>O68(x9 +&{y0sS<~ z$8M zK6UJLp41HIdsIy5>o6dp&P@4Ld!=ck?C00i)NdLS*;FbGaN*e4&wb&I?FWb4{mIA! zNUs_kf613<14H?NadUq^0@$5~-FLNIKI;jow%a>DYG1512$}ij?s)mK??>tV$#I=% zflezO%!M^}pzBU45H#Cje&rZKYnRsqYrpR&Q=Q(Ttp|XhY&v%5G4v_7^LAC!= M zYB>$9|FT#ovJfbQH=!g%C ZSXzq!5D?+m#8%4*6X@OTUf6Ta5f ~3 z`~lI!0F>qW9gqboJ;c$`wfIRjazv6%P+7{l{JqxedmQx;us_)uH}{LHhYR&Mye^18WKsgMgU{Eq+CPv;T+yxMGq=$G zB_Xk9zw%?&$al}!+l-pU+gB+(&NQj)mRN_^TS%`{S_UC6pMFZ1U4t1z$S-oJ$qvAz zXeq<{Y|#Z6MNL84zcj@EH?7@THmk=)nqT!!dA3wMg+`?T^cRXPZR^VGs7mA4{1&kV zu(V=Ph9!kteNlJ?YPIk(vR@33XWHXPME5i%IXHs;;$jTsgpg0K_G1MVv&G(6%~e4I z3`kgG+PU0oefmK#zYtP=gE_|_1_lNy-4ZHz?4My#wE5jVY~mM7k?em_2tp;;TpkY) z?;am$l{7WhFaAtc)YL>?TAM(=zJ6_Te*R;#jlE690CG~Skt8vyl8x}rHXVxz^Nn=2 zHVXVpcEsDzHcKuNVd15*^ja?X{2my6eSOR;aLaM8l1jw$01+p~Yk#q_dbvMKrB%nK z3)|8W_885?${F^Qc82`d1W`?) TUI8vIO`?YtoQj_e7yBz*-Gx_0E6U z=!@#MZGQyO=FgJ3mX%c2Wmw_-r2t-n{@|kd21hHF#39eaUzs >@Iu)k)sp3o7o^Hfpi+Of-Q2mrMXu4xyJq}L~F09YwB zyxzUH00SVA143GJaOPz(k|ZczxZ}sW-W+7rc6I5k-FH3N{NuPetRIp-$4cf|CnIT+ zz}EGH-{S&mw0_aPdkz|<#XF86iritVMsz~N{c|SECaQ;e`BJB0R=)7wNE$ERuOCP} z`gcRv;9QPRnz0UHy${luKQWOU=xQ>6uwd=_Ks;3W?C!nPTe7@HY8K7>z`{=hw>+bI z4gRKMdPSD3#xjiCR~1N#@?N~er5U!3h1a`#J}4A@)Kk2434)YXR=@h{`?t;&h*iKt zcyvDNn+GD{aRhl}!oIFL>t(>2G~6Gl3`xWg21DN0ZH$-suHVFq$)9f-Z5=j8b^WPU z7isk`EM(pu!w=h*wFvTfI!trj<+po_MUV8@uju~R5Z5|ht>yS)#XShNit4( N$6YKqcK!M9<$_#j1}Zak(hS$Xwn^$+ z 20iR!P{^bT015$f=8gsCXMSi#2gjB(TPT&5xE zoE3=+c=i^AbJEOjLiiZFf}8RO{7z`IWza~e8>=}LgRk$zPGEaOL55j2*IG^o6rMg; zSV;XAH0iH34KKQ~xp5^*ts_J&-18~Y!X3hvgL@nPV!5aHToKR~gVfe8q#!4nC8Qr! z%>3p5e1W!iI#z0pT-=@U#K&UzM6{`)0xM8;_7OAOa4hLoGJz_tNnIP!ORan 4oi5kYyQuKD<9TFHABhd-Kj?{t-;3LAK?Jr$M>96sPa&nHF%Nz^2_V1 zoq?yDVK+Fh&m uS@XNX_XX(o&q!!_|pu5|3H8rR9)| zKcy dv)UCe+_%-zdaO#Gs+*uxfH=fT<6l|3XLnQC-aD?4@R~4|d z!pih4Ld#ibf%s>~Y^OX21_A>mhC8xYlZ(#J#`>mN724&*Yl+lWtF0gLr!c<90rc?^ zsl;~=i-nW1Stx;N{Evn^KiV%W1j1KM`xY^A*bJI{N&v5{!Q`1cA0x9$79tYwKZu7$ zJb3Ge7!ou|i)1LOOS{AWF`hydwVEkhbhP~ZbmKYpR~K6e=}l^f=~7>-+49x-=7p>6 zk$r5P8UJtQ6wc UJ2+c=ghjJz4G^cP9? 0Yuo0qLUw*f`w>8PS`H%HV zkK%B;lRPbX2w8s7T+qnxEpM;+K!g@<7LlG`V4aL+!D)MBb>n$Og^0s}nO09UbxiAt zIg-kva{QR9Ln|6;UY%?>cs2si!QYXGJO>E5d?SxaL(s7qcydzUtPwrwq{!x!i_^aL z=lf>WX(p1)NaH_?=V#_zZtSbei3WNkUV7uoT%tL$wZ84X#?6 K9Nm`AyQL$+6^un|B|?B z`6B%x&55hRFm8V4sRiCG@GYiRxZhzZ51ZF#(;7=1J?o)W>w$ulZ1s6z_S_7 zM=n(`eSX{O>4Vnlg^0~PD_?41tk@{>#%R#M+KpzQPJdN7-vruf!CfOGS@4%0f3vVP zr!6nsKF5*b0?0U<=ENOf8L>EwFI{SH8wr!>aEh X^UD^UA!N zRnK5S9Iip_WBNK#mMlD)F|-iN_UWzj?#O<9!E^!Ti*LbvQe@q)TH z8=E{xJUe;r%>U?fX)lI$>M+^-TDiMbhE)f`wU#@dlV!=w(Pn+ac(qHYVx@e?*i5rK zaf2L@#_Zp9HqpzFmbXQvX0z-Sl*#(s*7r{t-jd0q9~ZWG{NdQlma*@VGdqJ3uwwy6 z6zXisOXjt}AhrT 7G1iSmZz2D`mmrm#}(C@_?o! zjrGfX>6D>uv^2izPbNYBZaPQRE oRonT5VzHam-87_@U;V|R_F66vEaJb0vl5;((~Nh*z!#^YG#Zc9T!IvO1$`c zcK`~hG 7VWx+;lDT8M6K}%lVLYcypP3?3j#yN z3INwJC3u%p4(Gk~R(Dl7#{$=Cg-bngBP)n(JXh7%YO#fgR=q3;A12}Tx&)zz7hXj4 z_;MtTlgnWf4w;b8k1PabZLfBJUBb}U`I;`JWO`h|-N9JgWC3yDy#Vg7d^KTtqwU35 zQK>EJ88FNt%x;kCq`_{O!Lc whB|`D-~j)zBKZa! zKvW%ssH2=q<82GJ9w@}E3KdA)e8~sq-|0dAV{FWn!)4x-6%t;XRSu_On-yb0*;|?g z-nhDSnVeVvc2K%!!FRhNJ_+%4CXN(j$GaHcN6e9o?XC)m%E*Y~!O{erAZOamj$nh+ zB^Iz}A?IwY+rA$*M`!EC>s{Qjk#!RaoEdGvs8;qdGc}xDc)>NduwPo5$Pq^BE@=rN z>zJgL<@&S~<0M%hUFg#o#h=p*>W|cH4X>$EDRI@$Kc;efZ3b86EB9ySOrb1mwtg>t zP9G +u-wfsVo&%eB~8IhE38NE{>xO z$@m)5E%zAuP&&fpw25CdbrgiqKU<(*)K=Tp;PnW0N_OLPYS>WMav_k1;+jXmsvU#F z3hVoD>n?z)H%4~%z+AQX{B$ii9bqv&Pe8I=%UrV4 z28YaVe2oVeMEeW%Pj903c*QJNs~so#CRlS5n%W=GHCJ=89&9%rn^6o#Q+T<2PeEVf zcTimpkROnTChHk&gzK#8NIY(|`6{t)d-=HLzm#i`EjIiqa`DBRN6G;?qwDVwV9;IO zhM3~oBw#zP4~T>0Za=d9^6bR9`gk|rA)!k5gfHlhX324&*1gMr pbjWG0fh0FX5d!B$@wki)c~>`C9)|}oJH&?3MR&|| z5fWG1DFCwt83GHcWdUoU^ne_6ci(2zj>v468y_0_COe8vo_vo&L?%Bmc8;VYP>bw- z{ySuM&C#o!>?77#`D|xY5D9UJwAF+S)59YqD)II)wOR=r2$>)n21&rz^eqS~>&t8L z<$HV}yi|NB+d{Q2Rx1sf+*7r)cUI?jDGF^A0oW-2B7=;dzxcwBZyI^HD?N=opuF2i zeQX}-L8ki*AoIy2ydBOLqGaACw01345ACun&T%Xq9eluFG@sdaVxG7=9e30ko$n;> zywB_$evs(G_#_``rS{<1zCtGPEDe%q&czyFqh&5JXtjz^J)CTQTpvt~hG5?eEc2cB zR^!6(%{$NEUFBI1q)t wqKDW4`?ZH) zNx##I%bFd+^H}O1 _s?&TFK-NFHLDVlR3<@90;^bw>)JD)-F_lcq%XX1!u)MXA z$G1a7yMaQPtNEB(iyI19{URN1%7lZ& D4GV| zrkjS8+V14!6IZCzQLXrB4EhWoBluH!9KEkKe*=&RA6%O|0*KTV>6wjAQ6fIC&A?B} zFx>)L6r~?)lN=vZO6G)75Nj%gG7$-HfFujzU}-pXqwa!zV-*3XZL_cPD%p XGqCVP*l@ldO5FSHf UbVRG}VqZ6w2@CT2fJ8-e4 zWHJ6&Ubg=d+=d_P8zto-_(<$$?StUF1lk_>Vw8>c^ivwBSD()k_vW}%5lyMv<0mPQ z#WGU20{MpPG9;Lk5cS-*=B*QG)v+A6hsB>B4jwU~!gya>7Gh+eEb11Ne0{bhJ)FUd z?JJiONh$w0USjWDV|l9_`@OpDyNB*wB7}f|kEE%(RJ-Ptmwj^+ndBJyq0z~$Cn#LM zxi4xDnz3ABAfdQP4bc#E-4RNnbKz~>ZI_9C7~<>xV)%F5-dK+k;O*C(v^3)Jx)R+V z`HumdjHJ2F2T!(vWpMNl*B?^Z3hkt!lo}(v2;n~>kOzcdgU86j;$}0|bVwkVs _oBpC|RK%CD4U_y!J{$PqvOgP@_TTQJg1Z z4pJ0t&M`i(@H`&SM^6qvJL5gxxrW&2i;;MKdW@q|%;vg%uwr{HrvBDp3RtTw`ZhDm z#RmJYqydCpcSIg8*8aLWX=FM)#f(LP!8!7uyEcPyZtt}pVO&00Ral&gVbG?k6L`{Z z*W4KH3F0vRG>>?&U(~rM8wd5W;+se(#fg?r7b=2N)60-NTi*HB69_FZkkt%L)Ec5c zup2haqtKt+I`%0c5^{?&GIDNu2_Wo5hhzGW`HPw=)E@09NT;EHsB;Y4Xy2W3tXWi% z*5LOdMZe+mdBFHntu|8>u%_S!lm}#cUAhd!3LwFUHv0M4Xi8`K_A#}jaMhu}gu6SF zYThBIN6wwA|LNV-=Buht1W@e2GQa7lo@gnE|FY3z^LleM(Yna%yOONvVJkT#9_})~ z_Z|N2nUTcw&%E($^C(pRvD#|9IO*XD%y|~)Z5G6L%=|sn)^bFLJu?I$r^?j=^9&s2 z8F|<9ziW56nyv^VS{kdvxI3$gg=hd2F6?o`bTaX0eHw({=D74@Nu$aDVKlutyvhKX z4p$Q9xD#txwB79}hQvU(650T67%1WSywN8s2^4C$C7 Ai#(~L6bb3v; z{=5imW}gej-NiCyB^*3&eR?{=B?yPI3@`F`e_E+(?gxoFST*yzqteReNxTmm>{@OZ zH!Sz>hk9ZP37VdN99!Z!JY^sxr`PIuTi+OZnfZ?uvZ`OWd(}kLc=mw^1=P!yKYafs zTl*vI^Y;Mw+_LbstPfErJlg3qo?Dh4Hv@Q1N8BGSCC6 z04Ug9wf=w;i7Za92x^1N=n{3b!mRAI|2^T2QC^F1+} z-kJv%#_g;HQI)6OG89Pq=?5!+rg|U4n9d4MFwX&pcB3s=|AyPqC{A324#)rqgRE2o z@RP@!uD1!_OQmWEGKdyxi~GQz@gFg48~w~2!SW5wl+qj{o>M-!$}2rs%NgozkII+N zH0<7P)o6DoLMGsj=m|s5ao X*W^a> z>S}aczoZGFpYS+s#1`tTV@DXsX6T>MU0gWy?ARmvYW&jDuz4=uMRiMziM#E$|3HyQ zj*b#Vyq+%XH)GcR)sCji7!rWT+QRz+(`oQDSI>_Q?@`Zh%tUi~K^+nxgglyhWcFcr z hsnpVx%)IKo9>&eUM;{wO9Lt&G znSDI&T-py2#|kInKEC@Ax&n-PFi?Vd$3yz3McfHW_n@&MLIEDd^yOH`<0;#DJcr+H zd&tJ)-)u0aFwf7wrlg4tIu5SE70(<-nvOwMxDR2e6ey5<+%qPB&He)!l9$4uFU#lK zBckQHt;C*SkpvTvVewv1 {%;x$~g+T|3Bs S zpgG)Bib{-r|9B|pF?RxTx|fCG%0Yy{=cdzL>5Q*@T4@#TLUeCm5xbdCy!gSaZRAH8 zh|+zHn$jULW3PBI@Q#F{c=iBkKat;6ldUie+ ^`kC$5u6mwuG!oFwv94=A3Rj-h=!ieS9SmZz6DEwNm zxIBtgNH@}6kOH72``LYx%+N+HmIV{PTIW<${(!cEE)DJ93k%q;$NWK2I8Sn;2 ^>{vGQUyMze!LR2;+R6d?3+_R$-G`pStzJCk%WZ|d^MKS0SwnjMzgpOT z5W*9%`I$hC!}M7w-JBEe<7+$`6&R3-U)3V^y?DoF7W);|8>p?=O6NzjJN?`7_SpMV zl-_L&R7z(jukgQ@&jbioq}NOG-$uWD)3S4^X6*^j>YFRuXWoD>d_eK^Uy0d!h|EkB z{p5NId;)@rCg=TzXCbdwbIGwnFGoxYBuC5t148 z!iZ3M@?Wi8e p -*g-jxVkuK>S~MXM6Q;M!howDb2)yj5m%%E4E%UU&Q_|#TT0h z<=TyJ0g5#ki8encRkTo2x7Xlb@@XJnJ@O&qhM(?!socqxif@>9t9vym`TjEi!{WSd zfjU)TpwhO&V%j3|@AxQcGm#D}8Jdvq#Q&V069 0+QZI<32C&iH--IFcGX#*Z9@*jZq_G~l-f8eL zyeV;-kLJh-A@f~6XmE3|j^ubeXteywvw#Lf=Mwkcv@fv?>B*_nG7?@|&5D d8Nid!<)GSE5%$p1`PTH zSaJBR4{H#OpAAw;g>ibOL~T}_F)mXd0$M$ s}}UuWPpM;YS?q1_XG_;Y&>R(=WdnPFf+dfNJq?GKm~a?CgEju>CoSe^OSYHRh8< zkJ3NcUmk#{8nGd>sPqwQzx<03)ZjA3;Hj}jwMe;fVd{8hAJu7z21*Xr9>`78+ub0` zY_6vae;!-U{R$S7ugWgaY yYsZaXrMnSwi2)Lv-@7fey-#IHIMw+S4vv_IpYJ@LnQ;ZcoERrbb}z1HNr^ zZEU6tot%4q_t@Z8p$P+$nmO5U{s6KJcHxeJMsILl(0NFk)NxB$-{eW{Jde=pndAZ}Udy1!DO zU3r6Te;?|Z7J3`?B_HlC$HUAW)@-ZZ;3DXyu%x&FAfnjiBrU+5#kq@>Py`|~48 z43VJf_03uc5oyczpZFab73nW*XO4)2cUxX8gOQ|9!rI8~SL=DcxeH|N5sbPp#ImU> z`gQy){xOI&TVKXOzZ~2C{OGDMq+~3-1Pc2K)bcP=*$SfXYH2^rJqvVuaob0GV_} z=?na!^f_c+mjj`@i-%_&`wP{oxmPU7d%G9L=my&DViyfCIF%+*=s;n)A75kDceTr^ zb!FtO-kwWsgAW~mFWoAt4b;KH8&2WDfCR~Q*JXrEkG$k^Z8F~F$d9Qtcx_?9M5RZ2 z!^#ypI^5JyZ`^%%4C(U_H9k%T?|xG0&al?yRVE 9GM;{|r*F-{Wa_la8+!2X>;~r|xN*sfuuQgcE>V^|N zZINb?>1fj8FEy(i4hi -JPkR8P0?&I`}w=${=wDm08IBQbtmE~|o9gCNWTDV`Z= zI_sB}uh=P$wRo=Bzr?-{znrHkY|NJ5pEM#tW<^lW7;GLpUb@CoIMb*Usz6jzpa|1Q zpA%oZpLD=( x<`g3-jk2m4jth z5no0J-TcmWm+`Dmwk5y6Ue10T&TQAbj@#Mv(%bOa4~E|ge}~lzl+;$Z%~4EHP--{2 zXl2A7mNSAP(&^e_G=*HY_N>_~Zi{vE>Eh>qLd5s*COh7?c%k{B8SZ?ZE28(n%d5pd zvijNZwBG-KD14NL>aw_WY 6##BzSc70d8HNxsNeaX zuuk&2m1rOaJY(wemxzdnyHl&nqQnNDZrm{62ejLBV~Nx3TZJkOfy&W{gR7M9k8T9A zBa*Sx??6aru(os3?{8RCf?&@id~u7Q7+)A)6-TN(hBwy8M7ZMs(aJsGeAe$u|1A!i z0SjDgLG4n704Q-0?o^VUy0ToUmQ1A!1G1P?R^yPKVzEq@F;BY-#q9G=@1p5>k^fu{ zUJZ8atPj@iy~U-tz~d9Q9=e}5t?h+oE)T2YVo3K(8nHBQUMn+>32o_pmn}B}KMqlP z!eHlkE`l4v(Nvf&D2~v)={!k^Bz8 }GJdvTvvOJnO6vwEz6iRx=rGTF8D(}mwCp1*aEb3bRhBhJ_;cJui8 z<5Kqtfxs14?llar%X&84fybZ2FTyd`WO}VSOFZnoi+{Rnv<%K_$Z>dRnD7%|1M#@& z(*l5ys_3jrLaCYqveN$Cr?$M+vU_!BH#2V_d6tkfT}Ls`#q_Z)b*w}%Bzr<$RY5%{ z+`)#ZalnxU@fQTQI}nGy@U9 rTz^;!46 !T89*$g$!6)=FDzdQ%~0wm3) zF2Py XS+aXX(4nDEakB98c zTg i*Vs4Ca4dsq>aR*?p2q(MOGZlt@ryQI4j zkVd+Zl L8pCoU( |)Ku!FJ1!2i+&@){a~d_jFc+ z`hsHWen}~zgJdOaHjiZLI=eIE@iGNDtNT}OxF0i`W# %;_ zkvvw*?cv_B$hCZ2WiC@aeFErXCB3&*?@1ePn3Sz7I+lMda9~avDY3oLdvAk5*+ZZu z^Ig^n#rsa_tS5%svwA^&=0ZZb^8MEX(_05ErHmUM7V8N@(24b&`#mC*mUU{&R!ux_ zSXO*P4&$Epa=Jq7j51EIa#u?^Tc2iv;OB|t`L}nQVIHCuth-;QdDn|C8 EHbO%Pb%{8@V|pegq<%yis`)Y~VR6Q 1v7GzC}?>te%7;?F*LbX_y0l{a8N?(bu@vyqvHZ7-wo>hAJsP-N0a5WB8?e< Flv=@jWw3i_c2#iz?9qW zTst(MJV&J#vs33#JLTxjeZuo~(YLukwlL2e!h{owyuZjlF(w8}LLsg7t>>%OaE^sT zi*-YV>5s=4S3P@?3=BV%qAo0_Pejwuy?0Nh ^N&b~xlQ8oW(15bLXt?dLOHbu52+i3KtRJ2P}Kw RPXG6SWBbISe6Jy4nJ}y<-gdmlcv)J684*!z*fIa31%UIIC)kNjq=6~$tef-w zYAQBnaqNt@{RO4GdgAuRYGj*LQ@E_4tyzo1HzW_kgLJ9v;HYI13SI^+cH17td(nKw zgOmbfkLt`^l_^Yp`s_^KK+A3h{ksfMrO&kUFH&8>X4_5CyGE{Cd)l72^{z;7s9Kvj zXv5!TD76Wu4fRrCK)lBBc6TZN`O>{QVfw(~OZ>%ykeJSsCsd2gdqiJm>z`!7y;T1i zNyzgnee>gzM;{7a-EOyjx77Cd^#&GE2U>@FDrX~ZAmZb+CNZR{>U6qeZyhIBiz1Gj z=7_KTb3#q=>V147NUET+(>`37$Ya93dgvgr{^Wd}u~`iDdEObe+c}XfTa7+R?nuzI z#Y8izxiU={HHHK%f}Y{a$|;%TehekYzB__ol0f@ntG&qG4>4sfq%|}fSlbJqlV(uq z4qdNS8xXGzAL0l(S<WqDc_AWD<`0HZ7*r&8vshv!Kqj>v_9Q=SBEa0Yw7aX{+9G z9k9ImZ{2G)&(_I;Do+GKE|U>7Mvf@ZEe~v=*Dc^{Nc=A4(F!yVh7wYQuR<9Ox^z!B zM~XZ)&Ob7$Bj=L^w_nW&-xc5;ZaXefEWOok@yhW_^HH%md`Ixq~<*+I0r9^=P&@ z%3GbNuURfFX4tUxI*S;F5vV`?h3<6eu}bnoW}bUjFR%x7R0Lu{PPax7$6lcf)2mpp zGX$NJ-bx%OY `X%*o%BV%`}dzB(#r znQ3bKmT8|&wN `pvA zb9^(d4bbJ>bbA1J-b}Q4Zt6drIqbz$pbdK(&iGw2`ga5ku-+HPiF&5la6I ?g_BRY4qjQ3^#a^PB8C);FwaaFy4t{&T%ol `tRYP7*u}XjnXO-kLMNoM6pVDgTn? @wJ}Mp%0l+3**Nm0`oZG_- z+P)uIXULB-KBipcd`QF+rO$%n`A tFyb!H5p{#_8%&-`UIlF{?ESie#SxrZ+_KaiHV)3>tkX{q}5WsLIl}IQpL&_ ze095lAT3)o{*5FDmCm+Dg~K@}GJwke >@>N3 >a**oJkk2$+I<#OQNFNX89!nQY=_b!^7yUG~{u#h@ z+>+LwQU{DH@qw2ZGl#}m6O4wd$dXAFiUW?7)}7 @8kTp~B^Q5x zu`zeKLn&ABd1eeIgTS-f;4AOWaIW54Ho6o`RjxTJcKmtJgrI0-I27H{J*2mgT{B&E z5WwNIy@Z%6VG-EhU{P=j?E(PEa(S{a4VmGPvAHY(8`Wm &cJl*l0^J;VgQqXqi`A71<;knfClKk> ztNB3I&p=$_C-U!a!6qhPSp|M0 ;{K3n_{N6C|}yb zH&Snt)#_6Y;!5SLN!Rjx7)tTi)<^lWEncjSw2%u1G5&qn=a9p@N9s=ap;8*C?RLv9 zZ?FUnx<0LquBDiVe4`^VY_Z)6GFM*y7I*~uopX%(K4s^tHBOHz*82Z9*Z^LJ=rObv zh4>tDw8Ch=Dz>}WDtjA65U5mD#PAHB0UiR> U(@eQLO*8^?vS(Cigf@d7I(oy?ct zzZjl_$LnSh3yueifj!5x0du>{TZ%BEG!4dG=*Oe~(1$13FE@V7=TKWB9&q>Be|<#g zY6)$mJ)V_pDD?VnGn$FZ6SBZ&FYmrr&y^3y1L^^SlO8n_%u_|$s1e?gQ^D|WkPCCW zW8e(z?(Yny*T1|fmK9u-!k*V4{3i4G$w!U5qCqXrrsoazGkSC1+ZfGnbhfA4ER3_Q zOAyU9&R?5Nm?h#0$Pm=K+A;4|8Od)Lx{wN{?x&@EXh?WW3L2PH>+Bek>s}TN_7PBh z^eW1Z=o{AGEKoDwY<*Lx@O9^0yJaJqx}SF$vFBbZ{>wCCg3v*^238%B1m=!ypXk(& zl)5?Mdnq=j;}~p`!#DeGuB1xTNQ#A;IPt}7nZ^UjJ#kcr*Uz=AbX)!lQ~m`eDs-Tn zoEB2x9S2j{M~W>RByq9cYbQ`P!WDnW<#XZp(ThU!Ai%PkE}vts`nCPDJ)M9itu{w$ zW7(WOFN|WU2=o0W3u2$LwTR)yVKmm+F6+aS&M0mB=oVr7P;DOdVN&l90MyZgz= (jQkwvhM+X2HJ9AO|dvMDCJ8WX&H$xB3)bzG9O|oUGitYMrT-zU7m(x zj|$HQE?*}+S-Z%y2!2&S=Ev7@pg8i)HDD3$c0ORTSiCF_PYt+ay^kPXM?mDlgIvtdUWi#MNd{8NbY3W(Kf8=s+dM+r z9JTnu!w}xA{Fr!*0#&gi?uXv`H}@x%9*6Cs1P*o$Ve~EC0_XZnnr@-b9Q(@&3Y6Q5 zv0Hm_>|Lss{W(QlA_0v_H*kyv_Nk;{S;CgXCxd)=&()SnkYz1WdY649qa;^oEb6$k z #W_E@*vKFUe=380mawc z%~*?BmTFa*?~_I;74n)Par{7i$RBwboBX5hAByou@BX@w(oce^UrRj%2!}4z-0c=#ls|(* zLG9ra7oMmT}1MjQ5qdsc*oa)r3_5GIMaxt?Y z+N6@4FWRn6Cs@`*f>&?!BVP19<4r&K=`7#xJFZnj?Q+0SQh3Lpvm8-O5fh?!%4F34 zY@2hW_nnFJ(6u=aq1xmO$44jX@fv)d-Gvs>L$6&Vi;=F=tuNm^o!BXc-5G5XJtBk7 zk2y&f`+$~YG`GboPxwYzn_mBDGzewTt%S7_zQ)u5uqDQ^9mhW|4qPvY_g%RIru@4P z4?Qx244NEgr2=Zau3D;$2WZ_&) cvsY3G`#dtMd;1zDFC>pG3gI8pe^x zEUyFi7Em}qsH0H~xa+|{} MAD2R|i%zRh#r1%)HmyjB(a>#R*P$BTtWjy#YR zRSlD8Enh2%R7&S4WiuZjV$xE=qzi~e3*1b>X#S_j`G2kQ;YU#FZGA4=)C}^7)3uJw z&GS!9gX@91h<*|uG~MYnru`OHt4+H^F3*tvZQWpA$&*u82Pd2Kr@_7C25NmjQxE85 zPx1+-tL}wDjIqPYyXNMQjg9ku8KBaPFn3R~ykIiw4G70!E~@$X@gsHwqeF;=>u+e$ ze|ZNvDv)&ueUp}&I-D(xB#CoR17#qDnj5`E&*W1?>{ RcvUJYVk?wAm@g zIPSoeSPoaYUP8A%Ug(o07#ylA`k2dDEQ!hJo5=Fm?*+TQQ~yi@=F b3o~U?pDDX#3@m$lsaBJ|RMYgc-y-CPh_FzpKut2lb8arK;Q~2Q&3fC1_WF=$ z|E6zTpT*I~`>FprJVbf0T-=1&@&l-c?)y)%uvBuT2Z- >OxoQn16je-vbJwj&%EpnO}vA5 iTVv z^B?qW_{gC22AD04(E7$k{hlad)iy6~Pyr3qX#~mv#x;88#y4~m$A5>!A+H{?vN9-s z8F@IQ)A|jF{NS7m#WMdvMI%HVx=lMc##SJ35&^^{+x jR?$&h-Y(a_e~|v&o2g%<>#OY zzh|B>VV^A9Ayi>UZ8E&N0FM;_M$G^AsQ>q-0! gwE|(>18%S`?vmN7JPqN8?J&e$FH-L3v4cza$Kje zo*v4$7_L9bM@=&TTkxrs^yi8w>isKT`@0OlB>A;B>s(Z${0Xxs^#^V(&KR*m*D2^4 zepp+(bw67h 5?>qLZ7WM|M2;aVxc@J$)Jun@j^vjglKJdzY9aS-F<-q zkdP*uZvvacIW;JXb|<4W=^4hsfXx(|D%I*_@lS`nn^;=;o&E4-gT5MS%eN-y0|76f zt#n$GpZ^4iElu3*Oxc{~i coRk<6S;4qko0L?67!7LOq >~h?ny()* z4&ZSh=%)`FZyDWJ*z8#^ZDvL>Qj~@rc4|5C@ryDYHt0= G2G317fwFBdkBFX<+yYae!nLl%}_$6 zqCg`=r%HYDRw&aTjTl8fzZU(W40UeBJ2*~GycSwkpeu4fV|x_C9Qw(^cRppKBg_8B z!EB=HduN x-Zwy z59Yn!1#oo(1r-0o!{(<*VQ~f8Est?ot;0n=;(9vVe)*Fls!#*>$kK~*vB9dev=p0B zA9nJKn*VsViA)0O$Ke(Qg Opeqg%0MEqbKx z@9)p(xUCpY$V*UXJ@04ZMEIsiN9nT253qxTk2b$pm$dso`P%D2_TvlPpuIKa@E0i^ zTJ1&zAUD+|O6ZxZz07-m z)}}iAbt%Dx>KYV9Ars%750B#M`{b$r^XxCdT&_VTSwlyMBL-^?6y^;Z?=FL%*6iiG z9R2z%mjY}@06x2Ydp8AArO8kPty(1!kPO^50D>;zz4pIP-hfN=8f4iFcE8f$!3hWm zKx>Kp$#0Q@QD4ein4Ay#s8943_zDG93Lo0dv9S=uchVt ;`>a1U$A1sy; zaO(L%3gipPij=6c`Y#opxt^3?$h^-S(x}JOa=#0GqfK>ml4)%^o=MFES@PdxdlR{A z2m?;2Z~{S_E})bbXcm&Zl1VB$cloey%;S12v}Jc9aO-w=)6iPF7b`k;dz>th_&RGs zhk$@!WZse>@(&mR9U|l7`&0+f>3P(p*JPPaSr9K^m q^~a8j~1_)mY|77g4*X?xPS796I?o)0f5PRoD}rGOiH&$0MduAW# pF zG90vhyL+Ro6pZORzZZr*f9CRZZ>FXr C>a3(tt;}a>BT;` z-~GTWXkBc?Jxt|tK%kJ(5;|NdFP9{WA(sde2t*_Xca6<+o9ujdJ~$j_l+xkm4S(>Y z4pE`WFV&T`UMx3Y=tS-ru@sDHl^AlYW@|U+n^^5P2KRasI%|Ii5B`c|7|8%c2+DND z-GMcXh=PhAgTg?RHh-lTK$Y0i)CX(vh-#ipMJH3aQnC1E@vfGJ^mq(wG$ksCM%);q zd5#}{EE00TccI+#K`s}&1~lp>y777&?*}-0?;bR}T=v3C`=xnY9vAAsAyGS!tPO+# z!ZUXK^Qw^?QN6*`hV47RS;-MznJJJfsg`56X478UpAS}Twj{-*n-2i32}G_;GVk|C zF@UlSUy))V{vu!PpPV7OEmXXb-l16ES kW{B38-d!>e{E%d73OPd?r_1)~9hO6{XtQ!cGpC17!B^zv{U;2_<`SF=p?HZ%% zPp>c4xBLN46hJW;l!Solgvfe-(gefL!F2AX0d8)9^n=0q{WZi(v3z&?L@ebMdGgz$ zK!%hlx!~b2Tl@Wx=f0Vu#Hx+<%$Rhu0o>OS%NgEx!obDHMdjyncxd>+BIxJ72Eb%)$E&Ni*!Acaob_UBNf0mEgC7Y2FF}Wjyg)+ceJjD%EHUwNM^-0#VnPBI zz{kEo!kPM^qWu|- oeWjOoUUl#s~Z#l5B+Q2K*+1@UMtC<0ah z)u}l?zMzn?Z<&CyEpm f%!HFfxFva-X)Z%4DcqzY`I(;ynSDUMVG>U4bKxMgexM z4_&!6lt|h}Sh&wHigs9OUy&?`RUjt=_i I^ELR zikVja)9bYV09k&vOBDSRN?is(*gr4;{Nm{rch*|#c^KX{yzN4d=CR_3vOncBG6jBS zBl~=*f5;>`D@{K4v*iNYX`kJXd84$T=G`aCpwRfDOmO@u)hfx@G*d7VY5(Y_n-c&J z_(I=+9I-yb2RX3LYL;bpuHgj`#r+OE%S4!D8a4az`i}^YhWIkBpK)coJwU_h7e&a1 z7ksp)+-4OPoAWX?z2>n3L0KWU^Po<1L`vO0k#s5><&7C}T$!vmip#qM`i}t!9qV49 ztK}a5p{4(KJe 7xd&xUpJ&EDU-%neE2l z%eSx``2oB@6&~n$V%d$|=Z*G}%a+9ud2t!a!epLqb--jw;*1e#B`fwG+HOTn(tJKn z#gfmLE=`CmjBjthc7af0^M92&T+(|@K(+HU{?h5@#-=zc0=(k^mu$)lUTrRj;gJX? zAt7YF2SH~swI_v@0TG>YN%4fKGw$UO5K{krI)x2L*%5BE@>;%x(|pGl6o>>54>^!P zkb$vTo|N*2ef;>Ba=R7mLaRTJ>)f7-d#wi}#umqiLqN}e1KBpXxvyR6yu}`hUtnR% z)npnXTV6x^KDC2a8W7alUNyYoaxQrpBf3Vz1}Q|_4=5mx+-22_p^yner;4HJmiYkk zSi~CVyN5?VLV*$-F%Vn@DF}Z(yV5^80(4t*s9W`PpJoFGkWW??U{P+M0G^eV1>)w< zXfQ3WA@b)f@PS;scB6`lMXK6cC~@*Ap}DDXtaW6v>wV&>l#FQZE;kp6u<7aPAg}cq zZ8sNcvd2ZO=I0pe|A;3teTso@vE2k`x06Eq036gP0w19ZnmP(p%F L{-ARUUb{UTyhqp@50KBa%>^Gtw@>E& z@L*s@pogP|v+G=*=o9pCkh3Ny{P}QzwaYNoTjd8|;4kjQd^Q)s?_L=CHI@dUhvRbp zc!qN68}x8M)+@ID^d5ZS(2cXRPmcnJ0~A*x-@c>$qnD5+l7vQ6;HLN}K)1ek_M6Bb zw@@089lOPCkW++xr=jYdwQVpif0$eVo(EN>v>ee_1MA!cwPo0EW&U_Z>p>F|A#44I zW?01f9PrV(xw!e&A8is8Rqm4at$_YaIW%yu$a$3ikOl{t-jwz>>()3rjdPu~boH~h zAo1tD*zB6)Z8hIGQRFsrgtF7yNVoCH0cSFy*0lTMuH2x3s>&p3u>quctHH{Qb>N#e z!<(?1du$yOy)ulBd-v#)v2f$)7LirgJ7jqGw8M?Oy~SWN5oU=+14-|)>a`2}u?#Jb zv?Ir^DK&_Nk2mL$4TZ!#q2xu17eme3^=lmykF=!LbXuzu$F4S3x)v7Xi<1MXyB0Hu zo6A(=) )#!9anu0*91I3kW$#zw*1&F+~eqP41eYa+H|@=t>AR8M;VOS zFi{lR?q&R<27ti>K$rsK+3;AG4i3s}+AM^(#XUQWK(00@S|Tu=siwNOp$_#(6TaW+KMc9?!p!?Rm9$*^?WVD0aR@o`+Z2wD zNl;m^bIFM#W?sjl+2R?s@70BWvobPPGLE^B=EkD5-m4pT=3f>a?<2P^^pcYhh3E3r z5 >-=IKnI-TK=1m%y!fr?qVEUXdVFJ4$ z1fHL|X CFD$^$x*f_>kVq}kS?s_nw zgDo0dR*FU(OT<5zu2f)NB9Bn?{>plRFZ=;m0=AI>-QT6MLx^5mOn!mCt_Sctgur*Q zL_^e#2)v%q|EIt99O@>BmQfLfQouXSQsF?Rt-El6|3HR<3u4psp#NSo-wW`4PqZz+ z2t6zYzpmP8s2JiK`TPmU(LXeSE`_ACztwM+qFoVut3voXDo`2%My~GtPWuKJyRf;? z!dYwiQ@;t>0$_4f;PO`vHQFEl2A?0If^|P=Usga5$@Y2cI|Q!lYnuhGYO7gHXs-Vk zj#gWv#uFZUcfiH-_rAOAK081!^MR?51u%%Vd8^s*ziguq64d)-rF7;srh+F%YL0`u z5CU#i{oL8loUh=RW%U{WgE<0i6IRD|{aulB7bIi4rOUZ!;n2bB)wUsH|NmRVo{~oy z-I0VVAnc{oYOEd+b^tqSivpfmYL_wn?!Vrh&k`V%7a9j#Wt^{IzaV&!J%WaNJeR94 zT-@BcgsM`n@U34$pwTD>wPHKS1EgNPDz^hJ#uYqrU8_FfzjyZG#xt<`_!qt $p*I)<6*ff`VqDk4j@3_E(4%?0cT b?mp@?EM za5Fp~gts~9KOEfk?@y`% >hYxfL@PJlAK3Ye?{0}^TKm+t~kx8#XSRH#>f#A6V896l^vgl~V_rcv+2{lKgD z%0KukNMurQIA0>tY19gVJdY(Oqr|_h6e`%X6 %zSffh*N+2}M}x z)?H{0e3$sh<7YEL<9pMP-Ji_{)i1f!#z98N%ZE3g;cK;8-}B>D99-6d2#^jH{tClh z!UKsfzDr~?LNFfEfg^t|P>eY++_1yi^NB8HqFa~$Ux%pO4qQWglOg7&Ht5|yVEmsw zD);wkYvY}%v$1)Y5SE$qC12M}s@r z5K1^l8Tle7MJ9&5s6_9(_vTsR8zV-yr`UnWTP?$ddswDZMLb-wuGn$qR%e|j35jhk zFJDPrBjpcj3IItVM$=)U^TW!I(Vzc`Sf4?s7V4*_QiKabO-9>K@DHm2AjPyx0|h6Z zdN9<5GqTmF4-*Pi(u^QvaHD3oY)Za|O?()46;Z+dPBMt#H{iUi>7WffLAR;Y*?S z2Q4g4$Ty{ryfzo9W(1R{#_k1%yh!D$P31mQOnZPqOlm(lF#kOnKwljkFUhbIj|y?< z@p4Z2pW`(xz7)xOC(Ao=2L`&Pa0@oR--`RNd)v>`orZ3!{BWxfr2Q1gE+oS-!n{OL zbqGzYsAn-gv?o=mfF^1}F4rq$iS-B}ka;I5Ji3#~;Pl4GVBPva@vgmE_p89;`2(3B z$^Udh<;7s9nvRc`DnOq^ Yimr7F#{z&AfO*zCBlq|Ciwiu?81 8a6pik-hMzF+APtJ{}Dl?fboj6iwX&(vCzp9_wJENY%f?<7cEWrDzb3o1<=# z4q;yJJA8hAe&dgThmZI)@{s+VPK#S0n7ENhXHk}h!({lH<2@gr&j<@ERQeyBdglK< z^*QZe^c)zB6%23E6HD JHk z;4;T8l`5TZpf)wnyGLfpm!M*^SYkIiAMBSq9e)4k)@Axs_!I-V=VBF6Q0_YIT5NPg z!eg- %UJ1uI<|>`U4TThGpfyE +r#+Xi<8O^}tJ(5+6d2402>rO-l&a?a5m2t}Lu#BhhWueU*xpv+Pzxu(@|NJjQAo z#%g0x!Zep4ACM?DO5Or_x8S3kYf 5$)82BufY0PlWs42Fk1>PuDrJ z@PwX3E4 *KMUt$mr{bycWP{o&(3gH%3CC #kq~6Gs?JUBs>o7^?tEugEx+IwBS$=~eF~$mYb; zINtv13=0M~V+oAQDJMUScF2=RkS;kn-BLJ9WzcSZ?atBRB;h+eEZf5aX6rbzz4rF@ zHg$YK{w|kLu-8lioX)tXaCzTiDP+Jn%ssI(nTUh6H8}S4#1B(_2@DfE
CiWxiUqgxGN$pEe;dpNB4%U5X2Oasrh}Sz18};bW6(h9 zs2z;-v`Wx}n)@smAj#1MpwR@OG$?}Dn`*e&BMQADiWLRX1 0GWPsS=2x&bqop=lk=;kClVs$-}9&o9l5iarUPs1qB3bL6N`btiD%& zV6iD*I!ypfZ+-2wtBOvmI;=!LV7&)GxaggMN`WlD6yx5jo<{(!fEuyQ w@9|^0ZKK*}0qwPI8mm{ @ zT}Nl%UA^rx31Bbb=XQ<#QxS^D3F-TJdv|gZ!@~%@O;T<{^QlrRmf`aETtIEg?;}8) zg)M%x@%KQGpXg*4HwZ7!H?pB|V=ztO5k^OQw d713M>?0=x4orL89wHf(GjsJ-( zOKsJhtVsX%sUYf6gay2W(!qI!Opsp14|1f^Rq@qsaRar!d&OY;zNC)s(v4qV_h?=( z4+R3Rxvbi1i_BB3wa`it7L=3GW-EnK(CB!L2u?|85b5!=f7|~OV7*DOVu?GAhtf;1 zzG&3ZlT}w3F#?7x qaFac5DwYnPP7{%7`^0?lqh+W2 V>i&mK#tWC;Z7Q$&1J@!T3EpD3~j?!spN#ffK8RnLsT z **FE@efZOI9NPdfwA>V 1-WG zuQgN9ij3zBIn;YARHWI!g!W3ZfR{lq@yDS_Wg?OXnJfZ4yzC<3 ZHj_|l{SObmN-_7`dBCVptZTbDmdGKH0rx$qIfDw+aMXzC zXGo@+L1nO}wRTADuMIHydjqU#ZI{2n_2AWmN?50>kya~Xy22zKUHXrh4$=?#OpKcH zWUmwZ2jpG%^L?1%o8@0U@wg%rLZBxk-CTYYCe`~T+<>M{Y)yGV=#!``vs$ZRB_F*W z43p*Nngo{Z*{S-PJ3k~K;?$1Y7ggsr1Q3pwZbssJ89Hz@*J1qp(}~=D)q7IPe2zuG zu_XLo5i;lJ!waj<=Q|Zs_&oOWXve^ps~#|t=na9JX)Tm}rXS6h58nRD0ZmhkAr*KD z&kQq-H3Ygt#+S#EK`a{Oy1v>|rx1qt3qDXj&*8D5KaAFEHykAB=+s wi*047N)&{7Qqd%VxZip-xsS7q)pAW@kS~m}G0m1GK}0VHH~_c!l_bO? z08H9}0n9y7$7n1+p4mSoz;4SJ1C;KZObNFmG47-TQ37&Gv>o@0{VneFaOu@tJg8#< z7Y!Oau%bl~z5 lu2e6Wwt4KbW$Qz}@%B+2yCwq4> z_}!Z9tHg%^7zUlz_7`gkZ)7s4b$V9-c(uLl71nHUA(*1q320kXA|*gzU&X3>jDq`p zn?Us#Dd{Gg-Rj%3YBQywo)ElJa-fPMXn0uS$1~sdy*$IcUU?;cQab4ltML?~bo*Tu zjK9__y|sM(&y XP_9Bao@4C*SgM(0FcrB6Na@6gUGmkQ zW{-UGzQ4r+3=$<)sUf-pq`?ec9hxHEWF(L3lbyi0ctAeKg<~C+*g9V83lbhr=NX+9 z6?l!)*) MeX{YFnqH~uv>`T(X!Ha#N+XN{w zKFN_=`qnU3?{*18pUVEB1W$QoaPPs{Cb0iXyh)=V$bp})$vHZecBR~+Z?WiBo@=Zm z|HjrR{Zp5vH@jU%@E&>Jxbc6q0KN}LkJ%nvNt2zuZ+Wf5^Esa0f?Tm!8wt#%sB=k! zmMi`NEJM7YkXO>ZOUxE3yIw_vL8B}L@>HiAxhf&e33+tDF)eE{sVAYn !G(T&3+~KLdMDmaisNkYxgud4jc!}UF`G^oF$QszP=i4br9v~1v z%hCjc7bdcnswt4&ABvljw>TmPCyezb@tFHY?j~eS {+1b?N)DGv zngR?pZ0C50;8Sa@`Z NXMmdg<_bN^QPiPD{@4r~#~IR;UczXoi#65s zpjH(tO2*x&M;pgT0;}trTF2RKX)TlPAzOITYr^C1nEt-bf2USMaG+~vSRDbVJUf(m zElvQ>V2mx0 ;nL2=x%#L>i9R}4liv)yTkgQe-BoE18i`eCHL)Et(!a;(?8g-@1 z^ew@WW@WfJ0+=k-%d24Bwy3JW=sNfs@DV{gPbvj7OB0~TI5UEn&1)l6(u$rWW(uIF zXn^iw7D(n2qb(K`#*&*-D a{YEIg6go7vhIwasFKzNO!%3CMe1%g-Dg0Cvhmw7+WHj>I z;&}dx(t&vE&8`>L>1?hK!LShFKzrc|N2~8L9KvjwUn4%mVlD6RbR4d {z}1 z^%*N0^~SWv@3Qe&N^f2$QDa0#JIt(*d3pKvd}_mlGHwUcIA>STxnBL#d{F9&0Q->v z*s?@AtsYkxVj;xD;VgCGcLA099E9O!uk~>u*yolb5e8I;R3PQZAyckAsCh`{`yrfC zzaA={67U? B;0A~x@@&z~rk=-q5R zz-mBeiG`sjwLR}g2)|o%$7ip{dTT!UE$S<8rtVii`Y|sHykt&idc(mu#1s{o+S<^u zPc$kebm#lL1ZLO9l2-^iwea@@jrU99VC)Poc^KCBbh;{%5*yW}x)J6P??Y7}bN6GJ zI~VuOPN1Nu^va~s6k&3iz{hiVM6U>gZW(NQhqQlLjq)65kneiD>bsSifmYiSWen^q z0D4BbUzSNuTCszu lOhb31IU~s z%*x)yYfIWk0BWLO5O-{pNYLxp&NqjQQ%z#MNdVLIMDvMika5L68?cQ|7eeC`7dwJR zDl&VEZ8|por!!^?%?%^v@4@Vhy-(U4qZU0K9fE23CLocsZD+Vo$ezFDP7CFLo}N-E z7DRE(_>af?n2cl#Uumx4FdHi#wCLI7LMN4uX>ERdKZ*ghG1!0Gm{_D9))Rn03whz? z^Q8UD+)&!Fq}tveD_6Oq+cNm3&9dn4mJ@F`^G*~`wTC=!YZ#EVfzow(&E5bx?Kfts z^J_M#m=MVf2&wwpvK;N9S=RfdpH&-d-dng{xGXptb%cr+8N9VHfGs_K2I_bQQws)S z@k}_qaaZ48JuyM>Sj8PREDRxxTQZZqmuAuOXU0sgv!!d@g>bJv^#e2OISpR?{8uHk zJ`K7rOyP;h{Kg!geUTmLzDB~50iVl+NK&0bexfVEmq`b<21?rm9vmCx;?>5d<>B0m zuy9P0tl%x6#j);oui4^;0bWPRKL)r%ynz%0Z1|+dJb?8UgluKp2!Lj8_$ho$87OM3 z#LDn6Ha<3M>c=4Sl}=%?3P+{V8v(6S<9s3lBwMZq^`^d2W6_K=y-sn;sT?$L8!Wr-I@gb?z!N@yeDNr94@YLh)e7wY|UXPYOw zV48Il{d{RFv`vEM6GJC=TN;GT8egRiAINoo`2l+BtIFHE53?6;ZXaj7-H-UFah}za z?^ dHi_gD#i6%p1uqC&{ zPu>!1SW0ezbvb+uc60n!p5VN&6LJ!(xEmY$wLTa)htm#vVu%EH#Z|Fpv7j~2^;R%f zJ0{59&gNmm5D22aZjR(ck*e_A@EGxon)GZgU=0-K_=Ld+1o3n%9RN!_gHfQBkD4cy zhIlCySxkTYAzxW4zCm8(+;KwUwYjsQZzOuF%a5n7h~A}>O)mNvl_n=$BL*9?`O8zF zM~YXO7B`3I;#8c{?TiqNsZcJMJ&x>$8{hA{!XB?9{nZ&+yw8dS;d<)%p-aarET?;j zSY?oQI=8>j;DE10@iRlbj4FB8)!K{G^Tw-Q74BgD%k7u-jx_BP41s(3|KM- G7@U3pm@<53B5@|>5gxmt*>(sFBL&)fgs9QBQJ?LvcEiY6q zN#@v1(!&{Z9Mh&fNAv)d83Y`4DUI9&c`(tsW OwFQ@I+L_!gntTm(F_Y7Zdp^*UcO`!V^Ggd{N!$^@z}rGC zd6_hxkLOzM*%m_&Z=PB+SP~?_$UReS@pvADx{dO5O@R#wlQ!hFlPx;xO9Q2~glsUE z+n^&<94Ma(g{MuWQ&heJQ%kU@N8o|bSyvJHifogJT4GAa#>p%0a<_TuwS;}40@+&l z^fs5mr%$FJVdko@9qQev0C)@F&S2fi`ZSQnT+G25)8amNb9;rtHHzN7d4I+~B`vip zj-S)54NdcUjG!>R@vW ^_-A2&&l27CGf)xZWfGO~g@L0zk8wTQj-Sz3Tl!kQ z+*0E #D9tV+39MPFKx@iA$FWCbiCAz@2uI41GKuJgUw3F6*r zZLVXzJF~Go9A%|o>DY7uCQY?wm!t4>_d89TY)!MFqm{0c2~0ZmaZ}V(hmFBPL47 rQ`4@WV0a&EWnNt6sy zmGhx=ZjB5Hakr};4{j<25&RDVy}j-)Mjgb1qM0=fr+IM9rMLUIc=EzvCG<(W85( 3WHnR zJ%gFf9aI@g{exw46hA9(d*M80FnT8g9FS+c!Gz5M5}?V7-Zi(HPv=Zb%$P=YlZp;y zy98pg)f*6mq7Pa`DzL345=UkbyLOEx0tApN!3&V@KRD>^tuUq75K|JgXD)!QOdJ%z zJX$644P{JMgvO?<8&DYwvIanmcQ)Md$pI`J8;P%+n3z}qfp{&xL@x-B40~Ry $IgxEkX7VFbH@mDa! z2<(m_zMwcAx#!w1FPPD)e95HBkOU&)^|HC3RVtFag?;CVW)eVo^tpk#bZqKkv$tiK zq*-~;_uaR&@^mxnQ~;C(v1Cf^<6nu+NLxJ0U`g|82a2Re@gRpZ*W>jZCL{PMVMkwn zvs-I?Sa-Ja8PipM_4zJmL>v_tv{U{2C0hgm5JOnN1sxV68&A~REd7pKxXf~`A|hZ` zDCmSTd~*&@_xYQizQlUDSF;9EI+Fr>jb~5=6^)__+J6B}kkK#2hctJub%jzNApSq@ z-ZH4l?hPLm1OX`pC8eaLk!}P5=@2PtkPbn5(+Em8B2v=b-JsIly^-z>(s|a_H}rSj z^Wi^d=6pCajPu}Z_Os$%cdhHbZioT07p`_XxKHm{c qB+p$ouAW&=q*VEgrCvyfAb+JdqoW z0t$!q R+fL@ch8n7AO9$!Nql0u?2mPN3w~R4=cJ>?eDqox)5b{K-{JhT z&V4|JLlo0>-`9j4d$NF86PwIRi _3XjZvu?*FddrSR9bb5Fzl3p>cHV0)Gf@~!oiss(HQhQ*Wwc-9`SDOY zIm*S=;LCu{Nv+Id6YE?#t6`r{pqfjf`;`OZm|Q}}!yRGN)(gTmK#b&21{U=zWy32P zg=>b^*WW_cf{Fme tF`l!-ipH?p?v650nB zSM-{puTfuk=yct=@jo^D=Ku&%l3b7$+SA;ww12n1yP5X$Gb1;E4x#z7nkX&u?QVf` z#%<7h&403+i^8Jvf&8ct7XXJ8%RxJ%+D}SF9sH1lTS0}yXeW^s|C64WSTrKzzTyTg zlQi)XL^dY_{^ZV&&8ri8Kj<`>8JGA tlC7zxzxS%{La~O$`y9qxN2B-VWq2}^{&jZ~2*$Dr<{%iAw*XBN7 zr6Ra$e>0MQ{ c7Hld>U)mt&Q3=Ep?+b0!?8v!ZS2u>onXoKiN`q0 zVp-tVXzQxwVsJf|)o=m0?ovFjJ)Ezg@3eYPaWtTmQ97{&Qxcd)(s36^bzHrQyMtH0 zv`U%M7E-2wnwjyFkUilK{35lLjc0*2Zk2<(iy#rN)F{DU;c+drz1I!3c7=leX0#ZD z6Ug{1rxXec{iA&LnOA|J0W(M!m6X1^WFE1YAz2MA6zO{a7;E2(g`I+uKB{M0IFu5> zBA^28!4zK7r{86N2Y?sb1$S+S(ieVoccBazk6<&ifm-EuM{pd#EwsNcl1{y|H=vGt zXmu8>-gxTet9jRPYCY f*sXM#Wcs;noh{TA6&vgcJP?8qAm8RO*^RepJiV2`Rrs}{Y;)%3 zWm6t2{)v>7{jSFyc%5c{Tb5pXVVn7SZys%$@>_$AS~F;w!ulX(OE}|dSb+%EeDSUu z4#9n sfVu9cjB zEFpn{zMFNQ+6GY$`!p~eHpT*wV*c~YF@?zj0j+Gh^(!Zgg+n0hA>ewv6Y{<+_OtBU zM_A@hC(H^kA?a`SqjQRlE=iqTGE^D(#opa 4&xkoY5C1VH1jB7#Ds_sp zi^9;KqpR5Z+;)~l1k;W=QM~}dBCF2@J3T)nc9^IhHetzgP-7y@OJ=B5^S|IjYhp-M z=t#UAbT`f7)oJ-265gbDx97v%G0JW;qHq3xnCM=BE~}ozTwdmhfnU|zp!_ c6%Tg%l!2DYpBZZgM4lizF9 z`GgrE9UBR_O~IeCt48M-oUBnko4=nqGn)~FMWB AO*!@KM4=D+7Ki(de9RiVr%i7*XE8(9O|HgGL&>($&DMXQvr z&c>)yMO^cP&!d`lxVfF<2Cu8B@DxXGs*Fp9Tv!20f8KO#D{=$OlOZ*=AGWowLM0oG z`aXuD-;&T#YNOHp9Pe4AxKR2>KNf7V8Oht!mJz(~dYA_9f<|@RNZWM>9DElbFU^`h zKdxQ}DQWav9uo_83H^(%ubj=xwgUpw9s zbbZG|=4lyIQ% NhUa*b=g+bDJ$zp^z}EIGEN5$b^{t@q{{SZu z1Nr>oU)N*tCK@iE%fGN(Sa;ORP46~d7LrwxG_HA-NeUQ)fN nG%vJ08PposK_PHGdt5god+m-n2V>zdhRaS!}Wgaaf(x z%@Vy8qlN$_e_5fmkxQ+S^UpOpl3F#6hd2^f?00BGAB^;?LZd#L&KKZ!soloTJA;gB zl6A@DF|@}RuYYR*ZRATT`CHQ#!mU?8OkHe0eG4*M`CiBAV96z0xgoTX1P3R0KISyi z(NZUjoO&SqDPk%g=Ev{dShLSn3Siz1{Cg_bq#LhNTfatItcSdAy7aRm9?w2cM^TE3 z-5yNUB1?0P-Fbfii|6u)*5sDlsV7J)@3p<##&%5{Oo?*5;cr*8!D$)FrR}=bc4FpG zX{{Nwjw`WwEIFObuPb`6c1$T9&0MsjS*k}v6MUxHq%%oxrSO53&4ZK;;cZZya(AaN ze`R5NDAQ(%=eT1-RrG@*d0!gSsoXTBcgN5x!E$p&xq<{KG#nIcvVf#S&D_JKB**Ph zG6x}>e6s1g472=Pl5-C b@H}eGnRrB!hkHjoSb#mdZ*siem zhPN8a9wfi<@OBNUThv%Xx76nUdP;nr#Iyw)4db!9U=Jnbze }4y~`@6ftl^O-2cSqp HOcnJkuhJ4 zh5=88r_#|ae(^E~cPxLLsjkgZTVj!;=@_wL^j+oo;}}2E8`?5aiqj 3 dlk6AQfeSx0N>5T$hd-Ve+j6(fzH}1x-XEQ&aL6@MXLm|Rubiu; zIllD3h-I7)WKb*8Q1j0Cqk!c<(8>U5OGbDrAKVX4lo|&Cpl#bB5)rqVPn?bLmv_RS z4EN23fu|aSasn`YdmE!N0 $i%#k_-b3 zgyfUh&(z(y@-{L0Nx MK@7cXig$=t?1DxH9TFp>6$W{afm-rM|p8=lVcY%Lh<>F zxK`t(KAmR8x%4at;IdxLC~!e{&wXH$r(}E3z3chC>`Xs3F2l{htO+CWMczva$~J?H zu7wJA@kG4l&QoEVAsk^$vM`Y6Ou5LKJlwZSyq`PvW!o!3q9N;xX;*!WI)~Fo_PE|; ziDNNDs`Z%1&{d_Abg9>jy6pJAO_ @LY>Syo8 t{C>9If@yb7zK?yoE&^y%{LjeGu%)Gc%#A| z-eI(cMl|&MhqTq-?GWEeb37?|c)GV*y{lcgJ;vpHl1)f(b G03rmn1xtMj6$0ZSf4B~ZHpWyWHB<=V+v=K!U|r9}x7mJy@(T{y? z$Y(xw`D8Zfu{)x~1&4@sT#7;aV7EC7*)Ra&RO(AlP>8K}4%jkns1CN>K~v<~;>{s# zgS(QR7umY3E;FbNRx;e%Vxgb(DJHIOc?Kbuwfeu0Ow!iE`Xp%!qhx&k1Osgc@xn%L z>NDq=txXg5xhUZ`n|xPBG@r38p4>u7t^kD^g|c6TX<<6m!$St z3M13p_Is`l1Uz6gTd_7m*?xlWp-#)Cq*NRCNs3Ed+RP7jW^iua!WeMVn@l4F>?}X{ zu^Ea8PfsI+++8^@*2fBn?Up*c*Ks|?H)Hj$ujgED2(6DG3f1JLnYDc+I9ueFpY6-$ zu-*vHSevrX#wl!i*QKxiCn)}%c(Vp#GQcEh2r3jHJpd>-6(Mp*;mAC<>nv(WXB ) z5*pZD{CHZex$cG5=71su{JR~WCQ%L(D#yg`NODidHfPE7d#p`S)~|+U+-ZS*Os@*B z=k>hWdX^E;FVCpOs^xjMs)T#U>jL U9A;YyQ>V#P;lqe!f 0a&%t~h zA{pUEVdYSpl-5eYOd#UhR>Ab+=WkmZUBf=xG@c`nG;S0$W?}@q+2n-MmamU!^9QR4 z>`Yf+CTfjJ0xnU#LXhSNiB@m{mF^RoOixZVE6nw0YaKrDZ+n`K@jycJP?2lesFB#u zUWlHLVX``ln8caxo^#k;eLgfD)%Q9(1EpYB=MQ`w{xB8@3`n1-VL3Vte1KQb=xI<} zV27JR9J4l@-mRd}P_BjQS!9Y)XQZnZVCEyDYzWK+MM{8QM{8I-jU5!+@O-j{UnE!g z3I4>IprAg_R!2+98QKt2;Y~r4$l}0+P?ZnFI(HFUbVg=~>_CtQvt6c98)z8cqAFkS zXV`zpI_R0Gw~o1b)!_JYd(f7S9VmRnD50C4gMkapbBSvc0`;`5spwUs3*#HA%tw7L zJ_k4H7y?-4l*B%)p+cw#=v5op3$+`)It@LC6(}8>6p{jPGP*a sZef2EkMhGCnCnSJ->)go8rXXPdJ?k&^<3f3d{z_Tgcb)28qnixLM< zK|9m!DK65PD?}IcamkoKYS_8W{M5A(7GK+!&Y*$Iy7`H=cF`*VrhgNVB3pNDM?o51 z44?UBGeFpu_tFVhT8#IZe!()qhNJ^DMT|aKaOnP5$-Ns}3%GZ~y%ofxI*verlkB^G z{ bmKt42e$E`M<<-%qhRKHJ!IEw|UXNc1CrBPPGzej1ikyQ!eQN z->cgj5Yi+6GJWW9&biatm_>@tHS9{zbiBN>u>e`fU;ph@`r8 q%Ul8M6;Y%=%1ny;*~n0B@Wuw=jp$6IRht*29X^5^;w%x4;Gr9VZ*sNYV(gO&dt zX}%*t>;s?xR&$({4n?*77*_o!4ik3qo9(s{IjpfPx};VOwtS8l*Iv1w+LgTf0pez1 zb=AZ<=he8)Otm)v%YAfb&UDI@PXv7~-iEE=Ja`Zc$_CosJpQx+frGb5{w-zls-Nuo zT7fJPMjF!M8vvcSe;&eQ9uzJJf@+wAD+(qtw<=j^zH<_WYgqDiNMhjBAyG~*XZ~=7 ziRYX3L4_s^8E=JlyhB^Peyoa@CCbauyxy$=-op&nRgpZeaSl}oGZB0%5aJdd2!Y$M z2OdY|djzNU&LY$cW9Av{azp8zBV`H+JVb^8*C)C%DOl@xEFJ>x)3($e7k(QsT{tRe zhEI9!z@-2sD&tPykcXI9!Ex|dlAF^mU4w|nlNZKPRr!rIFtfo(;P-t{vdQyq3T`#g z1$0IVOj-i?VvU=bFRHizjBdzka^(`%8zE`o!^dU4{JrLY*P~oV3cMjF%;N@1VY!tu zG2u{V>*u%V+f%pEAn=5f6#fy2Ef)bTdOK)JAA;Bg(T|ON$!nkDF}qK2C4(*Vw0iz2 zlKI&6?Y-|FpeW^AwN#Lm%}Uix3B%D^K_1VA&)YE?e-e2VYc^}#O!o4+k+0h{x5h`c z6|pd86sp }0ZaEh5`MRUlqz#T+dlNA>DOIN!SB{#v?s*VP%wL-narsp(|Yl|x^#y^Yt-kN|w z1%@(Zc40w5I{>HhlK$i40uSwZ>`Ri6m<6a&jmLKBAcQm4^+cWcB>3XcttV+ez@t#R zy@ B@tX!sb A=XeYXe(%A)3cyNl(Hqg?_Y;rHf@MR;PYu1Dw=OE2|i z2Y4CZj~k3yS+k$(IkCs^xSrQ*DCByR05YO>)A~leuP$VgbUH;D?gyTHcAw@t*=vUt z_mj#+Gy_~YpSeO3;F!~N2>kvv@cXdOWVDW}Z~mj*;I~PF?xD^6$FRWwGQg)jUf$)|3Dj-qg(StK;~jYj;F4G*gUuO3=! _qVA@h!`df5-E}|* Ep}0NIgA)EzZA%EcS{ zCL9JsO-_1Z5i}!HlVxX x7NUktWvN~MQH5>=}QEfUVvQD>2hN`8D6D~U&mpHZKec~gX z!*m?D{+6Ot#-;q_JF8nPVzO7lRkjjMlcw5L#2v|c>oe_PH-*lt{TK^q*m_X0ZQpYY zk`YPA9GPk6StaQ3_lYw1sKH_fyHCEWtwLXMK%Qyn^zpUYO*+^!rF5m%K9-M_qI*Nj zu=8TFXg#z1E6CUu@1EJ7GHShxSaO|Y(#RC~CeV6Z>4^fX7~SzI?F0GNPag<44`id4 z2~N>8eTcuZBc620RW0y|?p)O0`*b(rzC-S6hTByuH8HDxm%#%*gNtsv(JpGXYEP4U zEJRnXm1>K}WCHKmRW;M>zJ8x5-%xN%{Fb}uc(sE6K*;r0`!P#pZao8@`NU`LCrOui zkk2;03|z@pzY`{Sb)!}rK%+P K8hf-NrQ1{PyM?l(d+`3~T3SD%VfbC;^tC!_ATX$-A1T zuB$!C!t>cC!G83BO_N(~W~ g4EsUDv^Naf z+ZYBpRjIGM!?b!|6k=BsBkq_kY$Qs>3HiDv)j3(G1+t5OSjU+R*NXrxi3EmOsl;f= z@+a&Rx0PKFph9mf#?^N_4O~4Y$6Sj#YS+W9O8aLXimmi&mE51Iu88#^kvU)fFh;z?v}4prBV Qc4v9ikR)DU^Hs z`E;$4q;Nik?Zo0M-b? u+boZ^m$ZKa*zx?_x2S6AjDdPLP9#zsMyW7j=CK7L?UHq8#10R@IVLMFAt2NyX0 zQsnn19||Uvr}p%`eH1Yo$Lk2kHQ`0Mz$?>8H14OZrs13rkaYC;>rWeHSA*2I*a~Z? zr3>ij3R>#nX_OGSB!O6?=dUCqT8FstKANxm?D=Q+ah;!+MslmkC64mMIac)I;rg@R z=-RxQKHMM6lc*DkKc}f+e>o{)yvCxDj^EKZd}Usxs0F&dG!kuBvon4~x;0)%(7&tL zV14u8#2R(Tq$mBpDw&)ZvswF+3xi^c;@vbme_~Lig7XqM$oP_2TZ4H=L@?Z`Hyef4 zGAt>{C QuIC>=#`pX!Xi3*`sI1-5Ud{6u7M7?A+b 9xfWJZnrDx#C8a=LTHaOm4YfaKFOouP>oFM0lX{L z(=2?ufk1Uf%PT?v=k@_PCBE$YyFyj~p=i4>gZ5yC_jndLacz=?9}?ygG?vTs@v#FP zsId;@Aq%*)b2^&2k3qtV85C!&oGk1BV_E7oyvz!>Y>+j%4Y}erAd(182$8I6ZQ7l1 z73|Y#l!|{vck=AD?8hZOgp9I;Qup7zW>#8gARrwGxCpVBuz%{W5OtTk=PfB1hz~|5 zjSN7E$LJq6fRvEril+u3cc SjhyLK@D?0t$VaBCe%5)%x?fBZ?(rI9|Qs!NnOJTdkqSB zIv%i>O7&BV5$7 fja~j(*Ocv@c$Ux)|e>eZjJPe<^<{PWXrk7Ap*B@4{r~ zG$@0Q31>}WQ`Wy7=AF>>Np@XG5yr3yFnRh=ava2Ka+wVonUfox1c|<>>OOGZ_gx$7 z-E<~Bd!S=BL}8pelKJ%E0c_Bxn!oDi9?!{LNa kitZ-evs4P~})ybF8AFu^Os^^X4)Ux;H4_GCphy2}+eZwVqn;=Dj8>MSSA*OSc zWIop0Pn8vpFEk<<-OV89R=SYmStq4s1NYyPn~G2p#6qHzauEHl3DOSpIx1(%=J?-Z z?`;J}!~p^A4HfwS9-2KKqk4+fXT$c;v)X(q0;*I{>jX_D(L%h17FGT<)PjhhGu#Yt z$Z6gU3Iq5**?^clrL EKm2&v4(7c7Wc>Obne`CTnG3qQTzzvcH^L3FMIL`6FFfvN1VCyd3`5 z8#teY+%%dPvBShqUhCmQMoZq$sYoS7?~BFgJhtH4Qf{N1q-|@*+?c+r&CeMj2k>TA znh^h%Ci#(o7zR)xFM+lFHu5Wau5pEDI=*sPBW1Cn+R261XkK({_1(*uWaNdWcjn6l z?%?Le4(|+OGfqLg;t`;6E-2XDS}xzzs $8irfAjN9e_XUTqFFB - -&^L9r4@w5?V4DrC;L<0Upo>E?i}Rd|hU`O^f3ju}=L;ERN^;>&{y z%I69N9?ucUET(Bz*&A4JT9J|bdMTOuyBlCISh%V~jpwz{i^7*VR(xCVI*Eh7tPQ%9 zS~n;;XtQM|M&W*+<@6W3uchg?kN1PvQY0ne{nJ2MQAO%2(8xsBaY;o0-Q?0=qHDmk zuQ9z>`R*|p61}Lj&B4W#v*k+1)YZ1vAi-t(gNg}SWP6Grg
kVv+C`SQlyYk#gq7jNK%2$l4F{leF8?b_>m| zGdl0sLGDQE)ta5Fy(G_dAJfq8Paeky9H_1DRqzjPY^)`{rAr_2od4RE$8&aQ9^mcX z<|^8-`}$MKoX=O{fzr$CNq$@&;ymt9;b+F(AH`!!Xk$1h4J1%0-s4axe+CQ6nPaLX z^;BbO>s;QiBzo&xq