From 2803f48a21b57fff8fa18b939e74fce212244cc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20T=C5=AFma?= Date: Thu, 22 Nov 2018 21:57:21 +0100 Subject: [PATCH] Added support for symbol icons --- pbfplugin.pro | 6 +- pbfplugin.qrc | 2 + src/pbf.cpp | 11 +- src/sprites.cpp | 91 +++ src/sprites.h | 29 + src/style.cpp | 164 ++-- src/style.h | 56 +- src/text.cpp | 13 +- src/text.h | 29 +- src/textpointitem.cpp | 70 +- src/textpointitem.h | 9 +- src/tile.h | 8 +- style/sprite.json | 1682 +++++++++++++++++++++++++++++++++++++++++ style/sprite.png | Bin 0 -> 49086 bytes 14 files changed, 2060 insertions(+), 110 deletions(-) create mode 100644 src/sprites.cpp create mode 100644 src/sprites.h create mode 100644 style/sprite.json create mode 100644 style/sprite.png diff --git a/pbfplugin.pro b/pbfplugin.pro index 7badc33..7321506 100644 --- a/pbfplugin.pro +++ b/pbfplugin.pro @@ -19,7 +19,8 @@ HEADERS += src/pbfhandler.h \ src/textpathitem.h \ src/textpointitem.h \ src/font.h \ - src/textitem.h + src/textitem.h \ + src/sprites.h SOURCES += src/pbfplugin.cpp \ src/pbfhandler.cpp \ src/gzip.cpp \ @@ -30,7 +31,8 @@ SOURCES += src/pbfplugin.cpp \ src/function.cpp \ src/textpathitem.cpp \ src/textpointitem.cpp \ - src/font.cpp + src/font.cpp \ + src/sprites.cpp RESOURCES += pbfplugin.qrc unix:!macx{ diff --git a/pbfplugin.qrc b/pbfplugin.qrc index ed8fc7b..11c11d4 100644 --- a/pbfplugin.qrc +++ b/pbfplugin.qrc @@ -1,5 +1,7 @@ style/style.json + style/sprite.json + style/sprite.png diff --git a/src/pbf.cpp b/src/pbf.cpp index acc340e..971a441 100644 --- a/src/pbf.cpp +++ b/src/pbf.cpp @@ -116,7 +116,7 @@ static inline QPoint parameters(quint32 v1, quint32 v2) static void drawFeature(const Feature &feature, Style *style, int styleLayer, const QSizeF &factor, Tile &tile) { - if (!style->match(styleLayer, feature.tags())) + if (!style->match(tile.zoom(), styleLayer, feature.tags())) return; QPoint cursor; @@ -151,7 +151,7 @@ static void drawFeature(const Feature &feature, Style *style, int styleLayer, } } - style->drawFeature(styleLayer, path, feature.tags(), tile); + style->drawFeature(tile, styleLayer, path, feature.tags()); } static void drawLayer(const Layer &layer, Style *style, int styleLayer, @@ -163,7 +163,9 @@ static void drawLayer(const Layer &layer, Style *style, int styleLayer, QSizeF factor(tile.size().width() / scale.x() / (qreal)layer.data()->extent(), tile.size().height() / scale.y() / (qreal)layer.data()->extent()); - style->setPainter(styleLayer, tile); + style->setPainter(tile, styleLayer); + style->setTextProperties(tile, styleLayer); + for (int i = 0; i < layer.features().size(); i++) drawFeature(layer.features().at(i), style, styleLayer, factor, tile); } @@ -177,9 +179,8 @@ bool PBF::render(const QByteArray &data, int zoom, Style *style, return false; } - Tile t(image, scale); + Tile t(image, zoom, scale); - style->setZoom(zoom); style->drawBackground(t); // Prepare source layers diff --git a/src/sprites.cpp b/src/sprites.cpp new file mode 100644 index 0000000..69e8fc0 --- /dev/null +++ b/src/sprites.cpp @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include "sprites.h" + + +/* + Loading the sprites atlas image must be deferred until all image plugins + are loaded, otherwise reading the image will cause a deadlock! +*/ +static QImage &atlas(const QString &fileName) +{ + static QImage *img = new QImage(fileName); + return *img; +} + +Sprites::Sprite::Sprite(const QJsonObject &json) +{ + int x, y, width, height; + + if (json.contains("x") && json["x"].isDouble()) + x = json["x"].toInt(); + else + return; + if (json.contains("y") && json["y"].isDouble()) + y = json["y"].toInt(); + else + return; + if (json.contains("width") && json["width"].isDouble()) + width = json["width"].toInt(); + else + return; + if (json.contains("height") && json["height"].isDouble()) + height = json["height"].toInt(); + else + return; + + _rect = QRect(x, y, width, height); +} + +bool Sprites::load(const QString &jsonFile, const QString &imageFile) +{ + _imageFile = imageFile; + + QFile file(jsonFile); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qCritical() << jsonFile << ": error opening file"; + return false; + } + QByteArray ba(file.readAll()); + + QJsonParseError error; + QJsonDocument doc(QJsonDocument::fromJson(ba, &error)); + if (doc.isNull()) { + qCritical() << jsonFile << ":" << error.errorString(); + return false; + } + + QJsonObject json(doc.object()); + for (QJsonObject::const_iterator it = json.constBegin(); + it != json.constEnd(); it++) { + QJsonValue val(*it); + if (val.isObject()) + _sprites.insert(it.key(), Sprite(val.toObject())); + else + qWarning() << it.key() << ": invalid sprite definition"; + } + + return true; +} + +QImage Sprites::icon(const QString &name) const +{ + if (_imageFile.isNull()) + return QImage(); + const QImage &img = atlas(_imageFile); + if (img.isNull()) + return QImage(); + + QMap::const_iterator it = _sprites.find(name); + if (it == _sprites.constEnd()) + return QImage(); + + if (!img.rect().contains(it->rect())) { + qWarning() << it->rect() << ": invalid sprite rect"; + return QImage(); + } + + return img.copy(it->rect()); +} diff --git a/src/sprites.h b/src/sprites.h new file mode 100644 index 0000000..a029f58 --- /dev/null +++ b/src/sprites.h @@ -0,0 +1,29 @@ +#ifndef SPRITES_H +#define SPRITES_H + +#include +#include +#include + +class Sprites +{ +public: + bool load(const QString &jsonFile, const QString &imageFile); + + QImage icon(const QString &name) const; + +private: + class Sprite { + public: + Sprite(const QJsonObject &json); + const QRect &rect() const {return _rect;} + + private: + QRect _rect; + }; + + QMap _sprites; + QString _imageFile; +}; + +#endif // SPRITES_H diff --git a/src/style.cpp b/src/style.cpp index 87b7981..c591f98 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include "text.h" #include "color.h" @@ -168,6 +170,32 @@ bool Style::Layer::Filter::match(const QVariantHash &tags) const } } +Style::Layer::Template::Template(const QString &str) : _field(str) +{ + int pos = 0; + + while ((pos = _rx.indexIn(_field, pos)) != -1) { + QString match = _rx.capturedTexts().first(); + _keys.append(match.mid(1, match.size() - 2)); + pos += _rx.matchedLength(); + } +} + +QString Style::Layer::Template::value(const QVariantHash &tags) const +{ + QString text(_field); + + for (int i = 0; i < _keys.size(); i++) { + const QString &key = _keys.at(i); + const QVariant val = tags.value(key); + text.replace(QString("{%1}").arg(key), val.toString()); + } + + return text; +} + +QRegExp Style::Layer::Template::_rx = QRegExp("\\{[^\\}]*\\}"); + Style::Layer::Paint::Paint(const QJsonObject &json) : _fillOpacity(1.0), _lineOpacity(1.0), _lineWidth(1.0) { @@ -275,7 +303,7 @@ bool Style::Layer::Paint::antialias(Layer::Type type, int zoom) const Style::Layer::Layout::Layout(const QJsonObject &json) : _textSize(16), _textMaxWidth(10), _textMaxAngle(45), _lineCap(Qt::FlatCap), _lineJoin(Qt::MiterJoin), _font("Open Sans"), _capitalize(false), - _viewportAlignment(false) + _viewportAlignment(false), _textAnchor(Text::Center) { // line if (json.contains("line-cap") && json["line-cap"].isString()) { @@ -292,17 +320,8 @@ Style::Layer::Layout::Layout(const QJsonObject &json) } // text - if (!(json.contains("text-field") && json["text-field"].isString())) - return; - _textField = json["text-field"].toString(); - - QRegExp rx("\\{[^\\}]*\\}"); - int pos = 0; - while ((pos = rx.indexIn(_textField, pos)) != -1) { - QString match = rx.capturedTexts().first(); - _keys.append(match.mid(1, match.size() - 2)); - pos += rx.matchedLength(); - } + if (json.contains("text-field") && json["text-field"].isString()) + _text = Template(json["text-field"].toString()); jsonFloat(json, "text-size", _textSize); jsonFloat(json, "text-max-width", _textMaxWidth); @@ -311,11 +330,27 @@ Style::Layer::Layout::Layout(const QJsonObject &json) _font = Font::fromJsonArray(json["text-font"].toArray()); if (json.contains("text-transform") && json["text-transform"].isString()) _capitalize = json["text-transform"].toString() == "uppercase"; - if (json.contains("text-rotation-alignment") && json["text-rotation-alignment"].isString()) if (json["text-rotation-alignment"].toString() == "viewport") _viewportAlignment = true; + if (json.contains("text-anchor") && json["text-anchor"].isString()) { + QString anchor(json["text-anchor"].toString()); + if (anchor == "center") + _textAnchor = Text::Center; + else if (anchor == "left") + _textAnchor = Text::Left; + else if (anchor == "right") + _textAnchor = Text::Right; + else if (anchor == "top") + _textAnchor = Text::Top; + else if (anchor == "bottom") + _textAnchor = Text::Bottom; + } + + // icon + if (json.contains("icon-image") && json["icon-image"].isString()) + _icon = Template(json["icon-image"].toString()); } QFont Style::Layer::Layout::font(int zoom) const @@ -374,58 +409,61 @@ bool Style::Layer::match(int zoom, const QVariantHash &tags) const return _filter.match(tags); } -void Style::Layer::setPathPainter(int zoom, Tile &tile) const +void Style::Layer::setPathPainter(Tile &tile) const { - QPen pen(_paint.pen(_type, zoom)); - QBrush brush(_paint.brush(_type, zoom)); + QPen pen(_paint.pen(_type, tile.zoom())); + QBrush brush(_paint.brush(_type, tile.zoom())); pen.setJoinStyle(_layout.lineJoin()); pen.setCapStyle(_layout.lineCap()); QPainter &p = tile.painter(); - p.setRenderHint(QPainter::Antialiasing, _paint.antialias(_type, zoom)); + p.setRenderHint(QPainter::Antialiasing, _paint.antialias(_type, tile.zoom())); p.setPen(pen); p.setBrush(brush); - p.setOpacity(_paint.opacity(_type, zoom)); + p.setOpacity(_paint.opacity(_type, tile.zoom())); } -void Style::Layer::setSymbolPainter(int zoom, Tile &tile) const +void Style::Layer::setSymbolPainter(Tile &tile) const { - QPen pen(_paint.pen(_type, zoom)); - QFont font(_layout.font(zoom)); + QPen pen(_paint.pen(_type, tile.zoom())); + QFont font(_layout.font(tile.zoom())); QPainter &p = tile.painter(); p.setPen(pen); p.setFont(font); } -void Style::Layer::addSymbol(int zoom, const QPainterPath &path, - const QVariantHash &tags, Tile &tile) const +void Style::Layer::setTextProperties(Tile &tile) const { - if (_layout.keys().isEmpty()) - return; + Text::Properties prop; + prop.maxWidth = _layout.maxTextWidth(tile.zoom()); + prop.maxAngle = _layout.maxTextAngle(tile.zoom()); + prop.anchor = _layout.textAnchor(); - QString text(_layout.field()); - for (int i = 0; i < _layout.keys().size(); i++) { - const QString &key = _layout.keys().at(i); - const QVariant val = tags.value(key); - text.replace(QString("{%1}").arg(key), _layout.capitalize() - ? val.toString().toUpper() : val.toString()); - } + tile.text().setProperties(prop); +} +void Style::Layer::addSymbol(Tile &tile, const QPainterPath &path, + const QVariantHash &tags, const Sprites &sprites) const +{ + QString text = _layout.text().value(tags); QString tt(text.trimmed()); if (tt.isEmpty()) return; + if (_layout.capitalize()) + tt = tt.toUpper(); + + QString icon = _layout.icon().value(tags); if (_layout.viewportAlignment()) - tile.text().addLabel(tt, path.elementAt(0), tile.painter(), - _layout.maxTextWidth(zoom), false); + tile.text().addLabel(tt, path.elementAt(0), tile.painter(), false, + sprites.icon(icon)); else if (path.elementCount() == 1 && path.elementAt(0).isMoveTo()) - tile.text().addLabel(tt, path.elementAt(0), tile.painter(), - _layout.maxTextWidth(zoom), true); + tile.text().addLabel(tt, path.elementAt(0), tile.painter(), true, + sprites.icon(icon)); else - tile.text().addLabel(tt, path, tile.painter(), - _layout.maxTextAngle(zoom)); + tile.text().addLabel(tt, path, tile.painter()); } bool Style::load(const QString &fileName) @@ -450,53 +488,69 @@ bool Style::load(const QString &fileName) QJsonArray layers = json["layers"].toArray(); for (int i = 0; i < layers.size(); i++) if (layers[i].isObject()) - _styles.append(Layer(layers[i].toObject())); + _layers.append(Layer(layers[i].toObject())); } - for (int i = 0; i < _styles.size(); i++) - _sourceLayers.append(_styles.at(i).sourceLayer()); + for (int i = 0; i < _layers.size(); i++) + _sourceLayers.append(_layers.at(i).sourceLayer()); + + QDir styleDir = QFileInfo(fileName).absoluteDir(); + QString spritesJSON(styleDir.filePath("sprite.json")); + if (QFileInfo::exists(spritesJSON)) { + QString spritesImg(styleDir.filePath("sprite.png")); + if (QFileInfo::exists(spritesImg)) + _sprites.load(spritesJSON, spritesImg); + else + qCritical() << spritesImg << ": no such file"; + } return true; } -bool Style::match(int layer, const QVariantHash &tags) +bool Style::match(int zoom, int layer, const QVariantHash &tags) const { - return _styles.at(layer).match(_zoom, tags); + return _layers.at(layer).match(zoom, tags); } -void Style::setPainter(int layer, Tile &tile) +void Style::setTextProperties(Tile &tile, int layer) const { - const Layer &sl = _styles.at(layer); + const Layer &sl = _layers.at(layer); + sl.setTextProperties(tile); +} + +void Style::setPainter(Tile &tile, int layer) const +{ + const Layer &sl = _layers.at(layer); if (sl.isPath()) - sl.setPathPainter(_zoom, tile); + sl.setPathPainter(tile); else if (sl.isSymbol()) - sl.setSymbolPainter(_zoom, tile); + sl.setSymbolPainter(tile); } -void Style::drawFeature(int layer, const QPainterPath &path, - const QVariantHash &tags, Tile &tile) +void Style::drawFeature(Tile &tile, int layer, const QPainterPath &path, + const QVariantHash &tags) const { - const Layer &sl = _styles.at(layer); + const Layer &sl = _layers.at(layer); if (sl.isPath()) tile.painter().drawPath(path); else if (sl.isSymbol()) - sl.addSymbol(_zoom, path, tags, tile); + sl.addSymbol(tile, path, tags, _sprites); } -void Style::drawBackground(Tile &tile) +void Style::drawBackground(Tile &tile) const { QRectF rect(QPointF(0, 0), tile.size()); QPainterPath path; path.addRect(rect); - if (_styles.isEmpty()) { + if (_layers.isEmpty()) { tile.painter().setBrush(Qt::lightGray); tile.painter().setPen(Qt::NoPen); tile.painter().drawRect(rect); - } else if (_styles.first().isBackground()) { - _styles.first().setPathPainter(_zoom, tile); + } else if (_layers.first().isBackground()) { + _layers.first().setPathPainter(tile); tile.painter().drawPath(path); } diff --git a/src/style.h b/src/style.h index 1b84b25..1c292d3 100644 --- a/src/style.h +++ b/src/style.h @@ -9,7 +9,9 @@ #include #include #include +#include "text.h" #include "function.h" +#include "sprites.h" class QPainter; @@ -23,15 +25,15 @@ public: bool load(const QString &fileName); - void setZoom(int zoom) {_zoom = zoom;} - const QStringList &sourceLayers() const {return _sourceLayers;} - bool match(int layer, const QVariantHash &tags); - void drawBackground(Tile &tile); - void setPainter(int layer, Tile &tile); - void drawFeature(int layer, const QPainterPath &path, - const QVariantHash &tags, Tile &tile); + bool match(int zoom, int layer, const QVariantHash &tags) const; + + void drawBackground(Tile &tile) const; + void setPainter(Tile &tile, int layer) const; + void setTextProperties(Tile &tile, int layer) const; + void drawFeature(Tile &tile, int layer, const QPainterPath &path, + const QVariantHash &tags) const; private: class Layer { @@ -45,10 +47,11 @@ private: bool isSymbol() const {return (_type == Symbol);} bool match(int zoom, const QVariantHash &tags) const; - void setPathPainter(int zoom, Tile &tile) const; - void setSymbolPainter(int zoom, Tile &tile) const; - void addSymbol(int zoom, const QPainterPath &path, - const QVariantHash &tags, Tile &tile) const; + void setPathPainter(Tile &tile) const; + void setSymbolPainter(Tile &tile) const; + void setTextProperties(Tile &tile) const; + void addSymbol(Tile &tile, const QPainterPath &path, + const QVariantHash &tags, const Sprites &sprites) const; private: enum Type { @@ -80,12 +83,25 @@ private: QVector _filters; }; + class Template { + public: + Template() {} + Template(const QString &str); + + QString value(const QVariantHash &tags) const; + + private: + static QRegExp _rx; + QStringList _keys; + QString _field; + }; + class Layout { public: Layout() : _textSize(16), _textMaxWidth(10), _textMaxAngle(45), _lineCap(Qt::FlatCap), _lineJoin(Qt::MiterJoin), - _font("Open Sans"), _capitalize(false), _viewportAlignment(false) - {} + _font("Open Sans"), _capitalize(false), _viewportAlignment(false), + _textAnchor(Text::Center) {} Layout(const QJsonObject &json); bool capitalize() const {return _capitalize;} @@ -93,16 +109,17 @@ private: {return _textMaxWidth.value(zoom);} qreal maxTextAngle(int zoom) const {return _textMaxAngle.value(zoom);} - const QString &field() const {return _textField;} - const QStringList &keys() const {return _keys;} + const Template &text() const {return _text;} + const Template &icon() const {return _icon;} QFont font(int zoom) const; Qt::PenCapStyle lineCap() const {return _lineCap;} Qt::PenJoinStyle lineJoin() const {return _lineJoin;} bool viewportAlignment() const {return _viewportAlignment;} + Text::Anchor textAnchor() const {return _textAnchor;} private: - QStringList _keys; - QString _textField; + Template _text; + Template _icon; FunctionF _textSize; FunctionF _textMaxWidth; FunctionF _textMaxAngle; @@ -111,6 +128,7 @@ private: QFont _font; bool _capitalize; bool _viewportAlignment; + Text::Anchor _textAnchor; }; class Paint { @@ -144,9 +162,9 @@ private: Paint _paint; }; - int _zoom; - QVector _styles; + QVector _layers; QStringList _sourceLayers; + Sprites _sprites; }; #endif // STYLE_H diff --git a/src/text.cpp b/src/text.cpp index bbb5e52..4bcc202 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -150,28 +150,27 @@ void Text::render(QPainter *painter) const } void Text::addLabel(const QString &text, const QPointF &pos, - const QPainter &painter, qreal maxTextWidth, bool overlap) + const QPainter &painter, bool overlap, const QImage &icon) { if (text.isEmpty()) return; - TextPointItem *ti; - - ti = new TextPointItem(text, pos, painter.font(), maxTextWidth); + TextPointItem *ti = new TextPointItem(text, pos, painter.font(), + _properties, icon); if (!overlap && !_sceneRect.contains(ti->boundingRect())) { delete ti; return; } - ti->setPen(painter.pen()); addItem(ti); + QList ci = collidingItems(ti); for (int i = 0; i < ci.size(); i++) ci[i]->setVisible(false); } void Text::addLabel(const QString &text, const QPainterPath &path, - const QPainter &painter, qreal maxAngle) + const QPainter &painter) { if (path.isEmpty()) return; @@ -182,7 +181,7 @@ void Text::addLabel(const QString &text, const QPainterPath &path, if (textWidth > path.length()) return; - QPainterPath tp(textPath(path, textWidth, maxAngle, + QPainterPath tp(textPath(path, textWidth, _properties.maxAngle, painter.font().pixelSize() / 2, _sceneRect)); if (tp.isEmpty()) return; diff --git a/src/text.h b/src/text.h index 26c84a9..99c3107 100644 --- a/src/text.h +++ b/src/text.h @@ -1,20 +1,40 @@ #ifndef TEXT_H #define TEXT_H -#include "textitem.h" +#include + +class TextItem; class Text { public: + enum Anchor { + Center, + Left, + Right, + Top, + Bottom + }; + + struct Properties { + int maxWidth; + int maxAngle; + Anchor anchor; + }; + + Text(const QSize &size) : _sceneRect(QRectF(QPointF(0, 0), size)) {} ~Text(); - void render(QPainter *painter) const; + void setProperties(const Properties &prop) + {_properties = prop;} void addLabel(const QString &text, const QPointF &pos, - const QPainter &painter, qreal maxTextWidth, bool overlap); + const QPainter &painter, bool overlap, const QImage &icon); void addLabel(const QString &text, const QPainterPath &path, - const QPainter &painter, qreal maxAngle); + const QPainter &painter); + + void render(QPainter *painter) const; private: void addItem(TextItem *item) {_items.append(item);} @@ -22,6 +42,7 @@ private: QRectF _sceneRect; QList _items; + Properties _properties; }; #endif // TEXT_H diff --git a/src/textpointitem.cpp b/src/textpointitem.cpp index ac97bed..a663e43 100644 --- a/src/textpointitem.cpp +++ b/src/textpointitem.cpp @@ -1,13 +1,11 @@ -#include +#include #include #include "textpointitem.h" #define FLAGS (Qt::AlignCenter | Qt::TextWordWrap | Qt::TextDontClip) -#ifdef USE_EXACT_TEXT_RECT - -static QRectF textBoundingRect(const QString &str, const QFont &font, +static QRectF exactBoundingRect(const QString &str, const QFont &font, int maxTextWidth) { QFontMetrics fm(font); @@ -26,8 +24,7 @@ static QRectF textBoundingRect(const QString &str, const QFont &font, return br; } -#else // USE_EXACT_TEXT_RECT -static QRectF textBoundingRect(const QString &str, const QFont &font, +static QRectF fuzzyBoundingRect(const QString &str, const QFont &font, int maxTextWidth) { int limit = font.pixelSize() * maxTextWidth; @@ -67,23 +64,68 @@ static QRectF textBoundingRect(const QString &str, const QFont &font, return QRectF(0, 0, width, lines * lh); } -#endif // USE_EXACT_TEXT_RECT + + +QRectF TextPointItem::computeTextRect(BoundingRectFunction brf) const +{ + QRectF iconRect = _icon.isNull() ? QRectF() : _icon.rect(); + QRectF textRect = brf(text(), _font, _properties.maxWidth); + + switch (_properties.anchor) { + case Text::Center: + textRect.moveCenter(_pos); + break; + case Text::Left: + textRect.moveTopLeft(_pos - QPointF(-iconRect.width() / 2, + textRect.height() / 2)); + break; + case Text::Right: + textRect.moveTopRight(_pos - QPointF(iconRect.width() / 2, + textRect.height() / 2)); + break; + case Text::Bottom: + textRect.moveTopLeft(_pos - QPointF(textRect.width() / 2, + iconRect.height() / 2)); + break; + case Text::Top: + textRect.moveTopLeft(_pos - QPointF(textRect.width() / 2, + -iconRect.height() / 2)); + break; + } + + return textRect; +} TextPointItem::TextPointItem(const QString &text, const QPointF &pos, - const QFont &font, int maxTextWidth) : TextItem(text), _font(font) + const QFont &font, const Text::Properties &prop, const QImage &icon) + : TextItem(text), _pos(pos), _font(font), _icon(icon), _properties(prop) { - _boundingRect = textBoundingRect(text, font, maxTextWidth); + _boundingRect = computeTextRect(fuzzyBoundingRect); + + if (!_icon.isNull()) { + QRectF iconRect(_icon.rect()); + iconRect.moveCenter(pos); + _boundingRect |= iconRect; + } - _boundingRect.moveCenter(pos); _shape.addRect(_boundingRect); } void TextPointItem::paint(QPainter *painter) const { - painter->setFont(_font); - painter->setPen(_pen); - painter->drawText(_boundingRect, FLAGS, text()); - //painter->setPen(Qt::red); //painter->drawRect(_boundingRect); + + QRectF textRect; + + if (!_icon.isNull()) { + textRect = computeTextRect(exactBoundingRect); + painter->drawImage(_pos - QPointF(_icon.width() / 2, + _icon.height() / 2), _icon); + } else + textRect = computeTextRect(fuzzyBoundingRect); + + painter->setFont(_font); + painter->setPen(_pen); + painter->drawText(textRect, FLAGS, text()); } diff --git a/src/textpointitem.h b/src/textpointitem.h index 4a51fc3..a0f33f6 100644 --- a/src/textpointitem.h +++ b/src/textpointitem.h @@ -5,12 +5,13 @@ #include #include #include "textitem.h" +#include "text.h" class TextPointItem : public TextItem { public: TextPointItem(const QString &text, const QPointF &pos, const QFont &font, - int maxTextWidth); + const Text::Properties &prop, const QImage &icon); QRectF boundingRect() const {return _boundingRect;} QPainterPath shape() const {return _shape;} @@ -19,10 +20,16 @@ public: void setPen(const QPen &pen) {_pen = pen;} private: + typedef QRectF (*BoundingRectFunction)(const QString &, const QFont &, int); + QRectF computeTextRect(BoundingRectFunction brf) const; + + QPointF _pos; QPainterPath _shape; QRectF _boundingRect; QFont _font; QPen _pen; + QImage _icon; + Text::Properties _properties; }; #endif // TEXTPOINTITEM_H diff --git a/src/tile.h b/src/tile.h index 7aaa56b..1ba16e0 100644 --- a/src/tile.h +++ b/src/tile.h @@ -7,16 +7,18 @@ class Tile { public: - Tile(QImage *img, const QPointF &scale) - : _size(img->size()), _text(QSize(img->size().width() / scale.x(), - img->size().height() / scale.y())), _painter(img) + Tile(QImage *img, int zoom, const QPointF &scale) + : _zoom(zoom), _size(img->size()), _text(QSize(img->size().width() + / scale.x(), img->size().height() / scale.y())), _painter(img) {_painter.scale(scale.x(), scale.y());} + int zoom() const {return _zoom;} QSize size() const {return _size;} Text &text() {return _text;} QPainter &painter() {return _painter;} private: + int _zoom; QSize _size; Text _text; QPainter _painter; diff --git a/style/sprite.json b/style/sprite.json new file mode 100644 index 0000000..ffe03b5 --- /dev/null +++ b/style/sprite.json @@ -0,0 +1,1682 @@ +{ + "aerialway_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 284, + "y": 127 + }, + "aerialway_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 80, + "y": 190 + }, + "airfield_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 299, + "y": 127 + }, + "airfield_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 99, + "y": 190 + }, + "airport_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 314, + "y": 127 + }, + "airport_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 118, + "y": 190 + }, + "alcohol_shop_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 381, + "y": 210 + }, + "alcohol_shop_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 64, + "y": 0 + }, + "america_football_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 398, + "y": 210 + }, + "america_football_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 85, + "y": 0 + }, + "amusement_park_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 415, + "y": 210 + }, + "amusement_park_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 106, + "y": 0 + }, + "aquarium_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 432, + "y": 210 + }, + "aquarium_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 64 + }, + "art_gallery_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 449, + "y": 210 + }, + "art_gallery_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 64 + }, + "attraction_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 466, + "y": 210 + }, + "attraction_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 64 + }, + "bakery_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 483, + "y": 210 + }, + "bakery_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 64 + }, + "bank_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 227, + "y": 229 + }, + "bank_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 64 + }, + "bar_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 244, + "y": 229 + }, + "bar_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 64 + }, + "baseball_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 261, + "y": 229 + }, + "baseball_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 85 + }, + "basketball_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 278, + "y": 229 + }, + "basketball_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 85 + }, + "beer_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 295, + "y": 229 + }, + "beer_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 85 + }, + "bicycle_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 312, + "y": 229 + }, + "bicycle_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 85 + }, + "bicycle_rental_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 329, + "y": 229 + }, + "bicycle_rental_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 85 + }, + "building_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 329, + "y": 127 + }, + "building_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 137, + "y": 190 + }, + "bus_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 344, + "y": 127 + }, + "bus_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 156, + "y": 190 + }, + "butcher_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 346, + "y": 229 + }, + "butcher_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 85 + }, + "cafe_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 363, + "y": 229 + }, + "cafe_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 106 + }, + "campsite_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 380, + "y": 229 + }, + "campsite_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 106 + }, + "car_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 359, + "y": 127 + }, + "car_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 175, + "y": 190 + }, + "castle_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 397, + "y": 229 + }, + "castle_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 106 + }, + "cemetery_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 414, + "y": 229 + }, + "cemetery_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 106 + }, + "cinema_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 431, + "y": 229 + }, + "cinema_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 106 + }, + "circle-stroked_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 374, + "y": 127 + }, + "circle-stroked_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 194, + "y": 190 + }, + "circle_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 389, + "y": 127 + }, + "circle_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 213, + "y": 190 + }, + "clothing_store_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 448, + "y": 229 + }, + "clothing_store_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 106 + }, + "college_11": { + "height": 16, + "pixelRatio": 1, + "width": 16, + "x": 473, + "y": 106 + }, + "college_15": { + "height": 20, + "pixelRatio": 1, + "width": 20, + "x": 0, + "y": 190 + }, + "commercial_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 404, + "y": 127 + }, + "commercial_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 232, + "y": 190 + }, + "cricket_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 465, + "y": 229 + }, + "cricket_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 64 + }, + "cross_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 419, + "y": 127 + }, + "cross_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 0, + "y": 210 + }, + "dam_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 434, + "y": 127 + }, + "dam_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 19, + "y": 210 + }, + "danger_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 482, + "y": 229 + }, + "danger_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 64 + }, + "default_1": { + "height": 18, + "pixelRatio": 1, + "width": 18, + "x": 152, + "y": 229 + }, + "default_2": { + "height": 18, + "pixelRatio": 1, + "width": 25, + "x": 170, + "y": 229 + }, + "default_3": { + "height": 18, + "pixelRatio": 1, + "width": 32, + "x": 195, + "y": 229 + }, + "default_4": { + "height": 18, + "pixelRatio": 1, + "width": 39, + "x": 247, + "y": 210 + }, + "default_5": { + "height": 18, + "pixelRatio": 1, + "width": 45, + "x": 286, + "y": 210 + }, + "default_6": { + "height": 18, + "pixelRatio": 1, + "width": 50, + "x": 331, + "y": 210 + }, + "dentist_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 251, + "y": 190 + }, + "dentist_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 64 + }, + "doctor_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 268, + "y": 190 + }, + "doctor_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 64 + }, + "dog_park_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 285, + "y": 190 + }, + "dog_park_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 64 + }, + "dot_10": { + "height": 10, + "pixelRatio": 1, + "width": 10, + "x": 499, + "y": 229 + }, + "dot_11": { + "height": 11, + "pixelRatio": 1, + "width": 11, + "x": 500, + "y": 210 + }, + "dot_9": { + "height": 9, + "pixelRatio": 1, + "width": 9, + "x": 477, + "y": 148 + }, + "drinking-water_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 302, + "y": 190 + }, + "drinking_water_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 64 + }, + "embassy_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 319, + "y": 190 + }, + "embassy_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 85 + }, + "entrance_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 449, + "y": 127 + }, + "entrance_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 38, + "y": 210 + }, + "fast_food_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 336, + "y": 190 + }, + "fast_food_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 85 + }, + "ferry_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 464, + "y": 127 + }, + "ferry_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 57, + "y": 210 + }, + "fire-station_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 353, + "y": 190 + }, + "fire-station_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 85 + }, + "fuel_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 479, + "y": 127 + }, + "fuel_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 76, + "y": 210 + }, + "garden_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 370, + "y": 190 + }, + "garden_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 85 + }, + "gift_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 387, + "y": 190 + }, + "gift_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 85 + }, + "golf_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 404, + "y": 190 + }, + "golf_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 85 + }, + "grocery_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 421, + "y": 190 + }, + "grocery_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 106 + }, + "hairdresser_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 438, + "y": 190 + }, + "hairdresser_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 106 + }, + "harbor_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 494, + "y": 127 + }, + "harbor_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 95, + "y": 210 + }, + "heart_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 455, + "y": 190 + }, + "heart_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 106 + }, + "heliport_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 252, + "y": 148 + }, + "heliport_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 114, + "y": 210 + }, + "hospital_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 472, + "y": 190 + }, + "hospital_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 106 + }, + "ice_cream_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 489, + "y": 190 + }, + "ice_cream_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 106 + }, + "industry_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 267, + "y": 148 + }, + "industry_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 133, + "y": 210 + }, + "information_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 252, + "y": 64 + }, + "information_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 106 + }, + "laundry_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 269, + "y": 64 + }, + "laundry_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 127, + "y": 0 + }, + "library_11": { + "height": 16, + "pixelRatio": 1, + "width": 16, + "x": 489, + "y": 106 + }, + "library_15": { + "height": 20, + "pixelRatio": 1, + "width": 20, + "x": 20, + "y": 190 + }, + "lighthouse_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 286, + "y": 64 + }, + "lighthouse_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 148, + "y": 0 + }, + "lodging_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 303, + "y": 64 + }, + "lodging_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 169, + "y": 0 + }, + "marker_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 282, + "y": 148 + }, + "marker_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 152, + "y": 210 + }, + "monument_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 320, + "y": 64 + }, + "monument_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 190, + "y": 0 + }, + "mountain_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 337, + "y": 64 + }, + "mountain_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 211, + "y": 0 + }, + "museum_11": { + "height": 16, + "pixelRatio": 1, + "width": 16, + "x": 252, + "y": 127 + }, + "museum_15": { + "height": 20, + "pixelRatio": 1, + "width": 20, + "x": 40, + "y": 190 + }, + "music_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 354, + "y": 64 + }, + "music_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 232, + "y": 0 + }, + "park_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 371, + "y": 64 + }, + "park_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 127 + }, + "parking_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 297, + "y": 148 + }, + "parking_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 171, + "y": 210 + }, + "parking_garage_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 312, + "y": 148 + }, + "parking_garage_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 190, + "y": 210 + }, + "pedestrian_polygon": { + "height": 64, + "pixelRatio": 1, + "width": 64, + "x": 0, + "y": 0 + }, + "pharmacy_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 388, + "y": 64 + }, + "pharmacy_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 127 + }, + "picnic_site_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 405, + "y": 64 + }, + "picnic_site_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 127 + }, + "pitch_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 422, + "y": 64 + }, + "pitch_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 127 + }, + "place_of_worship_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 439, + "y": 64 + }, + "place_of_worship_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 127 + }, + "playground_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 456, + "y": 64 + }, + "playground_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 127 + }, + "police_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 473, + "y": 64 + }, + "police_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 127 + }, + "post_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 490, + "y": 64 + }, + "post_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 127 + }, + "prison_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 252, + "y": 85 + }, + "prison_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 127 + }, + "railway_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 327, + "y": 148 + }, + "railway_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 209, + "y": 210 + }, + "railway_light_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 342, + "y": 148 + }, + "railway_light_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 228, + "y": 210 + }, + "railway_metro_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 357, + "y": 148 + }, + "railway_metro_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 0, + "y": 229 + }, + "ranger_station_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 269, + "y": 85 + }, + "ranger_station_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 127 + }, + "religious_christian_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 286, + "y": 85 + }, + "religious_christian_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 127 + }, + "religious_jewish_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 303, + "y": 85 + }, + "religious_jewish_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 127 + }, + "religious_muslim_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 320, + "y": 85 + }, + "religious_muslim_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 148 + }, + "restaurant_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 337, + "y": 85 + }, + "restaurant_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 148 + }, + "roadblock_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 354, + "y": 85 + }, + "roadblock_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 148 + }, + "rocket_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 371, + "y": 85 + }, + "rocket_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 148 + }, + "school_11": { + "height": 16, + "pixelRatio": 1, + "width": 16, + "x": 268, + "y": 127 + }, + "school_15": { + "height": 20, + "pixelRatio": 1, + "width": 20, + "x": 60, + "y": 190 + }, + "shelter_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 388, + "y": 85 + }, + "shelter_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 148 + }, + "shop_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 405, + "y": 85 + }, + "shop_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 148 + }, + "skiing_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 422, + "y": 85 + }, + "skiing_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 148 + }, + "soccer_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 439, + "y": 85 + }, + "soccer_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 148 + }, + "square-stroke_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 372, + "y": 148 + }, + "square-stroke_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 19, + "y": 229 + }, + "square_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 387, + "y": 148 + }, + "square_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 38, + "y": 229 + }, + "stadium_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 456, + "y": 85 + }, + "stadium_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 148 + }, + "star-stroke_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 402, + "y": 148 + }, + "star-stroke_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 57, + "y": 229 + }, + "star_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 417, + "y": 148 + }, + "star_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 76, + "y": 229 + }, + "suitcase_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 473, + "y": 85 + }, + "suitcase_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 148 + }, + "sushi_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 490, + "y": 85 + }, + "sushi_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 148 + }, + "swimming_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 252, + "y": 106 + }, + "swimming_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 148 + }, + "telephone_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 269, + "y": 106 + }, + "telephone_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 169 + }, + "tennis_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 286, + "y": 106 + }, + "tennis_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 169 + }, + "theatre_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 303, + "y": 106 + }, + "theatre_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 169 + }, + "toilet_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 320, + "y": 106 + }, + "toilet_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 169 + }, + "town-hall_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 337, + "y": 106 + }, + "town-hall_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 169 + }, + "triangle_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 432, + "y": 148 + }, + "triangle_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 95, + "y": 229 + }, + "triangle_stroked_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 447, + "y": 148 + }, + "triangle_stroked_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 114, + "y": 229 + }, + "veterinary_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 354, + "y": 106 + }, + "veterinary_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 169 + }, + "volcano_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 371, + "y": 106 + }, + "volcano_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 169 + }, + "warehouse_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 462, + "y": 148 + }, + "warehouse_15": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 133, + "y": 229 + }, + "waste_basket_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 388, + "y": 106 + }, + "waste_basket_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 169 + }, + "water_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 405, + "y": 106 + }, + "water_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 169 + }, + "wetland_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 422, + "y": 106 + }, + "wetland_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 169 + }, + "wheelchair_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 439, + "y": 106 + }, + "wheelchair_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 169 + }, + "zoo_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 456, + "y": 106 + }, + "zoo_15": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 169 + } +} \ No newline at end of file diff --git a/style/sprite.png b/style/sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..762589d1e07a0ea2a7cf362a9dcb14bd71d7c843 GIT binary patch literal 49086 zcmeFYXH-*B*Dgv?P^5}9Y0^ZBbRnTD(jh3lcLW3}p?6S;ArbjASHZt+B`6Ypylte4hEt*jFG`3bKb}1Ox;W>S`}_ z2?z*r_}>?INbujQ9}a5?2*L@}Uq09OhwinJdRsJR3T0(y2Asolf=UtatX7#O)Kpfz zdWpT5IA88ayrylbDTJ1R?;x$E+2M4t+}0%NosUUh?O&enul62%>g7yKQd1Y?6zS2B+}?;eUwql|SF~!ZcBpCFV5}DZhU! zDG|!~#bKvgPA+_;f}8|lMUnUqb=C$;h5eyl^FX~A_Mvv8jHG0Pf`Y6)tW?0@~B(Y;En4U|U3Yq&5I-rE@U>fhf1PwjS}%w})iw8yY4R z6>&=tE!Nc$y?ps{o`IHjQrFm6Eif=J1^Np@mSZ^2DzQZDJGP7JyzAg2HHZ$_ln@d5 zr7CLr;7F|x9g;`4E@d+%EG+Dp>S)(}#eKLhTwSQg6NJSCNDvsBG85E`9zUuGp4;8o zNntURkd!Q#a8q?~53v-37ZkjyeWywpVApMe#Atf%ee{3rsreh~_X3_)V#W=8{NB~F zJ$%F;d$%^Ak0|Lrv$|<^wn{3L<@!2geXFu!51@ZD*BVGcPJUqXndG+YgdKJufgR`d z{o)5dKYwuQo0X&v8yLGPZyw>7tSpTu1Ky!lHg3vQ_fp+O6nS)l0!C9dfAGWGz9JGg zEkAQrbp)jC&17myx{tn5?e%1vUI3eV3Ko6zjI|l6{Zt8%nVTCLVaVll$6=)iZKgiy zBv!%+H8rcjlzrC^BBIIGm53e60EdxK!+Aj$9-Eb7`@dP_$f+VPT@W$xhai^1=Y$FM zLtoFnr@e7-KpS=2cx5810{ zc^Qz5ayfCM!`JhjIxRT5N>0Wen%W2+TD8N0-2On>#o%d%|1M;$w0(o2N{@9kAJ=W> z@?M>7CJPwthKvot@Y}{(WR=XHd#zsT#Hilr&tu5(`MGamfx(hJtiyj)A!#n8t%0uU z4&crNneScMiWLtY=JW~|J`Pgd#mAa2+Ew4MV;;+dW=SOKOCd;$ltW>Yo2PqcYmwi+ z3Sdt@{Vb{)E3|GxsKT&$K71R~9N?o&IEni*ZLf@AIuW6B%Gh9WDRY9+y zygGEr%9@iy*|cMc36d6EcVp?=RUVRtfjBok{_v5IkQDyMDE2Iq=)8L6Ke@r#e4%XA z3>=n9%i+_{D$317{%TC=-5WO6ro&1Nju2Z>+^M4sj%Vrk^^xyR2M#t&y!lpuxBtZE zpDNW?fk2jgOdp_{93gL0|j*gHg1UYVIZPt#%%X4O@kX?T10 zn^4ELDTozu7>(+VSJFE6^Oj0ZEj{2p2F{W6#X5em`u+0q%Ka)wSips6g{Ij4G>9p5 zEY@ogZQ9q_Y5m7e;>mL2=gHhl4*z|xdUGIs-aJi~@IHIl%iB@HSQ3%j)Ls>$2#uGn zQ!3vk8lyi7xLhM`TGL>Rc8Ewl_Wmq!`$ zW01?ep`l+d<4`2)baedi%{P{u`|m0sP^=uTbVhXJ!p5v`tmhJa2!J_9RU)TXTzB7E zZ(uRsx#`D*5;#x^7+UAIRVgLYE9+y51AD^Y|Kq7)M{m8n>Z;xgnx8f5BCJjhrh}dJ zVG82nv~;e78|Gf-{PG8S2l4OdARUwU5-yP4S&Hbm3h2>Jj2C<0rL5v{VePmfxUp~UXk}gFKU#r7SF<#pG6>e9Y{PS))-3-A#s`pKo}qolt8*&TC~!=NG?^&M10Iumk77ADbE*u;@&1ME zb3GB;5Ww(&b`vU2750z7sUuO*?fkTw%bogSLJP;)v@kbH6#A)i{%v`~V{j$lnCq*p zQADW;XwoZupd~PyeKT@svq&yX|ExAw;XfNBLd5y){q3!zb00;PO$V4&-w+|HRZDc* z&_Hc+7|_I-dp%*S8s$#W3FpnYr=S*vi@9u6Y^Ll#x6wjZf4MySy3MU z>@!|#$Fs(g8Zf15jxGM+!bBh9{d2#wgK>Q76(Dat|48|f5I+vqrjuN|-(gMIq3oZ7 z)%ZQU>M@7vF!mlvXK0g$rMn~Me*rb6Hxgir(i^yc*|CB*JA(es*MocBinly0OE3md zmROp6-Qr+LG5svdexNa;iio*I0SmJ7=hvgNqPS-tKa94w0}i$*Vz6*uC#s*;n_(@54MN~Kag zqdt3$Ep`TATWeLJ0-;5d2=b}Ds?}S~EzQAfms11-ZMg?R6}2t<`zQj<2nh7_*xDf^9m?>;&2je&pAa_V__KUO!;0ybD75b?42pmlCf9$?AZEX%gmg+*bp=-BB*Ajpw)hkUd=2$u(Ma4`SY3nU}3#}`7ZD=WM1P%j4 zr&_L(cgvGvq;LZ*;8}MTngMrnhJnZ&Km}!(6qy`l7~mfe1N0;UGBKpWnCb|}c=xdOeISvEn(?zGiND@kPKgJd7XoBvhtUld@(rVaX7_Ql^JL9x6bU4>!kSYHi>k z_|<&)$mEjrSN3ZDFbTHbAMfBZk-HZ)sE39I%;c@`4|5lFNuJ%=R?k=ygf9z+nMU*# zSb<7su15TSzsSkdubZDtX+B@jT%SzToAy&I-5b8Gs*_W_cR|GpR7NB$i5-cC-NK}K zK4fH^Ut^@W2~dEEMO@EJPE|`wc1q|4yKbLV1A@05_LI*i=1?}2m{B?})rF;_YKDV) z_gl-t$0*|6Uy~Tt)wFUkI6^>}k4~bpW#x~>Nql8S2@4Fx~1UM z28TwmcP>~3|C6#o{*$u7pVOU#_u!lL2H(kN?ou-oM@2=2D6RK`-p;%p-G3}xw%#UF zBWE3A8I6L2cldFMXN{E5mZBDQb8{DoU7!u_h{6*hK1p>WEI+ji>K zpN}W&)k}50VrBlyMK{r{Rm|kwW}D6cM**jey>C-coWQFOq$Mr8;4ac;RS*By9Ut9T zZCf-3SVqr-hqt!3x4Ahu2-mLeO2|f%d^l)}_919pM9-lY>E^2= zUC1eZyr1_%+U%kl&V?=JeO*RJqiZ{*@_@B4@6>)QQ$wiG9gsb*sbo}?axpUp z|5y9}Xf>MtZ+fLzNonaoAANm&K?)v;li#lt$8zF6e-2J(>%ayeiqP1k=vfK(JBa@q z1bYai*j#`!v9V!GC9VNkIBGe`-@jFrgyPwYY`PB?T5#DbA}rBsr~w)R(}3Xkq&-M{ z{QlV381D_*YHQ0mIXzAMe*-G)kS~9)k-RXJgM-7Wz&U;LcUDf0_V*t@)HOBlt?ljY z+2da8>b}s`)xD$b1;OI3RX{xfjo^v?72=dCNiMDrDe39Sm6bvhOG`SYW@hRR4m@1} z68uj7y&jB|J;&&kFNur)8}|B0hR0qX4JBBqH{3Q)49gvWKwwc}q0&&m)!94W z6@9V&GUz<`?0kt047Xk{+HAk;1vGu_7OruIL8D%k3sl6Nx}}RFVORF>eD|6{GoS;s zZU0@7$2on{#a4p)3021s#VjqD(BAwjA z0^#PDgON<}M&)}+tg5~su7HC+Ku5Lxtg;b{Vp!Nx-g@;1W{A+kr8=8uGLRw`&gPb@ z897Mo)5(orhV;s-UJZ%L1K89(IVqbzDLjl2?QxxI5o2JpvwOf;^s|#$Unj5nM!zpS z!@@~_UBs`E>kJaNpQ;9Ua>N2^ml&u!lFuawM5qeV!(lI?%^I5rzx}?CJor9r-@Wd& z_kj&(N@UV{!U=q+t5&&bK>bg^xkT3LFQWIJEIuI{8cMZNRo+aSyekG@8%V$b+kggi zbac->U(}S8l-!4jhWuJDzxP!Y)*!E?F@?RyXO5&xQn>0!Zr!%x4sZ{PV5J!dFjti> z@)O{FfWt!u9g#OaDmQo4RMeAVC67*h8;)CH{X;v ze{gt?=m=OB2XEwu6|b}uotZ-=9lIJRxHnXn9wT_E>Hs&(U+ti(9D;p80rafR_%n5B zBxY1Kl}sgNd2c6lad4FLo@H2W>-E(VfCP_Ch@5%AN>g73@yUFN0?O=u5Ynmh*@=Yp z+g{_sI6E{bP$jP)uoeA6**Tb z#w-ltZ$!E`doWjybA7!LaBpI;mM$GLVV2s#4E#4|dYz)M>IT%O1{T5C*FG=`)ECs% zrSDiciS|S+x%hK_?fR{DD|sFbpu>la7ajac8bReF50wB{X7e2_x^Kn6fvw z?I*vz{nf?m#rS!B!^Kbp08VOl_H?c`XFWd~eilv!`2A-N&azk~i8pBG(7^oxQ{eBq#wn_)yj1`LoeEiPRT7^0X!j;<3|YU5zd^ei zz{e2Y+4M=19zs>RJ-|!jLpu?cfk}oWS_XzXYVv^}?*1uqDGEE<5+nqrL1cpu6sYjn zOFYx>f_<>BfO^07BYO$y;2)MZPRW_-*or?6m0`SJB#{z}p zY86gzHe;Cso5=3u#o0#gyXgb4@(1Sb$vkp5?~3dHdOlpm{l&$E;@`QR(J>14a=mB_ z`v{}B_j`VZ`uE&Mr-xq3K=w?6(q@jKr+>=Tv!n;C8=AcQVbB4eML=~jF@i1?7xT&S z${;$bX%^y8(=z6E5OWx)L_eEz!GCpaGVxM(k#T0oV|DqwvZXY^C+P(wD5Y{zj-svg z{fP9@Gc&|kPiqgZEJOj2ci{+^*O8%Z`{$r8EUf`@Ea!d??JvCs*zVfrx>Aazb0 zpp5nsxUc5C;7}_ZKxPuUs$ibpN9oJLln)oeX=n)aQ- z`uQR|Bg)BnpCi*q_Gx8ntL%xOkr{A2(5DddCASBH+NybB*tB!R!8)M{a8zRYmv1|E zh)LmF^~Dn)2v-_JZ&=T~nc>tPGmiv{K6YJt7n6Bidl zeP7Oh$Ls^jsZ%>DSqyn9b||(7SBfwOEZ2=!LsQ}%ygpBP1Q%xvpEnH1jlp-p1i$=V zo#ENNsWGCw=F)wOMwV20D(1ql(hvpca&Mvmy*9H_Rm~FMO=_Q$mv!0u;m;%lhv-8s z|Dp8gC9_nP>PPR)rN<6uIUy(zIB#HVclYORa1Cc{_t{=+ zScdHinp8iDNA&sMdS}yX46LvV2T@PXdA`Ws9M3-R;xA}JbQioaJYN3QJF%-0D8Ne* zQ~tCkZXqGL)ejr4&mNHT2b!@{s^tRG;`$q7Whb{2XAwb1R5BF{21g0OB952Z+e39d z3S(Jm7^+YwATW4dW0BJU)2Q2^F*&@x9-jQSg%_u1%ZcIDHTGIe8#`d~TrW2*)1PQ^ zNpD_V2Ymo>tfVVUY-nMxt1^Wn?)2(y1wiJK*lOZv$7t-9od`bW7Zk*YehG0Mu?jx( z+OYWD{1v33P7+Z!R_Tb_?mtg$9c0+g)Y%*8Ld0}4MEo*94+DBdbtqq>&8p^x2%GfQ z3Rs_V@Ke%&&Q1Cf4gE7-TAHXf2g=e(LL6(Ql25w1{;?1=T7$j9EG&3|td=|eItrRu z+y-ZLl%WfbG#MdB%tgg@AU@J)pFY0_hgFOU0pDk81brWeWo}z-HW7$iqc8^AXvq14 zH{j0gh2`zN_2u|ev}F$IOy;%0;r4;gkHN$ov%%H7!dF<_5kz}k1^(@a(NCt+JBuKN^+~-z$t1;I#I$D7?rBqid9KSx=+yXi-H$? zTxE|+j69J91J5(^-oBMq+uFYG`w~y}l&D6aZs@P2Fb1J3vl3ZNDNOjh#=otqSILs& zs3pgaM0niDh!!V|uf=_9ws8D?!X4Gc$@ENh18|&^mhmR9qupvC;`%3Sdo90>_PDUs zayy`M7Exn=Tocy#j$lTP3xZv=ELqO~QkOP%EVEH*#`b&7cePbw-{2{NidV@3zH{+p z?C6%k#dVw9-bVmj2|GM##Ve|CNeX^9Bsd|kZs7S{(2QZ??aVnngH_k!Z3&|BM}L~W z;+a8sEE_=}k(grBcmJBSTZq9L@DVtF@eeqCMu{za1vW-q+JwRJl*a z-rC87u(ck8DII?$_;1X6v@NeQ?0!i;78Ai0juJx%d-#Ik2mgX6eC6Ww_rr4eUiptS zA|lazf2a0Dk`z!KHA`yKY0T;<1lnJ;(KJQRx9aztswSJmO>jgACr?tIjt^&;pNbBr zZrg*wicKi0w}@}-SD8=lxd?qZ?`BIx&dPBK*ZJqkN_;}f3!0he69+5;#+!1f+eWku53P^q__oF^3_xBp$aL{$5zWL ztEjM5gMV$K=R7^kTl^QRUcj6EIUdEc#w6o(tE8ZL1}T_5d#?82E#lJ&3$l zJ4JZd1L;J)-~qmrO8n9e+q>s~);8T)>~SFnmqK97DyQz$@=}k!XJ^lXsVWzxs*VMu z;GcIb--ddJ*U>-W%Dmn=}nGmL(CA4=xC8VqaITn9(t@;&EfC$K zbjortIPW%GpzOo9Nn+%RU2@j}lS#y4oeoeBktK?HI#&;ZW^fKR!R3zcY`eKWVz3PO zS2gYaY;t!n;N7-s8tz|Ggy&)Qz}Xca4*A;-0`(pH`!Fk;c=PY>qK?!uw4PKHv=KnQ z6mkAW``CabxV`31)%4LV0aD>l@Qe;t(inqdSm1&$%e=h{>2b3LWe(Y2NMTh+x}fZ( zum+-IYs=3>T82{M&Ok@nvYrU1h~Os^-Jd?J8o=^p7&}>GVGGZ4GiywCZifb?F-P@O z_{R%q#mKgfDkaSm(ikVKRp_c}1B+W~M-EGH*_oC(uuepr$&K9Dp{|xW1KTD3hi~}v zX0CNf=s4B$&Cp-3u~4NFj2-&z^NjWZc798F0MBvyEAk&x{*k{-reIK3Tp{!jsYb5 z+c={Ho^UpqVWFF#_oXlKpueEwOz)Sov-8UoS{xrUYEusPWBOr=9aaoz@Y?`u2n7D( z-ABJCw!eM-<##i^jg-aE0aMP^LJxNkf@mTseNATCGBkO#@34%;sc$v#tOb>Mf0Jwu zl3ciz{7zok%6EQ}cAzzM>7=V|?kD2GxUNSI!hMK6gEYP`QfyPpc2oQf=!m)Gi)S~N z|9Fyj$0k2MUYKNW%TO(4TCaZwdcF)?q=ZhkJoc|h_3LsOLmRM&C>R>0peutyNXSH% zW?=b~gPyC)Gc|8Azp{M%^n1nQJ#7pqDzFsMX)Lp2$wI0}Pg#l4yGO*V2Lc-}*@?mj zFgfeSUYEQ@CFtlS9A`T|@3Kf&*2gwGcot%O)}7oBPXn+$4?j5eRUlqrnjO?*uA_BwQ#p)mY&J?<0ajLoCGU8zKZrOEG3Ke( z$Xg1jJI17YB7H>h<;ydZftS{j6k!`47%u@wb*#@>MEZmE+vat|o4ryAJYhA+^z78` zR?R5+kzI(yp*W zoCK-Yb?F>+>LXBUjE*Iyk_+ zVVBbz@T1^GW|B_O8dC?#h`x0cZUm+D934uu-9+O?3QeJ{F}FMpt!bR{klR%vT+OMp z0!z8V> zFGOT!>krQ4KT)F&_%eL2!{h{Xy_b_IT@!S<%8&S((UN>S$FVmh%vR6Iq+&cyi z?WfFfnfJ3B0}XLKwtQ{~D7rh@QpYNclwZae2;6E?wZ7k*@d)~UneMam^CSLfFB*8y zAI1t}=J^};&GX#zB0Oic8tb<#J=bWW!>Wm~WyQrNC(pEoYDoozUDJUh&q`28w{b%i z;wh>_>PBih;0Kd+QkP780EwX3>~T`}(Ug=JzpaHlvFVMEgi1*%aOZ5^R3R!6kueo4k@>xQ9BX&r*yij%go+Oqu{d}$NGRE1DRH$ce-4Qg>z{MU zBqN;++d(BHKelOi6*;{BKrZl-(Xey;`-K6tv$Z~$kDPL`mo*V00jII#-V!J7=-J}Yi z7q2e>_aa(SlNZYoGp9ls#ctyh1yXJNf`WU@DsV!0##R~R!s?p0Nz9LI7dR|PLjadD zZ|-E-xz84KR2i0jK#!L<5EHY%QqM~#5YLC_u861x`jKC)ER5W(lYaNSBEt4>j_GaM zKy~%I58gHb(%!DKEPsZ4-t+EZVx^k}H+E?H(c+6M5fM}(RJOs?%yFGcjCzqGs*Il^ z6<6}4B7C}QUfD;YXFJo&47<9uWaWU-i6&Fwa5yUp`D?L?Ucq!~h$zfiUZGW|^6BiOqs%C2|?HOWEMXAJ7qDF6m}^ zLoPt1?RV-Da+}>(J?ZhOI6JXVN;8jpiJ$H&K?zjbk$ttJna z`psD4jN5e*`kzlVbgL!d&D)5&FAzN%{zs751X!Glt1KSlNS^)2|CCeer9S~Tb`c}V$;v~AjMOZ@GRva(m;yxKEE$om`kEk>-dX@Dafnj1#{iE5|%|d6dceq=V39XZ{2VOnj-p3{9UOm?8_mz>KC8XnQ zUEdxxb~X^gi-3Zf_P974U5+WX(Ot4!?Rl@Op~fWMJuybJ;11&v(qRxWz7&lo)QWQ# z1_SoraNm$Rb3xA==4+FoTLyVx&pNF#zn|4tJ^&%^-lS91l8sr)!BTD4Gt#B`f#z=s z%#V9OAiQ@8A7;Z!r@X6a)oeZ*OL0$?n?!$;};2yFDD!NqGO;7>cp3#twb3-_QROvXK4#A>iZ8O> ze?WS6q^416yL2Ry(s#%@8F7kVkC6{sJcAoFb~=8pWcft=JcsoKRXZNigk}nEcfw@D zQ5VN+VIX&v)R`UUF@>In>8IvMDekbduU}fXaZ&#vq&LIC>e|{-=T|5BU%Z~cAawWB zO&b7do-o(}3CLlr9ST2t-#>oWeC2Z_RIHwkq4wGJ9JkE)?9g`a>~BMrw8-ED)(`|e zJz!$xbDWSJj5VHMZ%qXI^HxJ47v!UzMc7_)L|^FqAXD}!&1{ex(cF8cmV!P9cMk1+ zqyc{g{xCdu`$)l-6Yu)lETZZDTB;Z&%?Cua9@Y(TG1Xc7G{S(T^lbkPI?w4-<>syR zRL{J8jWFKhexa$#vb&jsDGHF__)oR_3g>3;nR}iwA`9YM9LvEEEXU5~4i~~Ei);3p zv#(Z?TS~I_W~;N_xsQB}H>1o$zPTGD|6?(;tS^G6qS0;a&6RBRyM=Afs{vr>u-Psw z!s0GoUh*Xk-s$2t{2mYYL7%!jj-s}!_dS)AN(CSe0z&AgZc=^`xR&pM1Ku3%cDjg! zG{Sx|VzG%_D$|!`dt6nmIvXsP^fE94FK)yvqIW2N^#fA18azQHI0}OyHHRCfwdb@0 zAI7PN>5yLkzMR1uy|L1didLd6_MOLz$wbYj=Hwat)9=I&hw{>gM+(*FxyMGiJPs5_KY@V2t7a2o0(yc*Fv0J8 zQ@I^NF+Q_Fvtk#%hm79l?s~VKKUxee*7ZmFG>9Sn1Qm~a#2G1H)Ox;j-H(Ia3NPrV z_^O#8_DEraAxJLq9S~R^TxPy>FQ_*yxgiuwX2&{pY*#w!YCqj}H7i_`oGcK;qCB(z zdbwfGSdyvbc^fj2b8cuXcCvD>OVPmhNx*Vv0~IlU_V$=8{Qc<%za%|<46CwwsD{;N zuAEBf=yaXh2<}={_iNeR6CfUIK z^T21hcXnz@X#?JoXATR*7D!xr`o8r7_nKdYhsXfHdFLJcC(liRm5ul~KKbFOiW;wL z8sGhh^yen^7`(85<+)}2Xb)h2ST4vif0p4B2;Fco^QvK&`2LABBj5y%(=%9hV=cx|3U{i6NS)OLG+fXU(;P=82?J(huwVPOaR*h}@z9$`IIm~aD3I*Zq_^CRXHk%+P?6^^D+|IG{ zLN#=`6oW7RVdQZWhckw)_kqP@AB}F+QH4%c*;20={tDRi$?pNCOXcE=0evf^)fY1z z$#RZXg-d!Lp7NGF=&Cc0)Y=}-6_-tJ(@Q1-5M&fcJER1Wa&2@?Sp*T_=J|y1t^}{^Jr76vPmX*&yMy$aB%S>u13Lg9a zo^iq=I7r>l)%Siu_7e=w>sx<)5zIZRJ+bVBO}{c*yD*17XouJN{F_s*FOzPwBS^v3 z)T6oEww~x=XWnCu&?emf=BTGu2A|wLz3N|4syn%$QVTUmO6qa0lQH+>{{+WM-q^_y zFXg-5(NX+74b9N_P8rYZvw{ki^&ha8!|7#kN<0V;h-i3as}B`Xf4mVo!uE*DKYS(A zB?T(MlJxUd6W^%Nax*z2>Fc4)fZ|-B7r}szzb~LSt%oL2>VuHX(MrF|-iqzq`symZ z*5dlE3PZY?D9JiwJ{zN3R~oxmzA`Z_6=0oQlB{`$M2H^rdX&iyTnp2sp?C_O2MqoAgN)PGIO*JZZ%vv99t=eZb%?K%y4b($Q!K{e>ecs zJ15l-zfpCzycWxAq(_)IkEGFRu&tpvc^?w{S`HI!{@vKv2;c28FB&%!o;@s(mHCMF{1sq@FP#GT!kA(}W4Ms~P2shfHa9xW zM$cH>UdgVJScag}t>uruq6$a9V+b<~j7~5i;9vV_nFYPvT+$zhcv7Yk*|^r3cF3; zf#)C**lS!PzQVIKsxg%A&O`Pe_E{J1;_%wuXX``x@uS6Hx?6A%ljCU3T@3_j3^P+} z5cFz2QcUGgM(Ug%rKQY5WrNrupIBHJ5G0&*EUFHF2T7#dZn~eI$}0PHe~h=PEpw14 zbj^HqRzq^JO2f{`w|;B>Nf_HpRN>D(mMIuJrP-&YK)$^DQFV!MasKONc_T5-wjCxP z{WMLw;CUTf&Y!Oes;g|++!N^=R+S&pWScb1okV2dZ&WVuR^ZH$np8&>M;zjJyB0cq zYmYj{ke>Yt^W@TRLSn1l!rj2S*mer}Ia6c>|HJ zwiI7`-V;Z;&n5P3*b(DJ^o|+|vdG7?wWH!`u_uF$M!rvw#R5W!B_(e3N6c)M1Yw=u zC2DJ13^9io4nEUk1Krlkxdw;LW%i5Op{k_S;3`$=cklXhWnqC#D9eCogWA7z4x#A1 z+;QvF4g-+?(Qr!8X{MTQ+hY#Xz&3Psz?KYRoi(FWeW;C*Nn1Qgg@MHN>C#C5TdFNn^*;n63SeHyie;jbQ`>eMPsX z2r`c6X}Lu?Q@r`1uD2n4zF0NTW^+r6C|#XS3YVID*!H!tS0l^n4c>+p@#CCRR zLsl6|?>E0^6WdU0R+>jXzR-2*L<_c_hlBtkxwag6p32qmNp^4Qi7M&SaQDv&KLn$1 z^8!W8ueKf0T4xZ5<(ttyd}91n1P$f-FKg}CrHS7bu29_$FlXpm63s*=_?UWrBu-^F zn)x{z;q|>H*d@iWj)sSq1(U&d+BuESt7SYu|1Q;Co$h$s6U9wqJ_sZ$d`U}Fc?q zN_~Vsz{SZ(41p~>Z;2iRZS1Ls22_q@Km0<1ehGANP^Aj*n2Qk}dDBLY>8F9e#5|lB zg1I4BJ|m~EAq0bs66;qZv+jMd?6Y{MwCL04qHLKHx3DYzDjYa$NNItnTBXj{#Wu5i z55R(0ej3n~pI>(snAi_wIdDG}g}W!R-yJZ5LxDZ~CN$EprMXTE_f#dn+zvgHa(Mzo z(oYd6z&oXbmQ)&8>&Hf>XGF;a=3kvLWpKK%#dgrD8YK)IQ_72bKoFhv&u{Sp@de1i zd@iXB%J9NflyCqG{f$h?Z}s=-*>u2wcPD;@ZVQnQuA$()fLl1+IQ8U~{aX80yDU{%qssj_&6VL+PjPGOT^t>4Jq zDZde_jH^%aFZ59pE6O7RF9eJ5D&9b*f@C)2WcTSL+3qese3D6Eww|or^r1U>9*uR> zU@Q-)MoP|VUGY{*@ER~I*>P=_>RoD>fdQSHTHKRTpOGc$lB#AmBi~f@uRTKX7PEM2 z{cFm*Yrby@rX&3KM~)v52NRiAvebp7)z*65D#YaE(m?gRQ^H1LolU`p11cAM=j}qc zgu9-zU&1G^Vu8pEnUPf4bCQjCi(BRlMiY9TB>4E)!G-UKOaDT}Iq>Dr`|Adn)%pYe zq;F;BP(!eidtb}Qf04c<9v4R|3VDYvPXbM(Q^m0{$dhs0^{A7;a9ij2U)n7-nSaA# z`iB|pTVMD3`K`t5)1niBG1%MyV{oVa`?$v)Z>@uScA-DD`(m3?jRlJf=a#rw-h_<^ z4hqWc`&q8{BBM{vflqD=EE6sTj)nzNt^(X|KcIb}@9%%1Qx1+>#2UJX{`G08EljM| z@z|K-1)w}$IS4Ir2aw4gRA3IRa+le|M)0INdgY3;JRH*HDDy=Xv_b@#CCMsF&m049mqgJ@^ zu=#g*|M$qdO)@F4CD_pOF*%|-&VITT<6C34`us;)(I4)^d(4?CX5Ni^kcS(>!&C(R zag{CCv}BPR6AZgVeZx~^cJ*m}9-l#w{J??WPD)o}+}uCTp&we@H(IRhHylK{Nf}l{ z>GFNeYcnri&A-s^Z<5?|bj>XxN5q@hTU-c-crwFdUOVmnQa#>rPpo~az~N)#<#gyr zD1&FM3_At2-8GdUS?$}id@`FzvTU&Oj za7Zi&d0vgLte)_v`;{d*MW8<9kn%hr>o*Vy)tY>qBOh{ks5Ki8jh?*GnUidVC2$1M*VotU zrc`>ZQ8L|TO(}@=_3Ebg{6{sW8DM7{yc)W#QxEv~amj5;HED=O*&ipw-+bgNNocf} zgxB}>!nroA-Xql=neO*oH&W@GG@U5+2*2W*Z|C=87C8C+>`cf92E7zHWVZDwi!{~L z0Du&9YF=uulntbQ&Uu)!%xU?rwm@a-RNOs*cAM{sbLfMNiS?WU@2~3|7oI|yfLzuZ zN~!m!QXL1;C=kAka7Y1aIV`KH%S;J9;c6JyMYM0Kg;n7U3wzM4`Ht_&G=AbAvBF&U z)xOF5huf_JkcGo&rARZ%JwrwxA2~BnW);cz)xkDP)qiuOX?F%*m^dIJe*D@VjBtpm z2@Tz*z&%r!M<2;Gh=P0^q6|%{vloxs*z05goNRm7jB!EI#*}*$;Xxnls#z=~AXhW* zX5UI>)LOS?#`Uu-6?hh&=5{}@GBewq&T2KVQU!%JeA?#4N5BZSP`p3(7gb2}@An;> zaVN?K9S403%3=(S%Ng(~qD2Wr_=J7SyU|3OM%59~F*J}Du}lJawIEvoGo#vW@0{Os zuRbB>mp;@luKEtBnEMS2Z9%L*5omrsHIk+EMizH#j%UP_=~mA-VpcdF$cqKMy>G_- z___e6q4RM~wvr*ep8Om1^fZTCqC65RX9VPQ7A6VMKp3im?`&u5?CJ+u>z~R$mlh@OUyr| zTiUnu9UIVAcqFZL8jhWH0-4e=$dGD}$1T&(=nxu^)mHOb$DX%KXPvTmk>jt*AO$f; zZEoNX`r4)0AM{^7XVRLd-Ueh`QaU@esh{Pd#&*w|j@sz$nT58&isLJm%Z!4g;SMW} zxo9~&ewT6`Fll5da8TV7Y)z@wcvB}82RlMfe=d8_l_--CgG?m5rbFREfX^#LK3lQXAGi5Di zL9@KOo5oWLnl8R$jOaJ|m@WG>^PRxm<&S`l=n9EMc}8GGS(z)BaK|coXs;+87T;>{ zzYtZq_~IhlFwRuDpKfaR>e%KG`W6Q$JVWfw)b1k#Z_<^Y3ezTXXj%*mACW%uzBL_k^ z{nFYB*P55lLfvCoOGn55%yd5ZY|-gs0sIbgtF`3Q^F1-P2%YpX0aOo=r`2st@eQT5 z>q4UcJp?-qJZ_Lfp9{8@3b93{M!uL&itH}#|_xs?%=?^^6X}9Cj89>ePhyD{o3;Yvzq8*@xO4`(X z@Z0U=Ig*T?Ok9|;A3tU3=;jn6M%uw^r&~;5u`wmhiBmD(dw{r~j;TUNv7|HO_Hf;^X3E8f=>n-rr+MTvq-m4MSp_U9^Tpd4&#)f#|Urx z>DRCRC@SUi$k0BQA(F+n5xWNAB|0mqvhz=)oKQI7Kj2g;N zwx;6+TIGcQAq(4HIJDxsPHJ7oeCUsYU~@wnz@&nn5IPCp@gMxCJ>4dE6iEjt9De;f zf|WE7Qyinfvw-KrL$Xx6{+9A2yM1@nq}o5NBiI@wj2e?F?GAm~3?^4LAvmdTtTbOY zO5k)mt*Blb57dMJInSrT-f0Bs*RBQIKT$-DxOVX3&D$^x)PBD z2c~MLyCu)Q0T#MrXPUb7@S$`nR5_^OAHTnW zqI{{NeG~-Q=s^;!N|0uKb`@HJW9Yc3Sbs_w;N8yExD2*6z2BPb@Z`I;Bi+tMMyZ;P z6@#4oe(9H$g}t1`2c3yu{|8%d9T(O2h5rs65+c$iq9P@r#Ly+8f`dwfbcxd41Jd2; z04m)n-3(m{O2g1OFu+g)!*GwE@BQ8T$G!ja0?yiJpS{+zp7q{tA)<=kF1|8LL*4;W zhsAu!!@Ra~t*9QV{lzzBc;8lUBgTQ*irI^f-Rl%5c~0NU-}+)paVS>0Q^2raYxI|! zql|33sdVVa=ZIvdZ)qIohv(@JZxuy@2gQm@z--;CJmbE_%vB>8Tml; zsbJF^omZS|@IbufetlNfCY>iqKzpkuHhZLLGB&q9 zRqP)9hqqI4g0XSjc6KtdRAbb`zpq>nR!WOi^01kfNvX|_uX@Ri55Ev#KC%hL0ehE< znG~=dL!QNMpX%r)%Z)pfVr_<(<9}M_))MjIyQh2>l-^5Y&`A3jsBSu!Kyg&4?%ChL zUdS5QUiAo8DNsJh;EpNFRVM`nBMwpCX6CC>_n80@|1x zU7caRH8*$PAz*2I3PHYoys0pbOHxO_R4pxJU~wscQ5xQR-k(gA{?QUvL>TlAH?VaQ zT?Y8%U>av^cmhme#O)a#xK3!4IWy|<>%=NasLGUw-((F&-`UKlrmRM3{8Lu~>cU-k zAxB#D9_6vumgtp}35D<2g_D0I0vKIbg`%sl@VGh&BkzaVWkz2IecvA%I&F-XS+6p@3u>+g^C5HeZlW8L=#dR_bsPd6NN=sR~^9-tN8I{{*1Kfkut@51YHU9#UJ z_@R3cR^;5izcB&Td2Mz1m)<7Ye5(Gwhc5Z2rGJmqdjnsjM6XT8pgy~->pZMJ|M5fk zEAlm?dObYWGPZb%%}R@vXm6c}{ik z*pr7RA%#g&=-QUGDLuIpcJ?G&_1bJR0>_nxU%P*2?P9*S&DBe(i5=JqCZnJUm&w8zm??GXJj8$O}Fm zs`buDrfnnF;xjs`hj_R2Vf27fHf?s>A~u2 zOe#>ZHFfF3g?cMKWOaG|+EYOpHy{_^#MmxO#;mG%uWJkrW?i`kZ4*BJw*y(<*tERb zupW<}D$|%~q$oj=ek>~GY?&^v*?%{;sDARinLm4~*DXz#sQGZ)Bi)5DHhfF#QXE+g zQAoCCcq&IF5`J_ebSl*qtE73^<=FY><}CW|Q|l$7JE|(v~iGYN=GDt%vE%T1E$R<+~6Gb*2#p=-Cw=e2WI5?{Oj7ln81Yh?bEy` zB)c9=B*09Dh{qqHSwV)JdwlBG>8z?>$Lj<8n+*0-Vp$nOzcjIpGq&L@lZ-4cO)<&S z8AiLe+eMlBk5lR<-D_s*jbIX2(mMw`x0X9+q*fW-1H3qJ4_Xy0-LSNQ)&3OMN7zQH zy}8Vcq*u;r!Ij@*{+sTSy%i|l@fzcy|K(&f zR7_O<u-ETgxJkufRf(Zrt z0K-Eh&;ebayp5sX0Zq84MeSTvzDmtQ#_{NQTS-CbT~i~HWn`KbJzG3+DkVxR&!6>o zKXvVm%ElZ&IAGAEf8_-*Kk>`+dO7#=2q&F+MOKz`tz2j?5^NItQ@bxc0q(>pn|eA0 z8^QGZk336qTQZ&5~Hz zfc_JlmN6^gk>5qs&<5h?c48rSWqBV@H+xOadVN5hUXmVRc{hyhvO07zJB{B)aYokp zclPYlP>RvH`h!I4mtoMC^@bW-3mA;DKZJ_8{-*;DU-F&Oz}=6kHNs*M{j zQ(VM87crdK`K-A$erZ0DO1tg)u=_x&Mo|ajB4ML$!g_ABnT<%t*Pj0X-~8Ld$NC>L zD1qwGTTuPB1nBW7pAFBt)o;q9;lTaw@rvR?*hTs_@rX{|;!oxV62%UuU<8zq_D89hk8 z#rKA0vyqgk7WtT(uF7+PPBZ>~8I}-2u%izq@2s_^uCdvAk`1xcvVUteRbF8;(;myr z#Qpm9OW3Fodo-1DEtD7FK{JW%v}9YljV@)y-C<$I8tg6p^jZg;*i>)Nh+J-xjc&pA zp4=A@pd^Z=(^1?7jQSAg$Kc?7)H!POTYin%91Bu17GSc-aPdbmZ_IW+(5`QOuXrIZ z$i_a-sMM8^)8obm0}B%=pB@br;1vVM8m|$1^;YHTb4&W@AKFf<`9{sy)p*CDKI~D# zq413^D*a}-a;P7x<=jmmiP0L^6gNmX4i%Bk zdOQfKINoyho_y+fZfa>R*Jm^H4h%Q<)XCddq~HyWNW)6Gb<$P^Pp-EjCpu@g>-L+F-u9*iaRN_Y-T-->HRw1lRtFF4=bGPb_; z@H-XIb~2>$yvQ{rH?fpExs<3H;%LQXfhFhX|1%SL&PG|`r2N!>lLjchi2IPjAmhtF z%4aYS6~g3qPJEwHWuqH2d8efnLjH&d9Z`)T-DEIe82U{)5QaS|IPbAhSij5Z{UdUD ztBk!^64nWH_+D>(QK_Yaz?#hg@7v06oP+Ro=* z8&6L>TUApa34hqm?~A_|LGw_gv;ohngRRC#k5`Ho#j7f{X6a<9qqDl4xmu> zg@y6Wz1enRdF;5q{MvB}@1iUh+lJu3b>^FM?w%F@<9*s_$J~M%Am>i1DM7NHEN}_E zF|)lh_UaJw!V({41(sNmR?Ge!$wopM1_+mztRUFouiJ$m)J@oBW!m#UL^y<_ukbd> z>OM8MWVOZbgOa%E?n9Qb%u{#OWogSluunY6>+3grb4=xA@P2I2z?iYJy7UB&_WeMz zmn-EYsZ}<0GqK@Hzy^tyYI=ujc0K?G(KAFuBX~^zHYM=4(Ao8dtgq&!z5IL>!@1_F zKaU92z_6X3yT*6--h4gzIe$ewk4LSYyPlqby znEweRZ)a_ZY|=YOAt-0}CMW^q*LF^4GjU-g@1}bagQn}!;sATq(4YiE+i4=7YInD| zvFmy(t@Dx{ta%8Ux4~KtgCG*zV(Y_Ku(AKJD~u-fdF2_RMUAim1`Kb_e8VfiaLrqG z{PAlq;oGBcTX>VXW3uZ)PTn4zSKqVB01RQQ_E^h~)Kfs zXF5V)o+M(IIO$2C7R%@YfAsKBvagP7L@IPzn)l_&+p06L7{~V=_lWsC04L+s;I#Ax zk?@~|dj|4H>R}0`dAg&8d>jFtp0~H;D?rC?v;cJM?>{CtP9=Fv^zUx!o15M(1Bd3n zs}{TD^%QSO`3uOxzlXfU{Z#(vy)IY(|9G!AU-j640gHDR6FvPIc`8+}2&XRha#Qra zl5h;^WQ0)p$0GENFCV9ef#a3$3necSE_7RHf`7-0(H1mn?hqlrz;a$#8-1l798y3E(SC?7T0s`D84jE+wv?-x!KiK)Nffo zCwp2Z;j+bh@k;#$TdL6?qbFy#VE$91Uv_FdRwNc3#DmzvQ^LqTTDtcj%wKj^ivZ6F z)-n0|8Z%DXq#r?dTSf)`bIH2wZK#cc{T8kHWrBy~Z@(^JoL;=zZAskM({11%s!*vn zVu+59Ix?lq0AiaErFGQJC)4n?vlG~>X4u-Oq134wEd~qFI{_p0AQ|6w=k#>r`h$>B=CgLJJKeN_ z3aNy_%Yh1XF#H2|UR8GdkX74jloAR*gX2MSrO+PH<#=%{=qpDaM$8(P_$A*P(;*i ze(b$*2=M)b3t4mD+vXupeN#mu?9hWAU%Dah{xwbK6Q5A;EdI2`o@`~edD%KR+x83tW(xa_^&0&i6A8C(J!Erjm8*B<>>v!<*<|npXDxd%;EUmG}9+v_d{JdVS6=@>G zXUE1e+Y%1k&z_x5vf~)=>EuYXip&!WWv*u=XO$o8BrIP8@37N@9DuUfMmsiHY<&@s+5!xT(z18YC#meg<1a!lowBjEX^T--%Xmn-22PYt3cH&0wL4e8LGmG(>Xuh;qBiOATLEVIVNm{phL)|F+*_0ZPC2*VBMlQ+ zw0T=jI0{R0XevsxuN^!v;*j3+u7kzS+p{AY*@$r@8>8Y-`5D~Fe~L%FIpCa0BgjG~ zN+PU1U$aE|!N&g4Mi)L;`WK6SCJGpMkryiNeB3r7G2MJ?#V1h1f0M7HuV)w+tK$ecX?|ZrVZ@$8gjq~sK4?=6} zYr55)O1f24H{*9BpO)7U0CTrgg>?7B+>pj;8ihzn7$6Tj{f%EWoo-I?hh3*`gd}Wg z`(>dd?DWOrddr-fTOaam^!X#9x%!9#=ru*0-V8L-n_jK=&a zZXdkDeFRvy+kNPB-gdcVmd-uEJE+$uRGjGU*JFI z=e0^QF+tTL`|VNLtyh9H$H>B9HA+qkWf9K##J@v`od&h)ZIhyuo0q59UY{THZ)-3& zy=n<0ztJl4l?a};-Nn^Ns9rL^CvnzxqA za!a6a?-#LQ-IXs~h-%SOgKS}GllL;GPuc+3 zv;47Kt8_856DPb7u;_8kcf3v?+{d?$1Jb4Y;99}LT2PU@a9x30qRS={-G1eMT2lDM znJ2Q$D5#n{XO;*Wrl$d(3x-MVt2oMo7-q0ggoe}*{lG}Z(DDyXI0npzqE7eA1&7yD#2DPS1UGGZIB zU@sQFF*(rcg!<6Q^<8${17GdLVtiOANB@0A>2v}lZIV2tdwK(FyCx~n8|U*x?7alH_ImA-l1L}KRr-m3-ttDA zAG{ZP)!@mj2i70{_|xhLJ4LQ;c}C*O3$Qr@izAyZbCoe2tx);jF86T9{#(b+;4E58 zb{+>H;whv#4IMg1E?&adJj+{GWRI1ycPt%3U$J0OiORN zH$*~(x~L42WY#WpITTY-=RRaRJ7~2%AMd!1<1ouxTTa*KJ{vL4K3$&Azf>hUdyvJ$xeoK7z@aLQd;*pxH%BH|eE}*G%p5?PY`g~%J`D2iC;^Y(G z;}xGgVC1SSTUhw<*sNg8!>u)Q-!|)iiDt%oSML{ZpQw1)J=C(yZ}&Ys)8WyjE3|i* z8`|46oY2AnQb>y27TnjT{b`Q9UiEupzz@avhrtY2F-BF-4vKX@|D9=E*0>;9JsVQk zYOkVx;I6X*kyCh??U6^!j&@NzP3d6NB!9CWNK${?G_QHMdR?wRp*hDK=eo3V(3|V? zoA3N>o``S!pY^3bt9|RQxO(#a_u))`aJ1aA&CBB#J*%YZDD0_H_MVh242Rsr+y!F=}du|9YCB{SIrUun392Vpu|;hk-Ni!gs)s6zG&<5Y?*DVkamEk z|Gc_}RSoz3Kv;m{Jlz_Pm0@n=c07^V@Ry{i-)iI4T~?B*uU|T#732M3~)8SH{j}VjQ zae{|%;p@sGqx~bfbPz}CFaB{Uif3}M;lr%Penep;LaF##fqXZk!s-cAkSlVk>_I?d z8_9!ponW)T;}#B9HKIRtF0(q6*T5WUZM~x0VFP@bH#EyE-+Ck%H&73_N3KYy7frMS z00}HHVMh zl8w9+zzFd=wl~mnlMIy+{97MH42)H$QuM8j6hJM-r5{L*0kqXMc)!3*ANcB%QODq`_4G*l zdi&nuJF@wcp_B-qX-x_y4YD%fEiqRpRfCmFn4{EuZ!;Vb_z&!s`lhf4kbXXQNnGc=qTa#aJoK| z_rW$ak6s|35+`w~#npAsR;($r-nn!9Fw-3{I?m3{j(nJ%nCJ!z3o`y6%B#@B9oFlc zD;356{z()H`&f&AsBiow-=7wqg)VCgA^119ZetI?$fwZr=iuOgd*}RWgNByas8?86 zSiq5f!iiUr=s8~|Rf>3ZLpLulKF=+0-fD)UW>3Qpf&t&CROmJxHJ_k; zjG>Wq)i!AXhgTu(qV>i^$mzRX9fr~G>&2Y>=;JirwKBqYSO-K9C9srvyqR`Rj zQ!0g}&qrrXRcT`vbo|HZ3%h_JkS&)SEoXfRH&bxXR&?vJY=+CW0TP_K;W}*Nx8=67 znZ*$e)3&UBVl-MU%L(qq52Z{w>4ktDfh8q9fn15*VYukf)OF4vRNn!);|suD3AiA2?-y zVx#!b;3Es@NUz>)^txr8n*jW>8*;5+8Sri%gD|Gp7#hbrv1D@Gjwv<1CK_e=vX(Wr zXE)HUtaSRPI?nIu{-Cj64x66uNbodnAAuXlB$4qiIgFYr(^G24ZV1w{+9-i21GpE5 zq#k!lha2JNsK6L$UZ-rYwUfliOaKLSB4GJ@uk9KH&yiJlKlZ%(p%xzCn6^=tMXmlv zrY$G@@0t@1o8AgUd}?%%20YCGgxr%2M!T7dSN$G~pd|9y2mV70&d zoy(5XV=#lj8*3ldlQZHcu4|z#z=bFiy@ifT5gKP>ErDZFD0*#)thSJC!uJP$f>6nzEB@pwb32cP4@AI%X^}2+c2i^Po%=uG5am8NQKrx!VGgFDql)HZW z?<>JCVnXiA(1K_-boPAf2~@ng^#NipUXuzS zlrv@BbsalKMjcuLFbX4d__zIo z91hQ|G0&Hx3;KM_-!aDKNq?5$-Y-`J*c@L_mxgl$g1Q%^#ggrbp;~z+zjOJi9)G|k z=UfmlKFy~y6^Jev!32LBr|{7jwBw&RA`XzqxnD@P`}wnyxh z1F@{B`l|)+f;G4?YfS@f*stYwPWKL-e{aNd-Gx9@ubcjdrrru)(wRGM&dF^9?H&PQ zg!LXq;~eQs<@+tMxx0R^FmqIPW~^gL$IUqxxhpSvn;EEWB@2x^Rl&@wL6^8fjM1Dt zlG~qt(nNML3$yPahw`Hi*xUtWGL>hKmf{1v=Rn&rxsz=@SEo3CPe+8c?PM?^ zj;z%TrZvuSRN`ePZo))Cz})VQyX$=BS@YD|&hD9)%gZ}W&iQ>?`_%n> zM561X4M{U@r5<^S>P`$wgd!l2)4-BIA^BW4nNw)#+Dzm9iJ2K-N-Bj``nE3(I4z=M zQ5@lUEzJ{`@oMPDqw096gHq&GU-jk5i-`}GG6MImHp}Co=m+!mnQ=eh)&dQq+zb(q z=43rR8ep_-pKRalKERc|zeUF1g{Z6XP0+5h#Aaqy1)rkOb>$c5x3EF!ORuoM4M>E1 zEAJP0bt7L{vT>T96-PDDX`*!OK1O^m)5ggO`~7C?&GDyA6RuJ6Ij}Acu(w1>KQMU~ zqpBR2c^2%_osHUWxapBn@Vm*H5732(|Jr+Ltx-m@?cw?1sq*)lAEAq?ljDET(yFIM zXcs4Mi0>E&B}jHF&V><=cfHm;AYY-?I#9x2c(O2wHjiVmUQ6{AA*EGk7isD}QyW@d zAsW#gsh4L1H?Jy2t{mtOJ>FbG_S+MT>+V8zpJ|LS3+HSLw9xpoKgrJ#-Ev7atSo7+ z`7$egc!d_UtmzzYsBCI5tfJ+9@oFNGcCaRcHij~M#UZ{&sv$A*=}mSst+kc*!wj*t zI%8=eJ1geF=50C6GJSW@mzu{V4Gx3>Q5{|bOA)kf?_89=gdNdPCq(t)5E);6@o!sm zd-Q9=w3V*46=3-Be(3b6A@(CVUqs!79lFD%&p$-7&@ORP<7{;JEkbk6CwA`+;@*ZR zQLLr-3D%%aW?)oaotX=uz?FxDoGpds-kVLOe$%8UnzdN% zd9}5~8KgfR+O{M%mss!wmorgA1pP5fo*wpRA3ncevbtqwC*646k-l4X)v@ZbM}9;S zN^*Wp9L#>kqM$&1or1~=BdiEZr=r?H$7!F>iGuD1b09YEVcO1eiLgf4xGuj-EajN7 z|88;R@`nwhhE?kDDIEBR!tx1J@~$pR^h3pf$F8{~giPMo8P@OpS_)#=7)S8s`b9zL zsOH=RyDAg zk!a>OwdVWIR>1>aFWQdpV@`UA9!RaR((&IImC$mlxTgSX0x@n1UH5R-9aC>lYZB}6=p1*=F` zeBHV!2QQL#coFc82i1S&biQwohI6 zw&*j{K7aJwHwV_1@k6$b@`ynN1o!TFbsH8Ord^b~zKZY&mMB-F zFxVd7>~<5#Gvcz)d&=pjT@rQUK1c28!otb@(P!sG^yk&w=Y8YJZ~0r@F)k@rBlY;K zPru@!rD}XgvL50(=M~g(0{hB3pYoQ`3P9CIBgG~^uLj^^eG2`tDYMhH~upS?2ZKrQ0?@pf@CSJ;40 zknvf57b1KOKa@S{zy|5-=Js<1H+9MD%(Y5sobTbX_13xY-Bkx<6?(8Baeq_e?t8k! zI$9&>AWWTu`>l7|%pnC5-xl;-*D3P6Go89+{&f5|)!lpW<@1Q2To0g(ThBS$GHX>p1)AL(8La zrc<5vgvuYHc(O)laR;Js+3bzr@S8^u8){xDPQ6B;m0=P&Po0?RmG)i@2k-=p-M%p$ zmquGMDl+k%cdEg^P7c94x~=?;m9Y+!{-dMJb|?2V%|sDQrkAF6MeLn4TWr^IBdCD` zHrIlS4%&$=h45loR0l`u)$Mn)jvY*z>sNZ=P`Rrs{M6YEhEQMkbF%^H%bQN9FbRBq zao!vcWg;X^&_{(t`Mg~tCQ@x6HSF-L5FEYiMN>?7=K8RFUWQrS<-ZW-(Y>HmVl4&P z!2xxBAx)is>vPmaoG-@9MfPj2ubF{nN}T^ek?9EOuOCR_v7^eS&qYO!_6xAJ*G0g! zbU!yn+7c8)yd;}kWfCG}pR+4nlltDW4j;VC>w2FnSLz#CRKjPPOZ4NyK~7@IZ8oqz zypGM<2X1^eYJ4N2tB1{C>x4t^rKrd~5YRfOpc_TBGR;mW4TSv`WX#^e5~wGkr+*Bj z3)~Ej3FDiL6{dVFljDI>kCq?65pUv1+7x9C19*Z>uL*ME^YuMH4!W#SoD=?6t3QFy9fvTa8D)jB|34iX!$E6Bu06QtgL2OaHIJln(KGAPnI`!(VGx-pzxay zB%3bX_jb9pj6zBI*UT^ZzSg-oes6~dw=P(mShw?8r+i}&A8)TJcMjd`{>WioWvI&)xGHj_3ieb1rv!obOBpv>{1=ITO+;jAEi ze=Yk(qaF37-uasE)RJ*xp6cghG>@6b?gN`jgxxG&^3F$RGQHz>#8*DQSja-TR-G34 zaoVtb8tAOJaaMDn-!P?)dIF2oQfegBWkc&d^fYgLM%4PmI4SZ1^Y0ZFG}GCI`-suj zDg4CfraMSl?j6z8na00dt<`2+;utT?8c>ri8Vzx{+nxNlsmk^4$NU!J4$2lwtwm+5 zN5OE%-%;{T~8CyXkUtA?lRE09R1?TZNi=tBRpqV&gjBJdXDkS#tj<#m%)SJ~Cd2=lo>hO1U$HXJg)H z``34PBzeR`n%wD0JI0)YE>LN^^?-Dw@!1#>x4^R|(}K(Oa#HqJ01N7XONc zzP#SB=((Zq%^~13Iez4qC6a29$U+nJN*T$D5Cy{Zqc}g-R!aEwv*Q-Ol-}>0A()%( zXljeN$+Yo$ax3eIn{NRDl|Krt#Tgc|r9CVj|FA2Ta}eq?6# zsWrBy-e1cB&`_Ff25k8{2Pq|)r#P}n&UbQm$@CiEpLR}8es?=`>59Cf z4J>=b2*~_>AyanU4$DG846s=@VNe!I{rlv__Jf? zad73sCoS*HYA#VKvA346;N{f@1;#}9b#-;MN0k`U!OJ){sXkueXUC7OY4@4@dIWL1 zByq2LJAe_{6z$0L@v{o_7DgnEZKlCXMm3HYM6#8BvB~F;d6s6_H%ouyu?oZovZDJs z;%OnBMGVOPK~Xo^eBi_3n`~;RYC4G?(8~&tKf)2-G2{Rf!4X+TZ;_L81R}cv`#Y_kVu49xXEE&PiDeP09WVomEPT_;<9V(=ylT{}Q+}2^V zpqT6|8SKUF;U%4!!Y!F(XW2;`UQX!EiHYpIrI<^7 zEpozPi4xY1i5(~;p=Or`7^)pr1nKjX&)@RwNQGU`jlANkW|}EhW334>FeZFfg{4-y zVV$9){F=uKc3hTn$H3ppZXTPCkbL&%-|C^+3f~&0+drOVvOEW0OB5n~;qDb3E$g*1 zuo?#=x)Ox1%K9V_1NQ&vj-g~)XB7R8dF|#i=1*lQLMF0@r8PsfRXayItE?3i@OZoK zkGxxo^Yw!(?f>&fGci6splOVd**|Ki zw)A+%$s3l_@38dmu^3Ov)wjBTlTs3S6D39cr*Qr~%MDB}@GkdVh>)1po578Ua-jocBzHIKf zQ)!8+H+8!1u!b~Rf7U7f^xlj5GTjMIjL3q4hCIE>sbw~q`nvtjZHW9?%+EB9pU8h} z-1(nKGl!RbO%GvQDQ!#}O@H~R#2!;&4o*BSbL$y&`Yx1dcYzN#(k+48oP9i>TPCcr zQGGJoED%S*=KtpyTD(r%CagIGk%6*ifjJ>S3Cn6o(^KxK@BCw&Ct(+@c8l%#500xR zgPGzXS=OUjBV+0v&%V8}B%$Zn9j*^8w|UG}doDBR3!fJME5vbQw?Q~^#iG0K0nnBx zxo0=u?62GvcDO<5VQM4SuocCQn^sm;#7oubkCj^gice)DexL5SJvf%fi-_epvGaYf zcJgl@)Z3C0E4rh@H%I+%KWY;VSa{sNRZe+s?pJLeVLMEQIGkCfQvtP&T$F9BA7Yd( zw6Gvvk-xF9+gK#hfPWda#%+Ibp$t8el+(1w6U!Z)kkP?IlJLF2__iRm3wN4jFoY05y)yC>Sej;JmpLQk5p+0Q zL+)Po0b6B}P?y^Zr#Wg;|X^j)ERFeD#^L@B3%(g94`+^oE6R=wtKmy!-okT!l4Y;ijTic5d%+|nG`J3aMBXsslFk~^O5v(AF5v3BT6FQXI$B!fFr9M8$k|Cz9_ zZZxl}K+ZQd?>tnmtF;(p*hdx^_UkK=J@N=i`13^--+%{bx^D*#rfo({bnS7$cG zLkYf9jWNR~IgXg!f`@-OeylC7p)0xArlYB`On zv|hI1rOvTxPMUjP@!$GoHw+CA%mkj>vX{AsyRJSDa>re5Q2>`f-q)sv6i3>yR%fL+>&Z=4 zV;Gp(M7Ck|In%wv8H(+JB{pKtE(waE+aSKKdcKx)$c95av)^0W9v}uvY7Xcj$akYflHt>@d z^V=F=5=wpXU!_e6IU!OcBeKlv2)0xN%YVY~9arI~f)YSzayA*@P`a7%9K!m%UnwiH zeURIq<@odZaK0y&8Qjv`eze@BB#ze_)b%Qyl<|C)tb^`f<%nLpTaEtX)81quT&B)E z!i>iYo2faAX}B|3Uh={iR&w!Gf)nR-Cl@C|TmJH5Y72 zH}$tPXI-@DK|hZfP-$Hf-UKNH+O4wEr>dp;`v$`M=n~E!eU>r&YYOEf4e_!Bf#kei zJy*~in@BV(j!#bcaGqa%2ij88poP`Swq7|XCtlgYJF?H_?%$ZuX!jsUXZe_>s$uB# zqhD$zCe1G7vaL(-N?W4Hv0LTK>!4Llv$E0}ooR&7$$=Bx%hImef!w6O_$U^ptaGfl zW)4>!PdJU*s(Bb*mDJ@*$PChb_-s>a^sUp_fCojcwKfdMmw;!Fv>+x|nQ?Z?%+sS)Yr*P-bVuqDGDzMWdE3pWcT(B|{)lNORvUEm6cmBV z6e9*N0v5`imanBbnqA|{Ji;!V%PbVriA6Hy~kp##>sZS$}J@Bg?EbYBa-Vb z?F+APXmi>z`a_b?+gI3xu~Dhll645}yf}8*<=wU(*`8My!jktOdQI1OIZbcr(IaOxcxoGrNIi-ru37mV2?gXD~2x#QoBJOosiU-t&6&`6Hau zQEw{d|D2elfH}gb6D;(6Fa$a~5;4*_M7I6?S9UKsA0#%z#~;FLZ)^^gis<0wCh?XN zB3$PK-98jwb$pXDS$;9^RC4lmRN-Mx1fDwcbJ?>7>ZCkt=x}V`Mb2Zn@tqb9jXO6s zE&iLkY+Z?nidG?C7xdD~Fk;Z_EqvGVH7wmdv%ZC4kY7^qb*bPpmgGSxsNz{p*60~* z#>JcbEBVFYAv&+MAOO}uuUv3&$TQXaS1={WU;Vx(iUSYYa=oc# zviVS-*U83d~i)0!=t$zECOc=+=RfAU7iR9>Jsd_&b{F{CcXlQX_wZ6(EE5!kul z=^0Xa=QHjy8j!hG8F|&($k@jyNmI?kQ|Yl>8_ic9t8O(QpKcoQ_<|h})NT z4!Qm0%=$KsFUK1ugj^S!-JttUjcdBqX1!@tY?3E;-*hB~-go?E&Phq~FZy?@Fx6|5{Q(y8NZHjpy9j+qG|WS4wrOqq1Jd4|pCwHqj7XE~>2L z&d<-ceNF7nA~LF*c{aS*#LupBzP=sqFhZ>o%bM}Vp&rrlH#jmfQVP&so;62SR(}tK zBWK5a+t&WCuC6+)sW)sBN=S?JXc1{C8IppOC?z00Qb0gTX&52h>IgwXL{L&d8b)^` z(u^JrW5j^5eaGMT{q^lnu3Z=BynD`j-sgVq0Ca3$l=$_xTRx=N$dO%4-r7HWDMKgm zij$jSjodV?^xiYhdvsoV65O+eW{MtNva9ogJ~mBcKU^k~EctL^<-F@hYAURI^H$$r zt%ce$IdLwD8ptxIM+-dlf`Ze9{W>IUm{pJ z9PO>P&(uUUXQjC}W3-w~LfKm@`QG)}Db4&1-42%N!(0sf8k>uA_tRXy+3Xt=;-{%> z;ODW-0rE`p1I+TLs%Q?UkwqssT(jrnvXQ=;0K{$`G4HSb9GO&Kj*)Q*F zYOpo?Iwx;vv5=mn-`5^LyH~6!r}f$kyXYe4S)7;Ujb-*UGTOut2XDVyO#1I<&-r2f>sq@+HLK(N_s7p?JDb}3i>;YRn{|6P>t z$K=UF%CWjvoOvH;wq=YPp~C$v*VEtj+Q9JR47j+`-eS`^8}L{}L7>~GwpDIZ2DOT_ z%M!30UXCV2Y}=Tu8!TutZd9ZcQ(sh*Y2!W@;M>{g?wZ!&8&^G;8;6(z{M$}7`;r%Avb+=zjr>3`HUhZ1e$hLPy z5-MZPGZq&Mq@sKFuO6{K>bnZ}?Q91ELBW?dL#`!0Q|-SK)q%^3Wncml5B6q2Vr4>ny34ANc zJ5bx-K@x5~&Q(DU_q@4V0`}E>s1JYq1SxB~@XDIgYO!(szKdFY{lUjUW?p`fDw=Y5 z*tai#%jK?2#m`}o;AqW-50&g+e6r%`505+_Ii+ZJe^5E^m)D9f>{9A-5*It5Xd%x~Ftc%|rS^9c7_ z=_5^10&k#9Iqyx`bjr-8Ac6Rv3WsUHxOpE_$@`g2rh&pKKu)pEZ4@z7#8acJaiXIZ z#MqUqfLwfi(S7p%MFa6m7hYj8s382mS}&2P$`6?)-QZsf39lOcEy-%ZS;dgeLm~&baFVForrF z4D?IYU+#_1n#wy%X~}xUbfbf1o=}?!klNr*fjoBM9118f0Ejrc8rgnFO-3a6&f7GO z=D^14QP>OjmZ7DaNd&8&mK**cMR$hV;wDX<+#kQc)3CRy zt0yZwK2v9`L^n{3{Mr?~Xj6Yf25R8z&G4OGYsi8f+eFV`cnrMOmNq>klGx?Y{dv>$ zGx{X1pWbb{X1b?8V1i@cN0 z6q%ZKwQrMa4blHMDv;)yUiVudX05z0 zWIUS%xBxnO7_Tla#$vv8{7BIw2~&?y=$MdIpoxJ`;Xs0iH%)*k+3q%6=HgBu4gI|w zo=K+&Yhd(2x$55A-VI+jerWpfLCk(3;fi~UT@cb3)Yy zXL>?%kvN{U%P(%hQS{ypfN=;3D z+!bX1jHU3d1j`EzImP6Y64GxS@T2A2PdU*HPsU$v%mBz&!t5nv{hAnRt%{d0@f5c5 zvNFXwfFh#rUQXEFU9vS7{a(VGxeRZ#cptvS;I5JLZ722R%FXteo;gTXJK)oOYu3m6ip zW`57!{mtb2pUUGfxe0EC14-}Urw8 zaQ$2u!Ju*^{(i!_{WR^NPUVJtf)KcJj)Cd9*i!Ooo9}!7_NXkryPHTFEg`P1wMV1} zlhb$Ez}81^cYv7D4$fR_bZ*9B@0cU*bD^-s{ICAh&YuQ|`$IxTIut zhXGO)BpkOh%*tU`7ZUyF&tM>zF(~zl;uC=15I?+|@zkv8;C2%!FAJ}FVam^+_iUpW zG&c8QYrlSxb^Iz49d{JZOIYPTl<>FlmO*d;ubdenBBMsdnZaz6l=tB;8c@>(VdX*c z0+!r`ZY{>!RW3ka5lT%gFZFTliK0F>zI?r!r0ulirm)E7)Ls{)r+4z`tsfW=Sn@*q zB*uMKz30)$APLkKDQBrS3#&vKHu{KWW^(7@>`$L zc+dUuaP}^#;~eNRyUD3Jc_n2{dnMDkR>iguv0(&*E&wN!o!onp&93mt=;2mj-Jhjb z8ri&7H{7Jw0!Kf1{$aGZH=eAdIgrHv3mx}oZGEBMW_@AC=G%!=wn#64c?~{Ylz+DS ziN?sp^9X?{J>p*X+q0>ilG-D?M~$P%lz2zwGm&du#oD3k=y@b=90 z=z!P=hf!#0GtwQFytxDT{zf9SyIE27Z+i3R(8#~|e`}BZfv`mwE`4%0Yh@b*^f{IC zbcfq^CLBCaLGd(^5@Ob!9nIDD;GxgPQbBaL;tR>Sc{uUnj~Dz$A%eI@?!5bz5{fxd zMRG9a-ukWr*+jwI`5YzWt}BX(mNK!&&Kess_W@CS!McpfAR_Qs_x$%BPrf>c z#x$uF#Y1HdF5*XPMG8b~cxGSKGPfRY3w}7+bEotKM=OMq4ViO1dg~OQKnzw~_E%cM zN^{D3<=JwSk8Z~?OXA)`vR^2UVG!5-g782?+0u|*AJBvEuXlY0+fZx0u^GuH|5ba(l`7Tde&`{Mpf_3#O%-Asb~Pw z2io;Rt_0c6AdHjALrO2fRc(>p?K}e6U=zaKjfsV#%y!+GfU@QZ(>BkEImh~zLDZ@wM}EP_cM(-V9l$pl`}qL2HU_Os!by~S+r zykDC0jjOvr2dgZS=Ui$MWh>1agn90iU0=6~)4^in z3!_3nShkPGcPq`1fW0j z=TOC`Da!uKbKd#spdoeo6df$8A9GajFkT6_Nkw0ciHC(I=spvohst$w|65vov!Wr5 z645>bUf`1Kp78a&AkK|0FKMqV-liZ=(uV|U%WBHfRQ($onA>vjvf1!N!beCU(c;oN zX~lmHgaU278+&@6$tBGJL?DbEzk)Z1$W~+E4}wcq8W}WZ$lS={ID;=5r!<%Rgi`O` zv-DkG?vwxc^dCFOLf&zI5Ad@y!afHfk`fagV8Vga{;_FP1ON|43|^yBBp*L?(e@cv zk5GD=guU!_mA#kEzY^o!wPvy5Z_Ta{HILlKE6^`^&bMj=Vh@?$1Hl;p*xX7(_Al$; z8TJeKLy{Fg@B59sP4B57@M9P;uQ{z7b8RiGQwO^btTENJ!EBvTI=zqx4Zi0agO-KG zLT}LGRZlWw6=z#dAw_>=&5JaKPyS9+=e@nX72@c8jif@!47vDO_V&MvorE-Lq_&xe z4%DGUU2{Vwi}07xOGLQt$yS})hDOvl*%DbOJr9~Jk|CFUF962_aXhtm;C}2~q6}=^ zVmRJ+;*se5(QpiJn=`G7`NR?S9r7J+wfZ-k!>@od0&INeiww33$Hu1dqHM4k8{14X z+@I_Zm4?Q8K^dq@C-D~Pb)ebn*MgpQp=7&mW&-I4OD$K24i4=Gt=Y+&l5mO#tzC4; zpxE4bWLQ+_mZ3%@@gR1u3*TADGH{W>cEM(VFzm$T{60@FKh6&?Uv9e4WxP3LW^p*D7ZY zP8MKAAyR2i}oV3aS5FCKu}o&oN}wJxUNcRddjWI6X-h5h;`>s0KiUV?7S<@gJbHXGtco?JBA3j) z&&B?G1Odu1SM6*3`2Nqs*XKa-@sFoP{)i?MkQV7|F)iqB0uafLp<$bJN0`(;)n?G= z;H%DJ-Rhm9ULVX^Z+7d}JSS36^_pi+2uDz+nbT9rv&mp%a$^ukFsOVM6?S`7+=4{} z!*mYZiPHvF+HCxd#?9o#Df_k&7ZV>f{3sQMY`grwyV1}9?jsM7kng{er`5}{L@P1{ zeG$-8v>#OKBT4f)S9S; z1{x2T>s+J(rq&@P{GYnlwsJu1sKkq~B`FrwIl-%WyRGc+oM?Y!6Xz;o>hb=rzUs^L zjgU{{|L79|paoG0QhEzb0Y z-UWgVz>ij2PBh=X>%Q=(w!A(l8=D#}EQ;(6RABw>GOc4Cn07_Jr_t(yq?RID<$7{R z$*vOj%pB$;vyR+I^mzLDYJVMttD{s_vuPgX9{h%wcStApt|m+^Q|!(o9X+?``{|*9X6BuLFSH)RJE}z{Iy) zuAE#FU#>vS3#{E39JHFcS)*;BSl1CEpNMpjzmPNXt`;Gkh{F|mEp9tZ6g3L-$k}PON zl#iyaZuD5`I$Yz#g4_Cy{MI(LYtEhkXa>vwur-GL@P*>swUrY`>(j^(7AgjBr6f~ zr{uQB%PaC4K2)gsgRYeurrl+?Z=IB7%4GB0wTAiJC^xJZT1)bN%}Fz{D2C!>JQDBlTQG%5}FnsU}9KNu?UEJyx=P!Qa|`o{b8Wm0N$KZ5J@X0OO$w_x$7Pj^m? zArsRj$cDvnS_NCmSUVkyp7EKP0SmI|WKHf0$^^TAtphA#P36_ic>*UB6N$9|HxHsr zX(VNAqL9IA=&~4gS>8WzM!zbCW0;D-D5>xIrmG|mXdj5eRJ*wv_*lUd0>M+vt?61e zz7^Q9g|x{gDgi?XGzC0PR_ejg;dnvaYl4^#-N`Q>jmBPa=P_KH@onf8Z^;>832`#= z8^iH@cRhY%8`*o&F4t>xj;)Z$lgx#*)cc|C;XRKL4|$|3B1P{xzK4^Q?FYsoas zm(npK`xEb@Z#*;b90dJU^7uL+(;oJPn){gSke%!9aYu`bV|?l09k zp`ibxE-{@k+-T(P`(}ofgQf>czOyp6Oy4=r&WC`rO5iHuVk_1^jnE;Fi2i+pz30>7 zoj(D!kDtBUA(_A8enWeoxy*EbNk-$oT2 zak}H?rC1Qo{wtbbwVNcAfmF|O@d=}ttoux;)ABBA-Q+2GlMiylQiEC)OEz;#qhU&{ z+>`3_eW>ngnUwPt^KqDW2o>O}JR3;(1~Q{jr4g((&lShv`R3G0PxtTC)M+74?$u67 z1#1^4Qc5xR40oj|TPT3TFsQzSOy;Zt@RDso+)4DnrX7`+bwTI2cXu~K-+DyKcRj|=vpO<7ph|`4^j)Fe zzjqx2NT|*HxG%{$8ICM^B!W^d6wlS;VdNB<^~+AA%wGVNY?z%;!t|3EbFz4w`B?p^ zw_CG2#)l+;TAmyGqe$D?{fxSQ=%+nUoFRv;LP?;RRVH(MTzLG0kgv7$w%%y=+TaRy zQlF1f2r&|iy20Mi$Ec_ir}`&*eU2J{fbAJ5>U_e$QpIdnP-}SBEozb5GYOOSInX-> z+me^l{BHMer{TKp!QAgbE?krEVHBolxzXXK+ZzH(n(b@IsvgvDY!W|T9?lf0e0cqG z;%Y)Qf(Qy?oj`idarHe0?Jp*FZ4r9sKE3!N7{DlKx!gR;n zzsBT7pYC3Hqb!1uK8Tyw)V2Uud3)%*kq-JEt+Mz{@ZgGX{uOe((Kfu}&tu0pr3Viu zm}NvKatfN_jCAiz{9Epm9K5rqPQ%KMzz508ipGe7*VG7jqhL9tZu8Gx|@| z)k(mj9RXi>rJ+rR7=LhT9YE^(dw6*)LrfZl8J~<^E=W&YdXxkft2gU>vY1rxqXCwX zwxZ#NZm$!p4fnI`;l3q*%uR&c6iK~FjRJlk`XyhVg>C?nAugH*Uqr?(T?n3c7$iKa6B1{69YIm(|Tl{@=eXj!lT|YH+-1o z1E5(U>m}AGH@~RO;C+WxybgRx=_^8ofyw9WAe^|wfo%XB2gSEVK3(Mm)z1V~u%S4s z50_4~JYf%SFRNoGortm4X%9zfq-qzciS_7qk~q#thY&m?`{2eBlhY^M`@oh01jNhK zY|R%Dzuc5}+A_7uyrPYdZi~^Nb_GR9BUcZ+B+umApD3<&F{_#Z^?rHK8|+!H3pszY ztgOqd3K*2AmU1UWSm|0Lk)!D!Uqa&RHf9<{M!D*@+y(;Fz;;{2`DGC zD$G4&@Fm~B$5I^@fWWH@!nkbJATgj#oo(u4$NQG1Lz;0neXN>sYCcJR4-Gz^gsrq3 zHC8n@W9Mu1#lw!-3s-JaX#vk~TnLoA2D%I%e+pOQ+;R7;j>yah^suc)k4lF1_XJg9 z{)RqRU+E>07Hnx6$4&CphH__EM!J$3q1?yn7#~oOh~=8*LB=A9&odh^*-9PTE@u}V zlAojry3X6wgH?#!F_hp4qE_uu?J}Q_-nXG&Mt@90eVy=1AsQQ5%gU--#x0DmSra!b zp$3-r4Vd^QPzNn-#y9ZPItkFVi)i>Vl;qt1rXW5lv88}F)5mi2Y(y7*kQ+YTi}B7A ze*JZ&FaI0}$vOat^61_-K9}Dgk|eFz^hf0=b?NV20Gy6jgQ(4UGhNQ!ePE7}l7Ak6 zqlKJc5$x|O0HlgWe?eP&*L0286a2Yi5WElvZ(9izlP!Snxg_MHx}$NPUH__RHIQys z8?gAOsc39$WJ*d>2%)CjpUk;*{)J3VB}gDEUU1**W{EyAvVKYTITG?W@HYiA@r6-Z zrR1F#W$WBevvlU;m2$Isu+?!Gn)&>0Bp7p7c{F8SGKN;0|rXKCa@oPO?YJpCogh@hQ|4G#;z3n1k5Wkf9TE@Q(s@@pgBaCb6Ny+q#;xt zOE3JOpem9)ejNLMyYX9;E@RmQHxF&dvd)Vyx>%vr%?}g7ytDdU08+(mJU?W-{nr~; zK(+lqru^`=<8n-rfYi{1DyUl)pTQeh3rK{_hbMJ2idl4Gy>Z4DwB5lyds4R_t}@4W zA~ts=sOviatG6K5@Ahb+A!=gP>x)S|j2)O7zahBa%2fAgmo%6i&+=xW==|@*q7=d1 z&ieF@%hL<;%{ZGIF*fUCxG=k=fP){DlOQUrqid8 zwD>E^kFE`^go=U#CI58gnpde7XAi`sCdu6jv3gJ{LJuuk@i#Rqa<}u-JJj%tn1D}n zj>R25@yT73Qzm}(c%g-WS8>WFAQNNP;1D3rJzdkI$fi$LX+rLy)P)c2Vr<`L+bXx6 zqK~Zkcc8Sys!B>82J5xvC^3ZmLXK9%{sWsFWhuR*`%14zEoOO5u9W)KZwQxOM}L;J zj#RQUX1#Elz3EkU^pIWy7*1p4RMcK|(=kDWrDr;&RF1`m=io*%#Z{{wl0cTOhszPa z2WDw-KSAN!&Ywr~L55!}v|mq1)8t@Vz*8-?p@ca@KOyG1>>gIX376el*qPfmv8qHB zRSFa1v}Dvn_TD&d!g#|?toXMU*?p^(c^<61g~!%)k=2We^)jyS)%5uM09~9@p8Xwy-*`!07&S&UWX{>c1Jxr{i2Z$YxCSNW|jEna2DotSgf`JIA zamI&V$;V@DofOesD|td%@osE}4r$yfD33ZcIr;Ap3If``d4PfO>;ZviYc45uHAXeN zSWjdkcsl)&f0ZP$f_Z&yccUK*X&QPMiqC$0*Hcs!?Y&yuu=tEx4Z{1e=zG=g>*cmb z`0+KJl;oH8A10j(Ye7H%;*3G721-q#Z|_le26__XtPFRo1h|e=Xb|qQoB`V>mp5S~ zp--^L{)rz$7miN_C(p=~I_Bqp-(ojLRetShezPT7R)m`%Q6YJA07hx3qQ%(u*+~m` zb3o#{0J_nDDfp^XlB~nsl65SaF#Wf>uI6d=K>2Sq>=)J>#>{tUkBsK}gryRxH)swf zk?y4j4Y{jgBNyj?#w@#k^51gS9jc~W=tShJMt?8-{$0YZdaxSa8I|c@FL53y?1uZ} zE{^J@3*~#nkTJ2?HoKnGP7L%J?<)iKt z8s-BNjMS)>;ts6U+zroS#A|l^(Q+#y6xOPU4;+dcgkXtv8vEm67`t^xRk`<&sU34Z za9B}iwo=+MssU=MY)8DbL2&X&>CtP@5+uNoZH{Ew?O^Kp7k*Zs!(RnmoMgKQnX#k9 z6ADbrj*LwR>Ed(jFGhr*t{=QTx7fSghd8lz;~t(8xT>kRPX~g=3i_IXwmA;VtDJOn zC^bRm)GhI!WK;pghBIbAzzRaRdn;KSM4Ri|GzzwhFt_3h-+j*oRgD&=X}!~Zyw6xJ zj^;Z-cF+|YRX0(|!g^u#d#c@eN6@|X)3VR)7QvF-q>{f^PAs=S6B<1(eE3a~FD_-^ zkxO~f*}jq!T4B1?I5Zvt(~nKMjUQ1r@mOYD>~n{`n9I3~!=&w5`}}ZaO5?0XO32*u zYcp~RCSGg>k4%l+Kkr(~YRu{S6DcB~#o=EK~NX$m?jA7v~`r$?1f`hv* zBa{+98MRK`v=WkZb-^*mwwyTrT0^<3X|{+k2WwE?SHaCO?J!;WPPBGxUx$jIw(xK? zB!Jd@&^F$b%)pnVi{s+ksMl-Vet=RhI|MH&E-psApzDA3?AcvsXJ^+YlNo2Lu(YdYLFI{#X-Jh=ThQVEBO=8S@;kY?mfDOQ?f_5FokEuF}Uc2Yo%50M|=-Mn~9s@+0Ok`T%` zl-nES(2b08P5?xGSZ^*l5}p1pNlgOaC`G?aOA;G&-1heau@CAS7#za@vlD(+R@Nw2^mo+#pK0JMNQo2}bDowolEbz*A zez4$J$trk5>`TYt`_fY3heU0;ENK)#KehPID=*wZ@$%8i1GIM$gC;>4)+IhZ-c6Q^ zHNe5^&qCH#Opu?$Hl`{lEhoA+zsGah@Z8i>dHu&S{4ap<#QjZ&kpU9m5Gn#8?&RUW zxc-s1!~K+y#nM-;jT$1l&v4@st$Q@<|0*SN8u6>N_KV zg*u^m3-W5p4V4ad(rjxIG(Pod+tgVByj|=B_>*+96dwPXqfnGz$|S(&y@YK4!P`V? zr;A>8ahCaGixBb(aRdEtbn!Xsb04bS$!8?lxj%LQ#Gaab z&=YpZnqLOm;7|Hs$K9fJLXY6(M{Mc-lo*}&%1hVnR+JVH_;GrLz$;!H_`>7q^5mQd zmOtlvrNx3v7gjtrSE=meM}%Dew!}Ao&O86Y!3v^XzLPRCBKyqo(PzRG(nY4n5SjCS zWj4AO(wwJZFXjfNn<0mXlk!IIqfY#r7cVAq#YJ{&Y8UW2dI)Hdzo{0R@y0S)VCy-) zz~M_6cD$ZphS0z#mmfE>yjmefGvMt-YfBP9&U~*+er3J?BWD{4chJYw)!(BZfO+Y? zhPBqGRT@~D;b0*JTW!5Ari#F%LKinTJ^=xNEv@FegBsr2#PjuP(wxQ)VMlh=OrS8A zjqPv6$Ke$pYJ@2C0>$GtFZ>Ov9JmC`rn2soQQhs%y^(quzSb(G;~>5^w&JqB%)Q2# zA?P5kdIu^QT`DX{J2*iH06)c=osFM2*iH9mTIv0VQtIKEk7?>+^_97f!PK_v!ZL_>mJDgiU3tRRzE_$>`f z8^YM@{m#3WC{nExJA^|oMoCeJbx^wyRO~K3q>J$7dy<<|brivg4b?+cbV;jj2-ADk zx8AJ%BHg30705{$t49xw`59N~f%@IJG`pH?x!IvYl(f9HsVF%^rlM(`s(7h4Gm`qA zv?H82X@@HIyzmTNAt^E@IP8dVd@7)#0-H0Rl{jCu?!t{>qP(IhUxuGd!l<3~O+EvUZAIAHZ^c*gPJL z!pEY+Zz|bN%j%(&ExLj{Ebb?~BCISK^Ha13h0dTWeu(i&o?){sL>2fp9;8QZh`+w= zd|%@Dq17lC!!K`2PalU_CeyZ{lHRV@JhxEkZkwxyj0A7&n8ajtjmt->f;pwr2#lCV}NJ|TjlRdx?&50mJ{Oyh(%l$&q$CVjbZ-L(L5U(Ony zRG+GcJ~e%^!sLtUOzn-OB7hxslKX&ODq5-uj%M>r`?%SxLh2paegF(Wi$sj!K-gvN z;ws$C{fV8Ulz7OcjY!B8YBUK`ZF8B@#x}>;69(I7DMxP5HnZ0H-wnI9qdZv?lPje4 zuDtD3YT+M7YhN`L*v5&ryGpu@kiDwLmXyiMZQ~Ai$*th_$JuSLVD_ekz>*-~iX#dV5 zDms!vL;auN7hqxZMTf18d@=su=P4~46!J?f$PeT1wcZi!0}62vP?C?lQ+6;|n^_hE zX-iUbA=>iH@iP5e4u1kj!al_+JxrMWC6ue6F^+GtGzHfmtyvxM-Mc9IB^1xFb9`G1 zT^7hor(%i)+pi|4$ZYR^6IIgM_V*CZRrsf@$rbii1^z>Ux$xbcyr%(DEiQBUFQQMjzm`cNbMeu zpX6q0P35#{a{}>cnc^Naj^;`Uvm9{{bv?R;NS{@m9Sn%zEvp28p!e*ZDCW;d!j@~m zpkTIMN6k}!?dAik-0+<0g!n_RV%KTq$-(*|K1o76vT4T<$K^~`> zA|#&0vQ0*x(-RUXRTaT!-=Dt_j8CBtLs&fA zNO8a&avHq0RvVmb0e_d;eW)atbyH?k%5I0*3!pJ&VgUY6NmX7e0~PK8QC{@N0TSrU zdlFvlO}A%2llMI>M*v3<@W)WoyqJt*nP@cdY6Wm=n&iiF6KbT00$56kvBlQPM3id6 z(~uOMJ-T_qkb}a+=#9@dnJS0@bO^aPW-IOvb01c~?f*#UWX*9Yo zRo^dTC=pBb!=>3_xiZ|+lvP_)^Jc{ldBiVaX6b(xKDBQK?KCJ?HrI_)w=z_GS{=+q zS;Pe+LC-~h3CEM2V3~qFa!zrJpZEg1h|?5YerGkT1(Xb)bT@nLOiZQ2mKbi$v% zPIA$UH~i+Cg|TO-7$v^fKXTGnzDe#-e}eD^tay+6W-Rw##reS z!(*E%vgNObU7p(kUk}+3*|!hkH7cMuT+ydoQV&V)&)MwK?_-scz%miuM~~_(wXY4w zUUdKKUXad|r{)`C&CumsXW~3pz>=)Uep>CuO@)(}%*MW3sEQYstfXs-L&N5t<2`*9 zMt-3y*H>rbtW?28@u&xXCec&oFp8rtxHne}^rjgqv;hgRC_Tk`emcee^6#@5j`k~q zVTg^rJ3s-4W9c+3K1DjV4D(^t-q>>Tiz83q|I*Z)d&mBfHevyQcnL6U1Mo9r={lI3 zfC#}H`o`{ht$lw8iC;5U{k^oG-5UmcdUU1>IKkRw87lU3HqI5{o-gYc}w^WFBgns2_hk2x9sjS=;t^-*@P zD$j!#h1`Uqt}V~-_~))UyjE;yLy}O9L94jkHbAeS zxoC_-#O`gDs3&m*3$JT<}>Vy@>TJ<(Ppx5X<$_A!GGZqu%;}nE6ts{H2ZRK7se1AQsSdgV8?$ zQ=C0Th0Nx`RdS#L1Fyrj$J zLy=ZyS(v~>(0cfzmiU>P{u3R3{+y^HFoGfm$o(^V)kdaX{5ay>S-X+k^JBUPc(DjQ#%*-y zV@Lm?XYicXNi?%UUao;<+*{+(2s=P(XliD1O}uak?fh`_-x3yB`RiZeHLf?*_^6v~ zpptvX`GNodRI*B%LZuOXIdXC5rJc7(X6u#b*}2BJ7eQj2OOIST4D9TCK0HuePD`^TGq*6IQeaxiic@$iGura%3v87x~= z6P!@dzqei_x%c+;R1M@1yDV1>`HzjMb~V&LE|$B6IVg;@6^KTbodMg8B7O=_%iuEoT_xF0VQT%?_sJYkfgBev z;0}HjVBh5YbA-}4P<|>B!BAGA{_vflU>e5R%cca%2Bt8 z(l8=4GysP>uwfS>i8u|1l_By#Rk;6r#fTRKZOuX~z@2~4x!oglqk%Y{=#M>^_5mAR z^KjD#jn$YJj}L%FW>yRA8Lci1X%Caz_9s79Q3I0$i(T&NoD_VL^VZ%^Z<)rUdHRK~ z4<=%qL}sI!?aQ+F7PAK6KaW%2Px1G_SJ044(B?ziu?=Jw1NyRYZbAW(X~ikGu1M6Tr=m3w_cz<{qGS(solr@`+q z=~^fSZa#}XmdkHw$Q;U&iyi`Fy~-lao#;>`2XP1*Xm8If*%0~6tjY-K&g*@ra_dD)WXEv z+D(+40=~l=`D|@~Hppa%ead cAs9U2BX43C_UZ630^p;irt_p+#X9_d04^s@n*aa+ literal 0 HcmV?d00001