No OneTemporary

File Metadata

Created
Mon, Jun 3, 2:58 PM
This file is larger than 256 KB, so syntax highlighting was skipped.
This document is not UTF8. It was detected as ISO-8859-1 (Latin 1) and converted to UTF8 for display.
diff --git a/krita/data/shaders/shaders.qrc b/krita/data/shaders/shaders.qrc
index a14417b043..c3b076ac46 100644
--- a/krita/data/shaders/shaders.qrc
+++ b/krita/data/shaders/shaders.qrc
@@ -1,20 +1,17 @@
-<!DOCTYPE RCC>
-<RCC version="1.0">
- <qresource>
+<RCC>
+ <qresource prefix="/">
<file>bilinear_gradient.frag</file>
<file>conical_gradient.frag</file>
<file>conical_symetric_gradient.frag</file>
- <file>cursor_legacy.frag</file>
- <file>cursor_legacy.vert</file>
- <file>cursor.frag</file>
- <file>cursor.vert</file>
<file>highq_downscale.frag</file>
<file>linear_gradient.frag</file>
<file>matrix_transform.vert</file>
<file>radial_gradient.frag</file>
<file>simple_texture.frag</file>
<file>square_gradient.frag</file>
<file>matrix_transform_legacy.vert</file>
<file>simple_texture_legacy.frag</file>
+ <file>solid_color.frag</file>
+ <file>solid_color_legacy.frag</file>
</qresource>
</RCC>
diff --git a/krita/data/shaders/solid_color.frag b/krita/data/shaders/solid_color.frag
new file mode 100644
index 0000000000..9828fa5ccd
--- /dev/null
+++ b/krita/data/shaders/solid_color.frag
@@ -0,0 +1,8 @@
+uniform vec4 fragColor;
+
+out vec4 resultFragmentColor;
+
+void main(void)
+{
+ resultFragmentColor = vec4(fragColor.x, fragColor.y, fragColor.z, fragColor.w);
+}
diff --git a/krita/data/shaders/solid_color_legacy.frag b/krita/data/shaders/solid_color_legacy.frag
new file mode 100644
index 0000000000..d71c858bef
--- /dev/null
+++ b/krita/data/shaders/solid_color_legacy.frag
@@ -0,0 +1,6 @@
+uniform vec4 fragColor;
+
+void main(void)
+{
+ gl_FragColor = vec4(fragColor.x, fragColor.y, fragColor.z, fragColor.w);
+}
diff --git a/krita/org.kde.krita.appdata.xml b/krita/org.kde.krita.appdata.xml
index 80ef14001c..a3c4977cf9 100644
--- a/krita/org.kde.krita.appdata.xml
+++ b/krita/org.kde.krita.appdata.xml
@@ -1,167 +1,168 @@
<?xml version="1.0" encoding="utf-8"?>
<component type="desktop">
<id>org.kde.krita.desktop</id>
<metadata_license>CC0-1.0</metadata_license>
<name>Krita</name>
<name xml:lang="ast">Krita</name>
<name xml:lang="ca">Krita</name>
<name xml:lang="ca-valencia">Krita</name>
<name xml:lang="cs">Krita</name>
<name xml:lang="de">Krita</name>
<name xml:lang="en-GB">Krita</name>
<name xml:lang="es">Krita</name>
<name xml:lang="it">Krita</name>
<name xml:lang="nl">Krita</name>
<name xml:lang="pl">Krita</name>
<name xml:lang="pt">Krita</name>
<name xml:lang="sv">Krita</name>
<name xml:lang="uk">Krita</name>
<name xml:lang="x-test">xxKritaxx</name>
+ <name xml:lang="zh-CN">Krita</name>
<summary>Digital Painting, Creative Freedom</summary>
<summary xml:lang="ast">Pintura dixital, llibertá creativa</summary>
<summary xml:lang="bs">Digitalno crtanje, kreativna sloboda</summary>
<summary xml:lang="ca">Dibuix digital, Llibertat creativa</summary>
<summary xml:lang="ca-valencia">Dibuix digital, Llibertat creativa</summary>
<summary xml:lang="cs">Digitální malování, svoboda tvorby</summary>
<summary xml:lang="da">Digital tegning, kunstnerisk frihed</summary>
<summary xml:lang="de">Digitales Malen, kreative Freiheit</summary>
<summary xml:lang="en-GB">Digital Painting, Creative Freedom</summary>
<summary xml:lang="es">Pintura digital, libertad creativa</summary>
<summary xml:lang="et">Digitaalne joonistamine, loominguline vabadus</summary>
<summary xml:lang="fi">Digitaalimaalaus, luova vapaus</summary>
<summary xml:lang="fr">Peinture numérique, liberté créatrice</summary>
<summary xml:lang="gl">Debuxo dixital, liberdade creativa</summary>
<summary xml:lang="ia">Pictura digital, Libertate creative</summary>
<summary xml:lang="it">Pittura digitale, libertà creativa</summary>
<summary xml:lang="nl">Digital Painting, Creative Freedom</summary>
<summary xml:lang="pl">Cyfrowe malowanie, Wolność Twórcza</summary>
<summary xml:lang="pt">Pintura Digital, Liberdade Criativa</summary>
<summary xml:lang="pt-BR">Pintura Digital, Liberdade Criativa</summary>
<summary xml:lang="ru">Цифровое рисование. Творческая свобода</summary>
<summary xml:lang="sk">Digitálne maľovanie, kreatívna sloboda</summary>
<summary xml:lang="sv">Digital målning, kreativ frihet</summary>
<summary xml:lang="uk">Цифрове малювання, творча свобода</summary>
<summary xml:lang="x-test">xxDigital Painting, Creative Freedomxx</summary>
<summary xml:lang="zh-CN">数码绘图,自由创作</summary>
<description>
<p>Krita is the full-featured digital art studio.</p>
<p xml:lang="ast">Krita ye l'estudiu completu d'arte dixital.</p>
<p xml:lang="bs">Krita je potpuni digitalni umjetnički studio.</p>
<p xml:lang="ca">Krita és l'estudi d'art digital ple de funcionalitats.</p>
<p xml:lang="ca-valencia">Krita és l'estudi d'art digital ple de funcionalitats.</p>
<p xml:lang="de">Krita ist ein digitales Designstudio mit umfangreichen Funktionen.</p>
<p xml:lang="en-GB">Krita is the full-featured digital art studio.</p>
<p xml:lang="es">Krita es un estudio de arte digital completo</p>
<p xml:lang="et">Krita on rohkete võimalustega digitaalkunstistuudio.</p>
<p xml:lang="fi">Krita on täyspiirteinen digitaiteen ateljee.</p>
<p xml:lang="fr">Krita est le studio d'art numérique complet.</p>
<p xml:lang="gl">Krita é un estudio completo de arte dixital.</p>
<p xml:lang="ia">Krita es le studio de arte digital complete.</p>
<p xml:lang="it">Krita è uno studio d'arte digitale completo.</p>
<p xml:lang="ja">Krita は、フル機能を備えたデジタルなアートスタジオです。</p>
<p xml:lang="nl">Krita is de digitale kunststudio vol mogelijkheden.</p>
<p xml:lang="pl">Krita jest pełnowymiarowym, cyfrowym studiem artystycznym</p>
<p xml:lang="pt">O Krita é o estúdio de arte digital completo.</p>
<p xml:lang="pt-BR">O Krita é o estúdio de arte digital completo.</p>
<p xml:lang="ru">Krita полнофункциональный инструмент для создания цифровой графики.</p>
<p xml:lang="sk">Krita je plne vybavené digitálne umelecké štúdio.</p>
<p xml:lang="sv">Krita är den fullfjädrade digitala konststudion.</p>
<p xml:lang="uk">Krita — повноцінний комплекс для створення цифрових художніх творів.</p>
<p xml:lang="x-test">xxKrita is the full-featured digital art studio.xx</p>
<p xml:lang="zh-CN">Krita 是全功能的数码艺术工作室。</p>
<p>It is perfect for sketching and painting, and presents an end–to–end solution for creating digital painting files from scratch by masters.</p>
<p xml:lang="bs">On je savršen za skiciranje i slikanje i predstavlja finalno rješenje za kreiranje digitalnih slika od nule s majstorima</p>
<p xml:lang="ca">És perfecte per fer esbossos i pintar, i presenta una solució final per crear fitxers de dibuix digital des de zero per a mestres.</p>
<p xml:lang="ca-valencia">És perfecte per fer esbossos i pintar, i presenta una solució final per crear fitxers de dibuix digital des de zero per a mestres.</p>
<p xml:lang="en-GB">It is perfect for sketching and painting, and presents an end–to–end solution for creating digital painting files from scratch by masters.</p>
<p xml:lang="es">Es perfecto para diseñar y pintar, y ofrece una solución completa para crear desde cero archivos de pintura digital apta para profesionales.</p>
<p xml:lang="et">See on suurepärane töövahend visandite ja joonistuste valmistamiseks ning annab andekatele kunstnikele võimaluse luua digitaalpilt algusest lõpuni just oma käe järgi.</p>
<p xml:lang="fi">Se on täydellinen luonnosteluun ja maalaukseen ja tarjoaa kokonaisratkaisun digitaalisten kuvatiedostojen luomiseen alusta alkaen.</p>
<p xml:lang="fr">Il est parfait pour crayonner et peindre, et constitue une solution de bout en bout pour créer des fichier de peinture numérique depuis la feuille blanche jusqu'au épreuves finales.</p>
<p xml:lang="gl">Resulta perfecto para debuxar e pintar, e presenta unha solución completa que permite aos mestres crear ficheiros de debuxo dixital desde cero.</p>
<p xml:lang="ia">Illo es perfecte pro schizzar e pinger, e presenta un solution ab fin al fin pro crear files de pictura digital ab grattamentos per maestros.</p>
<p xml:lang="it">Perfetto per fare schizzi e dipingere, prevede una soluzione completa che consente agli artisti di creare file di dipinti digitali partendo da zero.</p>
<p xml:lang="nl">Het is perfect voor schetsen en schilderen en zet een end–to–end oplossing voor het maken van digitale bestanden voor schilderingen vanuit het niets door meesters.</p>
<p xml:lang="pl">Nadaje się perfekcyjnie do szkicowania i malowania i dostarcza zupełnego rozwiązania dla tworzenia plików malowideł cyfrowych od zalążka.</p>
<p xml:lang="pt">É perfeito para desenhos e pinturas, oferecendo uma solução final para criar ficheiros de pintura digital do zero por mestres.</p>
<p xml:lang="pt-BR">É perfeito para desenhos e pinturas, oferecendo uma solução final para criar arquivos de desenho digital feitos a partir do zero por mestres.</p>
<p xml:lang="ru">Она превосходно подходит для набросков и рисования, предоставляя мастерам самодостаточный инструмент для создания цифровой живописи с нуля.</p>
<p xml:lang="sk">Je ideálna na skicovanie a maľovanie a poskytuje end-to-end riešenie na vytváranie súborov digitálneho maľovania od základu od profesionálov.</p>
<p xml:lang="sv">Den är perfekt för att skissa och måla, samt erbjuder en helomfattande lösning för att skapa digitala målningsfiler från grunden av mästare.</p>
<p xml:lang="uk">Цей комплекс чудово пасує для створення ескізів та художніх зображень і є самодостатнім набором для створення файлів цифрових полотен «з нуля» для справжніх художників.</p>
<p xml:lang="x-test">xxIt is perfect for sketching and painting, and presents an end–to–end solution for creating digital painting files from scratch by masters.xx</p>
<p xml:lang="zh-CN">适合做草图和绘画,为艺术大师提供了从草稿到数码绘画的完整解决方案。</p>
<p>
Krita is a great choice for creating concept art, comics, textures for rendering and matte paintings. Krita supports many colorspaces like RGB and CMYK
at 8 and 16 bits integer channels, as well as 16 and 32 bits floating point channels.
</p>
<p xml:lang="bs">Krita je odličan izbor za kreiranje konceptualne umjetnosti, stripove, teksture za obradu i mat slike. Krita podržava mnoge prostore boja kao RGB i CMIK na 8 i 16 bitnim cjelobrojnim kanalimaa, kao i 16 i 32 bita floating point kanalima.</p>
<p xml:lang="ca">El Krita és una gran elecció per crear art conceptual, còmics, textures per renderitzar i pintures «matte». El Krita permet molts espais de color com el RGB i el CMYK a 8 i 16 bits de canals sencers, així com 16 i 32 bits de canals de coma flotant.</p>
<p xml:lang="ca-valencia">El Krita és una gran elecció per crear art conceptual, còmics, textures per renderitzar i pintures «matte». El Krita permet molts espais de color com el RGB i el CMYK a 8 i 16 bits de canals sencers, així com 16 i 32 bits de canals de coma flotant.</p>
<p xml:lang="en-GB">Krita is a great choice for creating concept art, comics, textures for rendering and matte paintings. Krita supports many colourspaces like RGB and CMYK at 8 and 16 bits integer channels, as well as 16 and 32 bits floating point channels.</p>
<p xml:lang="es">Krita es una gran elección para crear arte conceptual, cómics, texturas para renderizar y «matte paintings». Krita permite el uso de muchos espacios de color, como, por ejemplo, RGB y CMYK, tanto en canales de enteros de 8 y 16 bits, así como en canales de coma flotante de 16 y 32 bits.</p>
<p xml:lang="et">Krita on üks paremaid valikuid kontseptuaalkunsti, koomiksite, tekstuuride ja digitaalmaalide loomiseks. Krita toetab paljusid värviruume, näiteks RGB ja CMYK 8 ja 16 täisarvulise bitiga kanali kohta, samuti 16 ja 32 ujukomabitiga kanali kohta.</p>
<p xml:lang="fi">Krita on hyvä valinta konseptikuvituksen, sarjakuvien, pintakuvioiden ja maalausten luomiseen. Krita tukee useita väriavaruuksia kuten RGB:tä ja CMYK:ta 8 ja 16 bitin kokonaisluku- samoin kuin 16 ja 32 bitin liukulukukanavin.</p>
<p xml:lang="fr">Krita est un très bon choix pour créer des concepts arts, des bandes-dessinées, des textures de rendu et des peintures. Krita prend en charge plusieurs espaces de couleurs comme RVB et CMJN avec les canaux de 8 et 16 bits entiers ainsi que les canaux de 16 et 32 bits flottants.</p>
<p xml:lang="gl">Krita é unha gran opción para crear arte conceptual, texturas para renderización e pinturas mate. Krita permite usar moitos espazos de cores como RGB e CMYK con canles de 8 e 16 bits, así como canles de coma flotante de 16 e 32 bits.</p>
<p xml:lang="ia">Krita es un grande selection pro crear arte de concepto, comics, texturas pro rendering e picturas opac. Krita supporta multe spatios de colores como RGB e CMYK con canales de integer a 8 e 16 bits, como anque canales floating point a 16 e 32 bits.</p>
<p xml:lang="it">Krita rappresenta una scelta ottimale per la creazione di arte concettuale, fumetti e texture per il rendering e il matte painting. Krita supporta molti spazi colori come RGB e CMYK a 8 e 16 bit per canali interi e 16 e 32 bit per canali a virgola mobile.</p>
<p xml:lang="ja">コンセプトアート、コミック、3DCG 用テクスチャ、マットペイントを制作する方にとって、Krita は最適な選択です。Krita は、8/16 ビット整数/チャンネル、および 16/32 ビット浮動小数点/チャンネルの RGB や CMYK をはじめ、さまざまな色空間をサポートしています。</p>
<p xml:lang="nl">Krita is een goede keuze voor het maken van kunstconcepten, strips, textuur voor weergeven en matte schilderijen. Krita ondersteunt vele kleurruimten zoals RGB en CMYK in 8 en 16 bits kanalen met gehele getallen, evenals 16 en 32 bits kanalen met drijvende komma.</p>
<p xml:lang="pl">Krita jest świetnym wyborem przy tworzeniu koncepcyjnej sztuki, komiksów, tekstur do wyświetlania i kaszet. Krita obsługuje wiele przestrzeni barw takich jak RGB oraz CMYK dla kanałów 8 oraz 16 bitowych wyrażonych w l. całkowitych, a także 16 oraz 32 bitowych wyrażonych w l. zmiennoprzecinkowych.</p>
<p xml:lang="pt">O Krita é uma óptima escolha para criar arte conceptual, banda desenhada, texturas para desenho e pinturas. O Krita suporta diversos espaços de cores como o RGB e o CMYK com canais de cores inteiros a 8 e 16 bits, assim como canais de vírgula flutuante a 16 e a 32 bits.</p>
<p xml:lang="pt-BR">O Krita é uma ótima escolha para criação de arte conceitual, histórias em quadrinhos, texturas para desenhos e pinturas. O Krita tem suporte a diversos espaços de cores como RGB e CMYK com canais de cores inteiros de 8 e 16 bits, assim como canais de ponto flutuante de 16 e 32 bits.</p>
<p xml:lang="ru">Krita - отличный выбор для создания концепт-артов, комиксов, текстур для рендеринга и рисования. Она поддерживает множество цветовых пространств включая RGB и CMYK с 8 и 16 целыми битами на канал, а также 16 и 32 битами с плавающей запятой на канал.</p>
<p xml:lang="sk">Krita je výborná voľba pre vytváranie konceptového umenia, textúr na renderovanie a matné kresby. Krita podporuje mnoho farebných priestorov ako RGB a CMYK na 8 a 16 bitových celočíselných kanáloch ako aj 16 a 32 bitových reálnych kanáloch.</p>
<p xml:lang="sv">Krita är ett utmärkt val för att skapa concept art, serier, strukturer för återgivning och bakgrundsmålningar. Krita stöder många färgrymder som RGB och CMYK med 8- och 16-bitars heltal, samt 16- och 32-bitars flyttal.</p>
<p xml:lang="uk">Krita — чудовий інструмент для створення концептуального живопису, коміксів, текстур для моделей та декорацій. У Krita передбачено підтримку багатьох просторів кольорів, зокрема RGB та CMYK з 8-бітовими та 16-бітовими цілими значеннями, а також 16-бітовими та 32-бітовими значеннями з рухомою крапкою для каналів кольорів.</p>
<p xml:lang="x-test">xxKrita is a great choice for creating concept art, comics, textures for rendering and matte paintings. Krita supports many colorspaces like RGB and CMYK at 8 and 16 bits integer channels, as well as 16 and 32 bits floating point channels.xx</p>
<p xml:lang="zh-CN">Krita 是创建抽象艺术,漫画,渲染纹理和亚光绘画的理想选择。Krita 支持非常多的色彩空间,比如 8 位和 16 位整数通道以及 16 位和 32 位浮点通道的 RGB 和 CMYK。</p>
<p>Have fun painting with the advanced brush engines, amazing filters and many handy features that make Krita enormously productive.</p>
<p xml:lang="bs">Zabavite se kreirajući napredne pogone četki, filtere i mnoge praktične osobine koje čine Krita vrlo produktivnim.</p>
<p xml:lang="ca">Gaudiu pintant amb els motors de pinzells avançats, els filtres impressionants i moltes funcionalitats útils que fan el Krita molt productiu.</p>
<p xml:lang="ca-valencia">Gaudiu pintant amb els motors de pinzells avançats, els filtres impressionants i moltes funcionalitats útils que fan el Krita molt productiu.</p>
<p xml:lang="en-GB">Have fun painting with the advanced brush engines, amazing filters and many handy features that make Krita enormously productive.</p>
<p xml:lang="es">Diviértase pintando con los avanzados motores de pinceles, los espectaculares filtros y muchas funcionalidades prácticas que hacen que Krita sea enormemente productivo.</p>
<p xml:lang="et">Joonistamise muudavad tunduvalt lõbusamaks võimsad pintslimootorid, imetabased filtrid ja veel paljud käepärased võimalused, mis muudavad Krita kasutaja tohutult tootlikuks.</p>
<p xml:lang="fi">Pidä hauskaa maalatessasi edistyneillä sivellinmoottoreilla, hämmästyttävillä suotimilla ja monilla muilla kätevillä ominaisuuksilla, jotka tekevät Kritasta tavattoman tehokkaan.</p>
<p xml:lang="fr">Amusez-vous à peindre avec les outils de brosse avancés, les filtres incroyables et les nombreuses fonctionnalités pratiques qui rendent Krita extrêmement productif.</p>
<p xml:lang="gl">Goza debuxando con motores de pincel avanzados, filtros fantásticos e moitas outras funcionalidades útiles que fan de Krita un programa extremadamente produtivo.</p>
<p xml:lang="ia">Amusa te a pinger con le motores de pincel avantiate, filtros stupende e multe characteristicas amical que face Krita enormemente productive.</p>
<p xml:lang="it">Divertiti a dipingere con gli avanzati sistemi di pennelli, i sorprendenti filtri e molte altre utili caratteristiche che fanno di Krita un software enormemente produttivo.</p>
<p xml:lang="ja">Krita のソフトウェアとしての生産性を高めている先進的なブラシエンジンや素晴らしいフィルタのほか、便利な機能の数々をお楽しみください。</p>
<p xml:lang="nl">Veel plezier met schilderen met the geavanceerde penseel-engines, filters vol verbazing en vele handige mogelijkheden die maken dat Krita enorm productief is.</p>
<p xml:lang="pl">Baw się przy malowaniu przy użyciu zaawansowanych silników pędzli, zadziwiających filtrów i wielu innych przydatnych cech, które czynią z Krity bardzo produktywną.</p>
<p xml:lang="pt">Divirta-se a pintar com os motores de pincéis avançados, os filtros espantosos e muitas outras funcionalidades úteis que tornam o Krita altamente produtivo.</p>
<p xml:lang="pt-BR">Divirta-se pintando com os mecanismos de pincéis avançados, filtros maravilhosos e muitas outras funcionalidades úteis que tornam o Krita altamente produtivo.</p>
<p xml:lang="ru">Получайте удовольствие от использования особых кистевых движков, впечатляющих фильтров и множества других функций, делающих Krita сверхпродуктивной.</p>
<p xml:lang="sk">Užívajte si maľovanie s pokročilými kresliacimi enginmi, úžasnými filtrami a mnohými užitočnými funkciami, ktoré robia Kritu veľmi produktívnu.</p>
<p xml:lang="sv">Ha det så kul vid målning med de avancerade penselfunktionerna, fantastiska filtren och många praktiska funktioner som gör Krita så enormt produktiv.</p>
<p xml:lang="uk">Отримуйте задоволення від малювання за допомогою пензлів з найширшими можливостями, чудових фільтрів та багатьох зручних можливостей, які роблять Krita надзвичайно продуктивним засобом малювання.</p>
<p xml:lang="x-test">xxHave fun painting with the advanced brush engines, amazing filters and many handy features that make Krita enormously productive.xx</p>
<p xml:lang="zh-CN">尽情使用高级笔刷引擎,超赞的滤镜和很多手绘特性,发挥 Krita 绝佳的创造力。</p>
</description>
<url type="homepage">https://www.krita.org/</url>
<url type="faq">https://krita.org/about/faq/</url>
<url type="donation">https://krita.org/support-us/donations/</url>
<url type="help">https://docs.krita.org/Category:Tutorials</url>
<screenshots>
<screenshot type="default">
<image>http://files.kde.org/krita/marketing/appdata/2016-05-24_screenshot_002.png</image>
</screenshot>
<screenshot type="default">
<image>http://files.kde.org/krita/marketing/appdata/2016-05-24_screenshot_003.png</image>
</screenshot>
<screenshot type="default">
<image>http://files.kde.org/krita/marketing/appdata/2016-05-24_screenshot_004.png</image>
</screenshot>
<screenshot type="default">
<image>http://files.kde.org/krita/marketing/appdata/2016-05-24_screenshot_005.png</image>
</screenshot>
</screenshots>
<update_contact>foundation@krita.org</update_contact>
<project_group>KDE</project_group>
<provides>
<binary>krita</binary>
</provides>
</component>
diff --git a/libs/image/brushengine/kis_paint_information.cc b/libs/image/brushengine/kis_paint_information.cc
index d77a8e943b..25583e910c 100644
--- a/libs/image/brushengine/kis_paint_information.cc
+++ b/libs/image/brushengine/kis_paint_information.cc
@@ -1,585 +1,595 @@
/*
* Copyright (c) 2007,2010 Cyrille Berger <cberger@cberger.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <brushengine/kis_paint_information.h>
#include <QDomElement>
-#include <QScopedPointer>
+#include <boost/optional.hpp>
#include "kis_paintop.h"
#include "kis_algebra_2d.h"
#include "kis_lod_transform.h"
#include "kis_spacing_information.h"
#include <kis_dom_utils.h>
struct KisPaintInformation::Private {
Private(const QPointF & pos_,
qreal pressure_,
qreal xTilt_, qreal yTilt_,
qreal rotation_,
qreal tangentialPressure_,
qreal perspective_,
qreal time_,
qreal speed_,
bool isHoveringMode_)
:
pos(pos_),
pressure(pressure_),
xTilt(xTilt_),
yTilt(yTilt_),
rotation(rotation_),
tangentialPressure(tangentialPressure_),
perspective(perspective_),
time(time_),
speed(speed_),
isHoveringMode(isHoveringMode_),
randomSource(0),
currentDistanceInfo(0),
levelOfDetail(0)
{
}
~Private() {
KIS_ASSERT_RECOVER_NOOP(!currentDistanceInfo);
}
Private(const Private &rhs) {
copy(rhs);
}
Private& operator=(const Private &rhs) {
copy(rhs);
return *this;
}
void copy(const Private &rhs) {
pos = rhs.pos;
pressure = rhs.pressure;
xTilt = rhs.xTilt;
yTilt = rhs.yTilt;
rotation = rhs.rotation;
tangentialPressure = rhs.tangentialPressure;
perspective = rhs.perspective;
time = rhs.time;
speed = rhs.speed;
isHoveringMode = rhs.isHoveringMode;
randomSource = rhs.randomSource;
currentDistanceInfo = rhs.currentDistanceInfo;
canvasRotation = rhs.canvasRotation;
canvasMirroredH = rhs.canvasMirroredH;
if (rhs.drawingAngleOverride) {
- drawingAngleOverride.reset(new qreal(*rhs.drawingAngleOverride));
+ drawingAngleOverride = *rhs.drawingAngleOverride;
}
levelOfDetail = rhs.levelOfDetail;
}
QPointF pos;
qreal pressure;
qreal xTilt;
qreal yTilt;
qreal rotation;
qreal tangentialPressure;
qreal perspective;
qreal time;
qreal speed;
bool isHoveringMode;
KisRandomSourceSP randomSource;
int canvasRotation;
bool canvasMirroredH;
- QScopedPointer<qreal> drawingAngleOverride;
+ boost::optional<qreal> drawingAngleOverride;
KisDistanceInformation *currentDistanceInfo;
int levelOfDetail;
void registerDistanceInfo(KisDistanceInformation *di) {
currentDistanceInfo = di;
}
void unregisterDistanceInfo() {
currentDistanceInfo = 0;
}
};
KisPaintInformation::DistanceInformationRegistrar::
DistanceInformationRegistrar(KisPaintInformation *_p, KisDistanceInformation *distanceInfo)
: p(_p)
{
p->d->registerDistanceInfo(distanceInfo);
}
KisPaintInformation::DistanceInformationRegistrar::
~DistanceInformationRegistrar()
{
p->d->unregisterDistanceInfo();
}
KisPaintInformation::KisPaintInformation(const QPointF & pos,
qreal pressure,
qreal xTilt, qreal yTilt,
qreal rotation,
qreal tangentialPressure,
qreal perspective,
qreal time,
qreal speed)
: d(new Private(pos,
pressure,
xTilt, yTilt,
rotation,
tangentialPressure,
perspective,
time,
speed,
false))
{
}
KisPaintInformation::KisPaintInformation(const QPointF & pos,
qreal pressure,
qreal xTilt,
qreal yTilt,
qreal rotation)
: d(new Private(pos,
pressure,
xTilt, yTilt,
rotation,
0.0,
1.0,
0.0,
0.0,
false))
{
}
KisPaintInformation::KisPaintInformation(const QPointF &pos,
qreal pressure)
: d(new Private(pos,
pressure,
0.0, 0.0,
0.0,
0.0,
1.0,
0.0,
0.0,
false))
{
}
KisPaintInformation::KisPaintInformation(const KisPaintInformation& rhs)
: d(new Private(*rhs.d))
{
}
void KisPaintInformation::operator=(const KisPaintInformation & rhs)
{
*d = *rhs.d;
}
KisPaintInformation::~KisPaintInformation()
{
delete d;
}
bool KisPaintInformation::isHoveringMode() const
{
return d->isHoveringMode;
}
KisPaintInformation
KisPaintInformation::createHoveringModeInfo(const QPointF &pos,
qreal pressure,
qreal xTilt, qreal yTilt,
qreal rotation,
qreal tangentialPressure,
qreal perspective,
qreal speed,
int canvasrotation,
bool canvasMirroredH)
{
KisPaintInformation info(pos,
pressure,
xTilt, yTilt,
rotation,
tangentialPressure,
perspective, 0, speed);
info.d->isHoveringMode = true;
info.d->canvasRotation = canvasrotation;
info.d->canvasMirroredH = canvasMirroredH;
return info;
}
int KisPaintInformation::canvasRotation() const
{
return d->canvasRotation;
}
void KisPaintInformation::setCanvasRotation(int rotation)
{
if (rotation < 0) {
d->canvasRotation= 360- abs(rotation % 360);
} else {
d->canvasRotation= rotation % 360;
}
}
bool KisPaintInformation::canvasMirroredH() const
{
return d->canvasMirroredH;
}
void KisPaintInformation::setCanvasHorizontalMirrorState(bool mir)
{
d->canvasMirroredH = mir;
}
void KisPaintInformation::toXML(QDomDocument&, QDomElement& e) const
{
// hovering mode infos are not supposed to be saved
KIS_ASSERT_RECOVER_NOOP(!d->isHoveringMode);
e.setAttribute("pointX", QString::number(pos().x(), 'g', 15));
e.setAttribute("pointY", QString::number(pos().y(), 'g', 15));
e.setAttribute("pressure", QString::number(pressure(), 'g', 15));
e.setAttribute("xTilt", QString::number(xTilt(), 'g', 15));
e.setAttribute("yTilt", QString::number(yTilt(), 'g', 15));
e.setAttribute("rotation", QString::number(rotation(), 'g', 15));
e.setAttribute("tangentialPressure", QString::number(tangentialPressure(), 'g', 15));
e.setAttribute("perspective", QString::number(perspective(), 'g', 15));
e.setAttribute("time", QString::number(d->time, 'g', 15));
e.setAttribute("speed", QString::number(d->speed, 'g', 15));
}
KisPaintInformation KisPaintInformation::fromXML(const QDomElement& e)
{
qreal pointX = qreal(KisDomUtils::toDouble(e.attribute("pointX", "0.0")));
qreal pointY = qreal(KisDomUtils::toDouble(e.attribute("pointY", "0.0")));
qreal pressure = qreal(KisDomUtils::toDouble(e.attribute("pressure", "0.0")));
qreal rotation = qreal(KisDomUtils::toDouble(e.attribute("rotation", "0.0")));
qreal tangentialPressure = qreal(KisDomUtils::toDouble(e.attribute("tangentialPressure", "0.0")));
qreal perspective = qreal(KisDomUtils::toDouble(e.attribute("perspective", "0.0")));
qreal xTilt = qreal(KisDomUtils::toDouble(e.attribute("xTilt", "0.0")));
qreal yTilt = qreal(KisDomUtils::toDouble(e.attribute("yTilt", "0.0")));
qreal time = KisDomUtils::toDouble(e.attribute("time", "0"));
qreal speed = KisDomUtils::toDouble(e.attribute("speed", "0"));
return KisPaintInformation(QPointF(pointX, pointY), pressure, xTilt, yTilt,
rotation, tangentialPressure, perspective, time, speed);
}
const QPointF& KisPaintInformation::pos() const
{
return d->pos;
}
void KisPaintInformation::setPos(const QPointF& p)
{
d->pos = p;
}
qreal KisPaintInformation::pressure() const
{
return d->pressure;
}
void KisPaintInformation::setPressure(qreal p)
{
d->pressure = p;
}
qreal KisPaintInformation::xTilt() const
{
return d->xTilt;
}
qreal KisPaintInformation::yTilt() const
{
return d->yTilt;
}
void KisPaintInformation::overrideDrawingAngle(qreal angle)
{
- d->drawingAngleOverride.reset(new qreal(angle));
+ d->drawingAngleOverride = angle;
}
qreal KisPaintInformation::drawingAngleSafe(const KisDistanceInformation &distance) const
{
if (d->drawingAngleOverride) return *d->drawingAngleOverride;
if (!distance.hasLastDabInformation()) {
warnKrita << "KisPaintInformation::drawingAngleSafe()" << "Cannot access Distance Info last dab data";
return 0.0;
}
return distance.nextDrawingAngle(pos());
}
KisPaintInformation::DistanceInformationRegistrar
KisPaintInformation::registerDistanceInformation(KisDistanceInformation *distance)
{
return DistanceInformationRegistrar(this, distance);
}
qreal KisPaintInformation::drawingAngle() const
{
if (d->drawingAngleOverride) return *d->drawingAngleOverride;
if (!d->currentDistanceInfo || !d->currentDistanceInfo->hasLastDabInformation()) {
warnKrita << "KisPaintInformation::drawingAngle()" << "Cannot access Distance Info last dab data";
return 0.0;
}
return d->currentDistanceInfo->nextDrawingAngle(pos());
}
void KisPaintInformation::lockCurrentDrawingAngle(qreal alpha_unused) const
{
Q_UNUSED(alpha_unused);
if (!d->currentDistanceInfo || !d->currentDistanceInfo->hasLastDabInformation()) {
warnKrita << "KisPaintInformation::lockCurrentDrawingAngle()" << "Cannot access Distance Info last dab data";
return;
}
qreal angle = d->currentDistanceInfo->nextDrawingAngle(pos(), false);
qreal newAngle = angle;
if (d->currentDistanceInfo->hasLockedDrawingAngle()) {
const qreal stabilizingCoeff = 20.0;
const qreal dist = stabilizingCoeff * d->currentDistanceInfo->currentSpacing().scalarApprox();
const qreal alpha = qMax(0.0, dist - d->currentDistanceInfo->scalarDistanceApprox()) / dist;
const qreal oldAngle = d->currentDistanceInfo->lockedDrawingAngle();
if (shortestAngularDistance(oldAngle, newAngle) < M_PI / 6) {
newAngle = (1.0 - alpha) * oldAngle + alpha * newAngle;
} else {
newAngle = oldAngle;
}
}
d->currentDistanceInfo->setLockedDrawingAngle(newAngle);
}
QPointF KisPaintInformation::drawingDirectionVector() const
{
if (d->drawingAngleOverride) {
qreal angle = *d->drawingAngleOverride;
return QPointF(cos(angle), sin(angle));
}
if (!d->currentDistanceInfo || !d->currentDistanceInfo->hasLastDabInformation()) {
warnKrita << "KisPaintInformation::drawingDirectionVector()" << "Cannot access Distance Info last dab data";
return QPointF(1.0, 0.0);
}
return d->currentDistanceInfo->nextDrawingDirectionVector(pos());
}
qreal KisPaintInformation::drawingDistance() const
{
if (!d->currentDistanceInfo || !d->currentDistanceInfo->hasLastDabInformation()) {
warnKrita << "KisPaintInformation::drawingDistance()" << "Cannot access Distance Info last dab data";
return 1.0;
}
QVector2D diff(pos() - d->currentDistanceInfo->lastPosition());
qreal length = diff.length();
if (d->levelOfDetail) {
length *= KisLodTransform::lodToInvScale(d->levelOfDetail);
}
return length;
}
qreal KisPaintInformation::drawingSpeed() const
{
return d->speed;
}
qreal KisPaintInformation::rotation() const
{
return d->rotation;
}
qreal KisPaintInformation::tangentialPressure() const
{
return d->tangentialPressure;
}
qreal KisPaintInformation::perspective() const
{
return d->perspective;
}
qreal KisPaintInformation::currentTime() const
{
return d->time;
}
KisRandomSourceSP KisPaintInformation::randomSource() const
{
if (!d->randomSource) {
d->randomSource = new KisRandomSource();
}
return d->randomSource;
}
void KisPaintInformation::setRandomSource(KisRandomSourceSP value)
{
d->randomSource = value;
}
void KisPaintInformation::setLevelOfDetail(int levelOfDetail)
{
d->levelOfDetail = levelOfDetail;
}
QDebug operator<<(QDebug dbg, const KisPaintInformation &info)
{
#ifdef NDEBUG
Q_UNUSED(info);
#else
dbg.nospace() << "Position: " << info.pos();
dbg.nospace() << ", Pressure: " << info.pressure();
dbg.nospace() << ", X Tilt: " << info.xTilt();
dbg.nospace() << ", Y Tilt: " << info.yTilt();
dbg.nospace() << ", Rotation: " << info.rotation();
dbg.nospace() << ", Tangential Pressure: " << info.tangentialPressure();
dbg.nospace() << ", Perspective: " << info.perspective();
dbg.nospace() << ", Drawing Angle: " << info.drawingAngle();
dbg.nospace() << ", Drawing Speed: " << info.drawingSpeed();
dbg.nospace() << ", Drawing Distance: " << info.drawingDistance();
dbg.nospace() << ", Time: " << info.currentTime();
#endif
return dbg.space();
}
KisPaintInformation KisPaintInformation::mixOnlyPosition(qreal t, const KisPaintInformation& mixedPi, const KisPaintInformation& basePi)
{
QPointF pt = (1 - t) * mixedPi.pos() + t * basePi.pos();
return mixImpl(pt, t, mixedPi, basePi, true, false);
}
KisPaintInformation KisPaintInformation::mix(qreal t, const KisPaintInformation& pi1, const KisPaintInformation& pi2)
{
QPointF pt = (1 - t) * pi1.pos() + t * pi2.pos();
return mix(pt, t, pi1, pi2);
}
KisPaintInformation KisPaintInformation::mix(const QPointF& p, qreal t, const KisPaintInformation& pi1, const KisPaintInformation& pi2)
{
return mixImpl(p, t, pi1, pi2, false, true);
}
KisPaintInformation KisPaintInformation::mixWithoutTime(qreal t, const KisPaintInformation& pi1, const KisPaintInformation& pi2)
{
QPointF pt = (1 - t) * pi1.pos() + t * pi2.pos();
return mixWithoutTime(pt, t, pi1, pi2);
}
KisPaintInformation KisPaintInformation::mixWithoutTime(const QPointF& p, qreal t, const KisPaintInformation& pi1, const KisPaintInformation& pi2)
{
return mixImpl(p, t, pi1, pi2, false, false);
}
+void KisPaintInformation::mixOtherOnlyPosition(qreal t, const KisPaintInformation& other)
+{
+ QPointF pt = (1 - t) * other.pos() + t * this->pos();
+ this->mixOtherImpl(pt, t, other, true, false);
+}
+
+void KisPaintInformation::mixOtherWithoutTime(qreal t, const KisPaintInformation& other)
+{
+ QPointF pt = (1 - t) * other.pos() + t * this->pos();
+ this->mixOtherImpl(pt, t, other, false, false);
+}
+
KisPaintInformation KisPaintInformation::mixImpl(const QPointF &p, qreal t, const KisPaintInformation &pi1, const KisPaintInformation &pi2, bool posOnly, bool mixTime)
+{
+ KisPaintInformation result(pi2);
+ result.mixOtherImpl(p, t, pi1, posOnly, mixTime);
+ return result;
+}
+
+void KisPaintInformation::mixOtherImpl(const QPointF &p, qreal t, const KisPaintInformation &other, bool posOnly, bool mixTime)
{
if (posOnly) {
- KisPaintInformation result(p,
- pi2.pressure(),
- pi2.xTilt(),
- pi2.yTilt(),
- pi2.rotation(),
- pi2.tangentialPressure(),
- pi2.perspective(),
- pi2.currentTime(),
- pi2.drawingSpeed());
- result.setRandomSource(pi2.randomSource());
- return result;
+ this->d->pos = p;
+ this->d->isHoveringMode = false;
+ this->d->currentDistanceInfo = 0;
+ this->d->levelOfDetail = 0;
+ return;
}
else {
- qreal pressure = (1 - t) * pi1.pressure() + t * pi2.pressure();
- qreal xTilt = (1 - t) * pi1.xTilt() + t * pi2.xTilt();
- qreal yTilt = (1 - t) * pi1.yTilt() + t * pi2.yTilt();
+ qreal pressure = (1 - t) * other.pressure() + t * this->pressure();
+ qreal xTilt = (1 - t) * other.xTilt() + t * this->xTilt();
+ qreal yTilt = (1 - t) * other.yTilt() + t * this->yTilt();
- qreal rotation = pi1.rotation();
+ qreal rotation = other.rotation();
- if (pi1.rotation() != pi2.rotation()) {
- qreal a1 = kisDegreesToRadians(pi1.rotation());
- qreal a2 = kisDegreesToRadians(pi2.rotation());
+ if (other.rotation() != this->rotation()) {
+ qreal a1 = kisDegreesToRadians(other.rotation());
+ qreal a2 = kisDegreesToRadians(this->rotation());
qreal distance = shortestAngularDistance(a2, a1);
rotation = kisRadiansToDegrees(incrementInDirection(a1, t * distance, a2));
}
- qreal tangentialPressure = (1 - t) * pi1.tangentialPressure() + t * pi2.tangentialPressure();
- qreal perspective = (1 - t) * pi1.perspective() + t * pi2.perspective();
- qreal time = mixTime ? ((1 - t) * pi1.currentTime() + t * pi2.currentTime()) : pi2.currentTime();
- qreal speed = (1 - t) * pi1.drawingSpeed() + t * pi2.drawingSpeed();
-
- KisPaintInformation result(p, pressure, xTilt, yTilt, rotation, tangentialPressure, perspective, time, speed);
- KIS_ASSERT_RECOVER_NOOP(pi1.isHoveringMode() == pi2.isHoveringMode());
- result.d->isHoveringMode = pi1.isHoveringMode();
- result.d->levelOfDetail = pi1.d->levelOfDetail;
- result.d->randomSource = pi1.d->randomSource;
- result.d->canvasRotation = pi2.canvasRotation();
- result.d->canvasMirroredH = pi2.canvasMirroredH();
-
- return result;
+ qreal tangentialPressure = (1 - t) * other.tangentialPressure() + t * this->tangentialPressure();
+ qreal perspective = (1 - t) * other.perspective() + t * this->perspective();
+ qreal time = mixTime ? ((1 - t) * other.currentTime() + t * this->currentTime()) : this->currentTime();
+ qreal speed = (1 - t) * other.drawingSpeed() + t * this->drawingSpeed();
+
+ KIS_ASSERT_RECOVER_NOOP(other.isHoveringMode() == this->isHoveringMode());
+ *(this->d) = Private(p, pressure, xTilt, yTilt, rotation, tangentialPressure, perspective, time, speed, other.isHoveringMode());
+ this->d->randomSource = other.d->randomSource;
+ // this->d->isHoveringMode = other.isHoveringMode();
+ this->d->currentDistanceInfo = 0;
+ this->d->levelOfDetail = other.d->levelOfDetail;
}
}
qreal KisPaintInformation::tiltDirection(const KisPaintInformation& info, bool normalize)
{
qreal xTilt = info.xTilt();
qreal yTilt = info.yTilt();
// radians -PI, PI
qreal tiltDirection = atan2(-xTilt, yTilt);
// if normalize is true map to 0.0..1.0
return normalize ? (tiltDirection / (2 * M_PI) + 0.5) : tiltDirection;
}
qreal KisPaintInformation::tiltElevation(const KisPaintInformation& info, qreal maxTiltX, qreal maxTiltY, bool normalize)
{
qreal xTilt = qBound(qreal(-1.0), info.xTilt() / maxTiltX , qreal(1.0));
qreal yTilt = qBound(qreal(-1.0), info.yTilt() / maxTiltY , qreal(1.0));
qreal e;
if (fabs(xTilt) > fabs(yTilt)) {
e = sqrt(qreal(1.0) + yTilt * yTilt);
} else {
e = sqrt(qreal(1.0) + xTilt * xTilt);
}
qreal cosAlpha = sqrt(xTilt * xTilt + yTilt * yTilt) / e;
qreal tiltElevation = acos(cosAlpha); // in radians in [0, 0.5 * PI]
// mapping to 0.0..1.0 if normalize is true
return normalize ? (tiltElevation / (M_PI * qreal(0.5))) : tiltElevation;
}
diff --git a/libs/image/brushengine/kis_paint_information.h b/libs/image/brushengine/kis_paint_information.h
index 42e777aef9..7a6ab7a274 100644
--- a/libs/image/brushengine/kis_paint_information.h
+++ b/libs/image/brushengine/kis_paint_information.h
@@ -1,285 +1,295 @@
/*
* Copyright (c) 2004 Cyrille Berger <cberger@cberger.net>
* Copyright (c) 2006 Boudewijn Rempt <boud@valdyas.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef _KIS_PAINT_INFORMATION_
#define _KIS_PAINT_INFORMATION_
#include <kis_debug.h>
#include <QTime>
#include "kis_global.h"
#include "kritaimage_export.h"
#include <kis_distance_information.h>
#include "kis_random_source.h"
#include "kis_spacing_information.h"
#include "kis_timing_information.h"
class QDomDocument;
class QDomElement;
class KisDistanceInformation;
/**
* KisPaintInformation contains information about the input event that
* causes the brush action to happen to the brush engine's paint
* methods.
*
* XXX: we directly pass the KoPointerEvent x and y tilt to
* KisPaintInformation, and their range is -60 to +60!
*
* @param pos: the position of the paint event in subpixel accuracy
* @param pressure: the pressure of the stylus
* @param xTilt: the angle between the device (a pen, for example) and
* the perpendicular in the direction of the x axis. Positive values
* are towards the bottom of the tablet. The angle is within the range
* 0 to 1
* @param yTilt: the angle between the device (a pen, for example) and
* the perpendicular in the direction of the y axis. Positive values
* are towards the bottom of the tablet. The angle is within the range
* 0 to .
* @param movement: current position minus the last position of the call to paintAt
* @param rotation
* @param tangentialPressure
* @param perspective
**/
class KRITAIMAGE_EXPORT KisPaintInformation
{
public:
/**
* Note, that this class is relied on the compiler optimization
* of the return value. So if it doesn't work for some reason,
* please implement a proper copy c-tor
*/
class KRITAIMAGE_EXPORT DistanceInformationRegistrar
{
public:
DistanceInformationRegistrar(KisPaintInformation *_p, KisDistanceInformation *distanceInfo);
~DistanceInformationRegistrar();
private:
KisPaintInformation *p;
};
public:
/**
* Create a new KisPaintInformation object.
*/
KisPaintInformation(const QPointF & pos,
qreal pressure,
qreal xTilt,
qreal yTilt,
qreal rotation,
qreal tangentialPressure,
qreal perspective,
qreal time,
qreal speed);
KisPaintInformation(const QPointF & pos,
qreal pressure,
qreal xTilt,
qreal yTilt,
qreal rotation);
KisPaintInformation(const QPointF & pos = QPointF(),
qreal pressure = PRESSURE_DEFAULT);
KisPaintInformation(const KisPaintInformation& rhs);
void operator=(const KisPaintInformation& rhs);
~KisPaintInformation();
template <class PaintOp>
void paintAt(PaintOp &op, KisDistanceInformation *distanceInfo) {
KisSpacingInformation spacingInfo;
KisTimingInformation timingInfo;
{
DistanceInformationRegistrar r = registerDistanceInformation(distanceInfo);
spacingInfo = op.paintAt(*this);
timingInfo = op.updateTimingImpl(*this);
}
distanceInfo->registerPaintedDab(*this, spacingInfo, timingInfo);
}
const QPointF& pos() const;
void setPos(const QPointF& p);
/// The pressure of the value (from 0.0 to 1.0)
qreal pressure() const;
/// Set the pressure
void setPressure(qreal p);
/// The tilt of the pen on the horizontal axis (from 0.0 to 1.0)
qreal xTilt() const;
/// The tilt of the pen on the vertical axis (from 0.0 to 1.0)
qreal yTilt() const;
/// XXX !!! :-| Please add dox!
void overrideDrawingAngle(qreal angle);
/// XXX !!! :-| Please add dox!
qreal drawingAngleSafe(const KisDistanceInformation &distance) const;
/**
* Causes the specified distance information to be temporarily registered with this
* KisPaintInformation object, so that the KisPaintInformation can compute certain values that
* may be needed at painting time, such as the drawing direction. When the returned object is
* destroyed, the KisDistanceInformation will be unregistered. At most one
* KisDistanceInformation can be registered with a given KisPaintInformation at a time.
*/
DistanceInformationRegistrar registerDistanceInformation(KisDistanceInformation *distance);
/**
* Current brush direction computed from the cursor movement
*
* WARNING: this method is available *only* inside paintAt() call,
* that is when the distance information is registered.
*/
qreal drawingAngle() const;
/**
* Lock current drawing angle for the rest of the stroke. If some
* value has already been locked, \p alpha shown the coefficient
* with which the new velue should be blended in.
*/
void lockCurrentDrawingAngle(qreal alpha) const;
/**
* Current brush direction vector computed from the cursor movement
*
* WARNING: this method is available *only* inside paintAt() call,
* that is when the distance information is registered.
*/
QPointF drawingDirectionVector() const;
/**
* Current brush speed computed from the cursor movement
*
* WARNING: this method is available *only* inside paintAt() call,
* that is when the distance information is registered.
*/
qreal drawingSpeed() const;
/**
* Current distance from the previous dab
*
* WARNING: this method is available *only* inside paintAt() call,
* that is when the distance information is registered.
*/
qreal drawingDistance() const;
/// rotation as given by the tablet event
qreal rotation() const;
/// tangential pressure (i.e., rate for an airbrush device)
qreal tangentialPressure() const;
/// reciprocal of distance on the perspective grid
qreal perspective() const;
/// Number of ms since the beginning of the stroke
qreal currentTime() const;
// random source for generating in-stroke effects
KisRandomSourceSP randomSource() const;
// the stroke should initialize random source of all the used
// paint info objects, otherwise it shows a warning
void setRandomSource(KisRandomSourceSP value);
// set level of detail which info object has been generated for
void setLevelOfDetail(int levelOfDetail);
/**
* The paint information may be generated not only during real
* stroke when the actual painting is happening, but also when the
* cursor is hovering the canvas. In this mode some of the sensors
* work a bit differently. The most outstanding example is Fuzzy
* sensor, which returns unit value in this mode, otherwise it is
* too irritating for a user.
*
* This value is true only for paint information objects created with
* createHoveringModeInfo() constructor.
*
* \see createHoveringModeInfo()
*/
bool isHoveringMode() const;
/**
* Create a fake info object with isHoveringMode() property set to
* true.
*
* \see isHoveringMode()
*/
static KisPaintInformation createHoveringModeInfo(const QPointF &pos,
qreal pressure = PRESSURE_DEFAULT,
qreal xTilt = 0.0, qreal yTilt = 0.0,
qreal rotation = 0.0,
qreal tangentialPressure = 0.0,
qreal perspective = 1.0,
qreal speed = 0.0,
int canvasrotation = 0,
bool canvasMirroredH = false);
/**
*Returns the canvas rotation if that has been given to the kispaintinformation.
*/
int canvasRotation() const;
/**
*set the canvas rotation.
*/
void setCanvasRotation(int rotation);
/*
*Whether the canvas is mirrored for the paint-operation.
*/
bool canvasMirroredH() const;
/*
*Set whether the canvas is mirrored for the paint-operation.
*/
void setCanvasHorizontalMirrorState(bool mir);
void toXML(QDomDocument&, QDomElement&) const;
static KisPaintInformation fromXML(const QDomElement&);
+ // TODO: Refactor the static mix functions to non-static in-place mutation
+ // versions like mixOtherOnlyPosition and mixOtherWithoutTime.
+ // Heap allocation on Windows is awfully slow and will fragment the memory
+ // badly. Since KisPaintInformation allocates on the heap, we should re-use
+ // existing instance whenever possible, especially in loops.
+ // Ref: https://phabricator.kde.org/D6578
+
/// (1-t) * p1 + t * p2
static KisPaintInformation mixOnlyPosition(qreal t, const KisPaintInformation& mixedPi, const KisPaintInformation& basePi);
static KisPaintInformation mix(const QPointF& p, qreal t, const KisPaintInformation& p1, const KisPaintInformation& p2);
static KisPaintInformation mix(qreal t, const KisPaintInformation& pi1, const KisPaintInformation& pi2);
static KisPaintInformation mixWithoutTime(const QPointF &p, qreal t, const KisPaintInformation &p1, const KisPaintInformation &p2);
static KisPaintInformation mixWithoutTime(qreal t, const KisPaintInformation &pi1, const KisPaintInformation &pi2);
+ void mixOtherOnlyPosition(qreal t, const KisPaintInformation& other);
+ void mixOtherWithoutTime(qreal t, const KisPaintInformation& other);
static qreal tiltDirection(const KisPaintInformation& info, bool normalize = true);
static qreal tiltElevation(const KisPaintInformation& info, qreal maxTiltX = 60.0, qreal maxTiltY = 60.0, bool normalize = true);
private:
static KisPaintInformation mixImpl(const QPointF &p, qreal t, const KisPaintInformation &p1, const KisPaintInformation &p2, bool posOnly, bool mixTime);
+ void mixOtherImpl(const QPointF &p, qreal t, const KisPaintInformation &other, bool posOnly, bool mixTime);
private:
struct Private;
Private* const d;
};
KRITAIMAGE_EXPORT QDebug operator<<(QDebug debug, const KisPaintInformation& info);
#endif
diff --git a/libs/koplugin/KisMimeDatabase.cpp b/libs/koplugin/KisMimeDatabase.cpp
index 20104124d7..3c4407b074 100644
--- a/libs/koplugin/KisMimeDatabase.cpp
+++ b/libs/koplugin/KisMimeDatabase.cpp
@@ -1,273 +1,278 @@
/*
* Copyright (c) 2016 Boudewijn Rempt <boud@valdyas.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "KisMimeDatabase.h"
#include <QMimeDatabase>
#include <QMimeType>
#include <QFileInfo>
#include <KritaPluginDebug.h>
#include <klocalizedstring.h>
QList<KisMimeDatabase::KisMimeType> KisMimeDatabase::s_mimeDatabase;
QString KisMimeDatabase::mimeTypeForFile(const QString &file)
{
fillMimeData();
QFileInfo fi(file);
QString suffix = fi.suffix().toLower();
Q_FOREACH(const KisMimeDatabase::KisMimeType &mimeType, s_mimeDatabase) {
if (mimeType.suffixes.contains("*." + suffix)) {
debugPlugin << "mimeTypeForFile(). KisMimeDatabase returned" << mimeType.mimeType << "for" << file;
return mimeType.mimeType;
}
}
QMimeDatabase db;
QMimeType mime = db.mimeTypeForFile(file);
if (mime.name() != "application/octet-stream") {
debugPlugin << "mimeTypeForFile(). QMimeDatabase returned" << mime.name() << "for" << file;
return mime.name();
}
return "";
}
QString KisMimeDatabase::mimeTypeForSuffix(const QString &suffix)
{
fillMimeData();
QMimeDatabase db;
QString s = suffix.toLower();
if (!s.startsWith("*.")) {
s = "*." + s;
}
Q_FOREACH(const KisMimeDatabase::KisMimeType &mimeType, s_mimeDatabase) {
if (mimeType.suffixes.contains(s)) {
debugPlugin << "mimeTypeForSuffix(). KisMimeDatabase returned" << mimeType.mimeType << "for" << s;
return mimeType.mimeType;
}
}
QMimeType mime = db.mimeTypeForFile(s);
if (mime.name() != "application/octet-stream") {
debugPlugin << "mimeTypeForSuffix(). QMimeDatabase returned" << mime.name() << "for" << s;
return mime.name();
}
return "";
}
QString KisMimeDatabase::mimeTypeForData(const QByteArray ba)
{
QMimeDatabase db;
QMimeType mtp = db.mimeTypeForData(ba);
debugPlugin << "mimeTypeForData(). QMimeDatabase returned" << mtp.name();
return mtp.name();
}
QString KisMimeDatabase::descriptionForMimeType(const QString &mimeType)
{
fillMimeData();
Q_FOREACH(const KisMimeDatabase::KisMimeType &m, s_mimeDatabase) {
if (m.mimeType == mimeType) {
debugPlugin << "descriptionForMimeType. KisMimeDatabase returned" << m.description << "for" << mimeType;
return m.description;
}
}
QMimeDatabase db;
QMimeType mime = db.mimeTypeForName(mimeType);
if (mime.name() != "application/octet-stream") {
debugPlugin << "descriptionForMimeType. QMimeDatabase returned" << mime.comment() << "for" << mimeType;
return mime.comment();
}
return mimeType;
}
QStringList KisMimeDatabase::suffixesForMimeType(const QString &mimeType)
{
fillMimeData();
Q_FOREACH(const KisMimeDatabase::KisMimeType &m, s_mimeDatabase) {
if (m.mimeType == mimeType) {
debugPlugin << "suffixesForMimeType. KisMimeDatabase returned" << m.suffixes;
return m.suffixes;
}
}
QMimeDatabase db;
QMimeType mime = db.mimeTypeForName(mimeType);
if (mime.name() != "application/octet-stream" && !mime.suffixes().isEmpty()) {
QString preferredSuffix = mime.preferredSuffix();
if (mimeType == "image/x-tga") {
preferredSuffix = "tga";
}
if (mimeType == "image/jpeg") {
preferredSuffix = "jpg";
}
QStringList suffixes = mime.suffixes();
if (preferredSuffix != suffixes.first()) {
suffixes.removeAll(preferredSuffix);
suffixes.prepend(preferredSuffix);
}
debugPlugin << "suffixesForMimeType. QMimeDatabase returned" << suffixes;
return suffixes;
}
return QStringList();
}
QString KisMimeDatabase::iconNameForMimeType(const QString &mimeType)
{
QMimeDatabase db;
QMimeType mime = db.mimeTypeForName(mimeType);
debugPlugin << "iconNameForMimeType" << mime.iconName();
return mime.iconName();
}
void KisMimeDatabase::fillMimeData()
{
// This should come from the import/export plugins, but the json files aren't translated,
// which is bad for the description field
if (s_mimeDatabase.isEmpty()) {
KisMimeType mimeType;
mimeType.mimeType = "image/x-gimp-brush";
mimeType.description = i18nc("description of a file type", "Gimp Brush");
mimeType.suffixes = QStringList() << "*.gbr" << "*.vbr";
s_mimeDatabase << mimeType;
mimeType.mimeType = "image/x-gimp-brush-animated";
mimeType.description = i18nc("description of a file type", "Gimp Image Hose Brush");
mimeType.suffixes = QStringList() << "*.gih";
s_mimeDatabase << mimeType;
mimeType.mimeType = "image/x-adobe-brushlibrary";
mimeType.description = i18nc("description of a file type", "Adobe Brush Library");
mimeType.suffixes = QStringList() << "*.abr";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-krita-paintoppreset";
mimeType.description = i18nc("description of a file type", "Krita Brush Preset");
mimeType.suffixes = QStringList() << "*.kpp";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-krita-assistant";
mimeType.description = i18nc("description of a file type", "Krita Assistant");
mimeType.suffixes = QStringList() << "*.paintingassistant";
s_mimeDatabase << mimeType;
+ mimeType.mimeType = "image/x-r32";
+ mimeType.description = i18nc("description of a file type", "R32 Heightmap");
+ mimeType.suffixes = QStringList() << "*.r32";
+ s_mimeDatabase << mimeType;
+
mimeType.mimeType = "image/x-r16";
mimeType.description = i18nc("description of a file type", "R16 Heightmap");
mimeType.suffixes = QStringList() << "*.r16";
s_mimeDatabase << mimeType;
mimeType.mimeType = "image/x-r8";
mimeType.description = i18nc("description of a file type", "R8 Heightmap");
mimeType.suffixes = QStringList() << "*.r8";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-spriter";
mimeType.description = i18nc("description of a file type", "Spriter SCML");
mimeType.suffixes = QStringList() << "*.scml";
s_mimeDatabase << mimeType;
mimeType.mimeType = "image/x-svm";
mimeType.description = i18nc("description of a file type", "Starview Metafile");
mimeType.suffixes = QStringList() << "*.svm";
s_mimeDatabase << mimeType;
mimeType.mimeType = "image/openraster";
mimeType.description = i18nc("description of a file type", "OpenRaster Image");
mimeType.suffixes = QStringList() << "*.ora";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-photoshop-style-library";
mimeType.description = i18nc("description of a file type", "Photoshop Layer Style Library");
mimeType.suffixes = QStringList() << "*.asl";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-gimp-color-palette";
mimeType.description = i18nc("description of a file type", "Color Palette");
mimeType.suffixes = QStringList() << "*.gpl" << "*.pal" << "*.act" << "*.aco" << "*.colors" << "*.xml" << "*.sbz";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-opencolorio-configuration";
mimeType.description = i18nc("description of a file type", "OpenColorIO Configuration");
mimeType.suffixes = QStringList() << "*.ocio";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-krita-recorded-macro";
mimeType.description = i18nc("description of a file type", "Krita Recorded Action");
mimeType.suffixes = QStringList() << "*.krarec";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-gimp-gradient";
mimeType.description = i18nc("description of a file type", "GIMP Gradients");
mimeType.suffixes = QStringList() << "*.ggr";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-gimp-pattern";
mimeType.description = i18nc("description of a file type", "GIMP Patterns");
mimeType.suffixes = QStringList() << "*.pat";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-karbon-gradient";
mimeType.description = i18nc("description of a file type", "Karbon Gradients");
mimeType.suffixes = QStringList() << "*.kgr";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-krita-bundle";
mimeType.description = i18nc("description of a file type", "Krita Resource Bundle");
mimeType.suffixes = QStringList() << "*.bundle";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-krita-workspace";
mimeType.description = i18nc("description of a file type", "Krita Workspace");
mimeType.suffixes = QStringList() << "*.kws";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-krita-taskset";
mimeType.description = i18nc("description of a file type", "Krita Taskset");
mimeType.suffixes = QStringList() << "*.kts";
s_mimeDatabase << mimeType;
mimeType.mimeType = "image/x-krita-raw";
mimeType.description = i18nc("description of a file type", "Camera Raw Files");
mimeType.suffixes = QStringList() << "*.nef" << "*.cr2" << "*.sr2" << "*.crw" << "*.pef" << "*.x3f" << "*.kdc" << "*.mrw" << "*.arw" << "*.k25" << "*.dcr" << "*.orf" << "*.raw" << "*.raw" << "*.raf" << "*.srf" << "*.dng";
s_mimeDatabase << mimeType;
mimeType.mimeType = "application/x-extension-exr";
mimeType.description = i18nc("description of a file type", "OpenEXR (Extended)");
mimeType.suffixes = QStringList() << "*.exr";
s_mimeDatabase << mimeType;
mimeType.mimeType = "image/x-psb";
mimeType.description = i18nc("description of a file type", "Photoshop Image (Large)");
mimeType.suffixes = QStringList() << "*.psb";
s_mimeDatabase << mimeType;
debugPlugin << "Filled mimedatabase with" << s_mimeDatabase.count() << "special mimetypes";
}
}
diff --git a/libs/libkis/ManagedColor.cpp b/libs/libkis/ManagedColor.cpp
index ae4de80657..fb3b7abac1 100644
--- a/libs/libkis/ManagedColor.cpp
+++ b/libs/libkis/ManagedColor.cpp
@@ -1,164 +1,176 @@
/*
* Copyright (C) 2017 Boudewijn Rempt <boud@valdyas.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "ManagedColor.h"
#include <KoColor.h>
#include <KoColorSpaceRegistry.h>
#include <KoColorProfile.h>
#include <KoColorModelStandardIds.h>
+#include <KoChannelInfo.h>
#include <QDomDocument>
#include <QDomElement>
#include <Canvas.h>
#include <kis_display_color_converter.h>
#include <KoColorDisplayRendererInterface.h>
struct ManagedColor::Private {
KoColor color;
};
ManagedColor::ManagedColor(QObject *parent)
: QObject(parent)
, d(new Private())
{
// Default black rgb color
}
ManagedColor::ManagedColor(const QString &colorModel, const QString &colorDepth, const QString &colorProfile, QObject *parent)
: QObject(parent)
, d(new Private())
{
const KoColorSpace *colorSpace = KoColorSpaceRegistry::instance()->colorSpace(colorModel, colorDepth, colorProfile);
if (colorSpace) {
d->color = KoColor(colorSpace);
}
}
ManagedColor::ManagedColor(KoColor color, QObject *parent)
: QObject(parent)
, d(new Private())
{
d->color = color;
}
ManagedColor::~ManagedColor()
{
}
bool ManagedColor::operator==(const ManagedColor &other) const
{
return d->color == other.d->color;
}
QColor ManagedColor::colorForCanvas(Canvas *canvas) const
{
QColor c = QColor(0,0,0);
if (canvas && canvas->displayColorConverter() && canvas->displayColorConverter()->displayRendererInterface()) {
KoColorDisplayRendererInterface *converter = canvas->displayColorConverter()->displayRendererInterface();
if (converter) {
c = converter->toQColor(d->color);
} else {
c = KoDumbColorDisplayRenderer::instance()->toQColor(d->color);
}
} else {
c = KoDumbColorDisplayRenderer::instance()->toQColor(d->color);
}
return c;
}
QString ManagedColor::colorDepth() const
{
return d->color.colorSpace()->colorDepthId().id();
}
QString ManagedColor::colorModel() const
{
return d->color.colorSpace()->colorModelId().id();
}
QString ManagedColor::colorProfile() const
{
return d->color.colorSpace()->profile()->name();
}
bool ManagedColor::setColorProfile(const QString &colorProfile)
{
const KoColorProfile *profile = KoColorSpaceRegistry::instance()->profileByName(colorProfile);
if (!profile) return false;
d->color.setProfile(profile);
return true;
}
bool ManagedColor::setColorSpace(const QString &colorModel, const QString &colorDepth, const QString &colorProfile)
{
const KoColorSpace *colorSpace = KoColorSpaceRegistry::instance()->colorSpace(colorModel, colorDepth, colorProfile);
if (!colorSpace) return false;
d->color.convertTo(colorSpace);
return true;
}
QVector<float> ManagedColor::components() const
{
QVector<float> values(d->color.colorSpace()->channelCount());
d->color.colorSpace()->normalisedChannelsValue(d->color.data(), values);
return values;
}
+QVector<float> ManagedColor::componentsOrdered() const
+{
+ QVector<float> valuesUnsorted = components();
+ QVector<float> values(d->color.colorSpace()->channelCount());
+ for (int i=0; i<values.size();i++) {
+ int location = KoChannelInfo::displayPositionToChannelIndex(i, d->color.colorSpace()->channels());
+ values[location] = valuesUnsorted[i];
+ }
+ return values;
+}
+
void ManagedColor::setComponents(const QVector<float> &values)
{
d->color.colorSpace()->fromNormalisedChannelsValue(d->color.data(), values);
}
QString ManagedColor::toXML() const
{
QDomDocument doc;
QDomElement root = doc.createElement("Color");
root.setAttribute("bitdepth", colorDepth());
doc.appendChild(root);
d->color.toXML(doc, root);
return doc.toString();
}
void ManagedColor::fromXML(const QString &xml)
{
QDomDocument doc;
doc.setContent(xml);
QDomElement e = doc.documentElement();
QDomElement c = e.firstChildElement("Color");
KoColor kc;
if (!c.isNull()) {
QString colorDepthId = c.attribute("bitdepth", Integer8BitsColorDepthID.id());
d->color = KoColor::fromXML(c, colorDepthId);
}
}
QString ManagedColor::toQString()
{
return KoColor::toQString(d->color);
}
KoColor ManagedColor::color() const
{
return d->color;
}
diff --git a/libs/libkis/ManagedColor.h b/libs/libkis/ManagedColor.h
index cd56ed85f6..52e8c1d830 100644
--- a/libs/libkis/ManagedColor.h
+++ b/libs/libkis/ManagedColor.h
@@ -1,203 +1,209 @@
/*
* Copyright (C) 2017 Boudewijn Rempt <boud@valdyas.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef MANAGEDCOLOR_H
#define MANAGEDCOLOR_H
#include <QObject>
#include <QVector>
#include <QScopedPointer>
#include "kritalibkis_export.h"
#include "libkis.h"
class KoColor;
/**
* @brief The ManagedColor class is a class to handle colors that are color managed.
* A managed color is a color of which we know the model(RGB, LAB, CMYK, etc), the bitdepth and
* the specific properties of its colorspace, such as the whitepoint, chromacities, trc, etc, as represented
* by the color profile.
*
* Krita has two color management systems. LCMS and OCIO.
* LCMS is the one handling the ICC profile stuff, and the major one handling that ManagedColor deals with.
* OCIO support is only in the display of the colors. ManagedColor has some support for it in colorForCanvas()
*
* All colors in Krita are color managed. QColors are understood as RGB-type colors in the sRGB space.
*
* We recommend you make a color like this:
*
* @code
* colorYellow = ManagedColor("RGBA", "U8", "")
* QVector<float> yellowComponents = colorYellow.components()
* yellowComponents[0] = 1.0
* yellowComponents[1] = 1.0
* yellowComponents[2] = 0
* yellowComponents[3] = 1.0
*
* colorYellow.setComponents(yellowComponents)
* QColor yellow = colorYellow.colorForCanvas(canvas)
* @endcode
*/
class KRITALIBKIS_EXPORT ManagedColor : public QObject
{
Q_OBJECT
public:
/**
* @brief ManagedColor
* Create a ManagedColor that is black and transparent.
*/
explicit ManagedColor(QObject *parent = 0);
/**
* @brief ManagedColor create a managed color with the given color space properties.
* @see setColorModel() for more details.
*/
ManagedColor(const QString &colorModel, const QString &colorDepth, const QString &colorProfile, QObject *parent = 0);
ManagedColor(KoColor color, QObject *parent = 0);
~ManagedColor() override;
bool operator==(const ManagedColor &other) const;
/**
* @brief colorForCanvas
* @param canvas the canvas whose color management you'd like to use. In Krita, different views have
* seperate canvasses, and these can have different OCIO configurations active.
* @return the QColor as it would be displaying on the canvas. This result can be used to draw widgets with
* the correct configuration applied.
*/
QColor colorForCanvas(Canvas *canvas) const;
/**
* colorDepth A string describing the color depth of the image:
* <ul>
* <li>U8: unsigned 8 bits integer, the most common type</li>
* <li>U16: unsigned 16 bits integer</li>
* <li>F16: half, 16 bits floating point. Only available if Krita was built with OpenEXR</li>
* <li>F32: 32 bits floating point</li>
* </ul>
* @return the color depth.
*/
QString colorDepth() const;
/**
* @brief colorModel retrieve the current color model of this document:
* <ul>
* <li>A: Alpha mask</li>
* <li>RGBA: RGB with alpha channel (The actual order of channels is most often BGR!)</li>
* <li>XYZA: XYZ with alpha channel</li>
* <li>LABA: LAB with alpha channel</li>
* <li>CMYKA: CMYK with alpha channel</li>
* <li>GRAYA: Gray with alpha channel</li>
* <li>YCbCrA: YCbCr with alpha channel</li>
* </ul>
* @return the internal color model string.
*/
QString colorModel() const;
/**
* @return the name of the current color profile
*/
QString colorProfile() const;
/**
* @brief setColorProfile set the color profile of the image to the given profile. The profile has to
* be registered with krita and be compatible with the current color model and depth; the image data
* is <i>not</i> converted.
* @param colorProfile
* @return false if the colorProfile name does not correspond to to a registered profile or if assigning
* the profile failed.
*/
bool setColorProfile(const QString &colorProfile);
/**
* @brief setColorSpace convert the nodes and the image to the given colorspace. The conversion is
* done with Perceptual as intent, High Quality and No LCMS Optimizations as flags and no blackpoint
* compensation.
*
* @param colorModel A string describing the color model of the image:
* <ul>
* <li>A: Alpha mask</li>
* <li>RGBA: RGB with alpha channel (The actual order of channels is most often BGR!)</li>
* <li>XYZA: XYZ with alpha channel</li>
* <li>LABA: LAB with alpha channel</li>
* <li>CMYKA: CMYK with alpha channel</li>
* <li>GRAYA: Gray with alpha channel</li>
* <li>YCbCrA: YCbCr with alpha channel</li>
* </ul>
* @param colorDepth A string describing the color depth of the image:
* <ul>
* <li>U8: unsigned 8 bits integer, the most common type</li>
* <li>U16: unsigned 16 bits integer</li>
* <li>F16: half, 16 bits floating point. Only available if Krita was built with OpenEXR</li>
* <li>F32: 32 bits floating point</li>
* </ul>
* @param colorProfile a valid color profile for this color model and color depth combination.
* @return false the combination of these arguments does not correspond to a colorspace.
*/
bool setColorSpace(const QString &colorModel, const QString &colorDepth, const QString &colorProfile);
/**
* @brief components
* @return a QVector containing the channel/components of this color normalized. This includes the alphachannel.
*/
QVector<float> components() const;
+ /**
+ * @brief componentsOrdered()
+ * @return same as Components, except the values are ordered to the display.
+ */
+ QVector<float> componentsOrdered() const;
+
/**
* @brief setComponents
* Set the channel/components with normalized values. For integer colorspace, this obviously means the limit
* is between 0.0-1.0, but for floating point colorspaces, 2.4 or 103.5 are still meaningful (if bright) values.
* @param values the QVector containing the new channel/component values. These should be normalized.
*/
void setComponents(const QVector<float> &values);
/**
* Serialize this color following Create's swatch color specification available
* at http://create.freedesktop.org/wiki/index.php/Swatches_-_colour_file_format
*/
QString toXML() const;
/**
* Unserialize a color following Create's swatch color specification available
* at http://create.freedesktop.org/wiki/index.php/Swatches_-_colour_file_format
*
* @param XXX
*
* @return the unserialized color, or an empty color object if the function failed
* to unserialize the color
*/
void fromXML(const QString &xml);
/**
* @brief toQString create a user-visible string of the channel names and the channel values
* @param color the color to create the string from
* @return a string that can be used to display the values of this color to the user.
*/
QString toQString();
private:
friend class View;
KoColor color() const;
struct Private;
const QScopedPointer<Private> d;
};
#endif // MANAGEDCOLOR_H
diff --git a/libs/pigment/resources/KoSegmentGradient.cpp b/libs/pigment/resources/KoSegmentGradient.cpp
index 6dffff5321..8d1cd78a7c 100644
--- a/libs/pigment/resources/KoSegmentGradient.cpp
+++ b/libs/pigment/resources/KoSegmentGradient.cpp
@@ -1,929 +1,978 @@
/*
Copyright (c) 2000 Matthias Elter <elter@kde.org>
2001 John Califf
2004 Boudewijn Rempt <boud@valdyas.org>
2004 Adrian Page <adrian@pagenet.plus.com>
2004, 2007 Sven Langkamp <sven.langkamp@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <resources/KoSegmentGradient.h>
#include <cfloat>
#include <cmath>
#include <QImage>
#include <QTextStream>
#include <QFile>
#include <QByteArray>
+#include <QDomDocument>
+#include <QDomElement>
#include <QBuffer>
#include "KoColorSpaceRegistry.h"
#include "KoColorSpace.h"
#include "KoMixColorsOp.h"
+#include <KoColorModelStandardIds.h>
#include <DebugPigment.h>
#include <klocalizedstring.h>
KoGradientSegment::RGBColorInterpolationStrategy *KoGradientSegment::RGBColorInterpolationStrategy::m_instance = 0;
KoGradientSegment::HSVCWColorInterpolationStrategy *KoGradientSegment::HSVCWColorInterpolationStrategy::m_instance = 0;
KoGradientSegment::HSVCCWColorInterpolationStrategy *KoGradientSegment::HSVCCWColorInterpolationStrategy::m_instance = 0;
KoGradientSegment::LinearInterpolationStrategy *KoGradientSegment::LinearInterpolationStrategy::m_instance = 0;
KoGradientSegment::CurvedInterpolationStrategy *KoGradientSegment::CurvedInterpolationStrategy::m_instance = 0;
KoGradientSegment::SineInterpolationStrategy *KoGradientSegment::SineInterpolationStrategy::m_instance = 0;
KoGradientSegment::SphereIncreasingInterpolationStrategy *KoGradientSegment::SphereIncreasingInterpolationStrategy::m_instance = 0;
KoGradientSegment::SphereDecreasingInterpolationStrategy *KoGradientSegment::SphereDecreasingInterpolationStrategy::m_instance = 0;
KoSegmentGradient::KoSegmentGradient(const QString& file)
: KoAbstractGradient(file)
{
}
KoSegmentGradient::~KoSegmentGradient()
{
for (int i = 0; i < m_segments.count(); i++) {
delete m_segments[i];
m_segments[i] = 0;
}
}
KoSegmentGradient::KoSegmentGradient(const KoSegmentGradient &rhs)
: KoAbstractGradient(rhs)
{
Q_FOREACH (KoGradientSegment *segment, rhs.m_segments) {
pushSegment(new KoGradientSegment(*segment));
}
}
KoAbstractGradient* KoSegmentGradient::clone() const
{
return new KoSegmentGradient(*this);
}
bool KoSegmentGradient::load()
{
QFile file(filename());
if (!file.open(QIODevice::ReadOnly)) {
warnPigment << "Can't open file " << filename();
return false;
}
bool res = loadFromDevice(&file);
file.close();
return res;
}
bool KoSegmentGradient::loadFromDevice(QIODevice *dev)
{
QByteArray data = dev->readAll();
QTextStream fileContent(data, QIODevice::ReadOnly);
fileContent.setAutoDetectUnicode(true);
QString header = fileContent.readLine();
if (header != "GIMP Gradient") {
return false;
}
QString nameDefinition = fileContent.readLine();
QString numSegmentsText;
if (nameDefinition.startsWith("Name: ")) {
QString nameText = nameDefinition.right(nameDefinition.length() - 6);
setName(nameText);
numSegmentsText = fileContent.readLine();
} else {
// Older format without name.
numSegmentsText = nameDefinition;
}
dbgPigment << "Loading gradient: " << name();
int numSegments;
bool ok;
numSegments = numSegmentsText.toInt(&ok);
if (!ok || numSegments < 1) {
return false;
}
dbgPigment << "Number of segments = " << numSegments;
const KoColorSpace* rgbColorSpace = KoColorSpaceRegistry::instance()->rgb8();
for (int i = 0; i < numSegments; i++) {
QString segmentText = fileContent.readLine();
QTextStream segmentFields(&segmentText);
QStringList values = segmentText.split(' ');
qreal leftOffset = values[0].toDouble();
qreal middleOffset = values[1].toDouble();
qreal rightOffset = values[2].toDouble();
qreal leftRed = values[3].toDouble();
qreal leftGreen = values[4].toDouble();
qreal leftBlue = values[5].toDouble();
qreal leftAlpha = values[6].toDouble();
qreal rightRed = values[7].toDouble();
qreal rightGreen = values[8].toDouble();
qreal rightBlue = values[9].toDouble();
qreal rightAlpha = values[10].toDouble();
int interpolationType = values[11].toInt();
int colorInterpolationType = values[12].toInt();
quint8 data[4];
data[2] = static_cast<quint8>(leftRed * 255 + 0.5);
data[1] = static_cast<quint8>(leftGreen * 255 + 0.5);
data[0] = static_cast<quint8>(leftBlue * 255 + 0.5);
data[3] = static_cast<quint8>(leftAlpha * OPACITY_OPAQUE_U8 + 0.5);
KoColor leftColor(data, rgbColorSpace);
data[2] = static_cast<quint8>(rightRed * 255 + 0.5);
data[1] = static_cast<quint8>(rightGreen * 255 + 0.5);
data[0] = static_cast<quint8>(rightBlue * 255 + 0.5);
data[3] = static_cast<quint8>(rightAlpha * OPACITY_OPAQUE_U8 + 0.5);
KoColor rightColor(data, rgbColorSpace);
KoGradientSegment *segment = new KoGradientSegment(interpolationType, colorInterpolationType, leftOffset, middleOffset, rightOffset, leftColor, rightColor);
Q_CHECK_PTR(segment);
if (!segment -> isValid()) {
delete segment;
return false;
}
m_segments.push_back(segment);
}
if (!m_segments.isEmpty()) {
updatePreview();
setValid(true);
return true;
} else {
return false;
}
}
bool KoSegmentGradient::save()
{
QFile file(filename());
if (!file.open(QIODevice::WriteOnly)) {
return false;
}
saveToDevice(&file);
file.close();
return true;
}
bool KoSegmentGradient::saveToDevice(QIODevice *dev) const
{
QTextStream fileContent(dev);
fileContent << "GIMP Gradient\n";
fileContent << "Name: " << name() << "\n";
fileContent << m_segments.count() << "\n";
Q_FOREACH (KoGradientSegment* segment, m_segments) {
fileContent << QString::number(segment->startOffset(), 'f') << " " << QString::number(segment->middleOffset(), 'f') << " "
<< QString::number(segment->endOffset(), 'f') << " ";
QColor startColor = segment->startColor().toQColor();
QColor endColor = segment->endColor().toQColor();
fileContent << QString::number(startColor.redF(), 'f') << " " << QString::number(startColor.greenF(), 'f') << " "
<< QString::number(startColor.blueF(), 'f') << " " << QString::number(startColor.alphaF(), 'f') << " ";
fileContent << QString::number(endColor.redF(), 'f') << " " << QString::number(endColor.greenF(), 'f') << " "
<< QString::number(endColor.blueF(), 'f') << " " << QString::number(endColor.alphaF(), 'f') << " ";
fileContent << (int)segment->interpolation() << " " << (int)segment->colorInterpolation() << "\n";
}
KoResource::saveToDevice(dev);
return true;
}
KoGradientSegment *KoSegmentGradient::segmentAt(qreal t) const
{
Q_ASSERT(t >= 0 || t <= 1);
Q_ASSERT(!m_segments.empty());
for (QList<KoGradientSegment *>::const_iterator it = m_segments.begin(); it != m_segments.end(); ++it) {
if (t > (*it)->startOffset() - DBL_EPSILON && t < (*it)->endOffset() + DBL_EPSILON) {
return *it;
}
}
return 0;
}
void KoSegmentGradient::colorAt(KoColor& dst, qreal t) const
{
const KoGradientSegment *segment = segmentAt(t);
Q_ASSERT(segment != 0);
if (segment) {
segment->colorAt(dst, t);
}
}
QGradient* KoSegmentGradient::toQGradient() const
{
QGradient* gradient = new QLinearGradient();
QColor color;
Q_FOREACH (KoGradientSegment* segment, m_segments) {
segment->startColor().toQColor(&color);
gradient->setColorAt(segment->startOffset() , color);
segment->endColor().toQColor(&color);
gradient->setColorAt(segment->endOffset() , color);
}
return gradient;
}
QString KoSegmentGradient::defaultFileExtension() const
{
return QString(".ggr");
}
+void KoSegmentGradient::toXML(QDomDocument &doc, QDomElement &gradientElt) const
+{
+ gradientElt.setAttribute("type", "segment");
+ Q_FOREACH(KoGradientSegment *segment, this->segments()) {
+ QDomElement segmentElt = doc.createElement("segment");
+ QDomElement start = doc.createElement("start");
+ QDomElement end = doc.createElement("end");
+ segmentElt.setAttribute("start-offset", segment->startOffset());
+ const KoColor startColor = segment->startColor();
+ segmentElt.setAttribute("start-bitdepth", startColor.colorSpace()->colorDepthId().id());
+ startColor.toXML(doc, start);
+ segmentElt.setAttribute("middle-offset", segment->middleOffset());
+ segmentElt.setAttribute("end-offset", segment->endOffset());
+ const KoColor endColor = segment->endColor();
+ segmentElt.setAttribute("end-bitdepth", endColor.colorSpace()->colorDepthId().id());
+ endColor.toXML(doc, end);
+ segmentElt.setAttribute("interpolation", segment->interpolation());
+ segmentElt.setAttribute("color-interpolation", segment->colorInterpolation());
+ segmentElt.appendChild(start);
+ segmentElt.appendChild(end);
+ gradientElt.appendChild(segmentElt);
+ }
+}
+
+KoSegmentGradient KoSegmentGradient::fromXML(const QDomElement &elt)
+{
+ KoSegmentGradient gradient;
+ QDomElement segmentElt = elt.firstChildElement("segment");
+ while (!segmentElt.isNull()) {
+ int interpolation = segmentElt.attribute("interpolation", "0.0").toInt();
+ int colorInterpolation = segmentElt.attribute("color-interpolation", "0.0").toInt();
+ double startOffset = segmentElt.attribute("start-offset", "0.0").toDouble();
+ qreal middleOffset = segmentElt.attribute("middle-offset", "0.0").toDouble();
+ qreal endOffset = segmentElt.attribute("end-offset", "0.0").toDouble();
+ QDomElement start = segmentElt.firstChildElement("start");
+ QString startBitdepth = segmentElt.attribute("start-bitdepth", Integer8BitsColorDepthID.id());
+ QColor left = KoColor::fromXML(start.firstChildElement(), startBitdepth).toQColor();
+ QString endBitdepth = segmentElt.attribute("end-bitdepth", Integer8BitsColorDepthID.id());
+ QDomElement end = segmentElt.firstChildElement("end");
+ QColor right = KoColor::fromXML(end.firstChildElement(), endBitdepth).toQColor();
+ gradient.createSegment(interpolation, colorInterpolation, startOffset, endOffset, middleOffset, left, right);
+ segmentElt = segmentElt.nextSiblingElement("segment");
+ }
+ return gradient;
+}
+
KoGradientSegment::KoGradientSegment(int interpolationType, int colorInterpolationType, qreal startOffset, qreal middleOffset, qreal endOffset, const KoColor& startColor, const KoColor& endColor)
{
m_interpolator = 0;
switch (interpolationType) {
case INTERP_LINEAR:
m_interpolator = LinearInterpolationStrategy::instance();
break;
case INTERP_CURVED:
m_interpolator = CurvedInterpolationStrategy::instance();
break;
case INTERP_SINE:
m_interpolator = SineInterpolationStrategy::instance();
break;
case INTERP_SPHERE_INCREASING:
m_interpolator = SphereIncreasingInterpolationStrategy::instance();
break;
case INTERP_SPHERE_DECREASING:
m_interpolator = SphereDecreasingInterpolationStrategy::instance();
break;
}
m_colorInterpolator = 0;
switch (colorInterpolationType) {
case COLOR_INTERP_RGB:
m_colorInterpolator = RGBColorInterpolationStrategy::instance();
break;
case COLOR_INTERP_HSV_CCW:
m_colorInterpolator = HSVCCWColorInterpolationStrategy::instance();
break;
case COLOR_INTERP_HSV_CW:
m_colorInterpolator = HSVCWColorInterpolationStrategy::instance();
break;
}
if (startOffset < DBL_EPSILON) {
m_startOffset = 0;
} else if (startOffset > 1 - DBL_EPSILON) {
m_startOffset = 1;
} else {
m_startOffset = startOffset;
}
if (middleOffset < m_startOffset + DBL_EPSILON) {
m_middleOffset = m_startOffset;
} else if (middleOffset > 1 - DBL_EPSILON) {
m_middleOffset = 1;
} else {
m_middleOffset = middleOffset;
}
if (endOffset < m_middleOffset + DBL_EPSILON) {
m_endOffset = m_middleOffset;
} else if (endOffset > 1 - DBL_EPSILON) {
m_endOffset = 1;
} else {
m_endOffset = endOffset;
}
m_length = m_endOffset - m_startOffset;
if (m_length < DBL_EPSILON) {
m_middleT = 0.5;
} else {
m_middleT = (m_middleOffset - m_startOffset) / m_length;
}
m_startColor = startColor;
m_endColor = endColor;
}
const KoColor& KoGradientSegment::startColor() const
{
return m_startColor;
}
const KoColor& KoGradientSegment::endColor() const
{
return m_endColor;
}
qreal KoGradientSegment::startOffset() const
{
return m_startOffset;
}
qreal KoGradientSegment::middleOffset() const
{
return m_middleOffset;
}
qreal KoGradientSegment::endOffset() const
{
return m_endOffset;
}
void KoGradientSegment::setStartOffset(qreal t)
{
m_startOffset = t;
m_length = m_endOffset - m_startOffset;
if (m_length < DBL_EPSILON) {
m_middleT = 0.5;
} else {
m_middleT = (m_middleOffset - m_startOffset) / m_length;
}
}
void KoGradientSegment::setMiddleOffset(qreal t)
{
m_middleOffset = t;
if (m_length < DBL_EPSILON) {
m_middleT = 0.5;
} else {
m_middleT = (m_middleOffset - m_startOffset) / m_length;
}
}
void KoGradientSegment::setEndOffset(qreal t)
{
m_endOffset = t;
m_length = m_endOffset - m_startOffset;
if (m_length < DBL_EPSILON) {
m_middleT = 0.5;
} else {
m_middleT = (m_middleOffset - m_startOffset) / m_length;
}
}
int KoGradientSegment::interpolation() const
{
return m_interpolator->type();
}
void KoGradientSegment::setInterpolation(int interpolationType)
{
switch (interpolationType) {
case INTERP_LINEAR:
m_interpolator = LinearInterpolationStrategy::instance();
break;
case INTERP_CURVED:
m_interpolator = CurvedInterpolationStrategy::instance();
break;
case INTERP_SINE:
m_interpolator = SineInterpolationStrategy::instance();
break;
case INTERP_SPHERE_INCREASING:
m_interpolator = SphereIncreasingInterpolationStrategy::instance();
break;
case INTERP_SPHERE_DECREASING:
m_interpolator = SphereDecreasingInterpolationStrategy::instance();
break;
}
}
int KoGradientSegment::colorInterpolation() const
{
return m_colorInterpolator->type();
}
void KoGradientSegment::setColorInterpolation(int colorInterpolationType)
{
switch (colorInterpolationType) {
case COLOR_INTERP_RGB:
m_colorInterpolator = RGBColorInterpolationStrategy::instance();
break;
case COLOR_INTERP_HSV_CCW:
m_colorInterpolator = HSVCCWColorInterpolationStrategy::instance();
break;
case COLOR_INTERP_HSV_CW:
m_colorInterpolator = HSVCWColorInterpolationStrategy::instance();
break;
}
}
void KoGradientSegment::colorAt(KoColor& dst, qreal t) const
{
Q_ASSERT(t > m_startOffset - DBL_EPSILON && t < m_endOffset + DBL_EPSILON);
qreal segmentT;
if (m_length < DBL_EPSILON) {
segmentT = 0.5;
} else {
segmentT = (t - m_startOffset) / m_length;
}
qreal colorT = m_interpolator->valueAt(segmentT, m_middleT);
m_colorInterpolator->colorAt(dst, colorT, m_startColor, m_endColor);
}
bool KoGradientSegment::isValid() const
{
if (m_interpolator == 0 || m_colorInterpolator == 0)
return false;
return true;
}
KoGradientSegment::RGBColorInterpolationStrategy::RGBColorInterpolationStrategy()
: m_colorSpace(KoColorSpaceRegistry::instance()->rgb8())
{
}
KoGradientSegment::RGBColorInterpolationStrategy *KoGradientSegment::RGBColorInterpolationStrategy::instance()
{
if (m_instance == 0) {
m_instance = new RGBColorInterpolationStrategy();
Q_CHECK_PTR(m_instance);
}
return m_instance;
}
void KoGradientSegment::RGBColorInterpolationStrategy::colorAt(KoColor& dst, qreal t, const KoColor& _start, const KoColor& _end) const
{
KoColor buffer(m_colorSpace);
KoColor start(m_colorSpace);
KoColor end(m_colorSpace);
KoColor startDummy, endDummy;
//hack to get a color space with the bitdepth of the gradients(8bit), but with the colour profile of the image//
const KoColorSpace* mixSpace = KoColorSpaceRegistry::instance()->rgb8(dst.colorSpace()->profile());
//convert to the right colorspace for the start and end if we have our mixSpace.
if (mixSpace){
startDummy = KoColor(_start, mixSpace);
endDummy = KoColor(_end, mixSpace);
} else {
startDummy = _start;
endDummy = _end;
}
start.fromKoColor(_start);
end.fromKoColor(_end);
const quint8 *colors[2];
colors[0] = startDummy.data();
colors[1] = endDummy.data();
qint16 colorWeights[2];
colorWeights[0] = static_cast<quint8>((1.0 - t) * 255 + 0.5);
colorWeights[1] = 255 - colorWeights[0];
//check if our mixspace exists, it doesn't at startup.
if (mixSpace){
if (*buffer.colorSpace() != *mixSpace) {
buffer = KoColor(mixSpace);
}
mixSpace->mixColorsOp()->mixColors(colors, colorWeights, 2, buffer.data());
}
else {
buffer = KoColor(m_colorSpace);
m_colorSpace->mixColorsOp()->mixColors(colors, colorWeights, 2, buffer.data());
}
dst.fromKoColor(buffer);
}
KoGradientSegment::HSVCWColorInterpolationStrategy::HSVCWColorInterpolationStrategy()
: m_colorSpace(KoColorSpaceRegistry::instance()->rgb8())
{
}
KoGradientSegment::HSVCWColorInterpolationStrategy *KoGradientSegment::HSVCWColorInterpolationStrategy::instance()
{
if (m_instance == 0) {
m_instance = new HSVCWColorInterpolationStrategy();
Q_CHECK_PTR(m_instance);
}
return m_instance;
}
void KoGradientSegment::HSVCWColorInterpolationStrategy::colorAt(KoColor& dst, qreal t, const KoColor& start, const KoColor& end) const
{
QColor sc;
QColor ec;
start.toQColor(&sc);
end.toQColor(&ec);
int s = static_cast<int>(sc.saturation() + t * (ec.saturation() - sc.saturation()) + 0.5);
int v = static_cast<int>(sc.value() + t * (ec.value() - sc.value()) + 0.5);
int h;
if (ec.hue() < sc.hue()) {
h = static_cast<int>(ec.hue() + (1 - t) * (sc.hue() - ec.hue()) + 0.5);
} else {
h = static_cast<int>(ec.hue() + (1 - t) * (360 - ec.hue() + sc.hue()) + 0.5);
if (h > 359) {
h -= 360;
}
}
// XXX: added an explicit cast. Is this correct?
quint8 opacity = static_cast<quint8>(sc.alpha() + t * (ec.alpha() - sc.alpha()));
QColor result;
result.setHsv(h, s, v);
result.setAlpha(opacity);
dst.fromQColor(result);
}
KoGradientSegment::HSVCCWColorInterpolationStrategy::HSVCCWColorInterpolationStrategy() :
m_colorSpace(KoColorSpaceRegistry::instance()->rgb8())
{
}
KoGradientSegment::HSVCCWColorInterpolationStrategy *KoGradientSegment::HSVCCWColorInterpolationStrategy::instance()
{
if (m_instance == 0) {
m_instance = new HSVCCWColorInterpolationStrategy();
Q_CHECK_PTR(m_instance);
}
return m_instance;
}
void KoGradientSegment::HSVCCWColorInterpolationStrategy::colorAt(KoColor& dst, qreal t, const KoColor& start, const KoColor& end) const
{
QColor sc;
QColor se;
start.toQColor(&sc);
end.toQColor(&se);
int s = static_cast<int>(sc.saturation() + t * (se.saturation() - sc.saturation()) + 0.5);
int v = static_cast<int>(sc.value() + t * (se.value() - sc.value()) + 0.5);
int h;
if (sc.hue() < se.hue()) {
h = static_cast<int>(sc.hue() + t * (se.hue() - sc.hue()) + 0.5);
} else {
h = static_cast<int>(sc.hue() + t * (360 - sc.hue() + se.hue()) + 0.5);
if (h > 359) {
h -= 360;
}
}
// XXX: Added an explicit static cast
quint8 opacity = static_cast<quint8>(sc.alpha() + t * (se.alpha() - sc.alpha()));
QColor result;
result.setHsv(h, s, v);
result.setAlpha(opacity);
dst.fromQColor(result);
}
KoGradientSegment::LinearInterpolationStrategy *KoGradientSegment::LinearInterpolationStrategy::instance()
{
if (m_instance == 0) {
m_instance = new LinearInterpolationStrategy();
Q_CHECK_PTR(m_instance);
}
return m_instance;
}
qreal KoGradientSegment::LinearInterpolationStrategy::calcValueAt(qreal t, qreal middle)
{
Q_ASSERT(t > -DBL_EPSILON && t < 1 + DBL_EPSILON);
Q_ASSERT(middle > -DBL_EPSILON && middle < 1 + DBL_EPSILON);
qreal value = 0;
if (t <= middle) {
if (middle < DBL_EPSILON) {
value = 0;
} else {
value = (t / middle) * 0.5;
}
} else {
if (middle > 1 - DBL_EPSILON) {
value = 1;
} else {
value = ((t - middle) / (1 - middle)) * 0.5 + 0.5;
}
}
return value;
}
qreal KoGradientSegment::LinearInterpolationStrategy::valueAt(qreal t, qreal middle) const
{
return calcValueAt(t, middle);
}
KoGradientSegment::CurvedInterpolationStrategy::CurvedInterpolationStrategy()
{
m_logHalf = log(0.5);
}
KoGradientSegment::CurvedInterpolationStrategy *KoGradientSegment::CurvedInterpolationStrategy::instance()
{
if (m_instance == 0) {
m_instance = new CurvedInterpolationStrategy();
Q_CHECK_PTR(m_instance);
}
return m_instance;
}
qreal KoGradientSegment::CurvedInterpolationStrategy::valueAt(qreal t, qreal middle) const
{
Q_ASSERT(t > -DBL_EPSILON && t < 1 + DBL_EPSILON);
Q_ASSERT(middle > -DBL_EPSILON && middle < 1 + DBL_EPSILON);
qreal value = 0;
if (middle < DBL_EPSILON) {
middle = DBL_EPSILON;
}
value = pow(t, m_logHalf / log(middle));
return value;
}
KoGradientSegment::SineInterpolationStrategy *KoGradientSegment::SineInterpolationStrategy::instance()
{
if (m_instance == 0) {
m_instance = new SineInterpolationStrategy();
Q_CHECK_PTR(m_instance);
}
return m_instance;
}
qreal KoGradientSegment::SineInterpolationStrategy::valueAt(qreal t, qreal middle) const
{
qreal lt = LinearInterpolationStrategy::calcValueAt(t, middle);
qreal value = (sin(-M_PI_2 + M_PI * lt) + 1.0) / 2.0;
return value;
}
KoGradientSegment::SphereIncreasingInterpolationStrategy *KoGradientSegment::SphereIncreasingInterpolationStrategy::instance()
{
if (m_instance == 0) {
m_instance = new SphereIncreasingInterpolationStrategy();
Q_CHECK_PTR(m_instance);
}
return m_instance;
}
qreal KoGradientSegment::SphereIncreasingInterpolationStrategy::valueAt(qreal t, qreal middle) const
{
qreal lt = LinearInterpolationStrategy::calcValueAt(t, middle) - 1;
qreal value = sqrt(1 - lt * lt);
return value;
}
KoGradientSegment::SphereDecreasingInterpolationStrategy *KoGradientSegment::SphereDecreasingInterpolationStrategy::instance()
{
if (m_instance == 0) {
m_instance = new SphereDecreasingInterpolationStrategy();
Q_CHECK_PTR(m_instance);
}
return m_instance;
}
qreal KoGradientSegment::SphereDecreasingInterpolationStrategy::valueAt(qreal t, qreal middle) const
{
qreal lt = LinearInterpolationStrategy::calcValueAt(t, middle);
qreal value = 1 - sqrt(1 - lt * lt);
return value;
}
void KoSegmentGradient::createSegment(int interpolation, int colorInterpolation, double startOffset, double endOffset, double middleOffset, const QColor & left, const QColor & right)
{
pushSegment(new KoGradientSegment(interpolation, colorInterpolation, startOffset, middleOffset, endOffset, KoColor(left, colorSpace()), KoColor(right, colorSpace())));
}
const QList<double> KoSegmentGradient::getHandlePositions() const
{
QList<double> handlePositions;
handlePositions.push_back(m_segments[0]->startOffset());
for (int i = 0; i < m_segments.count(); i++) {
handlePositions.push_back(m_segments[i]->endOffset());
}
return handlePositions;
}
const QList<double> KoSegmentGradient::getMiddleHandlePositions() const
{
QList<double> middleHandlePositions;
for (int i = 0; i < m_segments.count(); i++) {
middleHandlePositions.push_back(m_segments[i]->middleOffset());
}
return middleHandlePositions;
}
void KoSegmentGradient::moveSegmentStartOffset(KoGradientSegment* segment, double t)
{
QList<KoGradientSegment*>::iterator it = qFind(m_segments.begin(), m_segments.end(), segment);
if (it != m_segments.end()) {
if (it == m_segments.begin()) {
segment->setStartOffset(0.0);
return;
}
KoGradientSegment* previousSegment = (*(it - 1));
if (t > segment->startOffset()) {
if (t > segment->middleOffset())
t = segment->middleOffset();
} else {
if (t < previousSegment->middleOffset())
t = previousSegment->middleOffset();
}
previousSegment->setEndOffset(t);
segment->setStartOffset(t);
}
}
void KoSegmentGradient::moveSegmentEndOffset(KoGradientSegment* segment, double t)
{
QList<KoGradientSegment*>::iterator it = qFind(m_segments.begin(), m_segments.end(), segment);
if (it != m_segments.end()) {
if (it + 1 == m_segments.end()) {
segment->setEndOffset(1.0);
return;
}
KoGradientSegment* followingSegment = (*(it + 1));
if (t < segment->endOffset()) {
if (t < segment->middleOffset())
t = segment->middleOffset();
} else {
if (t > followingSegment->middleOffset())
t = followingSegment->middleOffset();
}
followingSegment->setStartOffset(t);
segment->setEndOffset(t);
}
}
void KoSegmentGradient::moveSegmentMiddleOffset(KoGradientSegment* segment, double t)
{
if (segment) {
if (t > segment->endOffset())
segment->setMiddleOffset(segment->endOffset());
else if (t < segment->startOffset())
segment->setMiddleOffset(segment->startOffset());
else
segment->setMiddleOffset(t);
}
}
void KoSegmentGradient::splitSegment(KoGradientSegment* segment)
{
Q_ASSERT(segment != 0);
QList<KoGradientSegment*>::iterator it = qFind(m_segments.begin(), m_segments.end(), segment);
if (it != m_segments.end()) {
KoColor midleoffsetColor(segment->endColor().colorSpace());
segment->colorAt(midleoffsetColor, segment->middleOffset());
KoGradientSegment* newSegment = new KoGradientSegment(
segment->interpolation(), segment->colorInterpolation(),
segment ->startOffset(),
(segment->middleOffset() - segment->startOffset()) / 2 + segment->startOffset(),
segment->middleOffset(),
segment->startColor(),
midleoffsetColor);
m_segments.insert(it, newSegment);
segment->setStartColor(midleoffsetColor);
segment->setStartOffset(segment->middleOffset());
segment->setMiddleOffset((segment->endOffset() - segment->startOffset()) / 2 + segment->startOffset());
}
}
void KoSegmentGradient::duplicateSegment(KoGradientSegment* segment)
{
Q_ASSERT(segment != 0);
QList<KoGradientSegment*>::iterator it = qFind(m_segments.begin(), m_segments.end(), segment);
if (it != m_segments.end()) {
double middlePostionPercentage = (segment->middleOffset() - segment->startOffset()) / segment->length();
double center = segment->startOffset() + segment->length() / 2;
KoGradientSegment* newSegment = new KoGradientSegment(
segment->interpolation(), segment->colorInterpolation(),
segment ->startOffset(),
segment->length() / 2 * middlePostionPercentage + segment->startOffset(),
center, segment->startColor(),
segment->endColor());
m_segments.insert(it, newSegment);
segment->setStartOffset(center);
segment->setMiddleOffset(segment->length() * middlePostionPercentage + segment->startOffset());
}
}
void KoSegmentGradient::mirrorSegment(KoGradientSegment* segment)
{
Q_ASSERT(segment != 0);
KoColor tmpColor = segment->startColor();
segment->setStartColor(segment->endColor());
segment->setEndColor(tmpColor);
segment->setMiddleOffset(segment->endOffset() - (segment->middleOffset() - segment->startOffset()));
if (segment->interpolation() == INTERP_SPHERE_INCREASING)
segment->setInterpolation(INTERP_SPHERE_DECREASING);
else if (segment->interpolation() == INTERP_SPHERE_DECREASING)
segment->setInterpolation(INTERP_SPHERE_INCREASING);
if (segment->colorInterpolation() == COLOR_INTERP_HSV_CW)
segment->setColorInterpolation(COLOR_INTERP_HSV_CCW);
else if (segment->colorInterpolation() == COLOR_INTERP_HSV_CCW)
segment->setColorInterpolation(COLOR_INTERP_HSV_CW);
}
KoGradientSegment* KoSegmentGradient::removeSegment(KoGradientSegment* segment)
{
Q_ASSERT(segment != 0);
if (m_segments.count() < 2)
return 0;
QList<KoGradientSegment*>::iterator it = qFind(m_segments.begin(), m_segments.end(), segment);
if (it != m_segments.end()) {
double middlePostionPercentage;
KoGradientSegment* nextSegment;
if (it == m_segments.begin()) {
nextSegment = (*(it + 1));
middlePostionPercentage = (nextSegment->middleOffset() - nextSegment->startOffset()) / nextSegment->length();
nextSegment->setStartOffset(segment->startOffset());
nextSegment->setMiddleOffset(middlePostionPercentage * nextSegment->length() + nextSegment->startOffset());
} else {
nextSegment = (*(it - 1));
middlePostionPercentage = (nextSegment->middleOffset() - nextSegment->startOffset()) / nextSegment->length();
nextSegment->setEndOffset(segment->endOffset());
nextSegment->setMiddleOffset(middlePostionPercentage * nextSegment->length() + nextSegment->startOffset());
}
delete segment;
m_segments.erase(it);
return nextSegment;
}
return 0;
}
bool KoSegmentGradient::removeSegmentPossible() const
{
if (m_segments.count() < 2)
return false;
return true;
}
const QList<KoGradientSegment *>& KoSegmentGradient::segments() const
{
return m_segments;
}
diff --git a/libs/pigment/resources/KoSegmentGradient.h b/libs/pigment/resources/KoSegmentGradient.h
index 25c5f34525..3bd9bb5019 100644
--- a/libs/pigment/resources/KoSegmentGradient.h
+++ b/libs/pigment/resources/KoSegmentGradient.h
@@ -1,418 +1,431 @@
/*
Copyright (c) 2000 Matthias Elter <elter@kde.org>
2004 Boudewijn Rempt <boud@valdyas.org>
2004 Adrian Page <adrian@pagenet.plus.com>
2004, 2007 Sven Langkamp <sven.langkamp@gmail.com>
+ 2017 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef KOSEGMENTGRADIENT_H
#define KOSEGMENTGRADIENT_H
#include <QList>
#include <QColor>
#include <resources/KoResource.h>
#include <resources/KoAbstractGradient.h>
#include "KoColor.h"
#include <kritapigment_export.h>
enum {
INTERP_LINEAR = 0,
INTERP_CURVED,
INTERP_SINE,
INTERP_SPHERE_INCREASING,
INTERP_SPHERE_DECREASING
};
enum {
COLOR_INTERP_RGB,
COLOR_INTERP_HSV_CCW,
COLOR_INTERP_HSV_CW
};
/// Write API docs here
class KRITAPIGMENT_EXPORT KoGradientSegment
{
public:
KoGradientSegment(int interpolationType, int colorInterpolationType, qreal startOffset, qreal middleOffset, qreal endOffset, const KoColor& startColor, const KoColor& endColor);
// startOffset <= t <= endOffset
void colorAt(KoColor&, qreal t) const;
const KoColor& startColor() const;
const KoColor& endColor() const;
void setStartColor(const KoColor& color) {
m_startColor = color;
}
void setEndColor(const KoColor& color) {
m_endColor = color;
}
qreal startOffset() const;
qreal middleOffset() const;
qreal endOffset() const;
void setStartOffset(qreal t);
void setMiddleOffset(qreal t);
void setEndOffset(qreal t);
qreal length() {
return m_length;
}
int interpolation() const;
int colorInterpolation() const;
void setInterpolation(int interpolationType);
void setColorInterpolation(int colorInterpolationType);
bool isValid() const;
protected:
class ColorInterpolationStrategy
{
public:
ColorInterpolationStrategy() {}
virtual ~ColorInterpolationStrategy() {}
virtual void colorAt(KoColor& dst, qreal t, const KoColor& start, const KoColor& end) const = 0;
virtual int type() const = 0;
};
class RGBColorInterpolationStrategy : public ColorInterpolationStrategy
{
public:
static RGBColorInterpolationStrategy *instance();
void colorAt(KoColor& dst, qreal t, const KoColor& start, const KoColor& end) const override;
int type() const override {
return COLOR_INTERP_RGB;
}
private:
RGBColorInterpolationStrategy();
static RGBColorInterpolationStrategy *m_instance;
const KoColorSpace * const m_colorSpace;
};
class HSVCWColorInterpolationStrategy : public ColorInterpolationStrategy
{
public:
static HSVCWColorInterpolationStrategy *instance();
void colorAt(KoColor& dst, qreal t, const KoColor& start, const KoColor& end) const override;
int type() const override {
return COLOR_INTERP_HSV_CW;
}
private:
HSVCWColorInterpolationStrategy();
static HSVCWColorInterpolationStrategy *m_instance;
const KoColorSpace * const m_colorSpace;
};
class HSVCCWColorInterpolationStrategy : public ColorInterpolationStrategy
{
public:
static HSVCCWColorInterpolationStrategy *instance();
void colorAt(KoColor& dst, qreal t, const KoColor& start, const KoColor& end) const override;
int type() const override {
return COLOR_INTERP_HSV_CCW;
}
private:
HSVCCWColorInterpolationStrategy();
static HSVCCWColorInterpolationStrategy *m_instance;
const KoColorSpace * const m_colorSpace;
};
class InterpolationStrategy
{
public:
InterpolationStrategy() {}
virtual ~InterpolationStrategy() {}
virtual qreal valueAt(qreal t, qreal middle) const = 0;
virtual int type() const = 0;
};
class LinearInterpolationStrategy : public InterpolationStrategy
{
public:
static LinearInterpolationStrategy *instance();
qreal valueAt(qreal t, qreal middle) const override;
int type() const override {
return INTERP_LINEAR;
}
// This does the actual calculation and is made
// static as an optimization for the other
// strategies that need this for their own calculation.
static qreal calcValueAt(qreal t, qreal middle);
private:
LinearInterpolationStrategy() {}
static LinearInterpolationStrategy *m_instance;
};
class CurvedInterpolationStrategy : public InterpolationStrategy
{
public:
static CurvedInterpolationStrategy *instance();
qreal valueAt(qreal t, qreal middle) const override;
int type() const override {
return INTERP_CURVED;
}
private:
CurvedInterpolationStrategy();
static CurvedInterpolationStrategy *m_instance;
qreal m_logHalf;
};
class SphereIncreasingInterpolationStrategy : public InterpolationStrategy
{
public:
static SphereIncreasingInterpolationStrategy *instance();
qreal valueAt(qreal t, qreal middle) const override;
int type() const override {
return INTERP_SPHERE_INCREASING;
}
private:
SphereIncreasingInterpolationStrategy() {}
static SphereIncreasingInterpolationStrategy *m_instance;
};
class SphereDecreasingInterpolationStrategy : public InterpolationStrategy
{
public:
static SphereDecreasingInterpolationStrategy *instance();
qreal valueAt(qreal t, qreal middle) const override;
int type() const override {
return INTERP_SPHERE_DECREASING;
}
private:
SphereDecreasingInterpolationStrategy() {}
static SphereDecreasingInterpolationStrategy *m_instance;
};
class SineInterpolationStrategy : public InterpolationStrategy
{
public:
static SineInterpolationStrategy *instance();
qreal valueAt(qreal t, qreal middle) const override;
int type() const override {
return INTERP_SINE;
}
private:
SineInterpolationStrategy() {}
static SineInterpolationStrategy *m_instance;
};
private:
InterpolationStrategy *m_interpolator;
ColorInterpolationStrategy *m_colorInterpolator;
qreal m_startOffset;
qreal m_middleOffset;
qreal m_endOffset;
qreal m_length;
qreal m_middleT;
KoColor m_startColor;
KoColor m_endColor;
};
/**
* KoSegmentGradient stores a segment based gradients like Gimp gradients
*/
class KRITAPIGMENT_EXPORT KoSegmentGradient : public KoAbstractGradient
{
public:
explicit KoSegmentGradient(const QString &file = QString());
~KoSegmentGradient() override;
KoAbstractGradient* clone() const override;
/// reimplemented
bool load() override;
bool loadFromDevice(QIODevice *dev) override;
/// not implemented
bool save() override;
bool saveToDevice(QIODevice* dev) const override;
/// reimplemented
void colorAt(KoColor& dst, qreal t) const override;
/**
* Returns the segment at a given position
* @param t position inside the gradient, with 0 <= t <= 1
* @return the segment the position, 0 if no segment is found
*/
KoGradientSegment *segmentAt(qreal t) const;
/// reimplemented
QGradient* toQGradient() const override;
/// reimplemented
QString defaultFileExtension() const override;
+ /**
+ * @brief toXML
+ * convert the gradient to xml.
+ */
+ void toXML(QDomDocument& doc, QDomElement& gradientElt) const;
+ /**
+ * @brief fromXML
+ * get a segment gradient from xml.
+ * @return gradient
+ */
+ static KoSegmentGradient fromXML(const QDomElement& elt);
+
/**
* a gradient colour picker can consist of one or more segments.
* A segment has two end points - each colour in the gradient
* colour picker represents a segment end point.
* @param interpolation
* @param colorInterpolation
* @param startOffset
* @param endOffset
* @param middleOffset
* @param left
* @param right
* @return void
*/
void createSegment(int interpolation, int colorInterpolation, double startOffset, double endOffset, double middleOffset, const QColor & left, const QColor & right);
/**
* gets a list of end points of the segments in the gradient
* colour picker. If two colours, one segment then two end
* points, and if three colours, then two segments with four
* endpoints.
* @return a list of double values
*/
const QList<double> getHandlePositions() const;
/**
* gets a list of middle points of the segments in the gradient
* colour picker.
* @return a list of double values
*/
const QList<double> getMiddleHandlePositions() const;
/**
* Moves the StartOffset of the specified segment to the
* specified value and corrects the endoffset of the previous
* segment. If the segment is the first Segment the startoffset
* will be set to 0.0 . The offset will maximally be moved till
* the middle of the current or the previous segment. This is
* useful if someone clicks to move the handler for a segment,
* to set the half the segment to the right and half the segment
* to the left of the handler.
* @param segment the segment for which to move the relative
* offset within the gradient colour picker.
* @param t the new startoff position for the segment
* @return void
*/
void moveSegmentStartOffset(KoGradientSegment* segment, double t);
/**
* Moves the endoffset of the specified segment to the specified
* value and corrects the startoffset of the following segment.
* If the segment is the last segment the endoffset will be set
* to 1.0 . The offset will maximally be moved till the middle
* of the current or the following segment. This is useful if
* someone moves the segment handler in the gradient colour
* picker, and needs the segment to move with it. Sets the end
* position of the segment to the correct new position.
* @param segment the segment for which to move the relative
* end position within the gradient colour picker.
* @param t the new end position for the segment
* @return void
*/
void moveSegmentEndOffset(KoGradientSegment* segment, double t);
/**
* moves the Middle of the specified segment to the specified
* value. The offset will maximally be moved till the endoffset
* or startoffset of the segment. This sets the middle of the
* segment to the same position as the handler of the gradient
* colour picker.
* @param segment the segment for which to move the relative
* middle position within the gradient colour picker.
* @param t the new middle position for the segment
* @return void
*/
void moveSegmentMiddleOffset(KoGradientSegment* segment, double t);
/**
* splits the specified segment into two equal parts
* @param segment the segment to split
* @return void
*/
void splitSegment(KoGradientSegment* segment);
/**
* duplicate the specified segment
* @param segment the segment to duplicate
* @return void
*/
void duplicateSegment(KoGradientSegment* segment);
/**
* create a segment horizontally reversed to the specified one.
* @param segment the segment to reverse
* @return void
*/
void mirrorSegment(KoGradientSegment* segment);
/**
* removes the specific segment from the gradient colour picker.
* @param segment the segment to remove
* @return the segment which will be at the place of the old
* segment. 0 if the segment is not in the gradient or it is
* not possible to remove the segment.
*/
KoGradientSegment* removeSegment(KoGradientSegment* segment);
/**
* checks if it's possible to remove a segment (at least two
* segments in the gradient)
* @return true if it's possible to remove an segment
*/
bool removeSegmentPossible() const;
const QList<KoGradientSegment *>& segments() const;
protected:
KoSegmentGradient(const KoSegmentGradient &rhs);
inline void pushSegment(KoGradientSegment* segment) {
m_segments.push_back(segment);
}
QList<KoGradientSegment *> m_segments;
private:
bool init();
};
#endif // KOSEGMENTGRADIENT_H
diff --git a/libs/pigment/resources/KoStopGradient.cpp b/libs/pigment/resources/KoStopGradient.cpp
index 79ccf6dd28..83fda1375e 100644
--- a/libs/pigment/resources/KoStopGradient.cpp
+++ b/libs/pigment/resources/KoStopGradient.cpp
@@ -1,686 +1,716 @@
/*
Copyright (C) 2005 Tim Beaulen <tbscope@gmail.org>
Copyright (C) 2007 Jan Hambrecht <jaham@gmx.net>
Copyright (c) 2007 Sven Langkamp <sven.langkamp@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <resources/KoStopGradient.h>
#include <cfloat>
#include <QColor>
#include <QFile>
#include <QDomDocument>
+#include <QDomElement>
#include <QBuffer>
#include <klocalizedstring.h>
#include <DebugPigment.h>
#include "KoColorSpaceRegistry.h"
#include "KoMixColorsOp.h"
#include <math.h>
#include <KoColorModelStandardIds.h>
KoStopGradient::KoStopGradient(const QString& filename)
: KoAbstractGradient(filename)
{
}
KoStopGradient::~KoStopGradient()
{
}
KoAbstractGradient* KoStopGradient::clone() const
{
return new KoStopGradient(*this);
}
bool KoStopGradient::load()
{
QFile f(filename());
if (!f.open(QIODevice::ReadOnly)) {
warnPigment << "Can't open file " << filename();
return false;
}
bool res = loadFromDevice(&f);
f.close();
return res;
}
bool KoStopGradient::loadFromDevice(QIODevice *dev)
{
QString strExt;
const int result = filename().lastIndexOf('.');
if (result >= 0) {
strExt = filename().mid(result).toLower();
}
QByteArray ba = dev->readAll();
QBuffer buf(&ba);
if (strExt == ".kgr") {
loadKarbonGradient(&buf);
}
else if (strExt == ".svg") {
loadSvgGradient(&buf);
}
if (m_stops.count() >= 2) {
setValid(true);
}
updatePreview();
return true;
}
bool KoStopGradient::save()
{
QFile fileOut(filename());
if (! fileOut.open(QIODevice::WriteOnly))
return false;
bool retval = saveToDevice(&fileOut);
fileOut.close();
return retval;
}
QGradient* KoStopGradient::toQGradient() const
{
QGradient* gradient;
switch (type()) {
case QGradient::LinearGradient: {
gradient = new QLinearGradient(m_start, m_stop);
break;
}
case QGradient::RadialGradient: {
QPointF diff = m_stop - m_start;
qreal radius = sqrt(diff.x() * diff.x() + diff.y() * diff.y());
gradient = new QRadialGradient(m_start, radius, m_focalPoint);
break;
}
case QGradient::ConicalGradient: {
qreal angle = atan2(m_start.y(), m_start.x()) * 180.0 / M_PI;
if (angle < 0.0)
angle += 360.0;
gradient = new QConicalGradient(m_start, angle);
break;
}
default:
return 0;
}
QColor color;
for (QList<KoGradientStop>::const_iterator i = m_stops.begin(); i != m_stops.end(); ++i) {
i->second.toQColor(&color);
gradient->setColorAt(i->first , color);
}
gradient->setCoordinateMode(QGradient::ObjectBoundingMode);
gradient->setSpread(this->spread());
return gradient;
}
void KoStopGradient::colorAt(KoColor& dst, qreal t) const
{
KoColor buffer;
if (! m_stops.count())
return;
if (t <= m_stops.first().first || m_stops.count() == 1) {
// we have only one stop or t is before the first stop
// -> use the color of the first stop
dst.fromKoColor(m_stops.first().second);
} else if (t >= m_stops.last().first) {
// t is after the last stop
// -> use the color of the last stop
dst.fromKoColor(m_stops.last().second);
} else {
// we have at least two color stops
// -> find the two stops which frame our t
QList<KoGradientStop>::const_iterator stop = m_stops.begin();
QList<KoGradientStop>::const_iterator lastStop = m_stops.end();
// we already checked the first stop, so we start at the second
for (++stop; stop != lastStop; ++stop) {
// we break at the stop which is just after our t
if (stop->first > t)
break;
}
//if ( *buffer.colorSpace() != *colorSpace()) {
// buffer = KoColor(colorSpace());
//}
//hack to get a color space with the bitdepth of the gradients(8bit), but with the colour profile of the image//
const KoColorSpace* mixSpace = KoColorSpaceRegistry::instance()->rgb8(dst.colorSpace()->profile());
const KoGradientStop& leftStop = *(stop - 1);
const KoGradientStop& rightStop = *(stop);
KoColor startDummy, endDummy;
if (mixSpace){
startDummy = KoColor(leftStop.second, mixSpace);
endDummy = KoColor(rightStop.second, mixSpace);
} else {
startDummy = leftStop.second;
endDummy = rightStop.second;
}
const quint8 *colors[2];
colors[0] = startDummy.data();
colors[1] = endDummy.data();
qreal localT;
qreal stopDistance = rightStop.first - leftStop.first;
if (stopDistance < DBL_EPSILON) {
localT = 0.5;
} else {
localT = (t - leftStop.first) / stopDistance;
}
qint16 colorWeights[2];
colorWeights[0] = static_cast<quint8>((1.0 - localT) * 255 + 0.5);
colorWeights[1] = 255 - colorWeights[0];
//check if our mixspace exists, it doesn't at startup.
if (mixSpace){
if (*buffer.colorSpace() != *mixSpace) {
buffer = KoColor(mixSpace);
}
mixSpace->mixColorsOp()->mixColors(colors, colorWeights, 2, buffer.data());
}
else {
buffer = KoColor(colorSpace());
colorSpace()->mixColorsOp()->mixColors(colors, colorWeights, 2, buffer.data());
}
dst.fromKoColor(buffer);
}
}
KoStopGradient * KoStopGradient::fromQGradient(const QGradient * gradient)
{
if (! gradient)
return 0;
KoStopGradient * newGradient = new KoStopGradient(QString());
newGradient->setType(gradient->type());
newGradient->setSpread(gradient->spread());
switch (gradient->type()) {
case QGradient::LinearGradient: {
const QLinearGradient * g = static_cast<const QLinearGradient*>(gradient);
newGradient->m_start = g->start();
newGradient->m_stop = g->finalStop();
newGradient->m_focalPoint = g->start();
break;
}
case QGradient::RadialGradient: {
const QRadialGradient * g = static_cast<const QRadialGradient*>(gradient);
newGradient->m_start = g->center();
newGradient->m_stop = g->center() + QPointF(g->radius(), 0);
newGradient->m_focalPoint = g->focalPoint();
break;
}
case QGradient::ConicalGradient: {
const QConicalGradient * g = static_cast<const QConicalGradient*>(gradient);
qreal radian = g->angle() * M_PI / 180.0;
newGradient->m_start = g->center();
newGradient->m_stop = QPointF(100.0 * cos(radian), 100.0 * sin(radian));
newGradient->m_focalPoint = g->center();
break;
}
default:
delete newGradient;
return 0;
}
Q_FOREACH (const QGradientStop & stop, gradient->stops()) {
KoColor color(newGradient->colorSpace());
color.fromQColor(stop.second);
newGradient->m_stops.append(KoGradientStop(stop.first, color));
}
newGradient->setValid(true);
return newGradient;
}
void KoStopGradient::setStops(QList< KoGradientStop > stops)
{
m_stops.clear();
KoColor color;
Q_FOREACH (const KoGradientStop & stop, stops) {
color = stop.second;
color.convertTo(colorSpace());
m_stops.append(KoGradientStop(stop.first, color));
}
updatePreview();
}
QList<KoGradientStop> KoStopGradient::stops() const
{
return m_stops;
}
void KoStopGradient::loadKarbonGradient(QIODevice *file)
{
QDomDocument doc;
if (!(doc.setContent(file))) {
file->close();
setValid(false);
return;
}
QDomElement e;
QDomNode n = doc.documentElement().firstChild();
if (!n.isNull()) {
e = n.toElement();
if (!e.isNull() && e.tagName() == "GRADIENT") {
parseKarbonGradient(e);
}
}
}
void KoStopGradient::loadSvgGradient(QIODevice *file)
{
QDomDocument doc;
if (!(doc.setContent(file)))
file->close();
else {
for (QDomNode n = doc.documentElement().firstChild(); !n.isNull(); n = n.nextSibling()) {
QDomElement e = n.toElement();
if (e.isNull()) continue;
if (e.tagName() == "linearGradient" || e.tagName() == "radialGradient") {
parseSvgGradient(e);
return;
}
// Inkscape gradients are in another defs
if (e.tagName() == "defs") {
for (QDomNode defnode = e.firstChild(); !defnode.isNull(); defnode = defnode.nextSibling()) {
QDomElement defelement = defnode.toElement();
if (defelement.isNull()) continue;
if (defelement.tagName() == "linearGradient" || defelement.tagName() == "radialGradient") {
parseSvgGradient(defelement);
return;
}
}
}
}
}
}
void KoStopGradient::parseKarbonGradient(const QDomElement& element)
{
m_start = QPointF(element.attribute("originX", "0.0").toDouble(), element.attribute("originY", "0.0").toDouble());
m_focalPoint = QPointF(element.attribute("focalX", "0.0").toDouble(), element.attribute("focalY", "0.0").toDouble());
m_stop = QPointF(element.attribute("vectorX", "0.0").toDouble(), element.attribute("vectorY", "0.0").toDouble());
setType((QGradient::Type)element.attribute("type", 0).toInt());
setSpread((QGradient::Spread)element.attribute("repeatMethod", 0).toInt());
m_stops.clear();
qreal color1, color2, color3, color4, opacity;
KoColor color;
// load stops
QDomNodeList list = element.childNodes();
for (int i = 0; i < list.count(); ++i) {
if (list.item(i).isElement()) {
QDomElement colorstop = list.item(i).toElement();
if (colorstop.tagName() == "COLORSTOP") {
QDomElement e = colorstop.firstChild().toElement();
opacity = e.attribute("opacity", "1.0").toFloat();
QColor tmpColor;
const KoColorSpace* stopColorSpace;
switch (e.attribute("colorSpace").toUShort()) {
case 1: // cmyk
color1 = e.attribute("v1", "0.0").toFloat();
color2 = e.attribute("v2", "0.0").toFloat();
color3 = e.attribute("v3", "0.0").toFloat();
color4 = e.attribute("v4", "0.0").toFloat();
stopColorSpace = KoColorSpaceRegistry::instance()->colorSpace( CMYKAColorModelID.id(), Integer8BitsColorDepthID.id(), QString());
if (stopColorSpace) {
quint8 data[5];
data[0] = static_cast<quint8>(color1 * 255 + 0.5);
data[1] = static_cast<quint8>(color2 * 255 + 0.5);
data[2] = static_cast<quint8>(color3 * 255 + 0.5);
data[3] = static_cast<quint8>(color4 * 255 + 0.5);
data[4] = static_cast<quint8>(opacity * OPACITY_OPAQUE_U8 + 0.5);
color.setColor(data, stopColorSpace);
} else {
// cmyk colorspace not found fallback to rgb
color.convertTo(KoColorSpaceRegistry::instance()->rgb8());
tmpColor.setCmykF(color1, color2, color3, color4);
tmpColor.setAlpha(static_cast<quint8>(opacity * OPACITY_OPAQUE_U8 + 0.5));
color.fromQColor(tmpColor);
}
break;
case 2: // hsv
color1 = e.attribute("v1", "0.0").toFloat();
color2 = e.attribute("v2", "0.0").toFloat();
color3 = e.attribute("v3", "0.0").toFloat();
color.convertTo(KoColorSpaceRegistry::instance()->rgb8());
tmpColor.setHsvF(color1, color2, color3);
tmpColor.setAlpha(static_cast<quint8>(opacity * OPACITY_OPAQUE_U8 + 0.5));
color.fromQColor(tmpColor);
break;
case 3: // gray
color1 = e.attribute("v1", "0.0").toFloat();
stopColorSpace = KoColorSpaceRegistry::instance()->colorSpace( GrayAColorModelID.id(), Integer8BitsColorDepthID.id(), QString());
if (stopColorSpace) {
quint8 data[2];
data[0] = static_cast<quint8>(color1 * 255 + 0.5);
data[1] = static_cast<quint8>(opacity * OPACITY_OPAQUE_U8 + 0.5);
color.setColor(data, stopColorSpace);
} else {
// gray colorspace not found fallback to rgb
color.convertTo(KoColorSpaceRegistry::instance()->rgb8());
tmpColor.setRgbF(color1, color1, color1);
tmpColor.setAlpha(static_cast<quint8>(opacity * OPACITY_OPAQUE_U8 + 0.5));
color.fromQColor(tmpColor);
}
break;
default: // rgb
color1 = e.attribute("v1", "0.0").toFloat();
color2 = e.attribute("v2", "0.0").toFloat();
color3 = e.attribute("v3", "0.0").toFloat();
stopColorSpace = KoColorSpaceRegistry::instance()->rgb8();
quint8 data[4];
data[2] = static_cast<quint8>(color1 * 255 + 0.5);
data[1] = static_cast<quint8>(color2 * 255 + 0.5);
data[0] = static_cast<quint8>(color3 * 255 + 0.5);
data[3] = static_cast<quint8>(opacity * OPACITY_OPAQUE_U8 + 0.5);
color.setColor(data, stopColorSpace);
}
qreal offset = colorstop.attribute("ramppoint", "0.0").toFloat();
// midpoint = colorstop.attribute("midpoint", "0.5").toFloat();
m_stops.append(KoGradientStop(offset, color));
}
}
}
}
void KoStopGradient::parseSvgGradient(const QDomElement& element)
{
m_stops.clear();
setSpread(QGradient::PadSpread);
/*QString href = e.attribute( "xlink:href" ).mid( 1 );
if( !href.isEmpty() )
{
}*/
setName(element.attribute("id", i18n("SVG Gradient")));
const KoColorSpace* rgbColorSpace = KoColorSpaceRegistry::instance()->rgb8();
bool bbox = element.attribute("gradientUnits") != "userSpaceOnUse";
if (element.tagName() == "linearGradient") {
if (bbox) {
QString s;
s = element.attribute("x1", "0%");
qreal xOrigin;
if (s.endsWith('%'))
xOrigin = s.remove('%').toDouble();
else
xOrigin = s.toDouble() * 100.0;
s = element.attribute("y1", "0%");
qreal yOrigin;
if (s.endsWith('%'))
yOrigin = s.remove('%').toDouble();
else
yOrigin = s.toDouble() * 100.0;
s = element.attribute("x2", "100%");
qreal xVector;
if (s.endsWith('%'))
xVector = s.remove('%').toDouble();
else
xVector = s.toDouble() * 100.0;
s = element.attribute("y2", "0%");
qreal yVector;
if (s.endsWith('%'))
yVector = s.remove('%').toDouble();
else
yVector = s.toDouble() * 100.0;
m_start = QPointF(xOrigin, yOrigin);
m_stop = QPointF(xVector, yVector);
} else {
m_start = QPointF(element.attribute("x1").toDouble(), element.attribute("y1").toDouble());
m_stop = QPointF(element.attribute("x2").toDouble(), element.attribute("y2").toDouble());
}
setType(QGradient::LinearGradient);
} else {
if (bbox) {
QString s;
s = element.attribute("cx", "50%");
qreal xOrigin;
if (s.endsWith('%'))
xOrigin = s.remove('%').toDouble();
else
xOrigin = s.toDouble() * 100.0;
s = element.attribute("cy", "50%");
qreal yOrigin;
if (s.endsWith('%'))
yOrigin = s.remove('%').toDouble();
else
yOrigin = s.toDouble() * 100.0;
s = element.attribute("cx", "50%");
qreal xVector;
if (s.endsWith('%'))
xVector = s.remove('%').toDouble();
else
xVector = s.toDouble() * 100.0;
s = element.attribute("r", "50%");
if (s.endsWith('%'))
xVector += s.remove('%').toDouble();
else
xVector += s.toDouble() * 100.0;
s = element.attribute("cy", "50%");
qreal yVector;
if (s.endsWith('%'))
yVector = s.remove('%').toDouble();
else
yVector = s.toDouble() * 100.0;
s = element.attribute("fx", "50%");
qreal xFocal;
if (s.endsWith('%'))
xFocal = s.remove('%').toDouble();
else
xFocal = s.toDouble() * 100.0;
s = element.attribute("fy", "50%");
qreal yFocal;
if (s.endsWith('%'))
yFocal = s.remove('%').toDouble();
else
yFocal = s.toDouble() * 100.0;
m_start = QPointF(xOrigin, yOrigin);
m_stop = QPointF(xVector, yVector);
m_focalPoint = QPointF(xFocal, yFocal);
} else {
m_start = QPointF(element.attribute("cx").toDouble(), element.attribute("cy").toDouble());
m_stop = QPointF(element.attribute("cx").toDouble() + element.attribute("r").toDouble(),
element.attribute("cy").toDouble());
m_focalPoint = QPointF(element.attribute("fx").toDouble(), element.attribute("fy").toDouble());
}
setType(QGradient::RadialGradient);
}
// handle spread method
QString spreadMethod = element.attribute("spreadMethod");
if (!spreadMethod.isEmpty()) {
if (spreadMethod == "reflect")
setSpread(QGradient::ReflectSpread);
else if (spreadMethod == "repeat")
setSpread(QGradient::RepeatSpread);
}
for (QDomNode n = element.firstChild(); !n.isNull(); n = n.nextSibling()) {
QDomElement colorstop = n.toElement();
if (colorstop.tagName() == "stop") {
qreal opacity = 0.0;
QColor c;
float off;
QString temp = colorstop.attribute("offset");
if (temp.contains('%')) {
temp = temp.left(temp.length() - 1);
off = temp.toFloat() / 100.0;
} else
off = temp.toFloat();
if (!colorstop.attribute("stop-color").isEmpty())
parseSvgColor(c, colorstop.attribute("stop-color"));
else {
// try style attr
QString style = colorstop.attribute("style").simplified();
QStringList substyles = style.split(';', QString::SkipEmptyParts);
Q_FOREACH (const QString & s, substyles) {
QStringList substyle = s.split(':');
QString command = substyle[0].trimmed();
QString params = substyle[1].trimmed();
if (command == "stop-color")
parseSvgColor(c, params);
if (command == "stop-opacity")
opacity = params.toDouble();
}
}
if (!colorstop.attribute("stop-opacity").isEmpty())
opacity = colorstop.attribute("stop-opacity").toDouble();
KoColor color(rgbColorSpace);
color.fromQColor(c);
color.setOpacity(static_cast<quint8>(opacity * OPACITY_OPAQUE_U8 + 0.5));
//According to the SVG spec each gradient offset has to be equal to or greater than the previous one
//if not it needs to be adjusted to be equal
if (m_stops.count() > 0 && m_stops.last().first >= off) {
off = m_stops.last().first;
}
m_stops.append(KoGradientStop(off, color));
}
}
}
void KoStopGradient::parseSvgColor(QColor &color, const QString &s)
{
if (s.startsWith("rgb(")) {
QString parse = s.trimmed();
QStringList colors = parse.split(',');
QString r = colors[0].right((colors[0].length() - 4));
QString g = colors[1];
QString b = colors[2].left((colors[2].length() - 1));
if (r.contains('%')) {
r = r.left(r.length() - 1);
r = QString::number(int((qreal(255 * r.toDouble()) / 100.0)));
}
if (g.contains('%')) {
g = g.left(g.length() - 1);
g = QString::number(int((qreal(255 * g.toDouble()) / 100.0)));
}
if (b.contains('%')) {
b = b.left(b.length() - 1);
b = QString::number(int((qreal(255 * b.toDouble()) / 100.0)));
}
color = QColor(r.toInt(), g.toInt(), b.toInt());
} else {
QString rgbColor = s.trimmed();
QColor c;
if (rgbColor.startsWith('#'))
c.setNamedColor(rgbColor);
else {
c = QColor(rgbColor);
}
color = c;
}
}
QString KoStopGradient::defaultFileExtension() const
{
return QString(".svg");
}
+void KoStopGradient::toXML(QDomDocument &doc, QDomElement &gradientElt) const
+{
+ gradientElt.setAttribute("type", "stop");
+ for (int s = 0; s<m_stops.size(); s++) {
+ KoGradientStop stop = m_stops.at(s);
+ QDomElement stopElt = doc.createElement("stop");
+ stopElt.setAttribute("offset", stop.first);
+ stopElt.setAttribute("bitdepth", stop.second.colorSpace()->colorDepthId().id());
+ stop.second.toXML(doc, stopElt);
+ gradientElt.appendChild(stopElt);
+ }
+}
+
+KoStopGradient KoStopGradient::fromXML(const QDomElement &elt)
+{
+ KoStopGradient gradient;
+ QList<KoGradientStop> stops;
+ QDomElement stopElt = elt.firstChildElement("stop");
+ while (!stopElt.isNull()) {
+ qreal offset = stopElt.attribute("offset", "0").toDouble();
+ QString bitDepth = stopElt.attribute("bitdepth", Integer8BitsColorDepthID.id());
+ KoColor color = KoColor::fromXML(stopElt.firstChildElement(), bitDepth);
+ stops.append(KoGradientStop(offset, color));
+ stopElt = stopElt.nextSiblingElement("stop");
+ }
+ gradient.setStops(stops);
+ return gradient;
+}
+
bool KoStopGradient::saveToDevice(QIODevice *dev) const
{
QTextStream stream(dev);
const QString spreadMethod[3] = {
QString("spreadMethod=\"pad\" "),
QString("spreadMethod=\"reflect\" "),
QString("spreadMethod=\"repeat\" ")
};
const QString indent = " ";
stream << "<svg>" << endl;
stream << indent;
stream << "<linearGradient id=\"" << name() << "\" ";
stream << "gradientUnits=\"objectBoundingBox\" ";
stream << spreadMethod[spread()];
stream << ">" << endl;
QColor color;
// color stops
Q_FOREACH (const KoGradientStop & stop, m_stops) {
stop.second.toQColor(&color);
stream << indent << indent;
stream << "<stop stop-color=\"";
stream << color.name();
stream << "\" offset=\"" << QString().setNum(stop.first);
stream << "\" stop-opacity=\"" << static_cast<float>(color.alpha()) / 255.0f << "\"" << " />" << endl;
}
stream << indent;
stream << "</linearGradient>" << endl;
stream << "</svg>" << endl;
KoResource::saveToDevice(dev);
return true;
}
diff --git a/libs/pigment/resources/KoStopGradient.h b/libs/pigment/resources/KoStopGradient.h
index 029ffb349e..5f67b3d480 100644
--- a/libs/pigment/resources/KoStopGradient.h
+++ b/libs/pigment/resources/KoStopGradient.h
@@ -1,82 +1,94 @@
/*
Copyright (c) 2007 Sven Langkamp <sven.langkamp@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef KOSTOPGRADIENT_H
#define KOSTOPGRADIENT_H
#include <QPair>
#include <QGradient>
#include "KoColor.h"
#include <resources/KoAbstractGradient.h>
#include <resources/KoResource.h>
#include <kritapigment_export.h>
typedef QPair<qreal, KoColor> KoGradientStop;
/**
* Resource for colorstop based gradients like Karbon gradients and SVG gradients
*/
class KRITAPIGMENT_EXPORT KoStopGradient : public KoAbstractGradient
{
public:
explicit KoStopGradient(const QString &filename = QString());
~KoStopGradient() override;
KoAbstractGradient* clone() const override;
bool load() override;
bool loadFromDevice(QIODevice *dev) override;
bool save() override;
bool saveToDevice(QIODevice* dev) const override;
/// reimplemented
QGradient* toQGradient() const override;
/// reimplemented
void colorAt(KoColor&, qreal t) const override;
/// Creates KoStopGradient from a QGradient
static KoStopGradient * fromQGradient(const QGradient * gradient);
/// Sets the gradient stops
void setStops(QList<KoGradientStop> stops);
QList<KoGradientStop> stops() const;
/// reimplemented
QString defaultFileExtension() const override;
+ /**
+ * @brief toXML
+ * Covert the gradient to an XML string.
+ */
+ void toXML(QDomDocument& doc, QDomElement& gradientElt) const;
+ /**
+ * @brief fromXML
+ * convert a gradient from xml.
+ * @return a gradient.
+ */
+ static KoStopGradient fromXML(const QDomElement& elt);
+
protected:
QList<KoGradientStop> m_stops;
QPointF m_start;
QPointF m_stop;
QPointF m_focalPoint;
private:
void loadKarbonGradient(QIODevice *file);
void parseKarbonGradient(const QDomElement& element);
void loadSvgGradient(QIODevice *file);
void parseSvgGradient(const QDomElement& element);
void parseSvgColor(QColor &color, const QString &s);
};
#endif // KOSTOPGRADIENT_H
diff --git a/libs/store/KoZipStore.cpp b/libs/store/KoZipStore.cpp
index 0d31da3c4d..1ae7be9cf7 100644
--- a/libs/store/KoZipStore.cpp
+++ b/libs/store/KoZipStore.cpp
@@ -1,273 +1,272 @@
/* This file is part of the KDE project
Copyright (C) 2000-2002 David Faure <faure@kde.org>
Copyright (C) 2010 C. Boemann <cbo@boemann.dk>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "KoZipStore.h"
#include "KoStore_p.h"
#include <QBuffer>
#include <QByteArray>
#include <QTemporaryFile>
#include <kzip.h>
#include <StoreDebug.h>
#include <QUrl>
class SaveZip : public KZip {
public:
SaveZip(const QString &filename) : KZip(filename) {}
SaveZip(QIODevice *dev) : KZip(dev) {}
~SaveZip() override {}
void resetDevice() {
closeArchive();
setDevice(0);
}
};
KoZipStore::KoZipStore(const QString & _filename, Mode mode, const QByteArray & appIdentification,
bool writeMimetype)
: KoStore(mode, writeMimetype)
{
// qDebug() << "KoZipStore Constructor filename =" << _filename
// << " mode = " << int(mode)
// << " mimetype = " << appIdentification;
Q_D(KoStore);
d->localFileName = _filename;
m_pZip = new SaveZip(_filename);
init(appIdentification); // open the zip file and init some vars
}
KoZipStore::KoZipStore(QIODevice *dev, Mode mode, const QByteArray & appIdentification,
bool writeMimetype)
: KoStore(mode, writeMimetype)
{
// qDebug() << "KoZipStore Constructor device =" << dev
// << " mode = " << int(mode)
// << " mimetype = " << appIdentification;
m_pZip = new SaveZip(dev);
init(appIdentification);
}
KoZipStore::KoZipStore(QWidget* window, const QUrl &_url, const QString & _filename, Mode mode,
const QByteArray & appIdentification, bool writeMimetype)
: KoStore(mode, writeMimetype)
{
debugStore << "KoZipStore Constructor url" << _url.url(QUrl::PreferLocalFile)
<< " filename = " << _filename
<< " mode = " << int(mode)
<< " mimetype = " << appIdentification;
Q_D(KoStore);
d->url = _url;
d->window = window;
if (mode == KoStore::Read) {
d->localFileName = _filename;
} else {
QTemporaryFile f("kozip");
f.open();
d->localFileName = f.fileName();
f.close();
}
m_pZip = new SaveZip(d->localFileName);
init(appIdentification); // open the zip file and init some vars
}
KoZipStore::~KoZipStore()
{
Q_D(KoStore);
- bool sf = false;
- if (m_pZip && m_pZip->device()) {
- sf = true;
- }
-
+// bool sf = false;
+// if (m_pZip && m_pZip->device()) {
+// sf = true;
+// }
// qDebug() << "KoZipStore::~KoZipStore" << d->localFileName << m_pZip << m_pZip->device() << "savefile" << sf;
if (m_pZip->device() && m_pZip->device()->inherits("QSaveFile")) {
m_pZip->resetDevice(); // otherwise, kzip's destructor will call close(), which aborts on a qsavefile
}
else {
if (!d->finalized) {
finalize(); // ### no error checking when the app forgot to call finalize itself
}
}
delete m_pZip;
// When writing, we write to a temp file that then gets copied over the original filename
if (d->mode == Write && (!d->localFileName.isEmpty() && !d->url.isEmpty())) {
QFile f(d->localFileName);
if (f.copy(d->url.toLocalFile())) {
f.remove();
}
}
}
void KoZipStore::init(const QByteArray& appIdentification)
{
Q_D(KoStore);
m_currentDir = 0;
d->good = m_pZip->open(d->mode == Write ? QIODevice::WriteOnly : QIODevice::ReadOnly);
if (!d->good)
return;
if (d->mode == Write) {
//debugStore <<"KoZipStore::init writing mimetype" << appIdentification;
m_pZip->setCompression(KZip::NoCompression);
m_pZip->setExtraField(KZip::NoExtraField);
// Write identification
if (d->writeMimetype) {
(void)m_pZip->writeFile(QLatin1String("mimetype"), appIdentification);
}
m_pZip->setCompression(KZip::DeflateCompression);
// We don't need the extra field in Krita - so we leave it as "no extra field".
} else {
d->good = m_pZip->directory() != 0;
}
}
void KoZipStore::setCompressionEnabled(bool e)
{
if (e) {
m_pZip->setCompression(KZip::DeflateCompression);
} else {
m_pZip->setCompression(KZip::NoCompression);
}
}
bool KoZipStore::doFinalize()
{
if (m_pZip && m_pZip->device() && !m_pZip->device()->inherits("QSaveFile")) {
return m_pZip->close();
}
else {
return true;
}
}
bool KoZipStore::openWrite(const QString& name)
{
Q_D(KoStore);
d->stream = 0; // Don't use!
return m_pZip->prepareWriting(name, "", "" /*m_pZip->rootDir()->user(), m_pZip->rootDir()->group()*/, 0);
}
bool KoZipStore::openRead(const QString& name)
{
Q_D(KoStore);
const KArchiveEntry * entry = m_pZip->directory()->entry(name);
if (entry == 0) {
return false;
}
if (entry->isDirectory()) {
warnStore << name << " is a directory !";
return false;
}
// Must cast to KZipFileEntry, not only KArchiveFile, because device() isn't virtual!
const KZipFileEntry * f = static_cast<const KZipFileEntry *>(entry);
delete d->stream;
d->stream = f->createDevice();
d->size = f->size();
return true;
}
qint64 KoZipStore::write(const char* _data, qint64 _len)
{
Q_D(KoStore);
if (_len == 0) return 0;
//debugStore <<"KoZipStore::write" << _len;
if (!d->isOpen) {
errorStore << "KoStore: You must open before writing" << endl;
return 0;
}
if (d->mode != Write) {
errorStore << "KoStore: Can not write to store that is opened for reading" << endl;
return 0;
}
d->size += _len;
if (m_pZip->writeData(_data, _len)) // writeData returns a bool!
return _len;
return 0;
}
QStringList KoZipStore::directoryList() const
{
QStringList retval;
const KArchiveDirectory *directory = m_pZip->directory();
Q_FOREACH (const QString &name, directory->entries()) {
const KArchiveEntry* fileArchiveEntry = m_pZip->directory()->entry(name);
if (fileArchiveEntry->isDirectory()) {
retval << name;
}
}
return retval;
}
bool KoZipStore::closeWrite()
{
Q_D(KoStore);
debugStore << "Wrote file" << d->fileName << " into ZIP archive. size" << d->size;
return m_pZip->finishWriting(d->size);
}
bool KoZipStore::enterRelativeDirectory(const QString& dirName)
{
Q_D(KoStore);
if (d->mode == Read) {
if (!m_currentDir) {
m_currentDir = m_pZip->directory(); // initialize
Q_ASSERT(d->currentPath.isEmpty());
}
const KArchiveEntry *entry = m_currentDir->entry(dirName);
if (entry && entry->isDirectory()) {
m_currentDir = dynamic_cast<const KArchiveDirectory*>(entry);
return m_currentDir != 0;
}
return false;
} else // Write, no checking here
return true;
}
bool KoZipStore::enterAbsoluteDirectory(const QString& path)
{
if (path.isEmpty()) {
m_currentDir = 0;
return true;
}
m_currentDir = dynamic_cast<const KArchiveDirectory*>(m_pZip->directory()->entry(path));
Q_ASSERT(m_currentDir);
return m_currentDir != 0;
}
bool KoZipStore::fileExists(const QString& absPath) const
{
const KArchiveEntry *entry = m_pZip->directory()->entry(absPath);
return entry && entry->isFile();
}
diff --git a/libs/ui/KisMainWindow.cpp b/libs/ui/KisMainWindow.cpp
index 47a3d6f522..f25f9cadc1 100644
--- a/libs/ui/KisMainWindow.cpp
+++ b/libs/ui/KisMainWindow.cpp
@@ -1,2491 +1,2516 @@
/* This file is part of the KDE project
Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
Copyright (C) 2000-2006 David Faure <faure@kde.org>
Copyright (C) 2007, 2009 Thomas zander <zander@kde.org>
Copyright (C) 2010 Benjamin Port <port.benjamin@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "KisMainWindow.h"
#include <KoConfig.h>
// qt includes
#include <QApplication>
#include <QByteArray>
#include <QCloseEvent>
#include <QDesktopServices>
#include <QDesktopWidget>
#include <QDialog>
#include <QDockWidget>
#include <QIcon>
#include <QInputDialog>
#include <QLabel>
#include <QLayout>
#include <QMdiArea>
#include <QMdiSubWindow>
#include <QMutex>
#include <QMutexLocker>
#include <QPointer>
#include <QPrintDialog>
#include <QPrinter>
#include <QPrintPreviewDialog>
#include <QProgressBar>
#include <QToolButton>
#include <QSignalMapper>
#include <QTabBar>
#include <QMoveEvent>
#include <QUrl>
#include <QMessageBox>
#include <QTemporaryFile>
#include <QStatusBar>
#include <QMenu>
#include <QMenuBar>
#include <KisMimeDatabase.h>
#include <QMimeData>
#include <kactioncollection.h>
#include <QAction>
#include <kactionmenu.h>
#include <kis_debug.h>
#include <kedittoolbar.h>
#include <khelpmenu.h>
#include <klocalizedstring.h>
#include <kaboutdata.h>
#include <kis_workspace_resource.h>
#ifdef HAVE_KIO
#include <krecentdocument.h>
#endif
#include <krecentfilesaction.h>
#include <KoResourcePaths.h>
#include <ktoggleaction.h>
#include <ktoolbar.h>
#include <kmainwindow.h>
#include <kxmlguiwindow.h>
#include <kxmlguifactory.h>
#include <kxmlguiclient.h>
#include <kguiitem.h>
#include <kwindowconfig.h>
#include "KoDockFactoryBase.h"
#include "KoDockWidgetTitleBar.h"
#include "KoDocumentInfoDlg.h"
#include "KoDocumentInfo.h"
#include "KoFileDialog.h"
#include <kis_icon.h>
#include <KoPageLayoutDialog.h>
#include <KoPageLayoutWidget.h>
#include <KoToolManager.h>
#include <KoZoomController.h>
#include "KoToolDocker.h"
#include <KoToolBoxFactory.h>
#include <KoDockRegistry.h>
#include <KoPluginLoader.h>
#include <KoColorSpaceEngine.h>
#include <KoResourceModel.h>
#include <KisMimeDatabase.h>
#include <brushengine/kis_paintop_settings.h>
#include "dialogs/kis_about_application.h"
#include "dialogs/kis_delayed_save_dialog.h"
#include "dialogs/kis_dlg_preferences.h"
#include "kis_action.h"
#include "kis_action_manager.h"
#include "KisApplication.h"
#include "kis_canvas2.h"
#include "kis_canvas_controller.h"
#include "kis_canvas_resource_provider.h"
#include "kis_clipboard.h"
#include "kis_config.h"
#include "kis_config_notifier.h"
#include "kis_custom_image_widget.h"
#include <KisDocument.h>
#include "KisDocument.h"
#include "KisDocument.h"
#include "kis_group_layer.h"
#include "kis_icon_utils.h"
#include "kis_image_from_clipboard_widget.h"
#include "kis_image.h"
#include <KisImportExportFilter.h>
#include "KisImportExportManager.h"
#include "kis_mainwindow_observer.h"
#include "kis_node.h"
#include "KisOpenPane.h"
#include "kis_paintop_box.h"
#include "KisPart.h"
#include "KisPrintJob.h"
#include "kis_resource_server_provider.h"
#include "kis_signal_compressor_with_param.h"
#include "KisView.h"
#include "KisViewManager.h"
#include "thememanager.h"
#include "kis_animation_importer.h"
#include "dialogs/kis_dlg_import_image_sequence.h"
#include "kis_animation_exporter.h"
#include <mutex>
#ifdef Q_OS_WIN
#include <QtPlatformHeaders/QWindowsWindowFunctions>
#endif
class ToolDockerFactory : public KoDockFactoryBase
{
public:
ToolDockerFactory() : KoDockFactoryBase() { }
QString id() const override {
return "sharedtooldocker";
}
QDockWidget* createDockWidget() override {
KoToolDocker* dockWidget = new KoToolDocker();
dockWidget->setTabEnabled(false);
return dockWidget;
}
DockPosition defaultDockPosition() const override {
return DockRight;
}
};
class Q_DECL_HIDDEN KisMainWindow::Private
{
public:
Private(KisMainWindow *parent)
: q(parent)
, dockWidgetMenu(new KActionMenu(i18nc("@action:inmenu", "&Dockers"), parent))
, windowMenu(new KActionMenu(i18nc("@action:inmenu", "&Window"), parent))
, documentMenu(new KActionMenu(i18nc("@action:inmenu", "New &View"), parent))
, workspaceMenu(new KActionMenu(i18nc("@action:inmenu", "Wor&kspace"), parent))
, mdiArea(new QMdiArea(parent))
, windowMapper(new QSignalMapper(parent))
, documentMapper(new QSignalMapper(parent))
{
}
~Private() {
qDeleteAll(toolbarList);
}
KisMainWindow *q {0};
KisViewManager *viewManager {0};
QPointer<KisView> activeView;
QPointer<QProgressBar> progress;
QPointer<QToolButton> progressCancel;
QMutex progressMutex;
QList<QAction *> toolbarList;
bool firstTime {true};
bool windowSizeDirty {false};
bool readOnly {false};
bool isImporting {false};
bool isExporting {false};
bool noCleanup {false};
KisAction *showDocumentInfo {0};
KisAction *saveAction {0};
KisAction *saveActionAs {0};
// KisAction *printAction;
// KisAction *printActionPreview;
// KisAction *exportPdf {0};
KisAction *importAnimation {0};
KisAction *closeAll {0};
// KisAction *reloadFile;
KisAction *importFile {0};
KisAction *exportFile {0};
KisAction *undo {0};
KisAction *redo {0};
KisAction *newWindow {0};
KisAction *close {0};
KisAction *mdiCascade {0};
KisAction *mdiTile {0};
KisAction *mdiNextWindow {0};
KisAction *mdiPreviousWindow {0};
KisAction *toggleDockers {0};
KisAction *toggleDockerTitleBars {0};
KisAction *expandingSpacers[2];
KActionMenu *dockWidgetMenu;
KActionMenu *windowMenu;
KActionMenu *documentMenu;
KActionMenu *workspaceMenu;
KHelpMenu *helpMenu {0};
KRecentFilesAction *recentFiles {0};
KoResourceModel *workspacemodel {0};
QString lastExportLocation;
QMap<QString, QDockWidget *> dockWidgetsMap;
QMap<QDockWidget *, bool> dockWidgetVisibilityMap;
QByteArray dockerStateBeforeHiding;
KoToolDocker *toolOptionsDocker {0};
QCloseEvent *deferredClosingEvent {0};
Digikam::ThemeManager *themeManager {0};
QMdiArea *mdiArea;
QMdiSubWindow *activeSubWindow {0};
QSignalMapper *windowMapper;
QSignalMapper *documentMapper;
QByteArray lastExportedFormat;
QScopedPointer<KisSignalCompressorWithParam<int> > tabSwitchCompressor;
QMutex savingEntryMutex;
KisActionManager * actionManager() {
return viewManager->actionManager();
}
QTabBar* findTabBarHACK() {
QObjectList objects = mdiArea->children();
Q_FOREACH (QObject *object, objects) {
QTabBar *bar = qobject_cast<QTabBar*>(object);
if (bar) {
return bar;
}
}
return 0;
}
};
KisMainWindow::KisMainWindow()
: KXmlGuiWindow()
, d(new Private(this))
{
auto rserver = KisResourceServerProvider::instance()->workspaceServer(false);
QSharedPointer<KoAbstractResourceServerAdapter> adapter(new KoResourceServerAdapter<KisWorkspaceResource>(rserver));
d->workspacemodel = new KoResourceModel(adapter, this);
connect(d->workspacemodel, &KoResourceModel::afterResourcesLayoutReset, this, [&]() { updateWindowMenu(); });
KisConfig cfg;
d->viewManager = new KisViewManager(this, actionCollection());
KConfigGroup group( KSharedConfig::openConfig(), "theme");
d->themeManager = new Digikam::ThemeManager(group.readEntry("Theme", "Krita dark"), this);
setAcceptDrops(true);
setStandardToolBarMenuEnabled(true);
setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North);
setDockNestingEnabled(true);
qApp->setStartDragDistance(25); // 25 px is a distance that works well for Tablet and Mouse events
#ifdef Q_OS_OSX
setUnifiedTitleAndToolBarOnMac(true);
#endif
connect(this, SIGNAL(restoringDone()), this, SLOT(forceDockTabFonts()));
connect(this, SIGNAL(themeChanged()), d->viewManager, SLOT(updateIcons()));
connect(KisPart::instance(), SIGNAL(documentClosed(QString)), SLOT(updateWindowMenu()));
connect(KisPart::instance(), SIGNAL(documentOpened(QString)), SLOT(updateWindowMenu()));
connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), this, SLOT(configChanged()));
actionCollection()->addAssociatedWidget(this);
KoPluginLoader::instance()->load("Krita/ViewPlugin", "Type == 'Service' and ([X-Krita-Version] == 28)", KoPluginLoader::PluginsConfig(), d->viewManager);
KoToolBoxFactory toolBoxFactory;
QDockWidget *toolbox = createDockWidget(&toolBoxFactory);
toolbox->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetClosable);
if (cfg.toolOptionsInDocker()) {
ToolDockerFactory toolDockerFactory;
d->toolOptionsDocker = qobject_cast<KoToolDocker*>(createDockWidget(&toolDockerFactory));
d->toolOptionsDocker->toggleViewAction()->setEnabled(true);
}
QMap<QString, QAction*> dockwidgetActions;
dockwidgetActions[toolbox->toggleViewAction()->text()] = toolbox->toggleViewAction();
Q_FOREACH (const QString & docker, KoDockRegistry::instance()->keys()) {
KoDockFactoryBase *factory = KoDockRegistry::instance()->value(docker);
QDockWidget *dw = createDockWidget(factory);
dockwidgetActions[dw->toggleViewAction()->text()] = dw->toggleViewAction();
}
if (d->toolOptionsDocker) {
dockwidgetActions[d->toolOptionsDocker->toggleViewAction()->text()] = d->toolOptionsDocker->toggleViewAction();
}
connect(KoToolManager::instance(), SIGNAL(toolOptionWidgetsChanged(KoCanvasController*, QList<QPointer<QWidget> >)), this, SLOT(newOptionWidgets(KoCanvasController*, QList<QPointer<QWidget> >)));
Q_FOREACH (QString title, dockwidgetActions.keys()) {
d->dockWidgetMenu->addAction(dockwidgetActions[title]);
}
Q_FOREACH (QDockWidget *wdg, dockWidgets()) {
if ((wdg->features() & QDockWidget::DockWidgetClosable) == 0) {
wdg->setVisible(true);
}
}
Q_FOREACH (KoCanvasObserverBase* observer, canvasObservers()) {
observer->setObservedCanvas(0);
KisMainwindowObserver* mainwindowObserver = dynamic_cast<KisMainwindowObserver*>(observer);
if (mainwindowObserver) {
mainwindowObserver->setMainWindow(d->viewManager);
}
}
d->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
d->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
d->mdiArea->setTabPosition(QTabWidget::North);
d->mdiArea->setTabsClosable(true);
setCentralWidget(d->mdiArea);
connect(d->mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(subWindowActivated()));
connect(d->windowMapper, SIGNAL(mapped(QWidget*)), this, SLOT(setActiveSubWindow(QWidget*)));
connect(d->documentMapper, SIGNAL(mapped(QObject*)), this, SLOT(newView(QObject*)));
createActions();
setAutoSaveSettings("krita", false);
subWindowActivated();
updateWindowMenu();
if (isHelpMenuEnabled() && !d->helpMenu) {
// workaround for KHelpMenu (or rather KAboutData::applicationData()) internally
// not using the Q*Application metadata ATM, which results e.g. in the bugreport wizard
// not having the app version preset
// fixed hopefully in KF5 5.22.0, patch pending
QGuiApplication *app = qApp;
KAboutData aboutData(app->applicationName(), app->applicationDisplayName(), app->applicationVersion());
aboutData.setOrganizationDomain(app->organizationDomain().toUtf8());
d->helpMenu = new KHelpMenu(this, aboutData, false);
// workaround-less version:
// d->helpMenu = new KHelpMenu(this, QString()/*unused*/, false);
// The difference between using KActionCollection->addAction() is that
// these actions do not get tied to the MainWindow. What does this all do?
KActionCollection *actions = d->viewManager->actionCollection();
QAction *helpContentsAction = d->helpMenu->action(KHelpMenu::menuHelpContents);
QAction *whatsThisAction = d->helpMenu->action(KHelpMenu::menuWhatsThis);
QAction *reportBugAction = d->helpMenu->action(KHelpMenu::menuReportBug);
QAction *switchLanguageAction = d->helpMenu->action(KHelpMenu::menuSwitchLanguage);
QAction *aboutAppAction = d->helpMenu->action(KHelpMenu::menuAboutApp);
QAction *aboutKdeAction = d->helpMenu->action(KHelpMenu::menuAboutKDE);
if (helpContentsAction) {
actions->addAction(helpContentsAction->objectName(), helpContentsAction);
}
if (whatsThisAction) {
actions->addAction(whatsThisAction->objectName(), whatsThisAction);
}
if (reportBugAction) {
actions->addAction(reportBugAction->objectName(), reportBugAction);
}
if (switchLanguageAction) {
actions->addAction(switchLanguageAction->objectName(), switchLanguageAction);
}
if (aboutAppAction) {
actions->addAction(aboutAppAction->objectName(), aboutAppAction);
}
if (aboutKdeAction) {
actions->addAction(aboutKdeAction->objectName(), aboutKdeAction);
}
connect(d->helpMenu, SIGNAL(showAboutApplication()), SLOT(showAboutApplication()));
}
// KDE' libs 4''s help contents action is broken outside kde, for some reason... We can handle it just as easily ourselves
QAction *helpAction = actionCollection()->action("help_contents");
helpAction->disconnect();
connect(helpAction, SIGNAL(triggered()), this, SLOT(showManual()));
#if 0
//check for colliding shortcuts
QSet<QKeySequence> existingShortcuts;
Q_FOREACH (QAction* action, actionCollection()->actions()) {
if(action->shortcut() == QKeySequence(0)) {
continue;
}
dbgKrita << "shortcut " << action->text() << " " << action->shortcut();
Q_ASSERT(!existingShortcuts.contains(action->shortcut()));
existingShortcuts.insert(action->shortcut());
}
#endif
configChanged();
// If we have customized the toolbars, load that first
setLocalXMLFile(KoResourcePaths::locateLocal("data", "krita.xmlgui"));
setXMLFile(":/kxmlgui5/krita.xmlgui");
guiFactory()->addClient(this);
// Create and plug toolbar list for Settings menu
QList<QAction *> toolbarList;
Q_FOREACH (QWidget* it, guiFactory()->containers("ToolBar")) {
KToolBar * toolBar = ::qobject_cast<KToolBar *>(it);
if (toolBar) {
if (toolBar->objectName() == "BrushesAndStuff") {
toolBar->setEnabled(false);
}
KToggleAction* act = new KToggleAction(i18n("Show %1 Toolbar", toolBar->windowTitle()), this);
actionCollection()->addAction(toolBar->objectName().toUtf8(), act);
act->setCheckedState(KGuiItem(i18n("Hide %1 Toolbar", toolBar->windowTitle())));
connect(act, SIGNAL(toggled(bool)), this, SLOT(slotToolbarToggled(bool)));
act->setChecked(!toolBar->isHidden());
toolbarList.append(act);
} else
warnUI << "Toolbar list contains a " << it->metaObject()->className() << " which is not a toolbar!";
}
plugActionList("toolbarlist", toolbarList);
setToolbarList(toolbarList);
applyToolBarLayout();
d->viewManager->updateGUI();
d->viewManager->updateIcons();
#ifdef Q_OS_WIN
auto w = qApp->activeWindow();
if (w) QWindowsWindowFunctions::setHasBorderInFullScreen(w->windowHandle(), true);
#endif
QTimer::singleShot(1000, this, SLOT(checkSanity()));
{
using namespace std::placeholders; // For _1 placeholder
std::function<void (int)> callback(
std::bind(&KisMainWindow::switchTab, this, _1));
d->tabSwitchCompressor.reset(
new KisSignalCompressorWithParam<int>(500, callback, KisSignalCompressor::FIRST_INACTIVE));
}
}
void KisMainWindow::setNoCleanup(bool noCleanup)
{
d->noCleanup = noCleanup;
}
KisMainWindow::~KisMainWindow()
{
// Q_FOREACH (QAction *ac, actionCollection()->actions()) {
// QAction *action = qobject_cast<QAction*>(ac);
// if (action) {
// dbgKrita << "<Action"
// << "name=" << action->objectName()
// << "icon=" << action->icon().name()
// << "text=" << action->text().replace("&", "&amp;")
// << "whatsThis=" << action->whatsThis()
// << "toolTip=" << action->toolTip().replace("<html>", "").replace("</html>", "")
// << "iconText=" << action->iconText().replace("&", "&amp;")
// << "shortcut=" << action->shortcut(QAction::ActiveShortcut).toString()
// << "defaultShortcut=" << action->shortcut(QAction::DefaultShortcut).toString()
// << "isCheckable=" << QString((action->isChecked() ? "true" : "false"))
// << "statusTip=" << action->statusTip()
// << "/>" ;
// }
// else {
// dbgKrita << "Got a QAction:" << ac->objectName();
// }
// }
// The doc and view might still exist (this is the case when closing the window)
KisPart::instance()->removeMainWindow(this);
if (d->noCleanup)
return;
delete d->viewManager;
delete d;
}
void KisMainWindow::addView(KisView *view)
{
if (d->activeView == view) return;
if (d->activeView) {
d->activeView->disconnect(this);
}
showView(view);
updateCaption();
emit restoringDone();
if (d->activeView) {
connect(d->activeView, SIGNAL(titleModified(QString,bool)), SLOT(slotDocumentTitleModified(QString,bool)));
}
}
void KisMainWindow::showView(KisView *imageView)
{
if (imageView && activeView() != imageView) {
// XXX: find a better way to initialize this!
imageView->setViewManager(d->viewManager);
imageView->canvasBase()->setFavoriteResourceManager(d->viewManager->paintOpBox()->favoriteResourcesManager());
imageView->slotLoadingFinished();
QMdiSubWindow *subwin = d->mdiArea->addSubWindow(imageView);
subwin->setAttribute(Qt::WA_DeleteOnClose, true);
connect(subwin, SIGNAL(destroyed()), SLOT(updateWindowMenu()));
KisConfig cfg;
subwin->setOption(QMdiSubWindow::RubberBandMove, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
subwin->setOption(QMdiSubWindow::RubberBandResize, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
subwin->setWindowIcon(qApp->windowIcon());
/**
* Hack alert!
*
* Here we explicitly request KoToolManager to emit all the tool
* activation signals, to reinitialize the tool options docker.
*
* That is needed due to a design flaw we have in the
* initialization procedure. The tool in the KoToolManager is
* initialized in KisView::setViewManager() calls, which
* happens early enough. During this call the tool manager
* requests KoCanvasControllerWidget to emit the signal to
* update the widgets in the tool docker. *But* at that moment
* of time the view is not yet connected to the main window,
* because it happens in KisViewManager::setCurrentView a bit
* later. This fact makes the widgets updating signals be lost
* and never reach the tool docker.
*
* So here we just explicitly call the tool activation stub.
*/
KoToolManager::instance()->initializeCurrentToolForCanvas();
if (d->mdiArea->subWindowList().size() == 1) {
imageView->showMaximized();
}
else {
imageView->show();
}
// No, no, no: do not try to call this _before_ the show() has
// been called on the view; only when that has happened is the
// opengl context active, and very bad things happen if we tell
// the dockers to update themselves with a view if the opengl
// context is not active.
setActiveView(imageView);
updateWindowMenu();
updateCaption();
}
}
void KisMainWindow::slotPreferences()
{
if (KisDlgPreferences::editPreferences()) {
KisConfigNotifier::instance()->notifyConfigChanged();
// XXX: should this be changed for the views in other windows as well?
Q_FOREACH (QPointer<KisView> koview, KisPart::instance()->views()) {
KisViewManager *view = qobject_cast<KisViewManager*>(koview);
if (view) {
// Update the settings for all nodes -- they don't query
// KisConfig directly because they need the settings during
// compositing, and they don't connect to the config notifier
// because nodes are not QObjects (because only one base class
// can be a QObject).
KisNode* node = dynamic_cast<KisNode*>(view->image()->rootLayer().data());
node->updateSettings();
}
}
d->viewManager->showHideScrollbars();
}
}
void KisMainWindow::slotThemeChanged()
{
// save theme changes instantly
KConfigGroup group( KSharedConfig::openConfig(), "theme");
group.writeEntry("Theme", d->themeManager->currentThemeName());
// reload action icons!
Q_FOREACH (QAction *action, actionCollection()->actions()) {
KisIconUtils::updateIcon(action);
}
emit themeChanged();
}
void KisMainWindow::updateReloadFileAction(KisDocument *doc)
{
Q_UNUSED(doc);
// d->reloadFile->setEnabled(doc && !doc->url().isEmpty());
}
void KisMainWindow::setReadWrite(bool readwrite)
{
d->saveAction->setEnabled(readwrite);
d->importFile->setEnabled(readwrite);
d->readOnly = !readwrite;
updateCaption();
}
void KisMainWindow::addRecentURL(const QUrl &url)
{
dbgUI << "KisMainWindow::addRecentURL url=" << url.toDisplayString();
// Add entry to recent documents list
// (call coming from KisDocument because it must work with cmd line, template dlg, file/open, etc.)
if (!url.isEmpty()) {
bool ok = true;
if (url.isLocalFile()) {
QString path = url.adjusted(QUrl::StripTrailingSlash).toLocalFile();
const QStringList tmpDirs = KoResourcePaths::resourceDirs("tmp");
for (QStringList::ConstIterator it = tmpDirs.begin() ; ok && it != tmpDirs.end() ; ++it)
if (path.contains(*it))
ok = false; // it's in the tmp resource
#ifdef HAVE_KIO
if (ok) {
KRecentDocument::add(QUrl::fromLocalFile(path));
}
#endif
}
#ifdef HAVE_KIO
else {
KRecentDocument::add(url.adjusted(QUrl::StripTrailingSlash));
}
#endif
if (ok) {
d->recentFiles->addUrl(url);
}
saveRecentFiles();
}
}
void KisMainWindow::saveRecentFiles()
{
// Save list of recent files
KSharedConfigPtr config = KSharedConfig::openConfig();
d->recentFiles->saveEntries(config->group("RecentFiles"));
config->sync();
// Tell all windows to reload their list, after saving
// Doesn't work multi-process, but it's a start
Q_FOREACH (KMainWindow* window, KMainWindow::memberList())
static_cast<KisMainWindow *>(window)->reloadRecentFileList();
}
void KisMainWindow::reloadRecentFileList()
{
d->recentFiles->loadEntries( KSharedConfig::openConfig()->group("RecentFiles"));
}
void KisMainWindow::updateCaption()
{
if (!d->mdiArea->activeSubWindow()) {
updateCaption(QString(), false);
}
else if (d->activeView && d->activeView->document()){
QString caption( d->activeView->document()->caption() );
if (d->readOnly) {
caption += ' ' + i18n("(write protected)");
}
d->activeView->setWindowTitle(caption);
updateCaption(caption, d->activeView->document()->isModified());
if (!d->activeView->document()->url().fileName().isEmpty())
d->saveAction->setToolTip(i18n("Save as %1", d->activeView->document()->url().fileName()));
else
d->saveAction->setToolTip(i18n("Save"));
}
}
void KisMainWindow::updateCaption(const QString & caption, bool mod)
{
dbgUI << "KisMainWindow::updateCaption(" << caption << "," << mod << ")";
#ifdef KRITA_ALPHA
setCaption(QString("ALPHA %1: %2").arg(KRITA_ALPHA).arg(caption), mod);
return;
#endif
#ifdef KRITA_BETA
setCaption(QString("BETA %1: %2").arg(KRITA_BETA).arg(caption), mod);
return;
#endif
#ifdef KRITA_RC
setCaption(QString("RELEASE CANDIDATE %1: %2").arg(KRITA_RC).arg(caption), mod);
return;
#endif
setCaption(caption, mod);
}
KisView *KisMainWindow::activeView() const
{
if (d->activeView) {
return d->activeView;
}
return 0;
}
bool KisMainWindow::openDocument(const QUrl &url)
{
if (!QFile(url.toLocalFile()).exists()) {
QMessageBox::critical(0, i18nc("@title:window", "Krita"), i18n("The file %1 does not exist.", url.url()));
d->recentFiles->removeUrl(url); //remove the file from the recent-opened-file-list
saveRecentFiles();
return false;
}
return openDocumentInternal(url);
}
bool KisMainWindow::openDocumentInternal(const QUrl &url, KisDocument *newdoc)
{
if (!url.isLocalFile()) {
qWarning() << "KisMainWindow::openDocumentInternal. Not a local file:" << url;
return false;
}
if (!newdoc) {
newdoc = KisPart::instance()->createDocument();
}
d->firstTime = true;
connect(newdoc, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
connect(newdoc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
connect(newdoc, SIGNAL(canceled(const QString &)), this, SLOT(slotLoadCanceled(const QString &)));
bool openRet = (!d->isImporting) ? newdoc->openUrl(url) : newdoc->importDocument(url);
if (!openRet) {
delete newdoc;
return false;
}
KisPart::instance()->addDocument(newdoc);
updateReloadFileAction(newdoc);
if (!QFileInfo(url.toLocalFile()).isWritable()) {
setReadWrite(false);
}
return true;
}
void KisMainWindow::addViewAndNotifyLoadingCompleted(KisDocument *document)
{
KisView *view = KisPart::instance()->createView(document, resourceManager(), actionCollection(), this);
addView(view);
emit guiLoadingFinished();
}
QStringList KisMainWindow::showOpenFileDialog()
{
KoFileDialog dialog(this, KoFileDialog::ImportFiles, "OpenDocument");
dialog.setDefaultDir(QDesktopServices::storageLocation(QDesktopServices::PicturesLocation));
dialog.setMimeTypeFilters(KisImportExportManager::mimeFilter(KisImportExportManager::Import));
dialog.setCaption(d->isImporting ? i18n("Import Images") : i18n("Open Images"));
return dialog.filenames();
}
// Separate from openDocument to handle async loading (remote URLs)
void KisMainWindow::slotLoadCompleted()
{
KisDocument *newdoc = qobject_cast<KisDocument*>(sender());
if (newdoc && newdoc->image()) {
addViewAndNotifyLoadingCompleted(newdoc);
disconnect(newdoc, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
disconnect(newdoc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
disconnect(newdoc, SIGNAL(canceled(const QString &)), this, SLOT(slotLoadCanceled(const QString &)));
emit loadCompleted();
}
}
void KisMainWindow::slotLoadCanceled(const QString & errMsg)
{
dbgUI << "KisMainWindow::slotLoadCanceled";
if (!errMsg.isEmpty()) // empty when canceled by user
QMessageBox::critical(this, i18nc("@title:window", "Krita"), errMsg);
// ... can't delete the document, it's the one who emitted the signal...
KisDocument* doc = qobject_cast<KisDocument*>(sender());
Q_ASSERT(doc);
disconnect(doc, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
disconnect(doc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
disconnect(doc, SIGNAL(canceled(const QString &)), this, SLOT(slotLoadCanceled(const QString &)));
}
void KisMainWindow::slotSaveCanceled(const QString &errMsg)
{
dbgUI << "KisMainWindow::slotSaveCanceled";
if (!errMsg.isEmpty()) // empty when canceled by user
QMessageBox::critical(this, i18nc("@title:window", "Krita"), errMsg);
slotSaveCompleted();
}
void KisMainWindow::slotSaveCompleted()
{
dbgUI << "KisMainWindow::slotSaveCompleted";
KisDocument* doc = qobject_cast<KisDocument*>(sender());
Q_ASSERT(doc);
disconnect(doc, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
disconnect(doc, SIGNAL(completed()), this, SLOT(slotSaveCompleted()));
disconnect(doc, SIGNAL(canceled(const QString &)), this, SLOT(slotSaveCanceled(const QString &)));
if (d->deferredClosingEvent) {
KXmlGuiWindow::closeEvent(d->deferredClosingEvent);
}
}
bool KisMainWindow::hackIsSaving() const
{
StdLockableWrapper<QMutex> wrapper(&d->savingEntryMutex);
std::unique_lock<StdLockableWrapper<QMutex>> l(wrapper, std::try_to_lock);
return !l.owns_lock();
}
bool KisMainWindow::saveDocument(KisDocument *document, bool saveas)
{
if (!document) {
return true;
}
/**
* Make sure that we cannot enter this method twice!
*
* The lower level functions may call processEvents() so
* double-entry is quite possible to achieve. Here we try to lock
* the mutex, and if it is failed, just cancel saving.
*/
StdLockableWrapper<QMutex> wrapper(&d->savingEntryMutex);
std::unique_lock<StdLockableWrapper<QMutex>> l(wrapper, std::try_to_lock);
if (!l.owns_lock()) return false;
// no busy wait for saving because it is dangerous!
KisDelayedSaveDialog dlg(document->image(), KisDelayedSaveDialog::SaveDialog, 0, this);
dlg.blockIfImageIsBusy();
if (dlg.result() == KisDelayedSaveDialog::Rejected) {
return false;
}
else if (dlg.result() == KisDelayedSaveDialog::Ignored) {
QMessageBox::critical(0,
i18nc("@title:window", "Krita"),
i18n("You are saving a file while the image is "
"still rendering. The saved file may be "
"incomplete or corrupted.\n\n"
"Please select a location where the original "
"file will not be overridden!"));
saveas = true;
}
bool reset_url;
if (document->url().isEmpty()) {
reset_url = true;
saveas = true;
}
else {
reset_url = false;
}
connect(document, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
connect(document, SIGNAL(completed()), this, SLOT(slotSaveCompleted()));
connect(document, SIGNAL(canceled(const QString &)), this, SLOT(slotSaveCanceled(const QString &)));
QUrl oldURL = document->url();
QString oldFile = document->localFilePath();
QByteArray _native_format = document->nativeFormatMimeType();
QByteArray oldOutputFormat = document->outputMimeType();
QUrl suggestedURL = document->url();
QStringList mimeFilter = KisImportExportManager::mimeFilter(KisImportExportManager::Export);
if (!mimeFilter.contains(oldOutputFormat)) {
dbgUI << "KisMainWindow::saveDocument no export filter for" << oldOutputFormat;
// --- don't setOutputMimeType in case the user cancels the Save As
// dialog and then tries to just plain Save ---
// suggest a different filename extension (yes, we fortunately don't all live in a world of magic :))
QString suggestedFilename = QFileInfo(suggestedURL.toLocalFile()).baseName();
if (!suggestedFilename.isEmpty()) { // ".kra" looks strange for a name
suggestedFilename = suggestedFilename + "." + KisMimeDatabase::suffixesForMimeType(_native_format).first().remove("*.");
suggestedURL = suggestedURL.adjusted(QUrl::RemoveFilename);
suggestedURL.setPath(suggestedURL.path() + suggestedFilename);
}
// force the user to choose outputMimeType
saveas = true;
}
bool ret = false;
if (document->url().isEmpty() || d->isExporting || saveas) {
// if you're just File/Save As'ing to change filter options you
// don't want to be reminded about overwriting files etc.
bool justChangingFilterOptions = false;
KoFileDialog dialog(this, KoFileDialog::SaveFile, "SaveAs");
dialog.setCaption(d->isExporting ? i18n("Exporting") : i18n("Saving As"));
/*qDebug() << ">>>>>" << d->isExporting << d->lastExportLocation << d->lastExportedFormat << QString::fromLatin1(document->outputMimeType())*/;
if (d->isExporting && !d->lastExportLocation.isEmpty()) {
+ // Use the location where we last exported to, if it's set, as the opening location for the file dialog
QString proposedPath = QFileInfo(d->lastExportLocation).absolutePath();
- QString proposedFileName = document->url().isEmpty() ? document->documentInfo()->aboutInfo("title") : QFileInfo(document->url().toLocalFile()).baseName();
+ // If the document doesn't have a filename yet, use the title
+ QString proposedFileName = suggestedURL.isEmpty() ? document->documentInfo()->aboutInfo("title") : QFileInfo(suggestedURL.toLocalFile()).baseName();
+ // Use the last mimetype we exported to by default
QString proposedMimeType = d->lastExportedFormat.isEmpty() ? "" : d->lastExportedFormat;
QString proposedExtension = KisMimeDatabase::suffixesForMimeType(proposedMimeType).first().remove("*,");
+
+ // Set the default dir: this overrides the one loaded from the config file, since we're exporting and the lastExportLocation is not empty
dialog.setDefaultDir(proposedPath + "/" + proposedFileName + "." + proposedExtension, true);
dialog.setMimeTypeFilters(mimeFilter, proposedMimeType);
}
else {
- dialog.setDefaultDir(suggestedURL.isEmpty() ? QDesktopServices::storageLocation(QDesktopServices::PicturesLocation) : suggestedURL.toLocalFile());
- // Default to all supported file types if user is exporting, otherwise use Krita default
- dialog.setMimeTypeFilters(mimeFilter, QString::fromLatin1(document->outputMimeType()));
+ // Get the last used location for saving
+ KConfigGroup group = KSharedConfig::openConfig()->group("File Dialogs");
+ QString proposedPath = group.readEntry("SaveAs", "");
+ // if that is empty, get the last used location for loading
+ if (proposedPath.isEmpty()) {
+ proposedPath = group.readEntry("OpenDocument", "");
+ }
+ // If that is empty, too, use the Pictures location.
+ if (proposedPath.isEmpty()) {
+ proposedPath = QDesktopServices::storageLocation(QDesktopServices::PicturesLocation);
+ }
+ // But only use that if the suggestedUrl, that is, the document's own url is empty, otherwise
+ // open the location where the document currently is.
+ dialog.setDefaultDir(suggestedURL.isEmpty() ? proposedPath : suggestedURL.toLocalFile(), true);
+
+ // If exporting, default to all supported file types if user is exporting
+ QByteArray default_mime_type = "";
+ if (!d->isExporting) {
+ // otherwise use the document's mimetype, or if that is empty, kra, which is the savest.
+ default_mime_type = document->outputMimeType().isEmpty() ? _native_format : document->outputMimeType();
+ }
+ dialog.setMimeTypeFilters(mimeFilter, QString::fromLatin1(default_mime_type));
}
+
QUrl newURL = QUrl::fromUserInput(dialog.filename());
if (newURL.isLocalFile()) {
QString fn = newURL.toLocalFile();
if (QFileInfo(fn).completeSuffix().isEmpty()) {
fn.append(KisMimeDatabase::suffixesForMimeType(_native_format).first());
newURL = QUrl::fromLocalFile(fn);
}
}
if (document->documentInfo()->aboutInfo("title") == i18n("Unnamed")) {
QString fn = newURL.toLocalFile();
QFileInfo info(fn);
document->documentInfo()->setAboutInfo("title", info.baseName());
}
QByteArray outputFormat = _native_format;
QString outputFormatString = KisMimeDatabase::mimeTypeForFile(newURL.toLocalFile());
outputFormat = outputFormatString.toLatin1();
if (!d->isExporting) {
justChangingFilterOptions = (newURL == document->url()) && (outputFormat == document->mimeType());
}
else {
QString path = QFileInfo(d->lastExportLocation).absolutePath();
QString filename = QFileInfo(document->url().toLocalFile()).baseName();
justChangingFilterOptions = (QFileInfo(newURL.toLocalFile()).absolutePath() == path)
&& (QFileInfo(newURL.toLocalFile()).baseName() == filename)
&& (outputFormat == d->lastExportedFormat);
}
bool bOk = true;
if (newURL.isEmpty()) {
bOk = false;
}
if (bOk) {
bool wantToSave = true;
// don't change this line unless you know what you're doing :)
if (!justChangingFilterOptions) {
if (!document->isNativeFormat(outputFormat))
wantToSave = true;
}
if (wantToSave) {
//
// Note:
// If the user is stupid enough to Export to the current URL,
// we do _not_ change this operation into a Save As. Reasons
// follow:
//
// 1. A check like "d->isExporting && oldURL == newURL"
// doesn't _always_ work on case-insensitive filesystems
// and inconsistent behaviour is bad.
// 2. It is probably not a good idea to change document->mimeType
// and friends because the next time the user File/Save's,
// (not Save As) they won't be expecting that they are
// using their File/Export settings
//
// As a bad side-effect of this, the modified flag will not
// be updated and it is possible that what is currently on
// their screen is not what is stored on disk (through loss
// of formatting). But if you are dumb enough to change
// mimetype but not the filename, then arguably, _you_ are
// the "bug" :)
//
// - Clarence
//
document->setOutputMimeType(outputFormat);
if (d->isExporting) {
// Export
ret = document->exportDocument(newURL);
if (ret) {
// a few file dialog convenience things
d->lastExportLocation = newURL.toLocalFile();
d->lastExportedFormat = outputFormat;
}
// always restore output format
document->setOutputMimeType(oldOutputFormat);
}
else {
// Save As
ret = document->saveAs(newURL);
if (ret) {
dbgUI << "Successful Save As!";
addRecentURL(newURL);
setReadWrite(true);
} else {
dbgUI << "Failed Save As!";
document->setUrl(oldURL);
document->setLocalFilePath(oldFile);
document->setOutputMimeType(oldOutputFormat);
}
}
} // if (wantToSave) {
else
ret = false;
} // if (bOk) {
else
ret = false;
} else { // saving
// be sure document has the correct outputMimeType!
if (d->isExporting || document->isModified()) {
ret = document->save();
}
if (!ret) {
dbgUI << "Failed Save!";
document->setUrl(oldURL);
document->setLocalFilePath(oldFile);
}
}
if (!ret && reset_url)
document->resetURL(); //clean the suggested filename as the save dialog was rejected
updateReloadFileAction(document);
updateCaption();
return ret;
}
void KisMainWindow::undo()
{
if (activeView()) {
activeView()->undoAction()->trigger();
d->undo->setText(activeView()->undoAction()->text());
}
}
void KisMainWindow::redo()
{
if (activeView()) {
activeView()->redoAction()->trigger();
d->redo->setText(activeView()->redoAction()->text());
}
}
void KisMainWindow::closeEvent(QCloseEvent *e)
{
d->mdiArea->closeAllSubWindows();
QAction *action= d->viewManager->actionCollection()->action("view_show_canvas_only");
if ((action) && (action->isChecked())) {
action->setChecked(false);
}
KConfigGroup cfg( KSharedConfig::openConfig(), "MainWindow");
cfg.writeEntry("ko_geometry", saveGeometry().toBase64());
cfg.writeEntry("ko_windowstate", saveState().toBase64());
{
KConfigGroup group( KSharedConfig::openConfig(), "theme");
group.writeEntry("Theme", d->themeManager->currentThemeName());
}
QList<QMdiSubWindow*> childrenList = d->mdiArea->subWindowList();
if (childrenList.isEmpty()) {
d->deferredClosingEvent = e;
if (!d->dockerStateBeforeHiding.isEmpty()) {
restoreState(d->dockerStateBeforeHiding);
}
statusBar()->setVisible(true);
menuBar()->setVisible(true);
saveWindowSettings();
if (d->noCleanup)
return;
if (!d->dockWidgetVisibilityMap.isEmpty()) { // re-enable dockers for persistency
Q_FOREACH (QDockWidget* dockWidget, d->dockWidgetsMap)
dockWidget->setVisible(d->dockWidgetVisibilityMap.value(dockWidget));
}
} else {
e->setAccepted(false);
}
}
void KisMainWindow::saveWindowSettings()
{
KSharedConfigPtr config = KSharedConfig::openConfig();
if (d->windowSizeDirty ) {
dbgUI << "KisMainWindow::saveWindowSettings";
KConfigGroup group = config->group("MainWindow");
KWindowConfig::saveWindowSize(windowHandle(), group);
config->sync();
d->windowSizeDirty = false;
}
if (!d->activeView || d->activeView->document()) {
// Save toolbar position into the config file of the app, under the doc's component name
KConfigGroup group = KSharedConfig::openConfig()->group("krita");
saveMainWindowSettings(group);
// Save collapsable state of dock widgets
for (QMap<QString, QDockWidget*>::const_iterator i = d->dockWidgetsMap.constBegin();
i != d->dockWidgetsMap.constEnd(); ++i) {
if (i.value()->widget()) {
KConfigGroup dockGroup = group.group(QString("DockWidget ") + i.key());
dockGroup.writeEntry("Collapsed", i.value()->widget()->isHidden());
dockGroup.writeEntry("Locked", i.value()->property("Locked").toBool());
dockGroup.writeEntry("DockArea", (int) dockWidgetArea(i.value()));
dockGroup.writeEntry("xPosition", (int) i.value()->widget()->x());
dockGroup.writeEntry("yPosition", (int) i.value()->widget()->y());
dockGroup.writeEntry("width", (int) i.value()->widget()->width());
dockGroup.writeEntry("height", (int) i.value()->widget()->height());
}
}
}
KSharedConfig::openConfig()->sync();
resetAutoSaveSettings(); // Don't let KMainWindow override the good stuff we wrote down
}
void KisMainWindow::resizeEvent(QResizeEvent * e)
{
d->windowSizeDirty = true;
KXmlGuiWindow::resizeEvent(e);
}
void KisMainWindow::setActiveView(KisView* view)
{
d->activeView = view;
updateCaption();
actionCollection()->action("edit_undo")->setText(activeView()->undoAction()->text());
actionCollection()->action("edit_redo")->setText(activeView()->redoAction()->text());
d->viewManager->setCurrentView(view);
}
void KisMainWindow::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasUrls() ||
event->mimeData()->hasFormat("application/x-krita-node") ||
event->mimeData()->hasFormat("application/x-qt-image")) {
event->accept();
}
}
void KisMainWindow::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasUrls() && event->mimeData()->urls().size() > 0) {
Q_FOREACH (const QUrl &url, event->mimeData()->urls()) {
openDocument(url);
}
}
}
void KisMainWindow::dragMoveEvent(QDragMoveEvent * event)
{
QTabBar *tabBar = d->findTabBarHACK();
if (!tabBar && d->mdiArea->viewMode() == QMdiArea::TabbedView) {
qWarning() << "WARNING!!! Cannot find QTabBar in the main window! Looks like Qt has changed behavior. Drag & Drop between multiple tabs might not work properly (tabs will not switch automatically)!";
}
if (tabBar && tabBar->isVisible()) {
QPoint pos = tabBar->mapFromGlobal(mapToGlobal(event->pos()));
if (tabBar->rect().contains(pos)) {
const int tabIndex = tabBar->tabAt(pos);
if (tabIndex >= 0 && tabBar->currentIndex() != tabIndex) {
d->tabSwitchCompressor->start(tabIndex);
}
} else if (d->tabSwitchCompressor->isActive()) {
d->tabSwitchCompressor->stop();
}
}
}
void KisMainWindow::dragLeaveEvent(QDragLeaveEvent * /*event*/)
{
if (d->tabSwitchCompressor->isActive()) {
d->tabSwitchCompressor->stop();
}
}
void KisMainWindow::switchTab(int index)
{
QTabBar *tabBar = d->findTabBarHACK();
if (!tabBar) return;
tabBar->setCurrentIndex(index);
}
void KisMainWindow::slotFileNew()
{
const QStringList mimeFilter = KisImportExportManager::mimeFilter(KisImportExportManager::Import);
KisOpenPane *startupWidget = new KisOpenPane(this, mimeFilter, QStringLiteral("templates/"));
startupWidget->setWindowModality(Qt::WindowModal);
KisConfig cfg;
int w = cfg.defImageWidth();
int h = cfg.defImageHeight();
const double resolution = cfg.defImageResolution();
const QString colorModel = cfg.defColorModel();
const QString colorDepth = cfg.defaultColorDepth();
const QString colorProfile = cfg.defColorProfile();
CustomDocumentWidgetItem item;
item.widget = new KisCustomImageWidget(startupWidget,
w,
h,
resolution,
colorModel,
colorDepth,
colorProfile,
i18n("Unnamed"));
item.icon = "document-new";
startupWidget->addCustomDocumentWidget(item.widget, item.title, item.icon);
QSize sz = KisClipboard::instance()->clipSize();
if (sz.isValid() && sz.width() != 0 && sz.height() != 0) {
w = sz.width();
h = sz.height();
}
item.widget = new KisImageFromClipboard(startupWidget,
w,
h,
resolution,
colorModel,
colorDepth,
colorProfile,
i18n("Unnamed"));
item.title = i18n("Create from Clipboard");
item.icon = "tab-new";
startupWidget->addCustomDocumentWidget(item.widget, item.title, item.icon);
// calls deleteLater
connect(startupWidget, SIGNAL(documentSelected(KisDocument*)), KisPart::instance(), SLOT(startCustomDocument(KisDocument*)));
// calls deleteLater
connect(startupWidget, SIGNAL(openTemplate(const QUrl&)), KisPart::instance(), SLOT(openTemplate(const QUrl&)));
startupWidget->exec();
// Cancel calls deleteLater...
}
void KisMainWindow::slotFileOpen()
{
QStringList urls = showOpenFileDialog();
if (urls.isEmpty())
return;
Q_FOREACH (const QString& url, urls) {
if (!url.isEmpty()) {
bool res = openDocument(QUrl::fromLocalFile(url));
if (!res) {
warnKrita << "Loading" << url << "failed";
}
}
}
}
void KisMainWindow::slotFileOpenRecent(const QUrl &url)
{
(void) openDocument(QUrl::fromLocalFile(url.toLocalFile()));
}
void KisMainWindow::slotFileSave()
{
if (saveDocument(d->activeView->document())) {
emit documentSaved();
}
}
void KisMainWindow::slotFileSaveAs()
{
if (saveDocument(d->activeView->document(), true)) {
emit documentSaved();
}
}
KoCanvasResourceManager *KisMainWindow::resourceManager() const
{
return d->viewManager->resourceProvider()->resourceManager();
}
int KisMainWindow::viewCount() const
{
return d->mdiArea->subWindowList().size();
}
bool KisMainWindow::restoreWorkspace(const QByteArray &state)
{
QByteArray oldState = saveState();
const bool showTitlebars = KisConfig().showDockerTitleBars();
// needed because otherwise the layout isn't correctly restored in some situations
Q_FOREACH (QDockWidget *dock, dockWidgets()) {
dock->hide();
dock->titleBarWidget()->setVisible(showTitlebars);
}
bool success = KXmlGuiWindow::restoreState(state);
if (!success) {
KXmlGuiWindow::restoreState(oldState);
Q_FOREACH (QDockWidget *dock, dockWidgets()) {
if (dock->titleBarWidget()) {
dock->titleBarWidget()->setVisible(showTitlebars || dock->isFloating());
}
}
return false;
}
Q_FOREACH (QDockWidget *dock, dockWidgets()) {
if (dock->titleBarWidget()) {
const bool isCollapsed = (dock->widget() && dock->widget()->isHidden()) || !dock->widget();
dock->titleBarWidget()->setVisible(showTitlebars || (dock->isFloating() && isCollapsed));
}
}
return success;
}
KisViewManager *KisMainWindow::viewManager() const
{
return d->viewManager;
}
void KisMainWindow::slotDocumentInfo()
{
if (!d->activeView->document())
return;
KoDocumentInfo *docInfo = d->activeView->document()->documentInfo();
if (!docInfo)
return;
KoDocumentInfoDlg *dlg = d->activeView->document()->createDocumentInfoDialog(this, docInfo);
if (dlg->exec()) {
if (dlg->isDocumentSaved()) {
d->activeView->document()->setModified(false);
} else {
d->activeView->document()->setModified(true);
}
d->activeView->document()->setTitleModified();
}
delete dlg;
}
bool KisMainWindow::slotFileCloseAll()
{
Q_FOREACH (QMdiSubWindow *subwin, d->mdiArea->subWindowList()) {
if (subwin) {
if(!subwin->close())
return false;
}
}
updateCaption();
return true;
}
void KisMainWindow::slotFileQuit()
{
if(!slotFileCloseAll())
return;
close();
Q_FOREACH (QPointer<KisMainWindow> mainWin, KisPart::instance()->mainWindows()) {
if (mainWin != this) {
if(!mainWin->slotFileCloseAll())
return;
mainWin->close();
}
}
}
void KisMainWindow::slotFilePrint()
{
if (!activeView())
return;
KisPrintJob *printJob = activeView()->createPrintJob();
if (printJob == 0)
return;
applyDefaultSettings(printJob->printer());
QPrintDialog *printDialog = activeView()->createPrintDialog( printJob, this );
if (printDialog && printDialog->exec() == QDialog::Accepted) {
printJob->printer().setPageMargins(0.0, 0.0, 0.0, 0.0, QPrinter::Point);
printJob->printer().setPaperSize(QSizeF(activeView()->image()->width() / (72.0 * activeView()->image()->xRes()),
activeView()->image()->height()/ (72.0 * activeView()->image()->yRes())),
QPrinter::Inch);
printJob->startPrinting(KisPrintJob::DeleteWhenDone);
}
else {
delete printJob;
}
delete printDialog;
}
void KisMainWindow::slotFilePrintPreview()
{
if (!activeView())
return;
KisPrintJob *printJob = activeView()->createPrintJob();
if (printJob == 0)
return;
/* Sets the startPrinting() slot to be blocking.
The Qt print-preview dialog requires the printing to be completely blocking
and only return when the full document has been printed.
By default the KisPrintingDialog is non-blocking and
multithreading, setting blocking to true will allow it to be used in the preview dialog */
printJob->setProperty("blocking", true);
QPrintPreviewDialog *preview = new QPrintPreviewDialog(&printJob->printer(), this);
printJob->setParent(preview); // will take care of deleting the job
connect(preview, SIGNAL(paintRequested(QPrinter*)), printJob, SLOT(startPrinting()));
preview->exec();
delete preview;
}
KisPrintJob* KisMainWindow::exportToPdf(QString pdfFileName)
{
if (!activeView())
return 0;
if (!activeView()->document())
return 0;
KoPageLayout pageLayout;
pageLayout.width = 0;
pageLayout.height = 0;
pageLayout.topMargin = 0;
pageLayout.bottomMargin = 0;
pageLayout.leftMargin = 0;
pageLayout.rightMargin = 0;
if (pdfFileName.isEmpty()) {
KConfigGroup group = KSharedConfig::openConfig()->group("File Dialogs");
QString defaultDir = group.readEntry("SavePdfDialog");
if (defaultDir.isEmpty())
defaultDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
QUrl startUrl = QUrl::fromLocalFile(defaultDir);
KisDocument* pDoc = d->activeView->document();
/** if document has a file name, take file name and replace extension with .pdf */
if (pDoc && pDoc->url().isValid()) {
startUrl = pDoc->url();
QString fileName = startUrl.toLocalFile();
fileName = fileName.replace( QRegExp( "\\.\\w{2,5}$", Qt::CaseInsensitive ), ".pdf" );
startUrl = startUrl.adjusted(QUrl::RemoveFilename);
startUrl.setPath(startUrl.path() + fileName );
}
QPointer<KoPageLayoutDialog> layoutDlg(new KoPageLayoutDialog(this, pageLayout));
layoutDlg->setWindowModality(Qt::WindowModal);
if (layoutDlg->exec() != QDialog::Accepted || !layoutDlg) {
delete layoutDlg;
return 0;
}
pageLayout = layoutDlg->pageLayout();
delete layoutDlg;
KoFileDialog dialog(this, KoFileDialog::SaveFile, "OpenDocument");
dialog.setCaption(i18n("Export as PDF"));
dialog.setDefaultDir(startUrl.toLocalFile());
dialog.setMimeTypeFilters(QStringList() << "application/pdf");
QUrl url = QUrl::fromUserInput(dialog.filename());
pdfFileName = url.toLocalFile();
if (pdfFileName.isEmpty())
return 0;
}
KisPrintJob *printJob = activeView()->createPrintJob();
if (printJob == 0)
return 0;
if (isHidden()) {
printJob->setProperty("noprogressdialog", true);
}
applyDefaultSettings(printJob->printer());
// TODO for remote files we have to first save locally and then upload.
printJob->printer().setOutputFileName(pdfFileName);
printJob->printer().setDocName(pdfFileName);
printJob->printer().setColorMode(QPrinter::Color);
if (pageLayout.format == KoPageFormat::CustomSize) {
printJob->printer().setPaperSize(QSizeF(pageLayout.width, pageLayout.height), QPrinter::Millimeter);
} else {
printJob->printer().setPaperSize(KoPageFormat::printerPageSize(pageLayout.format));
}
printJob->printer().setPageMargins(pageLayout.leftMargin, pageLayout.topMargin, pageLayout.rightMargin, pageLayout.bottomMargin, QPrinter::Millimeter);
switch (pageLayout.orientation) {
case KoPageFormat::Portrait:
printJob->printer().setOrientation(QPrinter::Portrait);
break;
case KoPageFormat::Landscape:
printJob->printer().setOrientation(QPrinter::Landscape);
break;
}
//before printing check if the printer can handle printing
if (!printJob->canPrint()) {
QMessageBox::critical(this, i18nc("@title:window", "Krita"), i18n("Cannot export to the specified file"));
}
printJob->startPrinting(KisPrintJob::DeleteWhenDone);
return printJob;
}
void KisMainWindow::importAnimation()
{
if (!activeView()) return;
KisDocument *document = activeView()->document();
if (!document) return;
KisDlgImportImageSequence dlg(this, document);
if (dlg.exec() == QDialog::Accepted) {
QStringList files = dlg.files();
int firstFrame = dlg.firstFrame();
int step = dlg.step();
document->setFileProgressProxy();
document->setFileProgressUpdater(i18n("Import frames"));
KisAnimationImporter importer(document);
KisImportExportFilter::ConversionStatus status = importer.import(files, firstFrame, step);
document->clearFileProgressUpdater();
document->clearFileProgressProxy();
if (status != KisImportExportFilter::OK && status != KisImportExportFilter::InternalError) {
QString msg = KisImportExportFilter::conversionStatusString(status);
if (!msg.isEmpty())
QMessageBox::critical(0, i18nc("@title:window", "Krita"), i18n("Could not finish import animation:\n%1", msg));
}
activeView()->canvasBase()->refetchDataFromImage();
}
}
void KisMainWindow::slotConfigureToolbars()
{
KConfigGroup group = KSharedConfig::openConfig()->group("krita");
saveMainWindowSettings(group);
KEditToolBar edit(factory(), this);
connect(&edit, SIGNAL(newToolBarConfig()), this, SLOT(slotNewToolbarConfig()));
(void) edit.exec();
applyToolBarLayout();
}
void KisMainWindow::slotNewToolbarConfig()
{
applyMainWindowSettings(KSharedConfig::openConfig()->group("krita"));
KXMLGUIFactory *factory = guiFactory();
Q_UNUSED(factory);
// Check if there's an active view
if (!d->activeView)
return;
plugActionList("toolbarlist", d->toolbarList);
applyToolBarLayout();
}
void KisMainWindow::slotToolbarToggled(bool toggle)
{
//dbgUI <<"KisMainWindow::slotToolbarToggled" << sender()->name() <<" toggle=" << true;
// The action (sender) and the toolbar have the same name
KToolBar * bar = toolBar(sender()->objectName());
if (bar) {
if (toggle) {
bar->show();
}
else {
bar->hide();
}
if (d->activeView && d->activeView->document()) {
KConfigGroup group = KSharedConfig::openConfig()->group("krita");
saveMainWindowSettings(group);
}
} else
warnUI << "slotToolbarToggled : Toolbar " << sender()->objectName() << " not found!";
}
void KisMainWindow::viewFullscreen(bool fullScreen)
{
KisConfig cfg;
cfg.setFullscreenMode(fullScreen);
if (fullScreen) {
setWindowState(windowState() | Qt::WindowFullScreen); // set
} else {
setWindowState(windowState() & ~Qt::WindowFullScreen); // reset
}
}
void KisMainWindow::slotProgress(int value)
{
qApp->processEvents();
StdLockableWrapper<QMutex> wrapper(&d->progressMutex);
std::unique_lock<StdLockableWrapper<QMutex>> l(wrapper, std::try_to_lock);
if (!l.owns_lock()) return;
dbgUI << "KisMainWindow::slotProgress" << value;
if (value <= -1 || value >= 100) {
if (d->progress) {
statusBar()->removeWidget(d->progress);
delete d->progress;
d->progress = 0;
disconnect(d->progressCancel, SIGNAL(clicked()), this, SLOT(slotProgressCanceled()));
statusBar()->removeWidget(d->progressCancel);
delete d->progressCancel;
d->progressCancel = 0;
}
d->firstTime = true;
return;
}
if (d->firstTime || !d->progress) {
// The statusbar might not even be created yet.
// So check for that first, and create it if necessary
QStatusBar *bar = findChild<QStatusBar *>();
if (!bar) {
statusBar()->show();
QApplication::sendPostedEvents(this, QEvent::ChildAdded);
}
if (d->progress) {
statusBar()->removeWidget(d->progress);
delete d->progress;
d->progress = 0;
disconnect(d->progressCancel, SIGNAL(clicked()), this, SLOT(slotProgressCanceled()));
statusBar()->removeWidget(d->progressCancel);
delete d->progressCancel;
d->progress = 0;
}
d->progressCancel = new QToolButton(statusBar());
d->progressCancel->setMaximumHeight(statusBar()->fontMetrics().height());
d->progressCancel->setIcon(KisIconUtils::loadIcon("process-stop"));
statusBar()->addPermanentWidget(d->progressCancel);
d->progress = new QProgressBar(statusBar());
d->progress->setMaximumHeight(statusBar()->fontMetrics().height());
d->progress->setRange(0, 100);
statusBar()->addPermanentWidget(d->progress);
connect(d->progressCancel, SIGNAL(clicked()), this, SLOT(slotProgressCanceled()));
d->progress->show();
d->progressCancel->show();
d->firstTime = false;
}
if (!d->progress.isNull()) {
d->progress->setValue(value);
}
qApp->processEvents();
}
void KisMainWindow::slotProgressCanceled()
{
emit sigProgressCanceled();
}
void KisMainWindow::setMaxRecentItems(uint _number)
{
d->recentFiles->setMaxItems(_number);
}
void KisMainWindow::slotReloadFile()
{
KisDocument* document = d->activeView->document();
if (!document || document->url().isEmpty())
return;
if (document->isModified()) {
bool ok = QMessageBox::question(this,
i18nc("@title:window", "Krita"),
i18n("You will lose all changes made since your last save\n"
"Do you want to continue?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes;
if (!ok)
return;
}
QUrl url = document->url();
saveWindowSettings();
if (!document->reload()) {
QMessageBox::critical(this, i18nc("@title:window", "Krita"), i18n("Error: Could not reload this document"));
}
return;
}
void KisMainWindow::slotImportFile()
{
dbgUI << "slotImportFile()";
d->isImporting = true;
slotFileOpen();
d->isImporting = false;
}
void KisMainWindow::slotExportFile()
{
dbgUI << "slotExportFile()";
d->isExporting = true;
slotFileSaveAs();
d->isExporting = false;
}
QDockWidget* KisMainWindow::createDockWidget(KoDockFactoryBase* factory)
{
QDockWidget* dockWidget = 0;
if (!d->dockWidgetsMap.contains(factory->id())) {
dockWidget = factory->createDockWidget();
// It is quite possible that a dock factory cannot create the dock; don't
// do anything in that case.
if (!dockWidget) {
warnKrita << "Could not create docker for" << factory->id();
return 0;
}
KoDockWidgetTitleBar *titleBar = dynamic_cast<KoDockWidgetTitleBar*>(dockWidget->titleBarWidget());
// Check if the dock widget is supposed to be collapsable
if (!dockWidget->titleBarWidget()) {
titleBar = new KoDockWidgetTitleBar(dockWidget);
dockWidget->setTitleBarWidget(titleBar);
titleBar->setCollapsable(factory->isCollapsable());
}
titleBar->setFont(KoDockRegistry::dockFont());
dockWidget->setObjectName(factory->id());
dockWidget->setParent(this);
if (dockWidget->widget() && dockWidget->widget()->layout())
dockWidget->widget()->layout()->setContentsMargins(1, 1, 1, 1);
Qt::DockWidgetArea side = Qt::RightDockWidgetArea;
bool visible = true;
switch (factory->defaultDockPosition()) {
case KoDockFactoryBase::DockTornOff:
dockWidget->setFloating(true); // position nicely?
break;
case KoDockFactoryBase::DockTop:
side = Qt::TopDockWidgetArea; break;
case KoDockFactoryBase::DockLeft:
side = Qt::LeftDockWidgetArea; break;
case KoDockFactoryBase::DockBottom:
side = Qt::BottomDockWidgetArea; break;
case KoDockFactoryBase::DockRight:
side = Qt::RightDockWidgetArea; break;
case KoDockFactoryBase::DockMinimized:
default:
side = Qt::RightDockWidgetArea;
visible = false;
}
KConfigGroup group = KSharedConfig::openConfig()->group("krita").group("DockWidget " + factory->id());
side = static_cast<Qt::DockWidgetArea>(group.readEntry("DockArea", static_cast<int>(side)));
if (side == Qt::NoDockWidgetArea) side = Qt::RightDockWidgetArea;
addDockWidget(side, dockWidget);
if (!visible) {
dockWidget->hide();
}
bool collapsed = factory->defaultCollapsed();
bool locked = false;
group = KSharedConfig::openConfig()->group("krita").group("DockWidget " + factory->id());
collapsed = group.readEntry("Collapsed", collapsed);
locked = group.readEntry("Locked", locked);
//dbgKrita << "docker" << factory->id() << dockWidget << "collapsed" << collapsed << "locked" << locked << "titlebar" << titleBar;
if (titleBar && collapsed)
titleBar->setCollapsed(true);
if (titleBar && locked)
titleBar->setLocked(true);
d->dockWidgetsMap.insert(factory->id(), dockWidget);
}
else {
dockWidget = d->dockWidgetsMap[factory->id()];
}
#ifdef Q_OS_OSX
dockWidget->setAttribute(Qt::WA_MacSmallSize, true);
#endif
dockWidget->setFont(KoDockRegistry::dockFont());
connect(dockWidget, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(forceDockTabFonts()));
return dockWidget;
}
void KisMainWindow::forceDockTabFonts()
{
Q_FOREACH (QObject *child, children()) {
if (child->inherits("QTabBar")) {
((QTabBar *)child)->setFont(KoDockRegistry::dockFont());
}
}
}
QList<QDockWidget*> KisMainWindow::dockWidgets() const
{
return d->dockWidgetsMap.values();
}
QDockWidget* KisMainWindow::dockWidget(const QString &id)
{
if (!d->dockWidgetsMap.contains(id)) return 0;
return d->dockWidgetsMap[id];
}
QList<KoCanvasObserverBase*> KisMainWindow::canvasObservers() const
{
QList<KoCanvasObserverBase*> observers;
Q_FOREACH (QDockWidget *docker, dockWidgets()) {
KoCanvasObserverBase *observer = dynamic_cast<KoCanvasObserverBase*>(docker);
if (observer) {
observers << observer;
}
else {
warnKrita << docker << "is not a canvas observer";
}
}
return observers;
}
void KisMainWindow::toggleDockersVisibility(bool visible)
{
if (!visible) {
d->dockerStateBeforeHiding = saveState();
Q_FOREACH (QObject* widget, children()) {
if (widget->inherits("QDockWidget")) {
QDockWidget* dw = static_cast<QDockWidget*>(widget);
if (dw->isVisible()) {
dw->hide();
}
}
}
}
else {
restoreState(d->dockerStateBeforeHiding);
}
}
void KisMainWindow::setToolbarList(QList<QAction *> toolbarList)
{
qDeleteAll(d->toolbarList);
d->toolbarList = toolbarList;
}
void KisMainWindow::slotDocumentTitleModified(const QString &caption, bool mod)
{
updateCaption();
updateCaption(caption, mod);
updateReloadFileAction(d->activeView ? d->activeView->document() : 0);
}
void KisMainWindow::subWindowActivated()
{
bool enabled = (activeKisView() != 0);
d->mdiCascade->setEnabled(enabled);
d->mdiNextWindow->setEnabled(enabled);
d->mdiPreviousWindow->setEnabled(enabled);
d->mdiTile->setEnabled(enabled);
d->close->setEnabled(enabled);
d->closeAll->setEnabled(enabled);
setActiveSubWindow(d->mdiArea->activeSubWindow());
Q_FOREACH (QToolBar *tb, toolBars()) {
if (tb->objectName() == "BrushesAndStuff") {
tb->setEnabled(enabled);
}
}
updateCaption();
d->actionManager()->updateGUI();
}
void KisMainWindow::updateWindowMenu()
{
QMenu *menu = d->windowMenu->menu();
menu->clear();
menu->addAction(d->newWindow);
menu->addAction(d->documentMenu);
QMenu *docMenu = d->documentMenu->menu();
docMenu->clear();
Q_FOREACH (QPointer<KisDocument> doc, KisPart::instance()->documents()) {
if (doc) {
QString title = doc->url().toDisplayString();
if (title.isEmpty() && doc->image()) {
title = doc->image()->objectName();
}
QAction *action = docMenu->addAction(title);
action->setIcon(qApp->windowIcon());
connect(action, SIGNAL(triggered()), d->documentMapper, SLOT(map()));
d->documentMapper->setMapping(action, doc);
}
}
menu->addAction(d->workspaceMenu);
QMenu *workspaceMenu = d->workspaceMenu->menu();
workspaceMenu->clear();
auto workspaces = KisResourceServerProvider::instance()->workspaceServer(false)->resources();
auto m_this = this;
for (auto &w : workspaces) {
auto action = workspaceMenu->addAction(w->name());
auto ds = w->dockerState();
connect(action, &QAction::triggered, this, [=]() { m_this->restoreWorkspace(ds); });
}
workspaceMenu->addSeparator();
connect(workspaceMenu->addAction(i18nc("@action:inmenu", "&Import Workspace...")),
&QAction::triggered,
this,
[&]() {
QString extensions = d->workspacemodel->extensions();
QStringList mimeTypes;
for(const QString &suffix : extensions.split(":")) {
mimeTypes << KisMimeDatabase::mimeTypeForSuffix(suffix);
}
KoFileDialog dialog(0, KoFileDialog::OpenFile, "OpenDocument");
dialog.setMimeTypeFilters(mimeTypes);
dialog.setCaption(i18nc("@title:window", "Choose File to Add"));
QString filename = dialog.filename();
d->workspacemodel->importResourceFile(filename);
});
connect(workspaceMenu->addAction(i18nc("@action:inmenu", "&New Workspace...")),
&QAction::triggered,
[=]() {
QString name = QInputDialog::getText(this, i18nc("@title:window", "New Workspace..."),
i18nc("@label:textbox", "Name:"));
if (name.isEmpty()) return;
auto rserver = KisResourceServerProvider::instance()->workspaceServer();
KisWorkspaceResource* workspace = new KisWorkspaceResource("");
workspace->setDockerState(m_this->saveState());
d->viewManager->resourceProvider()->notifySavingWorkspace(workspace);
workspace->setValid(true);
QString saveLocation = rserver->saveLocation();
bool newName = false;
if(name.isEmpty()) {
newName = true;
name = i18n("Workspace");
}
QFileInfo fileInfo(saveLocation + name + workspace->defaultFileExtension());
int i = 1;
while (fileInfo.exists()) {
fileInfo.setFile(saveLocation + name + QString("%1").arg(i) + workspace->defaultFileExtension());
i++;
}
workspace->setFilename(fileInfo.filePath());
if(newName) {
name = i18n("Workspace %1", i);
}
workspace->setName(name);
rserver->addResource(workspace);
});
// TODO: What to do about delete?
// workspaceMenu->addAction(i18nc("@action:inmenu", "&Delete Workspace..."));
menu->addSeparator();
menu->addAction(d->close);
menu->addAction(d->closeAll);
if (d->mdiArea->viewMode() == QMdiArea::SubWindowView) {
menu->addSeparator();
menu->addAction(d->mdiTile);
menu->addAction(d->mdiCascade);
}
menu->addSeparator();
menu->addAction(d->mdiNextWindow);
menu->addAction(d->mdiPreviousWindow);
menu->addSeparator();
QList<QMdiSubWindow *> windows = d->mdiArea->subWindowList();
for (int i = 0; i < windows.size(); ++i) {
QPointer<KisView>child = qobject_cast<KisView*>(windows.at(i)->widget());
if (child && child->document()) {
QString text;
if (i < 9) {
text = i18n("&%1 %2", i + 1, child->document()->url().toDisplayString());
}
else {
text = i18n("%1 %2", i + 1, child->document()->url().toDisplayString());
}
QAction *action = menu->addAction(text);
action->setIcon(qApp->windowIcon());
action->setCheckable(true);
action->setChecked(child == activeKisView());
connect(action, SIGNAL(triggered()), d->windowMapper, SLOT(map()));
d->windowMapper->setMapping(action, windows.at(i));
}
}
updateCaption();
}
void KisMainWindow::setActiveSubWindow(QWidget *window)
{
if (!window) return;
QMdiSubWindow *subwin = qobject_cast<QMdiSubWindow *>(window);
//dbgKrita << "setActiveSubWindow();" << subwin << d->activeSubWindow;
if (subwin && subwin != d->activeSubWindow) {
KisView *view = qobject_cast<KisView *>(subwin->widget());
//dbgKrita << "\t" << view << activeView();
if (view && view != activeView()) {
d->mdiArea->setActiveSubWindow(subwin);
setActiveView(view);
}
d->activeSubWindow = subwin;
}
updateWindowMenu();
d->actionManager()->updateGUI();
}
void KisMainWindow::configChanged()
{
KisConfig cfg;
QMdiArea::ViewMode viewMode = (QMdiArea::ViewMode)cfg.readEntry<int>("mdi_viewmode", (int)QMdiArea::TabbedView);
d->mdiArea->setViewMode(viewMode);
Q_FOREACH (QMdiSubWindow *subwin, d->mdiArea->subWindowList()) {
subwin->setOption(QMdiSubWindow::RubberBandMove, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
subwin->setOption(QMdiSubWindow::RubberBandResize, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
}
KConfigGroup group( KSharedConfig::openConfig(), "theme");
d->themeManager->setCurrentTheme(group.readEntry("Theme", "Krita dark"));
d->actionManager()->updateGUI();
QBrush brush(cfg.getMDIBackgroundColor());
d->mdiArea->setBackground(brush);
QString backgroundImage = cfg.getMDIBackgroundImage();
if (backgroundImage != "") {
QImage image(backgroundImage);
QBrush brush(image);
d->mdiArea->setBackground(brush);
}
d->mdiArea->update();
}
void KisMainWindow::newView(QObject *document)
{
KisDocument *doc = qobject_cast<KisDocument*>(document);
addViewAndNotifyLoadingCompleted(doc);
d->actionManager()->updateGUI();
}
void KisMainWindow::newWindow()
{
KisPart::instance()->createMainWindow()->show();
}
void KisMainWindow::closeCurrentWindow()
{
d->mdiArea->currentSubWindow()->close();
d->actionManager()->updateGUI();
}
void KisMainWindow::checkSanity()
{
// print error if the lcms engine is not available
if (!KoColorSpaceEngineRegistry::instance()->contains("icc")) {
// need to wait 1 event since exiting here would not work.
m_errorMessage = i18n("The Krita LittleCMS color management plugin is not installed. Krita will quit now.");
m_dieOnError = true;
QTimer::singleShot(0, this, SLOT(showErrorAndDie()));
return;
}
KisPaintOpPresetResourceServer * rserver = KisResourceServerProvider::instance()->paintOpPresetServer();
if (rserver->resources().isEmpty()) {
m_errorMessage = i18n("Krita cannot find any brush presets! Krita will quit now.");
m_dieOnError = true;
QTimer::singleShot(0, this, SLOT(showErrorAndDie()));
return;
}
}
void KisMainWindow::showErrorAndDie()
{
QMessageBox::critical(0, i18nc("@title:window", "Installation error"), m_errorMessage);
if (m_dieOnError) {
exit(10);
}
}
void KisMainWindow::showAboutApplication()
{
KisAboutApplication dlg(this);
dlg.exec();
}
QPointer<KisView>KisMainWindow::activeKisView()
{
if (!d->mdiArea) return 0;
QMdiSubWindow *activeSubWindow = d->mdiArea->activeSubWindow();
//dbgKrita << "activeKisView" << activeSubWindow;
if (!activeSubWindow) return 0;
return qobject_cast<KisView*>(activeSubWindow->widget());
}
void KisMainWindow::newOptionWidgets(KoCanvasController *controller, const QList<QPointer<QWidget> > &optionWidgetList)
{
KIS_ASSERT_RECOVER_NOOP(controller == KoToolManager::instance()->activeCanvasController());
bool isOurOwnView = false;
Q_FOREACH (QPointer<KisView> view, KisPart::instance()->views()) {
if (view && view->canvasController() == controller) {
isOurOwnView = view->mainWindow() == this;
}
}
if (!isOurOwnView) return;
Q_FOREACH (QWidget *w, optionWidgetList) {
#ifdef Q_OS_OSX
w->setAttribute(Qt::WA_MacSmallSize, true);
#endif
w->setFont(KoDockRegistry::dockFont());
}
if (d->toolOptionsDocker) {
d->toolOptionsDocker->setOptionWidgets(optionWidgetList);
}
else {
d->viewManager->paintOpBox()->newOptionWidgets(optionWidgetList);
}
}
void KisMainWindow::applyDefaultSettings(QPrinter &printer) {
if (!d->activeView) return;
QString title = d->activeView->document()->documentInfo()->aboutInfo("title");
if (title.isEmpty()) {
title = d->activeView->document()->url().fileName();
// strip off the native extension (I don't want foobar.kwd.ps when printing into a file)
QString extension = KisMimeDatabase::suffixesForMimeType(d->activeView->document()->outputMimeType()).first();
if (title.endsWith(extension)) {
title.chop(extension.length());
}
}
if (title.isEmpty()) {
// #139905
title = i18n("%1 unsaved document (%2)", qApp->applicationDisplayName(),
QLocale().toString(QDate::currentDate(), QLocale::ShortFormat));
}
printer.setDocName(title);
}
void KisMainWindow::createActions()
{
KisActionManager *actionManager = d->actionManager();
KisConfig cfg;
actionManager->createStandardAction(KStandardAction::New, this, SLOT(slotFileNew()));
actionManager->createStandardAction(KStandardAction::Open, this, SLOT(slotFileOpen()));
actionManager->createStandardAction(KStandardAction::Quit, this, SLOT(slotFileQuit()));
actionManager->createStandardAction(KStandardAction::ConfigureToolbars, this, SLOT(slotConfigureToolbars()));
actionManager->createStandardAction(KStandardAction::FullScreen, this, SLOT(viewFullscreen(bool)));
d->recentFiles = KStandardAction::openRecent(this, SLOT(slotFileOpenRecent(QUrl)), actionCollection());
connect(d->recentFiles, SIGNAL(recentListCleared()), this, SLOT(saveRecentFiles()));
KSharedConfigPtr configPtr = KSharedConfig::openConfig();
d->recentFiles->loadEntries(configPtr->group("RecentFiles"));
d->saveAction = actionManager->createStandardAction(KStandardAction::Save, this, SLOT(slotFileSave()));
d->saveAction->setActivationFlags(KisAction::ACTIVE_IMAGE);
d->saveActionAs = actionManager->createStandardAction(KStandardAction::SaveAs, this, SLOT(slotFileSaveAs()));
d->saveActionAs->setActivationFlags(KisAction::ACTIVE_IMAGE);
// d->printAction = actionManager->createStandardAction(KStandardAction::Print, this, SLOT(slotFilePrint()));
// d->printAction->setActivationFlags(KisAction::ACTIVE_IMAGE);
// d->printActionPreview = actionManager->createStandardAction(KStandardAction::PrintPreview, this, SLOT(slotFilePrintPreview()));
// d->printActionPreview->setActivationFlags(KisAction::ACTIVE_IMAGE);
d->undo = actionManager->createStandardAction(KStandardAction::Undo, this, SLOT(undo()));
d->undo ->setActivationFlags(KisAction::ACTIVE_IMAGE);
d->redo = actionManager->createStandardAction(KStandardAction::Redo, this, SLOT(redo()));
d->redo->setActivationFlags(KisAction::ACTIVE_IMAGE);
// d->exportPdf = actionManager->createAction("file_export_pdf");
// connect(d->exportPdf, SIGNAL(triggered()), this, SLOT(exportToPdf()));
d->importAnimation = actionManager->createAction("file_import_animation");
connect(d->importAnimation, SIGNAL(triggered()), this, SLOT(importAnimation()));
d->closeAll = actionManager->createAction("file_close_all");
connect(d->closeAll, SIGNAL(triggered()), this, SLOT(slotFileCloseAll()));
// d->reloadFile = actionManager->createAction("file_reload_file");
// d->reloadFile->setActivationFlags(KisAction::CURRENT_IMAGE_MODIFIED);
// connect(d->reloadFile, SIGNAL(triggered(bool)), this, SLOT(slotReloadFile()));
d->importFile = actionManager->createAction("file_import_file");
connect(d->importFile, SIGNAL(triggered(bool)), this, SLOT(slotImportFile()));
d->exportFile = actionManager->createAction("file_export_file");
connect(d->exportFile, SIGNAL(triggered(bool)), this, SLOT(slotExportFile()));
/* The following entry opens the document information dialog. Since the action is named so it
intends to show data this entry should not have a trailing ellipses (...). */
d->showDocumentInfo = actionManager->createAction("file_documentinfo");
connect(d->showDocumentInfo, SIGNAL(triggered(bool)), this, SLOT(slotDocumentInfo()));
d->themeManager->setThemeMenuAction(new KActionMenu(i18nc("@action:inmenu", "&Themes"), this));
d->themeManager->registerThemeActions(actionCollection());
connect(d->themeManager, SIGNAL(signalThemeChanged()), this, SLOT(slotThemeChanged()));
d->toggleDockers = actionManager->createAction("view_toggledockers");
cfg.showDockers(true);
d->toggleDockers->setChecked(true);
connect(d->toggleDockers, SIGNAL(toggled(bool)), SLOT(toggleDockersVisibility(bool)));
d->toggleDockerTitleBars = actionManager->createAction("view_toggledockertitlebars");
d->toggleDockerTitleBars->setChecked(cfg.showDockerTitleBars());
connect(d->toggleDockerTitleBars, SIGNAL(toggled(bool)), SLOT(showDockerTitleBars(bool)));
actionCollection()->addAction("settings_dockers_menu", d->dockWidgetMenu);
actionCollection()->addAction("window", d->windowMenu);
d->mdiCascade = actionManager->createAction("windows_cascade");
connect(d->mdiCascade, SIGNAL(triggered()), d->mdiArea, SLOT(cascadeSubWindows()));
d->mdiTile = actionManager->createAction("windows_tile");
connect(d->mdiTile, SIGNAL(triggered()), d->mdiArea, SLOT(tileSubWindows()));
d->mdiNextWindow = actionManager->createAction("windows_next");
connect(d->mdiNextWindow, SIGNAL(triggered()), d->mdiArea, SLOT(activateNextSubWindow()));
d->mdiPreviousWindow = actionManager->createAction("windows_previous");
connect(d->mdiPreviousWindow, SIGNAL(triggered()), d->mdiArea, SLOT(activatePreviousSubWindow()));
d->newWindow = actionManager->createAction("view_newwindow");
connect(d->newWindow, SIGNAL(triggered(bool)), this, SLOT(newWindow()));
d->close = actionManager->createAction("file_close");
connect(d->close, SIGNAL(triggered()), SLOT(closeCurrentWindow()));
actionManager->createStandardAction(KStandardAction::Preferences, this, SLOT(slotPreferences()));
for (int i = 0; i < 2; i++) {
d->expandingSpacers[i] = new KisAction(i18n("Expanding Spacer"));
d->expandingSpacers[i]->setDefaultWidget(new QWidget(this));
d->expandingSpacers[i]->defaultWidget()->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
actionManager->addAction(QString("expanding_spacer_%1").arg(i), d->expandingSpacers[i]);
}
}
void KisMainWindow::applyToolBarLayout()
{
const bool isPlastiqueStyle = style()->objectName() == "plastique";
Q_FOREACH (KToolBar *toolBar, toolBars()) {
toolBar->layout()->setSpacing(4);
if (isPlastiqueStyle) {
toolBar->setContentsMargins(0, 0, 0, 2);
}
//Hide text for buttons with an icon in the toolbar
Q_FOREACH (QAction *ac, toolBar->actions()){
if (ac->icon().pixmap(QSize(1,1)).isNull() == false){
ac->setPriority(QAction::LowPriority);
}else {
ac->setIcon(QIcon());
}
}
}
}
void KisMainWindow::initializeGeometry()
{
// if the user didn's specify the geometry on the command line (does anyone do that still?),
// we first figure out some good default size and restore the x,y position. See bug 285804Z.
KConfigGroup cfg( KSharedConfig::openConfig(), "MainWindow");
QByteArray geom = QByteArray::fromBase64(cfg.readEntry("ko_geometry", QByteArray()));
if (!restoreGeometry(geom)) {
const int scnum = QApplication::desktop()->screenNumber(parentWidget());
QRect desk = QApplication::desktop()->availableGeometry(scnum);
// if the desktop is virtual then use virtual screen size
if (QApplication::desktop()->isVirtualDesktop()) {
desk = QApplication::desktop()->availableGeometry(QApplication::desktop()->screen(scnum));
}
quint32 x = desk.x();
quint32 y = desk.y();
quint32 w = 0;
quint32 h = 0;
// Default size -- maximize on small screens, something useful on big screens
const int deskWidth = desk.width();
if (deskWidth > 1024) {
// a nice width, and slightly less than total available
// height to componensate for the window decs
w = (deskWidth / 3) * 2;
h = (desk.height() / 3) * 2;
}
else {
w = desk.width();
h = desk.height();
}
x += (desk.width() - w) / 2;
y += (desk.height() - h) / 2;
move(x,y);
setGeometry(geometry().x(), geometry().y(), w, h);
}
restoreWorkspace(QByteArray::fromBase64(cfg.readEntry("ko_windowstate", QByteArray())));
}
void KisMainWindow::showManual()
{
QDesktopServices::openUrl(QUrl("https://docs.krita.org"));
}
void KisMainWindow::showDockerTitleBars(bool show)
{
Q_FOREACH (QDockWidget *dock, dockWidgets()) {
if (dock->titleBarWidget()) {
const bool isCollapsed = (dock->widget() && dock->widget()->isHidden()) || !dock->widget();
dock->titleBarWidget()->setVisible(show || (dock->isFloating() && isCollapsed));
}
}
KisConfig cfg;
cfg.setShowDockerTitleBars(show);
}
void KisMainWindow::moveEvent(QMoveEvent *e)
{
if (qApp->desktop()->screenNumber(this) != qApp->desktop()->screenNumber(e->oldPos())) {
KisConfigNotifier::instance()->notifyConfigChanged();
}
}
#include <moc_KisMainWindow.cpp>
diff --git a/libs/ui/KisPaletteModel.cpp b/libs/ui/KisPaletteModel.cpp
index 97cf1dd144..c5011e77d5 100644
--- a/libs/ui/KisPaletteModel.cpp
+++ b/libs/ui/KisPaletteModel.cpp
@@ -1,578 +1,605 @@
/*
* Copyright (c) 2013 Sven Langkamp <sven.langkamp@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "KisPaletteModel.h"
#include <QBrush>
#include <QDomDocument>
#include <QDomElement>
#include <QMimeData>
#include <KoColor.h>
#include <KoColorSpace.h>
#include <resources/KoColorSet.h>
#include <KoColorDisplayRendererInterface.h>
#include <kis_layer.h>
#include <kis_paint_layer.h>
KisPaletteModel::KisPaletteModel(QObject* parent)
: QAbstractTableModel(parent),
m_colorSet(0),
m_displayRenderer(KoDumbColorDisplayRenderer::instance())
{
}
KisPaletteModel::~KisPaletteModel()
{
}
void KisPaletteModel::setDisplayRenderer(KoColorDisplayRendererInterface *displayRenderer)
{
if (displayRenderer) {
if (m_displayRenderer) {
disconnect(m_displayRenderer, 0, this, 0);
}
m_displayRenderer = displayRenderer;
connect(m_displayRenderer, SIGNAL(displayConfigurationChanged()),
SLOT(slotDisplayConfigurationChanged()));
} else {
m_displayRenderer = KoDumbColorDisplayRenderer::instance();
}
}
void KisPaletteModel::slotDisplayConfigurationChanged()
{
reset();
}
QModelIndex KisPaletteModel::getLastEntryIndex()
{
int endRow = rowCount();
int endColumn = columnCount();
- QModelIndex i = this->index(endRow, endColumn, QModelIndex());
- while (qVariantValue<QStringList>(i.data(RetrieveEntryRole)).isEmpty()) {
- i = this->index(endRow, endColumn);
- endColumn -=1;
- if (endColumn<0) {
- endColumn = columnCount();
- endRow-=1;
+ if (m_colorSet->nColors()>0) {
+ QModelIndex i = this->index(endRow, endColumn, QModelIndex());
+ while (qVariantValue<QStringList>(i.data(RetrieveEntryRole)).isEmpty()) {
+ i = this->index(endRow, endColumn);
+ endColumn -=1;
+ if (endColumn<0) {
+ endColumn = columnCount();
+ endRow-=1;
+ }
}
+ return i;
}
- return i;
+ return QModelIndex();
}
QVariant KisPaletteModel::data(const QModelIndex& index, int role) const
{
KoColorSetEntry entry;
if (m_colorSet && m_displayRenderer) {
//now to figure out whether we have a groupname row or not.
bool groupNameRow = false;
quint32 indexInGroup = 0;
QString indexGroupName = QString();
int rowstotal = m_colorSet->nColorsGroup()/columnCount();
if (index.row()<=rowstotal && (quint32)(index.row()*columnCount()+index.column())<m_colorSet->nColorsGroup()) {
indexInGroup = (quint32)(index.row()*columnCount()+index.column());
}
if (m_colorSet->nColorsGroup()==0) {
rowstotal+=1; //always add one for the default group when considering groups.
}
Q_FOREACH (QString groupName, m_colorSet->getGroupNames()){
//we make an int for the rows added by the current group.
int newrows = 1+m_colorSet->nColorsGroup(groupName)/columnCount();
if (m_colorSet->nColorsGroup(groupName)%columnCount() > 0) {
newrows+=1;
}
if (newrows==0) {
newrows+=1; //always add one for the group when considering groups.
}
quint32 tempIndex = (quint32)((index.row()-(rowstotal+2))*columnCount()+index.column());
if (index.row() == rowstotal+1) {
//rowstotal+1 is taken up by the groupname.
indexGroupName = groupName;
groupNameRow = true;
} else if (index.row() > (rowstotal+1) && index.row() <= rowstotal+newrows &&
tempIndex<m_colorSet->nColorsGroup(groupName)){
//otherwise it's an index to the colors in the group.
indexGroupName = groupName;
indexInGroup = tempIndex;
}
//add the new rows to the totalrows we've looked at.
rowstotal += newrows;
}
if (groupNameRow) {
switch (role) {
case Qt::ToolTipRole:
case Qt::DisplayRole: {
return indexGroupName;
}
case IsHeaderRole: {
return true;
}
case RetrieveEntryRole: {
QStringList entryList;
entryList.append(indexGroupName);
entryList.append(QString::number(0));
return entryList;
}
}
} else {
if (indexInGroup < m_colorSet->nColorsGroup(indexGroupName)) {
entry = m_colorSet->getColorGroup(indexInGroup, indexGroupName);
switch (role) {
case Qt::ToolTipRole:
case Qt::DisplayRole: {
return entry.name;
}
case Qt::BackgroundRole: {
QColor color = m_displayRenderer->toQColor(entry.color);
return QBrush(color);
}
case IsHeaderRole: {
return false;
}
case RetrieveEntryRole: {
QStringList entryList;
entryList.append(indexGroupName);
entryList.append(QString::number(indexInGroup));
return entryList;
}
}
}
}
}
return QVariant();
}
int KisPaletteModel::rowCount(const QModelIndex& /*parent*/) const
{
if (!m_colorSet) {
return 0;
}
if (columnCount() > 0) {
int countedrows = m_colorSet->nColorsGroup("")/columnCount();
if (m_colorSet->nColorsGroup()%columnCount() > 0) {
countedrows+=1;
}
if (m_colorSet->nColorsGroup()==0) {
countedrows+=1;
}
Q_FOREACH (QString groupName, m_colorSet->getGroupNames()) {
countedrows += 1; //add one for the name;
countedrows += 1+(m_colorSet->nColorsGroup(groupName)/ columnCount());
if (m_colorSet->nColorsGroup(groupName)%columnCount() > 0) {
countedrows+=1;
}
if (m_colorSet->nColorsGroup(groupName)==0) {
countedrows+=1;
}
}
countedrows +=1; //Our code up till now doesn't take 0 into account.
return countedrows;
}
return m_colorSet->nColors()/15 + 1;
}
int KisPaletteModel::columnCount(const QModelIndex& /*parent*/) const
{
if (m_colorSet && m_colorSet->columnCount() > 0) {
return m_colorSet->columnCount();
}
return 15;
}
Qt::ItemFlags KisPaletteModel::flags(const QModelIndex& index) const
{
if (index.isValid()) {
return Qt::ItemIsSelectable | Qt::ItemIsEnabled
| Qt::ItemIsUserCheckable
| Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
}
return Qt::ItemIsDropEnabled;
}
QModelIndex KisPaletteModel::index(int row, int column, const QModelIndex& parent) const
{
if (m_colorSet) {
//make an int to hold the amount of rows we've looked at. The initial is the total rows in the default group.
int rowstotal = m_colorSet->nColorsGroup()/columnCount();
if (row<=rowstotal && (quint32)(row*columnCount()+column)<m_colorSet->nColorsGroup()) {
//if the total rows are in the default group, we just return an index.
return QAbstractTableModel::index(row, column, parent);
} else if(row<0 && column<0) {
return QAbstractTableModel::index(0, 0, parent);
}
if (m_colorSet->nColorsGroup()==0) {
rowstotal+=1; //always add one for the default group when considering groups.
}
Q_FOREACH (QString groupName, m_colorSet->getGroupNames()){
//we make an int for the rows added by the current group.
int newrows = 1+m_colorSet->nColorsGroup(groupName)/columnCount();
if (m_colorSet->nColorsGroup(groupName)%columnCount() > 0) {
newrows+=1;
}
if (m_colorSet->nColorsGroup(groupName)==0) {
newrows+=1; //always add one for the group when considering groups.
}
if (rowstotal + newrows>rowCount()) {
newrows = rowCount() - rowstotal;
}
quint32 tempIndex = (quint32)((row-(rowstotal+2))*columnCount()+column);
if (row == rowstotal+1) {
//rowstotal+1 is taken up by the groupname.
return QAbstractTableModel::index(row, 0, parent);
} else if (row > (rowstotal+1) && row <= rowstotal+newrows && tempIndex<m_colorSet->nColorsGroup(groupName)){
//otherwise it's an index to the colors in the group.
return QAbstractTableModel::index(row, column, parent);
}
//add the new rows to the totalrows we've looked at.
rowstotal += newrows;
}
}
return QModelIndex();
}
void KisPaletteModel::setColorSet(KoColorSet* colorSet)
{
m_colorSet = colorSet;
reset();
}
KoColorSet* KisPaletteModel::colorSet() const
{
return m_colorSet;
}
QModelIndex KisPaletteModel::indexFromId(int i) const
{
QModelIndex index = QModelIndex();
if (i < (int)colorSet()->nColorsGroup(0)) {
index = QAbstractTableModel::index(i/columnCount(), i%columnCount());
if (!index.isValid()) {
index = QAbstractTableModel::index(0,0,QModelIndex());
}
return index;
} else {
int rowstotal = 1+m_colorSet->nColorsGroup()/columnCount();
int totalIndexes = colorSet()->nColorsGroup();
Q_FOREACH (QString groupName, m_colorSet->getGroupNames()){
totalIndexes += colorSet()->nColorsGroup(groupName);
if (totalIndexes<i) {
rowstotal += 1+m_colorSet->nColorsGroup(groupName)/columnCount();
if (m_colorSet->nColorsGroup(groupName)%columnCount() > 0) {
rowstotal+=1;
}
rowstotal+=1;
} else {
index = QAbstractTableModel::index(rowstotal, i-(rowstotal*columnCount()));
}
}
}
return index;
}
int KisPaletteModel::idFromIndex(const QModelIndex &index) const
{
if (index.isValid()==false || qVariantValue<bool>(index.data(IsHeaderRole))) {
return -1;
}
int i=0;
QStringList entryList = qVariantValue<QStringList>(data(index, RetrieveEntryRole));
if (entryList.at(0)==QString()) {
return entryList.at(1).toUInt();
}
i = colorSet()->nColorsGroup("");
//find at which position the group is.
int groupIndex = colorSet()->getGroupNames().indexOf(entryList.at(0));
//add all the groupsizes onto it till we get to our group.
for(int g=0; g<groupIndex; g++) {
i+=colorSet()->nColorsGroup(colorSet()->getGroupNames().at(g));
}
//then add the index.
i += entryList.at(1).toUInt();
return i;
}
KoColorSetEntry KisPaletteModel::colorSetEntryFromIndex(const QModelIndex &index) const
{
QStringList entryList = qVariantValue<QStringList>(data(index, RetrieveEntryRole));
QString groupName = entryList.at(0);
quint32 indexInGroup = entryList.at(1).toUInt();
return m_colorSet->getColorGroup(indexInGroup, groupName);
}
bool KisPaletteModel::addColorSetEntry(KoColorSetEntry entry, QString groupName)
{
+ int col = m_colorSet->nColorsGroup(groupName)%columnCount();
QModelIndex i = getLastEntryIndex();
- beginInsertRows(QModelIndex(), i.row(), i.row()+1);
+ if (col+1>columnCount()) {
+ beginInsertRows(QModelIndex(), i.row(), i.row()+1);
+ }
+ if (m_colorSet->nColors()<columnCount()) {
+ beginInsertColumns(QModelIndex(), m_colorSet->nColors(), m_colorSet->nColors()+1);
+ }
m_colorSet->add(entry, groupName);
- endInsertRows();
+ if (col+1>columnCount()) {
+ endInsertRows();
+ }
+ if (m_colorSet->nColors()<columnCount()) {
+ endInsertColumns();
+ }
return true;
}
bool KisPaletteModel::removeEntry(QModelIndex index, bool keepColors)
{
QStringList entryList = qVariantValue<QStringList>(index.data(RetrieveEntryRole));
if (entryList.empty()) {
return false;
}
QString groupName = entryList.at(0);
quint32 indexInGroup = entryList.at(1).toUInt();
- beginRemoveRows(QModelIndex(), index.row(), index.row()-1);
+
if (qVariantValue<bool>(index.data(IsHeaderRole))==false) {
+ if (index.column()-1<0
+ && m_colorSet->nColorsGroup(groupName)%columnCount() <1
+ && index.row()-1>0
+ && m_colorSet->nColorsGroup(groupName)/columnCount()>0) {
+ beginRemoveRows(QModelIndex(), index.row(), index.row()-1);
+ }
m_colorSet->removeAt(indexInGroup, groupName);
+ if (index.column()-1<0
+ && m_colorSet->nColorsGroup(groupName)%columnCount() <1
+ && index.row()-1>0
+ && m_colorSet->nColorsGroup(groupName)/columnCount()>0) {
+ endRemoveRows();
+ }
} else {
+ beginRemoveRows(QModelIndex(), index.row(), index.row()-1);
m_colorSet->removeGroup(groupName, keepColors);
+ endRemoveRows();
}
- endRemoveRows();
return true;
}
bool KisPaletteModel::addGroup(QString groupName)
{
QModelIndex i = getLastEntryIndex();
beginInsertRows(QModelIndex(), i.row(), i.row()+1);
m_colorSet->addGroup(groupName);
endInsertRows();
return true;
}
bool KisPaletteModel::removeRows(int row, int count, const QModelIndex &parent)
{
Q_ASSERT(!parent.isValid());
int beginRow = qMax(0, row);
int endRow = qMin(row + count - 1, (int)m_colorSet->nColors() - 1);
beginRemoveRows(parent, beginRow, endRow);
// Find the palette entry at row, count, remove from KoColorSet
endRemoveRows();
return true;
}
bool KisPaletteModel::dropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent)
{
if (!data->hasFormat("krita/x-colorsetentry") && !data->hasFormat("krita/x-colorsetgroup")) {
return false;
}
if (action == Qt::IgnoreAction) {
return false;
}
int endRow;
int endColumn;
if (!parent.isValid()) {
if (row < 0) {
endRow = indexFromId(m_colorSet->nColors()).row();
endColumn = indexFromId(m_colorSet->nColors()).column();
} else {
endRow = qMin(row, indexFromId(m_colorSet->nColors()).row());
endColumn = qMin(column, m_colorSet->columnCount());
}
} else {
endRow = qMin(parent.row(), rowCount());
endColumn = qMin(parent.column(), columnCount());
}
if (data->hasFormat("krita/x-colorsetgroup")) {
QByteArray encodedData = data->data("krita/x-colorsetgroup");
QDataStream stream(&encodedData, QIODevice::ReadOnly);
while (!stream.atEnd()) {
QString groupName;
stream >> groupName;
QModelIndex index = this->index(endRow, 0);
if (index.isValid()) {
QStringList entryList = qVariantValue<QStringList>(index.data(RetrieveEntryRole));
QString groupDroppedOn = QString();
if (!entryList.isEmpty()) {
groupDroppedOn = entryList.at(0);
}
int groupIndex = colorSet()->getGroupNames().indexOf(groupName);
beginMoveRows( QModelIndex(), groupIndex, groupIndex, QModelIndex(), endRow);
m_colorSet->moveGroup(groupName, groupDroppedOn);
m_colorSet->save();
endMoveRows();
++endRow;
}
}
} else {
QByteArray encodedData = data->data("krita/x-colorsetentry");
QDataStream stream(&encodedData, QIODevice::ReadOnly);
while (!stream.atEnd()) {
KoColorSetEntry entry;
QString oldGroupName;
int indexInGroup;
QString colorXml;
stream >> entry.name
>> entry.id
>> entry.spotColor
>> indexInGroup
>> oldGroupName
>> colorXml;
QDomDocument doc;
doc.setContent(colorXml);
QDomElement e = doc.documentElement();
QDomElement c = e.firstChildElement();
if (!c.isNull()) {
QString colorDepthId = c.attribute("bitdepth", Integer8BitsColorDepthID.id());
entry.color = KoColor::fromXML(c, colorDepthId);
}
QModelIndex index = this->index(endRow, endColumn);
if (qVariantValue<bool>(index.data(IsHeaderRole))){
endRow+=1;
}
if (index.isValid()) {
/*this is to figure out the row of the old color.
* That way we can in turn avoid moverows from complaining the
* index is out of bounds when using index.
* Makes me wonder if we shouldn't just insert the index of the
* old color when requesting the mimetype...
*/
int i = indexInGroup;
if (oldGroupName != QString()) {
colorSet()->nColorsGroup("");
//find at which position the group is.
int groupIndex = colorSet()->getGroupNames().indexOf(oldGroupName);
//add all the groupsizes onto it till we get to our group.
for(int g=0; g<groupIndex; g++) {
i+=colorSet()->nColorsGroup(colorSet()->getGroupNames().at(g));
}
}
QModelIndex indexOld = indexFromId(i);
if (action == Qt::MoveAction){
- if (indexOld.row()!=endRow && indexOld.row()!=qMax(endRow+1,1)) {
+ if (indexOld.row()!=qMax(endRow, 0) && indexOld.row()!=qMax(endRow+1,1)) {
beginMoveRows(QModelIndex(), indexOld.row(), indexOld.row(), QModelIndex(), qMax(endRow+1,1));
}
- if (indexOld.column()!=endColumn && indexOld.column()!=qMax(endColumn+1,1)) {
+ if (indexOld.column()!=qMax(endColumn, 0) && indexOld.column()!=qMax(endColumn+1,1)) {
beginMoveColumns(QModelIndex(), indexOld.column(), indexOld.column(), QModelIndex(), qMax(endColumn+1,1));
}
} else {
beginInsertRows(QModelIndex(), endRow, endRow);
}
QStringList entryList = qVariantValue<QStringList>(index.data(RetrieveEntryRole));
QString entryInGroup = "0";
QString groupName = QString();
if (!entryList.isEmpty()) {
groupName = entryList.at(0);
entryInGroup = entryList.at(1);
}
int location = entryInGroup.toInt();
// Insert the entry
if (groupName==oldGroupName && qVariantValue<bool>(index.data(IsHeaderRole))==true) {
groupName=QString();
location=m_colorSet->nColorsGroup();
}
m_colorSet->insertBefore(entry, location, groupName);
if (groupName==oldGroupName && location<indexInGroup) {
indexInGroup+=1;
}
if (action == Qt::MoveAction){
m_colorSet->removeAt(indexInGroup, oldGroupName);
}
m_colorSet->save();
if (action == Qt::MoveAction){
- if (indexOld.row()!=endRow && indexOld.row()!=qMax(endRow+1,1)) {
+ if (indexOld.row()!=qMax(endRow, 0) && indexOld.row()!=qMax(endRow+1,1)) {
endMoveRows();
}
- if (indexOld.column()!=endColumn && indexOld.column()!=qMax(endColumn+1,1)) {
+ if (indexOld.column()!=qMax(endColumn, 0) && indexOld.column()!=qMax(endColumn+1,1)) {
endMoveColumns();
}
} else {
endInsertRows();
}
++endRow;
}
}
}
return true;
}
QMimeData *KisPaletteModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *mimeData = new QMimeData();
QByteArray encodedData;
QDataStream stream(&encodedData, QIODevice::WriteOnly);
QString mimeTypeName = "krita/x-colorsetentry";
//Q_FOREACH(const QModelIndex &index, indexes) {
QModelIndex index = indexes.last();
if (index.isValid()) {
if (qVariantValue<bool>(index.data(IsHeaderRole))==false) {
KoColorSetEntry entry = colorSetEntryFromIndex(index);
QStringList entryList = qVariantValue<QStringList>(index.data(RetrieveEntryRole));
QString groupName = QString();
int indexInGroup = 0;
if (!entryList.isEmpty()) {
groupName = entryList.at(0);
QString iig = entryList.at(1);
indexInGroup = iig.toInt();
}
QDomDocument doc;
QDomElement root = doc.createElement("Color");
root.setAttribute("bitdepth", entry.color.colorSpace()->colorDepthId().id());
doc.appendChild(root);
entry.color.toXML(doc, root);
stream << entry.name
<< entry.id
<< entry.spotColor
<< indexInGroup
<< groupName
<< doc.toString();
} else {
mimeTypeName = "krita/x-colorsetgroup";
QStringList entryList = qVariantValue<QStringList>(index.data(RetrieveEntryRole));
QString groupName = QString();
if (!entryList.isEmpty()) {
groupName = entryList.at(0);
}
stream << groupName;
}
}
mimeData->setData(mimeTypeName, encodedData);
return mimeData;
}
QStringList KisPaletteModel::mimeTypes() const
{
return QStringList() << "krita/x-colorsetentry" << "krita/x-colorsetgroup";
}
Qt::DropActions KisPaletteModel::supportedDropActions() const
{
return Qt::MoveAction;
}
diff --git a/libs/ui/KisViewManager.cpp b/libs/ui/KisViewManager.cpp
index 8f127d3abd..dbaafb813b 100644
--- a/libs/ui/KisViewManager.cpp
+++ b/libs/ui/KisViewManager.cpp
@@ -1,1302 +1,1317 @@
/*
* This file is part of KimageShop^WKrayon^WKrita
*
* Copyright (c) 1999 Matthias Elter <me@kde.org>
* 1999 Michael Koch <koch@kde.org>
* 1999 Carsten Pfeiffer <pfeiffer@kde.org>
* 2002 Patrick Julien <freak@codepimps.org>
* 2003-2011 Boudewijn Rempt <boud@valdyas.org>
* 2004 Clarence Dang <dang@kde.org>
* 2011 José Luis Vergara <pentalis@gmail.com>
+ * 2017 L. E. Segovia <leo.segovia@siggraph.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <stdio.h>
#include "KisViewManager.h"
#include <QPrinter>
#include <QAction>
#include <QApplication>
#include <QBuffer>
#include <QByteArray>
#include <QDesktopServices>
#include <QDesktopWidget>
#include <QGridLayout>
#include <QMainWindow>
#include <QMenu>
#include <QMenuBar>
#include <QMessageBox>
#include <QObject>
#include <QPoint>
#include <QPrintDialog>
#include <QRect>
#include <QScrollBar>
#include <QStatusBar>
#include <QToolBar>
#include <QUrl>
#include <QWidget>
#include <kactioncollection.h>
#include <klocalizedstring.h>
#include <KoResourcePaths.h>
#include <kselectaction.h>
#include <KoCanvasController.h>
#include <KoCompositeOp.h>
#include <KoDockRegistry.h>
#include <KoDockWidgetTitleBar.h>
#include <KoProperties.h>
#include <KoResourceItemChooserSync.h>
#include <KoSelection.h>
#include <KoStore.h>
#include <KoToolManager.h>
#include <KoToolRegistry.h>
#include <KoViewConverter.h>
#include <KoZoomHandler.h>
#include <KoPluginLoader.h>
#include <KoDocumentInfo.h>
#include <KoGlobal.h>
#include <KoColorSpaceRegistry.h>
#include "input/kis_input_manager.h"
#include "canvas/kis_canvas2.h"
#include "canvas/kis_canvas_controller.h"
#include "canvas/kis_grid_manager.h"
#include "dialogs/kis_dlg_blacklist_cleanup.h"
#include "input/kis_input_profile_manager.h"
#include "kis_action_manager.h"
#include "kis_action.h"
#include "kis_canvas_controls_manager.h"
#include "kis_canvas_resource_provider.h"
#include "kis_composite_progress_proxy.h"
#include "kis_config.h"
#include "kis_config_notifier.h"
#include "kis_control_frame.h"
#include "kis_coordinates_converter.h"
#include "KisDocument.h"
#include "kis_favorite_resource_manager.h"
#include "kis_filter_manager.h"
#include "kis_group_layer.h"
#include <kis_image.h>
#include "kis_image_manager.h"
#include <kis_layer.h>
#include "kis_mainwindow_observer.h"
#include "kis_mask_manager.h"
#include "kis_mimedata.h"
#include "kis_mirror_manager.h"
#include "kis_node_commands_adapter.h"
#include "kis_node.h"
#include "kis_node_manager.h"
#include "kis_painting_assistants_manager.h"
#include <kis_paint_layer.h>
#include "kis_paintop_box.h"
#include <brushengine/kis_paintop_preset.h>
#include "KisPart.h"
#include "KisPrintJob.h"
#include "kis_progress_widget.h"
#include "kis_resource_server_provider.h"
#include "kis_selection.h"
#include "kis_selection_manager.h"
#include "kis_shape_controller.h"
#include "kis_shape_layer.h"
#include <kis_signal_compressor.h>
#include "kis_statusbar.h"
#include <KisTemplateCreateDia.h>
#include <kis_tool_freehand.h>
#include "kis_tooltip_manager.h"
#include <kis_undo_adapter.h>
#include "KisView.h"
#include "kis_zoom_manager.h"
#include "widgets/kis_floating_message.h"
#include "kis_signal_auto_connection.h"
#include "kis_script_manager.h"
#include "kis_icon_utils.h"
#include "kis_guides_manager.h"
#include "kis_derived_resources.h"
#include "dialogs/kis_delayed_save_dialog.h"
class BlockingUserInputEventFilter : public QObject
{
bool eventFilter(QObject *watched, QEvent *event) override
{
Q_UNUSED(watched);
if(dynamic_cast<QWheelEvent*>(event)
|| dynamic_cast<QKeyEvent*>(event)
|| dynamic_cast<QMouseEvent*>(event)) {
return true;
}
else {
return false;
}
}
};
class KisViewManager::KisViewManagerPrivate
{
public:
KisViewManagerPrivate(KisViewManager *_q, KActionCollection *_actionCollection, QWidget *_q_parent)
: filterManager(_q)
, createTemplate(0)
, saveIncremental(0)
, saveIncrementalBackup(0)
, openResourcesDirectory(0)
, rotateCanvasRight(0)
, rotateCanvasLeft(0)
, resetCanvasRotation(0)
, wrapAroundAction(0)
, levelOfDetailAction(0)
, showRulersAction(0)
, rulersTrackMouseAction(0)
, zoomTo100pct(0)
, zoomIn(0)
, zoomOut(0)
, selectionManager(_q)
, statusBar(_q)
, controlFrame(_q, _q_parent)
, nodeManager(_q)
, imageManager(_q)
, gridManager(_q)
, canvasControlsManager(_q)
, paintingAssistantsManager(_q)
, actionManager(_q, _actionCollection)
, mainWindow(0)
, showFloatingMessage(true)
, currentImageView(0)
, canvasResourceProvider(_q)
, canvasResourceManager()
, guiUpdateCompressor(30, KisSignalCompressor::POSTPONE, _q)
, actionCollection(_actionCollection)
, mirrorManager(_q)
, inputManager(_q)
, scriptManager(_q)
, actionAuthor(0)
{
canvasResourceManager.addDerivedResourceConverter(toQShared(new KisCompositeOpResourceConverter));
canvasResourceManager.addDerivedResourceConverter(toQShared(new KisEffectiveCompositeOpResourceConverter));
canvasResourceManager.addDerivedResourceConverter(toQShared(new KisOpacityResourceConverter));
canvasResourceManager.addDerivedResourceConverter(toQShared(new KisFlowResourceConverter));
canvasResourceManager.addDerivedResourceConverter(toQShared(new KisSizeResourceConverter));
canvasResourceManager.addDerivedResourceConverter(toQShared(new KisLodAvailabilityResourceConverter));
canvasResourceManager.addDerivedResourceConverter(toQShared(new KisEraserModeResourceConverter));
canvasResourceManager.addResourceUpdateMediator(toQShared(new KisPresetUpdateMediator));
}
public:
KisFilterManager filterManager;
KisAction *createTemplate;
KisAction *createCopy;
KisAction *saveIncremental;
KisAction *saveIncrementalBackup;
KisAction *openResourcesDirectory;
KisAction *rotateCanvasRight;
KisAction *rotateCanvasLeft;
KisAction *resetCanvasRotation;
KisAction *wrapAroundAction;
KisAction *levelOfDetailAction;
KisAction *showRulersAction;
KisAction *rulersTrackMouseAction;
KisAction *zoomTo100pct;
KisAction *zoomIn;
KisAction *zoomOut;
KisAction *softProof;
KisAction *gamutCheck;
KisSelectionManager selectionManager;
KisGuidesManager guidesManager;
KisStatusBar statusBar;
KisControlFrame controlFrame;
KisNodeManager nodeManager;
KisImageManager imageManager;
KisGridManager gridManager;
KisCanvasControlsManager canvasControlsManager;
KisPaintingAssistantsManager paintingAssistantsManager;
BlockingUserInputEventFilter blockingEventFilter;
KisActionManager actionManager;
QMainWindow* mainWindow;
QPointer<KisFloatingMessage> savedFloatingMessage;
bool showFloatingMessage;
QPointer<KisView> currentImageView;
KisCanvasResourceProvider canvasResourceProvider;
KoCanvasResourceManager canvasResourceManager;
KisSignalCompressor guiUpdateCompressor;
KActionCollection *actionCollection;
KisMirrorManager mirrorManager;
KisInputManager inputManager;
KisSignalAutoConnectionsStore viewConnections;
KisScriptManager scriptManager;
KSelectAction *actionAuthor; // Select action for author profile.
QByteArray canvasState;
+#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
+ QFlags<Qt::WindowState> windowFlags;
+#endif
bool blockUntilOperationsFinishedImpl(KisImageSP image, bool force);
};
KisViewManager::KisViewManager(QWidget *parent, KActionCollection *_actionCollection)
: d(new KisViewManagerPrivate(this, _actionCollection, parent))
{
d->actionCollection = _actionCollection;
d->mainWindow = dynamic_cast<QMainWindow*>(parent);
d->canvasResourceProvider.setResourceManager(&d->canvasResourceManager);
connect(&d->guiUpdateCompressor, SIGNAL(timeout()), this, SLOT(guiUpdateTimeout()));
createActions();
setupManagers();
// These initialization functions must wait until KisViewManager ctor is complete.
d->statusBar.setup();
d->controlFrame.setup(parent);
//Check to draw scrollbars after "Canvas only mode" toggle is created.
this->showHideScrollbars();
QScopedPointer<KoDummyCanvasController> dummy(new KoDummyCanvasController(actionCollection()));
KoToolManager::instance()->registerToolActions(actionCollection(), dummy.data());
QTimer::singleShot(0, this, SLOT(initializeStatusBarVisibility()));
connect(KoToolManager::instance(), SIGNAL(inputDeviceChanged(KoInputDevice)),
d->controlFrame.paintopBox(), SLOT(slotInputDeviceChanged(KoInputDevice)));
connect(KoToolManager::instance(), SIGNAL(changedTool(KoCanvasController*,int)),
d->controlFrame.paintopBox(), SLOT(slotToolChanged(KoCanvasController*,int)));
connect(&d->nodeManager, SIGNAL(sigNodeActivated(KisNodeSP)),
resourceProvider(), SLOT(slotNodeActivated(KisNodeSP)));
connect(resourceProvider()->resourceManager(), SIGNAL(canvasResourceChanged(int,QVariant)),
d->controlFrame.paintopBox(), SLOT(slotCanvasResourceChanged(int,QVariant)));
connect(KisPart::instance(), SIGNAL(sigViewAdded(KisView*)), SLOT(slotViewAdded(KisView*)));
connect(KisPart::instance(), SIGNAL(sigViewRemoved(KisView*)), SLOT(slotViewRemoved(KisView*)));
connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(slotUpdateAuthorProfileActions()));
KisInputProfileManager::instance()->loadProfiles();
KisConfig cfg;
d->showFloatingMessage = cfg.showCanvasMessages();
}
KisViewManager::~KisViewManager()
{
KisConfig cfg;
if (resourceProvider() && resourceProvider()->currentPreset()) {
cfg.writeEntry("LastPreset", resourceProvider()->currentPreset()->name());
cfg.writeKoColor("LastForeGroundColor",resourceProvider()->fgColor());
cfg.writeKoColor("LastBackGroundColor",resourceProvider()->bgColor());
}
cfg.writeEntry("baseLength", KoResourceItemChooserSync::instance()->baseLength());
delete d;
}
KActionCollection *KisViewManager::actionCollection() const
{
return d->actionCollection;
}
void KisViewManager::slotViewAdded(KisView *view)
{
d->inputManager.addTrackedCanvas(view->canvasBase());
if (viewCount() == 0) {
d->statusBar.showAllStatusBarItems();
}
}
void KisViewManager::slotViewRemoved(KisView *view)
{
d->inputManager.removeTrackedCanvas(view->canvasBase());
if (viewCount() == 0) {
d->statusBar.hideAllStatusBarItems();
}
}
void KisViewManager::setCurrentView(KisView *view)
{
bool first = true;
if (d->currentImageView) {
d->currentImageView->notifyCurrentStateChanged(false);
d->currentImageView->canvasBase()->setCursor(QCursor(Qt::ArrowCursor));
first = false;
KisDocument* doc = d->currentImageView->document();
if (doc) {
doc->disconnect(this);
}
d->currentImageView->canvasController()->proxyObject->disconnect(&d->statusBar);
d->viewConnections.clear();
}
d->softProof->setChecked(view->softProofing());
d->gamutCheck->setChecked(view->gamutCheck());
QPointer<KisView>imageView = qobject_cast<KisView*>(view);
if (imageView) {
// Wait for the async image to have loaded
KisDocument* doc = view->document();
// connect(canvasController()->proxyObject, SIGNAL(documentMousePositionChanged(QPointF)), d->statusBar, SLOT(documentMousePositionChanged(QPointF)));
d->currentImageView = imageView;
// Restore the last used brush preset, color and background color.
if (first) {
KisConfig cfg;
KisPaintOpPresetResourceServer * rserver = KisResourceServerProvider::instance()->paintOpPresetServer();
QString lastPreset = cfg.readEntry("LastPreset", QString("Basic_tip_default"));
KisPaintOpPresetSP preset = rserver->resourceByName(lastPreset);
if (!preset) {
preset = rserver->resourceByName("Basic_tip_default");
}
if (!preset) {
preset = rserver->resources().first();
}
if (preset) {
paintOpBox()->restoreResource(preset.data());
}
const KoColorSpace *cs = KoColorSpaceRegistry::instance()->rgb8();
KoColor foreground(Qt::black, cs);
d->canvasResourceProvider.setFGColor(cfg.readKoColor("LastForeGroundColor",foreground));
KoColor background(Qt::white, cs);
d->canvasResourceProvider.setBGColor(cfg.readKoColor("LastBackGroundColor",background));
}
KisCanvasController *canvasController = dynamic_cast<KisCanvasController*>(d->currentImageView->canvasController());
d->viewConnections.addUniqueConnection(&d->nodeManager, SIGNAL(sigNodeActivated(KisNodeSP)), doc->image(), SLOT(requestStrokeEndActiveNode()));
d->viewConnections.addUniqueConnection(d->rotateCanvasRight, SIGNAL(triggered()), canvasController, SLOT(rotateCanvasRight15()));
d->viewConnections.addUniqueConnection(d->rotateCanvasLeft, SIGNAL(triggered()),canvasController, SLOT(rotateCanvasLeft15()));
d->viewConnections.addUniqueConnection(d->resetCanvasRotation, SIGNAL(triggered()),canvasController, SLOT(resetCanvasRotation()));
d->viewConnections.addUniqueConnection(d->wrapAroundAction, SIGNAL(toggled(bool)), canvasController, SLOT(slotToggleWrapAroundMode(bool)));
d->wrapAroundAction->setChecked(canvasController->wrapAroundMode());
d->viewConnections.addUniqueConnection(d->levelOfDetailAction, SIGNAL(toggled(bool)), canvasController, SLOT(slotToggleLevelOfDetailMode(bool)));
d->levelOfDetailAction->setChecked(canvasController->levelOfDetailMode());
d->viewConnections.addUniqueConnection(d->currentImageView->image(), SIGNAL(sigColorSpaceChanged(const KoColorSpace*)), d->controlFrame.paintopBox(), SLOT(slotColorSpaceChanged(const KoColorSpace*)));
d->viewConnections.addUniqueConnection(d->showRulersAction, SIGNAL(toggled(bool)), imageView->zoomManager(), SLOT(setShowRulers(bool)));
d->viewConnections.addUniqueConnection(d->rulersTrackMouseAction, SIGNAL(toggled(bool)), imageView->zoomManager(), SLOT(setRulersTrackMouse(bool)));
d->viewConnections.addUniqueConnection(d->zoomTo100pct, SIGNAL(triggered()), imageView->zoomManager(), SLOT(zoomTo100()));
d->viewConnections.addUniqueConnection(d->zoomIn, SIGNAL(triggered()), imageView->zoomController()->zoomAction(), SLOT(zoomIn()));
d->viewConnections.addUniqueConnection(d->zoomOut, SIGNAL(triggered()), imageView->zoomController()->zoomAction(), SLOT(zoomOut()));
d->viewConnections.addUniqueConnection(d->softProof, SIGNAL(toggled(bool)), view, SLOT(slotSoftProofing(bool)) );
d->viewConnections.addUniqueConnection(d->gamutCheck, SIGNAL(toggled(bool)), view, SLOT(slotGamutCheck(bool)) );
imageView->zoomManager()->setShowRulers(d->showRulersAction->isChecked());
imageView->zoomManager()->setRulersTrackMouse(d->rulersTrackMouseAction->isChecked());
showHideScrollbars();
}
d->filterManager.setView(imageView);
d->selectionManager.setView(imageView);
d->guidesManager.setView(imageView);
d->nodeManager.setView(imageView);
d->imageManager.setView(imageView);
d->canvasControlsManager.setView(imageView);
d->actionManager.setView(imageView);
d->gridManager.setView(imageView);
d->statusBar.setView(imageView);
d->paintingAssistantsManager.setView(imageView);
d->mirrorManager.setView(imageView);
if (d->currentImageView) {
d->currentImageView->notifyCurrentStateChanged(true);
d->currentImageView->canvasController()->activate();
d->currentImageView->canvasController()->setFocus();
}
d->actionManager.updateGUI();
d->viewConnections.addUniqueConnection(
image(), SIGNAL(sigSizeChanged(const QPointF&, const QPointF&)),
resourceProvider(), SLOT(slotImageSizeChanged()));
d->viewConnections.addUniqueConnection(
image(), SIGNAL(sigResolutionChanged(double,double)),
resourceProvider(), SLOT(slotOnScreenResolutionChanged()));
d->viewConnections.addUniqueConnection(
image(), SIGNAL(sigNodeChanged(KisNodeSP)),
this, SLOT(updateGUI()));
d->viewConnections.addUniqueConnection(
view->zoomManager()->zoomController(),
SIGNAL(zoomChanged(KoZoomMode::Mode,qreal)),
resourceProvider(), SLOT(slotOnScreenResolutionChanged()));
resourceProvider()->slotImageSizeChanged();
resourceProvider()->slotOnScreenResolutionChanged();
Q_EMIT viewChanged();
}
KoZoomController *KisViewManager::zoomController() const
{
if (d->currentImageView) {
return d->currentImageView->zoomController();
}
return 0;
}
KisImageWSP KisViewManager::image() const
{
if (document()) {
return document()->image();
}
return 0;
}
KisCanvasResourceProvider * KisViewManager::resourceProvider()
{
return &d->canvasResourceProvider;
}
KisCanvas2 * KisViewManager::canvasBase() const
{
if (d && d->currentImageView) {
return d->currentImageView->canvasBase();
}
return 0;
}
QWidget* KisViewManager::canvas() const
{
if (d && d->currentImageView && d->currentImageView->canvasBase()->canvasWidget()) {
return d->currentImageView->canvasBase()->canvasWidget();
}
return 0;
}
KisStatusBar * KisViewManager::statusBar() const
{
return &d->statusBar;
}
void KisViewManager::addStatusBarItem(QWidget *widget, int stretch, bool permanent)
{
d->statusBar.addStatusBarItem(widget, stretch, permanent);
}
void KisViewManager::removeStatusBarItem(QWidget *widget)
{
d->statusBar.removeStatusBarItem(widget);
}
KisPaintopBox* KisViewManager::paintOpBox() const
{
return d->controlFrame.paintopBox();
}
KoProgressUpdater* KisViewManager::createProgressUpdater(KoProgressUpdater::Mode mode)
{
return new KisProgressUpdater(d->statusBar.progress(), document()->progressProxy(), mode);
}
KisSelectionManager * KisViewManager::selectionManager()
{
return &d->selectionManager;
}
KisNodeSP KisViewManager::activeNode()
{
return d->nodeManager.activeNode();
}
KisLayerSP KisViewManager::activeLayer()
{
return d->nodeManager.activeLayer();
}
KisPaintDeviceSP KisViewManager::activeDevice()
{
return d->nodeManager.activePaintDevice();
}
KisZoomManager * KisViewManager::zoomManager()
{
if (d->currentImageView) {
return d->currentImageView->zoomManager();
}
return 0;
}
KisFilterManager * KisViewManager::filterManager()
{
return &d->filterManager;
}
KisImageManager * KisViewManager::imageManager()
{
return &d->imageManager;
}
KisInputManager* KisViewManager::inputManager() const
{
return &d->inputManager;
}
KisSelectionSP KisViewManager::selection()
{
if (d->currentImageView) {
return d->currentImageView->selection();
}
return 0;
}
bool KisViewManager::selectionEditable()
{
KisLayerSP layer = activeLayer();
if (layer) {
KoProperties properties;
QList<KisNodeSP> masks = layer->childNodes(QStringList("KisSelectionMask"), properties);
if (masks.size() == 1) {
return masks[0]->isEditable();
}
}
// global selection is always editable
return true;
}
KisUndoAdapter * KisViewManager::undoAdapter()
{
if (!document()) return 0;
KisImageWSP image = document()->image();
Q_ASSERT(image);
return image->undoAdapter();
}
void KisViewManager::createActions()
{
KisConfig cfg;
d->saveIncremental = actionManager()->createAction("save_incremental_version");
connect(d->saveIncremental, SIGNAL(triggered()), this, SLOT(slotSaveIncremental()));
d->saveIncrementalBackup = actionManager()->createAction("save_incremental_backup");
connect(d->saveIncrementalBackup, SIGNAL(triggered()), this, SLOT(slotSaveIncrementalBackup()));
connect(mainWindow(), SIGNAL(documentSaved()), this, SLOT(slotDocumentSaved()));
d->saveIncremental->setEnabled(false);
d->saveIncrementalBackup->setEnabled(false);
KisAction *tabletDebugger = actionManager()->createAction("tablet_debugger");
connect(tabletDebugger, SIGNAL(triggered()), this, SLOT(toggleTabletLogger()));
d->createTemplate = actionManager()->createAction("create_template");
connect(d->createTemplate, SIGNAL(triggered()), this, SLOT(slotCreateTemplate()));
d->createCopy = actionManager()->createAction("create_copy");
connect(d->createCopy, SIGNAL(triggered()), this, SLOT(slotCreateCopy()));
d->openResourcesDirectory = actionManager()->createAction("open_resources_directory");
connect(d->openResourcesDirectory, SIGNAL(triggered()), SLOT(openResourcesDirectory()));
d->rotateCanvasRight = actionManager()->createAction("rotate_canvas_right");
d->rotateCanvasLeft = actionManager()->createAction("rotate_canvas_left");
d->resetCanvasRotation = actionManager()->createAction("reset_canvas_rotation");
d->wrapAroundAction = actionManager()->createAction("wrap_around_mode");
d->levelOfDetailAction = actionManager()->createAction("level_of_detail_mode");
d->softProof = actionManager()->createAction("softProof");
d->gamutCheck = actionManager()->createAction("gamutCheck");
KisAction *tAction = actionManager()->createAction("showStatusBar");
tAction->setChecked(cfg.showStatusBar());
connect(tAction, SIGNAL(toggled(bool)), this, SLOT(showStatusBar(bool)));
tAction = actionManager()->createAction("view_show_canvas_only");
tAction->setChecked(false);
connect(tAction, SIGNAL(toggled(bool)), this, SLOT(switchCanvasOnly(bool)));
//Workaround, by default has the same shortcut as mirrorCanvas
KisAction *a = dynamic_cast<KisAction*>(actionCollection()->action("format_italic"));
if (a) {
a->setDefaultShortcut(QKeySequence());
}
a = actionManager()->createAction("edit_blacklist_cleanup");
connect(a, SIGNAL(triggered()), this, SLOT(slotBlacklistCleanup()));
d->showRulersAction = actionManager()->createAction("view_ruler");
d->showRulersAction->setChecked(cfg.showRulers());
connect(d->showRulersAction, SIGNAL(toggled(bool)), SLOT(slotSaveShowRulersState(bool)));
d->rulersTrackMouseAction = actionManager()->createAction("rulers_track_mouse");
d->rulersTrackMouseAction->setChecked(cfg.rulersTrackMouse());
connect(d->rulersTrackMouseAction, SIGNAL(toggled(bool)), SLOT(slotSaveRulersTrackMouseState(bool)));
d->zoomTo100pct = actionManager()->createAction("zoom_to_100pct");
d->zoomIn = actionManager()->createStandardAction(KStandardAction::ZoomIn, 0, "");
d->zoomOut = actionManager()->createStandardAction(KStandardAction::ZoomOut, 0, "");
d->actionAuthor = new KSelectAction(KisIconUtils::loadIcon("im-user"), i18n("Active Author Profile"), this);
connect(d->actionAuthor, SIGNAL(triggered(const QString &)), this, SLOT(changeAuthorProfile(const QString &)));
actionCollection()->addAction("settings_active_author", d->actionAuthor);
slotUpdateAuthorProfileActions();
}
void KisViewManager::setupManagers()
{
// Create the managers for filters, selections, layers etc.
// XXX: When the currentlayer changes, call updateGUI on all
// managers
d->filterManager.setup(actionCollection(), actionManager());
d->selectionManager.setup(actionManager());
d->guidesManager.setup(actionManager());
d->nodeManager.setup(actionCollection(), actionManager());
d->imageManager.setup(actionManager());
d->gridManager.setup(actionManager());
d->paintingAssistantsManager.setup(actionManager());
d->canvasControlsManager.setup(actionManager());
d->mirrorManager.setup(actionCollection());
d->scriptManager.setup(actionCollection(), actionManager());
}
void KisViewManager::updateGUI()
{
d->guiUpdateCompressor.start();
}
void KisViewManager::slotBlacklistCleanup()
{
KisDlgBlacklistCleanup dialog;
dialog.exec();
}
KisNodeManager * KisViewManager::nodeManager() const
{
return &d->nodeManager;
}
KisActionManager* KisViewManager::actionManager() const
{
return &d->actionManager;
}
KisGridManager * KisViewManager::gridManager() const
{
return &d->gridManager;
}
KisGuidesManager * KisViewManager::guidesManager() const
{
return &d->guidesManager;
}
KisDocument *KisViewManager::document() const
{
if (d->currentImageView && d->currentImageView->document()) {
return d->currentImageView->document();
}
return 0;
}
KisScriptManager *KisViewManager::scriptManager() const
{
return &d->scriptManager;
}
int KisViewManager::viewCount() const
{
KisMainWindow *mw = qobject_cast<KisMainWindow*>(d->mainWindow);
if (mw) {
return mw->viewCount();
}
return 0;
}
bool KisViewManager::KisViewManagerPrivate::blockUntilOperationsFinishedImpl(KisImageSP image, bool force)
{
const int busyWaitDelay = 1000;
KisDelayedSaveDialog dialog(image, !force ? KisDelayedSaveDialog::GeneralDialog : KisDelayedSaveDialog::ForcedDialog, busyWaitDelay, mainWindow);
dialog.blockIfImageIsBusy();
return dialog.result() == QDialog::Accepted;
}
bool KisViewManager::blockUntilOperationsFinished(KisImageSP image)
{
return d->blockUntilOperationsFinishedImpl(image, false);
}
void KisViewManager::blockUntilOperationsFinishedForced(KisImageSP image)
{
d->blockUntilOperationsFinishedImpl(image, true);
}
void KisViewManager::slotCreateTemplate()
{
if (!document()) return;
KisTemplateCreateDia::createTemplate( QStringLiteral("templates/"), ".kra", document(), mainWindow());
}
void KisViewManager::slotCreateCopy()
{
if (!document()) return;
KisDocument *doc = KisPart::instance()->createDocument();
QString name = document()->documentInfo()->aboutInfo("name");
if (name.isEmpty()) {
name = document()->url().toLocalFile();
}
name = i18n("%1 (Copy)", name);
doc->documentInfo()->setAboutInfo("title", name);
KisImageWSP image = document()->image();
KisImageSP newImage = new KisImage(doc->createUndoStore(), image->width(), image->height(), image->colorSpace(), name);
newImage->setRootLayer(dynamic_cast<KisGroupLayer*>(image->rootLayer()->clone().data()));
doc->setCurrentImage(newImage);
KisPart::instance()->addDocument(doc);
KisMainWindow *mw = qobject_cast<KisMainWindow*>(d->mainWindow);
mw->addViewAndNotifyLoadingCompleted(doc);
}
QMainWindow* KisViewManager::qtMainWindow() const
{
if (d->mainWindow)
return d->mainWindow;
//Fallback for when we have not yet set the main window.
QMainWindow* w = qobject_cast<QMainWindow*>(qApp->activeWindow());
if(w)
return w;
return mainWindow();
}
void KisViewManager::setQtMainWindow(QMainWindow* newMainWindow)
{
d->mainWindow = newMainWindow;
}
void KisViewManager::slotDocumentSaved()
{
d->saveIncremental->setEnabled(true);
d->saveIncrementalBackup->setEnabled(true);
}
void KisViewManager::slotSaveIncremental()
{
if (!document()) return;
bool foundVersion;
bool fileAlreadyExists;
bool isBackup;
QString version = "000";
QString newVersion;
QString letter;
QString fileName = document()->localFilePath();
// Find current version filenames
// v v Regexp to find incremental versions in the filename, taking our backup scheme into account as well
// Considering our incremental version and backup scheme, format is filename_001~001.ext
QRegExp regex("_\\d{1,4}[.]|_\\d{1,4}[a-z][.]|_\\d{1,4}[~]|_\\d{1,4}[a-z][~]");
regex.indexIn(fileName); // Perform the search
QStringList matches = regex.capturedTexts();
foundVersion = matches.at(0).isEmpty() ? false : true;
// Ensure compatibility with Save Incremental Backup
// If this regex is not kept separate, the entire algorithm needs modification;
// It's simpler to just add this.
QRegExp regexAux("_\\d{1,4}[~]|_\\d{1,4}[a-z][~]");
regexAux.indexIn(fileName); // Perform the search
QStringList matchesAux = regexAux.capturedTexts();
isBackup = matchesAux.at(0).isEmpty() ? false : true;
// If the filename has a version, prepare it for incrementation
if (foundVersion) {
version = matches.at(matches.count() - 1); // Look at the last index, we don't care about other matches
if (version.contains(QRegExp("[a-z]"))) {
version.chop(1); // Trim "."
letter = version.right(1); // Save letter
version.chop(1); // Trim letter
} else {
version.chop(1); // Trim "."
}
version.remove(0, 1); // Trim "_"
} else {
// ...else, simply add a version to it so the next loop works
QRegExp regex2("[.][a-z]{2,4}$"); // Heuristic to find file extension
regex2.indexIn(fileName);
QStringList matches2 = regex2.capturedTexts();
QString extensionPlusVersion = matches2.at(0);
extensionPlusVersion.prepend(version);
extensionPlusVersion.prepend("_");
fileName.replace(regex2, extensionPlusVersion);
}
// Prepare the base for new version filename
int intVersion = version.toInt(0);
++intVersion;
QString baseNewVersion = QString::number(intVersion);
while (baseNewVersion.length() < version.length()) {
baseNewVersion.prepend("0");
}
// Check if the file exists under the new name and search until options are exhausted (test appending a to z)
do {
newVersion = baseNewVersion;
newVersion.prepend("_");
if (!letter.isNull()) newVersion.append(letter);
if (isBackup) {
newVersion.append("~");
} else {
newVersion.append(".");
}
fileName.replace(regex, newVersion);
fileAlreadyExists = QFile(fileName).exists();
if (fileAlreadyExists) {
if (!letter.isNull()) {
char letterCh = letter.at(0).toLatin1();
++letterCh;
letter = QString(QChar(letterCh));
} else {
letter = 'a';
}
}
} while (fileAlreadyExists && letter != "{"); // x, y, z, {...
if (letter == "{") {
QMessageBox::critical(mainWindow(), i18nc("@title:window", "Couldn't save incremental version"), i18n("Alternative names exhausted, try manually saving with a higher number"));
return;
}
document()->setFileBatchMode(true);
document()->saveAs(QUrl::fromUserInput(fileName));
document()->setFileBatchMode(false);
if (mainWindow()) {
mainWindow()->updateCaption();
}
}
void KisViewManager::slotSaveIncrementalBackup()
{
if (!document()) return;
bool workingOnBackup;
bool fileAlreadyExists;
QString version = "000";
QString newVersion;
QString letter;
QString fileName = document()->localFilePath();
// First, discover if working on a backup file, or a normal file
QRegExp regex("~\\d{1,4}[.]|~\\d{1,4}[a-z][.]");
regex.indexIn(fileName); // Perform the search
QStringList matches = regex.capturedTexts();
workingOnBackup = matches.at(0).isEmpty() ? false : true;
if (workingOnBackup) {
// Try to save incremental version (of backup), use letter for alt versions
version = matches.at(matches.count() - 1); // Look at the last index, we don't care about other matches
if (version.contains(QRegExp("[a-z]"))) {
version.chop(1); // Trim "."
letter = version.right(1); // Save letter
version.chop(1); // Trim letter
} else {
version.chop(1); // Trim "."
}
version.remove(0, 1); // Trim "~"
// Prepare the base for new version filename
int intVersion = version.toInt(0);
++intVersion;
QString baseNewVersion = QString::number(intVersion);
QString backupFileName = document()->localFilePath();
while (baseNewVersion.length() < version.length()) {
baseNewVersion.prepend("0");
}
// Check if the file exists under the new name and search until options are exhausted (test appending a to z)
do {
newVersion = baseNewVersion;
newVersion.prepend("~");
if (!letter.isNull()) newVersion.append(letter);
newVersion.append(".");
backupFileName.replace(regex, newVersion);
fileAlreadyExists = QFile(backupFileName).exists();
if (fileAlreadyExists) {
if (!letter.isNull()) {
char letterCh = letter.at(0).toLatin1();
++letterCh;
letter = QString(QChar(letterCh));
} else {
letter = 'a';
}
}
} while (fileAlreadyExists && letter != "{"); // x, y, z, {...
if (letter == "{") {
QMessageBox::critical(mainWindow(), i18nc("@title:window", "Couldn't save incremental backup"), i18n("Alternative names exhausted, try manually saving with a higher number"));
return;
}
QFile::copy(fileName, backupFileName);
document()->saveAs(QUrl::fromUserInput(fileName));
if (mainWindow()) mainWindow()->updateCaption();
}
else { // if NOT working on a backup...
// Navigate directory searching for latest backup version, ignore letters
const quint8 HARDCODED_DIGIT_COUNT = 3;
QString baseNewVersion = "000";
QString backupFileName = document()->localFilePath();
QRegExp regex2("[.][a-z]{2,4}$"); // Heuristic to find file extension
regex2.indexIn(backupFileName);
QStringList matches2 = regex2.capturedTexts();
QString extensionPlusVersion = matches2.at(0);
extensionPlusVersion.prepend(baseNewVersion);
extensionPlusVersion.prepend("~");
backupFileName.replace(regex2, extensionPlusVersion);
// Save version with 1 number higher than the highest version found ignoring letters
do {
newVersion = baseNewVersion;
newVersion.prepend("~");
newVersion.append(".");
backupFileName.replace(regex, newVersion);
fileAlreadyExists = QFile(backupFileName).exists();
if (fileAlreadyExists) {
// Prepare the base for new version filename, increment by 1
int intVersion = baseNewVersion.toInt(0);
++intVersion;
baseNewVersion = QString::number(intVersion);
while (baseNewVersion.length() < HARDCODED_DIGIT_COUNT) {
baseNewVersion.prepend("0");
}
}
} while (fileAlreadyExists);
// Save both as backup and on current file for interapplication workflow
document()->setFileBatchMode(true);
QFile::copy(fileName, backupFileName);
document()->saveAs(QUrl::fromUserInput(fileName));
document()->setFileBatchMode(false);
if (mainWindow()) mainWindow()->updateCaption();
}
}
void KisViewManager::disableControls()
{
// prevents possible crashes, if somebody changes the paintop during dragging by using the mousewheel
// this is for Bug 250944
// the solution blocks all wheel, mouse and key event, while dragging with the freehand tool
// see KisToolFreehand::initPaint() and endPaint()
d->controlFrame.paintopBox()->installEventFilter(&d->blockingEventFilter);
Q_FOREACH (QObject* child, d->controlFrame.paintopBox()->children()) {
child->installEventFilter(&d->blockingEventFilter);
}
}
void KisViewManager::enableControls()
{
d->controlFrame.paintopBox()->removeEventFilter(&d->blockingEventFilter);
Q_FOREACH (QObject* child, d->controlFrame.paintopBox()->children()) {
child->removeEventFilter(&d->blockingEventFilter);
}
}
void KisViewManager::showStatusBar(bool toggled)
{
KisMainWindow *mw = mainWindow();
if(mw && mw->statusBar()) {
mw->statusBar()->setVisible(toggled);
KisConfig cfg;
cfg.setShowStatusBar(toggled);
}
}
void KisViewManager::switchCanvasOnly(bool toggled)
{
KisConfig cfg;
KisMainWindow* main = mainWindow();
if(!main) {
dbgUI << "Unable to switch to canvas-only mode, main window not found";
return;
}
if (toggled) {
d->canvasState = qtMainWindow()->saveState();
+#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
+ d->windowFlags = main->windowState();
+#endif
}
if (cfg.hideStatusbarFullscreen()) {
if (main->statusBar()) {
if (!toggled) {
if (main->statusBar()->dynamicPropertyNames().contains("wasvisible")) {
if (main->statusBar()->property("wasvisible").toBool()) {
main->statusBar()->setVisible(true);
}
}
}
else {
main->statusBar()->setProperty("wasvisible", main->statusBar()->isVisible());
main->statusBar()->setVisible(false);
}
}
}
if (cfg.hideDockersFullscreen()) {
KisAction* action = qobject_cast<KisAction*>(main->actionCollection()->action("view_toggledockers"));
if (action) {
action->setCheckable(true);
if (toggled) {
if (action->isChecked()) {
cfg.setShowDockers(action->isChecked());
action->setChecked(false);
} else {
cfg.setShowDockers(false);
}
} else {
action->setChecked(cfg.showDockers());
}
}
}
+ // QT in windows does not return to maximized upon 4th tab in a row
+ // https://bugreports.qt.io/browse/QTBUG-57882, https://bugreports.qt.io/browse/QTBUG-52555, https://codereview.qt-project.org/#/c/185016/
if (cfg.hideTitlebarFullscreen() && !cfg.fullscreenMode()) {
if(toggled) {
main->setWindowState( main->windowState() | Qt::WindowFullScreen);
} else {
main->setWindowState( main->windowState() & ~Qt::WindowFullScreen);
+#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
+ // If window was maximized prior to fullscreen, restore that
+ if (d->windowFlags & Qt::WindowMaximized) {
+ main->setWindowState( main->windowState() | Qt::WindowMaximized);
+ }
+#endif
}
}
if (cfg.hideMenuFullscreen()) {
if (!toggled) {
if (main->menuBar()->dynamicPropertyNames().contains("wasvisible")) {
if (main->menuBar()->property("wasvisible").toBool()) {
main->menuBar()->setVisible(true);
}
}
}
else {
main->menuBar()->setProperty("wasvisible", main->menuBar()->isVisible());
main->menuBar()->setVisible(false);
}
}
if (cfg.hideToolbarFullscreen()) {
QList<QToolBar*> toolBars = main->findChildren<QToolBar*>();
Q_FOREACH (QToolBar* toolbar, toolBars) {
if (!toggled) {
if (toolbar->dynamicPropertyNames().contains("wasvisible")) {
if (toolbar->property("wasvisible").toBool()) {
toolbar->setVisible(true);
}
}
}
else {
toolbar->setProperty("wasvisible", toolbar->isVisible());
toolbar->setVisible(false);
}
}
}
showHideScrollbars();
if (toggled) {
// show a fading heads-up display about the shortcut to go back
showFloatingMessage(i18n("Going into Canvas-Only mode.\nPress %1 to go back.",
actionCollection()->action("view_show_canvas_only")->shortcut().toString()), QIcon());
}
else {
main->restoreState(d->canvasState);
}
}
void KisViewManager::toggleTabletLogger()
{
d->inputManager.toggleTabletLogger();
}
void KisViewManager::openResourcesDirectory()
{
QString dir = KoResourcePaths::locateLocal("data", "");
QDesktopServices::openUrl(QUrl::fromLocalFile(dir));
}
void KisViewManager::updateIcons()
{
if (mainWindow()) {
QList<QDockWidget*> dockers = mainWindow()->dockWidgets();
Q_FOREACH (QDockWidget* dock, dockers) {
dbgKrita << "name " << dock->objectName();
KoDockWidgetTitleBar* titlebar = dynamic_cast<KoDockWidgetTitleBar*>(dock->titleBarWidget());
if (titlebar) {
titlebar->updateIcons();
}
QObjectList objects;
objects.append(dock);
while (!objects.isEmpty()) {
QObject* object = objects.takeFirst();
objects.append(object->children());
KisIconUtils::updateIconCommon(object);
}
}
}
}
void KisViewManager::initializeStatusBarVisibility()
{
KisConfig cfg;
d->mainWindow->statusBar()->setVisible(cfg.showStatusBar());
}
void KisViewManager::guiUpdateTimeout()
{
d->nodeManager.updateGUI();
d->selectionManager.updateGUI();
d->filterManager.updateGUI();
if (zoomManager()) {
zoomManager()->updateGUI();
}
d->gridManager.updateGUI();
d->actionManager.updateGUI();
}
void KisViewManager::showFloatingMessage(const QString &message, const QIcon& icon, int timeout, KisFloatingMessage::Priority priority, int alignment)
{
if (!d->currentImageView) return;
d->currentImageView->showFloatingMessageImpl(message, icon, timeout, priority, alignment);
emit floatingMessageRequested(message, icon.name());
}
KisMainWindow *KisViewManager::mainWindow() const
{
return qobject_cast<KisMainWindow*>(d->mainWindow);
}
void KisViewManager::showHideScrollbars()
{
if (!d->currentImageView) return;
if (!d->currentImageView->canvasController()) return;
KisConfig cfg;
bool toggled = actionCollection()->action("view_show_canvas_only")->isChecked();
if ( (toggled && cfg.hideScrollbarsFullscreen()) || (!toggled && cfg.hideScrollbars()) ) {
d->currentImageView->canvasController()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
d->currentImageView->canvasController()->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
} else {
d->currentImageView->canvasController()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
d->currentImageView->canvasController()->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
}
}
void KisViewManager::slotSaveShowRulersState(bool value)
{
KisConfig cfg;
cfg.setShowRulers(value);
}
void KisViewManager::slotSaveRulersTrackMouseState(bool value)
{
KisConfig cfg;
cfg.setRulersTrackMouse(value);
}
void KisViewManager::setShowFloatingMessage(bool show)
{
d->showFloatingMessage = show;
}
void KisViewManager::changeAuthorProfile(const QString &profileName)
{
KConfigGroup appAuthorGroup(KoGlobal::calligraConfig(), "Author");
if (profileName.isEmpty()) {
appAuthorGroup.writeEntry("active-profile", "");
} else if (profileName == i18nc("choice for author profile", "Anonymous")) {
appAuthorGroup.writeEntry("active-profile", "anonymous");
} else {
appAuthorGroup.writeEntry("active-profile", profileName);
}
appAuthorGroup.sync();
Q_FOREACH (KisDocument *doc, KisPart::instance()->documents()) {
doc->documentInfo()->updateParameters();
}
}
void KisViewManager::slotUpdateAuthorProfileActions()
{
Q_ASSERT(d->actionAuthor);
if (!d->actionAuthor) {
return;
}
d->actionAuthor->clear();
d->actionAuthor->addAction(i18n("Default Author Profile"));
d->actionAuthor->addAction(i18nc("choice for author profile", "Anonymous"));
KConfigGroup authorGroup(KoGlobal::calligraConfig(), "Author");
QStringList profiles = authorGroup.readEntry("profile-names", QStringList());
Q_FOREACH (const QString &profile , profiles) {
d->actionAuthor->addAction(profile);
}
KConfigGroup appAuthorGroup(KoGlobal::calligraConfig(), "Author");
QString profileName = appAuthorGroup.readEntry("active-profile", "");
if (profileName == "anonymous") {
d->actionAuthor->setCurrentItem(1);
} else if (profiles.contains(profileName)) {
d->actionAuthor->setCurrentAction(profileName);
} else {
d->actionAuthor->setCurrentItem(0);
}
}
diff --git a/libs/ui/forms/wdggeneralsettings.ui b/libs/ui/forms/wdggeneralsettings.ui
index 3b87424cd5..7edacee5df 100644
--- a/libs/ui/forms/wdggeneralsettings.ui
+++ b/libs/ui/forms/wdggeneralsettings.ui
@@ -1,684 +1,684 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WdgGeneralSettings</class>
<widget class="QWidget" name="WdgGeneralSettings">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>759</width>
<height>468</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>552</width>
<height>295</height>
</size>
</property>
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
- <number>2</number>
+ <number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Cursor</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="0">
<layout class="QFormLayout" name="formLayout_2">
<property name="horizontalSpacing">
<number>10</number>
</property>
<property name="verticalSpacing">
<number>10</number>
</property>
<property name="leftMargin">
<number>10</number>
</property>
<property name="topMargin">
<number>10</number>
</property>
<property name="rightMargin">
<number>10</number>
</property>
<property name="bottomMargin">
<number>10</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="textLabel1">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Cursor Shape:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="m_cmbCursorShape"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="textLabel1_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Outline Shape:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="m_cmbOutlineShape"/>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="m_showOutlinePainting">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>200</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Show brush outline while painting</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Window</string>
</attribute>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Multiple Document Mode:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="m_cmbMDIType">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Subwindows</string>
</property>
</item>
<item>
<property name="text">
<string>Tabs</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Background Image (overrides color):</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0">
<item>
<widget class="QLabel" name="m_backgroundimage">
<property name="minimumSize">
<size>
<width>200</width>
<height>0</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="m_bnFileName">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="clearBgImageButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Clear</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Window Background:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="KisColorButton" name="m_mdiColor">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Don't show contents when moving sub-windows:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="m_chkRubberBand">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Show on-canvas popup messages:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="m_chkCanvasMessages">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="7" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="m_chkHiDPI">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Enable Hi-DPI support:</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="m_chkSingleApplication">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_r98">
<property name="text">
<string>Allow only one instance of Krita:</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="Tools">
<attribute name="title">
<string>Tools</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_4">
<item row="1" column="1">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>10</number>
</property>
<property name="leftMargin">
<number>10</number>
</property>
<property name="topMargin">
<number>10</number>
</property>
<property name="rightMargin">
<number>10</number>
</property>
<property name="bottomMargin">
<number>10</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>Tool Options Location (needs restart)</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QRadioButton" name="m_radioToolOptionsInDocker">
<property name="text">
<string>In Doc&amp;ker</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="m_radioToolOptionsInToolbar">
<property name="text">
<string>In Tool&amp;bar</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QCheckBox" name="m_chkSwitchSelectionCtrlAlt">
<property name="text">
<string>Switch Control/Alt Selection Modifiers</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="chkEnableTouch">
<property name="text">
<string>Enable Touch Painting</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="2">
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="Miscellaneous">
<attribute name="title">
<string>Miscellaneous</string>
</attribute>
<layout class="QFormLayout" name="formLayout_3">
<item row="0" column="0">
<widget class="QCheckBox" name="m_autosaveCheckBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Autosave every:</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="KisIntParseSpinBox" name="m_autosaveSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>75</width>
<height>0</height>
</size>
</property>
<property name="suffix">
<string> min</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1440</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
<property name="value">
<number>15</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="m_chkCompressKra">
<property name="text">
<string>Compress .kra files more (slows loading/saving)</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="m_backupFileCheckBox">
<property name="text">
<string>Create backup file </string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="m_chkConvertOnImport">
<property name="text">
<string>On importing images as layers, convert to the image colorspace</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Undo stack size:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="KisIntParseSpinBox" name="m_undoStackSize">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>75</width>
<height>0</height>
</size>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
<property name="value">
<number>30</number>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Number of Palette Presets</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="KisIntParseSpinBox" name="m_favoritePresetsSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>75</width>
<height>0</height>
</size>
</property>
<property name="minimum">
<number>10</number>
</property>
<property name="maximum">
<number>30</number>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QCheckBox" name="chkShowRootLayer">
<property name="text">
<string>Show root layer</string>
</property>
</widget>
</item>
<item row="11" column="1">
<widget class="QCheckBox" name="m_hideSplashScreen">
<property name="text">
<string>Hide splash screen on startup</string>
</property>
</widget>
</item>
<item row="13" column="1">
<widget class="QCheckBox" name="m_chkNativeFileDialog">
<property name="toolTip">
<string>Warning: if you enable this setting and the file dialogs do weird stuff, do not report a bug.</string>
</property>
<property name="text">
<string>Enable native file dialogs (warning: may not work correctly on some systems)</string>
</property>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Maximum brush size:</string>
</property>
</widget>
</item>
<item row="15" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QSpinBox" name="intMaxBrushSize">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>The maximum diameter of a brush in pixels.</string>
</property>
<property name="suffix">
<string comment="pixel">px</string>
</property>
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
<property name="value">
<number>1000</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_10">
<property name="text">
<string>(Needs restart)</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="17" column="1">
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>504</width>
<height>13</height>
</size>
</property>
</spacer>
</item>
<item row="16" column="1">
<widget class="QCheckBox" name="m_chkCacheAnimatioInBackground">
<property name="text">
<string>Recalculate animation cache in background</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KisIntParseSpinBox</class>
<extends>QSpinBox</extends>
<header>kis_int_parse_spin_box.h</header>
</customwidget>
<customwidget>
<class>KisColorButton</class>
<extends>QPushButton</extends>
<header>kis_color_button.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
diff --git a/libs/ui/kis_config.cc b/libs/ui/kis_config.cc
index b396d29e95..fbbb1e9d5e 100644
--- a/libs/ui/kis_config.cc
+++ b/libs/ui/kis_config.cc
@@ -1,1832 +1,1876 @@
/*
* Copyright (c) 2002 Patrick Julien <freak@codepimps.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kis_config.h"
#include <limits.h>
#include <QtGlobal>
#include <QApplication>
#include <QDesktopWidget>
#include <QMutex>
#include <QFont>
#include <QThread>
#include <QStringList>
#include <QSettings>
#include <QStandardPaths>
#include <kconfig.h>
#include <KisDocument.h>
#include <KoColor.h>
#include <KoColorSpaceRegistry.h>
#include <KoColorModelStandardIds.h>
#include <KoColorProfile.h>
#include <kis_debug.h>
#include <kis_types.h>
#include "kis_canvas_resource_provider.h"
#include "kis_config_notifier.h"
#include "kis_snap_config.h"
#include <config-ocio.h>
#include <kis_color_manager.h>
KisConfig::KisConfig()
: m_cfg( KSharedConfig::openConfig()->group(""))
{
}
KisConfig::~KisConfig()
{
if (qApp->thread() != QThread::currentThread()) {
//dbgKrita << "WARNING: KisConfig: requested config synchronization from nonGUI thread! Skipping...";
return;
}
m_cfg.sync();
}
bool KisConfig::disableTouchOnCanvas(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("disableTouchOnCanvas", false));
}
void KisConfig::setDisableTouchOnCanvas(bool value) const
{
m_cfg.writeEntry("disableTouchOnCanvas", value);
}
bool KisConfig::useProjections(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("useProjections", true));
}
void KisConfig::setUseProjections(bool useProj) const
{
m_cfg.writeEntry("useProjections", useProj);
}
bool KisConfig::undoEnabled(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("undoEnabled", true));
}
void KisConfig::setUndoEnabled(bool undo) const
{
m_cfg.writeEntry("undoEnabled", undo);
}
int KisConfig::undoStackLimit(bool defaultValue) const
{
return (defaultValue ? 30 : m_cfg.readEntry("undoStackLimit", 30));
}
void KisConfig::setUndoStackLimit(int limit) const
{
m_cfg.writeEntry("undoStackLimit", limit);
}
bool KisConfig::useCumulativeUndoRedo(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("useCumulativeUndoRedo",false));
}
void KisConfig::setCumulativeUndoRedo(bool value)
{
m_cfg.writeEntry("useCumulativeUndoRedo", value);
}
qreal KisConfig::stackT1(bool defaultValue) const
{
return (defaultValue ? 5 : m_cfg.readEntry("stackT1",5));
}
void KisConfig::setStackT1(int T1)
{
m_cfg.writeEntry("stackT1", T1);
}
qreal KisConfig::stackT2(bool defaultValue) const
{
return (defaultValue ? 1 : m_cfg.readEntry("stackT2",1));
}
void KisConfig::setStackT2(int T2)
{
m_cfg.writeEntry("stackT2", T2);
}
int KisConfig::stackN(bool defaultValue) const
{
return (defaultValue ? 5 : m_cfg.readEntry("stackN",5));
}
void KisConfig::setStackN(int N)
{
m_cfg.writeEntry("stackN", N);
}
qint32 KisConfig::defImageWidth(bool defaultValue) const
{
return (defaultValue ? 1600 : m_cfg.readEntry("imageWidthDef", 1600));
}
qint32 KisConfig::defImageHeight(bool defaultValue) const
{
return (defaultValue ? 1200 : m_cfg.readEntry("imageHeightDef", 1200));
}
qreal KisConfig::defImageResolution(bool defaultValue) const
{
return (defaultValue ? 100.0 : m_cfg.readEntry("imageResolutionDef", 100.0)) / 72.0;
}
QString KisConfig::defColorModel(bool defaultValue) const
{
return (defaultValue ? KoColorSpaceRegistry::instance()->rgb8()->colorModelId().id()
: m_cfg.readEntry("colorModelDef", KoColorSpaceRegistry::instance()->rgb8()->colorModelId().id()));
}
void KisConfig::defColorModel(const QString & model) const
{
m_cfg.writeEntry("colorModelDef", model);
}
QString KisConfig::defaultColorDepth(bool defaultValue) const
{
return (defaultValue ? KoColorSpaceRegistry::instance()->rgb8()->colorDepthId().id()
: m_cfg.readEntry("colorDepthDef", KoColorSpaceRegistry::instance()->rgb8()->colorDepthId().id()));
}
void KisConfig::setDefaultColorDepth(const QString & depth) const
{
m_cfg.writeEntry("colorDepthDef", depth);
}
QString KisConfig::defColorProfile(bool defaultValue) const
{
return (defaultValue ? KoColorSpaceRegistry::instance()->rgb8()->profile()->name() :
m_cfg.readEntry("colorProfileDef",
KoColorSpaceRegistry::instance()->rgb8()->profile()->name()));
}
void KisConfig::defColorProfile(const QString & profile) const
{
m_cfg.writeEntry("colorProfileDef", profile);
}
void KisConfig::defImageWidth(qint32 width) const
{
m_cfg.writeEntry("imageWidthDef", width);
}
void KisConfig::defImageHeight(qint32 height) const
{
m_cfg.writeEntry("imageHeightDef", height);
}
void KisConfig::defImageResolution(qreal res) const
{
m_cfg.writeEntry("imageResolutionDef", res*72.0);
}
void cleanOldCursorStyleKeys(KConfigGroup &cfg)
{
if (cfg.hasKey("newCursorStyle") &&
cfg.hasKey("newOutlineStyle")) {
cfg.deleteEntry("cursorStyleDef");
}
}
CursorStyle KisConfig::newCursorStyle(bool defaultValue) const
{
if (defaultValue) {
return CURSOR_STYLE_NO_CURSOR;
}
int style = m_cfg.readEntry("newCursorStyle", int(-1));
if (style < 0) {
// old style format
style = m_cfg.readEntry("cursorStyleDef", int(OLD_CURSOR_STYLE_OUTLINE));
switch (style) {
case OLD_CURSOR_STYLE_TOOLICON:
style = CURSOR_STYLE_TOOLICON;
break;
case OLD_CURSOR_STYLE_CROSSHAIR:
case OLD_CURSOR_STYLE_OUTLINE_CENTER_CROSS:
style = CURSOR_STYLE_CROSSHAIR;
break;
case OLD_CURSOR_STYLE_POINTER:
style = CURSOR_STYLE_POINTER;
break;
case OLD_CURSOR_STYLE_OUTLINE:
case OLD_CURSOR_STYLE_NO_CURSOR:
style = CURSOR_STYLE_NO_CURSOR;
break;
case OLD_CURSOR_STYLE_SMALL_ROUND:
case OLD_CURSOR_STYLE_OUTLINE_CENTER_DOT:
style = CURSOR_STYLE_SMALL_ROUND;
break;
case OLD_CURSOR_STYLE_TRIANGLE_RIGHTHANDED:
case OLD_CURSOR_STYLE_OUTLINE_TRIANGLE_RIGHTHANDED:
style = CURSOR_STYLE_TRIANGLE_RIGHTHANDED;
break;
case OLD_CURSOR_STYLE_TRIANGLE_LEFTHANDED:
case OLD_CURSOR_STYLE_OUTLINE_TRIANGLE_LEFTHANDED:
style = CURSOR_STYLE_TRIANGLE_LEFTHANDED;
break;
default:
style = -1;
}
}
cleanOldCursorStyleKeys(m_cfg);
// compatibility with future versions
if (style < 0 || style >= N_CURSOR_STYLE_SIZE) {
style = CURSOR_STYLE_NO_CURSOR;
}
return (CursorStyle) style;
}
void KisConfig::setNewCursorStyle(CursorStyle style)
{
m_cfg.writeEntry("newCursorStyle", (int)style);
}
+QColor KisConfig::getCursorMainColor(bool defaultValue) const
+{
+ QColor col;
+ col.setRgbF(0.501961, 1.0, 0.501961);
+ return (defaultValue ? col : m_cfg.readEntry("cursormaincolor", col));
+}
+
+void KisConfig::setCursorMainColor(const QColor &v) const
+{
+ m_cfg.writeEntry("cursormaincolor", v);
+}
+
OutlineStyle KisConfig::newOutlineStyle(bool defaultValue) const
{
if (defaultValue) {
return OUTLINE_FULL;
}
int style = m_cfg.readEntry("newOutlineStyle", int(-1));
if (style < 0) {
// old style format
style = m_cfg.readEntry("cursorStyleDef", int(OLD_CURSOR_STYLE_OUTLINE));
switch (style) {
case OLD_CURSOR_STYLE_TOOLICON:
case OLD_CURSOR_STYLE_CROSSHAIR:
case OLD_CURSOR_STYLE_POINTER:
case OLD_CURSOR_STYLE_NO_CURSOR:
case OLD_CURSOR_STYLE_SMALL_ROUND:
case OLD_CURSOR_STYLE_TRIANGLE_RIGHTHANDED:
case OLD_CURSOR_STYLE_TRIANGLE_LEFTHANDED:
style = OUTLINE_NONE;
break;
case OLD_CURSOR_STYLE_OUTLINE:
case OLD_CURSOR_STYLE_OUTLINE_CENTER_DOT:
case OLD_CURSOR_STYLE_OUTLINE_CENTER_CROSS:
case OLD_CURSOR_STYLE_OUTLINE_TRIANGLE_RIGHTHANDED:
case OLD_CURSOR_STYLE_OUTLINE_TRIANGLE_LEFTHANDED:
style = OUTLINE_FULL;
break;
default:
style = -1;
}
}
cleanOldCursorStyleKeys(m_cfg);
// compatibility with future versions
if (style < 0 || style >= N_OUTLINE_STYLE_SIZE) {
style = OUTLINE_FULL;
}
return (OutlineStyle) style;
}
void KisConfig::setNewOutlineStyle(OutlineStyle style)
{
m_cfg.writeEntry("newOutlineStyle", (int)style);
}
QRect KisConfig::colorPreviewRect() const
{
return m_cfg.readEntry("colorPreviewRect", QVariant(QRect(32, 32, 48, 48))).toRect();
}
void KisConfig::setColorPreviewRect(const QRect &rect)
{
m_cfg.writeEntry("colorPreviewRect", QVariant(rect));
}
bool KisConfig::useDirtyPresets(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("useDirtyPresets",false));
}
void KisConfig::setUseDirtyPresets(bool value)
{
m_cfg.writeEntry("useDirtyPresets",value);
KisConfigNotifier::instance()->notifyConfigChanged();
}
bool KisConfig::useEraserBrushSize(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("useEraserBrushSize",false));
}
void KisConfig::setUseEraserBrushSize(bool value)
{
m_cfg.writeEntry("useEraserBrushSize",value);
KisConfigNotifier::instance()->notifyConfigChanged();
}
bool KisConfig::useEraserBrushOpacity(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("useEraserBrushOpacity",false));
}
void KisConfig::setUseEraserBrushOpacity(bool value)
{
m_cfg.writeEntry("useEraserBrushOpacity",value);
KisConfigNotifier::instance()->notifyConfigChanged();
}
QColor KisConfig::getMDIBackgroundColor(bool defaultValue) const
{
QColor col(77, 77, 77);
return (defaultValue ? col : m_cfg.readEntry("mdiBackgroundColor", col));
}
void KisConfig::setMDIBackgroundColor(const QColor &v) const
{
m_cfg.writeEntry("mdiBackgroundColor", v);
}
QString KisConfig::getMDIBackgroundImage(bool defaultValue) const
{
return (defaultValue ? "" : m_cfg.readEntry("mdiBackgroundImage", ""));
}
void KisConfig::setMDIBackgroundImage(const QString &filename) const
{
m_cfg.writeEntry("mdiBackgroundImage", filename);
}
QString KisConfig::monitorProfile(int screen) const
{
// Note: keep this in sync with the default profile for the RGB colorspaces!
QString profile = m_cfg.readEntry("monitorProfile" + QString(screen == 0 ? "": QString("_%1").arg(screen)), "sRGB-elle-V2-srgbtrc.icc");
//dbgKrita << "KisConfig::monitorProfile()" << profile;
return profile;
}
QString KisConfig::monitorForScreen(int screen, const QString &defaultMonitor, bool defaultValue) const
{
return (defaultValue ? defaultMonitor
: m_cfg.readEntry(QString("monitor_for_screen_%1").arg(screen), defaultMonitor));
}
void KisConfig::setMonitorForScreen(int screen, const QString& monitor)
{
m_cfg.writeEntry(QString("monitor_for_screen_%1").arg(screen), monitor);
}
void KisConfig::setMonitorProfile(int screen, const QString & monitorProfile, bool override) const
{
m_cfg.writeEntry("monitorProfile/OverrideX11", override);
m_cfg.writeEntry("monitorProfile" + QString(screen == 0 ? "": QString("_%1").arg(screen)), monitorProfile);
}
const KoColorProfile *KisConfig::getScreenProfile(int screen)
{
if (screen < 0) return 0;
KisConfig cfg;
QString monitorId;
if (KisColorManager::instance()->devices().size() > screen) {
monitorId = cfg.monitorForScreen(screen, KisColorManager::instance()->devices()[screen]);
}
//dbgKrita << "getScreenProfile(). Screen" << screen << "monitor id" << monitorId;
if (monitorId.isEmpty()) {
return 0;
}
QByteArray bytes = KisColorManager::instance()->displayProfile(monitorId);
//dbgKrita << "\tgetScreenProfile()" << bytes.size();
if (bytes.length() > 0) {
const KoColorProfile *profile = KoColorSpaceRegistry::instance()->createColorProfile(RGBAColorModelID.id(), Integer8BitsColorDepthID.id(), bytes);
//dbgKrita << "\tKisConfig::getScreenProfile for screen" << screen << profile->name();
return profile;
}
else {
//dbgKrita << "\tCould not get a system monitor profile";
return 0;
}
}
const KoColorProfile *KisConfig::displayProfile(int screen) const
{
if (screen < 0) return 0;
// if the user plays with the settings, they can override the display profile, in which case
// we don't want the system setting.
bool override = useSystemMonitorProfile();
//dbgKrita << "KisConfig::displayProfile(). Override X11:" << override;
const KoColorProfile *profile = 0;
if (override) {
//dbgKrita << "\tGoing to get the screen profile";
profile = KisConfig::getScreenProfile(screen);
}
// if it fails. check the configuration
if (!profile || !profile->isSuitableForDisplay()) {
//dbgKrita << "\tGoing to get the monitor profile";
QString monitorProfileName = monitorProfile(screen);
//dbgKrita << "\t\tmonitorProfileName:" << monitorProfileName;
if (!monitorProfileName.isEmpty()) {
profile = KoColorSpaceRegistry::instance()->profileByName(monitorProfileName);
}
if (profile) {
//dbgKrita << "\t\tsuitable for display" << profile->isSuitableForDisplay();
}
else {
//dbgKrita << "\t\tstill no profile";
}
}
// if we still don't have a profile, or the profile isn't suitable for display,
// we need to get a last-resort profile. the built-in sRGB is a good choice then.
if (!profile || !profile->isSuitableForDisplay()) {
//dbgKrita << "\tnothing worked, going to get sRGB built-in";
profile = KoColorSpaceRegistry::instance()->profileByName("sRGB Built-in");
}
if (profile) {
//dbgKrita << "\tKisConfig::displayProfile for screen" << screen << "is" << profile->name();
}
else {
//dbgKrita << "\tCouldn't get a display profile at all";
}
return profile;
}
QString KisConfig::workingColorSpace(bool defaultValue) const
{
return (defaultValue ? "RGBA" : m_cfg.readEntry("workingColorSpace", "RGBA"));
}
void KisConfig::setWorkingColorSpace(const QString & workingColorSpace) const
{
m_cfg.writeEntry("workingColorSpace", workingColorSpace);
}
QString KisConfig::printerColorSpace(bool /*defaultValue*/) const
{
//TODO currently only rgb8 is supported
//return (defaultValue ? "RGBA" : m_cfg.readEntry("printerColorSpace", "RGBA"));
return QString("RGBA");
}
void KisConfig::setPrinterColorSpace(const QString & printerColorSpace) const
{
m_cfg.writeEntry("printerColorSpace", printerColorSpace);
}
QString KisConfig::printerProfile(bool defaultValue) const
{
return (defaultValue ? "" : m_cfg.readEntry("printerProfile", ""));
}
void KisConfig::setPrinterProfile(const QString & printerProfile) const
{
m_cfg.writeEntry("printerProfile", printerProfile);
}
bool KisConfig::useBlackPointCompensation(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("useBlackPointCompensation", true));
}
void KisConfig::setUseBlackPointCompensation(bool useBlackPointCompensation) const
{
m_cfg.writeEntry("useBlackPointCompensation", useBlackPointCompensation);
}
bool KisConfig::allowLCMSOptimization(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("allowLCMSOptimization", true));
}
void KisConfig::setAllowLCMSOptimization(bool allowLCMSOptimization)
{
m_cfg.writeEntry("allowLCMSOptimization", allowLCMSOptimization);
}
bool KisConfig::showRulers(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("showrulers", false));
}
void KisConfig::setShowRulers(bool rulers) const
{
m_cfg.writeEntry("showrulers", rulers);
}
bool KisConfig::rulersTrackMouse(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("rulersTrackMouse", true));
}
void KisConfig::setRulersTrackMouse(bool value) const
{
m_cfg.writeEntry("rulersTrackMouse", value);
}
qint32 KisConfig::pasteBehaviour(bool defaultValue) const
{
return (defaultValue ? 2 : m_cfg.readEntry("pasteBehaviour", 2));
}
void KisConfig::setPasteBehaviour(qint32 renderIntent) const
{
m_cfg.writeEntry("pasteBehaviour", renderIntent);
}
qint32 KisConfig::monitorRenderIntent(bool defaultValue) const
{
qint32 intent = m_cfg.readEntry("renderIntent", INTENT_PERCEPTUAL);
if (intent > 3) intent = 3;
if (intent < 0) intent = 0;
return (defaultValue ? INTENT_PERCEPTUAL : intent);
}
void KisConfig::setRenderIntent(qint32 renderIntent) const
{
if (renderIntent > 3) renderIntent = 3;
if (renderIntent < 0) renderIntent = 0;
m_cfg.writeEntry("renderIntent", renderIntent);
}
bool KisConfig::useOpenGL(bool defaultValue) const
{
if (defaultValue) {
return true;
}
//dbgKrita << "use opengl" << m_cfg.readEntry("useOpenGL", true) << "success" << m_cfg.readEntry("canvasState", "OPENGL_SUCCESS");
QString cs = canvasState();
return (m_cfg.readEntry("useOpenGL", true) && (cs == "OPENGL_SUCCESS" || cs == "TRY_OPENGL"));
}
void KisConfig::setUseOpenGL(bool useOpenGL) const
{
m_cfg.writeEntry("useOpenGL", useOpenGL);
}
int KisConfig::openGLFilteringMode(bool defaultValue) const
{
return (defaultValue ? 3 : m_cfg.readEntry("OpenGLFilterMode", 3));
}
void KisConfig::setOpenGLFilteringMode(int filteringMode)
{
m_cfg.writeEntry("OpenGLFilterMode", filteringMode);
}
bool KisConfig::useOpenGLTextureBuffer(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("useOpenGLTextureBuffer", true));
}
void KisConfig::setUseOpenGLTextureBuffer(bool useBuffer)
{
m_cfg.writeEntry("useOpenGLTextureBuffer", useBuffer);
}
int KisConfig::openGLTextureSize(bool defaultValue) const
{
return (defaultValue ? 256 : m_cfg.readEntry("textureSize", 256));
}
bool KisConfig::disableVSync(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("disableVSync", true));
}
void KisConfig::setDisableVSync(bool disableVSync)
{
m_cfg.writeEntry("disableVSync", disableVSync);
}
bool KisConfig::showAdvancedOpenGLSettings(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("showAdvancedOpenGLSettings", false));
}
bool KisConfig::forceOpenGLFenceWorkaround(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("forceOpenGLFenceWorkaround", false));
}
int KisConfig::numMipmapLevels(bool defaultValue) const
{
return (defaultValue ? 4 : m_cfg.readEntry("numMipmapLevels", 4));
}
int KisConfig::textureOverlapBorder() const
{
return 1 << qMax(0, numMipmapLevels());
}
qint32 KisConfig::maxNumberOfThreads(bool defaultValue) const
{
return (defaultValue ? QThread::idealThreadCount() : m_cfg.readEntry("maxthreads", QThread::idealThreadCount()));
}
void KisConfig::setMaxNumberOfThreads(qint32 maxThreads)
{
m_cfg.writeEntry("maxthreads", maxThreads);
}
quint32 KisConfig::getGridMainStyle(bool defaultValue) const
{
int v = m_cfg.readEntry("gridmainstyle", 0);
v = qBound(0, v, 2);
return (defaultValue ? 0 : v);
}
void KisConfig::setGridMainStyle(quint32 v) const
{
m_cfg.writeEntry("gridmainstyle", v);
}
quint32 KisConfig::getGridSubdivisionStyle(bool defaultValue) const
{
quint32 v = m_cfg.readEntry("gridsubdivisionstyle", 1);
if (v > 2) v = 2;
return (defaultValue ? 1 : v);
}
void KisConfig::setGridSubdivisionStyle(quint32 v) const
{
m_cfg.writeEntry("gridsubdivisionstyle", v);
}
QColor KisConfig::getGridMainColor(bool defaultValue) const
{
QColor col(99, 99, 99);
return (defaultValue ? col : m_cfg.readEntry("gridmaincolor", col));
}
void KisConfig::setGridMainColor(const QColor & v) const
{
m_cfg.writeEntry("gridmaincolor", v);
}
QColor KisConfig::getGridSubdivisionColor(bool defaultValue) const
{
QColor col(150, 150, 150);
return (defaultValue ? col : m_cfg.readEntry("gridsubdivisioncolor", col));
}
void KisConfig::setGridSubdivisionColor(const QColor & v) const
{
m_cfg.writeEntry("gridsubdivisioncolor", v);
}
+QColor KisConfig::getOpenGLGridColor(bool defaultValue) const
+{
+ QColor col(255, 255, 255);
+ return (defaultValue ? col : m_cfg.readEntry("openglgridcolor", col));
+}
+
+void KisConfig::setOpenGLGridColor(const QColor & v) const
+{
+ m_cfg.writeEntry("openglgridcolor", v);
+}
+
+qreal KisConfig::getOpenGLGridDrawingThreshold(bool defaultValue) const
+{
+ qreal border = 8.0f;
+ return (defaultValue ? border : m_cfg.readEntry("griddrawingborder", border));
+}
+
+void KisConfig::setOpenGLGridDrawingThreshold(qreal v) const
+{
+ m_cfg.writeEntry("griddrawingborder", v);
+}
+
quint32 KisConfig::guidesLineStyle(bool defaultValue) const
{
int v = m_cfg.readEntry("guidesLineStyle", 0);
v = qBound(0, v, 2);
return (defaultValue ? 0 : v);
}
void KisConfig::setGuidesLineStyle(quint32 v) const
{
m_cfg.writeEntry("guidesLineStyle", v);
}
QColor KisConfig::guidesColor(bool defaultValue) const
{
QColor col(99, 99, 99);
return (defaultValue ? col : m_cfg.readEntry("guidesColor", col));
}
void KisConfig::setGuidesColor(const QColor & v) const
{
m_cfg.writeEntry("guidesColor", v);
}
void KisConfig::loadSnapConfig(KisSnapConfig *config, bool defaultValue) const
{
KisSnapConfig defaultConfig(false);
if (defaultValue) {
*config = defaultConfig;
return;
}
config->setOrthogonal(m_cfg.readEntry("globalSnapOrthogonal", defaultConfig.orthogonal()));
config->setNode(m_cfg.readEntry("globalSnapNode", defaultConfig.node()));
config->setExtension(m_cfg.readEntry("globalSnapExtension", defaultConfig.extension()));
config->setIntersection(m_cfg.readEntry("globalSnapIntersection", defaultConfig.intersection()));
config->setBoundingBox(m_cfg.readEntry("globalSnapBoundingBox", defaultConfig.boundingBox()));
config->setImageBounds(m_cfg.readEntry("globalSnapImageBounds", defaultConfig.imageBounds()));
config->setImageCenter(m_cfg.readEntry("globalSnapImageCenter", defaultConfig.imageCenter()));
}
void KisConfig::saveSnapConfig(const KisSnapConfig &config)
{
m_cfg.writeEntry("globalSnapOrthogonal", config.orthogonal());
m_cfg.writeEntry("globalSnapNode", config.node());
m_cfg.writeEntry("globalSnapExtension", config.extension());
m_cfg.writeEntry("globalSnapIntersection", config.intersection());
m_cfg.writeEntry("globalSnapBoundingBox", config.boundingBox());
m_cfg.writeEntry("globalSnapImageBounds", config.imageBounds());
m_cfg.writeEntry("globalSnapImageCenter", config.imageCenter());
}
qint32 KisConfig::checkSize(bool defaultValue) const
{
return (defaultValue ? 32 : m_cfg.readEntry("checksize", 32));
}
void KisConfig::setCheckSize(qint32 checksize) const
{
m_cfg.writeEntry("checksize", checksize);
}
bool KisConfig::scrollCheckers(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("scrollingcheckers", false));
}
void KisConfig::setScrollingCheckers(bool sc) const
{
m_cfg.writeEntry("scrollingcheckers", sc);
}
QColor KisConfig::canvasBorderColor(bool defaultValue) const
{
QColor color(QColor(128,128,128));
return (defaultValue ? color : m_cfg.readEntry("canvasBorderColor", color));
}
void KisConfig::setCanvasBorderColor(const QColor& color) const
{
m_cfg.writeEntry("canvasBorderColor", color);
}
bool KisConfig::hideScrollbars(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("hideScrollbars", false));
}
void KisConfig::setHideScrollbars(bool value) const
{
m_cfg.writeEntry("hideScrollbars", value);
}
QColor KisConfig::checkersColor1(bool defaultValue) const
{
QColor col(220, 220, 220);
return (defaultValue ? col : m_cfg.readEntry("checkerscolor", col));
}
void KisConfig::setCheckersColor1(const QColor & v) const
{
m_cfg.writeEntry("checkerscolor", v);
}
QColor KisConfig::checkersColor2(bool defaultValue) const
{
return (defaultValue ? QColor(Qt::white) : m_cfg.readEntry("checkerscolor2", QColor(Qt::white)));
}
void KisConfig::setCheckersColor2(const QColor & v) const
{
m_cfg.writeEntry("checkerscolor2", v);
}
bool KisConfig::antialiasCurves(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("antialiascurves", true));
}
void KisConfig::setAntialiasCurves(bool v) const
{
m_cfg.writeEntry("antialiascurves", v);
}
QColor KisConfig::selectionOverlayMaskColor(bool defaultValue) const
{
QColor def(255, 0, 0, 220);
return (defaultValue ? def : m_cfg.readEntry("selectionOverlayMaskColor", def));
}
void KisConfig::setSelectionOverlayMaskColor(const QColor &color)
{
m_cfg.writeEntry("selectionOverlayMaskColor", color);
}
bool KisConfig::antialiasSelectionOutline(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("AntialiasSelectionOutline", false));
}
void KisConfig::setAntialiasSelectionOutline(bool v) const
{
m_cfg.writeEntry("AntialiasSelectionOutline", v);
}
bool KisConfig::showRootLayer(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("ShowRootLayer", false));
}
void KisConfig::setShowRootLayer(bool showRootLayer) const
{
m_cfg.writeEntry("ShowRootLayer", showRootLayer);
}
bool KisConfig::showGlobalSelection(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("ShowGlobalSelection", false));
}
void KisConfig::setShowGlobalSelection(bool showGlobalSelection) const
{
m_cfg.writeEntry("ShowGlobalSelection", showGlobalSelection);
}
bool KisConfig::showOutlineWhilePainting(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("ShowOutlineWhilePainting", true));
}
void KisConfig::setShowOutlineWhilePainting(bool showOutlineWhilePainting) const
{
m_cfg.writeEntry("ShowOutlineWhilePainting", showOutlineWhilePainting);
}
bool KisConfig::hideSplashScreen(bool defaultValue) const
{
KConfigGroup cfg( KSharedConfig::openConfig(), "SplashScreen");
return (defaultValue ? true : cfg.readEntry("HideSplashAfterStartup", true));
}
void KisConfig::setHideSplashScreen(bool hideSplashScreen) const
{
KConfigGroup cfg( KSharedConfig::openConfig(), "SplashScreen");
cfg.writeEntry("HideSplashAfterStartup", hideSplashScreen);
}
qreal KisConfig::outlineSizeMinimum(bool defaultValue) const
{
return (defaultValue ? 1.0 : m_cfg.readEntry("OutlineSizeMinimum", 1.0));
}
void KisConfig::setOutlineSizeMinimum(qreal outlineSizeMinimum) const
{
m_cfg.writeEntry("OutlineSizeMinimum", outlineSizeMinimum);
}
qreal KisConfig::selectionViewSizeMinimum(bool defaultValue) const
{
return (defaultValue ? 5.0 : m_cfg.readEntry("SelectionViewSizeMinimum", 5.0));
}
void KisConfig::setSelectionViewSizeMinimum(qreal outlineSizeMinimum) const
{
m_cfg.writeEntry("SelectionViewSizeMinimum", outlineSizeMinimum);
}
int KisConfig::autoSaveInterval(bool defaultValue) const
{
return (defaultValue ? 15 * 60 : m_cfg.readEntry("AutoSaveInterval", 15 * 60));
}
void KisConfig::setAutoSaveInterval(int seconds) const
{
return m_cfg.writeEntry("AutoSaveInterval", seconds);
}
bool KisConfig::backupFile(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("CreateBackupFile", true));
}
void KisConfig::setBackupFile(bool backupFile) const
{
m_cfg.writeEntry("CreateBackupFile", backupFile);
}
bool KisConfig::showFilterGallery(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("showFilterGallery", false));
}
void KisConfig::setShowFilterGallery(bool showFilterGallery) const
{
m_cfg.writeEntry("showFilterGallery", showFilterGallery);
}
bool KisConfig::showFilterGalleryLayerMaskDialog(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("showFilterGalleryLayerMaskDialog", true));
}
void KisConfig::setShowFilterGalleryLayerMaskDialog(bool showFilterGallery) const
{
m_cfg.writeEntry("setShowFilterGalleryLayerMaskDialog", showFilterGallery);
}
QString KisConfig::canvasState(bool defaultValue) const
{
const QString configPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
QSettings kritarc(configPath + QStringLiteral("/kritadisplayrc"), QSettings::IniFormat);
return (defaultValue ? "OPENGL_NOT_TRIED" : kritarc.value("canvasState", "OPENGL_NOT_TRIED").toString());
}
void KisConfig::setCanvasState(const QString& state) const
{
static QStringList acceptableStates;
if (acceptableStates.isEmpty()) {
acceptableStates << "OPENGL_SUCCESS" << "TRY_OPENGL" << "OPENGL_NOT_TRIED" << "OPENGL_FAILED";
}
if (acceptableStates.contains(state)) {
const QString configPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
QSettings kritarc(configPath + QStringLiteral("/kritadisplayrc"), QSettings::IniFormat);
kritarc.setValue("canvasState", state);
}
}
bool KisConfig::toolOptionsPopupDetached(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("ToolOptionsPopupDetached", false));
}
void KisConfig::setToolOptionsPopupDetached(bool detached) const
{
m_cfg.writeEntry("ToolOptionsPopupDetached", detached);
}
bool KisConfig::paintopPopupDetached(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("PaintopPopupDetached", false));
}
void KisConfig::setPaintopPopupDetached(bool detached) const
{
m_cfg.writeEntry("PaintopPopupDetached", detached);
}
QString KisConfig::pressureTabletCurve(bool defaultValue) const
{
return (defaultValue ? "0,0;1,1" : m_cfg.readEntry("tabletPressureCurve","0,0;1,1;"));
}
void KisConfig::setPressureTabletCurve(const QString& curveString) const
{
m_cfg.writeEntry("tabletPressureCurve", curveString);
}
qreal KisConfig::vastScrolling(bool defaultValue) const
{
return (defaultValue ? 0.9 : m_cfg.readEntry("vastScrolling", 0.9));
}
void KisConfig::setVastScrolling(const qreal factor) const
{
m_cfg.writeEntry("vastScrolling", factor);
}
int KisConfig::presetChooserViewMode(bool defaultValue) const
{
return (defaultValue ? 0 : m_cfg.readEntry("presetChooserViewMode", 0));
}
void KisConfig::setPresetChooserViewMode(const int mode) const
{
m_cfg.writeEntry("presetChooserViewMode", mode);
}
int KisConfig::presetIconSize(bool defaultValue) const
{
return (defaultValue ? 30 : m_cfg.readEntry("presetIconSize", 30));
}
void KisConfig::setPresetIconSize(const int value) const
{
m_cfg.writeEntry("presetIconSize", value);
}
bool KisConfig::firstRun(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("firstRun", true));
}
void KisConfig::setFirstRun(const bool first) const
{
m_cfg.writeEntry("firstRun", first);
}
int KisConfig::horizontalSplitLines(bool defaultValue) const
{
return (defaultValue ? 1 : m_cfg.readEntry("horizontalSplitLines", 1));
}
void KisConfig::setHorizontalSplitLines(const int numberLines) const
{
m_cfg.writeEntry("horizontalSplitLines", numberLines);
}
int KisConfig::verticalSplitLines(bool defaultValue) const
{
return (defaultValue ? 1 : m_cfg.readEntry("verticalSplitLines", 1));
}
void KisConfig::setVerticalSplitLines(const int numberLines) const
{
m_cfg.writeEntry("verticalSplitLines", numberLines);
}
bool KisConfig::clicklessSpacePan(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("clicklessSpacePan", true));
}
void KisConfig::setClicklessSpacePan(const bool toggle) const
{
m_cfg.writeEntry("clicklessSpacePan", toggle);
}
bool KisConfig::hideDockersFullscreen(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("hideDockersFullScreen", true));
}
void KisConfig::setHideDockersFullscreen(const bool value) const
{
m_cfg.writeEntry("hideDockersFullScreen", value);
}
bool KisConfig::showDockerTitleBars(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("showDockerTitleBars", true));
}
void KisConfig::setShowDockerTitleBars(const bool value) const
{
m_cfg.writeEntry("showDockerTitleBars", value);
}
bool KisConfig::showDockers(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("showDockers", true));
}
void KisConfig::setShowDockers(const bool value) const
{
m_cfg.writeEntry("showDockers", value);
}
bool KisConfig::showStatusBar(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("showStatusBar", true));
}
void KisConfig::setShowStatusBar(const bool value) const
{
m_cfg.writeEntry("showStatusBar", value);
}
bool KisConfig::hideMenuFullscreen(bool defaultValue) const
{
return (defaultValue ? true: m_cfg.readEntry("hideMenuFullScreen", true));
}
void KisConfig::setHideMenuFullscreen(const bool value) const
{
m_cfg.writeEntry("hideMenuFullScreen", value);
}
bool KisConfig::hideScrollbarsFullscreen(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("hideScrollbarsFullScreen", true));
}
void KisConfig::setHideScrollbarsFullscreen(const bool value) const
{
m_cfg.writeEntry("hideScrollbarsFullScreen", value);
}
bool KisConfig::hideStatusbarFullscreen(bool defaultValue) const
{
return (defaultValue ? true: m_cfg.readEntry("hideStatusbarFullScreen", true));
}
void KisConfig::setHideStatusbarFullscreen(const bool value) const
{
m_cfg.writeEntry("hideStatusbarFullScreen", value);
}
bool KisConfig::hideTitlebarFullscreen(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("hideTitleBarFullscreen", true));
}
void KisConfig::setHideTitlebarFullscreen(const bool value) const
{
m_cfg.writeEntry("hideTitleBarFullscreen", value);
}
bool KisConfig::hideToolbarFullscreen(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("hideToolbarFullscreen", true));
}
void KisConfig::setHideToolbarFullscreen(const bool value) const
{
m_cfg.writeEntry("hideToolbarFullscreen", value);
}
bool KisConfig::fullscreenMode(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("fullscreenMode", true));
}
void KisConfig::setFullscreenMode(const bool value) const
{
m_cfg.writeEntry("fullscreenMode", value);
}
QStringList KisConfig::favoriteCompositeOps(bool defaultValue) const
{
return (defaultValue ? QStringList() : m_cfg.readEntry("favoriteCompositeOps", QStringList()));
}
void KisConfig::setFavoriteCompositeOps(const QStringList& compositeOps) const
{
m_cfg.writeEntry("favoriteCompositeOps", compositeOps);
}
QString KisConfig::exportConfiguration(const QString &filterId, bool defaultValue) const
{
return (defaultValue ? QString() : m_cfg.readEntry("ExportConfiguration-" + filterId, QString()));
}
void KisConfig::setExportConfiguration(const QString &filterId, KisPropertiesConfigurationSP properties) const
{
QString exportConfig = properties->toXML();
m_cfg.writeEntry("ExportConfiguration-" + filterId, exportConfig);
+}
+QString KisConfig::importConfiguration(const QString &filterId, bool defaultValue) const
+{
+ return (defaultValue ? QString() : m_cfg.readEntry("ImportConfiguration-" + filterId, QString()));
+}
+
+void KisConfig::setImportConfiguration(const QString &filterId, KisPropertiesConfigurationSP properties) const
+{
+ QString importConfig = properties->toXML();
+ m_cfg.writeEntry("ImportConfiguration-" + filterId, importConfig);
}
bool KisConfig::useOcio(bool defaultValue) const
{
#ifdef HAVE_OCIO
return (defaultValue ? false : m_cfg.readEntry("Krita/Ocio/UseOcio", false));
#else
Q_UNUSED(defaultValue);
return false;
#endif
}
void KisConfig::setUseOcio(bool useOCIO) const
{
m_cfg.writeEntry("Krita/Ocio/UseOcio", useOCIO);
}
int KisConfig::favoritePresets(bool defaultValue) const
{
return (defaultValue ? 10 : m_cfg.readEntry("numFavoritePresets", 10));
}
void KisConfig::setFavoritePresets(const int value)
{
m_cfg.writeEntry("numFavoritePresets", value);
}
bool KisConfig::levelOfDetailEnabled(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("levelOfDetailEnabled", false));
}
void KisConfig::setLevelOfDetailEnabled(bool value)
{
m_cfg.writeEntry("levelOfDetailEnabled", value);
}
KisConfig::OcioColorManagementMode
KisConfig::ocioColorManagementMode(bool defaultValue) const
{
return (OcioColorManagementMode)(defaultValue ? INTERNAL
: m_cfg.readEntry("Krita/Ocio/OcioColorManagementMode", (int) INTERNAL));
}
void KisConfig::setOcioColorManagementMode(OcioColorManagementMode mode) const
{
m_cfg.writeEntry("Krita/Ocio/OcioColorManagementMode", (int) mode);
}
QString KisConfig::ocioConfigurationPath(bool defaultValue) const
{
return (defaultValue ? QString() : m_cfg.readEntry("Krita/Ocio/OcioConfigPath", QString()));
}
void KisConfig::setOcioConfigurationPath(const QString &path) const
{
m_cfg.writeEntry("Krita/Ocio/OcioConfigPath", path);
}
QString KisConfig::ocioLutPath(bool defaultValue) const
{
return (defaultValue ? QString() : m_cfg.readEntry("Krita/Ocio/OcioLutPath", QString()));
}
void KisConfig::setOcioLutPath(const QString &path) const
{
m_cfg.writeEntry("Krita/Ocio/OcioLutPath", path);
}
int KisConfig::ocioLutEdgeSize(bool defaultValue) const
{
return (defaultValue ? 64 : m_cfg.readEntry("Krita/Ocio/LutEdgeSize", 64));
}
void KisConfig::setOcioLutEdgeSize(int value)
{
m_cfg.writeEntry("Krita/Ocio/LutEdgeSize", value);
}
bool KisConfig::ocioLockColorVisualRepresentation(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("Krita/Ocio/OcioLockColorVisualRepresentation", false));
}
void KisConfig::setOcioLockColorVisualRepresentation(bool value)
{
m_cfg.writeEntry("Krita/Ocio/OcioLockColorVisualRepresentation", value);
}
QString KisConfig::defaultPalette(bool defaultValue) const
{
return (defaultValue ? QString() : m_cfg.readEntry("defaultPalette", QString()));
}
void KisConfig::setDefaultPalette(const QString& name) const
{
m_cfg.writeEntry("defaultPalette", name);
}
QString KisConfig::toolbarSlider(int sliderNumber, bool defaultValue) const
{
QString def = "flow";
if (sliderNumber == 1) {
def = "opacity";
}
if (sliderNumber == 2) {
def = "size";
}
return (defaultValue ? def : m_cfg.readEntry(QString("toolbarslider_%1").arg(sliderNumber), def));
}
void KisConfig::setToolbarSlider(int sliderNumber, const QString &slider)
{
m_cfg.writeEntry(QString("toolbarslider_%1").arg(sliderNumber), slider);
}
bool KisConfig::sliderLabels(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("sliderLabels", true));
}
void KisConfig::setSliderLabels(bool enabled)
{
m_cfg.writeEntry("sliderLabels", enabled);
}
QString KisConfig::currentInputProfile(bool defaultValue) const
{
return (defaultValue ? QString() : m_cfg.readEntry("currentInputProfile", QString()));
}
void KisConfig::setCurrentInputProfile(const QString& name)
{
m_cfg.writeEntry("currentInputProfile", name);
}
bool KisConfig::useSystemMonitorProfile(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("ColorManagement/UseSystemMonitorProfile", false));
}
void KisConfig::setUseSystemMonitorProfile(bool _useSystemMonitorProfile) const
{
m_cfg.writeEntry("ColorManagement/UseSystemMonitorProfile", _useSystemMonitorProfile);
}
bool KisConfig::presetStripVisible(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("presetStripVisible", true));
}
void KisConfig::setPresetStripVisible(bool visible)
{
m_cfg.writeEntry("presetStripVisible", visible);
}
bool KisConfig::scratchpadVisible(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("scratchpadVisible", true));
}
void KisConfig::setScratchpadVisible(bool visible)
{
m_cfg.writeEntry("scratchpadVisible", visible);
}
bool KisConfig::showSingleChannelAsColor(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("showSingleChannelAsColor", false));
}
void KisConfig::setShowSingleChannelAsColor(bool asColor)
{
m_cfg.writeEntry("showSingleChannelAsColor", asColor);
}
bool KisConfig::hidePopups(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("hidePopups", false));
}
void KisConfig::setHidePopups(bool hidepopups)
{
m_cfg.writeEntry("hidePopups", hidepopups);
}
int KisConfig::numDefaultLayers(bool defaultValue) const
{
return (defaultValue ? 2 : m_cfg.readEntry("NumberOfLayersForNewImage", 2));
}
void KisConfig::setNumDefaultLayers(int num)
{
m_cfg.writeEntry("NumberOfLayersForNewImage", num);
}
quint8 KisConfig::defaultBackgroundOpacity(bool defaultValue) const
{
return (defaultValue ? (int)OPACITY_OPAQUE_U8 : m_cfg.readEntry("BackgroundOpacityForNewImage", (int)OPACITY_OPAQUE_U8));
}
void KisConfig::setDefaultBackgroundOpacity(quint8 value)
{
m_cfg.writeEntry("BackgroundOpacityForNewImage", (int)value);
}
QColor KisConfig::defaultBackgroundColor(bool defaultValue) const
{
return (defaultValue ? QColor(Qt::white) : m_cfg.readEntry("BackgroundColorForNewImage", QColor(Qt::white)));
}
void KisConfig::setDefaultBackgroundColor(QColor value)
{
m_cfg.writeEntry("BackgroundColorForNewImage", value);
}
KisConfig::BackgroundStyle KisConfig::defaultBackgroundStyle(bool defaultValue) const
{
return (KisConfig::BackgroundStyle)(defaultValue ? LAYER : m_cfg.readEntry("BackgroundStyleForNewImage", (int)LAYER));
}
void KisConfig::setDefaultBackgroundStyle(KisConfig::BackgroundStyle value)
{
m_cfg.writeEntry("BackgroundStyleForNewImage", (int)value);
}
int KisConfig::lineSmoothingType(bool defaultValue) const
{
return (defaultValue ? 1 : m_cfg.readEntry("LineSmoothingType", 1));
}
void KisConfig::setLineSmoothingType(int value)
{
m_cfg.writeEntry("LineSmoothingType", value);
}
qreal KisConfig::lineSmoothingDistance(bool defaultValue) const
{
return (defaultValue ? 50.0 : m_cfg.readEntry("LineSmoothingDistance", 50.0));
}
void KisConfig::setLineSmoothingDistance(qreal value)
{
m_cfg.writeEntry("LineSmoothingDistance", value);
}
qreal KisConfig::lineSmoothingTailAggressiveness(bool defaultValue) const
{
return (defaultValue ? 0.15 : m_cfg.readEntry("LineSmoothingTailAggressiveness", 0.15));
}
void KisConfig::setLineSmoothingTailAggressiveness(qreal value)
{
m_cfg.writeEntry("LineSmoothingTailAggressiveness", value);
}
bool KisConfig::lineSmoothingSmoothPressure(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("LineSmoothingSmoothPressure", false));
}
void KisConfig::setLineSmoothingSmoothPressure(bool value)
{
m_cfg.writeEntry("LineSmoothingSmoothPressure", value);
}
bool KisConfig::lineSmoothingScalableDistance(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("LineSmoothingScalableDistance", true));
}
void KisConfig::setLineSmoothingScalableDistance(bool value)
{
m_cfg.writeEntry("LineSmoothingScalableDistance", value);
}
qreal KisConfig::lineSmoothingDelayDistance(bool defaultValue) const
{
return (defaultValue ? 50.0 : m_cfg.readEntry("LineSmoothingDelayDistance", 50.0));
}
void KisConfig::setLineSmoothingDelayDistance(qreal value)
{
m_cfg.writeEntry("LineSmoothingDelayDistance", value);
}
bool KisConfig::lineSmoothingUseDelayDistance(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("LineSmoothingUseDelayDistance", true));
}
void KisConfig::setLineSmoothingUseDelayDistance(bool value)
{
m_cfg.writeEntry("LineSmoothingUseDelayDistance", value);
}
bool KisConfig::lineSmoothingFinishStabilizedCurve(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("LineSmoothingFinishStabilizedCurve", true));
}
void KisConfig::setLineSmoothingFinishStabilizedCurve(bool value)
{
m_cfg.writeEntry("LineSmoothingFinishStabilizedCurve", value);
}
bool KisConfig::lineSmoothingStabilizeSensors(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("LineSmoothingStabilizeSensors", true));
}
void KisConfig::setLineSmoothingStabilizeSensors(bool value)
{
m_cfg.writeEntry("LineSmoothingStabilizeSensors", value);
}
int KisConfig::paletteDockerPaletteViewSectionSize(bool defaultValue) const
{
return (defaultValue ? 12 : m_cfg.readEntry("paletteDockerPaletteViewSectionSize", 12));
}
void KisConfig::setPaletteDockerPaletteViewSectionSize(int value) const
{
m_cfg.writeEntry("paletteDockerPaletteViewSectionSize", value);
}
int KisConfig::tabletEventsDelay(bool defaultValue) const
{
return (defaultValue ? 10 : m_cfg.readEntry("tabletEventsDelay", 10));
}
void KisConfig::setTabletEventsDelay(int value)
{
m_cfg.writeEntry("tabletEventsDelay", value);
}
bool KisConfig::testingAcceptCompressedTabletEvents(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("testingAcceptCompressedTabletEvents", false));
}
void KisConfig::setTestingAcceptCompressedTabletEvents(bool value)
{
m_cfg.writeEntry("testingAcceptCompressedTabletEvents", value);
}
bool KisConfig::shouldEatDriverShortcuts(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("shouldEatDriverShortcuts", false));
}
bool KisConfig::testingCompressBrushEvents(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("testingCompressBrushEvents", false));
}
void KisConfig::setTestingCompressBrushEvents(bool value)
{
m_cfg.writeEntry("testingCompressBrushEvents", value);
}
bool KisConfig::useVerboseOpenGLDebugOutput(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("useVerboseOpenGLDebugOutput", false));
}
int KisConfig::workaroundX11SmoothPressureSteps(bool defaultValue) const
{
return (defaultValue ? 0 : m_cfg.readEntry("workaroundX11SmoothPressureSteps", 0));
}
bool KisConfig::showCanvasMessages(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("showOnCanvasMessages", true));
}
void KisConfig::setShowCanvasMessages(bool show)
{
m_cfg.writeEntry("showOnCanvasMessages", show);
}
bool KisConfig::compressKra(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("compressLayersInKra", false));
}
void KisConfig::setCompressKra(bool compress)
{
m_cfg.writeEntry("compressLayersInKra", compress);
}
bool KisConfig::toolOptionsInDocker(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("ToolOptionsInDocker", true));
}
void KisConfig::setToolOptionsInDocker(bool inDocker)
{
m_cfg.writeEntry("ToolOptionsInDocker", inDocker);
}
const KoColorSpace* KisConfig::customColorSelectorColorSpace(bool defaultValue) const
{
const KoColorSpace *cs = 0;
KConfigGroup cfg = KSharedConfig::openConfig()->group("advancedColorSelector");
if (defaultValue || cfg.readEntry("useCustomColorSpace", true)) {
KoColorSpaceRegistry* csr = KoColorSpaceRegistry::instance();
QString modelID = cfg.readEntry("customColorSpaceModel", "RGBA");
QString depthID = cfg.readEntry("customColorSpaceDepthID", "U8");
QString profile = cfg.readEntry("customColorSpaceProfile", "sRGB built-in - (lcms internal)");
if (profile == "default") {
// qDebug() << "Falling back to default color profile.";
profile = "sRGB built-in - (lcms internal)";
}
cs = csr->colorSpace(modelID, depthID, profile);
}
return cs;
}
void KisConfig::setCustomColorSelectorColorSpace(const KoColorSpace *cs)
{
KConfigGroup cfg = KSharedConfig::openConfig()->group("advancedColorSelector");
cfg.writeEntry("useCustomColorSpace", bool(cs));
if(cs) {
cfg.writeEntry("customColorSpaceModel", cs->colorModelId().id());
cfg.writeEntry("customColorSpaceDepthID", cs->colorDepthId().id());
cfg.writeEntry("customColorSpaceProfile", cs->profile()->name());
}
KisConfigNotifier::instance()->notifyConfigChanged();
}
bool KisConfig::enableOpenGLDebugging(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("enableOpenGLDebugging", false));
}
void KisConfig::setEnableOpenGLDebugging(bool value) const
{
m_cfg.writeEntry("enableOpenGLDebugging", value);
}
void KisConfig::setEnableAmdVectorizationWorkaround(bool value)
{
m_cfg.writeEntry("amdDisableVectorWorkaround", value);
}
bool KisConfig::enableAmdVectorizationWorkaround(bool defaultValue) const
{
return (defaultValue ? false : m_cfg.readEntry("amdDisableVectorWorkaround", false));
}
void KisConfig::setAnimationDropFrames(bool value)
{
bool oldValue = animationDropFrames();
if (value == oldValue) return;
m_cfg.writeEntry("animationDropFrames", value);
KisConfigNotifier::instance()->notifyDropFramesModeChanged();
}
bool KisConfig::animationDropFrames(bool defaultValue) const
{
return (defaultValue ? true : m_cfg.readEntry("animationDropFrames", true));
}
int KisConfig::scrubbingUpdatesDelay(bool defaultValue) const
{
return (defaultValue ? 30 : m_cfg.readEntry("scrubbingUpdatesDelay", 30));
}
void KisConfig::setScrubbingUpdatesDelay(int value)
{
m_cfg.writeEntry("scrubbingUpdatesDelay", value);
}
int KisConfig::scrubbingAudioUpdatesDelay(bool defaultValue) const
{
return (defaultValue ? -1 : m_cfg.readEntry("scrubbingAudioUpdatesDelay", -1));
}
void KisConfig::setScrubbingAudioUpdatesDelay(int value)
{
m_cfg.writeEntry("scrubbingAudioUpdatesDelay", value);
}
int KisConfig::audioOffsetTolerance(bool defaultValue) const
{
return (defaultValue ? -1 : m_cfg.readEntry("audioOffsetTolerance", -1));
}
void KisConfig::setAudioOffsetTolerance(int value)
{
m_cfg.writeEntry("audioOffsetTolerance", value);
}
bool KisConfig::switchSelectionCtrlAlt(bool defaultValue) const
{
return defaultValue ? false : m_cfg.readEntry("switchSelectionCtrlAlt", false);
}
void KisConfig::setSwitchSelectionCtrlAlt(bool value)
{
m_cfg.writeEntry("switchSelectionCtrlAlt", value);
KisConfigNotifier::instance()->notifyConfigChanged();
}
bool KisConfig::convertToImageColorspaceOnImport(bool defaultValue) const
{
return defaultValue ? false : m_cfg.readEntry("ConvertToImageColorSpaceOnImport", false);
}
void KisConfig::setConvertToImageColorspaceOnImport(bool value)
{
m_cfg.writeEntry("ConvertToImageColorSpaceOnImport", value);
}
int KisConfig::stabilizerSampleSize(bool defaultValue) const
{
#ifdef Q_OS_WIN
const int defaultSampleSize = 50;
#else
const int defaultSampleSize = 15;
#endif
return defaultValue ?
defaultSampleSize : m_cfg.readEntry("stabilizerSampleSize", defaultSampleSize);
}
void KisConfig::setStabilizerSampleSize(int value)
{
m_cfg.writeEntry("stabilizerSampleSize", value);
}
-int KisConfig::stabilizerDelayedPaintInterval(bool defaultValue) const
+bool KisConfig::stabilizerDelayedPaint(bool defaultValue) const
{
- const int defaultInterval = 20;
+ const bool defaultEnabled = true;
return defaultValue ?
- defaultInterval : m_cfg.readEntry("stabilizerDelayedPaintInterval", defaultInterval);
+ defaultEnabled : m_cfg.readEntry("stabilizerDelayedPaint", defaultEnabled);
}
-void KisConfig::setStabilizerDelayedPaintInterval(int value)
+void KisConfig::setStabilizerDelayedPaint(bool value)
{
- m_cfg.writeEntry("stabilizerDelayedPaintInterval", value);
+ m_cfg.writeEntry("stabilizerDelayedPaint", value);
}
QString KisConfig::customFFMpegPath(bool defaultValue) const
{
return defaultValue ? QString() : m_cfg.readEntry("ffmpegExecutablePath", QString());
}
void KisConfig::setCustomFFMpegPath(const QString &value) const
{
m_cfg.writeEntry("ffmpegExecutablePath", value);
}
bool KisConfig::showBrushHud(bool defaultValue) const
{
return defaultValue ? false : m_cfg.readEntry("showBrushHud", false);
}
void KisConfig::setShowBrushHud(bool value)
{
m_cfg.writeEntry("showBrushHud", value);
}
QString KisConfig::brushHudSetting(bool defaultValue) const
{
QString defaultDoc = "<!DOCTYPE hud_properties>\n<hud_properties>\n <version value=\"1\" type=\"value\"/>\n <paintbrush>\n <properties_list type=\"array\">\n <item_0 value=\"size\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n <item_2 value=\"angle\" type=\"value\"/>\n </properties_list>\n </paintbrush>\n <colorsmudge>\n <properties_list type=\"array\">\n <item_0 value=\"size\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n <item_2 value=\"smudge_mode\" type=\"value\"/>\n <item_3 value=\"smudge_length\" type=\"value\"/>\n <item_4 value=\"smudge_color_rate\" type=\"value\"/>\n </properties_list>\n </colorsmudge>\n <sketchbrush>\n <properties_list type=\"array\">\n <item_0 value=\"opacity\" type=\"value\"/>\n <item_1 value=\"size\" type=\"value\"/>\n </properties_list>\n </sketchbrush>\n <hairybrush>\n <properties_list type=\"array\">\n <item_0 value=\"size\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n </properties_list>\n </hairybrush>\n <experimentbrush>\n <properties_list type=\"array\">\n <item_0 value=\"opacity\" type=\"value\"/>\n <item_1 value=\"shape_windingfill\" type=\"value\"/>\n </properties_list>\n </experimentbrush>\n <spraybrush>\n <properties_list type=\"array\">\n <item_0 value=\"size\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n <item_2 value=\"spray_particlecount\" type=\"value\"/>\n <item_3 value=\"spray_density\" type=\"value\"/>\n </properties_list>\n </spraybrush>\n <hatchingbrush>\n <properties_list type=\"array\">\n <item_0 value=\"size\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n <item_2 value=\"hatching_angle\" type=\"value\"/>\n <item_3 value=\"hatching_thickness\" type=\"value\"/>\n <item_4 value=\"hatching_separation\" type=\"value\"/>\n </properties_list>\n </hatchingbrush>\n <gridbrush>\n <properties_list type=\"array\">\n <item_0 value=\"size\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n <item_2 value=\"grid_divisionlevel\" type=\"value\"/>\n </properties_list>\n </gridbrush>\n <curvebrush>\n <properties_list type=\"array\">\n <item_0 value=\"opacity\" type=\"value\"/>\n <item_1 value=\"curve_historysize\" type=\"value\"/>\n <item_2 value=\"curve_linewidth\" type=\"value\"/>\n <item_3 value=\"curve_lineopacity\" type=\"value\"/>\n <item_4 value=\"curve_connectionline\" type=\"value\"/>\n </properties_list>\n </curvebrush>\n <dynabrush>\n <properties_list type=\"array\">\n <item_0 value=\"dyna_diameter\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n <item_2 value=\"dyna_mass\" type=\"value\"/>\n <item_3 value=\"dyna_drag\" type=\"value\"/>\n </properties_list>\n </dynabrush>\n <particlebrush>\n <properties_list type=\"array\">\n <item_0 value=\"opacity\" type=\"value\"/>\n <item_1 value=\"particle_particles\" type=\"value\"/>\n <item_2 value=\"particle_opecityweight\" type=\"value\"/>\n <item_3 value=\"particle_iterations\" type=\"value\"/>\n </properties_list>\n </particlebrush>\n <duplicate>\n <properties_list type=\"array\">\n <item_0 value=\"size\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n <item_2 value=\"clone_healing\" type=\"value\"/>\n <item_3 value=\"clone_movesource\" type=\"value\"/>\n </properties_list>\n </duplicate>\n <deformbrush>\n <properties_list type=\"array\">\n <item_0 value=\"size\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n <item_2 value=\"deform_amount\" type=\"value\"/>\n <item_3 value=\"deform_mode\" type=\"value\"/>\n </properties_list>\n </deformbrush>\n <tangentnormal>\n <properties_list type=\"array\">\n <item_0 value=\"size\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n </properties_list>\n </tangentnormal>\n <filter>\n <properties_list type=\"array\">\n <item_0 value=\"size\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n </properties_list>\n </filter>\n <chalkbrush>\n <properties_list type=\"array\">\n <item_0 value=\"size\" type=\"value\"/>\n <item_1 value=\"opacity\" type=\"value\"/>\n </properties_list>\n </chalkbrush>\n <roundmarker>\n <properties_list type=\"array\">\n <item_0 value=\"opacity\" type=\"value\"/>\n <item_1 value=\"size\" type=\"value\"/>\n </properties_list>\n </roundmarker>\n</hud_properties>\n";
return defaultValue ? defaultDoc : m_cfg.readEntry("brushHudSettings", defaultDoc);
}
void KisConfig::setBrushHudSetting(const QString &value) const
{
m_cfg.writeEntry("brushHudSettings", value);
}
bool KisConfig::calculateAnimationCacheInBackground(bool defaultValue) const
{
return defaultValue ? true : m_cfg.readEntry("calculateAnimationCacheInBackground", true);
}
void KisConfig::setCalculateAnimationCacheInBackground(bool value)
{
m_cfg.writeEntry("calculateAnimationCacheInBackground", value);
}
#include <QDomDocument>
#include <QDomElement>
void KisConfig::writeKoColor(const QString& name, const KoColor& color) const
{
QDomDocument doc = QDomDocument(name);
QDomElement el = doc.createElement(name);
doc.appendChild(el);
color.toXML(doc, el);
m_cfg.writeEntry(name, doc.toString());
}
//ported from kispropertiesconfig.
KoColor KisConfig::readKoColor(const QString& name, const KoColor& color) const
{
QDomDocument doc;
if (!m_cfg.readEntry(name).isNull()) {
doc.setContent(m_cfg.readEntry(name));
QDomElement e = doc.documentElement().firstChild().toElement();
return KoColor::fromXML(e, Integer16BitsColorDepthID.id());
} else {
QString blackColor = "<!DOCTYPE Color>\n<Color>\n <RGB r=\"0\" space=\"sRGB-elle-V2-srgbtrc.icc\" b=\"0\" g=\"0\"/>\n</Color>\n";
doc.setContent(blackColor);
QDomElement e = doc.documentElement().firstChild().toElement();
return KoColor::fromXML(e, Integer16BitsColorDepthID.id());
}
return color;
}
diff --git a/libs/ui/kis_config.h b/libs/ui/kis_config.h
index b0a561d7ae..717d1432aa 100644
--- a/libs/ui/kis_config.h
+++ b/libs/ui/kis_config.h
@@ -1,549 +1,561 @@
/*
* Copyright (c) 2002 Patrick Julien <freak@codepimps.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef KIS_CONFIG_H_
#define KIS_CONFIG_H_
#include <QString>
#include <QStringList>
#include <QList>
#include <QColor>
#include <ksharedconfig.h>
#include <kconfiggroup.h>
#include "kis_global.h"
#include "kis_properties_configuration.h"
#include "kritaui_export.h"
class KoColorProfile;
class KoColorSpace;
class KisSnapConfig;
class KRITAUI_EXPORT KisConfig
{
public:
KisConfig();
~KisConfig();
bool disableTouchOnCanvas(bool defaultValue = false) const;
void setDisableTouchOnCanvas(bool value) const;
bool useProjections(bool defaultValue = false) const;
void setUseProjections(bool useProj) const;
bool undoEnabled(bool defaultValue = false) const;
void setUndoEnabled(bool undo) const;
int undoStackLimit(bool defaultValue = false) const;
void setUndoStackLimit(int limit) const;
bool useCumulativeUndoRedo(bool defaultValue = false) const;
void setCumulativeUndoRedo(bool value);
double stackT1(bool defaultValue = false) const;
void setStackT1(int T1);
double stackT2(bool defaultValue = false) const;
void setStackT2(int T2);
int stackN(bool defaultValue = false) const;
void setStackN(int N);
qint32 defImageWidth(bool defaultValue = false) const;
void defImageWidth(qint32 width) const;
qint32 defImageHeight(bool defaultValue = false) const;
void defImageHeight(qint32 height) const;
qreal defImageResolution(bool defaultValue = false) const;
void defImageResolution(qreal res) const;
/**
* @return the id of the default color model used for creating new images.
*/
QString defColorModel(bool defaultValue = false) const;
/**
* set the id of the default color model used for creating new images.
*/
void defColorModel(const QString & model) const;
/**
* @return the id of the default color depth used for creating new images.
*/
QString defaultColorDepth(bool defaultValue = false) const;
/**
* set the id of the default color depth used for creating new images.
*/
void setDefaultColorDepth(const QString & depth) const;
/**
* @return the id of the default color profile used for creating new images.
*/
QString defColorProfile(bool defaultValue = false) const;
/**
* set the id of the default color profile used for creating new images.
*/
void defColorProfile(const QString & depth) const;
CursorStyle newCursorStyle(bool defaultValue = false) const;
void setNewCursorStyle(CursorStyle style);
+ QColor getCursorMainColor(bool defaultValue = false) const;
+ void setCursorMainColor(const QColor& v) const;
+
OutlineStyle newOutlineStyle(bool defaultValue = false) const;
void setNewOutlineStyle(OutlineStyle style);
QRect colorPreviewRect() const;
void setColorPreviewRect(const QRect &rect);
/// get the profile the user has selected for the given screen
QString monitorProfile(int screen) const;
void setMonitorProfile(int screen, const QString & monitorProfile, bool override) const;
QString monitorForScreen(int screen, const QString &defaultMonitor, bool defaultValue = true) const;
void setMonitorForScreen(int screen, const QString& monitor);
/// Get the actual profile to be used for the given screen, which is
/// either the screen profile set by the color management system or
/// the custom monitor profile set by the user, depending on the configuration
const KoColorProfile *displayProfile(int screen) const;
QString workingColorSpace(bool defaultValue = false) const;
void setWorkingColorSpace(const QString & workingColorSpace) const;
QString importProfile(bool defaultValue = false) const;
void setImportProfile(const QString & importProfile) const;
QString printerColorSpace(bool defaultValue = false) const;
void setPrinterColorSpace(const QString & printerColorSpace) const;
QString printerProfile(bool defaultValue = false) const;
void setPrinterProfile(const QString & printerProfile) const;
bool useBlackPointCompensation(bool defaultValue = false) const;
void setUseBlackPointCompensation(bool useBlackPointCompensation) const;
bool allowLCMSOptimization(bool defaultValue = false) const;
void setAllowLCMSOptimization(bool allowLCMSOptimization);
void writeKoColor(const QString& name, const KoColor& color) const;
KoColor readKoColor(const QString& name, const KoColor& color = KoColor()) const;
bool showRulers(bool defaultValue = false) const;
void setShowRulers(bool rulers) const;
bool rulersTrackMouse(bool defaultValue = false) const;
void setRulersTrackMouse(bool value) const;
qint32 pasteBehaviour(bool defaultValue = false) const;
void setPasteBehaviour(qint32 behaviour) const;
qint32 monitorRenderIntent(bool defaultValue = false) const;
void setRenderIntent(qint32 monitorRenderIntent) const;
bool useOpenGL(bool defaultValue = false) const;
void setUseOpenGL(bool useOpenGL) const;
int openGLFilteringMode(bool defaultValue = false) const;
void setOpenGLFilteringMode(int filteringMode);
bool useOpenGLTextureBuffer(bool defaultValue = false) const;
void setUseOpenGLTextureBuffer(bool useBuffer);
bool disableVSync(bool defaultValue = false) const;
void setDisableVSync(bool disableVSync);
bool showAdvancedOpenGLSettings(bool defaultValue = false) const;
bool forceOpenGLFenceWorkaround(bool defaultValue = false) const;
int numMipmapLevels(bool defaultValue = false) const;
int openGLTextureSize(bool defaultValue = false) const;
int textureOverlapBorder() const;
qint32 maxNumberOfThreads(bool defaultValue = false) const;
void setMaxNumberOfThreads(qint32 numberOfThreads);
quint32 getGridMainStyle(bool defaultValue = false) const;
void setGridMainStyle(quint32 v) const;
quint32 getGridSubdivisionStyle(bool defaultValue = false) const;
void setGridSubdivisionStyle(quint32 v) const;
QColor getGridMainColor(bool defaultValue = false) const;
void setGridMainColor(const QColor & v) const;
QColor getGridSubdivisionColor(bool defaultValue = false) const;
void setGridSubdivisionColor(const QColor & v) const;
+ QColor getOpenGLGridColor(bool defaultValue = false) const;
+ void setOpenGLGridColor(const QColor & v) const;
+
+ qreal getOpenGLGridDrawingThreshold(bool defaultValue = false) const;
+ void setOpenGLGridDrawingThreshold(qreal v) const;
+
quint32 guidesLineStyle(bool defaultValue = false) const;
void setGuidesLineStyle(quint32 v) const;
QColor guidesColor(bool defaultValue = false) const;
void setGuidesColor(const QColor & v) const;
void loadSnapConfig(KisSnapConfig *config, bool defaultValue = false) const;
void saveSnapConfig(const KisSnapConfig &config);
qint32 checkSize(bool defaultValue = false) const;
void setCheckSize(qint32 checkSize) const;
bool scrollCheckers(bool defaultValue = false) const;
void setScrollingCheckers(bool scollCheckers) const;
QColor checkersColor1(bool defaultValue = false) const;
void setCheckersColor1(const QColor & v) const;
QColor checkersColor2(bool defaultValue = false) const;
void setCheckersColor2(const QColor & v) const;
QColor canvasBorderColor(bool defaultValue = false) const;
void setCanvasBorderColor(const QColor &color) const;
bool hideScrollbars(bool defaultValue = false) const;
void setHideScrollbars(bool value) const;
bool antialiasCurves(bool defaultValue = false) const;
void setAntialiasCurves(bool v) const;
QColor selectionOverlayMaskColor(bool defaultValue = false) const;
void setSelectionOverlayMaskColor(const QColor &color);
bool antialiasSelectionOutline(bool defaultValue = false) const;
void setAntialiasSelectionOutline(bool v) const;
bool showRootLayer(bool defaultValue = false) const;
void setShowRootLayer(bool showRootLayer) const;
bool showGlobalSelection(bool defaultValue = false) const;
void setShowGlobalSelection(bool showGlobalSelection) const;
bool showOutlineWhilePainting(bool defaultValue = false) const;
void setShowOutlineWhilePainting(bool showOutlineWhilePainting) const;
bool hideSplashScreen(bool defaultValue = false) const;
void setHideSplashScreen(bool hideSplashScreen) const;
qreal outlineSizeMinimum(bool defaultValue = false) const;
void setOutlineSizeMinimum(qreal outlineSizeMinimum) const;
qreal selectionViewSizeMinimum(bool defaultValue = false) const;
void setSelectionViewSizeMinimum(qreal outlineSizeMinimum) const;
int autoSaveInterval(bool defaultValue = false) const;
void setAutoSaveInterval(int seconds) const;
bool backupFile(bool defaultValue = false) const;
void setBackupFile(bool backupFile) const;
bool showFilterGallery(bool defaultValue = false) const;
void setShowFilterGallery(bool showFilterGallery) const;
bool showFilterGalleryLayerMaskDialog(bool defaultValue = false) const;
void setShowFilterGalleryLayerMaskDialog(bool showFilterGallery) const;
// OPENGL_SUCCESS, TRY_OPENGL, OPENGL_NOT_TRIED, OPENGL_FAILED
QString canvasState(bool defaultValue = false) const;
void setCanvasState(const QString& state) const;
bool toolOptionsPopupDetached(bool defaultValue = false) const;
void setToolOptionsPopupDetached(bool detached) const;
bool paintopPopupDetached(bool defaultValue = false) const;
void setPaintopPopupDetached(bool detached) const;
QString pressureTabletCurve(bool defaultValue = false) const;
void setPressureTabletCurve(const QString& curveString) const;
qreal vastScrolling(bool defaultValue = false) const;
void setVastScrolling(const qreal factor) const;
int presetChooserViewMode(bool defaultValue = false) const;
void setPresetChooserViewMode(const int mode) const;
int presetIconSize(bool defaultValue = false) const;
void setPresetIconSize(const int value) const;
bool firstRun(bool defaultValue = false) const;
void setFirstRun(const bool firstRun) const;
bool clicklessSpacePan(bool defaultValue = false) const;
void setClicklessSpacePan(const bool toggle) const;
int horizontalSplitLines(bool defaultValue = false) const;
void setHorizontalSplitLines(const int numberLines) const;
int verticalSplitLines(bool defaultValue = false) const;
void setVerticalSplitLines(const int numberLines) const;
bool hideDockersFullscreen(bool defaultValue = false) const;
void setHideDockersFullscreen(const bool value) const;
bool showDockerTitleBars(bool defaultValue = false) const;
void setShowDockerTitleBars(const bool value) const;
bool showDockers(bool defaultValue = false) const;
void setShowDockers(const bool value) const;
bool showStatusBar(bool defaultValue = false) const;
void setShowStatusBar(const bool value) const;
bool hideMenuFullscreen(bool defaultValue = false) const;
void setHideMenuFullscreen(const bool value) const;
bool hideScrollbarsFullscreen(bool defaultValue = false) const;
void setHideScrollbarsFullscreen(const bool value) const;
bool hideStatusbarFullscreen(bool defaultValue = false) const;
void setHideStatusbarFullscreen(const bool value) const;
bool hideTitlebarFullscreen(bool defaultValue = false) const;
void setHideTitlebarFullscreen(const bool value) const;
bool hideToolbarFullscreen(bool defaultValue = false) const;
void setHideToolbarFullscreen(const bool value) const;
bool fullscreenMode(bool defaultValue = false) const;
void setFullscreenMode(const bool value) const;
QStringList favoriteCompositeOps(bool defaultValue = false) const;
void setFavoriteCompositeOps(const QStringList& compositeOps) const;
QString exportConfiguration(const QString &filterId, bool defaultValue = false) const;
void setExportConfiguration(const QString &filterId, KisPropertiesConfigurationSP properties) const;
+ QString importConfiguration(const QString &filterId, bool defaultValue = false) const;
+ void setImportConfiguration(const QString &filterId, KisPropertiesConfigurationSP properties) const;
+
bool useOcio(bool defaultValue = false) const;
void setUseOcio(bool useOCIO) const;
int favoritePresets(bool defaultValue = false) const;
void setFavoritePresets(const int value);
bool levelOfDetailEnabled(bool defaultValue = false) const;
void setLevelOfDetailEnabled(bool value);
enum OcioColorManagementMode {
INTERNAL = 0,
OCIO_CONFIG,
OCIO_ENVIRONMENT
};
OcioColorManagementMode ocioColorManagementMode(bool defaultValue = false) const;
void setOcioColorManagementMode(OcioColorManagementMode mode) const;
QString ocioConfigurationPath(bool defaultValue = false) const;
void setOcioConfigurationPath(const QString &path) const;
QString ocioLutPath(bool defaultValue = false) const;
void setOcioLutPath(const QString &path) const;
int ocioLutEdgeSize(bool defaultValue = false) const;
void setOcioLutEdgeSize(int value);
bool ocioLockColorVisualRepresentation(bool defaultValue = false) const;
void setOcioLockColorVisualRepresentation(bool value);
bool useSystemMonitorProfile(bool defaultValue = false) const;
void setUseSystemMonitorProfile(bool _useSystemMonitorProfile) const;
QString defaultPalette(bool defaultValue = false) const;
void setDefaultPalette(const QString& name) const;
QString toolbarSlider(int sliderNumber, bool defaultValue = false) const;
void setToolbarSlider(int sliderNumber, const QString &slider);
bool sliderLabels(bool defaultValue = false) const;
void setSliderLabels(bool enabled);
QString currentInputProfile(bool defaultValue = false) const;
void setCurrentInputProfile(const QString& name);
bool presetStripVisible(bool defaultValue = false) const;
void setPresetStripVisible(bool visible);
bool scratchpadVisible(bool defaultValue = false) const;
void setScratchpadVisible(bool visible);
bool showSingleChannelAsColor(bool defaultValue = false) const;
void setShowSingleChannelAsColor(bool asColor);
bool hidePopups(bool defaultValue = false) const;
void setHidePopups(bool hidepopups);
int numDefaultLayers(bool defaultValue = false) const;
void setNumDefaultLayers(int num);
quint8 defaultBackgroundOpacity(bool defaultValue = false) const;
void setDefaultBackgroundOpacity(quint8 value);
QColor defaultBackgroundColor(bool defaultValue = false) const;
void setDefaultBackgroundColor(QColor value);
enum BackgroundStyle {
LAYER = 0,
PROJECTION = 1
};
BackgroundStyle defaultBackgroundStyle(bool defaultValue = false) const;
void setDefaultBackgroundStyle(BackgroundStyle value);
int lineSmoothingType(bool defaultValue = false) const;
void setLineSmoothingType(int value);
qreal lineSmoothingDistance(bool defaultValue = false) const;
void setLineSmoothingDistance(qreal value);
qreal lineSmoothingTailAggressiveness(bool defaultValue = false) const;
void setLineSmoothingTailAggressiveness(qreal value);
bool lineSmoothingSmoothPressure(bool defaultValue = false) const;
void setLineSmoothingSmoothPressure(bool value);
bool lineSmoothingScalableDistance(bool defaultValue = false) const;
void setLineSmoothingScalableDistance(bool value);
qreal lineSmoothingDelayDistance(bool defaultValue = false) const;
void setLineSmoothingDelayDistance(qreal value);
bool lineSmoothingUseDelayDistance(bool defaultValue = false) const;
void setLineSmoothingUseDelayDistance(bool value);
bool lineSmoothingFinishStabilizedCurve(bool defaultValue = false) const;
void setLineSmoothingFinishStabilizedCurve(bool value);
bool lineSmoothingStabilizeSensors(bool defaultValue = false) const;
void setLineSmoothingStabilizeSensors(bool value);
int paletteDockerPaletteViewSectionSize(bool defaultValue = false) const;
void setPaletteDockerPaletteViewSectionSize(int value) const;
int tabletEventsDelay(bool defaultValue = false) const;
void setTabletEventsDelay(int value);
bool testingAcceptCompressedTabletEvents(bool defaultValue = false) const;
void setTestingAcceptCompressedTabletEvents(bool value);
bool shouldEatDriverShortcuts(bool defaultValue = false) const;
bool testingCompressBrushEvents(bool defaultValue = false) const;
void setTestingCompressBrushEvents(bool value);
const KoColorSpace* customColorSelectorColorSpace(bool defaultValue = false) const;
void setCustomColorSelectorColorSpace(const KoColorSpace *cs);
bool useDirtyPresets(bool defaultValue = false) const;
void setUseDirtyPresets(bool value);
bool useEraserBrushSize(bool defaultValue = false) const;
void setUseEraserBrushSize(bool value);
bool useEraserBrushOpacity(bool defaultValue = false) const;
void setUseEraserBrushOpacity(bool value);
QColor getMDIBackgroundColor(bool defaultValue = false) const;
void setMDIBackgroundColor(const QColor & v) const;
QString getMDIBackgroundImage(bool defaultValue = false) const;
void setMDIBackgroundImage(const QString & fileName) const;
bool useVerboseOpenGLDebugOutput(bool defaultValue = false) const;
int workaroundX11SmoothPressureSteps(bool defaultValue = false) const;
bool showCanvasMessages(bool defaultValue = false) const;
void setShowCanvasMessages(bool show);
bool compressKra(bool defaultValue = false) const;
void setCompressKra(bool compress);
bool toolOptionsInDocker(bool defaultValue = false) const;
void setToolOptionsInDocker(bool inDocker);
void setEnableOpenGLDebugging(bool value) const;
bool enableOpenGLDebugging(bool defaultValue = false) const;
void setEnableAmdVectorizationWorkaround(bool value);
bool enableAmdVectorizationWorkaround(bool defaultValue = false) const;
bool animationDropFrames(bool defaultValue = false) const;
void setAnimationDropFrames(bool value);
int scrubbingUpdatesDelay(bool defaultValue = false) const;
void setScrubbingUpdatesDelay(int value);
int scrubbingAudioUpdatesDelay(bool defaultValue = false) const;
void setScrubbingAudioUpdatesDelay(int value);
int audioOffsetTolerance(bool defaultValue = false) const;
void setAudioOffsetTolerance(int value);
bool switchSelectionCtrlAlt(bool defaultValue = false) const;
void setSwitchSelectionCtrlAlt(bool value);
bool convertToImageColorspaceOnImport(bool defaultValue = false) const;
void setConvertToImageColorspaceOnImport(bool value);
int stabilizerSampleSize(bool defaultValue = false) const;
void setStabilizerSampleSize(int value);
- int stabilizerDelayedPaintInterval(bool defaultValue = false) const;
- void setStabilizerDelayedPaintInterval(int value);
+ bool stabilizerDelayedPaint(bool defaultValue = false) const;
+ void setStabilizerDelayedPaint(bool value);
QString customFFMpegPath(bool defaultValue = false) const;
void setCustomFFMpegPath(const QString &value) const;
bool showBrushHud(bool defaultValue = false) const;
void setShowBrushHud(bool value);
QString brushHudSetting(bool defaultValue = false) const;
void setBrushHudSetting(const QString &value) const;
bool calculateAnimationCacheInBackground(bool defaultValue = false) const;
void setCalculateAnimationCacheInBackground(bool value);
template<class T>
void writeEntry(const QString& name, const T& value) {
m_cfg.writeEntry(name, value);
}
template<class T>
void writeList(const QString& name, const QList<T>& value) {
m_cfg.writeEntry(name, value);
}
template<class T>
T readEntry(const QString& name, const T& defaultValue=T()) {
return m_cfg.readEntry(name, defaultValue);
}
template<class T>
QList<T> readList(const QString& name, const QList<T>& defaultValue=QList<T>()) {
return m_cfg.readEntry(name, defaultValue);
}
/// get the profile the color managment system has stored for the given screen
static const KoColorProfile* getScreenProfile(int screen);
private:
KisConfig(const KisConfig&);
KisConfig& operator=(const KisConfig&) const;
private:
mutable KConfigGroup m_cfg;
};
#endif // KIS_CONFIG_H_
diff --git a/libs/ui/kis_palette_view.cpp b/libs/ui/kis_palette_view.cpp
index 6c4e49f543..fae4d672d9 100644
--- a/libs/ui/kis_palette_view.cpp
+++ b/libs/ui/kis_palette_view.cpp
@@ -1,286 +1,312 @@
/*
* Copyright (c) 2016 Dmitry Kazakov <dimula73@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kis_palette_view.h"
#include <QWheelEvent>
#include <QHeaderView>
#include "kis_palette_delegate.h"
#include "KisPaletteModel.h"
#include "kis_config.h"
+#include <KLocalizedString>
#include <KoDialog.h>
#include <QFormLayout>
#include <QLabel>
#include <QLineEdit>
#include <kis_color_button.h>
#include <QCheckBox>
#include <QComboBox>
struct KisPaletteView::Private
{
KisPaletteModel *model = 0;
bool allowPaletteModification = true;
};
KisPaletteView::KisPaletteView(QWidget *parent)
: KoTableView(parent),
m_d(new Private)
{
setShowGrid(false);
horizontalHeader()->setVisible(false);
verticalHeader()->setVisible(false);
setItemDelegate(new KisPaletteDelegate());
setDragEnabled(true);
setDragDropMode(QAbstractItemView::InternalMove);
setDropIndicatorShown(true);
KisConfig cfg;
QPalette pal(palette());
pal.setColor(QPalette::Base, cfg.getMDIBackgroundColor());
setAutoFillBackground(true);
setPalette(pal);
int defaultSectionSize = cfg.paletteDockerPaletteViewSectionSize();
horizontalHeader()->setDefaultSectionSize(defaultSectionSize);
verticalHeader()->setDefaultSectionSize(defaultSectionSize);
- connect(this, SIGNAL(clicked(QModelIndex)), this, SLOT(entrySelection()) );
connect(this, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(modifyEntry(QModelIndex)));
}
KisPaletteView::~KisPaletteView()
{
}
void KisPaletteView::setCrossedKeyword(const QString &value)
{
KisPaletteDelegate *delegate =
dynamic_cast<KisPaletteDelegate*>(itemDelegate());
KIS_ASSERT_RECOVER_RETURN(delegate);
delegate->setCrossedKeyword(value);
}
bool KisPaletteView::addEntryWithDialog(KoColor color)
{
KoDialog *window = new KoDialog();
- window->setWindowTitle("Add a new Colorset Entry");
+ window->setWindowTitle(i18nc("@title:window", "Add a new Colorset Entry"));
QFormLayout *editableItems = new QFormLayout();
window->mainWidget()->setLayout(editableItems);
QComboBox *cmbGroups = new QComboBox();
- QString defaultGroupName = "Default";
+ QString defaultGroupName = i18nc("Name for default group", "Default");
cmbGroups->addItem(defaultGroupName);
cmbGroups->addItems(m_d->model->colorSet()->getGroupNames());
QLineEdit *lnIDName = new QLineEdit();
QLineEdit *lnName = new QLineEdit();
KisColorButton *bnColor = new KisColorButton();
QCheckBox *chkSpot = new QCheckBox();
- editableItems->addRow(tr("Group"), cmbGroups);
- editableItems->addRow(tr("ID"), lnIDName);
- editableItems->addRow(tr("Name"), lnName);
- editableItems->addRow(tr("Color"), bnColor);
- editableItems->addRow(tr("Spot"), chkSpot);
+ chkSpot->setToolTip(i18nc("@info:tooltip", "A spot color is a color that the printer is able to print without mixing the paints it has available to it. The opposite is called a process color."));
+ editableItems->addRow(i18n("Group"), cmbGroups);
+ editableItems->addRow(i18n("ID"), lnIDName);
+ editableItems->addRow(i18n("Name"), lnName);
+ editableItems->addRow(i18n("Color"), bnColor);
+ editableItems->addRow(i18n("Spot"), chkSpot);
cmbGroups->setCurrentIndex(0);
- lnName->setText("Color "+QString::number(m_d->model->colorSet()->nColors()+1));
+ lnName->setText(i18nc("Part of a default name for a color","Color")+" "+QString::number(m_d->model->colorSet()->nColors()+1));
lnIDName->setText(QString::number(m_d->model->colorSet()->nColors()+1));
bnColor->setColor(color);
chkSpot->setChecked(false);
//
if (window->exec() == KoDialog::Accepted) {
QString groupName = cmbGroups->currentText();
if (groupName == defaultGroupName) {
groupName = QString();
}
KoColorSetEntry newEntry;
newEntry.color = bnColor->color();
newEntry.name = lnName->text();
newEntry.id = lnIDName->text();
newEntry.spotColor = chkSpot->isChecked();
m_d->model->addColorSetEntry(newEntry, groupName);
m_d->model->colorSet()->save();
return true;
}
return false;
}
bool KisPaletteView::addGroupWithDialog()
{
KoDialog *window = new KoDialog();
- window->setWindowTitle("Add a new group");
+ window->setWindowTitle(i18nc("@title:window","Add a new group"));
QFormLayout *editableItems = new QFormLayout();
window->mainWidget()->setLayout(editableItems);
QLineEdit *lnName = new QLineEdit();
- editableItems->addRow(tr("Name"), lnName);
- lnName->setText("Color Group "+QString::number(m_d->model->colorSet()->getGroupNames().size()+1));
+ editableItems->addRow(i18nc("Name for a group", "Name"), lnName);
+ lnName->setText(i18nc("Part of default name for a new group", "Color Group")+""+QString::number(m_d->model->colorSet()->getGroupNames().size()+1));
if (window->exec() == KoDialog::Accepted) {
QString groupName = lnName->text();
m_d->model->addGroup(groupName);
m_d->model->colorSet()->save();
return true;
}
return false;
}
bool KisPaletteView::removeEntryWithDialog(QModelIndex index)
{
bool keepColors = true;
if (qVariantValue<bool>(index.data(KisPaletteModel::IsHeaderRole))) {
KoDialog *window = new KoDialog();
- window->setWindowTitle("Removing Group");
+ window->setWindowTitle(i18nc("@title:window","Removing Group"));
QFormLayout *editableItems = new QFormLayout();
QCheckBox *chkKeep = new QCheckBox();
window->mainWidget()->setLayout(editableItems);
- editableItems->addRow(tr("Keep the Colors"), chkKeep);
+ editableItems->addRow(i18nc("Shows up when deleting a group","Keep the Colors"), chkKeep);
chkKeep->setChecked(keepColors);
if (window->exec() == KoDialog::Accepted) {
keepColors = chkKeep->isChecked();
m_d->model->removeEntry(index, keepColors);
m_d->model->colorSet()->save();
}
} else {
m_d->model->removeEntry(index, keepColors);
m_d->model->colorSet()->save();
}
return true;
}
+void KisPaletteView::trySelectClosestColor(KoColor color)
+{
+ quint32 i = m_d->model->colorSet()->getIndexClosestColor(color);
+ QModelIndex index = m_d->model->indexFromId(i);
+ this->selectionModel()->clearSelection();
+ this->selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select);
+}
+
+void KisPaletteView::mouseReleaseEvent(QMouseEvent *event)
+{
+ bool foreground = false;
+ if (event->button()== Qt::LeftButton) {
+ foreground = true;
+ }
+ entrySelection(foreground);
+}
+
void KisPaletteView::paletteModelChanged()
{
updateView();
updateRows();
}
void KisPaletteView::setPaletteModel(KisPaletteModel *model)
{
if (m_d->model) {
disconnect(m_d->model, 0, this, 0);
}
m_d->model = model;
setModel(model);
connect(m_d->model, SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)), this, SLOT(paletteModelChanged()));
connect(m_d->model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), this, SLOT(paletteModelChanged()));
connect(m_d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(paletteModelChanged()));
connect(m_d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(paletteModelChanged()));
}
KisPaletteModel* KisPaletteView::paletteModel() const
{
return m_d->model;
}
void KisPaletteView::updateRows()
{
this->clearSpans();
for (int r=0; r<=m_d->model->rowCount(); r++) {
QModelIndex index = m_d->model->index(r, 0);
if (qVariantValue<bool>(index.data(KisPaletteModel::IsHeaderRole))) {
setSpan(r, 0, 1, m_d->model->columnCount());
setRowHeight(r, this->fontMetrics().lineSpacing()+6);
}
}
}
void KisPaletteView::setAllowModification(bool allow)
{
m_d->allowPaletteModification = allow;
}
void KisPaletteView::wheelEvent(QWheelEvent *event)
{
if (event->modifiers() & Qt::ControlModifier) {
int numDegrees = event->delta() / 8;
int numSteps = numDegrees / 7;
int curSize = horizontalHeader()->sectionSize(0);
int setSize = numSteps + curSize;
if ( setSize >= 12 ) {
horizontalHeader()->setDefaultSectionSize(setSize);
verticalHeader()->setDefaultSectionSize(setSize);
KisConfig cfg;
cfg.setPaletteDockerPaletteViewSectionSize(setSize);
}
event->accept();
} else {
KoTableView::wheelEvent(event);
}
}
-void KisPaletteView::entrySelection() {
- QModelIndex index = selectedIndexes().last();
- if (!index.isValid()) {
- index = selectedIndexes().first();
+void KisPaletteView::entrySelection(bool foreground) {
+ QModelIndex index;
+ if (selectedIndexes().size()<=0) {
+ return;
}
- if (!index.isValid()) {
+ if (selectedIndexes().last().isValid()) {
+ index = selectedIndexes().last();
+ } else if (selectedIndexes().first().isValid()) {
+ index = selectedIndexes().first();
+ } else {
return;
}
if (qVariantValue<bool>(index.data(KisPaletteModel::IsHeaderRole))==false) {
KoColorSetEntry entry = m_d->model->colorSetEntryFromIndex(index);
- emit(entrySelected(entry));
+ if (foreground) {
+ emit(entrySelected(entry));
+ } else {
+ emit(entrySelectedBackGround(entry));
+ }
}
}
void KisPaletteView::modifyEntry(QModelIndex index) {
if (m_d->allowPaletteModification) {
KoDialog *group = new KoDialog();
- //QHBoxLayout *mainLayout = new QHBoxLayout();
QFormLayout *editableItems = new QFormLayout();
group->mainWidget()->setLayout(editableItems);
QLineEdit *lnIDName = new QLineEdit();
QLineEdit *lnGroupName = new QLineEdit();
KisColorButton *bnColor = new KisColorButton();
QCheckBox *chkSpot = new QCheckBox();
if (qVariantValue<bool>(index.data(KisPaletteModel::IsHeaderRole))) {
QString groupName = qVariantValue<QString>(index.data(Qt::DisplayRole));
- editableItems->addRow(tr("Name"), lnGroupName);
+ editableItems->addRow(i18nc("Name for a colorgroup","Name"), lnGroupName);
lnGroupName->setText(groupName);
if (group->exec() == KoDialog::Accepted) {
m_d->model->colorSet()->changeGroupName(groupName, lnGroupName->text());
m_d->model->colorSet()->save();
updateRows();
}
//rename the group.
} else {
KoColorSetEntry entry = m_d->model->colorSetEntryFromIndex(index);
QStringList entryList = qVariantValue<QStringList>(index.data(KisPaletteModel::RetrieveEntryRole));
- editableItems->addRow(tr("ID"), lnIDName);
- editableItems->addRow(tr("Name"), lnGroupName);
- editableItems->addRow(tr("Color"), bnColor);
- editableItems->addRow(tr("Spot"), chkSpot);
+ chkSpot->setToolTip(i18nc("@info:tooltip", "A spot color is a color that the printer is able to print without mixing the paints it has available to it. The opposite is called a process color."));
+ editableItems->addRow(i18n("ID"), lnIDName);
+ editableItems->addRow(i18n("Name"), lnGroupName);
+ editableItems->addRow(i18n("Color"), bnColor);
+ editableItems->addRow(i18n("Spot"), chkSpot);
lnGroupName->setText(entry.name);
lnIDName->setText(entry.id);
bnColor->setColor(entry.color);
chkSpot->setChecked(entry.spotColor);
if (group->exec() == KoDialog::Accepted) {
entry.name = lnGroupName->text();
entry.id = lnIDName->text();
entry.color = bnColor->color();
entry.spotColor = chkSpot->isChecked();
m_d->model->colorSet()->changeColorSetEntry(entry, entryList.at(0), entryList.at(1).toUInt());
m_d->model->colorSet()->save();
}
}
}
}
diff --git a/libs/ui/kis_palette_view.h b/libs/ui/kis_palette_view.h
index d621559845..9aee6b9621 100644
--- a/libs/ui/kis_palette_view.h
+++ b/libs/ui/kis_palette_view.h
@@ -1,104 +1,112 @@
/*
* Copyright (c) 2016 Dmitry Kazakov <dimula73@gmail.com>
+ * Copyright (c) 2017 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __KIS_PALETTE_VIEW_H
#define __KIS_PALETTE_VIEW_H
#include <QScopedPointer>
#include <KoTableView.h>
#include <KoColorSet.h>
#include "kritaui_export.h"
class KisPaletteModel;
class QWheelEvent;
class KRITAUI_EXPORT KisPaletteView : public KoTableView
{
Q_OBJECT
public:
KisPaletteView(QWidget *parent = 0);
~KisPaletteView() override;
void setPaletteModel(KisPaletteModel *model);
KisPaletteModel* paletteModel() const;
/**
* @brief updateRows
* update the rows so they have the proper columnspanning.
*/
void updateRows();
/**
* @brief setAllowModification
* Set whether doubleclick calls up a modification window. This is to prevent users from editing
* the palette when the palette is intended to be a list of items.
*/
void setAllowModification(bool allow);
/**
* @brief setCrossedKeyword
* this apparently allows you to set keywords that can cross out colors.
* This is implemented to mark the lazybrush "transparent" color.
* @param value
*/
void setCrossedKeyword(const QString &value);
public Q_SLOTS:
void paletteModelChanged();
/**
* add an entry with a dialog window.
*/
bool addEntryWithDialog(KoColor color);
/**
* @brief addGroupWithDialog
* summons a little dialog to name the new group.
*/
bool addGroupWithDialog();
/**
* remove entry with a dialog window.(Necessary for groups.
*/
bool removeEntryWithDialog(QModelIndex index);
+ /**
+ * This tries to select the closest color in the palette.
+ * This doesn't update the foreground color, just the visual selection.
+ */
+ void trySelectClosestColor(KoColor color);
Q_SIGNALS:
/**
* @brief entrySelected
* signals when an entry is selected.
* @param entry the selected entry.
*/
void entrySelected(KoColorSetEntry entry);
+ void entrySelectedBackGround(KoColorSetEntry entry);
protected:
+ void mouseReleaseEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event) override;
private:
struct Private;
const QScopedPointer<Private> m_d;
private Q_SLOTS:
/**
* @brief entrySelection
* the function that will emit entrySelected when the entry changes.
*/
- void entrySelection();
+ void entrySelection(bool foreground = true);
/**
* @brief modifyEntry
* function for changing the entry at the given index.
* if modification isn't allow(@see setAllowModification), this does nothing.
*/
void modifyEntry(QModelIndex index);
};
#endif /* __KIS_PALETTE_VIEW_H */
diff --git a/libs/ui/opengl/kis_opengl_canvas2.cpp b/libs/ui/opengl/kis_opengl_canvas2.cpp
index 2ef938f379..80238a9f00 100644
--- a/libs/ui/opengl/kis_opengl_canvas2.cpp
+++ b/libs/ui/opengl/kis_opengl_canvas2.cpp
@@ -1,781 +1,860 @@
/* This file is part of the KDE project
* Copyright (C) Boudewijn Rempt <boud@valdyas.org>, (C) 2006-2013
* Copyright (C) 2015 Michael Abrahams <miabraha@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#define GL_GLEXT_PROTOTYPES
#include "opengl/kis_opengl_canvas2.h"
#include "opengl/kis_opengl_canvas2_p.h"
#include "opengl/kis_opengl_shader_loader.h"
#include "opengl/kis_opengl_canvas_debugger.h"
#include "canvas/kis_canvas2.h"
#include "canvas/kis_coordinates_converter.h"
#include "canvas/kis_display_filter.h"
#include "canvas/kis_display_color_converter.h"
#include "kis_config.h"
#include "kis_config_notifier.h"
#include "kis_debug.h"
#include <QPainter>
#include <QPainterPath>
#include <QPointF>
#include <QMatrix>
#include <QTransform>
#include <QThread>
#include <QFile>
#include <QOpenGLShaderProgram>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLBuffer>
#include <QMessageBox>
#define NEAR_VAL -1000.0
#define FAR_VAL 1000.0
#ifndef GL_CLAMP_TO_EDGE
#define GL_CLAMP_TO_EDGE 0x812F
#endif
#define PROGRAM_VERTEX_ATTRIBUTE 0
#define PROGRAM_TEXCOORD_ATTRIBUTE 1
static bool OPENGL_SUCCESS = false;
struct KisOpenGLCanvas2::Private
{
public:
~Private() {
delete displayShader;
delete checkerShader;
- delete cursorShader;
+ delete solidColorShader;
Sync::deleteSync(glSyncObject);
}
bool canvasInitialized{false};
KisOpenGLImageTexturesSP openGLImageTextures;
KisOpenGLShaderLoader shaderLoader;
KisShaderProgram *displayShader{0};
KisShaderProgram *checkerShader{0};
- KisShaderProgram *cursorShader{0};
+ KisShaderProgram *solidColorShader{0};
GLfloat checkSizeScale;
bool scrollCheckers;
QSharedPointer<KisDisplayFilter> displayFilter;
KisOpenGL::FilterMode filterMode;
bool proofingConfigIsUpdated=false;
GLsync glSyncObject{0};
bool wrapAroundMode{false};
// Stores a quad for drawing the canvas
QOpenGLVertexArrayObject quadVAO;
QOpenGLBuffer quadBuffers[2];
// Stores data for drawing tool outlines
QOpenGLVertexArrayObject outlineVAO;
QOpenGLBuffer lineBuffer;
QVector3D vertices[6];
QVector2D texCoords[6];
int xToColWithWrapCompensation(int x, const QRect &imageRect) {
int firstImageColumn = openGLImageTextures->xToCol(imageRect.left());
int lastImageColumn = openGLImageTextures->xToCol(imageRect.right());
int colsPerImage = lastImageColumn - firstImageColumn + 1;
int numWraps = floor(qreal(x) / imageRect.width());
int remainder = x - imageRect.width() * numWraps;
return colsPerImage * numWraps + openGLImageTextures->xToCol(remainder);
}
int yToRowWithWrapCompensation(int y, const QRect &imageRect) {
int firstImageRow = openGLImageTextures->yToRow(imageRect.top());
int lastImageRow = openGLImageTextures->yToRow(imageRect.bottom());
int rowsPerImage = lastImageRow - firstImageRow + 1;
int numWraps = floor(qreal(y) / imageRect.height());
int remainder = y - imageRect.height() * numWraps;
return rowsPerImage * numWraps + openGLImageTextures->yToRow(remainder);
}
};
KisOpenGLCanvas2::KisOpenGLCanvas2(KisCanvas2 *canvas,
KisCoordinatesConverter *coordinatesConverter,
QWidget *parent,
KisImageWSP image,
KisDisplayColorConverter *colorConverter)
: QOpenGLWidget(parent)
, KisCanvasWidgetBase(canvas, coordinatesConverter)
, d(new Private())
{
KisConfig cfg;
cfg.setCanvasState("OPENGL_STARTED");
d->openGLImageTextures =
KisOpenGLImageTextures::getImageTextures(image,
colorConverter->monitorProfile(),
colorConverter->renderingIntent(),
colorConverter->conversionFlags());
setAcceptDrops(true);
setAutoFillBackground(false);
setFocusPolicy(Qt::StrongFocus);
setAttribute(Qt::WA_NoSystemBackground, true);
#ifdef Q_OS_OSX
setAttribute(Qt::WA_AcceptTouchEvents, false);
#else
setAttribute(Qt::WA_AcceptTouchEvents, true);
#endif
setAttribute(Qt::WA_InputMethodEnabled, true);
setAttribute(Qt::WA_DontCreateNativeAncestors, true);
setDisplayFilterImpl(colorConverter->displayFilter(), true);
connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(slotConfigChanged()));
slotConfigChanged();
cfg.writeEntry("canvasState", "OPENGL_SUCCESS");
}
KisOpenGLCanvas2::~KisOpenGLCanvas2()
{
delete d;
}
bool KisOpenGLCanvas2::needsFpsDebugging() const
{
return KisOpenglCanvasDebugger::instance()->showFpsOnCanvas();
}
void KisOpenGLCanvas2::setDisplayFilter(QSharedPointer<KisDisplayFilter> displayFilter)
{
setDisplayFilterImpl(displayFilter, false);
}
void KisOpenGLCanvas2::setDisplayFilterImpl(QSharedPointer<KisDisplayFilter> displayFilter, bool initializing)
{
bool needsInternalColorManagement =
!displayFilter || displayFilter->useInternalColorManagement();
bool needsFullRefresh = d->openGLImageTextures->setInternalColorManagementActive(needsInternalColorManagement);
d->displayFilter = displayFilter;
if (d->canvasInitialized) {
d->canvasInitialized = false;
delete d->displayShader;
bool useHiQualityFiltering = d->filterMode == KisOpenGL::HighQualityFiltering;
try {
d->displayShader = d->shaderLoader.loadDisplayShader(d->displayFilter, useHiQualityFiltering);
} catch (const ShaderLoaderException &e) {
reportFailedShaderCompilation(e.what());
}
d->canvasInitialized = true;
}
if (!initializing && needsFullRefresh) {
canvas()->startUpdateInPatches(canvas()->image()->bounds());
}
else if (!initializing) {
canvas()->updateCanvas();
}
}
void KisOpenGLCanvas2::setWrapAroundViewingMode(bool value)
{
d->wrapAroundMode = value;
update();
}
inline void rectToVertices(QVector3D* vertices, const QRectF &rc)
{
vertices[0] = QVector3D(rc.left(), rc.bottom(), 0.f);
vertices[1] = QVector3D(rc.left(), rc.top(), 0.f);
vertices[2] = QVector3D(rc.right(), rc.bottom(), 0.f);
vertices[3] = QVector3D(rc.left(), rc.top(), 0.f);
vertices[4] = QVector3D(rc.right(), rc.top(), 0.f);
vertices[5] = QVector3D(rc.right(), rc.bottom(), 0.f);
}
inline void rectToTexCoords(QVector2D* texCoords, const QRectF &rc)
{
texCoords[0] = QVector2D(rc.left(), rc.bottom());
texCoords[1] = QVector2D(rc.left(), rc.top());
texCoords[2] = QVector2D(rc.right(), rc.bottom());
texCoords[3] = QVector2D(rc.left(), rc.top());
texCoords[4] = QVector2D(rc.right(), rc.top());
texCoords[5] = QVector2D(rc.right(), rc.bottom());
}
void KisOpenGLCanvas2::initializeGL()
{
KisOpenGL::initializeContext(context());
initializeOpenGLFunctions();
KisConfig cfg;
d->openGLImageTextures->setProofingConfig(canvas()->proofingConfiguration());
d->openGLImageTextures->initGL(context()->functions());
d->openGLImageTextures->generateCheckerTexture(createCheckersImage(cfg.checkSize()));
initializeShaders();
// If we support OpenGL 3.2, then prepare our VAOs and VBOs for drawing
if (KisOpenGL::hasOpenGL3()) {
d->quadVAO.create();
d->quadVAO.bind();
glEnableVertexAttribArray(PROGRAM_VERTEX_ATTRIBUTE);
glEnableVertexAttribArray(PROGRAM_TEXCOORD_ATTRIBUTE);
// Create the vertex buffer object, it has 6 vertices with 3 components
d->quadBuffers[0].create();
d->quadBuffers[0].setUsagePattern(QOpenGLBuffer::StaticDraw);
d->quadBuffers[0].bind();
d->quadBuffers[0].allocate(d->vertices, 6 * 3 * sizeof(float));
glVertexAttribPointer(PROGRAM_VERTEX_ATTRIBUTE, 3, GL_FLOAT, GL_FALSE, 0, 0);
// Create the texture buffer object, it has 6 texture coordinates with 2 components
d->quadBuffers[1].create();
d->quadBuffers[1].setUsagePattern(QOpenGLBuffer::StaticDraw);
d->quadBuffers[1].bind();
d->quadBuffers[1].allocate(d->texCoords, 6 * 2 * sizeof(float));
glVertexAttribPointer(PROGRAM_TEXCOORD_ATTRIBUTE, 2, GL_FLOAT, GL_FALSE, 0, 0);
// Create the outline buffer, this buffer will store the outlines of
// tools and will frequently change data
d->outlineVAO.create();
d->outlineVAO.bind();
glEnableVertexAttribArray(PROGRAM_VERTEX_ATTRIBUTE);
// The outline buffer has a StreamDraw usage pattern, because it changes constantly
d->lineBuffer.create();
d->lineBuffer.setUsagePattern(QOpenGLBuffer::StreamDraw);
d->lineBuffer.bind();
glVertexAttribPointer(PROGRAM_VERTEX_ATTRIBUTE, 3, GL_FLOAT, GL_FALSE, 0, 0);
}
Sync::init(context());
d->canvasInitialized = true;
}
/**
* Loads all shaders and reports compilation problems
*/
void KisOpenGLCanvas2::initializeShaders()
{
bool useHiQualityFiltering = d->filterMode == KisOpenGL::HighQualityFiltering;
if (!d->canvasInitialized) {
delete d->displayShader;
delete d->checkerShader;
- delete d->cursorShader;
+ delete d->solidColorShader;
try {
d->displayShader = d->shaderLoader.loadDisplayShader(d->displayFilter, useHiQualityFiltering);
d->checkerShader = d->shaderLoader.loadCheckerShader();
- d->cursorShader = d->shaderLoader.loadCursorShader();
+ d->solidColorShader = d->shaderLoader.loadSolidColorShader();
} catch (const ShaderLoaderException &e) {
reportFailedShaderCompilation(e.what());
}
}
}
/**
* Displays a message box telling the user that
* shader compilation failed and turns off OpenGL.
*/
void KisOpenGLCanvas2::reportFailedShaderCompilation(const QString &context)
{
KisConfig cfg;
if (cfg.useVerboseOpenGLDebugOutput()) {
dbgUI << "GL-log:" << context;
}
qDebug() << "Shader Compilation Failure: " << context;
QMessageBox::critical(this, i18nc("@title:window", "Krita"),
QString(i18n("Krita could not initialize the OpenGL canvas:\n\n%1\n\n Krita will disable OpenGL and close now.")).arg(context),
QMessageBox::Close);
cfg.setUseOpenGL(false);
cfg.setCanvasState("OPENGL_FAILED");
}
void KisOpenGLCanvas2::resizeGL(int width, int height)
{
coordinatesConverter()->setCanvasWidgetSize(QSize(width, height));
paintGL();
}
void KisOpenGLCanvas2::paintGL()
{
if (!OPENGL_SUCCESS) {
KisConfig cfg;
cfg.writeEntry("canvasState", "OPENGL_PAINT_STARTED");
}
KisOpenglCanvasDebugger::instance()->nofityPaintRequested();
renderCanvasGL();
if (d->glSyncObject) {
Sync::deleteSync(d->glSyncObject);
}
d->glSyncObject = Sync::getSync();
QPainter gc(this);
renderDecorations(&gc);
gc.end();
if (!OPENGL_SUCCESS) {
KisConfig cfg;
cfg.writeEntry("canvasState", "OPENGL_SUCCESS");
OPENGL_SUCCESS = true;
}
}
void KisOpenGLCanvas2::paintToolOutline(const QPainterPath &path)
{
- d->cursorShader->bind();
+ if (!d->solidColorShader->bind()) {
+ return;
+ }
// setup the mvp transformation
- KisCoordinatesConverter *converter = coordinatesConverter();
-
QMatrix4x4 projectionMatrix;
projectionMatrix.setToIdentity();
projectionMatrix.ortho(0, width(), height(), 0, NEAR_VAL, FAR_VAL);
// Set view/projection matrices
- QMatrix4x4 modelMatrix(converter->flakeToWidgetTransform());
+ QMatrix4x4 modelMatrix(coordinatesConverter()->flakeToWidgetTransform());
modelMatrix.optimize();
modelMatrix = projectionMatrix * modelMatrix;
- d->cursorShader->setUniformValue(d->cursorShader->location(Uniform::ModelViewProjection), modelMatrix);
+ d->solidColorShader->setUniformValue(d->solidColorShader->location(Uniform::ModelViewProjection), modelMatrix);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_COLOR_LOGIC_OP);
glLogicOp(GL_XOR);
+ KisConfig cfg;
+ QColor cursorColor = cfg.getCursorMainColor();
+ d->solidColorShader->setUniformValue(
+ d->solidColorShader->location(Uniform::FragmentColor),
+ QVector4D(cursorColor.redF(), cursorColor.greenF(), cursorColor.blueF(), 1.0f));
+
// Paint the tool outline
if (KisOpenGL::hasOpenGL3()) {
d->outlineVAO.bind();
d->lineBuffer.bind();
}
// Convert every disjointed subpath to a polygon and draw that polygon
QList<QPolygonF> subPathPolygons = path.toSubpathPolygons();
for (int i = 0; i < subPathPolygons.size(); i++) {
const QPolygonF& polygon = subPathPolygons.at(i);
QVector<QVector3D> vertices;
vertices.resize(polygon.count());
+
for (int j = 0; j < polygon.count(); j++) {
QPointF p = polygon.at(j);
vertices[j].setX(p.x());
vertices[j].setY(p.y());
}
if (KisOpenGL::hasOpenGL3()) {
d->lineBuffer.allocate(vertices.constData(), 3 * vertices.size() * sizeof(float));
}
else {
- d->cursorShader->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE);
- d->cursorShader->setAttributeArray(PROGRAM_VERTEX_ATTRIBUTE, vertices.constData());
+ d->solidColorShader->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE);
+ d->solidColorShader->setAttributeArray(PROGRAM_VERTEX_ATTRIBUTE, vertices.constData());
}
glDrawArrays(GL_LINE_STRIP, 0, vertices.size());
}
if (KisOpenGL::hasOpenGL3()) {
d->lineBuffer.release();
d->outlineVAO.release();
}
glDisable(GL_COLOR_LOGIC_OP);
- d->cursorShader->release();
+ d->solidColorShader->release();
}
bool KisOpenGLCanvas2::isBusy() const
{
const bool isBusyStatus = Sync::syncStatus(d->glSyncObject) == Sync::Unsignaled;
KisOpenglCanvasDebugger::instance()->nofitySyncStatus(isBusyStatus);
return isBusyStatus;
}
void KisOpenGLCanvas2::drawCheckers()
{
if (!d->checkerShader) {
return;
}
KisCoordinatesConverter *converter = coordinatesConverter();
QTransform textureTransform;
QTransform modelTransform;
QRectF textureRect;
QRectF modelRect;
QRectF viewportRect = !d->wrapAroundMode ?
converter->imageRectInViewportPixels() :
converter->widgetToViewport(this->rect());
converter->getOpenGLCheckersInfo(viewportRect,
&textureTransform, &modelTransform, &textureRect, &modelRect, d->scrollCheckers);
textureTransform *= QTransform::fromScale(d->checkSizeScale / KisOpenGLImageTextures::BACKGROUND_TEXTURE_SIZE,
d->checkSizeScale / KisOpenGLImageTextures::BACKGROUND_TEXTURE_SIZE);
if (!d->checkerShader->bind()) {
qWarning() << "Could not bind checker shader";
return;
}
QMatrix4x4 projectionMatrix;
projectionMatrix.setToIdentity();
projectionMatrix.ortho(0, width(), height(), 0, NEAR_VAL, FAR_VAL);
// Set view/projection matrices
QMatrix4x4 modelMatrix(modelTransform);
modelMatrix.optimize();
modelMatrix = projectionMatrix * modelMatrix;
d->checkerShader->setUniformValue(d->checkerShader->location(Uniform::ModelViewProjection), modelMatrix);
QMatrix4x4 textureMatrix(textureTransform);
d->checkerShader->setUniformValue(d->checkerShader->location(Uniform::TextureMatrix), textureMatrix);
//Setup the geometry for rendering
if (KisOpenGL::hasOpenGL3()) {
rectToVertices(d->vertices, modelRect);
-
d->quadBuffers[0].bind();
d->quadBuffers[0].write(0, d->vertices, 3 * 6 * sizeof(float));
rectToTexCoords(d->texCoords, textureRect);
d->quadBuffers[1].bind();
d->quadBuffers[1].write(0, d->texCoords, 2 * 6 * sizeof(float));
}
else {
rectToVertices(d->vertices, modelRect);
d->checkerShader->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE);
d->checkerShader->setAttributeArray(PROGRAM_VERTEX_ATTRIBUTE, d->vertices);
rectToTexCoords(d->texCoords, textureRect);
d->checkerShader->enableAttributeArray(PROGRAM_TEXCOORD_ATTRIBUTE);
d->checkerShader->setAttributeArray(PROGRAM_TEXCOORD_ATTRIBUTE, d->texCoords);
}
// render checkers
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, d->openGLImageTextures->checkerTexture());
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindTexture(GL_TEXTURE_2D, 0);
d->checkerShader->release();
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
+void KisOpenGLCanvas2::drawGrid()
+{
+ if (!d->solidColorShader->bind()) {
+ return;
+ }
+
+ QMatrix4x4 projectionMatrix;
+ projectionMatrix.setToIdentity();
+ projectionMatrix.ortho(0, width(), height(), 0, NEAR_VAL, FAR_VAL);
+
+ // Set view/projection matrices
+ QMatrix4x4 modelMatrix(coordinatesConverter()->imageToWidgetTransform());
+ modelMatrix.optimize();
+ modelMatrix = projectionMatrix * modelMatrix;
+ d->solidColorShader->setUniformValue(d->solidColorShader->location(Uniform::ModelViewProjection), modelMatrix);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ KisConfig cfg;
+ QColor gridColor = cfg.getOpenGLGridColor();
+ d->solidColorShader->setUniformValue(
+ d->solidColorShader->location(Uniform::FragmentColor),
+ QVector4D(gridColor.redF(), gridColor.greenF(), gridColor.blueF(), 0.5f));
+
+ if (KisOpenGL::hasOpenGL3()) {
+ d->outlineVAO.bind();
+ d->lineBuffer.bind();
+ }
+
+ QRectF widgetRect(0,0, width(), height());
+ QRectF widgetRectInImagePixels = coordinatesConverter()->documentToImage(coordinatesConverter()->widgetToDocument(widgetRect));
+ QRect wr = widgetRectInImagePixels.toAlignedRect();
+
+ if (!d->wrapAroundMode) {
+ wr &= d->openGLImageTextures->storedImageBounds();
+ }
+
+ QPoint topLeftCorner = wr.topLeft();
+ QPoint bottomRightCorner = wr.bottomRight() + QPoint(1, 1);
+ QVector<QVector3D> grid;
+
+ for (int i = topLeftCorner.x(); i <= bottomRightCorner.x(); ++i) {
+ grid.append(QVector3D(i, topLeftCorner.y(), 0));
+ grid.append(QVector3D(i, bottomRightCorner.y(), 0));
+ }
+ for (int i = topLeftCorner.y(); i <= bottomRightCorner.y(); ++i) {
+ grid.append(QVector3D(topLeftCorner.x(), i, 0));
+ grid.append(QVector3D(bottomRightCorner.x(), i, 0));
+ }
+
+ if (KisOpenGL::hasOpenGL3()) {
+ d->lineBuffer.allocate(grid.constData(), 3 * grid.size() * sizeof(float));
+ }
+ else {
+ d->solidColorShader->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE);
+ d->solidColorShader->setAttributeArray(PROGRAM_VERTEX_ATTRIBUTE, grid.constData());
+ }
+
+ glDrawArrays(GL_LINES, 0, grid.size());
+
+ if (KisOpenGL::hasOpenGL3()) {
+ d->lineBuffer.release();
+ d->outlineVAO.release();
+ }
+
+ d->solidColorShader->release();
+}
+
void KisOpenGLCanvas2::drawImage()
{
if (!d->displayShader) {
return;
}
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
KisCoordinatesConverter *converter = coordinatesConverter();
d->displayShader->bind();
QMatrix4x4 projectionMatrix;
projectionMatrix.setToIdentity();
projectionMatrix.ortho(0, width(), height(), 0, NEAR_VAL, FAR_VAL);
// Set view/projection matrices
- QMatrix4x4 modelMatrix(coordinatesConverter()->imageToWidgetTransform());
+ QMatrix4x4 modelMatrix(converter->imageToWidgetTransform());
modelMatrix.optimize();
modelMatrix = projectionMatrix * modelMatrix;
d->displayShader->setUniformValue(d->displayShader->location(Uniform::ModelViewProjection), modelMatrix);
QMatrix4x4 textureMatrix;
textureMatrix.setToIdentity();
d->displayShader->setUniformValue(d->displayShader->location(Uniform::TextureMatrix), textureMatrix);
QRectF widgetRect(0,0, width(), height());
QRectF widgetRectInImagePixels = converter->documentToImage(converter->widgetToDocument(widgetRect));
qreal scaleX, scaleY;
converter->imageScale(&scaleX, &scaleY);
d->displayShader->setUniformValue(d->displayShader->location(Uniform::ViewportScale), (GLfloat) scaleX);
d->displayShader->setUniformValue(d->displayShader->location(Uniform::TexelSize), (GLfloat) d->openGLImageTextures->texelSize());
QRect ir = d->openGLImageTextures->storedImageBounds();
QRect wr = widgetRectInImagePixels.toAlignedRect();
if (!d->wrapAroundMode) {
// if we don't want to paint wrapping images, just limit the
// processing area, and the code will handle all the rest
wr &= ir;
}
int firstColumn = d->xToColWithWrapCompensation(wr.left(), ir);
int lastColumn = d->xToColWithWrapCompensation(wr.right(), ir);
int firstRow = d->yToRowWithWrapCompensation(wr.top(), ir);
int lastRow = d->yToRowWithWrapCompensation(wr.bottom(), ir);
int minColumn = d->openGLImageTextures->xToCol(ir.left());
int maxColumn = d->openGLImageTextures->xToCol(ir.right());
int minRow = d->openGLImageTextures->yToRow(ir.top());
int maxRow = d->openGLImageTextures->yToRow(ir.bottom());
int imageColumns = maxColumn - minColumn + 1;
int imageRows = maxRow - minRow + 1;
for (int col = firstColumn; col <= lastColumn; col++) {
for (int row = firstRow; row <= lastRow; row++) {
int effectiveCol = col;
int effectiveRow = row;
QPointF tileWrappingTranslation;
if (effectiveCol > maxColumn || effectiveCol < minColumn) {
int translationStep = floor(qreal(col) / imageColumns);
int originCol = translationStep * imageColumns;
effectiveCol = col - originCol;
tileWrappingTranslation.rx() = translationStep * ir.width();
}
if (effectiveRow > maxRow || effectiveRow < minRow) {
int translationStep = floor(qreal(row) / imageRows);
int originRow = translationStep * imageRows;
effectiveRow = row - originRow;
tileWrappingTranslation.ry() = translationStep * ir.height();
}
KisTextureTile *tile =
d->openGLImageTextures->getTextureTileCR(effectiveCol, effectiveRow);
if (!tile) {
warnUI << "OpenGL: Trying to paint texture tile but it has not been created yet.";
continue;
}
/*
* We create a float rect here to workaround Qt's
* "history reasons" in calculation of right()
* and bottom() coordinates of integer rects.
*/
QRectF textureRect(tile->tileRectInTexturePixels());
QRectF modelRect(tile->tileRectInImagePixels().translated(tileWrappingTranslation.x(), tileWrappingTranslation.y()));
//Setup the geometry for rendering
if (KisOpenGL::hasOpenGL3()) {
rectToVertices(d->vertices, modelRect);
-
d->quadBuffers[0].bind();
d->quadBuffers[0].write(0, d->vertices, 3 * 6 * sizeof(float));
rectToTexCoords(d->texCoords, textureRect);
d->quadBuffers[1].bind();
d->quadBuffers[1].write(0, d->texCoords, 2 * 6 * sizeof(float));
}
else {
rectToVertices(d->vertices, modelRect);
d->displayShader->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE);
d->displayShader->setAttributeArray(PROGRAM_VERTEX_ATTRIBUTE, d->vertices);
rectToTexCoords(d->texCoords, textureRect);
d->displayShader->enableAttributeArray(PROGRAM_TEXCOORD_ATTRIBUTE);
d->displayShader->setAttributeArray(PROGRAM_TEXCOORD_ATTRIBUTE, d->texCoords);
}
if (d->displayFilter) {
glActiveTexture(GL_TEXTURE0 + 1);
glBindTexture(GL_TEXTURE_3D, d->displayFilter->lutTexture());
d->displayShader->setUniformValue(d->displayShader->location(Uniform::Texture1), 1);
}
int currentLodPlane = tile->currentLodPlane();
if (d->displayShader->location(Uniform::FixedLodLevel) >= 0) {
d->displayShader->setUniformValue(d->displayShader->location(Uniform::FixedLodLevel),
(GLfloat) currentLodPlane);
}
glActiveTexture(GL_TEXTURE0);
tile->bindToActiveTexture();
if (currentLodPlane > 0) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
} else if (SCALE_MORE_OR_EQUAL_TO(scaleX, scaleY, 2.0)) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
} else {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
switch(d->filterMode) {
case KisOpenGL::NearestFilterMode:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
break;
case KisOpenGL::BilinearFilterMode:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
break;
case KisOpenGL::TrilinearFilterMode:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
break;
case KisOpenGL::HighQualityFiltering:
if (SCALE_LESS_THAN(scaleX, scaleY, 0.5)) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
} else {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
}
break;
}
}
glDrawArrays(GL_TRIANGLES, 0, 6);
}
}
glBindTexture(GL_TEXTURE_2D, 0);
d->displayShader->release();
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void KisOpenGLCanvas2::slotConfigChanged()
{
KisConfig cfg;
d->checkSizeScale = KisOpenGLImageTextures::BACKGROUND_TEXTURE_CHECK_SIZE / static_cast<GLfloat>(cfg.checkSize());
d->scrollCheckers = cfg.scrollCheckers();
d->openGLImageTextures->generateCheckerTexture(createCheckersImage(cfg.checkSize()));
d->openGLImageTextures->updateConfig(cfg.useOpenGLTextureBuffer(), cfg.numMipmapLevels());
d->filterMode = (KisOpenGL::FilterMode) cfg.openGLFilteringMode();
notifyConfigChanged();
}
QVariant KisOpenGLCanvas2::inputMethodQuery(Qt::InputMethodQuery query) const
{
return processInputMethodQuery(query);
}
void KisOpenGLCanvas2::inputMethodEvent(QInputMethodEvent *event)
{
processInputMethodEvent(event);
}
void KisOpenGLCanvas2::renderCanvasGL()
{
// Draw the border (that is, clear the whole widget to the border color)
QColor widgetBackgroundColor = borderColor();
glClearColor(widgetBackgroundColor.redF(), widgetBackgroundColor.greenF(), widgetBackgroundColor.blueF(), 1.0);
glClear(GL_COLOR_BUFFER_BIT);
if (d->displayFilter) {
d->displayFilter->updateShader();
}
if (KisOpenGL::hasOpenGL3()) {
d->quadVAO.bind();
}
+
drawCheckers();
drawImage();
+ KisConfig cfg;
+ if (coordinatesConverter()->effectiveZoom() > cfg.getOpenGLGridDrawingThreshold() - 0.00001) {
+ drawGrid();
+ }
if (KisOpenGL::hasOpenGL3()) {
d->quadVAO.release();
}
}
void KisOpenGLCanvas2::renderDecorations(QPainter *painter)
{
QRect boundingRect = coordinatesConverter()->imageRectInWidgetPixels().toAlignedRect();
drawDecorations(*painter, boundingRect);
}
void KisOpenGLCanvas2::setDisplayProfile(KisDisplayColorConverter *colorConverter)
{
d->openGLImageTextures->setMonitorProfile(colorConverter->monitorProfile(),
colorConverter->renderingIntent(),
colorConverter->conversionFlags());
}
void KisOpenGLCanvas2::channelSelectionChanged(const QBitArray &channelFlags)
{
d->openGLImageTextures->setChannelFlags(channelFlags);
}
void KisOpenGLCanvas2::finishResizingImage(qint32 w, qint32 h)
{
if (d->canvasInitialized) {
d->openGLImageTextures->slotImageSizeChanged(w, h);
}
}
KisUpdateInfoSP KisOpenGLCanvas2::startUpdateCanvasProjection(const QRect & rc, const QBitArray &channelFlags)
{
d->openGLImageTextures->setChannelFlags(channelFlags);
if (canvas()->proofingConfigUpdated()) {
d->openGLImageTextures->setProofingConfig(canvas()->proofingConfiguration());
canvas()->setProofingConfigUpdated(false);
}
return d->openGLImageTextures->updateCache(rc);
}
QRect KisOpenGLCanvas2::updateCanvasProjection(KisUpdateInfoSP info)
{
// See KisQPainterCanvas::updateCanvasProjection for more info
bool isOpenGLUpdateInfo = dynamic_cast<KisOpenGLUpdateInfo*>(info.data());
if (isOpenGLUpdateInfo) {
d->openGLImageTextures->recalculateCache(info);
}
#ifdef Q_OS_OSX
/**
* There is a bug on OSX: if we issue frame redraw before the tiles finished
* uploading, the tiles will become corrupted. Depending on the GPU/driver
* version either the tile itself, or its mipmaps will become totally
* transparent.
*/
glFinish();
#endif
return QRect(); // FIXME: Implement dirty rect for OpenGL
}
bool KisOpenGLCanvas2::callFocusNextPrevChild(bool next)
{
return focusNextPrevChild(next);
}
KisOpenGLImageTexturesSP KisOpenGLCanvas2::openGLImageTextures() const
{
return d->openGLImageTextures;
}
diff --git a/libs/ui/opengl/kis_opengl_canvas2.h b/libs/ui/opengl/kis_opengl_canvas2.h
index 36c26ed987..88f6aa7458 100644
--- a/libs/ui/opengl/kis_opengl_canvas2.h
+++ b/libs/ui/opengl/kis_opengl_canvas2.h
@@ -1,121 +1,122 @@
/*
* Copyright (C) Boudewijn Rempt <boud@valdyas.org>, (C) 2006
* Copyright (C) Michael Abrahams <miabraha@gmail.com>, (C) 2015
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef KIS_OPENGL_CANVAS_2_H
#define KIS_OPENGL_CANVAS_2_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_0>
#include <QOpenGLFunctions_3_2_Core>
#include "canvas/kis_canvas_widget_base.h"
#include "opengl/kis_opengl_image_textures.h"
#include "kritaui_export.h"
#include "kis_ui_types.h"
class KisCanvas2;
class KisDisplayColorConverter;
class QOpenGLShaderProgram;
class QPainterPath;
#ifndef Q_MOC_RUN
#ifndef Q_OS_MAC
#define GLFunctions QOpenGLFunctions_3_0
#else
#define GLFunctions QOpenGLFunctions_3_2_Core
#endif
#endif
/**
* KisOpenGLCanvas is the widget that shows the actual image using OpenGL
*
* NOTE: if you change something in the event handling here, also change it
* in the qpainter canvas.
*
*/
class KRITAUI_EXPORT KisOpenGLCanvas2
: public QOpenGLWidget
#ifndef Q_MOC_RUN
, protected GLFunctions
#endif
, public KisCanvasWidgetBase
{
Q_OBJECT
public:
KisOpenGLCanvas2(KisCanvas2 *canvas, KisCoordinatesConverter *coordinatesConverter, QWidget *parent, KisImageWSP image, KisDisplayColorConverter *colorConverter);
~KisOpenGLCanvas2() override;
public: // QOpenGLWidget
void resizeGL(int width, int height) override;
void initializeGL() override;
void paintGL() override;
QVariant inputMethodQuery(Qt::InputMethodQuery query) const override;
void inputMethodEvent(QInputMethodEvent *event) override;
public:
void renderCanvasGL();
void renderDecorations(QPainter *painter);
void paintToolOutline(const QPainterPath &path);
bool needsFpsDebugging() const;
public: // Implement kis_abstract_canvas_widget interface
void initializeShaders();
void setDisplayFilter(QSharedPointer<KisDisplayFilter> displayFilter) override;
void setWrapAroundViewingMode(bool value) override;
void channelSelectionChanged(const QBitArray &channelFlags) override;
void setDisplayProfile(KisDisplayColorConverter *colorConverter) override;
void finishResizingImage(qint32 w, qint32 h) override;
KisUpdateInfoSP startUpdateCanvasProjection(const QRect & rc, const QBitArray &channelFlags) override;
QRect updateCanvasProjection(KisUpdateInfoSP info) override;
QWidget *widget() override {
return this;
}
bool isBusy() const override;
void setDisplayFilterImpl(QSharedPointer<KisDisplayFilter> displayFilter, bool initializing);
KisOpenGLImageTexturesSP openGLImageTextures() const;
private Q_SLOTS:
void slotConfigChanged();
protected: // KisCanvasWidgetBase
bool callFocusNextPrevChild(bool next) override;
private:
void reportFailedShaderCompilation(const QString &context);
void drawImage();
void drawCheckers();
+ void drawGrid();
private:
struct Private;
Private * const d;
};
#endif // KIS_OPENGL_CANVAS_2_H
diff --git a/libs/ui/opengl/kis_opengl_shader_loader.cpp b/libs/ui/opengl/kis_opengl_shader_loader.cpp
index a0294c0892..a3b2623be3 100644
--- a/libs/ui/opengl/kis_opengl_shader_loader.cpp
+++ b/libs/ui/opengl/kis_opengl_shader_loader.cpp
@@ -1,189 +1,190 @@
/* This file is part of the KDE project
* Copyright (C) Julian Thijssen <julianthijssen@gmail.com>, (C) 2016
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kis_opengl_shader_loader.h"
#include "opengl/kis_opengl.h"
#include "kis_config.h"
#include <QFile>
#include <QMessageBox>
#include <KLocalizedString>
#define PROGRAM_VERTEX_ATTRIBUTE 0
#define PROGRAM_TEXCOORD_ATTRIBUTE 1
// Mapping of uniforms to uniform names
std::map<Uniform, const char *> KisShaderProgram::names = {
{ModelViewProjection, "modelViewProjection"},
{TextureMatrix, "textureMatrix"},
{ViewportScale, "viewportScale"},
{TexelSize, "texelSize"},
{Texture0, "texture0"},
{Texture1, "texture1"},
- {FixedLodLevel, "fixedLodLevel"}
+ {FixedLodLevel, "fixedLodLevel"},
+ {FragmentColor, "fragColor"}
};
/**
* Generic shader loading function that will compile a shader program given
* a vertex shader and fragment shader resource path. Extra code can be prepended
* to each shader respectively using the header parameters.
*
* @param vertPath Resource path to a vertex shader
* @param fragPath Resource path to a fragment shader
* @param vertHeader Extra code which will be prepended to the vertex shader
* @param fragHeader Extra code which will be prepended to the fragment shader
*/
KisShaderProgram *KisOpenGLShaderLoader::loadShader(QString vertPath, QString fragPath,
QByteArray vertHeader, QByteArray fragHeader)
{
bool result;
KisShaderProgram *shader = new KisShaderProgram();
// Load vertex shader
QByteArray vertSource;
// XXX Check can be removed and set to the MAC version after we move to Qt5.7
#ifdef Q_OS_OSX
vertSource.append(KisOpenGL::hasOpenGL3() ? "#version 150 core\n" : "#version 120\n");
#else
vertSource.append(KisOpenGL::supportsLoD() ? "#version 130\n" : "#version 120\n");
#endif
vertSource.append(vertHeader);
QFile vertexShaderFile(":/" + vertPath);
vertexShaderFile.open(QIODevice::ReadOnly);
vertSource.append(vertexShaderFile.readAll());
result = shader->addShaderFromSourceCode(QOpenGLShader::Vertex, vertSource);
if (!result)
throw ShaderLoaderException(QString("%1: %2 - Cause: %3").arg("Failed to add vertex shader source from file", vertPath, shader->log()));
// Load fragment shader
QByteArray fragSource;
// XXX Check can be removed and set to the MAC version after we move to Qt5.7
#ifdef Q_OS_OSX
fragSource.append(KisOpenGL::hasOpenGL3() ? "#version 150 core\n" : "#version 120\n");
#else
fragSource.append(KisOpenGL::supportsLoD() ? "#version 130\n" : "#version 120\n");
#endif
fragSource.append(fragHeader);
QFile fragmentShaderFile(":/" + fragPath);
fragmentShaderFile.open(QIODevice::ReadOnly);
fragSource.append(fragmentShaderFile.readAll());
result = shader->addShaderFromSourceCode(QOpenGLShader::Fragment, fragSource);
if (!result)
throw ShaderLoaderException(QString("%1: %2 - Cause: %3").arg("Failed to add fragment shader source from file", fragPath, shader->log()));
// Bind attributes
shader->bindAttributeLocation("a_vertexPosition", PROGRAM_VERTEX_ATTRIBUTE);
shader->bindAttributeLocation("a_textureCoordinate", PROGRAM_TEXCOORD_ATTRIBUTE);
// Link
result = shader->link();
if (!result)
throw ShaderLoaderException(QString("Failed to link shader: ").append(vertPath));
Q_ASSERT(shader->isLinked());
return shader;
}
/**
* Specific display shader loading function. It adds the appropriate extra code
* to the fragment shader depending on what is available on the target machine.
* Additionally, it picks the appropriate shader files depending on the availability
* of OpenGL3.
*/
KisShaderProgram *KisOpenGLShaderLoader::loadDisplayShader(QSharedPointer<KisDisplayFilter> displayFilter, bool useHiQualityFiltering)
{
QByteArray fragHeader;
if (KisOpenGL::supportsLoD()) {
fragHeader.append("#define DIRECT_LOD_FETCH\n");
if (useHiQualityFiltering) {
fragHeader.append("#define HIGHQ_SCALING\n");
}
}
// If we have an OCIO display filter and it contains a function we add
// it to our shader header which will sit on top of the fragment code.
bool haveDisplayFilter = displayFilter && !displayFilter->program().isEmpty();
if (haveDisplayFilter) {
fragHeader.append("#define USE_OCIO\n");
fragHeader.append(displayFilter->program().toLatin1());
}
QString vertPath, fragPath;
// Select appropriate shader files
if (KisOpenGL::supportsLoD()) {
vertPath = "matrix_transform.vert";
fragPath = "highq_downscale.frag";
} else {
vertPath = "matrix_transform_legacy.vert";
fragPath = "simple_texture_legacy.frag";
}
KisShaderProgram *shader = loadShader(vertPath, fragPath, QByteArray(), fragHeader);
return shader;
}
/**
* Specific checker shader loading function. It picks the appropriate shader
* files depending on the availability of OpenGL3 on the target machine.
*/
KisShaderProgram *KisOpenGLShaderLoader::loadCheckerShader()
{
QString vertPath, fragPath;
// Select appropriate shader files
if (KisOpenGL::supportsLoD()) {
vertPath = "matrix_transform.vert";
fragPath = "simple_texture.frag";
} else {
vertPath = "matrix_transform_legacy.vert";
fragPath = "simple_texture_legacy.frag";
}
KisShaderProgram *shader = loadShader(vertPath, fragPath, QByteArray(), QByteArray());
return shader;
}
/**
- * Specific cursor shader loading function. It picks the appropriate shader
+ * Specific uniform shader loading function. It picks the appropriate shader
* files depending on the availability of OpenGL3 on the target machine.
*/
-KisShaderProgram *KisOpenGLShaderLoader::loadCursorShader()
+KisShaderProgram *KisOpenGLShaderLoader::loadSolidColorShader()
{
QString vertPath, fragPath;
// Select appropriate shader files
if (KisOpenGL::supportsLoD()) {
- vertPath = "cursor.vert";
- fragPath = "cursor.frag";
+ vertPath = "matrix_transform.vert";
+ fragPath = "solid_color.frag";
} else {
- vertPath = "cursor_legacy.vert";
- fragPath = "cursor_legacy.frag";
+ vertPath = "matrix_transform_legacy.vert";
+ fragPath = "solid_color_legacy.frag";
}
KisShaderProgram *shader = loadShader(vertPath, fragPath, QByteArray(), QByteArray());
return shader;
}
diff --git a/libs/ui/opengl/kis_opengl_shader_loader.h b/libs/ui/opengl/kis_opengl_shader_loader.h
index 234d4a5709..0ab064032d 100644
--- a/libs/ui/opengl/kis_opengl_shader_loader.h
+++ b/libs/ui/opengl/kis_opengl_shader_loader.h
@@ -1,91 +1,91 @@
/*
* Copyright (C) Julian Thijssen <julianthijssen@gmail.com>, (C) 2016
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "canvas/kis_display_filter.h"
#include <QOpenGLShaderProgram>
#include <QByteArray>
#include <QString>
#include <unordered_map>
#include <string>
#include <stdexcept>
#include <map>
/**
* An enum for storing all uniform names used in shaders
*/
enum Uniform { ModelViewProjection, TextureMatrix, ViewportScale,
- TexelSize, Texture0, Texture1, FixedLodLevel };
+ TexelSize, Texture0, Texture1, FixedLodLevel, FragmentColor };
/**
* A wrapper class over Qt's QOpenGLShaderProgram to
* provide access to uniform locations without
* having to store them as constants next to the shader.
*/
class KisShaderProgram : public QOpenGLShaderProgram {
public:
/**
* Stores the mapping of uniform enums to actual shader uniform names.
* The actual shader names are necessary for calls to uniformLocation.
*/
static std::map<Uniform, const char *> names;
/**
* Stores uniform location in cache if it is called for the first time
* and retrieves the location from the map on subsequent calls.
*/
int location(Uniform uniform) {
std::map<Uniform, int>::const_iterator it = locationMap.find(uniform);
if (it != locationMap.end()) {
return it->second;
} else {
int location = uniformLocation(names[uniform]);
locationMap[uniform] = location;
return location;
}
}
private:
std::map<Uniform, int> locationMap;
};
/**
* A wrapper class over C++ Runtime Error, specifically to record
* failures in shader compilation. Only thrown in KisOpenGLShaderLoader.
*/
class ShaderLoaderException : public std::runtime_error {
public:
ShaderLoaderException(QString error) : std::runtime_error(error.toStdString()) { }
};
/**
* A utility class for loading various shaders we use in Krita. It provides
* specific methods for shaders that pick the correct vertex and fragment files
* depending on the availability of OpenGL3. Additionally, it provides a generic
* shader loading method to prevent duplication.
*/
class KisOpenGLShaderLoader {
public:
KisShaderProgram *loadDisplayShader(QSharedPointer<KisDisplayFilter> displayFilter, bool useHiQualityFiltering);
KisShaderProgram *loadCheckerShader();
- KisShaderProgram *loadCursorShader();
+ KisShaderProgram *loadSolidColorShader();
private:
KisShaderProgram *loadShader(QString vertPath, QString fragPath, QByteArray vertHeader, QByteArray fragHeader);
};
diff --git a/libs/ui/tool/KisStabilizerDelayedPaintHelper.cpp b/libs/ui/tool/KisStabilizerDelayedPaintHelper.cpp
index 8c31bf3ba5..8be4bbe5ed 100644
--- a/libs/ui/tool/KisStabilizerDelayedPaintHelper.cpp
+++ b/libs/ui/tool/KisStabilizerDelayedPaintHelper.cpp
@@ -1,85 +1,97 @@
/*
* Copyright (c) 2016 Alvin Wong <alvinhochun-at-gmail-com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "KisStabilizerDelayedPaintHelper.h"
+constexpr int fixedPaintTimerInterval = 20;
+
KisStabilizerDelayedPaintHelper::TimedPaintInfo::TimedPaintInfo(int elapsedTime, KisPaintInformation paintInfo)
: elapsedTime(elapsedTime)
, paintInfo(paintInfo)
{
}
KisStabilizerDelayedPaintHelper::KisStabilizerDelayedPaintHelper()
{
- connect(&m_paintTimer, SIGNAL(timeout()), SLOT(stabilizerDelayedPaint()));
+ connect(&m_paintTimer, SIGNAL(timeout()), SLOT(stabilizerDelayedPaintTimer()));
}
-void KisStabilizerDelayedPaintHelper::start(int paintInterval, const KisPaintInformation &firstPaintInfo) {
+void KisStabilizerDelayedPaintHelper::start(const KisPaintInformation &firstPaintInfo) {
if (running()) {
cancel();
}
- m_paintTimer.setInterval(paintInterval);
+ m_paintTimer.setInterval(fixedPaintTimerInterval);
m_paintTimer.start();
m_elapsedTimer.start();
m_lastPendingTime = m_elapsedTimer.elapsed();
+ m_lastPaintTime = m_lastPendingTime;
m_paintQueue.enqueue(TimedPaintInfo(m_lastPendingTime, firstPaintInfo));
}
void KisStabilizerDelayedPaintHelper::update(const QVector<KisPaintInformation> &newPaintInfos) {
int now = m_elapsedTimer.elapsed();
int delayedPaintInterval = m_elapsedTimer.elapsed() - m_lastPendingTime;
for (int i = 0; i < newPaintInfos.size(); i++) {
// TODO: Risk of overflowing?
int offsetTime = (delayedPaintInterval * i) / newPaintInfos.size();
m_paintQueue.enqueue(TimedPaintInfo(now + offsetTime, newPaintInfos[i]));
}
m_lastPendingTime = now;
}
+void KisStabilizerDelayedPaintHelper::paintSome() {
+ // This function is also called from KisToolFreehandHelper::paint
+ m_lastPaintTime = m_elapsedTimer.elapsed();
+ if (m_paintQueue.isEmpty()) {
+ return;
+ }
+ int now = m_lastPaintTime;
+ // Always keep one in the queue since painting requires two points
+ while (m_paintQueue.size() > 1 && m_paintQueue.head().elapsedTime <= now) {
+ const TimedPaintInfo dequeued = m_paintQueue.dequeue();
+ m_paintLine(dequeued.paintInfo, m_paintQueue.head().paintInfo);
+ }
+}
+
void KisStabilizerDelayedPaintHelper::end() {
- stabilizerDelayedPaint(true);
m_paintTimer.stop();
+ m_elapsedTimer.invalidate();
+ if (m_paintQueue.isEmpty()) {
+ return;
+ }
+ TimedPaintInfo dequeued = m_paintQueue.dequeue();
+ while (!m_paintQueue.isEmpty()) {
+ const TimedPaintInfo dequeued2 = m_paintQueue.dequeue();
+ m_paintLine(dequeued.paintInfo, dequeued2.paintInfo);
+ dequeued = dequeued2;
+ }
}
void KisStabilizerDelayedPaintHelper::cancel() {
m_paintTimer.stop();
m_paintQueue.clear();
}
-void KisStabilizerDelayedPaintHelper::stabilizerDelayedPaint(bool isEndStroke) {
- if (m_paintQueue.isEmpty()) {
- return;
- }
- if (isEndStroke) {
- TimedPaintInfo dequeued = m_paintQueue.dequeue();
- while (!m_paintQueue.isEmpty()) {
- const TimedPaintInfo dequeued2 = m_paintQueue.dequeue();
- m_paintLine(dequeued.paintInfo, dequeued2.paintInfo);
- dequeued = dequeued2;
- }
- m_requestUpdateOutline();
+void KisStabilizerDelayedPaintHelper::stabilizerDelayedPaintTimer() {
+ if (m_elapsedTimer.elapsed() - m_lastPaintTime < fixedPaintTimerInterval) {
return;
}
- int now = m_elapsedTimer.elapsed();
- // Always keep one in the queue since painting requires two points
- while (m_paintQueue.size() > 1 && m_paintQueue.head().elapsedTime <= now) {
- const TimedPaintInfo dequeued = m_paintQueue.dequeue();
- m_paintLine(dequeued.paintInfo, m_paintQueue.head().paintInfo);
- }
+ paintSome();
+ // Explicitly update the outline because this is outside the pointer event
m_requestUpdateOutline();
}
diff --git a/libs/ui/tool/KisStabilizerDelayedPaintHelper.h b/libs/ui/tool/KisStabilizerDelayedPaintHelper.h
index 8d898452b6..26637c2e97 100644
--- a/libs/ui/tool/KisStabilizerDelayedPaintHelper.h
+++ b/libs/ui/tool/KisStabilizerDelayedPaintHelper.h
@@ -1,86 +1,88 @@
/*
* Copyright (c) 2016 Alvin Wong <alvinhochun-at-gmail-com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef KIS_STABILIZER_DELAYED_PAINT_HELPER_H
#define KIS_STABILIZER_DELAYED_PAINT_HELPER_H
#include <QElapsedTimer>
#include <QQueue>
#include <QTimer>
#include <QVector>
#include <functional>
#include "kis_paint_information.h"
#include "kritaui_export.h"
class KRITAUI_EXPORT KisStabilizerDelayedPaintHelper : public QObject
{
Q_OBJECT
struct TimedPaintInfo
{
int elapsedTime;
KisPaintInformation paintInfo;
TimedPaintInfo(int elapsedTime, KisPaintInformation paintInfo);
};
QTimer m_paintTimer;
QQueue<TimedPaintInfo> m_paintQueue;
int m_lastPendingTime;
+ int m_lastPaintTime;
QElapsedTimer m_elapsedTimer;
// Callbacks
std::function<void(const KisPaintInformation &, const KisPaintInformation &)> m_paintLine;
std::function<void()> m_requestUpdateOutline;
public:
KisStabilizerDelayedPaintHelper();
~KisStabilizerDelayedPaintHelper() override {}
bool running() const {
return m_paintTimer.isActive();
}
bool hasLastPaintInformation() const {
return !m_paintQueue.isEmpty();
}
KisPaintInformation lastPaintInformation() const {
// Please call hasLastPaintInformation before this
return m_paintQueue.head().paintInfo;
}
void setPaintLineCallback(std::function<void(const KisPaintInformation &, const KisPaintInformation &)> paintLine) {
m_paintLine = paintLine;
}
void setUpdateOutlineCallback(std::function<void()> requestUpdateOutline) {
m_requestUpdateOutline = requestUpdateOutline;
}
- void start(int paintInterval, const KisPaintInformation &firstPaintInfo);
+ void start(const KisPaintInformation &firstPaintInfo);
void update(const QVector<KisPaintInformation> &newPaintInfos);
+ void paintSome();
void end();
void cancel();
private Q_SLOTS:
- void stabilizerDelayedPaint(bool isEndStroke = false);
+ void stabilizerDelayedPaintTimer();
};
#endif // KIS_STABILIZER_DELAYED_PAINT_HELPER_H
diff --git a/libs/ui/tool/kis_tool_freehand_helper.cpp b/libs/ui/tool/kis_tool_freehand_helper.cpp
index 68b46a6026..5e74ba16d1 100644
--- a/libs/ui/tool/kis_tool_freehand_helper.cpp
+++ b/libs/ui/tool/kis_tool_freehand_helper.cpp
@@ -1,978 +1,982 @@
/*
* Copyright (c) 2011 Dmitry Kazakov <dimula73@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kis_tool_freehand_helper.h"
#include <QTimer>
#include <QQueue>
#include <klocalizedstring.h>
#include <KoPointerEvent.h>
#include <KoCanvasResourceManager.h>
#include "kis_algebra_2d.h"
#include "kis_distance_information.h"
#include "kis_painting_information_builder.h"
#include "kis_recording_adapter.h"
#include "kis_image.h"
#include "kis_painter.h"
#include <brushengine/kis_paintop_preset.h>
#include <brushengine/kis_paintop_utils.h>
#include "kis_update_time_monitor.h"
#include "kis_stabilized_events_sampler.h"
#include "KisStabilizerDelayedPaintHelper.h"
#include "kis_config.h"
#include <math.h>
//#define DEBUG_BEZIER_CURVES
// Factor by which to scale the airbrush timer's interval, relative to the actual airbrushing rate.
// Setting this less than 1 makes the timer-generated pseudo-events happen faster than the desired
// airbrush rate, which can improve responsiveness.
const qreal AIRBRUSH_INTERVAL_FACTOR = 0.5;
// The amount of time, in milliseconds, to allow between updates of the spacing information. Only
// used when spacing updates between dabs are enabled.
const qreal SPACING_UPDATE_INTERVAL = 50.0;
// The amount of time, in milliseconds, to allow between updates of the timing information. Only
// used when airbrushing.
const qreal TIMING_UPDATE_INTERVAL = 50.0;
struct KisToolFreehandHelper::Private
{
KisPaintingInformationBuilder *infoBuilder;
KisRecordingAdapter *recordingAdapter;
KisStrokesFacade *strokesFacade;
KUndo2MagicString transactionText;
bool haveTangent;
QPointF previousTangent;
bool hasPaintAtLeastOnce;
QTime strokeTime;
QTimer strokeTimeoutTimer;
QVector<PainterInfo*> painterInfos;
KisResourcesSnapshotSP resources;
KisStrokeId strokeId;
KisPaintInformation previousPaintInformation;
KisPaintInformation olderPaintInformation;
KisSmoothingOptionsSP smoothingOptions;
// Timer used to generate paint updates periodically even without input events. This is only
// used for paintops that depend on timely updates even when the cursor is not moving, e.g. for
// airbrushing effects.
QTimer airbrushingTimer;
QList<KisPaintInformation> history;
QList<qreal> distanceHistory;
// Keeps track of past cursor positions. This is used to determine the drawing angle when
// drawing the brush outline or starting a stroke.
KisPaintOpUtils::PositionHistory lastCursorPos;
// Stabilizer data
QQueue<KisPaintInformation> stabilizerDeque;
QTimer stabilizerPollTimer;
KisStabilizedEventsSampler stabilizedSampler;
KisStabilizerDelayedPaintHelper stabilizerDelayedPaintHelper;
int canvasRotation;
bool canvasMirroredH;
qreal effectiveSmoothnessDistance() const;
};
KisToolFreehandHelper::KisToolFreehandHelper(KisPaintingInformationBuilder *infoBuilder,
const KUndo2MagicString &transactionText,
KisRecordingAdapter *recordingAdapter,
KisSmoothingOptions *smoothingOptions)
: m_d(new Private())
{
m_d->infoBuilder = infoBuilder;
m_d->recordingAdapter = recordingAdapter;
m_d->transactionText = transactionText;
m_d->smoothingOptions = KisSmoothingOptionsSP(
smoothingOptions ? smoothingOptions : new KisSmoothingOptions());
m_d->canvasRotation = 0;
m_d->strokeTimeoutTimer.setSingleShot(true);
connect(&m_d->strokeTimeoutTimer, SIGNAL(timeout()), SLOT(finishStroke()));
connect(&m_d->airbrushingTimer, SIGNAL(timeout()), SLOT(doAirbrushing()));
connect(&m_d->stabilizerPollTimer, SIGNAL(timeout()), SLOT(stabilizerPollAndPaint()));
m_d->stabilizerDelayedPaintHelper.setPaintLineCallback(
[this](const KisPaintInformation &pi1, const KisPaintInformation &pi2) {
paintLine(pi1, pi2);
});
m_d->stabilizerDelayedPaintHelper.setUpdateOutlineCallback(
[this]() {
emit requestExplicitUpdateOutline();
});
}
KisToolFreehandHelper::~KisToolFreehandHelper()
{
delete m_d;
}
void KisToolFreehandHelper::setSmoothness(KisSmoothingOptionsSP smoothingOptions)
{
m_d->smoothingOptions = smoothingOptions;
}
KisSmoothingOptionsSP KisToolFreehandHelper::smoothingOptions() const
{
return m_d->smoothingOptions;
}
QPainterPath KisToolFreehandHelper::paintOpOutline(const QPointF &savedCursorPos,
const KoPointerEvent *event,
const KisPaintOpSettingsSP globalSettings,
KisPaintOpSettings::OutlineMode mode) const
{
KisPaintOpSettingsSP settings = globalSettings;
KisPaintInformation info = m_d->infoBuilder->hover(savedCursorPos, event);
QPointF prevPoint = m_d->lastCursorPos.pushThroughHistory(savedCursorPos);
qreal startAngle = KisAlgebra2D::directionBetweenPoints(prevPoint, savedCursorPos, 0);
info.setCanvasRotation(m_d->canvasRotation);
info.setCanvasHorizontalMirrorState( m_d->canvasMirroredH );
KisDistanceInformation distanceInfo(prevPoint, 0, startAngle);
if (!m_d->painterInfos.isEmpty()) {
settings = m_d->resources->currentPaintOpPreset()->settings();
if (m_d->stabilizerDelayedPaintHelper.running() &&
m_d->stabilizerDelayedPaintHelper.hasLastPaintInformation()) {
info = m_d->stabilizerDelayedPaintHelper.lastPaintInformation();
} else {
info = m_d->previousPaintInformation;
}
/**
* When LoD mode is active it may happen that the helper has
* already started a stroke, but it painted noting, because
* all the work is being calculated by the scaled-down LodN
* stroke. So at first we try to fetch the data from the lodN
* stroke ("buddy") and then check if there is at least
* something has been painted with this distance information
* object.
*/
KisDistanceInformation *buddyDistance =
m_d->painterInfos.first()->buddyDragDistance();
if (buddyDistance) {
/**
* Tiny hack alert: here we fetch the distance information
* directly from the LodN stroke. Ideally, we should
* upscale its data, but here we just override it with our
* local copy of the coordinates.
*/
distanceInfo = *buddyDistance;
distanceInfo.overrideLastValues(prevPoint, 0, startAngle);
} else if (m_d->painterInfos.first()->dragDistance->isStarted()) {
distanceInfo = *m_d->painterInfos.first()->dragDistance;
}
}
KisPaintInformation::DistanceInformationRegistrar registrar =
info.registerDistanceInformation(&distanceInfo);
QPainterPath outline = settings->brushOutline(info, mode);
if (m_d->resources &&
m_d->smoothingOptions->smoothingType() == KisSmoothingOptions::STABILIZER &&
m_d->smoothingOptions->useDelayDistance()) {
const qreal R = m_d->smoothingOptions->delayDistance() /
m_d->resources->effectiveZoom();
outline.addEllipse(info.pos(), R, R);
}
return outline;
}
void KisToolFreehandHelper::cursorMoved(const QPointF &cursorPos)
{
m_d->lastCursorPos.pushThroughHistory(cursorPos);
}
void KisToolFreehandHelper::initPaint(KoPointerEvent *event,
const QPointF &pixelCoords,
KoCanvasResourceManager *resourceManager,
KisImageWSP image, KisNodeSP currentNode,
KisStrokesFacade *strokesFacade,
KisNodeSP overrideNode,
KisDefaultBoundsBaseSP bounds)
{
QPointF prevPoint = m_d->lastCursorPos.pushThroughHistory(pixelCoords);
m_d->strokeTime.start();
KisPaintInformation pi =
m_d->infoBuilder->startStroke(event, elapsedStrokeTime(), resourceManager);
qreal startAngle = KisAlgebra2D::directionBetweenPoints(prevPoint, pixelCoords, 0.0);
initPaintImpl(startAngle,
pi,
resourceManager,
image,
currentNode,
strokesFacade,
overrideNode,
bounds);
}
bool KisToolFreehandHelper::isRunning() const
{
return m_d->strokeId;
}
void KisToolFreehandHelper::initPaintImpl(qreal startAngle,
const KisPaintInformation &pi,
KoCanvasResourceManager *resourceManager,
KisImageWSP image,
KisNodeSP currentNode,
KisStrokesFacade *strokesFacade,
KisNodeSP overrideNode,
KisDefaultBoundsBaseSP bounds)
{
m_d->strokesFacade = strokesFacade;
m_d->haveTangent = false;
m_d->previousTangent = QPointF();
m_d->hasPaintAtLeastOnce = false;
m_d->previousPaintInformation = pi;
m_d->resources = new KisResourcesSnapshot(image,
currentNode,
resourceManager,
bounds);
if(overrideNode) {
m_d->resources->setCurrentNode(overrideNode);
}
const bool airbrushing = m_d->resources->needsAirbrushing();
const bool useSpacingUpdates = m_d->resources->needsSpacingUpdates();
KisDistanceInitInfo startDistInfo(m_d->previousPaintInformation.pos(),
m_d->previousPaintInformation.currentTime(),
startAngle,
useSpacingUpdates ? SPACING_UPDATE_INTERVAL : LONG_TIME,
airbrushing ? TIMING_UPDATE_INTERVAL : LONG_TIME);
KisDistanceInformation startDist = startDistInfo.makeDistInfo();
createPainters(m_d->painterInfos,
startDist);
if(m_d->recordingAdapter) {
m_d->recordingAdapter->startStroke(image, m_d->resources, startDistInfo);
}
KisStrokeStrategy *stroke =
new FreehandStrokeStrategy(m_d->resources->needsIndirectPainting(),
m_d->resources->indirectPaintingCompositeOp(),
m_d->resources, m_d->painterInfos, m_d->transactionText);
m_d->strokeId = m_d->strokesFacade->startStroke(stroke);
m_d->history.clear();
m_d->distanceHistory.clear();
if(airbrushing) {
m_d->airbrushingTimer.setInterval(computeAirbrushTimerInterval());
m_d->airbrushingTimer.start();
}
if (m_d->smoothingOptions->smoothingType() == KisSmoothingOptions::STABILIZER) {
stabilizerStart(m_d->previousPaintInformation);
}
// If airbrushing, paint an initial dab immediately. This is a workaround for an issue where
// some paintops (Dyna, Particle, Sketch) might never initialize their spacing/timing
// information until paintAt is called.
if (airbrushing) {
paintAt(pi);
}
}
void KisToolFreehandHelper::paintBezierSegment(KisPaintInformation pi1, KisPaintInformation pi2,
QPointF tangent1, QPointF tangent2)
{
if (tangent1.isNull() || tangent2.isNull()) return;
const qreal maxSanePoint = 1e6;
QPointF controlTarget1;
QPointF controlTarget2;
// Shows the direction in which control points go
QPointF controlDirection1 = pi1.pos() + tangent1;
QPointF controlDirection2 = pi2.pos() - tangent2;
// Lines in the direction of the control points
QLineF line1(pi1.pos(), controlDirection1);
QLineF line2(pi2.pos(), controlDirection2);
// Lines to check whether the control points lay on the opposite
// side of the line
QLineF line3(controlDirection1, controlDirection2);
QLineF line4(pi1.pos(), pi2.pos());
QPointF intersection;
if (line3.intersect(line4, &intersection) == QLineF::BoundedIntersection) {
qreal controlLength = line4.length() / 2;
line1.setLength(controlLength);
line2.setLength(controlLength);
controlTarget1 = line1.p2();
controlTarget2 = line2.p2();
} else {
QLineF::IntersectType type = line1.intersect(line2, &intersection);
if (type == QLineF::NoIntersection ||
intersection.manhattanLength() > maxSanePoint) {
intersection = 0.5 * (pi1.pos() + pi2.pos());
// dbgKrita << "WARINING: there is no intersection point "
// << "in the basic smoothing algoriths";
}
controlTarget1 = intersection;
controlTarget2 = intersection;
}
// shows how near to the controlTarget the value raises
qreal coeff = 0.8;
qreal velocity1 = QLineF(QPointF(), tangent1).length();
qreal velocity2 = QLineF(QPointF(), tangent2).length();
if (velocity1 == 0.0 || velocity2 == 0.0) {
velocity1 = 1e-6;
velocity2 = 1e-6;
warnKrita << "WARNING: Basic Smoothing: Velocity is Zero! Please report a bug:" << ppVar(velocity1) << ppVar(velocity2);
}
qreal similarity = qMin(velocity1/velocity2, velocity2/velocity1);
// the controls should not differ more than 50%
similarity = qMax(similarity, qreal(0.5));
// when the controls are symmetric, their size should be smaller
// to avoid corner-like curves
coeff *= 1 - qMax(qreal(0.0), similarity - qreal(0.8));
Q_ASSERT(coeff > 0);
QPointF control1;
QPointF control2;
if (velocity1 > velocity2) {
control1 = pi1.pos() * (1.0 - coeff) + coeff * controlTarget1;
coeff *= similarity;
control2 = pi2.pos() * (1.0 - coeff) + coeff * controlTarget2;
} else {
control2 = pi2.pos() * (1.0 - coeff) + coeff * controlTarget2;
coeff *= similarity;
control1 = pi1.pos() * (1.0 - coeff) + coeff * controlTarget1;
}
paintBezierCurve(pi1,
control1,
control2,
pi2);
}
qreal KisToolFreehandHelper::Private::effectiveSmoothnessDistance() const
{
const qreal effectiveSmoothnessDistance =
!smoothingOptions->useScalableDistance() ?
smoothingOptions->smoothnessDistance() :
smoothingOptions->smoothnessDistance() / resources->effectiveZoom();
return effectiveSmoothnessDistance;
}
void KisToolFreehandHelper::paintEvent(KoPointerEvent *event)
{
KisPaintInformation info =
m_d->infoBuilder->continueStroke(event,
elapsedStrokeTime());
info.setCanvasRotation( m_d->canvasRotation );
info.setCanvasHorizontalMirrorState( m_d->canvasMirroredH );
KisUpdateTimeMonitor::instance()->reportMouseMove(info.pos());
paint(info);
}
void KisToolFreehandHelper::paint(KisPaintInformation &info)
{
/**
* Smooth the coordinates out using the history and the
* distance. This is a heavily modified version of an algo used in
* Gimp and described in https://bugs.kde.org/show_bug.cgi?id=281267 and
* http://www24.atwiki.jp/sigetch_2007/pages/17.html. The main
* differences are:
*
* 1) It uses 'distance' instead of 'velocity', since time
* measurements are too unstable in realworld environment
*
* 2) There is no 'Quality' parameter, since the number of samples
* is calculated automatically
*
* 3) 'Tail Aggressiveness' is used for controling the end of the
* stroke
*
* 4) The formila is a little bit different: 'Distance' parameter
* stands for $3 \Sigma$
*/
if (m_d->smoothingOptions->smoothingType() == KisSmoothingOptions::WEIGHTED_SMOOTHING
&& m_d->smoothingOptions->smoothnessDistance() > 0.0) {
{ // initialize current distance
QPointF prevPos;
if (!m_d->history.isEmpty()) {
const KisPaintInformation &prevPi = m_d->history.last();
prevPos = prevPi.pos();
} else {
prevPos = m_d->previousPaintInformation.pos();
}
qreal currentDistance = QVector2D(info.pos() - prevPos).length();
m_d->distanceHistory.append(currentDistance);
}
m_d->history.append(info);
qreal x = 0.0;
qreal y = 0.0;
if (m_d->history.size() > 3) {
const qreal sigma = m_d->effectiveSmoothnessDistance() / 3.0; // '3.0' for (3 * sigma) range
qreal gaussianWeight = 1 / (sqrt(2 * M_PI) * sigma);
qreal gaussianWeight2 = sigma * sigma;
qreal distanceSum = 0.0;
qreal scaleSum = 0.0;
qreal pressure = 0.0;
qreal baseRate = 0.0;
Q_ASSERT(m_d->history.size() == m_d->distanceHistory.size());
for (int i = m_d->history.size() - 1; i >= 0; i--) {
qreal rate = 0.0;
const KisPaintInformation nextInfo = m_d->history.at(i);
double distance = m_d->distanceHistory.at(i);
Q_ASSERT(distance >= 0.0);
qreal pressureGrad = 0.0;
if (i < m_d->history.size() - 1) {
pressureGrad = nextInfo.pressure() - m_d->history.at(i + 1).pressure();
const qreal tailAgressiveness = 40.0 * m_d->smoothingOptions->tailAggressiveness();
if (pressureGrad > 0.0 ) {
pressureGrad *= tailAgressiveness * (1.0 - nextInfo.pressure());
distance += pressureGrad * 3.0 * sigma; // (3 * sigma) --- holds > 90% of the region
}
}
if (gaussianWeight2 != 0.0) {
distanceSum += distance;
rate = gaussianWeight * exp(-distanceSum * distanceSum / (2 * gaussianWeight2));
}
if (m_d->history.size() - i == 1) {
baseRate = rate;
} else if (baseRate / rate > 100) {
break;
}
scaleSum += rate;
x += rate * nextInfo.pos().x();
y += rate * nextInfo.pos().y();
if (m_d->smoothingOptions->smoothPressure()) {
pressure += rate * nextInfo.pressure();
}
}
if (scaleSum != 0.0) {
x /= scaleSum;
y /= scaleSum;
if (m_d->smoothingOptions->smoothPressure()) {
pressure /= scaleSum;
}
}
if ((x != 0.0 && y != 0.0) || (x == info.pos().x() && y == info.pos().y())) {
info.setPos(QPointF(x, y));
if (m_d->smoothingOptions->smoothPressure()) {
info.setPressure(pressure);
}
m_d->history.last() = info;
}
}
}
if (m_d->smoothingOptions->smoothingType() == KisSmoothingOptions::SIMPLE_SMOOTHING
|| m_d->smoothingOptions->smoothingType() == KisSmoothingOptions::WEIGHTED_SMOOTHING)
{
// Now paint between the coordinates, using the bezier curve interpolation
if (!m_d->haveTangent) {
m_d->haveTangent = true;
m_d->previousTangent =
(info.pos() - m_d->previousPaintInformation.pos()) /
qMax(qreal(1.0), info.currentTime() - m_d->previousPaintInformation.currentTime());
} else {
QPointF newTangent = (info.pos() - m_d->olderPaintInformation.pos()) /
qMax(qreal(1.0), info.currentTime() - m_d->olderPaintInformation.currentTime());
if (newTangent.isNull() || m_d->previousTangent.isNull())
{
paintLine(m_d->previousPaintInformation, info);
} else {
paintBezierSegment(m_d->olderPaintInformation, m_d->previousPaintInformation,
m_d->previousTangent, newTangent);
}
m_d->previousTangent = newTangent;
}
m_d->olderPaintInformation = m_d->previousPaintInformation;
// Enable stroke timeout only when not airbrushing.
if (!m_d->airbrushingTimer.isActive()) {
m_d->strokeTimeoutTimer.start(100);
}
}
else if (m_d->smoothingOptions->smoothingType() == KisSmoothingOptions::NO_SMOOTHING){
paintLine(m_d->previousPaintInformation, info);
}
if (m_d->smoothingOptions->smoothingType() == KisSmoothingOptions::STABILIZER) {
m_d->stabilizedSampler.addEvent(info);
+ if (m_d->stabilizerDelayedPaintHelper.running()) {
+ // Paint here so we don't have to rely on the timer
+ // This is just a tricky source for a relatively stable 7ms "timer"
+ m_d->stabilizerDelayedPaintHelper.paintSome();
+ }
} else {
m_d->previousPaintInformation = info;
}
if(m_d->airbrushingTimer.isActive()) {
m_d->airbrushingTimer.start();
}
}
void KisToolFreehandHelper::endPaint()
{
if (!m_d->hasPaintAtLeastOnce) {
paintAt(m_d->previousPaintInformation);
} else if (m_d->smoothingOptions->smoothingType() != KisSmoothingOptions::NO_SMOOTHING) {
finishStroke();
}
m_d->strokeTimeoutTimer.stop();
if(m_d->airbrushingTimer.isActive()) {
m_d->airbrushingTimer.stop();
}
if (m_d->smoothingOptions->smoothingType() == KisSmoothingOptions::STABILIZER) {
stabilizerEnd();
}
/**
* There might be some timer events still pending, so
* we should cancel them. Use this flag for the purpose.
* Please note that we are not in MT here, so no mutex
* is needed
*/
m_d->painterInfos.clear();
m_d->strokesFacade->endStroke(m_d->strokeId);
m_d->strokeId.clear();
if(m_d->recordingAdapter) {
m_d->recordingAdapter->endStroke();
}
}
void KisToolFreehandHelper::cancelPaint()
{
if (!m_d->strokeId) return;
m_d->strokeTimeoutTimer.stop();
if (m_d->airbrushingTimer.isActive()) {
m_d->airbrushingTimer.stop();
}
if (m_d->stabilizerPollTimer.isActive()) {
m_d->stabilizerPollTimer.stop();
}
if (m_d->stabilizerDelayedPaintHelper.running()) {
m_d->stabilizerDelayedPaintHelper.cancel();
}
// see a comment in endPaint()
m_d->painterInfos.clear();
m_d->strokesFacade->cancelStroke(m_d->strokeId);
m_d->strokeId.clear();
if(m_d->recordingAdapter) {
//FIXME: not implemented
//m_d->recordingAdapter->cancelStroke();
}
}
int KisToolFreehandHelper::elapsedStrokeTime() const
{
return m_d->strokeTime.elapsed();
}
void KisToolFreehandHelper::stabilizerStart(KisPaintInformation firstPaintInfo)
{
// FIXME: Ugly hack, this is no a "distance" in any way
int sampleSize = qRound(m_d->effectiveSmoothnessDistance());
sampleSize = qMax(3, sampleSize);
// Fill the deque with the current value repeated until filling the sample
m_d->stabilizerDeque.clear();
for (int i = sampleSize; i > 0; i--) {
m_d->stabilizerDeque.enqueue(firstPaintInfo);
}
// Poll and draw regularly
KisConfig cfg;
int stabilizerSampleSize = cfg.stabilizerSampleSize();
m_d->stabilizerPollTimer.setInterval(stabilizerSampleSize);
m_d->stabilizerPollTimer.start();
- int delayedPaintInterval = cfg.stabilizerDelayedPaintInterval();
- if (delayedPaintInterval < stabilizerSampleSize) {
- m_d->stabilizerDelayedPaintHelper.start(delayedPaintInterval, firstPaintInfo);
+ bool delayedPaintEnabled = cfg.stabilizerDelayedPaint();
+ if (delayedPaintEnabled) {
+ m_d->stabilizerDelayedPaintHelper.start(firstPaintInfo);
}
m_d->stabilizedSampler.clear();
m_d->stabilizedSampler.addEvent(firstPaintInfo);
}
KisPaintInformation
KisToolFreehandHelper::getStabilizedPaintInfo(const QQueue<KisPaintInformation> &queue,
const KisPaintInformation &lastPaintInfo)
{
KisPaintInformation result(lastPaintInfo.pos(),
lastPaintInfo.pressure(),
lastPaintInfo.xTilt(),
lastPaintInfo.yTilt(),
lastPaintInfo.rotation(),
lastPaintInfo.tangentialPressure(),
lastPaintInfo.perspective(),
elapsedStrokeTime(),
lastPaintInfo.drawingSpeed());
if (queue.size() > 1) {
QQueue<KisPaintInformation>::const_iterator it = queue.constBegin();
QQueue<KisPaintInformation>::const_iterator end = queue.constEnd();
/**
* The first point is going to be overridden by lastPaintInfo, skip it.
*/
it++;
int i = 2;
if (m_d->smoothingOptions->stabilizeSensors()) {
while (it != end) {
qreal k = qreal(i - 1) / i; // coeff for uniform averaging
- result = KisPaintInformation::mixWithoutTime(k, *it, result);
+ result.KisPaintInformation::mixOtherWithoutTime(k, *it);
it++;
i++;
}
} else{
while (it != end) {
qreal k = qreal(i - 1) / i; // coeff for uniform averaging
- result = KisPaintInformation::mixOnlyPosition(k, *it, result);
+ result.KisPaintInformation::mixOtherOnlyPosition(k, *it);
it++;
i++;
}
}
}
return result;
}
void KisToolFreehandHelper::stabilizerPollAndPaint()
{
KisStabilizedEventsSampler::iterator it;
KisStabilizedEventsSampler::iterator end;
std::tie(it, end) = m_d->stabilizedSampler.range();
QVector<KisPaintInformation> delayedPaintTodoItems;
for (; it != end; ++it) {
KisPaintInformation sampledInfo = *it;
bool canPaint = true;
if (m_d->smoothingOptions->useDelayDistance()) {
const qreal R = m_d->smoothingOptions->delayDistance() /
m_d->resources->effectiveZoom();
QPointF diff = sampledInfo.pos() - m_d->previousPaintInformation.pos();
qreal dx = sqrt(pow2(diff.x()) + pow2(diff.y()));
if (!(dx > R)) {
if (m_d->resources->needsAirbrushing()) {
sampledInfo.setPos(m_d->previousPaintInformation.pos());
}
else {
canPaint = false;
}
}
}
if (canPaint) {
KisPaintInformation newInfo = getStabilizedPaintInfo(m_d->stabilizerDeque, sampledInfo);
if (m_d->stabilizerDelayedPaintHelper.running()) {
delayedPaintTodoItems.append(newInfo);
} else {
paintLine(m_d->previousPaintInformation, newInfo);
}
m_d->previousPaintInformation = newInfo;
// Push the new entry through the queue
m_d->stabilizerDeque.dequeue();
m_d->stabilizerDeque.enqueue(sampledInfo);
} else if (m_d->stabilizerDeque.head().pos() != m_d->previousPaintInformation.pos()) {
QQueue<KisPaintInformation>::iterator it = m_d->stabilizerDeque.begin();
QQueue<KisPaintInformation>::iterator end = m_d->stabilizerDeque.end();
while (it != end) {
*it = m_d->previousPaintInformation;
++it;
}
}
}
m_d->stabilizedSampler.clear();
if (m_d->stabilizerDelayedPaintHelper.running()) {
m_d->stabilizerDelayedPaintHelper.update(delayedPaintTodoItems);
} else {
emit requestExplicitUpdateOutline();
}
}
void KisToolFreehandHelper::stabilizerEnd()
{
// Stop the timer
m_d->stabilizerPollTimer.stop();
// Finish the line
if (m_d->smoothingOptions->finishStabilizedCurve()) {
// Process all the existing events first
stabilizerPollAndPaint();
// Draw the finish line with pending events and a time override
m_d->stabilizedSampler.addFinishingEvent(m_d->stabilizerDeque.size());
stabilizerPollAndPaint();
}
if (m_d->stabilizerDelayedPaintHelper.running()) {
m_d->stabilizerDelayedPaintHelper.end();
}
}
const KisPaintOp* KisToolFreehandHelper::currentPaintOp() const
{
return !m_d->painterInfos.isEmpty() ? m_d->painterInfos.first()->painter->paintOp() : 0;
}
void KisToolFreehandHelper::finishStroke()
{
if (m_d->haveTangent) {
m_d->haveTangent = false;
QPointF newTangent = (m_d->previousPaintInformation.pos() - m_d->olderPaintInformation.pos()) /
(m_d->previousPaintInformation.currentTime() - m_d->olderPaintInformation.currentTime());
paintBezierSegment(m_d->olderPaintInformation,
m_d->previousPaintInformation,
m_d->previousTangent,
newTangent);
}
}
void KisToolFreehandHelper::doAirbrushing()
{
// Check that the stroke hasn't ended.
if (!m_d->painterInfos.isEmpty()) {
// Add a new painting update at a point identical to the previous one, except for the time
// and speed information.
const KisPaintInformation &prevPaint = m_d->previousPaintInformation;
KisPaintInformation nextPaint(prevPaint.pos(),
prevPaint.pressure(),
prevPaint.xTilt(),
prevPaint.yTilt(),
prevPaint.rotation(),
prevPaint.tangentialPressure(),
prevPaint.perspective(),
elapsedStrokeTime(),
0.0);
paint(nextPaint);
}
}
int KisToolFreehandHelper::computeAirbrushTimerInterval() const
{
qreal realInterval = m_d->resources->airbrushingInterval() * AIRBRUSH_INTERVAL_FACTOR;
return qMax(1, qFloor(realInterval));
}
void KisToolFreehandHelper::paintAt(int painterInfoId,
const KisPaintInformation &pi)
{
m_d->hasPaintAtLeastOnce = true;
m_d->strokesFacade->addJob(m_d->strokeId,
new FreehandStrokeStrategy::Data(m_d->resources->currentNode(),
painterInfoId, pi));
if(m_d->recordingAdapter) {
m_d->recordingAdapter->addPoint(pi);
}
}
void KisToolFreehandHelper::paintLine(int painterInfoId,
const KisPaintInformation &pi1,
const KisPaintInformation &pi2)
{
m_d->hasPaintAtLeastOnce = true;
m_d->strokesFacade->addJob(m_d->strokeId,
new FreehandStrokeStrategy::Data(m_d->resources->currentNode(),
painterInfoId, pi1, pi2));
if(m_d->recordingAdapter) {
m_d->recordingAdapter->addLine(pi1, pi2);
}
}
void KisToolFreehandHelper::paintBezierCurve(int painterInfoId,
const KisPaintInformation &pi1,
const QPointF &control1,
const QPointF &control2,
const KisPaintInformation &pi2)
{
#ifdef DEBUG_BEZIER_CURVES
KisPaintInformation tpi1;
KisPaintInformation tpi2;
tpi1 = pi1;
tpi2 = pi2;
tpi1.setPressure(0.3);
tpi2.setPressure(0.3);
paintLine(tpi1, tpi2);
tpi1.setPressure(0.6);
tpi2.setPressure(0.3);
tpi1.setPos(pi1.pos());
tpi2.setPos(control1);
paintLine(tpi1, tpi2);
tpi1.setPos(pi2.pos());
tpi2.setPos(control2);
paintLine(tpi1, tpi2);
#endif
m_d->hasPaintAtLeastOnce = true;
m_d->strokesFacade->addJob(m_d->strokeId,
new FreehandStrokeStrategy::Data(m_d->resources->currentNode(),
painterInfoId,
pi1, control1, control2, pi2));
if(m_d->recordingAdapter) {
m_d->recordingAdapter->addCurve(pi1, control1, control2, pi2);
}
}
void KisToolFreehandHelper::createPainters(QVector<PainterInfo*> &painterInfos,
const KisDistanceInformation &startDist)
{
painterInfos << new PainterInfo(startDist);
}
void KisToolFreehandHelper::paintAt(const KisPaintInformation &pi)
{
paintAt(0, pi);
}
void KisToolFreehandHelper::paintLine(const KisPaintInformation &pi1,
const KisPaintInformation &pi2)
{
paintLine(0, pi1, pi2);
}
void KisToolFreehandHelper::paintBezierCurve(const KisPaintInformation &pi1,
const QPointF &control1,
const QPointF &control2,
const KisPaintInformation &pi2)
{
paintBezierCurve(0, pi1, control1, control2, pi2);
}
int KisToolFreehandHelper::canvasRotation()
{
return m_d->canvasRotation;
}
void KisToolFreehandHelper::setCanvasRotation(int rotation)
{
m_d->canvasRotation = rotation;
}
bool KisToolFreehandHelper::canvasMirroredH()
{
return m_d->canvasMirroredH;
}
void KisToolFreehandHelper::setCanvasHorizontalMirrorState(bool mirrored)
{
m_d->canvasMirroredH = mirrored;
}
-
diff --git a/libs/widgetutils/KoFileDialog.cpp b/libs/widgetutils/KoFileDialog.cpp
index 2c239695f2..18c187479c 100644
--- a/libs/widgetutils/KoFileDialog.cpp
+++ b/libs/widgetutils/KoFileDialog.cpp
@@ -1,416 +1,423 @@
/* This file is part of the KDE project
Copyright (C) 2013 - 2014 Yue Liu <yue.liu@mail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "KoFileDialog.h"
#include <QDebug>
#include <QFileDialog>
#include <QApplication>
#include <QImageReader>
#include <QClipboard>
#include <kconfiggroup.h>
#include <ksharedconfig.h>
#include <klocalizedstring.h>
#include <KisMimeDatabase.h>
#include <KoJsonTrader.h>
class Q_DECL_HIDDEN KoFileDialog::Private
{
public:
Private(QWidget *parent_,
KoFileDialog::DialogType dialogType_,
const QString caption_,
const QString defaultDir_,
const QString dialogName_)
: parent(parent_)
, type(dialogType_)
, dialogName(dialogName_)
, caption(caption_)
, defaultDirectory(defaultDir_)
, filterList(QStringList())
, defaultFilter(QString())
, swapExtensionOrder(false)
{
}
~Private()
{
}
QWidget *parent;
KoFileDialog::DialogType type;
QString dialogName;
QString caption;
QString defaultDirectory;
QString proposedFileName;
QStringList filterList;
QString defaultFilter;
QScopedPointer<QFileDialog> fileDialog;
QString mimeType;
bool swapExtensionOrder;
};
KoFileDialog::KoFileDialog(QWidget *parent,
KoFileDialog::DialogType type,
const QString &dialogName)
: d(new Private(parent, type, "", getUsedDir(dialogName), dialogName))
{
}
KoFileDialog::~KoFileDialog()
{
delete d;
}
void KoFileDialog::setCaption(const QString &caption)
{
d->caption = caption;
}
void KoFileDialog::setDefaultDir(const QString &defaultDir, bool force)
{
if (!defaultDir.isEmpty()) {
if (d->defaultDirectory.isEmpty() || force) {
QFileInfo f(defaultDir);
- d->defaultDirectory = f.absolutePath();
+ if (f.isDir()) {
+ d->defaultDirectory = defaultDir;
+ }
+ else {
+ d->defaultDirectory = f.absolutePath();
+ }
}
if (!QFileInfo(defaultDir).isDir()) {
d->proposedFileName = QFileInfo(defaultDir).fileName();
}
}
}
void KoFileDialog::setImageFilters()
{
QStringList imageFilters;
// add filters for all formats supported by QImage
Q_FOREACH (const QByteArray &format, QImageReader::supportedImageFormats()) {
imageFilters << QLatin1String("image/") + format;
}
setMimeTypeFilters(imageFilters);
}
-void KoFileDialog::setMimeTypeFilters(const QStringList &filterList, QString defaultFilter)
+void KoFileDialog::setMimeTypeFilters(const QStringList &mimeTypeList, QString defaultMimeType)
{
- d->filterList = getFilterStringListFromMime(filterList, true);
+ d->filterList = getFilterStringListFromMime(mimeTypeList, true);
+
+ QString defaultFilter;
+
+ if (!defaultMimeType.isEmpty()) {
+ QString suffix = KisMimeDatabase::suffixesForMimeType(defaultMimeType).first().remove("*.");
- if (defaultFilter.isEmpty()) {
- QStringList defaultFilters = getFilterStringListFromMime(QStringList() << defaultFilter, false);
+ if (!d->proposedFileName.isEmpty()) {
+ d->proposedFileName = QFileInfo(d->proposedFileName).baseName() + "." + suffix;
+ }
+
+ QStringList defaultFilters = getFilterStringListFromMime(QStringList() << defaultMimeType, false);
if (defaultFilters.size() > 0) {
defaultFilter = defaultFilters.first();
}
}
- QString suffix = KisMimeDatabase::suffixesForMimeType(defaultFilter).first().remove("*.");
-
- if (!d->proposedFileName.isEmpty()) {
- d->proposedFileName = QFileInfo(d->proposedFileName).baseName() + "." + suffix;
- }
-
d->defaultFilter = defaultFilter;
}
QString KoFileDialog::selectedNameFilter() const
{
return d->fileDialog->selectedNameFilter();
}
QString KoFileDialog::selectedMimeType() const
{
return d->mimeType;
}
void KoFileDialog::createFileDialog()
{
d->fileDialog.reset(new QFileDialog(d->parent, d->caption, d->defaultDirectory + "/" + d->proposedFileName));
KConfigGroup group = KSharedConfig::openConfig()->group("File Dialogs");
bool dontUseNative = true;
#ifdef Q_OS_UNIX
if (qgetenv("XDG_CURRENT_DESKTOP") == "KDE") {
dontUseNative = false;
}
#endif
d->fileDialog->setOption(QFileDialog::DontUseNativeDialog, group.readEntry("DontUseNativeFileDialog", dontUseNative));
d->fileDialog->setOption(QFileDialog::DontConfirmOverwrite, false);
d->fileDialog->setOption(QFileDialog::HideNameFilterDetails, true);
#ifdef Q_OS_OSX
QList<QUrl> urls = d->fileDialog->sidebarUrls();
QUrl volumes = QUrl::fromLocalFile("\/Volumes");
if (!urls.contains(volumes)) {
urls.append(volumes);
}
d->fileDialog->setSidebarUrls(urls);
#endif
if (d->type == SaveFile) {
d->fileDialog->setAcceptMode(QFileDialog::AcceptSave);
d->fileDialog->setFileMode(QFileDialog::AnyFile);
}
else { // open / import
d->fileDialog->setAcceptMode(QFileDialog::AcceptOpen);
if (d->type == ImportDirectory || d->type == OpenDirectory){
d->fileDialog->setFileMode(QFileDialog::Directory);
d->fileDialog->setOption(QFileDialog::ShowDirsOnly, true);
}
else { // open / import file(s)
if (d->type == OpenFile
|| d->type == ImportFile)
{
d->fileDialog->setFileMode(QFileDialog::ExistingFile);
}
else { // files
d->fileDialog->setFileMode(QFileDialog::ExistingFiles);
}
}
}
d->fileDialog->setNameFilters(d->filterList);
if (!d->proposedFileName.isEmpty()) {
QString mime = KisMimeDatabase::mimeTypeForFile(d->proposedFileName);
QString description = KisMimeDatabase::descriptionForMimeType(mime);
Q_FOREACH(const QString &filter, d->filterList) {
if (filter.startsWith(description)) {
d->fileDialog->selectNameFilter(filter);
break;
}
}
}
else if (!d->defaultFilter.isEmpty()) {
d->fileDialog->selectNameFilter(d->defaultFilter);
}
if (d->type == ImportDirectory ||
d->type == ImportFile || d->type == ImportFiles ||
d->type == SaveFile) {
d->fileDialog->setWindowModality(Qt::WindowModal);
}
}
QString KoFileDialog::filename()
{
QString url;
createFileDialog();
if (d->fileDialog->exec() == QDialog::Accepted) {
url = d->fileDialog->selectedFiles().first();
}
if (!url.isEmpty()) {
if (d->type == SaveFile && QFileInfo(url).suffix().isEmpty()) {
QString selectedFilter;
// index 0 is all supported; if that is chosen, saveDocument will automatically make it .kra
for (int i = 1; i < d->filterList.size(); ++i) {
if (d->filterList[i].startsWith(d->fileDialog->selectedNameFilter())) {
selectedFilter = d->filterList[i];
break;
}
}
int start = selectedFilter.indexOf("*.") + 1;
int end = selectedFilter.indexOf(" ", start);
int n = end - start;
QString extension = selectedFilter.mid(start, n);
if (!(extension.contains(".") || url.endsWith("."))) {
extension = "." + extension;
}
url = url + extension;
}
d->mimeType = KisMimeDatabase::mimeTypeForFile(url);
saveUsedDir(url, d->dialogName);
}
return url;
}
QStringList KoFileDialog::filenames()
{
QStringList urls;
createFileDialog();
if (d->fileDialog->exec() == QDialog::Accepted) {
urls = d->fileDialog->selectedFiles();
}
if (urls.size() > 0) {
saveUsedDir(urls.first(), d->dialogName);
}
return urls;
}
QStringList KoFileDialog::splitNameFilter(const QString &nameFilter, QStringList *mimeList)
{
Q_ASSERT(mimeList);
QStringList filters;
QString description;
if (nameFilter.contains("(")) {
description = nameFilter.left(nameFilter.indexOf("(") -1).trimmed();
}
QStringList entries = nameFilter.mid(nameFilter.indexOf("(") + 1).split(" ",QString::SkipEmptyParts );
entries.sort();
Q_FOREACH (QString entry, entries) {
entry = entry.remove("*");
entry = entry.remove(")");
QString mimeType = KisMimeDatabase::mimeTypeForSuffix(entry);
if (mimeType != "application/octet-stream") {
if (!mimeList->contains(mimeType)) {
mimeList->append(mimeType);
filters.append(KisMimeDatabase::descriptionForMimeType(mimeType) + " ( *" + entry + " )");
}
}
else {
filters.append(entry.remove(".").toUpper() + " " + description + " ( *." + entry + " )");
}
}
return filters;
}
const QStringList KoFileDialog::getFilterStringListFromMime(const QStringList &_mimeList,
bool withAllSupportedEntry)
{
QStringList mimeSeen;
// 1
QString allSupported;
// 2
QString kritaNative;
// 3
QString ora;
QStringList ret;
QStringList mimeList = _mimeList;
mimeList.sort();
Q_FOREACH(const QString &mimeType, mimeList) {
if (!mimeSeen.contains(mimeType)) {
QString description = KisMimeDatabase::descriptionForMimeType(mimeType);
if (description.isEmpty() && !mimeType.isEmpty()) {
description = mimeType.split("/")[1];
if (description.startsWith("x-")) {
description = description.remove(0, 2);
}
}
QString oneFilter;
QStringList patterns = KisMimeDatabase::suffixesForMimeType(mimeType);
QStringList globPatterns;
Q_FOREACH(const QString &pattern, patterns) {
if (pattern.startsWith(".")) {
globPatterns << "*" + pattern;
}
else if (pattern.startsWith("*.")) {
globPatterns << pattern;
}
else {
globPatterns << "*." + pattern;
}
}
Q_FOREACH(const QString &glob, globPatterns) {
if (d->swapExtensionOrder) {
oneFilter.prepend(glob + " ");
if (withAllSupportedEntry) {
allSupported.prepend(glob + " ");
}
#ifdef Q_OS_LINUX
if (qgetenv("XDG_CURRENT_DESKTOP") == "GNOME") {
oneFilter.prepend(glob.toUpper() + " ");
if (withAllSupportedEntry) {
allSupported.prepend(glob.toUpper() + " ");
}
}
#endif
}
else {
oneFilter.append(glob + " ");
if (withAllSupportedEntry) {
allSupported.append(glob + " ");
}
#ifdef Q_OS_LINUX
if (qgetenv("XDG_CURRENT_DESKTOP") == "GNOME") {
oneFilter.append(glob.toUpper() + " ");
if (withAllSupportedEntry) {
allSupported.append(glob.toUpper() + " ");
}
}
#endif
}
}
Q_ASSERT(!description.isEmpty());
oneFilter = description + " ( " + oneFilter + ")";
if (mimeType == "application/x-krita") {
kritaNative = oneFilter;
continue;
}
if (mimeType == "image/openraster") {
ora = oneFilter;
continue;
}
else {
ret << oneFilter;
}
mimeSeen << mimeType;
}
}
ret.sort();
ret.removeDuplicates();
if (!ora.isEmpty()) ret.prepend(ora);
if (!kritaNative.isEmpty()) ret.prepend(kritaNative);
if (!allSupported.isEmpty()) ret.prepend(i18n("All supported formats") + " ( " + allSupported + (")"));
return ret;
}
QString KoFileDialog::getUsedDir(const QString &dialogName)
{
if (dialogName.isEmpty()) return "";
KConfigGroup group = KSharedConfig::openConfig()->group("File Dialogs");
QString dir = group.readEntry(dialogName, "");
return dir;
}
void KoFileDialog::saveUsedDir(const QString &fileName,
const QString &dialogName)
{
if (dialogName.isEmpty()) return;
QFileInfo fileInfo(fileName);
KConfigGroup group = KSharedConfig::openConfig()->group("File Dialogs");
group.writeEntry(dialogName, fileInfo.absolutePath());
}
diff --git a/libs/widgetutils/KoFileDialog.h b/libs/widgetutils/KoFileDialog.h
index 9fe49299e3..3e9fd0c193 100644
--- a/libs/widgetutils/KoFileDialog.h
+++ b/libs/widgetutils/KoFileDialog.h
@@ -1,132 +1,137 @@
/* This file is part of the KDE project
Copyright (C) 2013 - 2014 Yue Liu <yue.liu@mail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef KOFILEDIALOG_H
#define KOFILEDIALOG_H
#include "kritawidgetutils_export.h"
#include <QFileDialog>
#include <QString>
#include <QStringList>
#include <QList>
/**
* Wrapper around QFileDialog providing native file dialogs
* on KDE/Gnome/Windows/OSX/etc.
*/
class KRITAWIDGETUTILS_EXPORT KoFileDialog : public QObject
{
Q_OBJECT
public:
enum DialogType {
OpenFile,
OpenFiles,
OpenDirectory,
ImportFile,
ImportFiles,
ImportDirectory,
SaveFile
};
/**
* @brief constructor
* @param parent The parent of the file dialog
* @param dialogType usage of the file dialog
* @param dialogName the name for the file dialog. This will be used to open
* the filedialog in the last open location, instead the specified directory.
*
* @return The name of the entry user selected in the file dialog
*
*/
KoFileDialog(QWidget *parent,
KoFileDialog::DialogType type,
const QString &dialogName);
~KoFileDialog() override;
void setCaption(const QString &caption);
/**
* Use the given filename as a proposal.
*/
void setProposedFileName(const QString &filename);
/**
* @brief setDefaultDir set the default directory to defaultDir.
*
* @param defaultDir a path to a file or directory
*/
void setDefaultDir(const QString &defaultDir, bool force = false);
/**
* @brief setImageFilters sets the name filters for the file dialog to all
* image formats Qt's QImageReader supports.
*/
void setImageFilters();
- void setMimeTypeFilters(const QStringList &filterList,
- QString defaultFilter = QString());
+ /**
+ * @brief setMimeTypeFilters Update the list of file filters from mime types.
+ * @param mimeTypeList A list of mime types that forms the basis of this dialog's file filters
+ * @param defaultMimeType Sets the default filter based on this mime type
+ */
+ void setMimeTypeFilters(const QStringList &mimeTypeList,
+ QString defaultMimeType = QString());
/// Get the file names the user selected in the file dialog
QStringList filenames();
/// Get the file name the user selected in the file dialog
QString filename();
/**
* @brief selectedNameFilter returns the name filter the user selected, either
* directory or by clicking on it.
* @return
*/
QString selectedNameFilter() const;
QString selectedMimeType() const;
private:
/**
* @brief splitNameFilter take a single line of a QDialog name filter and split it
* into several lines. This is needed because a single line name filter can contain
* more than one mimetype, making it impossible to figure out the correct extension.
*
* The methods takes care of some duplicated extensions, like jpeg and jpg.
* @param nameFilter the namefilter to be split
* @param mimeList a pointer to the list with mimes that shouldn't be added.
* @return a stringlist of all name filters.
*/
static QStringList splitNameFilter(const QString &nameFilter, QStringList *mimeList);
void createFileDialog();
QString getUsedDir(const QString &dialogName);
void saveUsedDir(const QString &fileName, const QString &dialogName);
const QStringList getFilterStringListFromMime(const QStringList &mimeList,
bool withAllSupportedEntry = false);
class Private;
Private * const d;
};
#endif /* KOFILEDIALOG_H */
diff --git a/plugins/dockers/palettedocker/palettedocker_dock.cpp b/plugins/dockers/palettedocker/palettedocker_dock.cpp
index 41f8982a71..fc297d32f0 100644
--- a/plugins/dockers/palettedocker/palettedocker_dock.cpp
+++ b/plugins/dockers/palettedocker/palettedocker_dock.cpp
@@ -1,259 +1,278 @@
/*
* Copyright (c) 2013 Sven Langkamp <sven.langkamp@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "palettedocker_dock.h"
#include <QPainter>
#include <QGridLayout>
#include <QTableView>
#include <QHeaderView>
#include <QWheelEvent>
#include <QColorDialog>
#include <klocalizedstring.h>
#include <KoResourceServerProvider.h>
#include <KoColorSpaceRegistry.h>
#include <kis_icon.h>
#include <kis_layer.h>
#include <kis_node_manager.h>
#include <kis_config.h>
#include <kis_workspace_resource.h>
#include <kis_canvas_resource_provider.h>
#include <KisMainWindow.h>
#include <kis_canvas_resource_provider.h>
#include <KisViewManager.h>
#include <kis_display_color_converter.h>
#include <kis_canvas2.h>
#include <KoDialog.h>
#include <QComboBox>
#include <kis_color_button.h>
#include <QCheckBox>
#include <QFormLayout>
#include <QLineEdit>
#include "KisPaletteModel.h"
#include "KisColorsetChooser.h"
#include "ui_wdgpalettedock.h"
#include "kis_palette_delegate.h"
#include "kis_palette_view.h"
PaletteDockerDock::PaletteDockerDock( )
: QDockWidget(i18n("Palette"))
, m_wdgPaletteDock(new Ui_WdgPaletteDock())
, m_currentColorSet(0)
, m_resourceProvider(0)
, m_canvas(0)
{
QWidget* mainWidget = new QWidget(this);
setWidget(mainWidget);
m_wdgPaletteDock->setupUi(mainWidget);
m_wdgPaletteDock->bnAdd->setIcon(KisIconUtils::loadIcon("list-add"));
m_wdgPaletteDock->bnAdd->setIconSize(QSize(16, 16));
m_wdgPaletteDock->bnAddDialog->setIcon(KisIconUtils::loadIcon("document-new"));
m_wdgPaletteDock->bnAddDialog->setIconSize(QSize(16, 16));
m_wdgPaletteDock->bnRemove->setIcon(KisIconUtils::loadIcon("edit-delete"));
m_wdgPaletteDock->bnRemove->setIconSize(QSize(16, 16));
m_wdgPaletteDock->bnAdd->setEnabled(false);
m_wdgPaletteDock->bnRemove->setEnabled(false);
m_wdgPaletteDock->bnAddGroup->setIcon(KisIconUtils::loadIcon("groupLayer"));
m_wdgPaletteDock->bnAddGroup->setIconSize(QSize(16, 16));
m_model = new KisPaletteModel(this);
m_wdgPaletteDock->paletteView->setPaletteModel(m_model);
connect(m_wdgPaletteDock->bnAdd, SIGNAL(clicked(bool)), this, SLOT(addColorForeground()));
connect(m_wdgPaletteDock->bnAddDialog, SIGNAL(clicked(bool)), this, SLOT(addColor()));
connect(m_wdgPaletteDock->bnRemove, SIGNAL(clicked(bool)), this, SLOT(removeColor()));
connect(m_wdgPaletteDock->bnAddGroup, SIGNAL(clicked(bool)), m_wdgPaletteDock->paletteView, SLOT(addGroupWithDialog()));
connect(m_wdgPaletteDock->paletteView, SIGNAL(entrySelected(KoColorSetEntry)), this, SLOT(entrySelected(KoColorSetEntry)));
+ connect(m_wdgPaletteDock->paletteView, SIGNAL(entrySelectedBackGround(KoColorSetEntry)), this, SLOT(entrySelectedBack(KoColorSetEntry)));
KoResourceServer<KoColorSet>* rServer = KoResourceServerProvider::instance()->paletteServer(false);
m_serverAdapter = QSharedPointer<KoAbstractResourceServerAdapter>(new KoResourceServerAdapter<KoColorSet>(rServer));
m_serverAdapter->connectToResourceServer();
rServer->addObserver(this);
m_colorSetChooser = new KisColorsetChooser(this);
connect(m_colorSetChooser, SIGNAL(paletteSelected(KoColorSet*)), this, SLOT(setColorSet(KoColorSet*)));
m_wdgPaletteDock->bnColorSets->setIcon(KisIconUtils::loadIcon("hi16-palette_library"));
m_wdgPaletteDock->bnColorSets->setToolTip(i18n("Choose palette"));
m_wdgPaletteDock->bnColorSets->setPopupWidget(m_colorSetChooser);
KisConfig cfg;
QString defaultPalette = cfg.defaultPalette();
KoColorSet* defaultColorSet = rServer->resourceByName(defaultPalette);
if (defaultColorSet) {
setColorSet(defaultColorSet);
}
}
PaletteDockerDock::~PaletteDockerDock()
{
KoResourceServer<KoColorSet>* rServer = KoResourceServerProvider::instance()->paletteServer();
rServer->removeObserver(this);
if (m_currentColorSet) {
KisConfig cfg;
cfg.setDefaultPalette(m_currentColorSet->name());
}
delete m_wdgPaletteDock->paletteView->itemDelegate();
delete m_wdgPaletteDock;
}
void PaletteDockerDock::setMainWindow(KisViewManager* kisview)
{
m_resourceProvider = kisview->resourceProvider();
connect(m_resourceProvider, SIGNAL(sigSavingWorkspace(KisWorkspaceResource*)), SLOT(saveToWorkspace(KisWorkspaceResource*)));
connect(m_resourceProvider, SIGNAL(sigLoadingWorkspace(KisWorkspaceResource*)), SLOT(loadFromWorkspace(KisWorkspaceResource*)));
+ connect(m_resourceProvider, SIGNAL(sigFGColorChanged(KoColor)),m_wdgPaletteDock->paletteView, SLOT(trySelectClosestColor(KoColor)));
kisview->nodeManager()->disconnect(m_model);
}
void PaletteDockerDock::setCanvas(KoCanvasBase *canvas)
{
setEnabled(canvas != 0);
if (canvas) {
KisCanvas2 *cv = qobject_cast<KisCanvas2*>(canvas);
m_model->setDisplayRenderer(cv->displayColorConverter()->displayRendererInterface());
}
m_canvas = static_cast<KisCanvas2*>(canvas);
}
void PaletteDockerDock::unsetCanvas()
{
setEnabled(false);
m_model->setDisplayRenderer(0);
m_canvas = 0;
}
void PaletteDockerDock::unsetResourceServer()
{
KoResourceServer<KoColorSet>* rServer = KoResourceServerProvider::instance()->paletteServer();
rServer->removeObserver(this);
}
void PaletteDockerDock::removingResource(KoColorSet *resource)
{
if (resource == m_currentColorSet) {
setColorSet(0);
}
}
void PaletteDockerDock::resourceChanged(KoColorSet *resource)
{
setColorSet(resource);
}
void PaletteDockerDock::setColorSet(KoColorSet* colorSet)
{
m_model->setColorSet(colorSet);
m_wdgPaletteDock->paletteView->updateView();
m_wdgPaletteDock->paletteView->updateRows();
if (colorSet && colorSet->removable()) {
m_wdgPaletteDock->bnAdd->setEnabled(true);
m_wdgPaletteDock->bnRemove->setEnabled(true);
} else {
m_wdgPaletteDock->bnAdd->setEnabled(false);
m_wdgPaletteDock->bnRemove->setEnabled(false);
}
m_currentColorSet = colorSet;
}
void PaletteDockerDock::addColorForeground()
{
if (m_resourceProvider) {
//setup dialog
m_wdgPaletteDock->paletteView->addEntryWithDialog(m_resourceProvider->fgColor());
}
}
void PaletteDockerDock::addColor()
{
if (m_currentColorSet && m_resourceProvider) {
const KoColorDisplayRendererInterface *displayRenderer =
m_canvas->displayColorConverter()->displayRendererInterface();
KoColor currentFgColor = m_canvas->resourceManager()->foregroundColor();
QColor color = QColorDialog::getColor(displayRenderer->toQColor(currentFgColor));
if (color.isValid()) {
KoColorSetEntry newEntry;
newEntry.color = displayRenderer->approximateFromRenderedQColor(color);
m_currentColorSet->add(newEntry);
m_currentColorSet->save();
setColorSet(m_currentColorSet); // update model
}
}
}
void PaletteDockerDock::removeColor()
{
QModelIndex index = m_wdgPaletteDock->paletteView->currentIndex();
if (!index.isValid()) {
return;
}
m_wdgPaletteDock->paletteView->removeEntryWithDialog(index);
}
void PaletteDockerDock::entrySelected(KoColorSetEntry entry)
{
quint32 index = 0;
QString groupName = m_currentColorSet->findGroupByColorName(entry.name, &index);
QString seperator;
if (groupName != QString()) {
seperator = " - ";
}
m_wdgPaletteDock->lblColorName->setText(groupName+seperator+entry.name);
if (m_resourceProvider) {
m_resourceProvider->setFGColor(entry.color);
}
if (m_currentColorSet->removable()) {
m_wdgPaletteDock->bnRemove->setEnabled(true);
}
}
+void PaletteDockerDock::entrySelectedBack(KoColorSetEntry entry)
+{
+ quint32 index = 0;
+ QString groupName = m_currentColorSet->findGroupByColorName(entry.name, &index);
+ QString seperator;
+ if (groupName != QString()) {
+ seperator = " - ";
+ }
+ m_wdgPaletteDock->lblColorName->setText(groupName+seperator+entry.name);
+ if (m_resourceProvider) {
+ m_resourceProvider->setBGColor(entry.color);
+ }
+ if (m_currentColorSet->removable()) {
+ m_wdgPaletteDock->bnRemove->setEnabled(true);
+ }
+}
+
void PaletteDockerDock::saveToWorkspace(KisWorkspaceResource* workspace)
{
if (m_currentColorSet) {
workspace->setProperty("palette", m_currentColorSet->name());
}
}
void PaletteDockerDock::loadFromWorkspace(KisWorkspaceResource* workspace)
{
if (workspace->hasProperty("palette")) {
KoResourceServer<KoColorSet>* rServer = KoResourceServerProvider::instance()->paletteServer();
KoColorSet* colorSet = rServer->resourceByName(workspace->getString("palette"));
if (colorSet) {
setColorSet(colorSet);
}
}
}
diff --git a/plugins/dockers/palettedocker/palettedocker_dock.h b/plugins/dockers/palettedocker/palettedocker_dock.h
index 14460575dd..245a8c5282 100644
--- a/plugins/dockers/palettedocker/palettedocker_dock.h
+++ b/plugins/dockers/palettedocker/palettedocker_dock.h
@@ -1,84 +1,85 @@
/*
* Copyright (c) 2013 Sven Langkamp <sven.langkamp@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef PALETTEDOCKER_DOCK_H
#define PALETTEDOCKER_DOCK_H
#include <QDockWidget>
#include <QModelIndex>
#include <QPointer>
#include <KoCanvasObserverBase.h>
#include <KoResourceServerAdapter.h>
#include <KoResourceServerObserver.h>
#include <resources/KoColorSet.h>
#include <kis_canvas2.h>
#include <kis_mainwindow_observer.h>
class KisViewManager;
class KisCanvasResourceProvider;
class KisWorkspaceResource;
class KisColorsetChooser;
class KisPaletteModel;
class Ui_WdgPaletteDock;
class PaletteDockerDock : public QDockWidget, public KisMainwindowObserver, public KoResourceServerObserver<KoColorSet> {
Q_OBJECT
public:
PaletteDockerDock();
~PaletteDockerDock() override;
QString observerName() override { return "PaletteDockerDock"; }
void setMainWindow(KisViewManager* kisview) override;
void setCanvas(KoCanvasBase *canvas) override;
void unsetCanvas() override;
public: // KoResourceServerObserver
void unsetResourceServer() override;
void resourceAdded(KoColorSet *) override {}
void removingResource(KoColorSet *resource) override;
void resourceChanged(KoColorSet *resource) override;
void syncTaggedResourceView() override {}
void syncTagAddition(const QString&) override {}
void syncTagRemoval(const QString&) override {}
private Q_SLOTS:
void addColorForeground();
void addColor();
void removeColor();
void entrySelected(KoColorSetEntry entry);
+ void entrySelectedBack(KoColorSetEntry entry);
void setColorSet(KoColorSet* colorSet);
void saveToWorkspace(KisWorkspaceResource* workspace);
void loadFromWorkspace(KisWorkspaceResource* workspace);
private:
Ui_WdgPaletteDock* m_wdgPaletteDock;
KisPaletteModel *m_model;
QSharedPointer<KoAbstractResourceServerAdapter> m_serverAdapter;
KoColorSet *m_currentColorSet;
KisColorsetChooser *m_colorSetChooser;
KisCanvasResourceProvider *m_resourceProvider;
QPointer<KisCanvas2> m_canvas;
};
#endif
diff --git a/plugins/extensions/pykrita/plugin/plugins/palette_docker/palette_exporter_gimppalette.py b/plugins/extensions/pykrita/plugin/plugins/palette_docker/palette_exporter_gimppalette.py
new file mode 100644
index 0000000000..f63e7e12ad
--- /dev/null
+++ b/plugins/extensions/pykrita/plugin/plugins/palette_docker/palette_exporter_gimppalette.py
@@ -0,0 +1,48 @@
+'''
+A script that converts the palette named "Default" to a Gimp palette.
+This ideally needs some gui and the like to select the palette to export..
+By Wolthera.
+'''
+
+
+# Importing the relevant dependancies:
+import sys
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+import math
+from krita import *
+
+allPalettes = Application.resources("palette")
+paletteName = "Default"
+self.currentPalette = Palette(allPalettes["paletteName"])
+# open the appropriate file...
+gplFile = open(paletteName+".gpl", "w")
+gplFile.write("GIMP Palette\n")
+gplFile.write("Name: "+paletteName+"\n")
+gplFile.write("Columns: "+str(self.currentPalette.columnCount())+"\n")
+gplFile.write("#"+self.currentPalette.comment()+"\n")
+colorCount = self.currentPalette.colorsCountGroup("")
+
+for i in range(colorCount):
+ entry = self.currentPalette.colorSetEntryFromGroup(i, "")
+ color = self.currentPalette.colorForEntry(entry)
+ #convert to sRGB
+ color.setColorSpace("RGBA", "U8", "sRGB built-in")
+
+ red = max(min(int(color.componentsOrdered()[0]*255), 255), 0)
+ green = max(min(int(color.componentsOrdered()[1]*255), 255), 0)
+ blue = max(min(int(color.componentsOrdered()[2]*255), 255), 0)
+ gplFile.write(str(red)+" "+str(green)+" "+str(blue)+" "+entry.id+"-"+entry.name+"\n")
+ groupNames = self.currentPalette.groupNames()
+ for groupName in groupNames:
+ colorCount = self.currentPalette.colorsCountGroup(groupName)
+ for i in range(colorCount):
+ entry = self.currentPalette.colorSetEntryFromGroup(i, groupName)
+ color = self.currentPalette.colorForEntry(entry)
+ #convert to sRGB
+ color.setColorSpace("RGBA", "U8", "sRGB built-in")
+ red = max(min(int(color.componentsOrdered()[0]*255), 255), 0)
+ green = max(min(int(color.componentsOrdered()[1]*255), 255), 0)
+ blue = max(min(int(color.componentsOrdered()[2]*255), 255), 0)
+ gplFile.write(str(red)+" "+str(green)+" "+str(blue)+" "+entry.id+"-"+entry.name+"\n")
+gplFile.close()
diff --git a/plugins/extensions/pykrita/plugin/plugins/palette_docker/palette_exporter_inkscapeSVG.py b/plugins/extensions/pykrita/plugin/plugins/palette_docker/palette_exporter_inkscapeSVG.py
new file mode 100644
index 0000000000..8d07f74c97
--- /dev/null
+++ b/plugins/extensions/pykrita/plugin/plugins/palette_docker/palette_exporter_inkscapeSVG.py
@@ -0,0 +1,124 @@
+'''
+A script that converts the palette named "Default" to a SVG so that Inkscape may use the colors
+This ideally needs some gui and the like to select the palette to export.. also, the icc-color stuff doesn't work right
+ecause we'd need the ability to get the url of the colorprofile somehow, and then we can make @colorprofile things in the definitions.
+By Wolthera.
+'''
+
+
+# Importing the relevant dependancies:
+import sys
+from PyQt5.QtGui import *
+from PyQt5.QtXml import *
+from PyQt5.QtWidgets import *
+import math
+from krita import *
+
+allPalettes = Application.resources("palette")
+paletteName = "Default"
+self.currentPalette = Palette(allPalettes[paletteName])
+# open the appropriate file...
+svgFile = open(paletteName+".svg", "w")
+svgDoc = QDomDocument()
+svgBaseElement = svgDoc.createElement("svg")
+svgBaseElement.setAttribute("xmlns:osb", "http://www.openswatchbook.org/uri/2009/osb")
+svgBaseElement.setAttribute("xmlns:svg", "http://www.w3.org/2000/svg")
+svgDefs = svgDoc.createElement("defs")
+svgSwatches = svgDoc.createElement("g")
+svgSwatches.setAttribute("id", "Swatches")
+Row = 0
+Column = 0
+
+colorCount = self.currentPalette.colorsCountGroup("")
+
+for i in range(colorCount):
+ entry = self.currentPalette.colorSetEntryFromGroup(i, "")
+ color = self.currentPalette.colorForEntry(entry)
+
+ iccColor = "icc-color("+color.colorProfile()
+ for c in range(len(color.componentsOrdered())-1):
+ iccColor = iccColor+","+str(color.componentsOrdered()[c])
+ iccColor = iccColor+")"
+ #convert to sRGB
+ color.setColorSpace("RGBA", "U8", "sRGB built-in")
+ red = max(min(int(color.componentsOrdered()[0]*255), 255), 0)
+ green = max(min(int(color.componentsOrdered()[1]*255), 255), 0)
+ blue = max(min(int(color.componentsOrdered()[2]*255), 255), 0)
+ hexcode = "#"+str(format(red, '02x'))+str(format(green, '02x'))+str(format(blue, '02x'))
+ swatchName = str(i)+"-"+entry.name
+ swatchName = swatchName.replace(" ", "-")
+ swatchMain = svgDoc.createElement("linearGradient")
+ swatchMain.setAttribute("osb:paint", "solid")
+ swatchMain.setAttribute("id", swatchName)
+ swatchSub = svgDoc.createElement("stop")
+ swatchSub.setAttribute("style", "stop-color: "+hexcode+" "+iccColor+";stop-opacity:1;")
+ swatchMain.appendChild(swatchSub)
+ svgDefs.appendChild(swatchMain)
+ svgSingleSwatch = svgDoc.createElement("rect")
+ svgSingleSwatch.setAttribute("x", str(int(Column*20)))
+ svgSingleSwatch.setAttribute("y", str(int(Row*20)))
+ svgSingleSwatch.setAttribute("width", str(int(20)))
+ svgSingleSwatch.setAttribute("height", str(int(20)))
+ svgSingleSwatch.setAttribute("fill", "url(#"+swatchName+")")
+ svgSingleSwatch.setAttribute("id", "swatch"+swatchName)
+ svgSwatches.appendChild(svgSingleSwatch)
+ Column += 1
+ if (Column >= self.currentPalette.columnCount()):
+ Column = 0
+ Row +=1
+
+groupNames = self.currentPalette.groupNames()
+for groupName in groupNames:
+ Column=0
+ Row+=1
+ groupTitle = svgDoc.createElement("text")
+ groupTitle.setAttribute("x", str(int(Column*20)))
+ groupTitle.setAttribute("y", str(int(Row*20)+15))
+ groupTitle.appendChild(svgDoc.createTextNode(groupName))
+ svgSwatches.appendChild(groupTitle)
+ Row+=1
+ colorCount = self.currentPalette.colorsCountGroup(groupName)
+ for i in range(colorCount):
+ entry = self.currentPalette.colorSetEntryFromGroup(i, groupName)
+ color = self.currentPalette.colorForEntry(entry)
+ iccColor = "icc-color("+color.colorProfile()
+ for c in range(len(color.componentsOrdered())-1):
+ iccColor = iccColor+","+str(color.componentsOrdered()[c])
+ iccColor = iccColor+")"
+ #convert to sRGB
+ color.setColorSpace("RGBA", "U8", "sRGB built-in")
+ red = max(min(int(color.componentsOrdered()[0]*255), 255), 0)
+ green = max(min(int(color.componentsOrdered()[1]*255), 255), 0)
+ blue = max(min(int(color.componentsOrdered()[2]*255), 255), 0)
+ hexcode = "#"+str(format(red, '02x'))+str(format(green, '02x'))+str(format(blue, '02x'))
+
+ swatchName = groupName+str(i)+"-"+entry.name
+ swatchName = swatchName.replace(" ", "-")
+ swatchMain = svgDoc.createElement("linearGradient")
+ swatchMain.setAttribute("osb:paint", "solid")
+ swatchMain.setAttribute("id", swatchName)
+ swatchSub = svgDoc.createElement("stop")
+ swatchSub.setAttribute("style", "stop-color: "+hexcode+" "+iccColor+";stop-opacity:1;")
+ swatchMain.appendChild(swatchSub)
+ svgDefs.appendChild(swatchMain)
+ svgSingleSwatch = svgDoc.createElement("rect")
+ svgSingleSwatch.setAttribute("x", str(int(Column*20)))
+ svgSingleSwatch.setAttribute("y", str(int(Row*20)))
+ svgSingleSwatch.setAttribute("width", str(int(20)))
+ svgSingleSwatch.setAttribute("height", str(int(20)))
+ svgSingleSwatch.setAttribute("fill", "url(#"+swatchName+")")
+ svgSingleSwatch.setAttribute("id", "swatch"+swatchName)
+ svgSwatches.appendChild(svgSingleSwatch)
+ Column += 1
+ if (Column >= self.currentPalette.columnCount()):
+ Column = 0
+ Row +=1
+
+svgBaseElement.appendChild(svgDefs)
+svgBaseElement.appendChild(svgSwatches)
+svgBaseElement.setAttribute("viewBox", "0 0 "+str(self.currentPalette.columnCount()*20)+" "+str(int(Row*20)))
+svgDoc.appendChild(svgBaseElement)
+svgFile.write(svgDoc.toString())
+svgFile.close()
+
+
diff --git a/plugins/extensions/pykrita/sip/krita/ManagedColor.sip b/plugins/extensions/pykrita/sip/krita/ManagedColor.sip
index 8e7a96a549..5d8f9a580c 100644
--- a/plugins/extensions/pykrita/sip/krita/ManagedColor.sip
+++ b/plugins/extensions/pykrita/sip/krita/ManagedColor.sip
@@ -1,23 +1,24 @@
class ManagedColor : QObject
{
%TypeHeaderCode
#include "ManagedColor.h"
%End
ManagedColor(const Palette & __0);
public:
ManagedColor(const QString &colorModel, const QString &colorDepth, const QString &colorProfile, QObject *parent = 0);
bool operator==(const ManagedColor &other) const;
QColor colorForCanvas(Canvas *canvas) const;
QString colorDepth() const;
QString colorModel() const;
QString colorProfile() const;
bool setColorProfile(const QString &colorProfile);
bool setColorSpace(const QString &colorModel, const QString &colorDepth, const QString &colorProfile);
QVector<float> components() const;
+ QVector<float> componentsOrdered() const;
void setComponents(const QVector<float> &values);
QString toXML() const;
void fromXML(const QString &xml);
QString toQString();
private:
};
diff --git a/plugins/extensions/qmic/QMic.cpp b/plugins/extensions/qmic/QMic.cpp
index c4bbe48933..ac78fee05a 100644
--- a/plugins/extensions/qmic/QMic.cpp
+++ b/plugins/extensions/qmic/QMic.cpp
@@ -1,468 +1,483 @@
/*
* Copyright (c) 2017 Boudewijn Rempt <boud@valdyas.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "QMic.h"
#include <QApplication>
#include <QDebug>
#include <QFileInfo>
#include <QLocalSocket>
#include <QBuffer>
#include <QByteArray>
#include <QDataStream>
#include <QProcess>
#include <QLocalServer>
#include <QVBoxLayout>
#include <QUuid>
#include <QList>
#include <QSharedPointer>
#include <QMultiMap>
#include <QSharedMemory>
#include <QMessageBox>
#include <klocalizedstring.h>
#include <kpluginfactory.h>
#include <KoDialog.h>
#include <KoColorSpaceConstants.h>
#include <KoColorSpaceRegistry.h>
#include <KoColorSpace.h>
#include <KoColorModelStandardIds.h>
#include <KoColorSpaceTraits.h>
#include <KisViewManager.h>
#include <kis_action.h>
#include <kis_config.h>
#include <kis_preference_set_registry.h>
#include <kis_image.h>
-#include <kis_image.h>
#include <kis_paint_device.h>
#include <kis_layer.h>
#include <kis_selection.h>
#include <kis_paint_layer.h>
+#include <kis_algebra_2d.h>
#include "kis_input_output_mapper.h"
#include "kis_qmic_simple_convertor.h"
#include "kis_import_qmic_processing_visitor.h"
#include <PluginSettings.h>
#include "kis_qmic_applicator.h"
#include "kis_qmic_progress_manager.h"
static const char ack[] = "ack";
K_PLUGIN_FACTORY_WITH_JSON(QMicFactory, "kritaqmic.json", registerPlugin<QMic>();)
QMic::QMic(QObject *parent, const QVariantList &)
: KisViewPlugin(parent)
, m_gmicApplicator(0)
, m_progressManager(0)
{
KisPreferenceSetRegistry *preferenceSetRegistry = KisPreferenceSetRegistry::instance();
PluginSettingsFactory* settingsFactory = new PluginSettingsFactory();
preferenceSetRegistry->add("QMicPluginSettingsFactory", settingsFactory);
m_qmicAction = createAction("QMic");
m_qmicAction->setActivationFlags(KisAction::ACTIVE_DEVICE);
connect(m_qmicAction , SIGNAL(triggered()), this, SLOT(slotQMic()));
m_againAction = createAction("QMicAgain");
m_againAction->setActivationFlags(KisAction::ACTIVE_DEVICE);
m_againAction->setEnabled(false);
connect(m_againAction, SIGNAL(triggered()), this, SLOT(slotQMicAgain()));
m_gmicApplicator = new KisQmicApplicator();
connect(m_gmicApplicator, SIGNAL(gmicFinished(bool, int, QString)), this, SLOT(slotGmicFinished(bool, int, QString)));
}
QMic::~QMic()
{
Q_FOREACH(QSharedMemory *memorySegment, m_sharedMemorySegments) {
qDebug() << "detaching" << memorySegment->key();
memorySegment->detach();
}
qDeleteAll(m_sharedMemorySegments);
m_sharedMemorySegments.clear();
if (m_pluginProcess) {
m_pluginProcess->close();
}
delete m_gmicApplicator;
delete m_progressManager;
delete m_localServer;
}
void QMic::slotQMicAgain()
{
slotQMic(true);
}
void QMic::slotQMic(bool again)
{
m_qmicAction->setEnabled(false);
m_againAction->setEnabled(false);
if (m_pluginProcess) {
qDebug() << "Plugin is already started" << m_pluginProcess->state();
return;
}
delete m_progressManager;
m_progressManager = new KisQmicProgressManager(m_view);
connect(m_progressManager, SIGNAL(sigProgress()), this, SLOT(slotUpdateProgress()));
// find the krita-gmic-qt plugin
KisConfig cfg;
QString pluginPath = cfg.readEntry<QString>("gmic_qt_plugin_path", QString::null);
if (pluginPath.isEmpty() || !QFileInfo(pluginPath).exists()) {
KoDialog dlg;
dlg.setWindowTitle(i18nc("@title:Window", "Krita"));
QWidget *w = new QWidget(&dlg);
dlg.setMainWidget(w);
QVBoxLayout *l = new QVBoxLayout(w);
l->addWidget(new PluginSettings(w));
dlg.setButtons(KoDialog::Ok);
dlg.exec();
pluginPath = cfg.readEntry<QString>("gmic_qt_plugin_path", QString::null);
if (pluginPath.isEmpty() || !QFileInfo(pluginPath).exists()) {
return;
}
}
m_key = QUuid::createUuid().toString();
m_localServer = new QLocalServer();
m_localServer->listen(m_key);
connect(m_localServer, SIGNAL(newConnection()), SLOT(connected()));
m_pluginProcess = new QProcess(this);
m_pluginProcess->setProcessChannelMode(QProcess::ForwardedChannels);
connect(m_pluginProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(pluginFinished(int,QProcess::ExitStatus)));
connect(m_pluginProcess, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(pluginStateChanged(QProcess::ProcessState)));
m_pluginProcess->start(pluginPath, QStringList() << m_key << (again ? QString(" reapply") : QString::null));
bool r = m_pluginProcess->waitForStarted();
while (m_pluginProcess->waitForFinished(10)) {
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
}
qDebug() << "Plugin started" << r << m_pluginProcess->state();
}
void QMic::connected()
{
qDebug() << "connected";
QLocalSocket *socket = m_localServer->nextPendingConnection();
if (!socket) { return; }
while (socket->bytesAvailable() < static_cast<int>(sizeof(quint32))) {
if (!socket->isValid()) { // stale request
return;
}
socket->waitForReadyRead(1000);
}
QDataStream ds(socket);
QByteArray msg;
quint32 remaining;
ds >> remaining;
msg.resize(remaining);
int got = 0;
char* uMsgBuf = msg.data();
do {
got = ds.readRawData(uMsgBuf, remaining);
remaining -= got;
uMsgBuf += got;
}
while (remaining && got >= 0 && socket->waitForReadyRead(2000));
if (got < 0) {
qWarning() << "Message reception failed" << socket->errorString();
delete socket;
m_localServer->close();
delete m_localServer;
m_localServer = 0;
return;
}
QString message = QString::fromUtf8(msg);
qDebug() << "Received" << message;
// Check the message: we can get three different ones
QMultiMap<QString, QString> messageMap;
Q_FOREACH(QString line, message.split('\n', QString::SkipEmptyParts)) {
QList<QString> kv = line.split('=', QString::SkipEmptyParts);
if (kv.size() == 2) {
messageMap.insert(kv[0], kv[1]);
}
else {
qWarning() << "line" << line << "is invalid.";
}
}
if (!messageMap.contains("command")) {
qWarning() << "Message did not contain a command";
return;
}
int mode = 0;
if (messageMap.contains("mode")) {
mode = messageMap.values("mode").first().toInt();
}
QByteArray ba;
if (messageMap.values("command").first() == "gmic_qt_get_image_size") {
- ba = QByteArray::number(m_view->image()->width()) + "," + QByteArray::number(m_view->image()->height());
+ KisSelectionSP selection = m_view->image()->globalSelection();
+
+ if (selection) {
+ QRect selectionRect = selection->selectedExactRect();
+ ba = QByteArray::number(selectionRect.width()) + "," + QByteArray::number(selectionRect.height());
+ }
+ else {
+ ba = QByteArray::number(m_view->image()->width()) + "," + QByteArray::number(m_view->image()->height());
+ }
}
else if (messageMap.values("command").first() == "gmic_qt_get_cropped_images") {
// Parse the message, create the shared memory segments, and create a new message to send back and waid for ack
- QRectF cropRect = m_view->image()->bounds();
+ QRectF cropRect(0.0, 0.0, 1.0, 1.0);
if (!messageMap.contains("croprect") || messageMap.values("croprect").first().split(',', QString::SkipEmptyParts).size() != 4) {
qWarning() << "gmic-qt didn't send a croprect or not a valid croprect";
}
else {
QStringList cr = messageMap.values("croprect").first().split(',', QString::SkipEmptyParts);
cropRect.setX(cr[0].toFloat());
cropRect.setY(cr[1].toFloat());
cropRect.setWidth(cr[2].toFloat());
cropRect.setHeight(cr[3].toFloat());
}
if (!prepareCroppedImages(&ba, cropRect, mode)) {
qWarning() << "Failed to prepare images for gmic-qt";
}
}
else if (messageMap.values("command").first() == "gmic_qt_output_images") {
// Parse the message. read the shared memory segments, fix up the current image and send an ack
qDebug() << "gmic_qt_output_images";
QStringList layers = messageMap.values("layer");
m_outputMode = (OutputMode)mode;
if (m_outputMode != IN_PLACE) {
QMessageBox::warning(0, i18nc("@title:window", "Krita"), i18n("Sorry, this output mode is not implemented yet."));
m_outputMode = IN_PLACE;
}
slotStartApplicator(layers);
}
else if (messageMap.values("command").first() == "gmic_qt_detach") {
Q_FOREACH(QSharedMemory *memorySegment, m_sharedMemorySegments) {
qDebug() << "detaching" << memorySegment->key() << memorySegment->isAttached();
if (memorySegment->isAttached()) {
if (!memorySegment->detach()) {
qDebug() << "\t" << memorySegment->error() << memorySegment->errorString();
}
}
}
qDeleteAll(m_sharedMemorySegments);
m_sharedMemorySegments.clear();
}
else {
qWarning() << "Received unknown command" << messageMap.values("command");
}
qDebug() << "Sending" << QString::fromUtf8(ba);
ds.writeBytes(ba.constData(), ba.length());
// Wait for the ack
bool r = true;
r &= socket->waitForReadyRead(); // wait for ack
r &= (socket->read(qstrlen(ack)) == ack);
socket->waitForDisconnected(-1);
}
void QMic::pluginStateChanged(QProcess::ProcessState state)
{
qDebug() << "stateChanged" << state;
}
void QMic::pluginFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
qDebug() << "pluginFinished" << exitCode << exitStatus;
delete m_pluginProcess;
m_pluginProcess = 0;
delete m_localServer;
m_localServer = 0;
delete m_progressManager;
m_progressManager = 0;
m_qmicAction->setEnabled(true);
m_againAction->setEnabled(true);
}
void QMic::slotUpdateProgress()
{
if (!m_gmicApplicator) {
qWarning() << "G'Mic applicator already deleted!";
return;
}
qDebug() << "slotUpdateProgress" << m_gmicApplicator->getProgress();
m_progressManager->updateProgress(m_gmicApplicator->getProgress());
}
void QMic::slotStartProgressReporting()
{
qDebug() << "slotStartProgressReporting();";
if (m_progressManager->inProgress()) {
m_progressManager->finishProgress();
}
m_progressManager->initProgress();
}
void QMic::slotGmicFinished(bool successfully, int milliseconds, const QString &msg)
{
qDebug() << "slotGmicFinished();" << successfully << milliseconds << msg;
if (successfully) {
m_gmicApplicator->finish();
}
else {
m_gmicApplicator->cancel();
QMessageBox::warning(0, i18nc("@title:window", "Krita"), i18n("G'Mic failed, reason:") + msg);
}
}
void QMic::slotStartApplicator(QStringList gmicImages)
{
qDebug() << "slotStartApplicator();" << gmicImages;
// Create a vector of gmic images
QVector<gmic_image<float> *> images;
Q_FOREACH(const QString &image, gmicImages) {
QStringList parts = image.split(',', QString::SkipEmptyParts);
Q_ASSERT(parts.size() == 4);
QString key = parts[0];
QString layerName = QByteArray::fromHex(parts[1].toLatin1());
int spectrum = parts[2].toInt();
int width = parts[3].toInt();
int height = parts[4].toInt();
qDebug() << key << layerName << width << height;
QSharedMemory m(key);
if (!m.attach(QSharedMemory::ReadOnly)) {
qWarning() << "Could not attach to shared memory area." << m.error() << m.errorString();
}
if (m.isAttached()) {
if (!m.lock()) {
qDebug() << "Could not lock memeory segment" << m.error() << m.errorString();
}
qDebug() << "Memory segment" << key << m.size() << m.constData() << m.data();
gmic_image<float> *gimg = new gmic_image<float>();
gimg->assign(width, height, 1, spectrum);
gimg->name = layerName;
gimg->_data = new float[width * height * spectrum * sizeof(float)];
qDebug() << "width" << width << "height" << height << "size" << width * height * spectrum * sizeof(float) << "shared memory size" << m.size();
memcpy(gimg->_data, m.constData(), width * height * spectrum * sizeof(float));
qDebug() << "created gmic image" << gimg->name << gimg->_width << gimg->_height;
if (!m.unlock()) {
qDebug() << "Could not unlock memeory segment" << m.error() << m.errorString();
}
if (!m.detach()) {
qDebug() << "Could not detach from memeory segment" << m.error() << m.errorString();
}
images.append(gimg);
}
}
qDebug() << "Got" << images.size() << "gmic images";
// Start the applicator
KUndo2MagicString actionName = kundo2_i18n("Gmic filter");
KisNodeSP rootNode = m_view->image()->root();
KisInputOutputMapper mapper(m_view->image(), m_view->activeNode());
KisNodeListSP layers = mapper.inputNodes(m_inputMode);
m_gmicApplicator->setProperties(m_view->image(), rootNode, images, actionName, layers);
slotStartProgressReporting();
m_gmicApplicator->preview();
m_gmicApplicator->finish();
}
bool QMic::prepareCroppedImages(QByteArray *message, QRectF &rc, int inputMode)
{
m_view->image()->lock();
m_inputMode = (InputLayerMode)inputMode;
qDebug() << "prepareCroppedImages()" << QString::fromUtf8(*message) << rc << inputMode;
KisInputOutputMapper mapper(m_view->image(), m_view->activeNode());
KisNodeListSP nodes = mapper.inputNodes(m_inputMode);
if (nodes->isEmpty()) {
m_view->image()->unlock();
return false;
}
for (int i = 0; i < nodes->size(); ++i) {
KisNodeSP node = nodes->at(i);
- qDebug() << "Converting node" << node->name() << node->exactBounds();
if (node->paintDevice()) {
+ QRect cropRect;
+
+ KisSelectionSP selection = m_view->image()->globalSelection();
+
+ if (selection) {
+ cropRect = selection->selectedExactRect();
+ }
+ else {
+ cropRect = m_view->image()->bounds();
+ }
- QRect cropRect = node->exactBounds();
+ qDebug() << "Converting node" << node->name() << cropRect;
- const int ix = static_cast<int>(std::floor(rc.x() * cropRect.width()));
- const int iy = static_cast<int>(std::floor(rc.y() * cropRect.height()));
- const int iw = std::min(cropRect.width() - ix, static_cast<int>(1 + std::ceil(rc.width() * cropRect.width())));
- const int ih = std::min(cropRect.height() - iy, static_cast<int>(1 + std::ceil(rc.height() * cropRect.height())));
+ const QRectF mappedRect = KisAlgebra2D::mapToRect(cropRect).mapRect(rc);
+ const QRect resultRect = mappedRect.toAlignedRect();
QSharedMemory *m = new QSharedMemory(QString("key_%1").arg(QUuid::createUuid().toString()));
m_sharedMemorySegments.append(m);
- if (!m->create(iw * ih * 4 * sizeof(float))) { //buf.size())) {
+ if (!m->create(resultRect.width() * resultRect.height() * 4 * sizeof(float))) { //buf.size())) {
qWarning() << "Could not create shared memory segment" << m->error() << m->errorString();
return false;
}
m->lock();
gmic_image<float> img;
- img.assign(iw, ih, 1, 4);
+ img.assign(resultRect.width(), resultRect.height(), 1, 4);
img._data = reinterpret_cast<float*>(m->data());
- KisQmicSimpleConvertor::convertToGmicImageFast(node->paintDevice(), &img, QRect(ix, iy, iw, ih));
+ KisQmicSimpleConvertor::convertToGmicImageFast(node->paintDevice(), &img, resultRect);
message->append(m->key().toUtf8());
m->unlock();
qDebug() << "size" << m->size();
message->append(",");
message->append(node->name().toUtf8().toHex());
message->append(",");
- message->append(QByteArray::number(iw));
+ message->append(QByteArray::number(resultRect.width()));
message->append(",");
- message->append(QByteArray::number(ih));
+ message->append(QByteArray::number(resultRect.height()));
message->append("\n");
}
}
qDebug() << QString::fromUtf8(*message);
m_view->image()->unlock();
return true;
}
#include "QMic.moc"
diff --git a/plugins/extensions/qmic/kis_import_qmic_processing_visitor.cpp b/plugins/extensions/qmic/kis_import_qmic_processing_visitor.cpp
index 52b55726c9..ece1ce00af 100644
--- a/plugins/extensions/qmic/kis_import_qmic_processing_visitor.cpp
+++ b/plugins/extensions/qmic/kis_import_qmic_processing_visitor.cpp
@@ -1,94 +1,95 @@
/*
* Copyright (c) 2013 Dmitry Kazakov <dimula73@gmail.com>
* Copyright (c) 2013 Lukáš Tvrdý <lukast.dev@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <kis_transaction.h>
#include <kis_paint_device.h>
#include <kis_debug.h>
#include "kis_qmic_simple_convertor.h"
#include <kis_node.h>
#include <kis_painter.h>
#include <commands/kis_image_layer_add_command.h>
#include <kis_paint_layer.h>
#include <KoCompositeOpRegistry.h>
#include <kis_selection.h>
#include <kis_types.h>
#include "kis_import_qmic_processing_visitor.h"
#include "gmic.h"
KisImportQmicProcessingVisitor::KisImportQmicProcessingVisitor(const KisNodeListSP nodes, QVector<gmic_image<float> *> images, const QRect &dstRect, KisSelectionSP selection)
: m_nodes(nodes),
m_images(images),
m_dstRect(dstRect),
m_selection(selection)
{
qDebug() << "KisImportQmicProcessingVisitor";
}
void KisImportQmicProcessingVisitor::gmicImageToPaintDevice(gmic_image<float>& srcGmicImage,
KisPaintDeviceSP dst, KisSelectionSP selection, const QRect &dstRect)
{
qDebug() << "KisImportQmicProcessingVisitor::gmicImageToPaintDevice();";
if (selection) {
KisPaintDeviceSP src = new KisPaintDevice(dst->colorSpace());
KisQmicSimpleConvertor::convertFromGmicFast(srcGmicImage, src, 255.0f);
KisPainter painter(dst, selection);
+ painter.setCompositeOp(COMPOSITE_COPY);
painter.bitBlt(dstRect.topLeft(), src, QRect(QPoint(0,0),dstRect.size()));
}
else {
KisQmicSimpleConvertor::convertFromGmicFast(srcGmicImage, dst, 255.0f);
}
}
void KisImportQmicProcessingVisitor::visitNodeWithPaintDevice(KisNode *node, KisUndoAdapter *undoAdapter)
{
int index = m_nodes->indexOf(node);
if (index >= 0) {
gmic_image<float> *gimg = m_images[index];
qDebug() << "Importing layer index" << index << "Size: "<< gimg->_width << "x" << gimg->_height << "colorchannels: " << gimg->_spectrum;
KisPaintDeviceSP dst = node->paintDevice();
KisTransaction transaction(dst);
KisImportQmicProcessingVisitor::gmicImageToPaintDevice(*gimg, dst, m_selection, m_dstRect);
if (undoAdapter) {
transaction.commit(undoAdapter);
node->setDirty(m_dstRect);
}
}
}
void KisImportQmicProcessingVisitor::visitExternalLayer(KisExternalLayer *layer, KisUndoAdapter *undoAdapter)
{
Q_UNUSED(layer);
Q_UNUSED(undoAdapter);
}
void KisImportQmicProcessingVisitor::visitColorizeMask(KisColorizeMask *mask, KisUndoAdapter *undoAdapter)
{
Q_UNUSED(mask);
Q_UNUSED(undoAdapter);
}
diff --git a/plugins/filters/gradientmap/gradientmap.cpp b/plugins/filters/gradientmap/gradientmap.cpp
index dd5a9d7e06..db680493cb 100644
--- a/plugins/filters/gradientmap/gradientmap.cpp
+++ b/plugins/filters/gradientmap/gradientmap.cpp
@@ -1,94 +1,100 @@
/*
* This file is part of the KDE project
*
* Copyright (c) 2016 Spencer Brown <sbrown655@gmail.com>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "QObject"
#include "gradientmap.h"
#include <kpluginfactory.h>
#include <filter/kis_filter_registry.h>
#include "krita_filter_gradient_map.h"
#include "KoResourceServerProvider.h"
#include "kis_config_widget.h"
+#include <KoAbstractGradient.h>
+#include <KoStopGradient.h>
K_PLUGIN_FACTORY_WITH_JSON(KritaGradientMapFactory, "kritagradientmap.json", registerPlugin<KritaGradientMap>();)
KritaGradientMapConfigWidget::KritaGradientMapConfigWidget(QWidget *parent, KisPaintDeviceSP dev, Qt::WFlags f)
: KisConfigWidget(parent, f)
{
Q_UNUSED(dev)
m_page = new WdgGradientMap(this);
QHBoxLayout *l = new QHBoxLayout(this);
Q_CHECK_PTR(l);
l->addWidget(m_page);
l->setContentsMargins(0, 0, 0, 0);
connect(m_page->gradientchooser, SIGNAL(resourceSelected(KoResource*)), SIGNAL(sigConfigurationItemChanged()));
}
KritaGradientMapConfigWidget::~KritaGradientMapConfigWidget()
{
delete m_page;
}
void KritaGradientMapConfigWidget::gradientResourceChanged(KoResource* gradient)
{
Q_UNUSED(gradient)
}
KisPropertiesConfigurationSP KritaGradientMapConfigWidget::configuration() const
{
- KisFilterConfigurationSP cfg = new KisFilterConfiguration("gradientmap", 1);
- QString gradientName;
+ KisFilterConfigurationSP cfg = new KisFilterConfiguration("gradientmap", 2);
if (m_page && m_page->gradientchooser && m_page->gradientchooser->currentResource()) {
- gradientName = m_page->gradientchooser->currentResource()->name();
+ KoAbstractGradient *gradient = dynamic_cast<KoAbstractGradient*>(m_page->gradientchooser->currentResource());
+ KoStopGradient *stopGradient = KoStopGradient::fromQGradient(gradient->toQGradient());
+ QDomDocument doc;
+ QDomElement elt = doc.createElement("gradient");
+ stopGradient->toXML(doc, elt);
+ doc.appendChild(elt);
+ cfg->setProperty("gradientXML", doc.toString());
}
- cfg->setProperty("gradientName", gradientName);
return cfg;
}
//-----------------------------
void KritaGradientMapConfigWidget::setConfiguration(const KisPropertiesConfigurationSP config)
{
- m_page->gradientchooser->setCurrentResource(KoResourceServerProvider::instance()->gradientServer(false)->resourceByName(config->getString("gradientName")));
+ //m_page->gradientchooser->setCurrentResource(KoResourceServerProvider::instance()->gradientServer(false)->resourceByName(config->getString("gradientName")));
Q_ASSERT(config);
Q_UNUSED(config);
}
void KritaGradientMapConfigWidget::setView(KisViewManager *view)
{
Q_UNUSED(view)
}
//------------------------------
KritaGradientMap::KritaGradientMap(QObject *parent, const QVariantList &)
: QObject(parent)
{
KisFilterRegistry::instance()->add(KisFilterSP(new KritaFilterGradientMap()));
}
KritaGradientMap::~KritaGradientMap()
{
}
//-----------------------------
#include "gradientmap.moc"
diff --git a/plugins/filters/gradientmap/krita_filter_gradient_map.cpp b/plugins/filters/gradientmap/krita_filter_gradient_map.cpp
index 4d9a1a08ea..808e264cb1 100644
--- a/plugins/filters/gradientmap/krita_filter_gradient_map.cpp
+++ b/plugins/filters/gradientmap/krita_filter_gradient_map.cpp
@@ -1,103 +1,120 @@
/*
* This file is part of the KDE project
*
* Copyright (c) 2016 Spencer Brown <sbrown655@gmail.com>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "krita_filter_gradient_map.h"
#include <KoColorSpace.h>
#include <KoColor.h>
#include <kis_paint_device.h>
#include <kis_global.h>
#include <kis_types.h>
#include "kis_config_widget.h"
#include <KoResourceServerProvider.h>
#include <KoResourceServer.h>
#include <KoAbstractGradient.h>
+#include <KoStopGradient.h>
#include <KoColorSet.h>
#include "gradientmap.h"
#include <kis_sequential_iterator.h>
KritaFilterGradientMap::KritaFilterGradientMap() : KisFilter(id(), categoryMap(), i18n("&Gradient Map..."))
{
setColorSpaceIndependence(FULLY_INDEPENDENT);
setShowConfigurationWidget(true);
setSupportsLevelOfDetail(true);
setSupportsPainting(true);
- setSupportsAdjustmentLayers(false);
+ setSupportsAdjustmentLayers(true);
setSupportsThreading(true);
}
void KritaFilterGradientMap::processImpl(KisPaintDeviceSP device,
const QRect& applyRect,
const KisFilterConfigurationSP config,
KoUpdater *progressUpdater) const
{
Q_ASSERT(!device.isNull());
if (progressUpdater) {
progressUpdater->setRange(0, applyRect.height() * applyRect.width());
}
- KoAbstractGradient *gradient = KoResourceServerProvider::instance()->gradientServer(false)->resourceByName(config->getString("gradientName"));
- if (!gradient) {
- qDebug() << "Could not find gradient" << config->getString("gradientName");
- return;
+ QDomDocument doc;
+ if (config->version()==1) {
+ QDomElement elt = doc.createElement("gradient");
+ KoAbstractGradient *gradientAb = KoResourceServerProvider::instance()->gradientServer(false)->resourceByName(config->getString("gradientName"));
+ if (!gradientAb) {
+ qDebug() << "Could not find gradient" << config->getString("gradientName");
+ }
+ gradientAb = KoResourceServerProvider::instance()->gradientServer(false)->resources().first();
+ KoStopGradient::fromQGradient(gradientAb->toQGradient())->toXML(doc, elt);
+ doc.appendChild(elt);
+ } else {
+ doc.setContent(config->getString("gradientXML", ""));
}
+ KoStopGradient gradient = KoStopGradient::fromXML(doc.firstChildElement());
+
KoColorSet *gradientCache = new KoColorSet();
for (int i=0; i<256; i++) {
KoColor gc;
- gradient->colorAt(gc, ((qreal)i/255.0));
+ gradient.colorAt(gc, ((qreal)i/255.0));
KoColorSetEntry col;
col.color = gc;
gradientCache->add(col);
}
KoColor outColor(Qt::white, device->colorSpace());
KisSequentialIterator it(device, applyRect);
int p = 0;
quint8 grey;
const int pixelSize = device->colorSpace()->pixelSize();
do {
grey = device->colorSpace()->intensity8(it.oldRawData());
outColor = gradientCache->getColorGlobal((quint32)grey).color;
outColor.setOpacity(qMin(KoColor(it.oldRawData(), device->colorSpace()).opacityF(), outColor.opacityF()));
outColor.convertTo(device->colorSpace());
memcpy(it.rawData(), outColor.data(), pixelSize);
if (progressUpdater) progressUpdater->setValue(p++);
} while (it.nextPixel());
}
KisFilterConfigurationSP KritaFilterGradientMap::factoryConfiguration() const
{
- KisFilterConfigurationSP config = new KisFilterConfiguration("gradientmap", 1);
+ KisFilterConfigurationSP config = new KisFilterConfiguration("gradientmap", 2);
KoAbstractGradient *gradient = KoResourceServerProvider::instance()->gradientServer(false)->resources().first();
- config->setProperty("gradientName", gradient->name());
+ KoStopGradient stopGradient;
+ stopGradient.fromQGradient(gradient->toQGradient());
+ QDomDocument doc;
+ QDomElement elt = doc.createElement("gradient");
+ stopGradient.toXML(doc, elt);
+ doc.appendChild(elt);
+ config->setProperty("gradientXML", doc.toString());
return config;
}
KisConfigWidget * KritaFilterGradientMap::createConfigurationWidget(QWidget * parent, const KisPaintDeviceSP dev) const
{
return new KritaGradientMapConfigWidget(parent, dev);
}
diff --git a/plugins/impex/heightmap/CMakeLists.txt b/plugins/impex/heightmap/CMakeLists.txt
index db02dddacd..a8b03308d9 100644
--- a/plugins/impex/heightmap/CMakeLists.txt
+++ b/plugins/impex/heightmap/CMakeLists.txt
@@ -1,26 +1,32 @@
+add_subdirectory(tests)
+
include_directories( ${CMAKE_CURRENT_SOURCE_DIR} )
set(kritaheightmapimport_SOURCES
kis_heightmap_import.cpp
+ kis_wdg_options_heightmap.cpp
+ kis_heightmap_utils.cpp
)
ki18n_wrap_ui(kritaheightmapimport_SOURCES kis_wdg_options_heightmap.ui )
add_library(kritaheightmapimport MODULE ${kritaheightmapimport_SOURCES})
target_link_libraries(kritaheightmapimport kritaui )
install(TARGETS kritaheightmapimport DESTINATION ${KRITA_PLUGIN_INSTALL_DIR})
set(kritaheightmapexport_SOURCES
kis_heightmap_export.cpp
+ kis_wdg_options_heightmap.cpp
+ kis_heightmap_utils.cpp
)
ki18n_wrap_ui(kritaheightmapexport_SOURCES kis_wdg_options_heightmap.ui )
add_library(kritaheightmapexport MODULE ${kritaheightmapexport_SOURCES})
target_link_libraries(kritaheightmapexport kritaui kritaimpex)
install(TARGETS kritaheightmapexport DESTINATION ${KRITA_PLUGIN_INSTALL_DIR})
install( PROGRAMS krita_heightmap.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})
diff --git a/plugins/impex/heightmap/kis_heightmap_export.cpp b/plugins/impex/heightmap/kis_heightmap_export.cpp
index fb965db532..90af136a80 100644
--- a/plugins/impex/heightmap/kis_heightmap_export.cpp
+++ b/plugins/impex/heightmap/kis_heightmap_export.cpp
@@ -1,140 +1,149 @@
/*
* Copyright (c) 2014 Boudewijn Rempt <boud@valdyas.org>
+ * Copyright (c) 2017 Victor Wåhlström <victor.wahlstrom@initiali.se>
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "kis_heightmap_export.h"
#include <qendian.h>
#include <QDataStream>
#include <QApplication>
#include <kpluginfactory.h>
#include <KoColorSpace.h>
#include <KoColorSpaceConstants.h>
#include <KoColorSpaceTraits.h>
#include <KoColorSpaceRegistry.h>
#include <KoColorModelStandardIds.h>
#include <KisImportExportManager.h>
#include <KisExportCheckRegistry.h>
-#include <kis_debug.h>
#include <KisDocument.h>
#include <kis_image.h>
#include <kis_paint_device.h>
#include <kis_properties_configuration.h>
#include <kis_config.h>
#include <kis_iterator_ng.h>
#include <kis_random_accessor_ng.h>
#include <kis_config_widget.h>
+#include "kis_wdg_options_heightmap.h"
+#include "kis_heightmap_utils.h"
+
K_PLUGIN_FACTORY_WITH_JSON(KisHeightMapExportFactory, "krita_heightmap_export.json", registerPlugin<KisHeightMapExport>();)
+template<typename T>
+static void writeData(KisPaintDeviceSP pd, const QRect &bounds, QDataStream &out_stream)
+{
+ KIS_ASSERT_RECOVER_RETURN(pd);
+
+ KisSequentialConstIterator it(pd, bounds);
+ do {
+ out_stream << KoGrayTraits<T>::gray(const_cast<quint8*>(it.rawDataConst()));
+ } while(it.nextPixel());
+}
+
KisHeightMapExport::KisHeightMapExport(QObject *parent, const QVariantList &) : KisImportExportFilter(parent)
{
}
KisHeightMapExport::~KisHeightMapExport()
{
}
-KisPropertiesConfigurationSP KisHeightMapExport::defaultConfiguration(const QByteArray &/*from*/, const QByteArray &/*to*/) const
+KisPropertiesConfigurationSP KisHeightMapExport::defaultConfiguration(const QByteArray &from, const QByteArray &to) const
{
+ Q_UNUSED(from);
+ Q_UNUSED(to);
KisPropertiesConfigurationSP cfg = new KisPropertiesConfiguration();
cfg->setProperty("endianness", 0);
return cfg;
}
-KisConfigWidget *KisHeightMapExport::createConfigurationWidget(QWidget *parent, const QByteArray &/*from*/, const QByteArray &/*to*/) const
+KisConfigWidget *KisHeightMapExport::createConfigurationWidget(QWidget *parent, const QByteArray &from, const QByteArray &to) const
{
- return new KisWdgOptionsHeightmap(parent);
+ Q_UNUSED(from);
+ Q_UNUSED(to);
+ bool export_mode = true;
+ KisWdgOptionsHeightmap* wdg = new KisWdgOptionsHeightmap(parent, export_mode);
+ return wdg;
}
void KisHeightMapExport::initializeCapabilities()
{
if (mimeType() == "image/x-r8") {
QList<QPair<KoID, KoID> > supportedColorModels;
supportedColorModels << QPair<KoID, KoID>()
<< QPair<KoID, KoID>(GrayAColorModelID, Integer8BitsColorDepthID);
addSupportedColorModels(supportedColorModels, "R8 Heightmap");
}
else if (mimeType() == "image/x-r16") {
QList<QPair<KoID, KoID> > supportedColorModels;
supportedColorModels << QPair<KoID, KoID>()
<< QPair<KoID, KoID>(GrayAColorModelID, Integer16BitsColorDepthID);
addSupportedColorModels(supportedColorModels, "R16 Heightmap");
}
+ else if (mimeType() == "image/x-r32") {
+ QList<QPair<KoID, KoID> > supportedColorModels;
+ supportedColorModels << QPair<KoID, KoID>()
+ << QPair<KoID, KoID>(GrayAColorModelID, Float32BitsColorDepthID);
+ addSupportedColorModels(supportedColorModels, "R32 Heightmap");
+ }
}
KisImportExportFilter::ConversionStatus KisHeightMapExport::convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration)
{
- KisImageSP image = document->savingImage();
-
- if (image->width() != image->height()) {
- document->setErrorMessage(i18n("Cannot export this image to a heightmap: it is not square"));
- return KisImportExportFilter::WrongFormat;
- }
+ KIS_ASSERT_RECOVER_RETURN_VALUE(mimeType() == "image/x-r16" || mimeType() == "image/x-r8" || mimeType() == "image/x-r32", KisImportExportFilter::WrongFormat);
- configuration->setProperty("width", image->width());
-
- QDataStream::ByteOrder bo = configuration->getInt("endianness", 0) ? QDataStream::BigEndian : QDataStream::LittleEndian;
-
- bool downscale = false;
+ KisImageSP image = document->savingImage();
+ QDataStream::ByteOrder bo = configuration->getInt("endianness", 1) == 0 ? QDataStream::BigEndian : QDataStream::LittleEndian;
KisPaintDeviceSP pd = new KisPaintDevice(*image->projection());
QDataStream s(io);
s.setByteOrder(bo);
+ // needed for 32bit float data
+ s.setFloatingPointPrecision(QDataStream::SinglePrecision);
- KisRandomConstAccessorSP it = pd->createRandomConstAccessorNG(0, 0);
- bool r16 = ((image->colorSpace()->colorDepthId() == Integer16BitsColorDepthID) && !downscale);
- for (int i = 0; i < image->height(); ++i) {
- for (int j = 0; j < image->width(); ++j) {
- it->moveTo(i, j);
- if (r16) {
- s << KoGrayU16Traits::gray(const_cast<quint8*>(it->rawDataConst()));
- }
- else {
- s << KoGrayU8Traits::gray(const_cast<quint8*>(it->rawDataConst()));
- }
- }
- }
- return KisImportExportFilter::OK;
-}
-
+ KoID target_co_model = GrayAColorModelID;
+ KoID target_co_depth = KisHeightmapUtils::mimeTypeToKoID(mimeType());
+ KIS_ASSERT(!target_co_depth.id().isNull());
-void KisWdgOptionsHeightmap::setConfiguration(const KisPropertiesConfigurationSP cfg)
-{
- intSize->setValue(cfg->getInt("width"));
- int endianness = cfg->getInt("endianness", 0);
- radioMac->setChecked(endianness == 0);
-}
+ if (pd->colorSpace()->colorModelId() != target_co_model || pd->colorSpace()->colorDepthId() != target_co_depth) {
+ pd = new KisPaintDevice(*pd.data());
+ KUndo2Command *cmd = pd->convertTo(KoColorSpaceRegistry::instance()->colorSpace(target_co_model.id(), target_co_depth.id()));
+ delete cmd;
+ }
-KisPropertiesConfigurationSP KisWdgOptionsHeightmap::configuration() const
-{
- KisPropertiesConfigurationSP cfg = new KisPropertiesConfiguration();
- if (radioMac->isChecked()) {
- cfg->setProperty("endianness", 0);
+ if (target_co_depth == Float32BitsColorDepthID) {
+ writeData<float>(pd, image->bounds(), s);
+ }
+ else if (target_co_depth == Integer16BitsColorDepthID) {
+ writeData<quint16>(pd, image->bounds(), s);
+ }
+ else if (target_co_depth == Integer8BitsColorDepthID) {
+ writeData<quint8>(pd, image->bounds(), s);
}
else {
- cfg->setProperty("endianness", 1);
+ return KisImportExportFilter::InternalError;
}
- return cfg;
+ return KisImportExportFilter::OK;
}
#include "kis_heightmap_export.moc"
diff --git a/plugins/impex/heightmap/kis_heightmap_export.h b/plugins/impex/heightmap/kis_heightmap_export.h
index 0e669f1547..f686961e27 100644
--- a/plugins/impex/heightmap/kis_heightmap_export.h
+++ b/plugins/impex/heightmap/kis_heightmap_export.h
@@ -1,57 +1,41 @@
/*
* Copyright (c) 2014 Boudewijn Rempt <boud@valdyas.org>
+ * Copyright (c) 2017 Victor Wåhlström <victor.wahlstrom@initiali.se>
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef _KIS_HeightMap_EXPORT_H_
#define _KIS_HeightMap_EXPORT_H_
#include <QVariant>
#include <KisImportExportFilter.h>
#include <kis_config_widget.h>
-#include "ui_kis_wdg_options_heightmap.h"
-
-class KisWdgOptionsHeightmap : public KisConfigWidget, public Ui::WdgOptionsHeightMap
-{
- Q_OBJECT
-
-public:
- KisWdgOptionsHeightmap(QWidget *parent)
- : KisConfigWidget(parent)
- {
- setupUi(this);
- }
-
- void setConfiguration(const KisPropertiesConfigurationSP cfg) override;
- KisPropertiesConfigurationSP configuration() const override;
-};
-
class KisHeightMapExport : public KisImportExportFilter
{
Q_OBJECT
public:
KisHeightMapExport(QObject *parent, const QVariantList &);
~KisHeightMapExport() override;
KisPropertiesConfigurationSP defaultConfiguration(const QByteArray& from = "", const QByteArray& to = "") const override;
KisConfigWidget *createConfigurationWidget(QWidget *parent, const QByteArray& from = "", const QByteArray& to = "") const override;
void initializeCapabilities() override;
KisImportExportFilter::ConversionStatus convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration = 0) override;
};
#endif
diff --git a/plugins/impex/heightmap/kis_heightmap_import.cpp b/plugins/impex/heightmap/kis_heightmap_import.cpp
index 67acab26c7..9faa5ebfaf 100644
--- a/plugins/impex/heightmap/kis_heightmap_import.cpp
+++ b/plugins/impex/heightmap/kis_heightmap_import.cpp
@@ -1,160 +1,184 @@
/*
* Copyright (c) 2014 Boudewijn Rempt <boud@valdyas.org>
+ * Copyright (c) 2017 Victor Wåhlström <victor.wahlstrom@initiali.se>
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "kis_heightmap_import.h"
#include <ctype.h>
#include <QApplication>
-#include <QFile>
#include <qendian.h>
-#include <QCursor>
#include <kpluginfactory.h>
-#include <QFileInfo>
#include <KoDialog.h>
#include <KisImportExportManager.h>
#include <KoColorSpaceRegistry.h>
#include <KoColorModelStandardIds.h>
#include <KoColorSpace.h>
#include <KoColorSpaceTraits.h>
#include <kis_debug.h>
#include <KisDocument.h>
#include <kis_group_layer.h>
#include <kis_image.h>
#include <kis_paint_layer.h>
#include <kis_paint_device.h>
#include <kis_transaction.h>
#include <kis_iterator_ng.h>
#include <kis_random_accessor_ng.h>
#include <kis_config.h>
-#include "ui_kis_wdg_options_heightmap.h"
+#include "kis_wdg_options_heightmap.h"
+#include "kis_heightmap_utils.h"
K_PLUGIN_FACTORY_WITH_JSON(HeightMapImportFactory, "krita_heightmap_import.json", registerPlugin<KisHeightMapImport>();)
+template<typename T>
+void fillData(KisPaintDeviceSP pd, int w, int h, QDataStream &stream) {
+ KIS_ASSERT_RECOVER_RETURN(pd);
+
+ T pixel;
+
+ for (int i = 0; i < h; ++i) {
+ KisHLineIteratorSP it = pd->createHLineIteratorNG(0, i, w);
+ do {
+ stream >> pixel;
+ KoGrayTraits<T>::setGray(it->rawData(), pixel);
+ KoGrayTraits<T>::setOpacity(it->rawData(), OPACITY_OPAQUE_F, 1);
+ } while(it->nextPixel());
+ }
+}
+
KisHeightMapImport::KisHeightMapImport(QObject *parent, const QVariantList &) : KisImportExportFilter(parent)
{
}
KisHeightMapImport::~KisHeightMapImport()
{
}
-KisImportExportFilter::ConversionStatus KisHeightMapImport::convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration)
+KisImportExportFilter::ConversionStatus KisHeightMapImport::convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration)
{
Q_UNUSED(configuration);
- KoID depthId;
- if (mimeType() == "image/x-r8") {
- depthId = Integer8BitsColorDepthID;
- }
- else if (mimeType() == "image/x-r16") {
- depthId = Integer16BitsColorDepthID;
- }
- else {
- document->setErrorMessage(i18n("The file is not 8 or 16 bits raw"));
+ KoID depthId = KisHeightmapUtils::mimeTypeToKoID(mimeType());
+ if (depthId.id().isNull()) {
+ document->setErrorMessage(i18n("Unknown file type"));
return KisImportExportFilter::WrongFormat;
}
QApplication::restoreOverrideCursor();
KoDialog* kdb = new KoDialog(0);
- kdb->setWindowTitle(i18n("R16 HeightMap Import Options"));
+ kdb->setWindowTitle(i18n("Heightmap Import Options"));
kdb->setButtons(KoDialog::Ok | KoDialog::Cancel);
- Ui::WdgOptionsHeightMap optionsHeightMap;
-
- QWidget* wdg = new QWidget(kdb);
- optionsHeightMap.setupUi(wdg);
+ KisWdgOptionsHeightmap* wdg = new KisWdgOptionsHeightmap(kdb);
kdb->setMainWidget(wdg);
- QString filterConfig = KisConfig().exportConfiguration("HeightMap");
+ connect(wdg, SIGNAL(statusUpdated(bool)), kdb, SLOT(enableButtonOk(bool)));
+
+ KisConfig config;
+
+ QString filterConfig = config.importConfiguration(mimeType());
KisPropertiesConfigurationSP cfg(new KisPropertiesConfiguration);
cfg->fromXML(filterConfig);
int w = 0;
int h = 0;
- optionsHeightMap.intSize->setValue(0);
- int endianness = cfg->getInt("endianness", 0);
+ int endianness = cfg->getInt("endianness", 1);
if (endianness == 0) {
- optionsHeightMap.radioMac->setChecked(true);
+ wdg->radioBig->setChecked(true);
}
else {
- optionsHeightMap.radioPC->setChecked(true);
+ wdg->radioLittle->setChecked(true);
+ }
+
+ KIS_ASSERT(io->isOpen());
+ quint64 size = io->size();
+
+ wdg->fileSizeLabel->setText(QString::number(size));
+
+ if(depthId == Integer8BitsColorDepthID) {
+ wdg->bppLabel->setText(QString::number(8));
+ wdg->typeLabel->setText("Integer");
+ }
+ else if(depthId == Integer16BitsColorDepthID) {
+ wdg->bppLabel->setText(QString::number(16));
+ wdg->typeLabel->setText("Integer");
+ }
+ else if(depthId == Float32BitsColorDepthID) {
+ wdg->bppLabel->setText(QString::number(32));
+ wdg->typeLabel->setText("Float");
+ }
+ else {
+ return KisImportExportFilter::InternalError;
}
if (!batchMode()) {
if (kdb->exec() == QDialog::Rejected) {
return KisImportExportFilter::UserCancelled;
}
}
- w = h = optionsHeightMap.intSize->value();
+ cfg->setProperty("endianness", wdg->radioBig->isChecked() ? 0 : 1);
+
+ config.setImportConfiguration(mimeType(), cfg);
-// if ((w * h * (mimeType() == "image/x-r16" ? 2 : 1)) != f.size()) {
-// document->setErrorMessage(i18n("Source file is not the right size for the specified width and height."));
-// return KisImportExportFilter::WrongFormat;
-// }
+ w = wdg->widthInput->value();
+ h = wdg->heightInput->value();
QDataStream::ByteOrder bo = QDataStream::LittleEndian;
cfg->setProperty("endianness", 1);
- if (optionsHeightMap.radioMac->isChecked()) {
+ if (wdg->radioBig->isChecked()) {
bo = QDataStream::BigEndian;
cfg->setProperty("endianness", 0);
}
KisConfig().setExportConfiguration(mimeType(), cfg);
QDataStream s(io);
s.setByteOrder(bo);
+ // needed for 32bit float data
+ s.setFloatingPointPrecision(QDataStream::SinglePrecision);
const KoColorSpace *colorSpace = KoColorSpaceRegistry::instance()->colorSpace(GrayAColorModelID.id(), depthId.id(), 0);
KisImageSP image = new KisImage(document->createUndoStore(), w, h, colorSpace, "imported heightmap");
KisPaintLayerSP layer = new KisPaintLayer(image, image->nextLayerName(), 255);
- KisRandomAccessorSP it = layer->paintDevice()->createRandomAccessorNG(0, 0);
- bool r16 = (depthId == Integer16BitsColorDepthID);
- for (int i = 0; i < h; ++i) {
- for (int j = 0; j < w; ++j) {
- it->moveTo(i, j);
-
- if (r16) {
- quint16 pixel;
- s >> pixel;
- KoGrayU16Traits::setGray(it->rawData(), pixel);
- KoGrayU16Traits::setOpacity(it->rawData(), OPACITY_OPAQUE_F, 1);
- }
- else {
- quint8 pixel;
- s >> pixel;
- KoGrayU8Traits::setGray(it->rawData(), pixel);
- KoGrayU8Traits::setOpacity(it->rawData(), OPACITY_OPAQUE_F, 1);
- }
- }
+ if (depthId == Float32BitsColorDepthID) {
+ fillData<float>(layer->paintDevice(), w, h, s);
+ }
+ else if (depthId == Integer16BitsColorDepthID) {
+ fillData<quint16>(layer->paintDevice(), w, h, s);
+ }
+ else if (depthId == Integer8BitsColorDepthID) {
+ fillData<quint8>(layer->paintDevice(), w, h, s);
+ }
+ else {
+ return KisImportExportFilter::InternalError;
}
image->addNode(layer.data(), image->rootLayer().data());
document->setCurrentImage(image);
return KisImportExportFilter::OK;
}
#include "kis_heightmap_import.moc"
diff --git a/plugins/impex/heightmap/kis_heightmap_import.h b/plugins/impex/heightmap/kis_heightmap_import.h
index 518298fb59..94f1df9449 100644
--- a/plugins/impex/heightmap/kis_heightmap_import.h
+++ b/plugins/impex/heightmap/kis_heightmap_import.h
@@ -1,38 +1,38 @@
/*
* Copyright (c) 2014 Boudewijn Rempt <boud@valdyas.org>
+ * Copyright (c) 2017 Victor Wåhlström <victor.wahlstrom@initiali.se>
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef _KIS_HeightMap_IMPORT_H_
#define _KIS_HeightMap_IMPORT_H_
#include <QVariant>
#include <KisImportExportFilter.h>
-
class KisHeightMapImport : public KisImportExportFilter
{
Q_OBJECT
public:
KisHeightMapImport(QObject *parent, const QVariantList &);
~KisHeightMapImport() override;
public:
KisImportExportFilter::ConversionStatus convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration = 0) override;
};
#endif
diff --git a/plugins/impex/heightmap/kis_heightmap_import.h b/plugins/impex/heightmap/kis_heightmap_utils.cpp
similarity index 59%
copy from plugins/impex/heightmap/kis_heightmap_import.h
copy to plugins/impex/heightmap/kis_heightmap_utils.cpp
index 518298fb59..d1005a873f 100644
--- a/plugins/impex/heightmap/kis_heightmap_import.h
+++ b/plugins/impex/heightmap/kis_heightmap_utils.cpp
@@ -1,38 +1,37 @@
/*
- * Copyright (c) 2014 Boudewijn Rempt <boud@valdyas.org>
+ * Copyright (c) 2017 Victor Wåhlström <victor.wahlstrom@initiali.se>
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
-#ifndef _KIS_HeightMap_IMPORT_H_
-#define _KIS_HeightMap_IMPORT_H_
+#include "kis_heightmap_utils.h"
-#include <QVariant>
+#include <KoColorModelStandardIds.h>
+#include <QByteArray>
-#include <KisImportExportFilter.h>
-
-
-class KisHeightMapImport : public KisImportExportFilter
+KoID KisHeightmapUtils::mimeTypeToKoID(const QByteArray& mimeType)
{
- Q_OBJECT
-public:
- KisHeightMapImport(QObject *parent, const QVariantList &);
- ~KisHeightMapImport() override;
-public:
- KisImportExportFilter::ConversionStatus convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration = 0) override;
-};
-
-#endif
+ if (mimeType == "image/x-r8") {
+ return Integer8BitsColorDepthID;
+ }
+ else if (mimeType == "image/x-r16") {
+ return Integer16BitsColorDepthID;
+ }
+ else if (mimeType == "image/x-r32") {
+ return Float32BitsColorDepthID;
+ }
+ return KoID();
+}
diff --git a/plugins/impex/heightmap/kis_heightmap_import.h b/plugins/impex/heightmap/kis_heightmap_utils.h
similarity index 59%
copy from plugins/impex/heightmap/kis_heightmap_import.h
copy to plugins/impex/heightmap/kis_heightmap_utils.h
index 518298fb59..d5ecb0f3a4 100644
--- a/plugins/impex/heightmap/kis_heightmap_import.h
+++ b/plugins/impex/heightmap/kis_heightmap_utils.h
@@ -1,38 +1,30 @@
/*
- * Copyright (c) 2014 Boudewijn Rempt <boud@valdyas.org>
+ * Copyright (c) 2017 Victor Wåhlström <victor.wahlstrom@initiali.se>
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
-#ifndef _KIS_HeightMap_IMPORT_H_
-#define _KIS_HeightMap_IMPORT_H_
+#ifndef _KIS_HEIGHTMAP_UTILS_H_
+#define _KIS_HEIGHTMAP_UTILS_H_
-#include <QVariant>
+#include <KoID.h>
-#include <KisImportExportFilter.h>
-
-
-class KisHeightMapImport : public KisImportExportFilter
+namespace KisHeightmapUtils
{
- Q_OBJECT
-public:
- KisHeightMapImport(QObject *parent, const QVariantList &);
- ~KisHeightMapImport() override;
-public:
- KisImportExportFilter::ConversionStatus convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration = 0) override;
-};
+KoID mimeTypeToKoID(const class QByteArray& mimeType);
+}
-#endif
+#endif // _KIS_HEIGHTMAP_UTILS_H_
diff --git a/plugins/impex/heightmap/kis_wdg_options_heightmap.cpp b/plugins/impex/heightmap/kis_wdg_options_heightmap.cpp
new file mode 100644
index 0000000000..64ad4a10fe
--- /dev/null
+++ b/plugins/impex/heightmap/kis_wdg_options_heightmap.cpp
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 2017 Victor Wåhlström <victor.wahlstrom@initiali.se>
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "kis_wdg_options_heightmap.h"
+
+#include <QtMath>
+#include <QToolTip>
+
+#include <kis_assert.h>
+#include <kis_paint_layer.h>
+
+static constexpr quint32 nextPow2(quint32 n)
+{
+ return ((((((n - 1) | n >> 1) | n >> 2) | n >> 4) | n >> 8) | n >> 16) + 1 + (quint32)(n == 0);
+}
+
+static constexpr quint32 prevPow2(quint32 n)
+{
+ return nextPow2(n) >> 1;
+}
+
+static void showErrorTooltip(const QString &msg)
+{
+ QToolTip::showText(QCursor::pos(), i18n("Error: ") + msg);
+}
+
+KisWdgOptionsHeightmap::KisWdgOptionsHeightmap(QWidget *parent)
+ : KisWdgOptionsHeightmap(parent, false)
+{
+}
+
+KisWdgOptionsHeightmap::KisWdgOptionsHeightmap(QWidget *parent, bool export_mode)
+ : KisConfigWidget(parent)
+ , m_exportMode(export_mode)
+{
+ setupUi(this);
+
+ if (m_exportMode) {
+ dimensionsGroupBox->setVisible(false);
+ fileSizeDescLabel->setVisible(false);
+ fileSizeLabel->setVisible(false);
+ bppDescLabel->setVisible(false);
+ bppLabel->setVisible(false);
+ }
+ else {
+ connect(guessButton, SIGNAL(clicked(bool)), this, SLOT(guessDimensions()));
+ connect(widthInput, SIGNAL(valueChanged(int)), this, SLOT(widthChanged(int)));
+ connect(heightInput, SIGNAL(valueChanged(int)), this, SLOT(heightChanged(int)));
+ }
+}
+
+void KisWdgOptionsHeightmap::setConfiguration(const KisPropertiesConfigurationSP cfg)
+{
+ int endianness = cfg->getInt("endianness", 1);
+ if (endianness == 0) {
+ radioBig->setChecked(true);
+ }
+ else {
+ radioLittle->setChecked(true);
+ }
+}
+
+KisPropertiesConfigurationSP KisWdgOptionsHeightmap::configuration() const
+{
+ KisPropertiesConfigurationSP cfg = new KisPropertiesConfiguration();
+ if (radioBig->isChecked()) {
+ cfg->setProperty("endianness", 0);
+ }
+ else {
+ cfg->setProperty("endianness", 1);
+ }
+ return cfg;
+}
+
+void KisWdgOptionsHeightmap::showEvent(QShowEvent *event)
+{
+ updateStatus();
+ QWidget::showEvent(event);
+}
+
+void KisWdgOptionsHeightmap::updateStatus()
+{
+ if (m_exportMode)
+ return;
+ bool ok;
+ int fileSize = fileSizeLabel->text().toInt(&ok);
+ KIS_ASSERT_RECOVER_RETURN(ok);
+ KIS_ASSERT_RECOVER_RETURN(fileSize > 0);
+ int w = widthInput->value();
+ int h = heightInput->value();
+
+ quint32 depth = bppLabel->text().toUInt(&ok);
+ KIS_ASSERT_RECOVER_RETURN(ok);
+
+ QString old_status = statusLabel->text();
+
+ int bytesPerPixel = depth / 8;
+ int dataSize = w * h * bytesPerPixel;
+
+ bool status_ok = false;
+
+ QString fileMismatch = i18n("Input does not match file size");
+ if (w == 0 && h == 0) {
+ statusLabel->setText(i18n("Please specify width and height"));
+ }
+ else if (w == 0) {
+ statusLabel->setText(i18n("Please specify width"));
+ }
+ else if (h == 0) {
+ statusLabel->setText(i18n("Please specify height"));
+ }
+ else if (dataSize != fileSize) {
+ statusLabel->setText(fileMismatch);
+ }
+ else {
+ statusLabel->setText("");
+ status_ok = true;
+ }
+
+ if (old_status.compare(statusLabel->text()) != 0) {
+ emit statusUpdated(status_ok);
+ }
+}
+
+void KisWdgOptionsHeightmap::widthChanged(int i)
+{
+ Q_UNUSED(i);
+ updateStatus();
+}
+
+void KisWdgOptionsHeightmap::heightChanged(int i)
+{
+ Q_UNUSED(i);
+ updateStatus();
+}
+
+void KisWdgOptionsHeightmap::guessDimensions()
+{
+ quint32 w = widthInput->value();
+ quint32 h = heightInput->value();
+
+ bool ok;
+ quint32 fileSize = fileSizeLabel->text().toUInt(&ok);
+ KIS_ASSERT_RECOVER_RETURN(ok);
+
+ quint32 depth = bppLabel->text().toUInt(&ok);
+ KIS_ASSERT_RECOVER_RETURN(ok);
+
+ quint32 bytesPerPixel = depth / 8;
+
+ w = widthInput->text().toUInt(&ok);
+ KIS_ASSERT_RECOVER_RETURN(ok);
+
+ h = heightInput->text().toUInt(&ok);
+ KIS_ASSERT_RECOVER_RETURN(ok);
+
+ quint32 dimensions = fileSize / bytesPerPixel;
+
+ if (w > 0 && h > 0) {
+ if (w * h == dimensions) {
+ // toggle landscape/portrait orientation
+ widthInput->setValue(h);
+ heightInput->setValue(w);
+ }
+ }
+ else if (w == 0 && h == 0) {
+ quint32 r = (quint32)(qFloor(qSqrt(dimensions) + 0.5));
+
+ // First guess, square image?
+ if (r*r == dimensions) {
+ widthInput->setValue(r);
+ heightInput->setValue(r);
+ }
+ else {
+ // second guess, power of two?
+ w = prevPow2(r);
+ h = dimensions / w + (dimensions % w);
+ if (w * h != dimensions) {
+ showErrorTooltip(i18n("Too many possible combinations. Input a width or height and try again."));
+ return;
+ }
+
+ // prefer landscape orientation
+ widthInput->setValue(w > h ? w : h);
+ heightInput->setValue(w > h ? h : w);
+
+ // TODO: cycle through other pow2 combinations if called multiple times?
+ }
+ }
+ else if (w > 0) {
+ if (w > dimensions) {
+ showErrorTooltip(i18n("Width exceeds available pixels."));
+ return;
+ }
+ h = dimensions / w + (dimensions % w);
+ if (w * h != dimensions) {
+ showErrorTooltip(i18n("Unable to calculate an appropriate height. File does not contain enough pixels to form a rectangle."));
+ return;
+ }
+ heightInput->setValue(h);
+ }
+ else {
+ if (h > dimensions) {
+ showErrorTooltip(i18n("Height exceeds available pixels."));
+ return;
+ }
+ w = dimensions / h + (dimensions % h);
+ if (w * h != dimensions) {
+ showErrorTooltip(i18n("Unable to calculate an appropriate width. File does not contain enough pixels to form a rectangle."));
+ return;
+ }
+ widthInput->setValue(w);
+ }
+}
diff --git a/plugins/impex/heightmap/kis_wdg_options_heightmap.h b/plugins/impex/heightmap/kis_wdg_options_heightmap.h
new file mode 100644
index 0000000000..905483b03b
--- /dev/null
+++ b/plugins/impex/heightmap/kis_wdg_options_heightmap.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2017 Victor Wåhlström <victor.wahlstrom@initiali.se>
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _KIS_WDG_OPTIONS_HEIGHTMAP_H_
+#define _KIS_WDG_OPTIONS_HEIGHTMAP_H_
+
+#include <kis_config_widget.h>
+#include "ui_kis_wdg_options_heightmap.h"
+
+class KisWdgOptionsHeightmap : public KisConfigWidget, public Ui::WdgOptionsHeightMap
+{
+ Q_OBJECT
+
+public:
+ explicit KisWdgOptionsHeightmap(QWidget *parent);
+ explicit KisWdgOptionsHeightmap(QWidget *parent, bool export_mode);
+
+Q_SIGNALS:
+ void statusUpdated(bool status);
+
+protected:
+ void showEvent(QShowEvent *event) override;
+ void setConfiguration(const KisPropertiesConfigurationSP cfg) override;
+ KisPropertiesConfigurationSP configuration() const override;
+
+private Q_SLOTS:
+ void guessDimensions();
+ void widthChanged(int i);
+ void heightChanged(int i);
+
+private:
+ void updateStatus();
+ bool m_exportMode;
+};
+
+#endif // _KIS_WDG_OPTIONS_HEIGHTMAP_H_
diff --git a/plugins/impex/heightmap/kis_wdg_options_heightmap.ui b/plugins/impex/heightmap/kis_wdg_options_heightmap.ui
index 9805b040f1..f6bf64afd0 100644
--- a/plugins/impex/heightmap/kis_wdg_options_heightmap.ui
+++ b/plugins/impex/heightmap/kis_wdg_options_heightmap.ui
@@ -1,95 +1,220 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WdgOptionsHeightMap</class>
<widget class="QWidget" name="WdgOptionsHeightMap">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
- <width>191</width>
- <height>145</height>
+ <width>355</width>
+ <height>319</height>
</rect>
</property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="2" column="1">
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
- <widget class="QLabel" name="label_3">
+ <widget class="QLabel" name="fileSizeDescLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text">
- <string>Size:</string>
+ <string>File size:</string>
</property>
</widget>
</item>
<item row="0" column="1">
- <widget class="KisIntParseSpinBox" name="intSize">
- <property name="maximum">
- <number>1000000</number>
+ <widget class="QLabel" name="fileSizeLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>File size (bytes)</string>
+ </property>
+ <property name="text">
+ <string>0</string>
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="label">
+ <item row="3" column="0">
+ <widget class="QLabel" name="endiannessLabel">
<property name="text">
<string>Endianness:</string>
</property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
- </property>
</widget>
</item>
- <item row="1" column="1">
+ <item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
- <widget class="QGroupBox" name="groupBox_2">
- <property name="title">
- <string/>
+ <widget class="QRadioButton" name="radioLittle">
+ <property name="toolTip">
+ <string>Little Endian</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QRadioButton" name="radioMac">
- <property name="toolTip">
- <string>Big Endian</string>
- </property>
- <property name="text">
- <string>&amp;Mac</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioPC">
- <property name="toolTip">
- <string>Little Endian</string>
- </property>
- <property name="text">
- <string>PC</string>
- </property>
- </widget>
- </item>
- </layout>
+ <property name="text">
+ <string>&amp;Little</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">endiannessButtonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="radioBig">
+ <property name="toolTip">
+ <string>Big Endian</string>
+ </property>
+ <property name="text">
+ <string>&amp;Big</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">endiannessButtonGroup</string>
+ </attribute>
</widget>
</item>
</layout>
</item>
+ <item row="5" column="0" colspan="2">
+ <widget class="QGroupBox" name="dimensionsGroupBox">
+ <property name="title">
+ <string/>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="4" column="0" colspan="3">
+ <widget class="QPushButton" name="guessButton">
+ <property name="toolTip">
+ <string>Guess width and height based on file size and bits per pixel. Only values set to 0 will be updated.</string>
+ </property>
+ <property name="text">
+ <string>Guess dimensions</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="heightLabel">
+ <property name="text">
+ <string>Height:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="pxLabel">
+ <property name="text">
+ <string>px</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QSpinBox" name="heightInput">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>Height of image in pixels.</string>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QLabel" name="pxLabel2">
+ <property name="text">
+ <string>px</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="widthInput">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>Width of image in pixels.</string>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="widthLabel">
+ <property name="text">
+ <string>Width:</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="6" column="0" colspan="2">
+ <widget class="QLabel" name="statusLabel">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="bppDescLabel">
+ <property name="text">
+ <string>Bits per pixel:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="bppLabel">
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="typeDescLabel">
+ <property name="text">
+ <string>Type:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="typeLabel">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
- <customwidgets>
- <customwidget>
- <class>KisIntParseSpinBox</class>
- <extends>QSpinBox</extends>
- <header>kis_int_parse_spin_box.h</header>
- </customwidget>
- </customwidgets>
+ <tabstops>
+ <tabstop>radioLittle</tabstop>
+ <tabstop>radioBig</tabstop>
+ <tabstop>widthInput</tabstop>
+ <tabstop>heightInput</tabstop>
+ <tabstop>guessButton</tabstop>
+ </tabstops>
<resources/>
<connections/>
+ <buttongroups>
+ <buttongroup name="endiannessButtonGroup"/>
+ </buttongroups>
</ui>
diff --git a/plugins/impex/heightmap/krita_heightmap_export.json b/plugins/impex/heightmap/krita_heightmap_export.json
index fe1b861c89..0f100aa61e 100644
--- a/plugins/impex/heightmap/krita_heightmap_export.json
+++ b/plugins/impex/heightmap/krita_heightmap_export.json
@@ -1,14 +1,14 @@
{
"Icon": "",
- "Id": "Krita HeightMap Export Filter",
+ "Id": "Krita Heightmap Export Filter",
"NoDisplay": "true",
"Type": "Service",
- "X-KDE-Export": "image/x-r16,image/x-r8",
-
+
+ "X-KDE-Export": "image/x-r32,image/x-r16,image/x-r8",
"X-KDE-Library": "kritaheightmapexport",
"X-KDE-ServiceTypes": [
"Krita/FileFilter"
],
"X-KDE-Weight": "1",
- "X-KDE-Extensions" : "r16,r8"
+ "X-KDE-Extensions" : "r32,r16,r8"
}
diff --git a/plugins/impex/heightmap/krita_heightmap_import.json b/plugins/impex/heightmap/krita_heightmap_import.json
index 03ae647d17..8c1ea9a41e 100644
--- a/plugins/impex/heightmap/krita_heightmap_import.json
+++ b/plugins/impex/heightmap/krita_heightmap_import.json
@@ -1,14 +1,14 @@
{
"Icon": "",
- "Id": "Krita HeightMap Import Filter",
+ "Id": "Krita Heightmap Import Filter",
"NoDisplay": "true",
"Type": "Service",
- "X-KDE-Import": "image/x-r16,image/x-r8",
+ "X-KDE-Import": "image/x-r32,image/x-r16,image/x-r8",
"X-KDE-Library": "kritaheightmapimport",
"X-KDE-ServiceTypes": [
"Krita/FileFilter"
],
"X-KDE-Weight": "1",
- "X-KDE-Extensions" : "r16,r8"
+ "X-KDE-Extensions" : "r32,r16,r8"
}
diff --git a/plugins/impex/heightmap/tests/CMakeLists.txt b/plugins/impex/heightmap/tests/CMakeLists.txt
new file mode 100644
index 0000000000..2da4b34417
--- /dev/null
+++ b/plugins/impex/heightmap/tests/CMakeLists.txt
@@ -0,0 +1,10 @@
+set( EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR} )
+include_directories( ${CMAKE_SOURCE_DIR}/sdk/tests )
+
+include(KritaAddBrokenUnitTest)
+
+macro_add_unittest_definitions()
+
+krita_add_broken_unit_test(kis_heightmap_test.cpp
+ TEST_NAME krita-plugin-format-heightmap_test
+ LINK_LIBRARIES kritaui Qt5::Test)
diff --git a/plugins/impex/heightmap/tests/data/results/test_512x256.r16.png b/plugins/impex/heightmap/tests/data/results/test_512x256.r16.png
new file mode 100644
index 0000000000..d58206ebb8
Binary files /dev/null and b/plugins/impex/heightmap/tests/data/results/test_512x256.r16.png differ
diff --git a/plugins/impex/heightmap/tests/data/results/test_512x256.r8.png b/plugins/impex/heightmap/tests/data/results/test_512x256.r8.png
new file mode 100644
index 0000000000..298430216b
Binary files /dev/null and b/plugins/impex/heightmap/tests/data/results/test_512x256.r8.png differ
diff --git a/plugins/impex/heightmap/tests/data/results/test_512x512.r16.png b/plugins/impex/heightmap/tests/data/results/test_512x512.r16.png
new file mode 100644
index 0000000000..e678930741
Binary files /dev/null and b/plugins/impex/heightmap/tests/data/results/test_512x512.r16.png differ
diff --git a/plugins/impex/heightmap/tests/data/results/test_512x512.r8.png b/plugins/impex/heightmap/tests/data/results/test_512x512.r8.png
new file mode 100644
index 0000000000..1f86ac18c7
Binary files /dev/null and b/plugins/impex/heightmap/tests/data/results/test_512x512.r8.png differ
diff --git a/plugins/impex/heightmap/tests/data/sources/test_512x256.r16 b/plugins/impex/heightmap/tests/data/sources/test_512x256.r16
new file mode 100644
index 0000000000..d47cb432a8
Binary files /dev/null and b/plugins/impex/heightmap/tests/data/sources/test_512x256.r16 differ
diff --git a/plugins/impex/heightmap/tests/data/sources/test_512x256.r8 b/plugins/impex/heightmap/tests/data/sources/test_512x256.r8
new file mode 100644
index 0000000000..77a2f19179
--- /dev/null
+++ b/plugins/impex/heightmap/tests/data/sources/test_512x256.r8
@@ -0,0 +1 @@
+¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»¼¼½½½¾¾¾¾¾¾¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀ¿ÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÄÅÆÆÆÆÆÆÆÇÇÆÆÆÆÅÄÃÄÄÄÄÅÆÆÆÇÇÈÉËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ØÙÙÚÚÛÛÛÛÛÛÛÜÛÛÛÜÜÜÝÞßßààáâäçççèèèèéééééééééééééééééééêêêêêêêêêêêêêêêêêêêêêêêêéééééèèèççãáßßÝÜÜÛÛÛÛÚÚ×ÖÕÕÕÔÔÓÓÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÈÇÆÆÆÄÄÃÃÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾½½½½½½½½½½¼¼¼¼¼¼¼¼¼½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½¾¾¾¾¾¿ÀÁÁÁÁÁÂÂÃÄÅÆÆÆÇÇÇÇÇÇÈÈÈÈÈÈÈÇÇÇÆÆÆÆÆÆÆÆÆÆÅÄÄÃÃÂÂÁÁÁÁÁÁÁÁÁ¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»¼¼¼½½½¾¾¾¾¾¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀ¿¿¿¿ÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÄÄÅÆÆÆÆÆÆÆÆÆÆÅÄÄÃÃÃÃÄÄÅÆÆÆÆÇÈÉÊËÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÖ×××ØÙÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝßßààáâåçççèèèèèéééééééééééééééééééêêêêêêêêêêêêêêêêêêêêêêéééééèèèèççäáàßÞÜÜÛÛÛÛÛÚØ×ÖÕÕÔÔÔÔÔÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÊÉÈÇÆÆÅÅÄÄÃÃÃÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÀÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½¾¾¾¾¾¾ÀÁÁÁÁÂÂÃÄÅÆÆÇÈÈÈÈÇÈÉÉÉÉÊÉÉÉÈÈÈÇÇÇÇÆÆÆÆÆÆÆÅÅÄÃÃÂÂÂÂÂÂÁÁÁÁ¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»¼¼¼½½½½¾¾¾¾¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀ¿¿¿¿¿¿¿¿¿¿¿¿ÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÃÄÄÄÄÅÅÅÅÅÄÄÃÃÃÂÂÂÃÄÄÄÄÅÅÆÆÇÈÉËÍÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝßßßàáãåçççèèèèèèéèèèèèèèééééééééééêêêêêêêêêêêêêêêêêêêêêééééééèèèèççåâàßÞÝÜÜÛÛÛÛÚÙØÖÕÕÕÔÔÔÔÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÉÈÇÆÆÆÅÅÅÄÄÃÃÃÃÃÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÂÂÂÂÂÁÁÁÁÁÁÁÁÁÀ¿¿¿¿¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½½½¾¾¾½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½¾¾¾¾¾¿¿ÁÁÁÁÂÂÃÅÆÆÇÈÉÉÉÉÉÉÊÊÊÊËÊÊÉÉÉÉÈÇÇÇÇÇÆÆÆÆÆÆÆÅÄÃÂÂÂÂÂÂÂÁÁÁ¹¹¹¹¹¹¹¹¹¹¹¹¹ºº»»»»¼¼¼½½½¾¾¾¾¿¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¿¿¾¿¿¿¿¿¿¿¿À¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÃÃÃÃÄÄÄÄÄÄÃÂÂÂÂÂÂÃÃÃÃÃÄÄÆÆÇÈÉËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÖ×ÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÝÞßßàáãåççççèèèèèèèèèèèèèèéééééééééééêêêêêêêêêêêêéêêêêêéééééééééèèççæãàßßÝÜÜÛÛÛÛÚÚØÖÖÕÕÔÔÔÔÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÈÇÇÆÆÆÆÆÅÅÄÃÃÃÃÃÃÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÃÄÄÃÃÃÂÂÂÁÁÁÁÁÁÁÁÀÀ¿¿¿¾¾¾¾¾¾½½½½½½½½½½¾½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½¾½½¾¾¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÈÈÉÊÊÊÊËËÌÌÌÍÌËËÊÉÉÈÈÇÇÇÇÇÆÆÆÆÆÆÆÅÄÃÂÂÂÂÂÂÂÁÁ¹¹¹¹¹¹¹¹¹¹¹¹ºº»»»»»»»¼½½½½¾¾¾¾¿¿¿¿ÀÀÁÁÁÁÁÀÀÀÀÀÀÀÁÁÁÁÁÀÀ¿¿¿¾¿¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀ¿¿ÀÁÁÁÁÁÀÀÀÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÃÂÂÂÂÂÂÂÂÂÂÂÂÃÄÅÆÆÈÉÊËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÛÜÜÝÞßßààâãçççççèèèèèèèèèèèèèèééééééééééééééêêêêêêééééééééééééééééèèèçççãàßßÞÝÜÛÛÛÛÚÚØ×ÖÕÕÕÕÔÔÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÊÉÈÇÇÇÆÆÆÆÆÆÅÄÄÄÄÄÃÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÄÄÄÄÃÃÂÂÂÁÁÁÁÁÁÁÁÀ¿¿¿¿¾¾¾¾¾¾¾¾½½½¾½¾¾¾¾¾½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¿ÀÁÁÁÁÂÃÅÆÇÈÈÈÉÊËÌÌÍÍÍÎÏÐÏÍÌËÊÉÉÈÈÇÇÇÇÇÆÆÆÆÆÆÆÄÃù¹¹¹¹¹¹¹¹¹¹¹ºº»»»»»»»¼¼½½½½¾¾¾¾¿¿¿ÀÀÀÁÁÁÀÀ¿¿¿¿¿ÀÀÁÁÀÀ¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿¿¿¿ÀÀÀÀÀÀ¿¿¿¿ÀÀÁÁÁÁÁÁÁÂÁÂÂÂÂÃÃÃÃÂÂÂÂÂÂÂÁÁÁÂÂÂÂÃÃÄÆÆÇÈÉÊÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßàáâäæçççççèèèèèèèèèèèèèèèèèèèéééééééêêêêééééééééééééééééééèèèçççãáàßßÝÜÜÛÛÛÛÚÙØ×ÖÖÕÕÔÔÓÓÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÉÈÈÇÇÇÇÆÆÆÆÆÅÅÅÅÄÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÃÄÄÄÄÃÃÂÂÂÂÂÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¾¿¿¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½¾¾¾¾¾¾¾¿¿ÁÁÁÁÂÂÃÆÆÇÈÈÉÊËÍÎÏÏÏÐÐÐÐÐÎÍËÊÉÉÉÈÈÇÇÇÇÆÆÆÆÆÆÆÅÃÃù¹¹¹¹¹¹¹¹¹¹ººº»»»»»»»»¼½½½½½¾¾¾¾¿¿¿¿¿¿ÀÀÀ¿¿¿¿¿¿¿ÀÀÀ¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¾¾¾¾¾¾¿¿¿¿¿¿¿¿¾¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÅÆÆÇÇÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÕÕÕÖ×ØÙÚÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞßààáãåçççççççèèèèèèèèèèèèèèèèèééééééééêééééééééééééééééééééèèèçççäâáßßÞÜÜÛÛÛÛÚÚÙØØÖÕÕÔÔÔÓÓÓÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÊÉÉÈÈÇÇÆÆÆÆÆÆÆÅÅÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÄÄÄÄÃÃÃÃÃÂÂÁÁÁÁÁÁÀ¿¿¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾½½½½¾½¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÂÂÄÆÆÇÈÈÊÌÍÏÐÐÐÐÐÐÐÐÐÎÍÌÊÊÊÊÉÈÈÈÇÇÇÇÇÆÆÆÆÆÄÄÃÃÃÃÃù¹¹¹¹¹¹¹¹¹¹ºººº»»»»»»»»¼½½½½¾¾¾¾¾¿¿¿¾¿¿¿¿¿¾¾¾¾¾¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¾¾¾¾¾¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÅÆÆÆÇÈÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÕÕÖÖ×ØÚÚÚÛÛÛÛÛÛÛÛÛÛÜÝÝßßàáâãäääåçççççèèèèèèèèèèèèèèèèèèéééééééééééééééééêêêêêêéééèèèçççæãáàßÝÜÜÛÛÛÛÛÚÚÙØÖÕÕÔÔÔÓÓÓÓÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÌËÊÉÉÈÈÇÇÇÆÆÆÆÆÅÄÃÂÂÂÂÂÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÄÅÅÄÄÄÃÃÃÂÂÂÁÁÁÁÀ¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÂÂÃÄÆÆÇÇÈÉËÍÏÐÐÐÐÐÐÐÐÐÏÎÍÌËÊÊÊÉÉÈÈÈÇÇÇÆÆÆÆÆÅÄÄÃÃÃø¸¸¸¸¹¹¹¹¹¹ºººººººº»»»»¼¼½½½½¾¾¾¾¾¾¾¾¾¿¿¿¾¾¾¾¾¾¾¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÅÅÆÆÇÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÔÔÕÕÕÖ×ØÙÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÞßßàààááâãæçççççèèèèèèèèèèèèèèèèèèèééééééééééééééêêêêêêééééèèèçççæãáßßÝÝÜÛÛÛÛÛÛÚÚØÖÕÕÕÔÔÔÔÓÓÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËËÉÈÈÇÇÇÇÇÆÆÆÅÃÃÂÂÂÂÂÂÂÂÂÃÃÃÃÂÂÂÂÂÂÂÃÃÃÃÄÅÅÆÆÆÅÄÄÃÃÂÂÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÂÂÃÄÆÆÆÇÇÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÎÍÌËËÊÊÉÉÈÈÈÈÇÇÆÆÆÆÆÅÄÃÃ÷···¸¸¹¹¹¹¹ººººººººº»»»»¼½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÄÅÆÆÆÇÈÊËËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÔÔÕÕÕÖÖ×ØØÙÚÚÚÚÚÚÛÛÛÛÛÜÜÝßßßßßßàáâäççççççççèçççççççèèèèèèèèèèééééééééééééêêêêêêêéééèèèçççæãáàßÞÝÜÜÛÛÛÛÛÚÚØ×ÖÕÕÕÔÔÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÊÉÈÈÈÈÇÇÆÆÆÄÃÃÃÃÂÂÂÃÃÃÃÄÄÃÃÂÂÂÂÂÃÃÃÃÄÅÅÆÆÆÆÆÆÆÅÄÄÂÁÁÁÁÁÁÀ¿¿¿¿¿¾¿¾¾¿¿¿¿¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¿¿¿¿¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÂÂÄÄÅÆÆÆÇÈÈÉÊÌÐÐÐÐÐÐÐÐÐÐÏÍÍÍÍÍÌËËÊÊÊÉÈÇÇÆÆÆÆÆÅÄÃ÷····¸¹¹¹¹¹ºº¹¹ººººº»»»»»¼½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½½½¾¾¾½½½¾¾¾¾¾¾¾¾¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÄÅÅÆÆÇÇÇÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÓÓÓÔÔÕÕÕÖÖÖÖÖ×ØØØØÙÚÛÛÛÛÛÜÜÝÝÝÞÞßßßàáãåççççççççççççççççèèèèèèèèèéééééééééééêêêêêêêêéééèèèççççãáàßÞÝÜÜÜÛÛÛÛÛÚÙØ×ÖÕÕÔÔÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÉÉÉÉÈÇÇÆÆÆÅÄÄÃÃÃÃÃÃÃÄÄÄÄÃÃÂÂÂÃÃÃÃÄÅÆÆÆÆÆÇÇÆÆÆÆÅÃÂÁÁÁÁÁÁÀ¿¿¿¿¿¿¿¿¿¿¿¿ÀÀ¿¿¿¿¿¿¿¿¿¿¿¾¾¿¿¿ÀÀÀÀ¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÀÁÁÁÁÂÂÃÃÄÅÆÆÆÇÇÈÈÊÍÏÐÐÐÐÐÐÐÐÐÎÍÎÎÎÎÍÌÌÌËÊÉÈÈÇÇÆÆÆÆÅÃÃÂÂÂÁ¶····¸¹¹¹¹¹¹¹¹¹¹ººººº»»»»¼¼½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½¼¼¼¼¼¼¼½½½½½½½½½½½½½½½¾¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÃÄÆÆÆÆÆÇÈÈÊÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÖÖÖ××ØÚÚÚÛÛÛÜÜÜÜÜÝÝÞßßàáãåççççççççççççççççççèèèèèèèéééééééééêêêêêêêêêééééèèèçççæãáàßßÞÝÜÜÜÛÛÛÛÛÚÙ×ÖÕÕÔÔÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÌÌÌÌËÊÈÇÇÆÆÆÅÄÄÄÃÃÄÄÄÄÃÃÄÄÄÃÃÃÃÄÄÄÄÅÆÆÆÆÇÇÇÇÇÇÇÆÄÃÂÁÁÁÁÁÁÁÀÀ¿¿¿À¿¿ÀÀÀÀÁÀ¿¿¿¿¿ÀÀ¿¿¿¿¿¿¿ÀÀÁÀÀÀÀ¿¿¿¿¾¾¾¾¾¾¾¾¾½½½½½¾¾¾¾¾¾¾¾¾¾¿¿¿¿ÀÁÁÁÁÁÂÂÂÃÄÄÆÆÆÆÇÇÈÉËÍÎÏÐÐÐÐÐÐÐÐÎÎÎÎÏÏÎÎÎÌËÊÉÈÈÇÇÆÆÆÅÄÃö¶··¸¹¹¹¹¹¹¹¹¹¹¹ºººººº»»»»»¼½½½½½½¾½½½½¾¾¾¾½½½½½½¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½¼¼¼»»»»»»¼¼½½½½½½½½½½½½½½¾¾¾¾¾¾¾¿¿ÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÄÄÅÆÆÆÇÈÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÕÕÔÔÔÔÕÕÕÕÖÖÖ×ØÙÚÛÛÛÛÛÜÜÜÜÝÝÞßàáâåæççççååååååççççççççèèèèèèéééééééêêêêêêêêêêêééééèèèèççæäâáàßßÞÝÜÜÛÛÛÛÛÚÙ×ÖÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÉÈÇÇÆÆÆÆÅÅÅÄÄÅÅÄÃÃÄÄÅÄÄÄÄÅÅÅÅÆÆÆÇÇÇÇÈÈÈÈÇÆÆÄÃÂÁÁÁÁÁÁÁÁÀÀÁÀÀÁÁÁÁÁÁÁÀÀÀÀÀÀÀÀÀÀ¿¿ÀÀÁÁÁÁÁÀÀÀ¿¿¿¾¾¾¾¾¾¾¾¾¾½½½¾¾¾¾¾¾¾¾¿¿¿¿¿ÀÀÁÁÁÁÁÂÂÂÂÃÃÄÅÆÆÆÆÇÈÉÊËÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÊÉÉÈÇÇÆÆÅÄõµ¶·¸¹¹¹¹¹¹¹¹¹¹¹ººººººº»»»»»¼½½½½½½½½½½½½½½½½½½½½½½½½¾¾¾½½½½½½¼¼¼¼¼»»»»»»»»»»»»¼¼¼½½¼¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÃÃÅÆÆÆÇÈÊËÌÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÖ×ØÚÛÛÛÛÛÛÛÜÜÜÝÞßßáâãäååäãããâããäæçççççççèèèèèééééééêêêêêêêêêêêêêéééèèèèçççæäâáààßßÞÝÜÜÛÛÛÛÚÙ×ÖÕÕÔÔÓÓÓÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÉÈÇÇÆÆÆÆÆÆÅÅÅÆÅÄÃÄÄÅÅÅÅÅÆÆÆÆÆÆÇÈÈÈÈÈÈÈÇÇÆÆÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÁÁÁÁÁÁÁÀÀÀÀÀÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿ÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÄÅÆÆÆÇÇÈÈÉÊËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÊÊÉÈÈÇÆÆÅôµµ¶·¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººººººº»»»»¼¼½½½½½½½½½½½¼¼¼¼¼¼¼½½½½½½½½½½¼¼»»»»»»»»»»»»»»»»»»»¼¼¼»»»»»»¼¼½½½½½½¾¾¾¾¾¾¾¿¿ÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÇÈÈÉËÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÖ×ÙÚÛÛÛÛÛÛÛÜÜÜÞßßààááâââááááâãåææççççççèèèèèééééêêêêêêêêêêêêêêééééèèèèçççæãââáàßßÞÝÜÜÛÛÛÛÚÙ×ÖÖÕÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÉÈÈÇÆÆÆÆÆÆÆÆÆÆÆÅÄÄÄÅÅÆÆÆÆÆÆÆÆÆÇÈÉÉÈÈÈÈÇÆÆÅÄÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÇÇÇÈÈÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÌÌËÊÉÇÆÆÄÃôµµ¶¶·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ºººººº»»»¼¼¼¼¼¼¼¼¼¼¼¼»»»»»»»¼¼¼½½½½½½¼¼»»»»»»»»»»ººººº»»»»»»»»»»»»»»»»¼¼¼½½½½½¾¾¾¾¾¾¾¿¿¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÄÅÆÆÆÇÉËÎÏÐÐÐÐÐÐÐÐÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÖØÚÚÚÛÛÛÛÛÛÜÜÝÞßßßßààáààààáâãäåæççççççèèèèèééêêêêêêêêêêêêêêêêéééééèèççççæääãáàßßÞÝÜÛÛÛÛÛÚÙØ×ÖÕÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÉÈÈÇÇÆÆÆÆÆÆÆÆÆÆÆÅÅÆÆÆÆÆÆÆÆÆÇÇÉÊÊÊÉÉÈÇÇÆÆÅÄÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÅÅÅÆÆÆÇÇÇÈÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÎÎÌÉÇÆÆÄô´´µµ¶··¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ºº»»»¼¼»»»»»»»»»»»»»»»»»»»»¼¼¼¼¼¼»»»»»»ºººººººººººº»»»»»»»»»»»»»»»»¼¼½½½½¾¾¾¾¾¾¾¾¿¿¿¿¿¿ÀÁÁÁÁÁÀÀÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÇÉËËÍÌÌÍÌËËËÊÊÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÕÖ×ØØÚÚÛÛÛÛÛÜÜÜÝÞÞßßßßààààááâããäåæçççççèèèèèééêêêêêêêêêêêêêêêêééééèèèçççççæåâáàßßÞÝÜÛÛÛÛÛÚÚØ×ÖÕÕÔÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÊÉÉÈÈÇÇÇÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÇÈÊËËÊÉÉÈÈÇÆÆÆÅÄÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÄÅÆÆÆÆÆÇÈÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÆÆÅô´´´´µµ¶¶¶¶········¸¹¹¹¹¹¹¹¹¹ºº»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»ººººººººº¹¹¹¹¹¹ººº»»»ººººººº»»»»»¼¼¼½½½¾¾¾¾¾¾¾¾¾¾¿¿¿¿ÀÀÀÀÀÀ¿¿¿¿¿¿¿¿¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÂÂÃÄÆÆÇÉÉÉÈÉÈÈÈÈÇÇÇÈÉÊÌÍÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÕÕÖÖ×ÙÚÚÛÛÛÛÛÛÜÜÜÝÝÞßßßßßààáâããääççççççèèèèééêêêêêêêêêêêêêêêêêêéééèèèçççççæäâáàßßÞÝÜÛÛÛÛÛÚÚÙØ×ÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËËÊÊÉÈÇÇÇÈÈÇÇÆÆÆÆÆÆÆÆÇÇÇÇÈÈÉÊËÌÌËÊÉÉÉÈÇÆÆÆÄÃÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÂÂÂÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÄÅÆÆÆÆÇÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÊÈÇÆÅÄô´´´´´´µµµµ¶µµµµµµ¶¶·¸¹¹¹¹¹¹¹¹º»»»»ººººººººººººººººº»»»»»»»»»ººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººººººº¹¹¹ººº»»»»»¼¼¼½½½¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÂÃÄÆÆÇÇÇÇÆÆÆÆÆÆÆÆÆÇÈÈÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÖ××ØÚÚÛÛÛÛÛÜÜÜÜÝÝÞßßßààáââããäæçççççèèèèéééêêêêëëëëêêêêêêêêêéééèèèèçççççæäâáàßßÞÝÜÛÛÛÛÛÛÚÚÙØÖÖÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÌÌÊÉÈÈÈÈÉÉÉÇÇÆÆÆÇÇÇÈÈÈÉÉÉÊÌÍÎÍËËËÊÊÉÈÇÆÆÆÄÃÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÂÂÂÂÂÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÅÆÆÆÇÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÇÆÆÅÃó³´´´´´´´µµ´´´´´´µµµµ¶···¸¹¹¹¹¹ººººººº¹ººººººººººººººº»»»ººººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»»¼¼½½½¾¾¾¾¾¾¾¾¾¾¾¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÂÂÃÅÆÆÆÆÆÆÅÆÆÆÅÅÅÆÆÆÇÇÈÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÖ×ØÚÚÚÛÛÛÛÛÜÜÜÝÞßßààááâââäåççççççèèèèééêêêëëëëëëêêêêêêêêééééèèèèèççççååãáàßßÞÝÜÛÛÛÛÛÛÚÚÚÙØ×ÖÖÕÕÕÔÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÏÎÍÌÊÉÉÈÈÉÊËÉÈÇÇÈÈÈÈÉÉÊÊÊÊÌÎÐÏÎÍÌÌÌÌÊÉÈÇÆÆÅÄÄÃÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÇÇÈÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÊÇÆÆÆÄÃó³³³´´´´´´´´´´´´´´´´µµ¶¶¶·¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº¹¹ºººººººººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ºº»»»»»¼½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÂÃÅÅÄÄÃÃÃÃÄÄÃÃÃÄÅÆÆÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÔÔÔÕÕÖ×ØÙÚÛÛÛÛÛÛÜÜÝÞßààáááââãåççççççèèèèééêêêëëëëëëëëëêêêêêêéééèèèèèèççççæåãáàßßßÝÜÜÛÛÛÛÛÛÚÚÚÚÙØ×ÖÕÕÔÔÔÔÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÏÏÌËÊÉÈÉÊËÌËÉÉÉÉÊÊÊÊËËÌÌÎÐÐÐÏÎÍÍÌÌËÉÈÇÆÆÆÅÄÄÃÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¾¾¾¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÇÇÉÊÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐËÈÇÆÆÅÄò³³³³³´´´´´´´´´´´´´´´´µµ¶¶··¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ºººº¹¹¹¹¹¹¹¹¸····¸¸¹¹¹¸¸¸¸¸¸¹¹¹¹¸¸¸¹¹¹¹¹ºº»»»»¼¼½½½½¾¾¾¾¾¾¾¾¾¾¾½½½½½¾¾¾¾½½½½½½½½½¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÂÃÃÃÂÂÂÂÂÃÂÂÂÂÃÃÄÅÆÆÇÈÉËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÓÓÓÔÔÔÕÕÖ×ÙÚÚÛÛÛÛÛÜÜÝßßààáááâäåççççççèèèèéééêêêëëëëëëëëêêêêêêêééééèèèèèççççççäâààßßÞÜÜÛÛÛÛÛÛÛÚÚÚÚÚØÖÕÕÕÕÔÔÔÔÓÓÓÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÊÊÊÌÍÍÍÌÌÌÌÌÌÌÌÎÎÐÐÐÐÐÐÏÎÍÍÌÊÉÈÇÇÆÆÆÆÄÃÃÃÂÂÂÂÂÂÂÃÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀ¿¿¿¿¿¿¿¿¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÁÁÁÁÁÁÁÂÂÃÃÄÅÅÆÆÆÇÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÉÈÇÆÆÅIJ²²²³³³³³³³³³³´´´´´´´´´µµ¶¶¶··¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸·¸·¶¶µµ¶¶¶·····¶¶¶¶·¸¸·¶¶·¸¹¹¹¹ººº»»»»¼¼½½½½¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¿ÀÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÄÆÆÆÇÉËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÓÓÓÔÔÕÕÖ×ØÚÚÛÛÛÛÛÜÝÞßßàáááâäæççççççèèèèéééêêêêëëëëëëëêêêêêêêéééééèèèèèçççççæãáààßßÞÝÜÜÛÛÛÛÛÛÛÛÛÚÚØ×ÖÕÕÕÕÔÔÔÓÓÓÓÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÌËËÌÍÏÏÐÐÐÏÏÏÏÏÐÐÐÐÐÐÐÐÐÎÎÍÌÊÉÈÇÇÇÆÆÆÅÄÄÃÃÃÃÃÃÃÃÃÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀ¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÁÁÁÁÂÂÂÃÄÄÅÆÆÆÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÇÇÆÆŲ²²²²³³³²²²²²³³³³³´´´´´´µµµ¶¶¶¶·····¸·¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸¶¶¶¶¶µµµµµµµµ¶¶¶¶µµµµ¶¶¶¶µµ¶¶·¹¹¹¹ººº»»»»»¼½½½½¾¾¾¾¾½½½½½½½½½½½½½½½½½¼½½½½½½½½½½¾¾¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÇÈÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÒÒÒÓÓÓÔÔÕÕÖ×ØÙÚÛÛÛÛÜÜÝÞßààáââãåççççççèèèèééééêêêëëëëëëëëêêêêêêêéééééèèèèèçççççåâáààßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÚÚØ×ÖÖÕÕÕÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÎÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÊÉÈÇÇÇÇÆÆÆÆÅÅÄÄÄÄÄÅÄÄÄÃÂÂÂÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÀÀÀÀ¿¿¿¿¿¿¿¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÃÃÄÅÆÆÆÆÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÈÇÆÆ°±±²²²²²²±²²²²²³³³³³´´´´´µµµµµ¶¶¶¶¶¶¶¶··¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹··¶µµµµµµ´´´´´µµµµµµµµµµµµµµµµµ¶·¸¹¹¹¹ºººº»»»»¼½½½½¾¾¾½½½½½¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼½½½½½½¾¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÆÆÆÇÈÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÓÓÓÔÔÔÕÕÖØÙÚÛÛÛÛÜÜÝßßàááâãäçççççèèèèèééééêêêëëëëëëëëëêêêêêêêéééééèèèèèèèçççäâáààßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÚÙØ×ÖÖÕÕÕÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÊÉÈÈÈÇÇÇÇÆÆÆÆÆÆÅÆÆÆÆÅÄÄÃÂÂÂÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀ¿¿¿¿¿ÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÃÃÄÅÆÆÆÆÆÆÆÇÈÊÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÌÊÈÇƯ°°±²±°°¯¯°¯°±²²²³³³³³´´´´´µµµµµµµµµµµ¶¶·¸¸¸¸¸¹¹¹¹¹¹¹¹¹¸·¶µµ´´´´´´´´´´´´´µ´´´´´´´´´´´´´µµ¶·¸¹¹¹¹ºººº»»»¼¼¼½½½¾½½½½¼¼»»»»»»»»»»»»»»»»»»»»¼¼¼½½½½¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÇÈÉËÍÍÍÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÖ×ÙÚÛÛÛÛÜÜÝßßàáââãæççççèèèèèééééêêêëëëëëëëëëëêêêêêêêééééèèèèèèèçççåãâáààßßßÞÞÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙØ××ÖÕÕÔÔÔÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÈÈÈÈÈÈÇÇÆÆÆÆÆÆÆÆÆÆÅÄÄÃÂÂÂÂÂÂÂÂÂÃÃÃÃÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÃÃÄÅÆÆÆÆÆÆÇÇÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÈÇ®®¯¯¯¯¯®®®®®®¯°±²²²³³³³´´´´´´´´´´´´´´µµ¶¶······¸¸¹¹¹¹¸·¶µµ´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´µµ¶·¸¹¹¹¹¹ººº»»»»¼¼½½½½½¼¼»»»»»»»»»»»»»»»»»»»»»»»»»»¼½½½½¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÆÆÇÈÈÉÉÊËËËÍÌËÌÍÍÌÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÕÕÖ×ÙÚÛÛÛÛÜÜÞßßàáâãæççççèèèèèèéééêêêëëëëëëëëëëêêêêêêêêééééèèèèèèèçççäâááààßßßßÞÝÝÝÜÜÜÛÛÛÛÛÛÛÚÚÙØ×ÖÕÕÕÔÔÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌËÊÉÉÉÉÉÉÈÇÇÇÆÆÆÆÆÆÆÆÆÅÅÅÄÃÃÂÃÃÃÃÄÄÄÃÃÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÂÃÃÄÄÆÆÆÆÆÆÇÇÇÈÊÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÉÈ­®®®®®®®­­­­­®¯¯±²²²²²³³³´´´´´´´´´´´´´µµ¶¶¶¶¶¶¶¶·¸··¶µµ´´´´´´´³³³³³³´´´´´´´´´´´´´´´´´´´´´µ¶¶·¸¹¹¹¹¹¹ºº»»»»¼½½½½¼¼»»»»»»»ººº»»º»»»»»ººººº»»»»»»¼¼½½¾¾¾¾¿¿ÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÇÇÈÈÈÈÈÉÉÉÉÊÉÉÊËËÊËÌÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÔÕÕÖ×ÚÛÛÛÛÛÜÝßßàáâãåçççççèèèèèéééêêêëëëëëëëëëëëêêêêêêêéééééèèèèèèçççæäâááààßßßßßßÞÝÝÜÜÜÜÛÛÛÛÛÚÚÙØ×ÖÕÕÔÔÔÓÓÓÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÌËÊËËËÊÉÈÈÇÇÇÇÇÇÆÆÆÆÆÆÆÅÄÄÄÄÄÅÆÆÆÅÄÄÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÃÃÄÅÆÆÆÆÇÇÇÇÇÈËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌËÊɬ¬¬­­­­¬««««¬­®¯¯°°±±²²²³³³³³³³³³´´´´´´µµµµµµµµ¶¶µµµ´´´´´´´³³³³²²²²³³³³³³´´´´´´´³³³³´´´´´µµ¶¶··¸¹¹¹¹¹ººº»»»¼¼¼¼»»»»»ººººººººººººººººººººººººº»»»¼½½½½¾¾¾¿¿¿¿¿¿¿¿¿¿ÀÀÁÁÁÁÁÁÁÂÃÄÅÆÆÆÆÆÆÆÆÆÇÇÇÇÇÇÈÈÇÇÈÉÊËÌÏÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÔÔÕÖ×ÚÚÛÛÛÜÜÞßßàâäåçççççèèèèèéééêêêëëëëëëëëëëëëêêêêêêêêééééèèèèèççççåãâááàßßßßßßßÞÝÝÝÜÜÜÛÛÛÛÛÚÚÙØ×ÖÕÕÔÔÔÓÓÓÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËÌËËËÊÉÉÈÈÇÇÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÅÅÄÃÃÂÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÃÄÅÅÆÆÆÆÇÇÇÇÈÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊɪª«««ªªªªªªª«¬­®®®¯¯¯°±²²²²²²³³³³³³´´´´´´´´µµµµµµ´´´´´´´³³³³²²²²²²²²²³³³³³³´³³³³³³³³³³´´´´´µµµ¶¶·¸¹¹¹¹¹ºº»»»»»»»»»ººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»¼¼½½¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÂÂÃÄÅÅÆÆÅÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÉÌÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÔÔÕÖØÙÚÛÛÛÜÜÝßßáãåçççççèèèèèéééêêêêëëëëëëëëëëëêêêêêêêêêéééééèèèèçççæäãâááààßßßßßßÞÞÝÝÜÜÜÛÛÛÛÛÚÚÙ×ÖÕÕÔÔÔÔÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÌËËËËÊÊÊÉÈÈÈÇÇÇÇÇÆÆÆÆÆÆÆÆÆÇÆÆÆÆÆÄÄÃÃÂÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÃÄÅÅÆÆÆÇÇÇÈÈÈÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉ©©©©©©©©©©©©ª«¬­­®®®®®¯¯°±±²²²²²²³³³´´´´´´´´´´´´´´´´´³³³³²²²²±°°°°°±²²²²²³³³³³³³³³³³³³³´´´´´´µµµµ¶·¸¹¹¹¹ººº»»»»»ººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹º»»»»¼½½½½½¾¾¾¾¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÂÂÃÃÄÃÃÄÄÄÄÄÄÅÅÅÆÆÆÆÆÆÇÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÓÓÓÔÔÕÖØÚÚÛÛÛÜÜÝßàáäçççççèèèèèéééêêêêëëëëëëëëëëëëêêêêêêêêêéééééèèèççççåãâááàààààààßßÞÞÝÝÜÜÜÛÛÛÛÛÚÚØÖÖÕÔÔÔÔÔÓÓÓÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÌÌÌÌÌÌËÉÉÈÉÉÈÈÈÇÇÇÇÇÇÇÇÇÈÇÈÇÇÆÆÅÄÃÃÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÆÇÇÈÈÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÌËÉ©©¨¨¨¨¨¨¨¨©©©ª«¬¬­­­­­®®®®¯¯°°°±²²³³³´´´´´´´´´´´´´´³³³³²²²²±°¯®®®®¯¯¯°±²²²²²²³³²²³²³³³³³´´´´´´´´µµµ¶·¹¹¹¹¹ººººººº¹¹¹¹¹¹¸¹¹¹¹¹¹¹¹¸¸¸¸¸¸¸¸¸¸¸¹¹¹¹¹ºº»»»¼½½½½½½½½½¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÃÃÄÃÄÄÅÆÆÆÆÇÉÌÏÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÔÕÖ×ÚÛÛÛÛÜÜÞßàâççççèèèèèèéééêêêêêêêêëëëëëëëëëêêêêêêêêêééééèèèèçççåäãâááááààááàßßßÞÝÝÜÜÜÛÛÛÛÛÚÙ×ÖÕÕÔÔÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÍÍÍÌÍÌËÊÉÊÊÊÉÉÉÈÈÈÈÈÈÈÉÊÉÉÈÇÆÆÅÄÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÆÇÈÈÉÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÌËÊɨ¨¨¨¨¨¨¨¨¨¨¨©©ªªª««««««¬¬­­®®®¯°°²²³³³´´´´´´´´´³´³³³²²²±°°¯®®®­­­­®®®®¯°±±²²²²²²²²²²²³³³³´´´´´´´´´´µ¶·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸······¸¸·¶¶¶¶¶¶¶¶¶¶¶¶¶··¸¹¹ºº»»»»¼»¼¼¼½½½½½¾¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÃÄÄÅÅÆÇÈÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÒÓÓÔÕÕÖØÚÛÛÛÛÜÜÞßáäçççèèèèèèééééêêêêêêêêêêëëëëëëêêêêêêêêêêêééèèèèçççåääããâááááâáààßßßÞÝÜÜÜÜÛÛÛÛÛÚÙ×ÖÕÕÔÔÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÎÎÍÍÍÍÌËËËËËËËÊÊÊÊÊÊÊÊËÌÌÊÈÇÆÆÅÄÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÃÄÅÆÆÆÆÇÈÉÊÊËÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÍÌÊÊÉȨ¨¨¨¨¨¨¨¨¨¨¨¨©©©©ªªª©©ª©ª«¬¬­®®¯°±²²²³³´´´´´³³³³³³²²±°°¯¯®®­¬¬««««¬­­®®®¯¯°°±±±±±²²²²²³³³³´´´´´´´´´´µ¶·¸¹¹¹¹¹¹¹¹¹¹¹¸·¶¶¶µµ¶¶¶¶µµµµµµµµµµµµµµµ¶·¸¹¹¹ºº»»»»»»»»¼½½½½½½¾¾¾¾¾¾¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÇÇÈÊÌÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÕÕÖØÚÛÛÛÛÜÝßàâççèèèèèèèééééêêêêêêêêêêêêëëëëëêêêêêêêêêêêééèèèççççååäãâãããããâáàßßßßÞÝÜÜÜÜÛÛÛÛÛÚÙ×ÖÕÕÔÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÎÎÎÍÌÌÌÌÍÍÍÌÌËËËÌÌÌÍÏÐÏÌÉÇÆÆÆÄÃÃÃÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÄÄÅÆÆÆÇÇÈÉËËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌËÉÉÉȨ¨§§§§¨¨¨¨¨¨¨¨¨©©©©©¨©©©©©ª««¬­®®¯±²²³³³³³³³³²²²²²±°¯¯®®®­¬«ªª©©ªªª«¬­­­®®®®¯¯¯¯¯°±²²²²³³³³³³´´´´´´´´µ¶¶¶¶¶¶¶¶···¸¸·¶¶µµµµµµµµ´´´´´´´´´´´´´´´µµ·¸¹¹¹¹ººººº»»»»»¼½½½½½½½¾¾¾¾¾¾¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÅÆÆÇÈÊÍÏÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÓÓÓÔÕÕ×ÙÚÛÛÛÛÜÝßáäççèèèèèèééééêêêêêêêêêêêêëëëëëëëêêêêêêêêêééèèèçççççææåääääåäãâáààßßßÞÝÜÜÜÛÛÛÛÛÛÚØ×ÖÕÕÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÎÍÍÎÎÏÏÎÎÎÎÎÎÎÎÏÐÐÐÐÌÊÈÇÆÆÅÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÄÄÅÆÆÆÇÇÈÊËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÊÉÉȦ¦¦¥¦¦¦¦§§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©ª«¬­®¯°±²²³³³³³²²±±±°¯¯®®®­­¬«ª©©©©©©©©ªªª««¬­­®®®®®¯¯°±²²²²³³³³³³³³³³´´´´µµµµµµµµµµ¶¶¶¶¶µµ´´´µ´´´´´´´´´´´´´´´´´´´µ¶·¸¹¹¹¹¹ººººº»»»»¼¼»»¼¼½½½½¾¾¾¾¾¾¿¿¿ÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÓÓÔÔÕÖ×ÚÚÛÛÛÜÝßàãççèèèèèèéééêêêêêêêêêêêêêêëëëëëëëêêêêêêêêééèèèèçççççççæææçæåäâááààßßßÞÝÜÜÜÛÛÛÛÛÚÚØ×ÖÕÕÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÐÐÐÐÐÏÐÐÐÐÐÐÐÐÐÐÐÐÎÊÈÇÆÆÆÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÆÇÈÈÉËÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÊÉÈ¥¥¥¥¥¥¥¥¥¦¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©ª«¬­®®°±²²³³³²²±°¯¯®®­­­¬««ª©©©¨¨¨¨¨©©©©©©ªª«¬­­­®®®®¯°±²²²²³³³³³³³³³³´´´´´´´´´´´´´µµµµµµ´´´´´´´´´´´´´´´´³³³³´´´´´µµ¶··¹¹¹¹¹¹ºººº»»»»»»»»¼¼½½½½½½¾¾¾¾¿¿¿¿¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÂÂÂÄÅÆÆÇÉËÏÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÖØÚÛÛÛÛÜÞßáäççèèèèééééêêêêêêêêêêêêêêêëëëëëëëêêêêêêêêééèèèççççççççççççæäãâááààßßßÞÝÝÜÜÛÛÛÛÛÛÚÙ×ÖÕÕÔÕÔÔÔÔÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÉÈÇÆÆÄÃÃÂÂÂÁÁÁÁÁÁÁÁÁÂÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÂÂÂÂÂÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÇÇÈÈÉËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËÊɤ¤¤¤¥¥¥¥¥¥¦¦§¨¨¨¨¨¨¨§¨¨¨¨¨¨¨©©ªª«­®¯°±²²²²²°¯®®®­¬«««ªª©©¨¨¨¨¨¨¨¨¨¨¨¨©©©©©ª«¬­­®®®®¯°°±²²²²²²²²³³³³³´´´´´´´´´´´´´´´µ´´´´´´´´³³³³³³³³³³³³³³³´´´´´´µµ¶·¸¹¹¹¹¹¹¹ºººººº»»»»»»¼¼¼½½½½¾¾¾¾¾¾¿¿¿¿¿¿ÀÀÁÁÁÁÁÁÁÂÂÃÄÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÔÕ×ÙÚÛÛÛÜÝßàáåçèèèèééééêêêêêêêêêêêêêêêëëëëëëëëêêêêêêêééèèèèççççççççççççåäãâááààßßßÞÞÜÜÜÜÛÛÛÛÛÚØ×ÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÉÇÆÆÄÃÃÃÂÂÂÂÁÁÁÁÁÁÂÂÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÃÃÃÂÂÁÁÁÁÁÂÂÂÃÄÄÅÆÆÆÇÇÈÉÉÊÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊʤ¤¤¤¤¤¤¤¤¥¥¥¥¦¦¦§§¦¦¦¦§§¨¨¨¨¨©©©ª«­®¯°²²²°¯®®®­«ªªªª©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©ª«¬­­®®®¯¯¯¯°±²²²²²²²³³³³³´´´´´´´´´´´´´´´´´´´³³³³²²²³³³²²²²²²²³³³´´´´´µµ¶·¸¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»»»»¼½½½¾¾¾¾¾¾¾¾¾¿¿¿¿ÀÁÁÁÁÁÁÂÂÃÃÅÆÆÇÉËÍÎÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÕÖ×ÚÚÛÛÛÜÝßàãççèèéééééêêêêêêêêêêêêêêêëëëëëëëëêêêêêêééééèèèèçççççççççççæåãáááááàßßßßÝÜÜÜÜÛÛÛÛÛÚÙ×ÖÕÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÈÆÆÄÄÃÂÂÂÂÂÂÁÁÁÁÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÄÄÃÂÂÂÂÂÂÂÂÃÄÄÅÆÆÆÇÈÈÉÉÊÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍËʤ¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¥¥¥¥¦§§¨¨¨¨¨©©ª¬®®°±±¯®®­¬«ª©©©©©©¨¨¨¨¨¨¨¨§§¨¨¨¨¨¨¨¨¨¨¨¨©©©ª«¬­­®®®®®¯¯°±±²²²²²²²³³³³³³³³³³³´´´´´´´³³³²²²²²²²²²²²²²²²²²²³³³´´´´´´µ¶¶··¸¹¹¹¹¹¹¹¹¹¹¹ººº»»»»»»¼¼½½½¾¾¾¾¾¾¾¾¾¾¾¿ÀÀÁÁÁÁÁÂÂÃÄÆÆÇÈÉËÌÍÏÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÖØÚÛÛÛÜÜÞßáåçèèèéééééêêêêêêêêêêêêêëëëëëëëëëêêêêêéééééèèèèèèççèèèçççççæäââááááààßßÞÝÝÜÜÜÜÛÛÛÛÚÚØÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÒÓÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÈÇÆÅÄÃÃÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÅÄÃÃÃÂÂÂÂÃÄÅÅÆÆÆÇÈÈÉÉÊÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÌˤ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¤¤¤¥¥¦¦§¨¨¨¨¨©ª«­®¯¯®®­¬«ª©©©¨¨¨¨¨¨¨¨¨¨¨§¦¦¦¦§§¨¨¨¨¨¨¨¨¨¨¨©©©ª«¬¬¬¬­­®®¯¯°°±±²²²²²²²²²³³³³³³³³³³³³³³²²²±°¯°°°°°°°¯¯¯°±±²²³³³´´´´´´µµµµ¶¶¶···¸¹¹¹¹¹¹¹ººººº»»»»¼½½½½½½¾¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÂÂÃÄÅÆÆÇÈÉÊËÌÏÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÔÕÖ×ÙÚÛÛÛÜÝßàâæçèèèééééêêêêêêêêêêêêëëëëëëëëëêêêêêééééééèèèèèèèèèèèççççççåããââââááàßßÞÝÝÜÜÜÜÛÛÛÛÚÚØ×ÖÖÖÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÉÇÆÆÄÃÃÃÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÅÆÅÄÄÃÃÃÃÃÄÅÆÆÆÆÇÇÈÉÊÊËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍ̤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©ª¬­®®­¬«ª©©©¨¨¨¨¨¨¨¨¨¨¨§¦¦¥¥¥¦¦¦¦¦§§¨¨¨¨¨¨¨¨¨©©ªª««««¬­®®®¯°°°±²²²±±±²²²²²²²²²²³²²²²²±°¯®®®®®®®®®®®®®¯¯¯°²²³³³³´´´´´µµµµµµµµµ¶··¸¹¹¹¹¹¹¹¹ººº»»»¼¼¼½½½½½½¾¾¾¾¾¾¿¿ÀÁÁÁÁÂÂÃÄÆÆÆÇÈÉÊËÎÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÕÕÖØÚÛÛÛÜÝßßáäççèèéééééêêêêêêêêêêëëëëëëëëëëêêêêêêêéééééèèèèèèèèèèççççççæåããâââãâáàßßßÞÝÝÜÜÜÛÛÛÛÛÚÙØ××ÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÈÇÆÅÄÄÃÃÃÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÆÆÆÆÅÄÄÄÅÆÆÆÆÆÇÇÈÉÉÊÊÊÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍ̤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©«­­­¬«ª©©¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¥¥¥¥¥¥¥¥¦¦¦¦§¨¨¨¨¨¨¨©©©©ªªªª«¬­­®®¯¯¯°±°°°°°°°±±²²²²²²²²²±°°¯®®®­­­®®®­®®®®®®®®¯±²²³³³³´´´´´´´´´´´´´µµµ¶·¸¹¹¹¹¹¹¹¹ºº»»»»»¼¼½½½½½¾¾¾¾¾¿¿ÀÁÁÁÁÂÂÂÃÅÆÆÆÇÈÈÊÍÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÖØÚÚÛÛÜÜÞßàãççèèèééééêêêêêêêêêëëëëëëëêêêêêêêêêêêéééééèèèèèèèèèèèççççççåäãããããäâáàßßßÞÝÝÜÜÜÜÛÛÛÛÚÚÚÙØ×ÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒÒÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÆÆÆÅÄÃÃÃÃÃÂÂÂÂÂÂÃÃÂÂÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÆÆÆÆÆÆÆÆÇÈÈÈÉÉÊÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍ£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨©ª«««ª©©©¨¨¨¨¨¨¨§§¨¨§§¦¥¥¥¥¤¤¤¤¥¥¥¥¥¦¦¦§§¨¨¨¨¨¨©©©ªªªª«¬­­®®¯¯¯¯¯®¯¯¯¯¯¯¯°°°°°¯¯¯¯¯®®®­­¬¬«¬¬­¬¬¬­­­­­­®®¯±²²³³³´´´´´´´´´´´´´´´´µµ¶¶¸¸¹¹¹¹¹¹¹º»»»»»»¼¼¼½½½½¾¾¾¾¿ÀÁÁÁÁÁÂÂÃÄÆÆÆÇÇÈÉËÏÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÕÖ×ÙÚÛÛÛÜÝßàâåççèèéééééêêêêêêêêëëëêêêêêêêêêêêêêêêéééééééèèèèèèèèèèçççççæåääääååäâáàßßßÞÞÝÝÜÜÜÛÛÛÛÛÚÚÙØ×ÖÖÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÉÇÆÆÆÅÄÄÃÃÃÂÂÂÂÂÂÂÃÂÂÂÂÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÇÆÆÆÆÇÇÇÈÈÉÉÉÊËËÌÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏ£££££££££¤¤¤¤¤££¤¤¤¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨©ªªªª©©¨¨¨¨¨¨¨¨§¦¦¦§§¦¦¥¥¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦§¨¨¨¨¨¨¨©©©©©ªª«¬­®®®®®®®®®®®®®®®®®®®®®®®®®­­¬«««ªªªªª««««««¬¬­­®®®¯°²²³³³³´´´´´´´´´´´´´´´µµ¶··¸¹¹¹¹¹ºººº»»»»»¼¼¼½½½¾¾¾¿¿ÁÁÁÁÁÁÂÂÃÄÆÆÆÇÇÈÊÍÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕ×ÙÚÛÛÛÜÜÞßàäççèèèéééêêêêêêêêêëêêêêêêêêêêêêêêêêêêéééééééèèèèèèèèèèçççççæååååæææäâáàßßßÞÝÝÜÜÜÜÛÛÛÛÛÚÚÚÙØ×ÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÌÉÇÆÆÆÆÅÄÃÃÃÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÂÂÂÃÃÄÆÆÆÆÇÇÇÇÇÈÈÈÉÉÊÊÊËÍÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ£££££££££££££££££¤¤¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨©©©©©¨¨¨¨¨¨¨§§¦¦¥¥¦¦¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨¨©©©©©ªª¬­­­®®®®­­­­­®­­®­­­­­­­­­¬««ªªªª©©©©©©©©©ªªªªª««¬¬­®¯°²²³³³³³³³³³³³³³´´´´´µµ¶¶·¸¸¹¹¹¹ºººº»»»»»¼¼¼½½¾¾¾¾¿ÀÁÁÁÁÁÁÂÂÄÅÆÆÆÇÈÉÌÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÖØÚÛÛÛÛÜÝßàáåççèèèééêêêêêêêêêêêêêêêêêêêêêêêêêêêêéééééééééééèèèèèèççççççæææççççæäâàßßßßÞÝÝÜÜÜÜÛÛÛÛÛÚÚÚÚØ××ÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍËÉÈÇÆÆÆÅÄÃÃÃÂÂÂÂÂÃÃÃÂÂÂÂÁÁÂÂÂÂÂÂÃÃÄÅÆÆÆÇÇÈÈÉÉÉÊÊËÌÌÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ£££££££££££££££££££££¤¤¤¤¤¤¤¤¥¦§¨¨¨¨¨¨¨¨¨¨¨¨§§¦¦¦¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨¨©©©©ªª««¬¬­­­­­­­­­­¬¬¬¬¬¬¬¬«««ªª©©©©©©©¨¨¨¨¨¨¨©©©©©©©©©ª«¬­®¯±²²³³³³³³³³³³³³³´´´´´µµ¶··¸¸¹¹¹¹ºººº»»»»»»¼½½¾¾¾¿¿ÀÁÁÁÁÁÁÂÃÄÅÆÆÇÇÉËÏÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÕÕ×ÚÛÛÛÛÜÝÞßàâæçèèèèééêêêêêêêêêêêêêêêêêêêêêêêêêêêêéééééééééééèèèèèççççççççççççççåâààßßÞÞÝÝÝÜÜÜÜÛÛÛÛÛÛÛÚÚÚÙØ×××ÖÖ××××××ÖÖÖÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÇÇÆÆÆÄÄÃÃÂÂÂÂÃÃÃÃÃÂÂÂÂÂÂÂÂÂÂÂÃÃÃÄÆÆÇÇÈÉÉÊÊÊËËÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ£££££££££££££££££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨§¦¦¦¦¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©©©©ªªª««­­¬­­­­¬¬«««ªªªªªªªª©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©ª«­®¯°±²³³³²²²²²²³³³³³´´´´´µ¶¶··¸¹¹¹¹¹ºººº»»»»¼½½½¾¾¾¿¿ÀÁÁÁÁÁÂÂÃÄÆÆÇÇÈÊÍÐÐÐÐÐÐÐÐÐÑÑÑÒÒÒÓÓÔÕÕ×ÚÚÛÛÛÜÜÝßßáäççèèèéééêêêêêêêêêêêêêêêêêêêêêêêêêêêéééééééééééèèèèèççççççççççççççæãáàßßßßÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÙÙØØÙÙÙÙØÙØØ××ÖÖÖÕÕÕÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÊÉÈÇÇÆÅÄÃÃÂÂÂÂÂÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÄÄÆÆÇÇÈÊÊËËÌÌÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ£££££££££££££££££££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨§¦¦¥¥¥¥¥¥¤¤¤¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨©©©©ªª«¬¬¬¬­¬¬¬«ªªª©©©©ªª©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©ª«­®®¯°²²²²²²²²²²²²³³³´´´´´µµ¶¶·¸¹¹¹¹¹¹ºº»»»»¼¼½½¾¾¾¿¿¿ÀÁÁÁÁÁÂÃÃÅÆÆÆÇÉËÏÐÐÐÐÐÐÐÐÐÑÑÒÒÒÓÓÔÕÕ×ÙÚÛÛÛÜÜÝßßàâççèèèèééêêêêêêêêêêêêêêêêêêêêêêêêêêêêééééééééééèèèèèèççççççççççççççäâáàßßßßÞÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙØ×××ÖÕÕÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÌÊÉÉÇÆÆÅÄÃÃÂÃÂÂÃÃÃÄÄÄÃÃÂÃÃÃÄÄÄÄÅÅÆÆÆÇÈÉËÌÍÍÍÎÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ£££££¢¢¢££££££££££££££££¤¤¤¤¤¤¤¤¥¥¥¦§¨¨§¦¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨©©©©ª«««««ªª««ª©©©©©©©©©©©¨¨¨¨¨¨¨¨§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©ª«¬­®®°±²²²±²²²²²²²³³³´´´´´µµµ¶¶·¸¹¹¹¹ºººº»»»¼½½¾¾¾¾¾¿¿ÀÁÁÁÁÂÂÃÄÅÆÆÇÈÊÌÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÕÕ×ÙÚÛÛÛÛÜÝÞßàáåççèèèééêêêêëêêêêêêêêêêêêêêêêêêêêêêêêêêééééééééèèèèèèèççèèèèççççççäâáààßßßßßßÞÞÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÙÙØ×ÖÕÕÕÔÕÔÔÔÔÓÓÓÓÔÔÔÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌËÉÈÇÆÆÅÄÃÃÃÃÃÃÃÄÅÆÅÄÃÃÃÃÃÄÅÅÅÆÆÆÆÆÇÉËÌÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ£¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¥¥¦§¦¦¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§§¨¨¨¨¨¨¨¨©©©ªªªªª©©©©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§§¦¦¦§¨¨¨¨¨¨¨¨§§¨¨¨¨¨¨¨©©ª«¬­®¯°°°°°°°±±²²²³³³´´´´´´´µµ¶·¸¹¹¹¹¹¹º»»»¼½½½¾¾¾¾¾¿¿ÁÁÁÁÂÂÃÃÄÅÆÆÇÈÊÌÐÐÐÐÐÐÐÐÑÑÑÒÓÓÓÔÔÕÖØÚÚÛÛÛÜÜÞßàáãççèèèèééêêëëêêëêêêêêêêêêêêêêêêêêêêêêêêêéééééééèèèèèèèèèèèèèèèççççäãâáààßßßßßßÞÞÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙ×ÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÊÉÈÇÆÆÅÄÃÃÃÄÄÄÄÅÆÅÄÃÃÃÃÃÄÅÆÆÆÆÆÆÇÈÉËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐТ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦§¨¨¨¨¨¨¨¨©©©ª©©©©©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¥¦¥¥¦¦§§§§§¦¦¦¦¦¦§¨¨¨¨¨©©©ª«­®®®¯¯¯¯¯¯°°±²²³³³³´´´´´´µµ¶·¸¹¹¹¹¹¹º»»»¼½½¾¾¾¾¾¾¿ÀÁÁÁÂÂÂÃÃÄÆÆÆÇÈÊÎÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÖ×ØÚÛÛÛÛÜÝßßàãççèèèéééêêêëëëëêëêêêêêêêêêêêêêêêêêêêêêêêééééééèèèèèèèèèèèèèèèèçççåãâáààßßßßßßßßÞÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙØ×ÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÉÈÆÆÆÅÄÄÄÄÄÅÅÆÆÆÅÄÄÄÃÃÄÅÆÆÆÆÇÇÇÉÊËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐТ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦§¨¨¨¨¨¨¨©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§§¨§¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¨¨¨¨¨¨¨©ª«¬­®®®®®®®¯¯°±²²²²³³³³´´´´´µ¶·¸¸¹¹¹¹ºº»»¼½½½½½¾¾¾¾¿ÁÁÁÁÁÂÂÃÄÅÆÆÆÇÉÌÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÕÕÖ×ÚÚÛÛÛÜÜÞßàâæçèèèéééêêêêëëëëëëêêêêêêêêêêêêêêêêêêêêêêéééééééèèèèèèèèèèèèèèèçççåãâáààßßßßßÞßßÞÞÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙØ××ÖÖÖÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÉÉÇÆÆÆÅÅÄÅÅÅÅÆÆÆÅÅÄÄÄÄÄÆÆÆÆÇÇÈÉÊÊËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐТ¢¢¢¢¢¢¡    ŸŸŸ ¡¡¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££¤¤¤£££££¤££¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¦¦¦¦¦¥¥¤¤¤¤¤¥¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§§¨¨¨¨¨©©ª«¬­­­®®®®®¯°±±²²²²²³³³³´´´µ¶¶··¹¹¹¹ºº»¼½½½½½½¾¾¾¿ÀÁÁÁÁÁÂÂÃÄÅÆÆÆÈËÐÐÐÐÐÐÐÐÑÑÑÒÓÓÓÔÕÕÖÖØÚÛÛÛÛÜÝßàâåççèèéééêêêêêëëëëêêêêêêêêêêêêêêêêêêêêêêéééééééééèèèèèèèèèèèèèèçççæäâáààßßßßßßÞÞÞÞÞÞÝÝÝÝÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙØ××ÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÉÈÇÆÆÆÆÆÅÆÆÅÆÆÆÅÅÅÄÄÄÅÆÆÆÆÇÈÉÊÊËËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐТ¢¢¡¡ ŸžžžžžžŸ  ¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨©©ªª««¬¬­­®®®¯¯°°°±²²²²³³³´´´µµ¶·¸¹¹¹¹º»»¼¼½½½½½¾¾¾¿ÀÁÁÁÁÂÂÃÄÅÆÆÆÈÊÎÐÐÐÐÐÐÐÐÑÑÒÒÓÓÔÔÕÕÖ×ÙÚÛÛÛÜÜÞßáãççèèèééêêêêêêëëëêêêêêêêêêêêêêêêêêêêêêêééééééééééèèèèèèèèèèèèèççççåãâáààßßßßßßÞÞÞÞÞÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚØØ×××ÖÖÖÕÕÕÕÔÔÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌËÉÇÇÆÆÆÆÆÆÆÆÆÆÆÆÅÆÆÅÅÆÆÆÆÇÈÉÊÊËËËÌÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐТ Ÿžžœœœœœœ››œœœœœœž ¡¡¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨§§§¦¦¦¦¥¥¤¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©©©ªªª««¬­­®®®®¯°°±²²²²³³´´´µ¶¶·¸¹¹¹º»»»»¼¼½½½¾¾¾¿ÀÁÁÁÁÂÂÂÃÄÅÆÆÈÊÌÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÖ×ØÚÛÛÛÜÜÝßàâæççèèéééêêêêêêëêêêêêêêêêêêêêêêêêêêêêêêéééééééééééèèèèèèèèèèèèççççæäãâáààßßßßßÞÞÞÞÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚÙØØ×ÖÖÕÕÕÕÕÕÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÇÇÆÆÆÆÆÆÆÆÆÅÅÅÅÆÆÆÆÆÆÇÇÈÊËËËÌÍÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐПžœœ›››ššššššššššš››œžŸ¡¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤££££££££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¥¥¦§§¨¨¨¨§§§¦¦¦¦¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§§¨¨¨¨©©©©©©©ªª«¬­®®®®¯¯¯°°±²²³³³´´µ¶¶·¸¹¹¹º»»»»»¼½½½¾¾¿ÀÁÁÁÁÂÂÂÃÃÅÆÆÇÉÌÏÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÔÕÖØÚÚÛÛÛÜÝßßáåççèèèéééêêêêêêêêêêêêêêêêêêêêêêêêêêêéééééééééééééééèèèèèèèèèèççççææãâáààßßßßßÞÞÞÞÞÝÝÝÝÝÝÞÞÞßßÞÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÙØ×ÖÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÌÊÈÇÇÆÆÆÆÆÆÆÆÆÆÅÅÆÆÆÆÆÇÇÈÉÉÊËÌÍÏÏÏÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐМœ››ššššš™šš™™™™™™™ššš››››œž ¢¢¢¢¢¢¢££££££¤¤¤¤¤¤££££££££££££££££££££££££££££££££¤¤¤¤¤¤¤¤¥¥¦¦¦§§¦¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨©©©ªª«¬­­­®®®®¯¯¯°²²²³³´´µµ¶·¹¹¹¹ºº»»»»¼¼½½¾¾¿ÁÁÁÁÁÁÂÃÃÄÆÆÇÉËÎÐÐÐÐÐÐÐÐÑÑÑÒÓÓÓÔÔÕÖ×ÙÚÛÛÛÜÜÞßáäçççèèéééêêêêêêêêêêêêêêêêêêêêêêêêêêééééééééééééééééèèèèèèèèèèèçççæåãâáààßßßßßÞÞÞÞÞÝÝÝÝÝÝÞÞßßßßÞÝÝÝÝÝÜÜÜÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚÙØ×ÖÖÖÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÉÈÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÈÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЛšššš™™™™™™™™™™™™™™™™ššššš›œžŸ ¢¢¢¢¢¢¢££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¢¢££££££££££¤¤¤¤¤¤¤¤¥¥¥¥¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨¨¨©©ªª««¬¬¬­­®®®¯°±²²³³´´µµ¶·¸¹¹¹ººº»»»¼½½¾¾¿¿ÁÁÁÁÁÁÂÃÄÆÆÇÈÊÍÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÔÕÖØÚÛÛÛÛÜÝßàâæççèèèééééêêêêêêêêêêêêêêêêêêêêéééêéééééééééééééééééèèèèèèèèèèççççäâáààààßßßßÞÞÞÞÞÞÝÝÝÝÝÝÞÞßßßÞÞÞÝÝÝÜÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚØ×ÖÖÖÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÇÇÇÇÇÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÈÉÊËËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐКš™™™™™™™™™™˜˜˜™™™™™™™™™™™š›œœžŸ ¡¢¢¢¢££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££££££££¤¤¤¤¤¥¥¥§¨¨¨¨¨¨¨¨¨¨¨¨©©©ª«««««¬­®®®¯°±²²³´´´´µ¶¶¸¹¹ºººº»»¼½½¾¾¾¿ÀÁÁÁÁÁÁÂÃÅÆÇÈÉËÏÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÖØÚÛÛÛÛÜÝßàáãçççèèèééééééééêêêêêêêêêêêêêêéééééééééééééééééééééééèèèèèèèèèçççæäâáààààßßßßßßßßÞÞÝÝÝÝÝÝÞÞßßßßßßÞÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚØ×ÖÖÕÕÕÕÕÔÔÔÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÊÉÈÇÇÇÇÆÆÆÆÆÆÆÆÆÇÇÇÇÈÈÉÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÐÐÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЙ™™™™™™™™™˜˜˜——˜˜˜˜˜™™™™™™™šš›››œž ¡¢¢¢£££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££££££££££££££££££££¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨¨¨¨©©©ªªªªª««­®®®¯°²²³³´´´´µ¶·¹¹¹¹ºº»»»¼½½¾¾¾¿ÀÁÁÁÁÁÂÂÄÆÆÇÈËÎÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÖ×ÚÚÛÛÛÜÝßßàâåçççèèèèèéééééééêêêêêêêêêêêééééééééééééééêéééééééééééèèèèèèèçççåäâáààààßßßßßÞÞßßÞÞÝÝÝÞÞÞßßßßßßßßßÞÞÝÝÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚÙ×ÖÖÕÕÕÕÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÈÇÇÇÇÇÇÆÆÆÆÇÇÇÈÈÈÈÉÊÊÊËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÐÐÐÐÐÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЙ™™™™™™˜˜˜——––––—————˜˜˜˜™™™šššš››œžŸ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡¡¡¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££££££¢¢¢£££££££££££¤¤¤¤¤¤¥¥¦§§§§§§¨¨¨¨¨¨¨©©©©©©©ªª«­®®®¯±²³³´´´´´µ¶·¹¹¹¹ºº»»»¼½½¾¾¾¿ÀÁÁÁÁÁÂÃÅÆÆÈÊÍÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÕÕ×ÙÚÛÛÛÜÜÞßàáâåççèèèèèèèééééééêêêêêêêêêêéééééééééééééééêééééééééééééèèèèèçççåãâáààààßßßßßÞÞßßÞÞÞÞÞÞßßßßßààààßßßÞÞÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚØ×ÖÖÖÕÕÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÉÈÈÈÇÇÇÇÇÇÇÈÈÈÉÉÉÉÊËËÌÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÐÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЙ™™˜˜˜˜˜˜—–––•••–––––––——˜™™™™™ššš›œŸ¢¢¢¢¢¢¢¢¢¡¡ ¡  ¡ ŸŸŸžŸ  ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££££££££¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££££££¢¢¢¢¢¢¢¢££££¢¢¢£££££¤¤¤¤¤¤¥¥¦¦¦¦¦§¨¨¨¨¨¨¨¨¨¨¨¨©©©©ª¬­­®®°²²³³³´´´´µ¶·¹¹¹¹ºº»»»½½½¾¾¾¿ÀÁÁÁÁÂÂÄÅÆÇÊÍÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÕÕÖÙÚÛÛÛÛÜÝßßàáãççççèèèèèèèééééééêêêêêêêêêêééééééééééééêéêééééééééééééèèèèèççæãâááààßßßßßßÞÞßÞÞÞÞÞÞßßßßßààààààßßßÞÞÞÝÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚØ×ÖÖÕÕÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÈÈÈÈÇÇÇÇÈÈÉÉÊÊËËÌÌÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÐÑÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐȘ˜˜˜———––••••••••••••••–—˜˜™™™™™šš›œž ¡¢¡ŸžœŸžžŸŸŸ ¡¢¢¢¢¢¢¢¢¢¢¢¢¢£££££££££££££¤¤¤¤¤¤££££££££££££££££¢£££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¥¥¦¦¦¦¦¨¨¨¨¨¨¨¨¨¨¨¨©©©ªª¬­®®¯±²²³³³³´´´µ¶¸¹¹¹¹ºº»»¼¼½½¾¾¿¿ÀÁÁÁÁÂÃÄÆÇÊÎÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÕÕÖØÚÛÛÛÛÜÜÝßßàáäççççççèèèèèééééééêêêêêêêêêêééééééééééééééêêêéééééééééèèèèçççæãâááàßßßßßßÞÞÞÞÞÞÞßÞÞßßßßßààáááààßßßÞÞÞÞÝÝÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÙ×ÖÖÕÕÔÔÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÊÉÉÉÈÈÈÈÉÉÉÉÊËÌÎÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÐÐÐÑÑÑÐÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐȘ——–––––••••••••••••••••––˜˜™™™™™™šš›œœ››››šš››œœœœœœœœžžžŸ ¡¢¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££¤£££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¦§¨¨¨¨¨¨¨¨¨¨¨©©©©ª¬­®¯°±²²²³³³´´´µ¶¸¹¹¹¹º»»»»½½¾¾¾¾¿ÀÁÁÁÁÂÃÅÆÈÌÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÖØÚÛÛÛÛÜÜÝÞßßàáãåçççççèèèèèèèééééêêêêêêêêêêéééééééééééééêêêêééêéééééèèèèççççãâáààßßßßßßÞÞÞÞßßßßßßßßßßßààáââáàßßßßßÞÞÞÞÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚØ×ÖÕÕÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍËËËÊÉÉÉÉÉÉÉÉÊËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÑÐÐÐÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЗ–––•••••••••••••••••••••••–—˜™™™™™™šš›››››šššššššššš››››››œœœœœž    ¡¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨¨¨¨©©ª«¬®®¯°°±²²²³³´´´¶·¹¹¹¹¹º»»»¼½¾¾¾¾¾¿¿ÁÁÁÂÃÄÆÇÉÏÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÕÖØÚÛÛÛÛÜÜÝÞßßàáâåçççççèèèèèèèèéééêêêêêêêêêéééééééééééééêêêêêêêêééééèèèçççççãâáààßßßßßßßÞÞßßßßßßßßßßßßààáââáààßßßßßßÞÝÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÕÔÔÔÓÓÓÒÒÒÒÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÍÌÌËËÊÊÊÊÊÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÐÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЖ–••••••••••”””””””””””•••••–—˜™™™™™™™šššššš™™™™™™™™ššššš››››œœœœœœžžžžŸŸ  ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££££¢¢¢¢¢¢¢¡    ŸŸ ¡¢¢¢ ŸŸŸ  ¡¢¢¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§§¨¨¨¨¨¨¨¨¨¨¨©©«¬­®®®¯¯°²²²³´´´µ¶·¸¹¹¹ºº»»»½½½½¾¾¾¿ÀÁÁÁÂÃÆÆÈÌÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÔÕÖ×ÙÛÛÛÛÛÜÜÞßßßàáãåççççççèèèèèèèéééêêêééêêêêééééééééééééêêêêêêêêééééèèèèççççäâáààßßßßßßßßßßßßßßßßßßßßààáââââáàßßßßßßÞÞÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚØ×ÖÕÕÕÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÎÎÍÌÌÌÌÌÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЕ•••••••••”“““’’’’’’’““”•••••–—˜˜™™™™™™™™™™™™™™™™™™™™™™šššš›››››››››››œœœœœžŸŸ  ŸŸŸžžŸ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢  Ÿžžžœžžžžžžž      ¡¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¥¦¦§§§§§¨¨¨¨¨¨¨¨©ª«­­®®®®¯°±²³³´´µµ¶·¸¹¹¹ºº»»¼½½½½¾¾¾¿ÀÁÁÁÂÄÆÇÊÏÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÔÕÕÖØÚÛÛÛÛÜÜÝÞÞßßàáâäåççççççèèèèèèéééééééééêêéééééééééééééêêêêêêêêéééèèèèççççåãáààßßßßßßßßßßßßßßßßßßßààááââââáààßßßßßßÞÞÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÚÚØÖÖÕÕÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЕ•••••••”“’’’’‘‘‘‘‘‘‘’’“”•••••––—˜˜˜˜™™™™™™™™™™˜˜˜˜™™™™™™™ššššššššššššš››››››œœœœœœž  ¡¢¢¢¢¢¢¢¢¢¡Ÿžœœ››››œœ›››››››œœžŸ ¡¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¥¥¦¦¦¦¦¦§§¨¨¨¨¨¨©ª«««¬­®®®¯°²²³´´´µµ¶·¸¹¹¹º»»»¼½½½½¾¾¾¿ÁÁÁÂÃÅÆÉÌÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÔÔÕÖ×ÚÛÛÛÛÜÜÝÝÞßßàáâããåççççççèèèèèèéééééééêéêêêéééééééééééêêêêêêêêéééèèèèççççåãáàßßßßßßßßßßßßßßßßßààààáââââãâáààßßßßßßßÞÞÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÙØÖÖÕÕÔÔÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЕ•••••”“’‘‘‘‘‘‘‘‘‘‘‘‘‘‘’“”•••••••––—˜˜˜˜˜˜˜˜˜˜˜—˜˜˜˜˜™™™™™™™šššš™™™™™™™šššššššš›››œ›››››››œž    ŸžŸžœ›››››ššššššššššššš››œœœ›››œœžŸ ¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¥¥¦¥¥¥¥¦¦¦§¨¨¨¨©ªªªª««­­®®¯±²³³´´´´µµ¶¸¹¹¹º»»»¼½½½¾¾¾¾ÀÁÁÁÂÄÆÈËÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÕÕ×ÙÚÛÛÛÜÜÜÝÝÞßààáââãäçççççèèèèèèèééééééééêêêêéééééééééééêêêêêêêêééèèèèçççæäâáààßßßßßßßßßßßßßßßßààáââãããããâááàßßßßßßßßÞÞÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÖÕÕÔÔÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЕ••””“’‘‘‘‘‘’””•••••••••––——————–––––———˜˜˜™™™™™™™™™™™™˜˜™™™™™™™™™ššššššššššššš››œœœœœ›››šššššššššššššššššššš›››šš›››œœžŸ¡¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¥¥¦¦§¨¨¨©©©©©ªª«­­®¯±²²³³´´´´µµ¶¹¹¹º»»»»¼¼½½¾¾¾¿ÀÁÁÂÃÆÇÊÏÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÔÔÕÖÙÚÛÛÛÜÜÜÜÝÞßßààááâãåçççççççèèèèèééééêêêêêêêêéééééééééééêêêêêêêééèèèèçççæäâáààßßßßßßßßßßßßßßßßàááâãäääããâáááààßßßßßßßßÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚØÖÖÕÔÔÔÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЕ•”“’‘‘‘‘’“”•••••••••••–––––––•••––––—˜˜˜˜˜™™™™™˜˜˜˜˜˜˜˜™™™™™™™™™™™™™™™™™™™šššš››››››››ššššššš™™™™™™™™™™™™ššššššššššš›››œžŸ¡¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¥¤¤¤¥¥¥¥¥¦¦¨¨¨¨©©©©©ª«¬­®¯°±²³³³´´´´µ¶¸¹¹ºº»»»»¼½½½¾¾¾¿ÁÁÂÃÅÇÉÎÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÔÔÕÖØÚÛÛÛÛÜÜÜÝÞßßßßàááâãæçççççççèèèèèéééêêêééêêêêééééééééééêêêêêêêééèèèèçççåäâáààßßßßßßßßßßàààààààáâãääääããâááàààààßßßßßßÞÞÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚØÖÕÕÔÔÔÓÓÓÓÒÒÒÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐД“’‘‘‘‘‘’“””””•••••••••••••••••••••––—————˜˜™˜˜———–––—˜˜˜˜˜˜˜™™™™™™™™™™™™™™™ššššš›ššššššš™™™™™™™™™™™™™™™™™™™™™ššššššš›››œžŸ¡¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦¨¨¨¨©©©©©ªª¬­®®¯°²²³³´´´´µ¶·¹¹¹º»»»»¼¼½½½¾¾¿ÁÁÁÂÅÆÈÍÐÐÐÐÐÐÑÑÑÑÑÑÒÓÓÓÔÔÕÖØÚÛÛÛÛÜÜÜÝÞßßßßßàáâãäæçççççççèèèèèéééêêééêêêêêéééééééééêêêêêêêééèèèèçççåãâááàßßßßßßßßàààààààááâãäääääããââáààààààßßßßßÞÝÝÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÕÔÔÔÓÓÓÒÒÒÒÒÒÒÒÒÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐВ‘‘‘‘’’“““”””””••••••••••••••••••–––––—˜——–––––––––—————˜˜˜™™™™™™™˜˜™™™™™™ššššššš™™™™™™™™™™™™™™™™™™™™™™™™™™šššššššš››œŸ ¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦¨¨¨¨¨¨©©©©ª«¬­­®¯°²²³´´´´µµ¶·¹¹¹º»»»»¼½½½¾¾¿ÀÁÁÂÄÆÈÊÎÐÐÐÐÐÐÑÑÑÑÑÒÓÓÓÔÔÕÖØÚÛÛÛÛÜÜÜÝÝÞßßßßàááãäåçççççççèèèèèèéééêéééêêêêêêéééééééêêêêêêêééèèèèçççåãâááààßßßßßßàààààáááââãåæåååäãââââáààààààßßßßÞÞÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÕÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐБŽŽŽŽŽ‘‘‘‘‘’’’’’’“”••••••••••••••••••••••–––••••••••••––––––—˜˜˜˜˜˜˜˜˜˜˜˜™™™™™™š™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™š™ššššššš››œžŸ¡¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨©©©©ªª««­®®°±²³³´´´´µµ¶¸¹¹¹º»»»¼¼½½¾¾¾ÀÁÁÂÃÆÇÉÌÐÐÐÐÐÐÑÑÑÑÑÒÓÓÓÔÔÕÖØÚÛÛÛÛÜÜÜÝÝÞÞßßßààáâãäæçççççççèèèèèééééêêêêêêêêêêêêêêéêêêêêêêêééèèèèççççåãâáààààßßààààáááâââãäåççææåãâââââáááàààààßßßßÞÞÞÝÝÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÖÕÕÔÔÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÑÑÑÑÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐАŽŽŽ‘‘‘‘‘‘’’““”•••••••••••••••••••••••••••••••••••••••–––——––––——˜˜˜˜˜™™™™™™™™™™™™™™™™™™™™™™™˜™™™™™™™™™™™™™ššššššš›œžŸ¡¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©©©ªª«¬­®¯±²³³´´´´´µ¶·¹¹¹º»»»»¼¼½½¾¾¿ÁÁÂÃÅÆÇÉÌÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÕ×ÙÚÛÛÛÛÛÜÜÝÝÝÞßßßßàááâãäåæççççççèèèèéééééêêêêêêêêêêêêêêêêéééééééééèèèççççæäâááààààààààááâãããäåæççççæåäãââââááàààààààßßßßÞÞÞÞÝÝÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚØ×ÖÕÕÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐАŽŒŒŒŒŽŽ‘‘‘’’“”••••••••••••••••••••••••••••••••••••••••••••••••–––——˜˜™™™™™™™™™™™™™˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™™™™™ššššššš›œŸ¡¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦¨¨¨¨¨¨¨©©©ªªª«­®®°²²³³´´´´´µ¶¸¹¹ºº»»»»¼¼½¾¾¿ÁÁÁÂÃÆÆÇÉÎÐÐÐÐÐÑÑÒÒÒÓÓÔÔÕÖ×ÙÚÛÛÛÛÛÛÜÜÝÞÞßßßßààááâãäåæççççççèèèèééééêêêêêêêêêêêêêéééééééééééèèèèçççççåãâááàààßàààáâãääååæçççççæåäãâââááàààààààààßßßßßßÞÞÞÞÞÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙØÖÕÕÔÔÔÓÓÓÓÒÒÒÒÓÓÓÓÒÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐАŽŒŒŒŒŒŒŒŽŽ‘‘‘‘’”•””••••••••••••••••••”””””””••••••••••••••••••••••––––—˜™™™™™˜˜˜˜™˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™™™™™šššššš›œŸ ¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨¨©©©©ªª««¬®®°²²³³³´´´´µµ·¹¹¹º»»»»»¼½½¾¿ÁÁÁÂÂÄÆÆÈËÐÐÐÐÐÑÑÒÒÓÓÔÔÔÕÖ×ÙÚÚÛÛÛÛÛÜÜÜÝÞßßßßßààáâããääåçççççèèèèééééêêêêêêêêêêêêééééééééééééèèèèèççççæäãâááàààààááããäåæççççççææåãâââáááàààààààáàààßßßßßßßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÒÑÑÑÑÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐАŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’““““””””””””””””””””““’’’’’’“““””””•••••••••••••••••••––—˜˜™˜˜˜˜˜˜˜˜˜——————————————˜˜˜™™™™™™™ššššš››œžŸ¡¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©©©©ª«¬­®®°±²²³³³´´´´µ¶¸¹¹ºº»»»»¼½½¾¾ÀÁÁÁÂÃÅÆÇÊÐÐÐÐÐÐÑÑÒÓÓÔÔÕÕÕÖØÚÚÚÛÛÛÛÛÜÜÜÝÞÞßßßßàáââããääåççççèèèèééééêêêêêêêêêêééééééèèèèèèèèèèèèèççççåãââááááàààáâãäåæçççççççåäåãâââááààßßßàààáááààßßßßßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÒÒÒÒÒÒÒÒÒÒÓÓÒÒÒÒÒÑÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐЏŽŒŒŒŒŒŒŒŒ‹‹‹ŒŒŒŒŽ‘‘‘’’’’’’’““”““’’’’““’’‘‘‘‘‘‘‘‘’’’’’““”””•••”””””””••••••••–—˜˜˜˜———————––––––––––––––—˜˜˜™™™™™™™ššš››œœžŸ¡¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©©©ªª«­®®¯°²²²³³³´´´µ¶·¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÂÃÅÆÈÍÐÐÐÐÐÑÑÒÓÓÓÔÕÕÕÖ×ØÙÚÚÛÛÛÛÛÜÜÝÝÞÞßßßàáááâããäåççççèèèèèééééêêêêêêêêéééééèèèèèèèèèèèèèèèèçççåãââáááâááááâãäåçççççççæåääãâââááààßßßààààáááàààààßßßßÞÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÕÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÒÒÒÒÒÒÒÒÓÓÒÒÒÒÒÒÒÒÓÓÒÒÒÒÒÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐЍŒŒŒŒ‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘‘‘‘‘‘‘’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’“““““’’’’’“”””•••••••–————–––––––––––––––––•••–––—˜˜˜˜™™™™šššš››œžŸ¡¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©©ªªª«­®®¯°±²²²³³³´´µ¶·¹¹¹ººº»»¼½½¾¾¾¿ÁÁÁÁÃÄÆÇÊÏÐÐÐÐÐÑÑÒÓÓÔÔÔÕÖ××ØÙÚÛÛÛÛÛÛÜÜÝÞÞßßßààààáâãäåçççççèèèèéééééêêêêêêééééèèèèèèèèèèèèèèèèèèçççåäãâáââãâááâãäæççççççççæååäãââââáààßßàààààááâááàààààßßÞÞÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÚÚØ×ÖÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐЌŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’“““””••••••–•–••••••••••••••••••••••–––˜˜˜˜˜™™™™ššš››œžŸ¡¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©©ªªª«­®®®¯°±²²²³³´´´µ·¹¹¹¹ºº»»¼½½½¾¾¾ÀÁÁÁÂÄÆÆÈÌÐÐÐÐÐÐÑÑÒÓÓÔÔÕÕÖ××ÙÚÛÛÛÛÛÛÛÜÜÝÞßßßßàààááãåæçççççèèèèèéééééêêêéééééèèèèèèèèèèèèèèèèèèèçççåãââááââããââãäçççççççççæåääãâãââáàààààààààááââáááááàßßßÞÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÚÚØ×ÖÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐЌ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽŽŽŽŽ‘‘‘‘‘‘’’’’“”•••••••••••••••••••••••••••••••–————˜˜™™™™šš››œžŸ¡¢¢¢¢¢££££££££££¤¤££¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨©©©ªªª¬­®®®¯¯°±²²³³´´´µ·¸¹¹¹¹º»»»¼½½½¾¾¿ÀÁÁÂÃÅÆÇÊÐÐÐÐÐÐÑÑÒÒÓÓÔÔÕÕÕÖ×ÚÚÛÛÛÛÛÛÜÜÜÝÞßßßßàààáâäççççççèèèèèèèééééééééééèèèèèèèèèèèèèèèèèèèççççäãââááâããããããäççççççççææåääããããâááààààààààáááââââááààßßßÞÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚÙ×ÖÖÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÓÒÓÒÓÓÓÓÓÓÓÓÓÓÓÔÓÔÔÔÔÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐЋ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘‘’“”•••••••••••••••••••••••••••••••–———˜˜˜™™™™š››œžŸ¡¢¢¢¢¢££££££££££££££¤¤¤¤¤¤¤¤¤¤¥¦§¨¨¨¨¨©©ªª«¬­®®®®¯¯±²²³³´´´µ¶·¹¹¹¹º»»»¼¼½½¾¾¾ÀÁÁÂÃÄÆÇÉÎÐÐÐÐÐÐÑÑÒÓÓÓÔÔÔÕÕÖØÚÚÛÛÛÛÛÛÜÜÝÝÞßßßàààáâãåççççèèèèèèèèèèèééééééèèèèèèèèèèèèèèèèèèèèççççåããâââãääääääæççççççççæåääääääãââááàààààààááââãäãââááàßßßÞÝÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚÙ×ÖÖÕÕÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÓÓÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐЋ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽŽŽŽŽŽ‘‘’””•”••””••••••••••••••••••••••••–———˜˜˜™™™™š››œžŸ ¢¢¢¢¢£££££££££££££££¤¤¤¤¤¤¤¤¤¥¦§¨¨¨¨¨©©©ª«¬­®®®¯¯¯±²²³³´´´µ¶·¹¹¹¹º»»»¼¼½½¾¾¾ÀÁÁÂÃÄÆÇÉÌÐÐÐÐÐÐÑÑÑÒÓÓÔÔÔÕÕÖ×ÙÚÚÚÛÛÛÛÛÜÜÝÞßßßßààááâäççççèèèèèèèèèèèèèéèèèèèèèèèèèèèèèèèèèèèèèççççæåäãããäääååæçççççççççæåäääääääãâáááàààààààáááâãäåããâáààßßßÞÞÝÝÝÜÝÜÜÜÜÜÜÛÛÛÛÛÛÛÚÙØØ×ÖÕÕÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÐÑы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽŽŽŽŽ‘‘“““““““““””•••••••••••••••••••••––——˜˜˜™™™™šš›œžŸŸ ¢¢¢¢¢££££££££££££££¤¤¤¤¤¤¤¤¤¥¦§¨¨¨¨¨©©ªª«¬­®®®¯¯¯±²²³³´´´´µ·¹¹¹ºº»»»¼¼½½¾¾¿ÀÁÁÂÃÄÆÇÉËÏÐÐÐÐÐÐÑÑÒÒÓÓÔÔÔÕÖ××ØÙÚÛÛÛÛÛÜÜÜÝÞßßßßàááãäæçççççèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèçççèèççççççæåååææåææççççççççççåääääääåäââááàààààààààááââãååäãâáààßßßßÞÞÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÙ×ÖÕÕÕÕÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽ‘‘’’’’’‘‘’’“””””””••””••••••••••••––——˜˜˜™™™™šš›œŸžŸ ¡¢¢¢¢££££££££££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ªªª«­®®¯¯¯°±²²³³´´´µµ¶¹¹¹ºº»»»¼¼½½¾¾¿ÀÁÁÁÂÃÆÆÈËÎÐÐÐÐÐÐÑÑÑÒÓÓÔÔÔÕÕÖÖ×ÙÚÚÛÛÛÛÛÜÜÝÞßßßßàáâãäæççççççççèèèèèèèèèèèèèèèèèèèèèèèèèèççççèçççççççççççççææçççççççççççæåäåååæåäãâááàààààààààáââãäåççåãâáàààßßßßÞÞÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÚÚÙØÖÖÖÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÖÖÖÖ×××ØØ×ÖÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŒŒŒŒŒŒŒŒŒŒŒŒ‹ŒŒŒŒŒŒŒŒŽŽŽŽ‘‘‘‘‘‘‘‘‘‘’““““““””””””••••••••••––——˜˜˜™™™™™ššœœŸžž ¢¢¢¢££££££££££££££¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨©©ªªªª«­®®¯¯°°²²²³³´´´´µ¶¸¹¹º»»»»¼½½½¾¾¿ÀÁÁÁÂÂÄÆÇÊÎÐÐÐÐÐÐÐÑÑÒÓÓÓÔÔÔÕÕÖÖ×ÙÚÛÛÛÛÛÛÜÜÝÞßßßààáãäæççççççççççççççèèèèèèèèèèèèèèèèèèçççççèççççççççççççççæççççççççççççæææææææåäâááààààààààààáâããäæççæåäâáààßßßßßÞÞÝÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÙØ×ÖÖÖÖÖÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖÖ×××ØÙØØ×ÖÖÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÓÓÓÓÒÒÒÒÑÑÑÑÑы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽŽŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽŽŽŽŽŽŽŽ‘‘‘‘’“““’’’’““““””•••••••••––—˜˜˜™™™™™šš››œžžŸ¡¢¢¢¢££££££££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ªªªª«­­®®¯°±²²²³³³´´´µ¶¸¹¹ºº»»»¼¼½½¾¾¿¿ÁÁÁÁÂÃÅÆÉÍÐÐÐÐÐÐÐÑÑÒÒÓÓÓÔÔÔÕÕÖ×ØÚÛÛÛÛÛÛÜÜÝÞßßßààáãääååæççççççççççççççççççççèèèèèççèèççççççççççççççççççççæççççççççççççççççççæåãâááààààààààààáâãååççççæåãááààßßßßßßÞÞÞÝÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÙØØ××ÖÖÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×××ØØÙÙÙÙØ×ÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÑÑÑы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽŽŽŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽ‘‘’“’’‘‘’’“’’““”••••••••––——˜˜™™™™™ššš››œžžž ¢¢¢¢¢¢££££££££££££¤¤¤¤¤¤¥¦¦§¨¨¨¨¨©©©©ªª«¬­®®°±²²²²³³³´´´µ¶¸¹¹ºº»»»¼½½½¾¾¿¿ÀÁÁÁÁÂÄÆÈËÏÐÐÐÐÐÐÑÑÑÒÓÓÓÔÔÔÕÕÖ×ØÚÛÛÛÛÛÛÜÜÝÞÞßßßàáâââãããããääæçççççççççççççççççèèèçççèèèçççççççççççççççççççççççççççççççççççççåäãâáààààààààààááâãäæççççççäâááàààßßßßßÞÞÞÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÚÚÚÙ×ÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ××××ØØÙÙÙÚÙÙÙØ×ÖÖÖÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÔÓÓÓÓÓÓÒÒÒÒÒÒы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽŽ‘‘’’‘‘‘‘’’’’’“”•••••••–––——˜˜™™™™™ššššš›œŸ ¢¢¢¢¢¢££££££££££££¤¤¤¤¤¥¥¦§¨¨¨¨¨©©©©©ª««¬­®¯°°±²²²³³³´´´µµ·¹¹¹º»»»¼½½¾¾¾¾¿ÀÁÁÁÁÂÄÆÇÉÍÐÐÐÐÐÐÐÑÑÒÓÓÓÓÔÔÔÕÕÖØÚÚÛÛÛÛÛÜÜÜÝÞÞßßààáááááâááââäåæçççççæççççççççççèèççççèèççççççççççççççççççççççççççççççççççççæäãâááàààààààààáááââäæççççççåãââááàßßßßßÞÞÞÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚØ×ÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖ××ØØØØØÙÚÚÚÚÚÚÚÚÙØ××ÖÕÕÕÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÒÒÒҋ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽ‘‘‘‘‘‘‘‘‘’‘‘‘’“””••••••––—˜˜˜™™™™™™šššš››žŸ¢¢¢¢¢¢££££££££££££¤¤¤¤¤¤¥¦§¨¨¨¨¨©©©©ªªªª«¬®®¯°±²²²³³´´´´´µ¶¸¹¹ºº»»¼½½¾¾¾¾¿¿ÁÁÁÁÂÄÆÆÉÌÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÕÕÖØÚÚÚÛÛÛÛÛÜÜÜÝÞßßßàààààààààááâãåçççæååååæççççççççèèçççççççççççççççççççççççççççççèèçççççççççæäãââááàààààààààááââãäæçççççççåäãâáàßßßßßÞÞÞÝÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÚÚÙØ××ÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖ×ØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚØ××ÖÕÕÕÔÔÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÕÕÕÕÕÕÖÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒҋ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘‘‘‘‘‘‘‘’“”•••••••–—˜˜˜˜™™™™™™™ššš›œž ¢¢¢¢¢££££££££££££¤¤¤¤¤¤¥¦§¨¨¨¨©©©©ªªªªª«¬®®¯°²²²³³³´´´´´µ¶¸¹¹ºº»»¼½½¾¾¾¾¿¿ÁÁÁÁÂÃÅÆÈËÏÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÔÔÕÖØÙÚÚÛÛÛÛÛÛÜÜÝÝÞßßßßßßßßààààááâãååæåäääããäåæçççççèèèèèèèççççççççççççççççççççççèèèèçççççççççåäãââáááààààààààááâããäæçççççççæåãáààßßßÞÞÝÝÞÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÙØ××ÖÖÖÖÖÖÖÕÕÕÕÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖ××ØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙØ×ÖÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÔÔÔÓÓÓÓÓÓÓӋ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽ‘‘‘‘‘‘‘‘’“”••••••––—˜˜˜™™™™™™™™ššš››ž ¢¢¢¢££££££££££££¤¤¤¤¤¤¥¦§¨¨¨¨©©©©ªªªªª«¬®®¯°²²²³³³´´´´´µ¶·¹¹¹º»»¼½½¾¾¾¾¿ÀÁÁÁÁÂÃÄÆÇÉËÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÕÕÖ×ØÙÚÛÛÛÛÛÜÜÜÝÝÞßßßßßßßßßßàààáâãããããâââââãäæçççççèèèèèèççççççççççççççççççççèèèèèèççççççççåääãâááááààààààààááâãäåçççççççççåâáàßßßÞÞÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÙØ×××××××ÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖ×ØÙÙÚÚÚÚÚÛÛÛÚÚÚÚÚÚÛÛÛÚÚÚÚÚÙÙ×ÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖ××ÖÕÕÕÕÔÔÓÓÓÓÓÓӋ‹‹‹‹‹‹‹‹‹‹Šˆ‡††††‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŽŽ‘‘‘‘’“”••••••––—˜˜™™™™™™™™šššš›œŸ¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¥¦¨¨¨¨©©©ªªªªªª«¬­®¯°²²²³³³´´´´´µµ·¹¹¹º»»¼½½¾¾¾¾¾¿ÀÁÁÁÂÂÄÆÆÇÉÌÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÔÔÕÖÖ×ØÙÚÛÛÛÛÛÜÜÝÝÞÞßßßßßßßßßßßààááááââáááááâãäåæççççèèèèèçççççççççççççççççèèèèèèèèççççççççåäããââááááááààààààááâãåççççççççççåâáàßßßÞÝÝÝÝÝÝÝÜÜÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚÙÙÙØØ×××××ÖÖÖÖÕÕÕÕÕÕÕÕÕÕÖÖ×ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÚÚÙØ×ÖÖÖÖÕÕÕÕÖÖÖÖÖ×Ö×××ÖÖÕÕÕÕÕÕÖÖ×ØØ×ÖÖÕÔÔÔÓÓÓÓÓӋ‹‹‹‹‹‹Š‰‡†……„ƒƒƒƒ„…†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’’”••••••––—˜˜™™™™™™™™™šššš›œž¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨©©ªªªªªª«¬­®®°²²³³³³´´´´´´µ·¹¹¹º»»¼½½¾¾¾¾¾¿ÀÁÁÁÂÃÄÆÆÇÈÊÎÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÕÕÖÖ×ØÙÚÛÛÛÛÜÜÝÝÞÞßßßÞÞÞÞßßßßßààáàáááàáááááâãäåæçççèèèèèççççççççççççççççèèèèèèèèèççççççççåããââáááàáááááàáááááâäæççççççççççæãâààßßÞÞÝÝÜÝÜÜÜÜÜÝÝÜÜÜÜÜÜÜÛÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÙÙÙÙÙÙØØ×××ÖÖÖÖÖÖÖÖÖ×ØÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØ××ÖÖÖÖÖÖ×××ØØØØØØ×ÖÕÕÕÕÕÖÖ××ØÚÙØ×ÖÕÔÔÔÔÓÔÔԋ‹‹‹‹‰ˆ‡†„ƒƒƒ‚‚‚‚‚‚ƒ„„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽŽ‘‘‘’”••••••––—˜˜˜™™™™™™™™™ššš›œž ¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¥¦§¨¨¨¨©©ªªªªªª«¬­®¯°²³³³³´´´´´´µµ·¹¹¹º»»¼½½¾¾¾¾¾¿ÀÁÁÁÂÃÄÅÆÆÇÉÍÐÐÐÐÐÐÑÑÒÒÓÓÓÓÓÔÔÕÕÖ×ØÙÚÛÛÛÛÜÜÜÝÝÞÞÞÞÞÞÞÞÞßßßßàààààáààáàààáâãäåæççççèèèèççççççççççççççççèèèèèèèèèçççççççæåäãâáááààááââááâââââãæçççççççççççæäâáàßßßÞÝÝÜÝÝÝÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÙÙÙÙØØ××××ØØØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØ××ÖÖÖ××ØØØÙÙÙÚÙØ×ÖÖÖÖÖÖ××ØÙÚÚÚØÖÖÕÔÔÔÔÔÔԋ‹Š‰ˆ‡†…ƒ‚‚‚‚ƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’“••••••–––˜˜˜™™™™™™™™™ššš›œŸ¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨©ªªªªªª«¬­®¯°²³³³³´´´´´´µ¶¸¹¹ºº»»¼½½¾¾¾¾¿¿ÀÁÁÁÂÃÄÅÆÆÇÉËÐÐÐÐÐÐÑÑÒÒÓÓÓÓÓÔÔÕÕÖ×ØÚÚÛÛÛÛÜÜÜÝÝÞÞÞÝÞÞÞÞßßßßßààààààààààààáââäåççççççççççççççççççççççççççççèèèèèçççççççæääããâáááàááâããââããäååæççççççççççççæäâáàßßßÞÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙÙØ××ØØÙÙÙÚÚÚÚÚÙØ××ÖÖÖ××ØØÚÚÛÚÚØ×ÖÕÕÕÕÕÕՉˆˆ‡†…ƒ‚‚€€‚‚ƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽ‘‘’’”••••••––—˜˜˜™™™™™™™™™ššš›œ ¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨©©ªªªªª«­­®¯±²³³´´´´´´´µ¶·¹¹¹ºº»»½½½¾¾¾¾¿ÀÁÁÁÂÂÃÄÆÆÆÇÉÊÍÐÐÐÐÐÑÑÒÓÓÓÓÓÓÔÔÕÕÖ×ÙÚÚÛÛÛÛÜÜÜÝÝÝÞÞÝÝÞÞÞÞßßßßàààààààààààááââãåçççççççççççççççççççççççççççççèèèèçççççççåäããããâááááââãäääååæçççççççççççççççæäâáààßßßÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙØ××××ØÙÙÚÚÛÛÛÚÙØ××××ÖÖՇ†……„ƒ‚€€€€€€€€€€‚‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽ‘‘‘’“”••••••––—˜˜˜™˜™™™™™™™šš››œ ¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨©©ªª««¬­®®°±²³³´´´´´´µµ¶¸¹¹¹º»»¼½½½½¾¾¾¿ÀÁÁÁÂÂÃÅÆÆÇÇÈÉÌÐÐÐÐÐÐÑÑÒÓÓÓÓÓÓÔÔÕÖ×ÙÚÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÞÞßßßßßßààààßààààààááâããäçççççççççççççççççççççççççççççèèèèççççççæåãâãããâáââáââãäææççççççççççççççççççåãâáààßßßßÞÞÞÝÝÝÝÝÝÝÝÝÝÝÞÝÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÙÙØ××ØÙÚÚÚÛÛÛÛÛÚÚÚÙÙÙØ×ք„„ƒƒ‚€€€€€€€€€€€€€€‚‚„ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹ŒŒŒŽŽŽ‘‘‘’“”••••••–——˜˜˜˜˜˜™™™™™™šš››œž ¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¥¦§¨¨¨¨©©ªª««¬­®®°²²³³´´´´´´µ¶·¹¹¹ºº»»¼½½½½¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÈÈÊÌÐÐÐÐÐÐÑÑÒÓÓÓÓÓÓÔÔÕÖ×ÙÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÝÞÞÞßßßßßàààßßßßßßßàááââãäååææçççççççççççççççççççççççççèèèèççççççåäãâââãâââââââãäæççççççççççççççççççæäâááààßßßßßßÞÞÝÝÞÞÝÝÝÝÝÞÞÞÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÛÚÚÚÙÙØÙÚÚÚÛÛÛÛÛÛÛÛÛÚÚÚÙ×׃ƒ‚‚‚€€€€€€€€€€€€€€€ƒ…†‡‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽ‘‘‘’“”••••••–——˜———˜˜˜˜™™™™šš››œž ¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¥¥§¨¨¨¨©©©ª««­­®®°²²³³³´´´´´µ·¹¹¹¹ºº»»¼½½½¾¾¾¾¿ÀÁÁÁÁÁÂÃÅÆÇÈÉÊÌÐÐÐÐÐÐÑÑÒÓÓÓÓÓÓÔÔÕÕ×ÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÞÞÞÞßßßßßßßßßßßßßßßàááâãããããäååææççççççççççççççççççççççççèèççççççåäãâââããããããããäåçççççççççççèèççççççåãâááààßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÚÚÙׂ‚€€€€€€€€€‚‚ƒ„„…†ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽ‘‘’“”••••••––—–––——˜˜˜˜™™™™š››œž ¢¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¥¦¨¨¨¨¨©©©ª«­®®¯°²²³³³´´´µµ¶·¹¹¹¹ºº»»¼½½½¾¾¾¾¿ÀÀÁÁÁÁÂÃÅÆÆÈÊËÎÐÐÐÐÐÐÑÑÒÒÓÓÓÓÓÔÔÕÕ×ÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞßßßßßßßßßßßßßßßßààááââââãããääåæççççççççççççççççççççççççèççççççåäãâââãâããääääåæççççççççèèèèèèççççæäãáááààßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚ؁€€€€~€€€€€€‚‚‚ƒƒ…‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“”•••••––––•––––——˜˜˜™™™š››œž ¢¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¤¦§¨¨¨¨©©©ª«¬­®¯°²²³³³´´´µ¶·¸¹¹¹ººº»»¼½½½½¾¾¾¾¿ÀÁÁÁÁÂÂÅÆÆÇÉÌÏÐÐÐÐÐÐÑÑÒÒÓÓÓÓÓÔÔÕÖ×ÚÛÛÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÞßßßßßßßßßßßßßßßàààààááááââââãäåççççççççççççççççççççççççèçççççæåããââââââãäåååæçççççççççèèèèèèççççåäãááàààßßßßßßÞÞÞÞÝÞÝÝÞÞÞÝÝÞÞÞßÞÞÝÝÝÝÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚځ€€€€€~~~}}}}~~€€€€€€€‚ƒ„†‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŠŠ‹ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽ‘“”•••••–––••••–––——˜˜˜™™™š›œž¡¢¢¢¢¢¢¢¢£££££££££££¤¤¤¤¤¤¤¥§¨¨¨¨©©©ª«¬­®¯±²²³³´´´´µ¶·¸¹¹¹ºº»»»¼½½½½½¾¾¾¿¿ÀÁÁÁÁÂÄÆÆÇÉËÏÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÕÕÖØÚÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÝÝÞÞÞßßßßßßßßßßßßßààààààààááááâãäæççççççççççççççççççççççççççççççæåãâââââââãäæççççççççççççèèèèèèèçççåäãáààßßßßßßßßÞÞÞÞÝÝÝÝÝÝÝÝÞÞÞßßßßÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÜÜÜÜÝÝÝÞÞÞÞÝÝÝÝÞÞÞßßßßßßÞÝÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚڀ€€€€~}}}|||||}}}~€€€€€€€€‚„…†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰ˆˆ‰‰ŠŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒ‘’”•••••––••••••••––—˜˜™™™š›œŸ¡¢¢¢¢¢¢¢¢¢££££££££££¤¤¤¤¤¤¥¦¨¨¨¨©©ªª«¬­®¯±²²³³³´´´µ¶·¸¹¹¹ºº»»»»¼½½½½¾¾¾¿¿ÀÁÁÁÁÂÃÅÆÇÈÊÎÐÐÐÐÐÐÑÑÒÒÒÓÓÔÔÔÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÞÞÞÞßßßßÞÞÞßßßßßßßßßßàààààáááâääæçççççççççççççççççççççççççççççæåãããââãâããäæççççççççççççèèèèèèèçççåãâáàßßßßßßßÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞßßÞÞÞÝÝÝÝÝÞÞÞÝÝÝÝÝÞÞÞÞÞÝÝÝÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÝÝÝÝÞÞßßßßÞÞÞÝÞÞÞßßßßßßßßÞÞÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛڀ€€}|||{{{{|{{||}~€€€€€€€‚ƒ„…‡ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡†††‡ˆˆˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘“”•••••••••••••••–—˜˜™™™šš›œž¡¢¢¢¢¢¢¢¢¢££££££££££¤¤¤¤¤¥¦¨¨¨¨©©©ª«¬­®¯±²²³³³´´´µ¶¶¸¹¹¹¹º»»»»¼½½½½¾¾¾¾¿ÀÁÁÁÁÂÂÄÆÆÈÉÌÐÐÐÐÐÐÑÑÑÒÓÓÔÔÔÕÕÖØÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞÞÞÝÝÝÝÞÞÞÞßßßßßßßßßßààààáââãäåæççççççççççççççççççççççççççççåãããââãããããæççççççççççççççççèèççççåãáààßßßßßÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÝÝÞÞÞÝÝÝÝÝÝÝÝÞÞÞÝÝÞÞÞÞÞßßÞÞÝÝÝÝÝÝÝÜÝÝÝÞÞÞÞÞÞßÞÞÞßßßßßßßßÞÞÞÞÞßßßßßßßßßßÞÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ~~}}||{{{{{{{{{{{|}~~~€€€€€€‚‚ƒ„…†ˆŠ‹‹‹‹‹‹‹‹‹‹Šˆ‡†††††‡ˆ‰ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽ‘’”•••••••••••••••–——˜˜™™™šš›œŸ¡¢¢¢¢¢¢¢¢£££££££££££¤¤¤¤¤¥§¨¨¨©©©ª«­®®¯°±²³³³´´´µµ¶·¸¹¹¹ºº»»»¼¼½½½¾¾¾¾¿ÀÁÁÁÁÂÂÃÅÆÇÉÌÐÐÐÐÐÐÑÑÑÒÓÓÔÔÕÕÖ×ÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÝÝÝÝÝÜÜÝÝÝÝÝÞÞßßÞÞßßßßßßßààáááâãäåæçççççççççççççççççççççççççççæåääããããããäåççççççççççççççççççççççäâáààßßßßÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞßßßßßßßÞÞÝÝÝÞÞÝÝÝÞÞßßßßÞÞßßßßßßààßßßßßßßÞÞßßßßßßàßßßßÞÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ~}|{{{{{{{zzzzzzz{{{||||}}~€€€€€‚‚ƒ„…†‡‡‡ˆˆˆ‰‰‰‰ˆ‡‡†…………†ˆˆˆ‰Š‹‹‹‹Š‰‰ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘’“•••••••••••••••––—˜™™™™ššš›œžŸ¡¢¢¢¢¢¢¢£££££££££££¤¤¤¤¤¥§¨¨¨¨©©ª«¬­®®¯±²²³³´´´µµ¶··¹¹¹ºº»»»¼¼½½½½¾¾¾¿ÀÁÁÁÁÁÂÃÄÆÆÈËÐÐÐÐÐÐÑÑÑÒÓÓÔÔÕÖÖØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÝÝÝÜÜÜÜÜÝÝÝÝÞÞÞÞÞÞÞßßßßßààààáâãäääåçççççççççççççæææçççççççççççæåääãäääääåæççççççççççççççççççççæäâáààßßßßÞÞÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞßÞÞÞßßßßßßßßßßßÞÞÞÞÞßßßßßßßßßßßßßßßàààààßßßßßßßßßßßààààààßßßÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛ|{{{zz{zzzzzzzzzzzz{{{{{{||}€€€‚‚‚ƒ„……………………………………„„„„…†ˆˆˆˆ‰ˆˆˆ‡††††‡ˆˆˆˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘’“•••••••••••••••––—˜˜™™™™šššœŸ¡¢¢¢¢¢¢¢¢££££££££££¤¤¤¤¤¥§¨¨¨¨©©ªª¬­­®¯°±²³³´´´´µµ¶·¹¹¹ºº»»»¼¼¼½½½¾¾¾¿¿ÀÁÁÁÁÂÃÄÆÆÇÊÎÐÐÐÐÐÐÑÑÒÓÓÓÔÕÖ×ÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÞÞÞÞßßßßßßàààááâââãäåççççççççççæååäåååæçççççççççæåääååääåæçççççççççççççççççççççåäãâáàßßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààßßßßßßßßààáááààààßßßßßßààààáááááàßßßÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛzzzzzzzzzzzzzzzzzzzzzzz{{{{|}~~€€€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒƒ„…†‡‡‡††††…„„„……†††††ˆ‰‰ˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘’”•••••••••••••••––—˜˜™™™™ššš›Ÿ ¢¢¢¢¢¢¢¢££££££££££¤¤¤¤¥¥¦¨¨¨¨©©ªª«¬­®¯°±²²³³´´´µµ¶·¹¹¹ººº»»¼¼¼½½½¾¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÉÍÐÐÐÐÐÐÑÑÒÒÓÓÔÕÕÖÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÞßßßßßßßßààààááááâããåææççççççåäääããääåççççççççççææææåååçççæçççççççççççççççççççæåãâáààßßßßÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞßßßßßßàßßßßßßßßßààááááààààààààáâââââááàààààààááááââââáààßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛzzzzzzzzzzzzzzzzzzzzzzzzzz{{|}}}~€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„„…………„„„ƒƒƒ„„„…„„……‡†††‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘’“””””••••••••••••––—˜™™™™ššš›Ÿ¡¢¢¢¢¢¢¢££££££££££¤¤¤¤¤¥¥¦¨¨¨¨©©©ªª¬­®®¯±²²³³´´´´µ¶·¸¹¹¹ººº»»¼½½½½¾¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÉÍÐÐÐÐÐÐÑÑÑÒÓÓÔÔÕÖØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÞÞßßßßßßßßßßàààààááâãäååæçççæåääãââãäåæçççççççççççççæåæææææææççççççççççççççççççåãâáààßßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞßßÞßßßàààààßßààààáâãââââááàààáââãâããããâáááááááââããäääãááàßßßßÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛzzzzyyyyyyyyyyyyyyzzzzzzzzz{{|||}}~€€€€€‚‚‚ƒƒƒƒ„ƒƒ‚‚‚‚ƒƒƒƒƒƒƒ„„„„„…‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒ‘’’’’““”””•••••••••–—˜˜™™™šš›œžŸ¡¢¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¦§¨¨¨¨©©©ª«­®®¯°²²³³´´´´´µ¶¸¹¹¹¹ºº»»»¼½½½¾¾¾¾¾¿ÀÁÁÁÂÂÄÅÆÇÈËÐÐÐÐÐÐÑÑÑÒÒÓÓÔÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÜÛÛÜÜÜÜÜÜÝÞÞßßßßßßßßßßßßàààààááâããäååääåäãââââãäåæççççççççççççææçæåäåååæççççççççççççççççæäãâáàààßßßßÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÞÞÞÞßßßàààààààáááâãääãââááááââãããããäååäããââââãäääåçççåãâáààßßßßÞÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛyyyyyyyyyyyyyyyyyyyzzzzzzzzz{{{|||}~€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒ‚‚‚‚‚‚‚‚‚ƒ‚‚ƒƒƒƒ‚ƒƒ„†‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘‘’’“””””•••••••––˜˜™™™šš›œŸ ¢¢¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¦§¨¨¨¨©©©ª«­®®¯°²²³³³´´´´µ¶·¹¹¹¹¹ºº»»¼½½½¾¾¾¾¾¿¿ÁÁÁÁÂÃÅÆÇÈËÐÐÐÐÐÐÐÑÑÒÒÓÓÔÕÖ×ØÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßßßßßßßßßßßßßßßàààáâââããããäåãâááâãäåæççççççççççææçççæåääääåææççççççççççççæææäâáààààßßßßÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÞÞßßßààààààáââãääääããâááââããããããäåççææååäääåæææçççççæäãâáàßßßßßÞÞÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛyyyyyyyyyyyyyyyyyyyyzzzzzzzzz{{{{||}~€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„…‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘‘’’“““””•••••••–˜˜™™™š›œŸ¡¢¢¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¦§¨¨¨¨©©©ª«­®®¯°²²²³³´´´´µµ·¹¹¹¹¹ºº»»»¼½½¾¾¾¾¾¿¿ÀÁÁÁÂÃÅÆÆÈÊÏÐÐÐÐÐÐÑÑÑÒÓÓÔÕÕÖØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞÞÞÞßßßßßßÞßßßßßßßßààááááââããããââáâãäåæçççççççççæææççççåäãããääååæçççççççççææååãâáààßßßßßßßÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÞßßßààààááãäæååäããâãââããääääääåæçççççççæççççççççççççåäâáààßßßßßÞÞÝÝÝÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛyyyxxxxyyyyxxxyyyyyyyyzzzzzzzz{{{{||~€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ„……‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘‘‘‘’’’“””•••••–—˜™™™š›œŸ¡¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¥¦§¨¨¨¨¨©©ª«¬®®¯°±²²³³³´´´µµ¶¸¹¹¹¹ºº»»»¼½½½¾¾¾¾¿¿ÀÁÁÁÁÂÄÆÆÈÊÎÐÐÐÐÐÐÑÑÑÒÓÓÔÔÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÞÞÞÞÞÞÞÞÞÞßßßßßßßààààààááããâãâáâãääåççççççççæææåæçççæäãââããääåæççççççççæååäâáààßßßßßßßÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞßßßàààááâäçåäääããâããäääääääåååæççççççççççççççççççççæåãâáàààßßßÞÞÝÝÝÝÝÜÜÜÜÛÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛyxxxxxxxxxxxxxxxxxyyyyyzzzzzz{{{{{{|}~€€€€€€€€€€€€€€€€€€€€€€‚‚ƒƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘‘‘‘‘’’“””••••–—˜™™™š›œŸ¡¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ª«­­®®¯±²²³³³´´´´µ¶¸¹¹¹¹ººº»»»¼½½¾¾¾¾¿¿ÀÁÁÁÁÂÄÆÆÈÊÎÐÐÐÐÐÐÑÑÒÒÓÓÔÔÔÕÖ×ÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÞÞÝÝÝÝÞÞÞÞÞßßßßßßßàààááââããââãäååçççççççæååååæçççæåããããããääæçççççççççæåãâáààßßßßßßÞÞÝÝÜÜÜÜÜÜÜÜÜÜÛÛÜÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞÞßßßàááâãåååååäããããäääääääååæçççççççççççççççççççççççæäãâááàßßßßßÞÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxxxxxxxxxxxyyyyzzzzzzzz{{{{||}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’’’“”••••–˜™™™šš›œž ¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©ª«¬­®®¯°²²³³³´´´µµ¶¸¹¹¹¹¹ºº»»»¼½½½¾¾¾¿¿ÀÁÁÁÁÂÃÆÆÈÊÍÐÐÐÐÐÐÑÑÒÒÓÓÓÔÔÕÕÖÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÝÞßßßßßßßßßàààáâââãâããåææççççççåäääåæççççåäããâãäãäæçççççççççæäâáààßßßßßÞÝÝÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞßßßàááâããäååäããããääääääääååæçççççççççççççççççççççççååäãáàààßßßßÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxxxxxxxxxxxxxyyyyzzzzzz{{{{||}}~~~}}}}}}~}}}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ„…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘‘’’”••••–˜™™™™šš›ž¡¡¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©ª«¬­®®¯±²³³³´´´´µ¶·¸¹¹¹¹ºº»»»¼½½½¾¾¾¿ÀÁÁÁÁÁÂÃÅÆÇÉÌÐÐÐÐÐÐÑÑÑÒÒÒÓÓÔÔÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÜÜÜÜÜÜÝÝÝÝÝÞßßßßßßßßßßààááââãââäæççççææåäãããäåççççæääââããääæçççççççççåãáàààßßßßÞÝÝÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞßßßàááââãäåäãããääããääãããääåæççççççççççççççççççççççææåãâáàààßßßÞÞÞÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxxxxxxxxxxxxxyyyyzzzzzz{{{{||}}~~~}}}}}|||||||||||}~~€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’”••••–—˜™™™™šš›žŸ ¡¡¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©ªª«­®®¯±²³³³´´´´µµ¶·¹¹¹¹ºº»»»¼½½½¾¾¾¿ÀÁÁÁÁÂÂÃÅÆÇÈËÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÕÖ×ØÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÞÞßßßßßßßßßàáááââããäææçææåååäãâããåææææçåäããããäåæççççççççåãâáààßßßßßÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÜÜÜÜÜÝÝÞßßßàááââäååäääåäääääããããääåççççççççççççççççççççççççæåãâááààßßßßÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxxxwwwxxxxxxxxyyyyzzzzzz{{{||}~~~~}|||||{{{||||||||}}~~€€€€€€€€€€€€€€€‚‚„†‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’”••••–—˜˜™™™šš››žŸ¡¢¢¢¢¢¢¢££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ªª«¬®®¯±²³³³´´´´´µ¶·¸¹¹¹ºº»»»¼¼½½¾¾¾¿ÀÁÁÁÁÂÂÄÅÆÇÉËÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÕÖÖØÚÚÛÛÛÚÚÚÚÚÚÚÚÚÚÙÙÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÝÝÞÞÞÞßßßßßààáááââääåæåååååäããâããäææææææååäääååæçççççççæäâááàßßßßÞÞÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÝÝÞßßààáââãåææååæåååääããããäåææçççççççççççççççççççççççæåäãââááààßßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxxwvvvvwxxxxxxxyyyzzzzzzz{{|}~~~}||{{{{{{{{{{{{||||||}~~€€€~~€€€€€€€€‚ƒ…‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘“””•••––—˜˜™™™šš››œŸ  ¡¢¢¢¢¢££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ªª«­®®¯²²²³³´´´´´µµ¶·¹¹¹¹º»»»»¼½½¾¾¾¿ÀÁÁÁÁÂÂÄÆÆÇÉÌÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÕÕÕÖ×ØÙÚÚÚÚÚÙÙÙÙÙÙØØØØÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÜÜÜÜÜÝÞÞÞÞßßßßßßààááâãäååääåååäãâââãäææææççæåææåææççççççççåäâááàßßÞÞÝÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÜÜÜÜÝÝÞßßààááâãäæçççççæååääääåååæææççççççççççççççççççççççæåäãââáááàßßßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxwvuuuvwxxxxxxxyyyzzzzzzz{{||~~}||{{{{{{{{{{{||||||||}~€€~~}}}~~€€€€€€€€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’’“”••••––—˜˜™™™šš›œœŸ  ¡¢¢¢¢¢££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ªª¬­®®°²²²³³´´´´´´µ¶·¹¹¹¹º»»»¼½½½¾¾¾¿ÀÁÁÁÁÂÂÄÆÆÈÉÍÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÓÔÔÕÕÕÕÖ××ØØØÙØØØØØØØ×××ØØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÜÜÜÜÝÝÝÞÞßßßßßßßààááâãååååååääãâââäåçççççççççççççççççççççæäãâààßßÞÝÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÜÜÜÜÝÝÞÞßßààáââäåççççççççææææçææææææççççççççççççççççççççççæååãââáááààßßßßÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚxxxxxxxwvvuuuuuvxxxxxxxyyyyzzzzzzz{{|}~}}|{{{{{zzz{{{{{{{{|||||}~~}}|||}}~~€€€€€€€€€‚ƒ„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽŽ‘‘‘’“”••••––—˜™™™™šš›œžŸŸ  ¢¢¢¢££££¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨©©ªª«¬­®¯°²²³³³³´´´´µµ¶·¹¹¹¹º»»»¼½½¾¾¾¾¿ÀÁÁÁÁÂÂÄÆÆÈÊÍÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÕÖÖÖ××××××××××××××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßÞÞÞßßßàààáâãäåååååääããããäåçççççççççççççççççççççæäãáàßßßÞÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÛÛÛÛÛÜÜÜÜÜÝÝÞßßßàááãäåæççççççççççççççççæçççæççççççççççççççççççççæååäãâáááàààßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚxxxxxxwvuuttuuuvwxxxxxxyyyyzzzzzzz{{{|}~}}||{{{zzzzz{{{{{{{{|||||}~~}||||||||}}~€€€€€€€€€‚ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘’”•••••–——˜™™™™šš›œžžŸŸ ¡¢¢¢£££¤¤¤¤¤¤¤¥¥§¨¨¨¨¨©©©ª«­­®¯±²²²³³³´´´´µµ¶·¹¹¹¹º»»»¼½½½¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÉÌÐÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÓÔÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞÞßßßàààáâãäååååååäääääæçççççççççççççççççççççåäâáàßßßÞÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÛÛÛÛÛÜÜÜÜÜÜÝÝÞßßààááãåççççççççççççççççæååææææççççççççççççççççççæååäääãâââááááàßßÞÞÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚxxxxxxwuuttttuuvwxxxxxxxyyyzzzzzzzz{{{|}}|||{{zzzzzzz{{{{z{{{|{||}~~~}}}||{{{{|{{||}~€€€€€€€‚„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’””••••–—˜˜™™™šš›œœžžž ¢¢¢££££¤¤¤¤¤¤¥¥§¨¨¨¨¨©©ª«¬­®¯°²²²²³³³´´´´µµ¶·¹¹¹¹º»»»¼½½½¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÉËÏÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÕÕÕÕÕÖÖÖ××ØØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÞÞßßßßààáâãåæååæåååååæççççççççççççççççççççççåäâáàßßÞÞÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÞßßààáâãæççççççççççççççççæååååæææççççççççççççççççååäãääääãââááááààßßÞÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚxxxxwvuuttttttuvwxxxxxxxyyyzzzzzzzzzz{{||||{{{zzzzzzz{{{zz{{{{{|||}~}}|||{{{{{{{{{{{|}€€€€€‚„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”•••••–—˜™™™™šš›œœœž¢¢¢¢£££¤¤¤¤¤¤¤¥§¨¨¨¨¨©©ª«­®®°±²²²²³³´´´´µµ¶¶·¹¹¹ºº»»»¼½½½¾¾¾¿ÁÁÁÁÁÂÃÄÅÆÇÈÊÎÐÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÓÓÓÔÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖ×××ØØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÞÞßßßßààáâäååååæææææççççççççççççççççççççççæåäâáàßßÞÝÝÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßààáãäççççççèèèèèçççççççæåäåæææçççççççççççççççåäãâââãäääãâááááààßßßÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÚxxxwvuttttttttuvwxxxxxxxyyyzzzzzzzzzzz{{{{{{{{zzzzzzzzzzzzz{{{{{{|}}||||{{{zz{{{{{{{|}~€€€€€‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••••–—˜™™™™š››››œœœž¡¢¢¢££££¤¤¤¤¤¤¥§¨¨¨¨¨©©ª¬­®®°±²²²³³³´´´´µµ¶¶¸¹¹¹ºº»»»¼½½¾¾¾¾¿ÁÁÁÁÁÂÃÄÅÆÆÇÊÌÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÕÖÖÖ×××ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÞßßßßàáââãäåååæçççççççççççççççççççççççççæåäâáàßßÞÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßààáâäåçççççèèèèèèçççççççæååæççççççççççççççççåäãâââââããääãâáááààßßßßÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚxwwvuuttttttttuvwxxxxxxyyyyyzzzzzzzzzzz{{{{{{zzzzzzzzzzzzzzz{{{{{||||{{{{{zzz{{{{{{{|}}~€€€€‚‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽ‘“”••••••–—˜™™™™ššš››››œ ¢¢¢¢££££¤¤¤¤¤¥¨¨¨¨¨©©ª«­®®¯°±²²²³³³´´´´µµ¶·¸¹¹¹ºº»»¼½½½¾¾¾¾¿ÁÁÁÁÂÂÃÄÅÆÆÇÉÌÎÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖ××ØÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÞßßßàááââãäåæççççççççççççççççççççççççççåäãâààßßßÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßßààáãäçççççèèèèèèçççççççææææçççççççççççççççæäãâáááááááâãäãââááààßßßÞÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚwvuuutttttttttuvxxxxxxxyyyyyzzzzzzzzzzzzzz{{{zzzzzzzzzzzzzzzzz{{{{|{{zzzzzzzz{{{{{{{|||}~€€€‚ƒ…ˆˆˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽ‘“”””•••••–˜™™™™ššššš›››œŸ¡¢¢¢£££££¤¤¤¤¥§¨¨¨©©ªª¬­®®¯°±²²²³³´´´´µµµ¶·¹¹¹ºº»»»¼½½¾¾¾¾¿ÀÁÁÁÁÂÂÃÄÆÆÆÇÈËÍÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖ×ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÞßßßààááâãåççççççççççççççççççççççççççæäãáàßßßßÞÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞßßßààáâäæçççèèèèèèèçççççççææææççççççççççççççæåãâááààáááááâãääãââáààßßßÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙvuttttttttttttuvwxxxxxxyyyyyyzzzzyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{zzzzzzzzzzzzz{{{{{{||}~€€€€‚„………†‡ˆ‰ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“““”••••–˜™™™™™™ššššš›œ ¢¢¢¢££££¤¤¤¤¥§¨¨¨©©ª«­®®¯¯°²²²²³³´´´´µµµ¶¸¹¹¹ºº»»»¼½½½¾¾¾¿ÀÁÁÁÁÂÂÃÄÅÆÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖ×ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÞßßßàááâäæçççççççççççççççççççççççççäâáàßßßÞÝÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞÞßßßßàáãäçççèèèèèèèçççççççææææçççççççççççççåäãâáàààààààáááâãäääãâáàßßßÞÞÝÝÝÜÜÜÛÛÛÛÛÛÚÚÚØuttttttttttttuvvwxxxxxxyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{|}~€€€€‚‚ƒƒƒ„……†‡‡ˆ‹Š‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’’’“”•••–—˜™™™™™™™šššš›œž¢¢¢¢££££¤¤¤¤¥¦¨¨¨©ª«¬­®®¯¯°²²²³³³´´´´µµµ¶·¹¹¹ºº»»»¼½½½¾¾¾¿ÀÁÁÁÁÁÂÃÄÅÆÆÇÇÉËÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖ××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßßààáãåççççççççççççççççççççççççæãáàßßÞÝÝÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÙØØØØØØÙÙÙÚÙÙÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßßàáâäççççèèèèèèççççççççæçççççççççççççæåäãâáàààßßààààááââããääãâáààßßÞÞÞÝÜÜÜÜÛÛÛÛÛÚÚÚØuttttttttttttuvvwxxxxxxyyyyyyyyyyyyyyyzzzzzzzzzzyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{||}~€€€€‚‚‚‚‚‚ƒƒ„……†‡‡ˆ‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’’“”••••—˜˜˜˜™™™™™šššš›Ÿ¢¢¢¢£££¤¤¤¤¥¦§¨¨©ª«­­®®¯°±²²²³³³´´´´µµµ¶¸¹¹¹ºº»»»¼½½½¾¾¾¿¿ÀÁÁÁÁÂÃÄÄÆÆÇÈÉËÌÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖ×ØÙÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝßßßàáâäæççççççççççèçççççççççæååãâàßßÞÝÜÜÜÜÜÜÜÛÛÛÛÛÚÚÚÚÚÚÙØØ××××ØØØØÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßßààâäççççèèèèèçççççççççææçççççççççççæåäãâáààßßßßàààáááââããäääãâáààßßßÞÞÝÜÜÜÛÛÛÛÛÚÚÙØuttttttttttttuvvwxxxxxyyyyyyyyyyyyyyyyyzzzzzzzyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{||}~€€€‚‚‚ƒ„„……†‰‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘‘’“”•••–˜˜˜˜˜˜™™™™™™š›œž ¢¢¢££££¤¤¤¤¥¦¨¨¨ª«¬­®®¯°±²²²³³´´´´´µµµ¶¸¹¹¹ºº»»»¼½½¾¾¾¾¾¿ÀÁÁÁÁÂÃÄÄÆÆÇÈÉÊËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÖÖÖÖØÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞßßàáâäåæçççççççççèçççççççççåääâààßßÝÝÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÙÙØØØ××ÖÖÖ××××ØÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞÞßßààáãæççèèèèèèçççççççççæææææççççççææåäãâáàààßßßßßààááââââããããââááàßßßßßÞÝÜÜÛÛÛÛÛÚÚÙØttttttttttttuvvvxxxxxxxxxxxxxxxxxxyyyyyzzzzzyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{||}~€€€€€‚ƒƒƒ„„…ˆ‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽ‘‘’“”•••–—————˜˜™™™™™šš›Ÿ ¢¢¢£££¤¤¤¤¥¥§¨¨©ª¬­®¯°±²²²³³³´´´´µµµµ·¹¹¹¹º»»»¼½½½½¾¾¾¾¿¿ÀÁÁÁÂÂÃÅÆÆÇÇÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖ×ØÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝßßßàáâäæççççççççèççççççççççåäâáàßßÞÝÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÙØØ×××ÖÖÖÖÖÖÖ××ØÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÞßßààáäæççèèèèèèççççççççæçææææçççççææææäãââáààßßßßßàáááááââââââááààààßßßßÞÝÜÜÛÛÛÛÛÚÚÙØttttttttttttuvvwxxxxxxxxxxxxxxxxxxxyyyyzzzzyyyyyyyyyyyyzzzzzzzzzzzzzzzzyzzzzzzzzzzzzzz{{{|}€€€€€€€€€€€€‚‚‚ƒƒ…‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘’”••••–——––—˜˜˜™™™™šš›Ÿ¡¢¢¢£££¤¤¤¤¥¦¨¨©ª¬®®°²²²²³³³´´´´µµµµ¶·¹¹¹¹º»»»¼¼½½½¾¾¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÆÇÈÈÉÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÖ××ØØÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞßßàáâãåçççççççççççççççççççæäâàßßßÞÝÜÜÜÜÜÛÛÛÛÛÛÛÚÚÙØØ××ÖÖÖÖÕÖÖÖÖÖÖ×ØÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÝßßßàáâåçççèèèèèèèççççççæåææçççççççæåææåäãââááààßßßàààááááááââáááààààààßßßßÞÝÜÜÛÛÛÛÛÚÚÙttttttttttttuuvxxxxxxxxxxxxxxxxxxxxxxyyyzyyyyyyyyyyyyyyzzzzzzzzzzzzzzyyyyyzzzzzzzzzzzzz{{|}€€€€€€€€€€€€€€‚‚ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘’“”••••–––––—˜˜˜™™™™šš›Ÿ¢¢¢£££¤¤¤¤¥¦¨¨¨©«®¯°²²³³³³´´´´´µµµµ¶¸¹¹¹¹º»»»»¼½½½¾¾¾¾¾¾¿ÀÁÁÁÂÃÄÅÆÆÆÇÈÉÊÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖ×××ØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßàáâäåçççççççççççççççççæåãáàßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÚÙØØ××ÖÖÖÕÕÕÕÕÕÕÕÖ×ØÙØØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞÝÞßßßàáãæççççççèèèèççççççåäååæççççççæåææååäããáàààààààààááááááââáàààßßßààààßßÞÝÜÜÛÛÛÛÛÚÚÚtttttttttttttuvvwxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyxxyyyyyyzzzzzzzzzzzzzyyyyyyyzzzzzzzzzzzzz{|~€€€€€€€€€€€€€€€‚‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”•••••–––––——˜˜™™™™š›œ ¢¢¢££¤¤¤¤¤¦¨¨¨©ª­¯°²²³³´´´´´´´µµµ¶·¹¹¹¹¹º»»»»¼¼½½½¾¾¾¾¾¿ÀÁÁÁÂÂÄÅÆÆÆÇÈÉËÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ØÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßààáããåççççççççççççççççæäâáàßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙØ×××ÖÖÕÕÕÕÕÕÕÕÕÖÖ×××ØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞÞÞßßàááäæççççççèèèèççççççåääåçççççççååææææåäãâáàààààààáááááááâáààààßßßßàààßßÞÝÜÜÛÛÛÛÛÛÚÚttttttttttttttuuvwxxxxxxxxxxxxxxxxxxxxyyyyyyyyxxxyyyyyyzzzzzzzzzzyyyyyyyyyyyyzzzzzzzzzz{{|~€€€€€€€€€€€€€€€€‚ƒ†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’””•••••–––––——˜˜™™™™š›œž ¢¢£££¤¤¤¤¥¨¨¨©ª¬®±²³³´´´´´´´´µµ¶¶¸¹¹¹¹¹º»»»»»¼½½½½¾¾¾¾¿¿ÁÁÁÂÂÃÄÆÆÆÇÇÈÊÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÖÖ×ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßààáâãæçççççççççççççççæãâáàßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÚÚØ××ÖÕÕÕÕÕÕÕÕÕÕÕÖÖ××××ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßßàáãäæçççççççèèççççççæääääææçççççææææçæåäãâááàáààáááââââââááààßßßßßßààààßÞÝÜÜÜÛÛÛÛÛÛÚsssssssssssttttuuvwxxxxwwxxxxxxxxxxxxxyyyyyyyxxxxxyyyyyyzzzzzzzzyyyyyyyyyyyyyyyzzzzzzzz{{}~€€€€€€€€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’““”••••••–––––—˜˜˜™™™š›Ÿ¢¢¢£££¤¤¤¥§¨¨¨©«®°²³³´´´´´´´´µµ¶·¸¹¹¹¹ºº»»»»»¼½½½½½¾¾¾¾¿ÁÁÁÂÂÃÄÆÆÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÖ××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞßßßàááâäççççççèèèççççççæãâáàßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙØ×ÖÕÕÕÕÔÔÔÕÕÕÕÕÖÖ××××ØÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßààâäåççççççççççççççççåäããäååæççççççççæååäããââáâáááâââââââááàààßßßßßßßßàßßßÞÝÝÜÜÛÛÛÛÛÚsssssssssssstttttuuvvwvvvwwxxxxxxxxxxxxyyyyyxxxxxxyyyyyyzzzzzzzzyyyyyyyyyyyyyyyyyzzzzzz{{}~~€€€€€€€‚ƒ†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’’“”•••••••––––—˜˜˜™™™š›ž¡¢¢£££¤¤¤¥¦¨¨¨©«®¯²³³´´´´´´´µµµ¶¸¹¹¹¹¹ºº»»»»»¼½½½½½½¾¾¾¿ÀÁÁÁÂÂÄÅÆÆÇÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÖÖ××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÞßßßßàáâãæççççèèèèèçççççåãâàßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙØ××ÖÕÕÕÔÔÔÔÕÕÕÕÕÖÖÖ×ØØÙÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÜÜÝÝÞßßßàáãåçççççççççççççççççåäãäääåæçççççççæææåååääääãâââââããââááààààßßßßßßßßßßßßßÞÝÜÜÛÛÛÛÛÛsssssssssssssttttttuuvvvvvwwxxxxxxxxxxxxxxxxxxxxxxyyyyyyzzzzzzzyyyyyyyyyyyyyyyyyyyzzzzz{{}~~~~~}}~€€€€€€‚ƒ†‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’’“”••••••••––———˜˜™™™šœž¡¢¢£££¤¤¤¤¦¨¨¨©«­¯²²³´´´´´´´µµ¶·¸¹¹¹¹¹¹ºº»»»»»¼½½½½¾¾¾¾¿ÁÁÁÁÂÂÃÆÆÆÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÖÖ×ØØÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝÞßßßßàáâäççççèèèèèççççæãâáàßßÞÞÝÜÜÜÛÛÛÛÛÛÛÚÚÙØ××ÖÖÕÕÕÔÔÔÔÔÕÕÕÕÖÖÖ×ØÙÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÝÞÞßßàáâãåçççççççççççççççççåäääääåæççççççççææææææææåäããããããââááàààßßßßßßßßßßßßßßßßÝÜÜÜÛÛÛÛÛrrrsssssssssssstttttttuuuvvwxxxxxxxxxxxxxxxxxxxxxyyyyyyyzzzzzzzyyyyyyyyyyyyyyyyyyyzzzzz{{|~~}}}}||}~~€€€€‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’’’”•••••••••–––——˜™™™š›Ÿ¢¢¢£££¤¤¤¥§¨¨©ª­®°²³³´´´´´µµµ¶·¸¹¹¹¹¹¹ºº»»»»»¼½½½½¾¾¾¾¿ÁÁÁÁÁÂÃÅÆÇÇÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÖ××ØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝßßßßßàáãæççççèèèçççççåãâáàßßÞÞÝÜÜÛÛÛÛÛÛÛÚÚÚØ×ÖÖÖÕÕÕÔÔÔÔÔÔÔÕÕÕÕÖÖ×ØØÙÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÝÞßßßàáâãæçççççççççççççççççæåääääåæççççççççææææçççççææåäãâââááàààßßßßßßßßßßßßßßßßßÞÝÜÜÜÛÛÛÛrrrrrrrsssssssssstttttttuuvwxxxxxxxxxxxxxxxxxxxxxyyyyyyyzzzzzzyyyyyyyyyyyyxxxxxyyyyzzzz{{|~~}}||||||}~€€€€‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’“”•••••••••–––—˜™™™šš›¢¢¢£££¤¤¤¥§¨¨©ª­®¯±²³´´´´´´µµ¶·¸¹¹¹¹¹¹ºº»»»»»»¼½½¾¾¾¾¾¿ÀÁÁÁÂÂÃÅÆÇÇÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÕÕÖ×××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝÝÞÞßßßàáäæçççèèèçççççäãááàßßÞÝÜÜÛÛÛÛÛÛÛÚÚÙÙØ×ÖÖÕÕÕÕÔÔÔÔÔÔÔÔÕÕÕÕÖÖ×ØØÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÜÜÞßßßàáâäççççççççççççççççççæååååååæççççççççææææçççççååäãâââááààààßßßßßßßßßßßßßßßßßßÞÝÜÜÛÛÛÛrrrrrrrrrrsssssssssstttttuvwwxxxxxxxxxxxxxxxxxxxxyyyyyyyzzzzzzyyyyyyyyyyyxxxxxxxyyyzzzz{|}~}|||||||}}~€€€€€‚ƒ„†‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’“”””••••••••–——˜˜™™™š›œŸ¢¢£££¤¤¤¥¦¨¨©ª¬®®°²³³´´´´´µ¶¶·¸¸¹¹¹¹¹ººº»»»»»¼½½½¾¾¾¾¿ÀÁÁÁÂÂÃÅÆÆÈÉËÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÖ××ØÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÞÞßßßàãåçççèèèççççæäâáàßßÞÝÜÜÛÛÛÛÛÛÛÚÚÙØØ×ÖÖÕÕÕÕÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ×ØØÙÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÝßßßàáâäæççççççççççççççççççççæåååæççççççææåååååææçæåäããââááàààààßßßßßßßÞÞßßßßßßßßßßÞÝÜÜÜÛÛrrqqqqqqqrrssssssssssttttuvvvvvwwwwxxxxxxxxxxxxxxyyyyyyyzzzzzyyyyyyyyyyyyxxxxxxxyyyyzzz{{|~~~}|||||||}}~€€€€€‚‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’“”””””••••••––—˜˜™™™ššœž¢¢£££¤¤¤¥¦¨¨©ª¬­®¯±²³´´´´´µ¶··¸¸¹¹¹¹¹¹ºº»»»»»¼½½½¾¾¾¿¿ÁÁÁÁÂÂÄÆÆÇÈËÍÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÖ×ØØÙÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÞÞßßàáãåçççèèèçççåãáààßßÝÜÜÜÛÛÛÛÛÛÚÚÙØØ×ÖÖÖÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ×ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÝßßßàáâäåæççççççççççççææççççççæææççççæåååååååååååååäããâââáááàààßßßßßßßßÞÞßßßÞÞÞÞÞÞßßÞÝÜÜÜÛrrrrqqqqqrrsssssssssssttttuuuuvvvvwxxxxxxxxxxxxxyyyyyyyzzzzzyyyyyyyyyyyyyyxxxxxyyyyyzzz{{|~~}}}||||||}}~€€€€‚‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’“””””””••••••–——˜™™™ššœž¢¢£££¤¤¤¥¦¨¨©ª¬®®¯°²³³´´´µ¶·¸¸¸¹¹¹¹¹¹¹ºº»»»»¼¼½½½¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÉÌÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÕÕÖÖ×ØØØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÞßßàáâäççççççççæäâáàßßÞÝÜÜÛÛÛÛÛÛÛÚÚØ××ÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖ×ØÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßààâãäååæçççççççççççææææææççççççççæåääääåæååäääããããââââááààààßàßßßßßßßßßßÞÞÞÞÞÝÞÞßßÞÝÜÜÜrrrqqqqqqqrrsssssssssstttttuuuuvvvwxxxxxxxxxxxxyyyyyyzzzzzzyyyyyyyyyyyyyyyyxxxyyyyyyzzz{{|~}}||}|||||}}~€€€€€€‚‚„…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’“”””””•••••••––—˜˜™™ššœž¢¢£££¤¤¤¥¦¨¨¨ª¬®®®°²²³´´´µ¶·¹¹¹¹¹¹¹¹¹¹ºº»»»¼¼¼½½½¾¾¾¿ÁÁÁÁÁÂÃÅÆÇÈËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÖÖÖ×ØØØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝßßàáâãæçççççççæãâáàßßÝÜÜÜÛÛÛÛÛÛÚÚÙØ×ÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×ÙÙÚÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞßßàáâããäåæçççççççççççæåæåääåççççççææåääääåäääãããâááââââááààààßßßßßßßßßßßßßÞÝÝÝÝÝÝÞÞßßÞÝÝÜrrrqqqqqqqqrrssssssssstttttttuuuvvwwxxxxxxxxxxxyyyyyyzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{{}}}|||||||||}~€€€€€€€€‚ƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘’“””•””••••••••–—˜˜™™™šœž¢¢£££¤¤¤¥¦¨¨¨ª¬­®®¯±²³³´´µ¶¸¹¹¹¹¹¹¹¹¹¹ºº»»»¼¼½½½½¾¾¿ÀÁÁÁÁÁÂÃÅÆÇÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÕÖÖ××××ØÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÞßßàáãæçççççççæãáààßÞÝÜÜÛÛÛÛÛÛÚÚÚÙ×ÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ÙÚÚÚÚÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßààáããããäåæçæååææåæææææåääääåæçççææååäääääãããâââáááááââááààààßßßßßßßßßßßßßÞÝÝÝÝÝÝÝÞÞßßßÝÜrrqqqqqqqqqqrssssssssssttttttuuuuvvwxxxxxxxxxxxyyyyyzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{||}||||||||||}}~€€€€€‚ƒ„‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’”””••••••••••––—˜™™™š›ž¢¢£££¤¤¤¥¦¨¨¨©«¬­®¯±²³³´´µ¶¸¹¹¹¹¹¹¹¹ºººº»»»¼½½½½¾¾¾¿ÀÁÁÁÁÂÂÃÅÆÇÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖ×××××ØÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÞßßàáãåæææççæåäãâàßßÞÝÜÜÛÛÛÛÛÛÚÚÙØ×ÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝßßàáâãããäååæçæåääääåææææåääääääåææææåææååäããããââáááááááááááààààßßßßßßßßßßßßÞÞÝÝÝÝÝÝÞÞßßßÞÝqqrrrqqqqqqqrrsssssssssstttttuuuuuvwxxxxxxxxxxxyyyyzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{||}||||||||||}}~€€€€‚‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘“””•••••••••••–—˜™™™š›ž¢¢£££¤¤¤¥¦¨¨¨©ª«­®¯±²²³´´´µ¸¹¹¹¹¹¹¹ººººº»»¼¼½½½¾¾¾¾¿ÀÁÁÁÁÂÂÄÆÆÇÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÕÕÕÖÖ×ÖÖÖ××ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÞßßàáâãããäääääãâáàßÞÝÝÜÜÛÛÛÛÛÛÚÚÙØ×ÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×ÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÝÝÞßßàáâãããäååæåäããããääåæåæååäããääååååæååååååäããâââáááààááááâáááààààààßßßààßßßßÞÝÝÝÝÝÝÝÞßßßßÝqqrrrqqqqqqqrrsssssssssttttttuuuvvvwxxxxxxxxxxxyyyyzzzzzyyyyyyxyyyyyyyyyyyyyyyyyyyzzzz{{|}}|||||||||}}~~€€€€‚‚„…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••••••••––—˜™™™š›¢¢¢££¤¤¤¥¦¨¨¨©ª«¬®®¯²²³´´´µ·¹¹¹¹ººººººº»»»¼½½½¾¾¾¾¿ÀÁÁÁÁÂÂÃÅÆÇÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÕÕÖÖÖÖÖÖÖÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÞßßàààáááâââãââáàßßÞÝÜÜÛÛÛÛÛÛÚÚÙØ××ÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×ÙÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞÞßßàâããããäåæäãâââââããääååæääããääåååæææååååæåäãââââááàáááááââáááààààààààààßßßßßÞÝÝÝÝÞÞÞßßßßÝrrrrrrqqqqqqrrrssssssssttttttuuvvvwxxxxxxxxxxyyyyyyyzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{{|}}}}|}|||||}}~~€€€€‚‚„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“””•••••••••––—˜™™™š›ž¢¢¢££¤¤¤¤¦¨¨¨©©ª«­®¯±²³´´´µ¶¹¹¹ºººº»»»»»»»¼½½¾¾¾¾¿¿ÁÁÁÁÁÂÃÄÆÆÇÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÕÕÖÖÖÖÖÖÖ××ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÞßßßßßßßààààáááààßßÞÝÜÜÛÛÛÛÛÛÚÚÙØ××ÖÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×ØÚÚÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßàáâãääääååäãââáááâââãäåääããããääåææçççæååæåäâââáâááàáááááâââââááààáááàààßßßßßÞÞÝÝÝÞÞßßßßßÞrrrrrrrqqqqqqrrssssssttttttttuuuvwwxxxxxxxxxyyyyyyyyzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{{|}}}}}}||||}}~~€€€‚„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘’”””•••••••••–—˜™™™š›¡¢¢£££¤¤¤¥§¨¨¨©©ª«­®°²²³´´´¶¸¹¹ºº»»»»»»»»¼½½½¾¾¾¿¿ÀÁÁÁÁÂÂÃÅÆÆÈÈÊËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÔÔÔÕÖÖÖÖÖÖÖÖ××ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÞÞÞßÞÞßßßßßßààààßßßÞÝÜÜÛÛÛÛÛÛÚÚÙ×××ÖÖÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ØÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞßßßààáãääääããããâááááááâââããããââââããääåæççæååååäâââââááàáááááââââââáááââáààßßßßßßÞÞÝÝÞÞÞÞßßßßÞrrssrrrqqqqqqrrsssssttttttttttuuvvxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyxyyyyyyyyyyyzzzz{{{|}}}}|||}}}~~~~~~~~€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”””••••••••––—˜™™š›¡¢¢£££¤¤¤¥¥§¨¨¨©©ª¬®¯°²³´´´µ·¹¹¹º»»»»»»¼¼¼½½¾¾¾¿¿ÀÁÁÁÁÁÂÃÄÆÆÇÈÈÉÊÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÔÕÕÖÖÖÖÖÖ×××ØÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞßßßßßßßßÞÝÝÜÜÜÛÛÛÛÛÚÙØØ×ÖÖÖÖÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖ×ØÚÚÛÛÛÛÛÛÛÜÜÜÜÝÞßßààáâãããããâââââááàáááâââââââááááââââãäåæææååååãâââââáááááââââáâââââããâáàßßßßßÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞsssssrrrrrqrrrssssstttttttttttuuvvxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyxxxxxxyyyyyyyyyyzzzz{{||}}~}}|}}}~~~~~~~€€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“”””•••••••••–—˜™™™šœ ¢¢£££¤¤¤¤¥¦¨¨¨¨©©«­®¯²³³´´µ¶¹¹¹º»»»¼¼¼½½½½½¾¾¾¿ÀÁÁÁÁÁÂÃÄÅÆÆÇÇÈÉÊËÌÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÖÖÖÖÖ××××ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞÞßßßÞÝÝÜÜÜÛÛÛÛÛÛÚÙØ××ÖÖÖÖÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖÖ×ÙÚÛÛÛÛÛÜÜÜÜÜÝÝÞßßàááâââââââááááááàààááááááááààááááááââäåæææåææäããããâáááááââââââââããäåãáàßßßßÞÞÝÝÝÝÝÝÝÞÞÞÝÝÞÞssssssrrrrrrrsssssstttttttttttuuuwxxxxxxxxxxyyyyzzyyyyyyyyyyyyyyyxxxxxxxxyyyyyyyyyzzzz{{||}}~~}}}}~~€€€€‚ƒ„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“””””•••••••••–—˜™™šœŸ¢¢£££¤¤¤¤¥¦§¨¨¨¨©ª¬®®±²³´´´µ·¹¹ºº»»¼½½½½½½¾¾¾¿¿ÀÁÁÁÁÂÂÄÄÆÆÇÇÈÈÉÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÕÖ×××××××ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÜÜÜÜÜÛÛÛÛÛÛÚÙØ×ÖÖÖÖÖÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖÖ×ÙÚÛÛÛÛÛÜÜÜÜÜÝÞÞßßààááááââáááááááààààààááààààààààààáááâããäåçççæåääääããââââââââââãããäåæäâáàßßßÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝssssssrrrrrrssssssttttttttttuuuuvwxxxxxxxxxyyyyyzzyyyyyyyyyyyyyyyxxxxxxxxyyyyyyyyyzzzz{{||}}~~~~~€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’““”””•••••••••–—˜™™š›ž¢¢££££¤¤¤¤¥¦§¨¨¨©©«­®°²³´´´µ¶¹¹¹º»»¼½½½½¾¾¾¾¿ÀÀÁÁÁÁÂÂÃÄÅÆÆÇÇÇÈÈÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÕÖ×××××Ø××ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÚÚØ××ÖÖÖÖÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖ×ÙÚÛÛÛÛÛÛÜÜÜÝÞÞßßßààááààáááááááàààßßààààààààààßßßßßààáááâãäæççççæææåääãããããâããããääääååãâààßßßÞÞÝÝÜÝÝÝÝÝÝÝÝÝÝÝssssssrrrsssssssstttttttttttuuuvvwxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxyyyyyyyzzzzz{{|||}~€€€€‚„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’“”””•••••••••–—˜™™š›ž¢¢££££¤¤¤¤¥¦¦¨¨¨¨©ª¬®¯²³´´´µ¶¸¹¹º»»¼½½¾¾¾¾¿¿ÀÁÁÁÁÁÁÂÂÃÄÅÆÆÇÇÇÇÈÈÉÊËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÕÖ××ØØØÙØØØÙÚÚÚÚÛÛÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÚÚÚÙØ××ÖÖÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖØÙÚÛÛÛÛÛÛÜÜÜÝÞßßßßààáààààààààààààßßßßàààààßßßßßßßßßßßàáááâãåçççççççæåääååääãääääåäåååäãáààßßßßÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝssssssssssssssssttttttttttttuuvvwxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxyyyyyyzzzzzz{{{||}}~€€€€€€€‚ƒ…†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’’“””•••••••••–—˜™™š›ž¢¢££££¤¤¤¤¤¥¦§¨¨¨©ª¬®¯²³³´´´¶¸¹¹º»»¼½½¾¾¾¿¿ÀÁÁÁÁÁÁÂÂÂÃÃÄÆÆÆÆÆÇÇÈÉÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÖÖ××ØÙÚÙÙØÙÙÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØ×××ÖÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖØÙÚÛÛÛÛÛÛÜÜÝÞÞßßßßààààààààßßßàààßßßßßßßßßßßßßßÞÞÞÞßßßßààááâäæççççççææåäååææåæååæææååääãáààßßßßÞÝÝÝÝÝÝÝÝÝÝÝÝÝÞssssssssssssssstttttttttttuuuvvwxxxxxxxxxxyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyzzzzzzz{{{|||}~~€€€€€€€‚‚„††ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’“”•••••••••–—˜™™š›ž¢¢¢££££¤¤¤¤¥¥¦¨¨¨¨©«®¯²³³´´´µ¸¹¹º»»¼½½¾¾¿¿ÀÁÁÁÁÁÁÁÂÂÂÂÃÄÆÆÆÆÆÆÇÈÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÔÕÕÖÖ××ØÙÙÚÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÚÚÚÚÙÙÙÙÙÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚØØ××ÖÕÕÔÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ÙÚÚÛÛÛÛÛÜÜÝÞÞßßßßààßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÝÝÝÝÞÞßßààááâäççççççççååååççççççççæçåãããâáààßßßÞÞÞÝÝÝÝÝÝÝÞÝÝÝÞsssssssssssssttttttttttttuuuvwwxxxxxxxxxxxyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyyzzzzzzz{{||||}~~€€€€€€€€€€€‚‚ƒ…†‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’’“””””•••••––˜™™ššœŸ¡¢¢¢££££¤¤¤¤¥¥§¨¨¨©«­¯±²³³´´µ·¹¹º»»¼½½¾¾¿¿ÀÁÁÁÁÁÁÁÂÂÂÂÃÅÆÆÆÆÆÆÆÇÈÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÔÔÔÕÕÖÖ×ØÙØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÚÚÚÚÚÙØ××××××ØØØØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØ×ÖÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÖ××ÙÚÚÛÛÛÛÛÜÜÝÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÝÝÝÝÝÝÝÞßßßààááãåçççççççææææççççççççççåãããâáààßßßßßßÞÞÝÝÝÞÞÞÞÞÞßsssssssssssstttttttttttttuuuvwxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyyzzzzzzzz{{|||}}~€€€€€€€€€€€€€‚‚ƒ„…†‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘’““”””•••••–—˜™™š›Ÿ¡¢¢¢££££¤¤¤¥¥¦§¨¨©ª¬®¯²²³´´µ·¹¹ºº»¼½½½¾¾¿¿ÀÁÁÁÁÁÂÂÂÂÃÄÅÆÆÆÆÆÆÆÆÇÈÊÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÔÕÕÖ××ØØØØÙÙÚÚÚÚÚÚÚÙÙÙØÙÙÚÚÚÚÚÚÙØØØ×ÖÖÖÕÕÖÖÖÖÖÖÖÖ×ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙ××ÖÕÕÔÔÔÔÔÓÓÓÓÓÔÔÔÔÔÕÔÔÕÕÕÕÕÖ×ÙÚÚÛÛÛÛÛÜÜÝÝÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÝÝÜÜÜÝÝÞßßßààààâäæççççççççççççççççççççåäããâááàßßßßßßßÞÞÞÞÞÞÞÞÞÞßssssssssssssttttttttttttuuuvwxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyyyzzzzzzzz{{|||}}~€€€€€€€€€€€€€‚ƒƒ„…‡‡ˆŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’““””•••••–˜˜™™š›œžŸ¢¢¢£££££¤¤¤¥¥§¨¨©ª«­®°²³´´´¶¸¹¹º»»¼½½¾¾¾¿¿ÁÁÁÁÁÁÂÂÂÃÄÆÆÆÆÆÆÆÆÆÇÈÊÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÕÕÖÖ××××××ØØÚÚÚÚÚÚÙØØ×ØÙÙÙÙØØ××ÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖ×ØÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚØ×ÖÕÕÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÖ×ØÚÛÛÛÛÛÛÜÜÝÝÞÞÞßßßßßßßßßßßÞÞßßÞÞÞÞÞßßßßßßßÞÝÝÝÜÜÜÝÝÞßßßßßààáâåççççççççççççççççççççåääãââáààßßßßßßßßÞÞßßßßßßßsssssssssstttttttttttttuuuuvxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyyyzzzzzzzz{{|||}~~€€€€€€€€€€€€€€‚ƒ„„„…‡‰ŠŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’’““”••••––˜˜™™šš››ž ¢¢¢££££¤¤¤¥¥¦¨¨¨©ª¬®¯²²³´´µ·¹¹¹º»»½½¾¾¾¾¿ÀÁÁÁÁÁÁÂÃÃÅÆÆÆÆÆÆÆÆÆÇÈÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖ×ÖÖÖÖ××ØÙÚÚÚÚÚÙØØ×ØØ××ÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖÖ×ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÚÙØÖÖÕÕÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÖ×ØÚÚÛÛÛÛÛÜÜÝÝÞÞßßßßßßÞÞÞßÞÞÞÞÞÞÞÞÞÞÞßßßßßßßÞÝÜÜÜÜÜÝÝÝÞßßßßààáâäæçççççççççççççççççççæääãââáàààààßßßßßßßßßßßßßßssssssssttttttttttttttuuuuvwxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyyzzzzzzzzz{{{||}}€€€€€€€€€€€€€€‚ƒ„„„…†‡‰ˆˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘‘’’’““”••••––˜˜™™šššš›ž¡¢¢££££¤¤¤¤¥¦¨¨¨©ª«­®±²³´´´µ·¹¹ºº»»½½¾¾¾¿¿ÀÁÁÁÁÁÂÂÃÅÆÆÆÆÆÆÆÆÇÈÉÊÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖ×ØÚÚÚÚÙÙØ××ÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖ×ØØÙÚÚÚÛÛÛÛÛÛÚÚÚÙ×ÖÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÖ×ØÙÚÛÛÛÛÜÜÜÝÝÝÞÞßßßßÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÞßßÞÞßÞÞÝÜÜÜÜÜÜÝÝÞÞßßßßààáãååççççççççççççççççççæääãââááàààßßßßßßßßßßßßßßßsssssssstttttttttttttuuvvvwxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyyyzzzzzzzzz{{{||}}€€€€€€€€€€€€€‚„…„………‡ˆ‡‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘‘‘’’’“”••••––˜˜™™™™™šš› ¢¢¢£££¤¤¤¤¥¦¨¨¨¨©«­®¯²³³´´´¶¸¹¹ºº»»½½¾¾¾¿¿ÀÁÁÁÁÁÂÃÄÄÅÅÅÅÆÆÆÇÈÉËÌÍÎÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖÕÖÖÖ×ØÚÚÚÚÙØ×ÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÖÖ×ØÙÙÚÚÚÛÛÚÚÚÙÙØÖÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÖ××ÙÚÛÛÛÛÜÜÜÜÝÝÝÞÞßßÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÜÜÜÜÜÝÝÝÞÞßßßßßàáâäåæçççççççççççççççççæååäãâááàààßßßßßßßßßßßßßßßrrssssssttttttttttttuuvvvwxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxyyyyyyyzzzzzzzzz{{{|}}~€€€€€€€‚‚„………††‡ˆ‡‡ˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘‘‘‘’’’“•••––—˜˜™™™™™™ššœž¢¢¢£££¤¤¤¤¥¦§¨¨¨©ª¬®¯²³³´´´µ¶¸¹¹º»»¼½½¾¾¾¿¿ÀÁÁÁÁÂÂÂÃÃÃÄÄÅÆÆÇÈÊËÌÌÍÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖ×ØÙÙØØØ×ÖÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÖÖ×ØØÙÙÙÙÚÙØØØ××ÖÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÖÖÖ×ØÚÛÛÛÛÜÜÜÜÜÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÞÞÞÞÞÞÞÝÝÝÜÜÜÜÝÝÞÞÞÞÞßßßààáãääæçççççççççççççççççæåäãââáààßßßßßßßßßßßßßßßßrrsssssstttttttttuuuuuvvwxxxxxxxxxxxxxyxxyyyyyyyyyyyyyyyyyxxxxxxxxxxxyyyyyyyyyyyyzzzzzz{{{|}}~€€€€‚‚ƒ„…†††‡‡‡‡‡ˆˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘‘‘‘’’“•••––—˜˜™™™™™™™š› ¢¢££££¤¤¤¥¥¦¨¨¨¨©«­¯±²³³³´´µ¶¸¹¹º»»¼½½¾¾¾¿ÀÁÁÁÁÁÁÂÂÂÂÃÃÄÅÆÆÇÉÊÌÌÌÍÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖ××ÖÖÖÖÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÕÕÕÖÖ×××××ØØ××ÖÖÖÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖ×ØÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÝÝÞÞÞÞÝÝÝÝÝÝÝÜÜÜÝÝÞÝÞÞÞÞßßßààáããäæçççççççççççççççççæåäãâááàßßßßßßßßßßßßßàßßrrsssssstttttttttuuuuvvwwxxxxxxxxxxxxyxxxxyyyyyyyyyyyyyyyyxxxxxxxxxxxyyyyyyyyyyyyzzzzzz{{||}~~€€€€‚ƒƒ„…†‡ˆˆ‡‡†††‡ˆˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘’’”•••––—˜˜˜˜™™™™™š›œŸ¢¢¢£££¤¤¤¤¥¦¨¨¨¨©«­®±²²³³´´´µ·¹¹¹º»»¼½¾¾¾¾¿ÀÁÁÁÁÁÁÂÂÂÂÂÃÄÅÆÇÈÉÊÊËËÌÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÕÕÔÔÓÓÓÓÓÓÒÒÓÓÓÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖÖ×ØÚÚÛÛÛÛÛÛÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÞÞÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÞÞÞÞßßßßàáâãäæççççççççççççççççççæäãââáààßßßßßßßßßßßßàààrrrssssstttttttttuuvvvwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyxxxxxxxxxyyyyyyyyyyyyyzzzzzz{||}}~€€€€€‚‚ƒ„„…‡ˆ‰ŠŠ‰‰ˆ‡†‡ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘’“”•••–——˜˜˜˜™™™™™š›Ÿ¢¢¢£££¤¤¤¥¥¦¨¨¨©©«­¯±²²²³³´´µ¶¸¹¹º»»¼½½¾¾¾¿¿ÀÁÁÁÁÁÁÁÂÂÂÂÃÄÆÆÇÈÉÉÊÊÊËËÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÖÖÖÖ××ÙÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÝÝÝÝÝÝÝÝÜÜÜÜÝÝÝÞÞÞÞÞßßßßàááâãåççççççèççççççççççççåäãââáàààßßßßßßßßßßàààrrrsssssttttttttuuvvwwxxxxxxxxxxxxxxyxxxxyyyyyyyyyyyyyyyyyyyxxxxxxxxyyyyyyyyyyyyzzzzzzz{|}}~€€€€€‚‚‚ƒƒ…†‡‰Š‹ŠŠŠŠ‰ˆ‡‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘’“”••••———˜˜˜˜™™™™™š›Ÿ¢¢¢£££¤¤¤¥¥§¨¨¨©©«­¯±²²²³³´´µ¶·¹¹¹º»»½½¾¾¾¾¿ÀÁÁÁÁÁÁÁÁÂÂÂÃÃÅÆÇÈÈÈÈÉÉÉÊËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖ××ØÙÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÝÝÞÞÞÞÞßßßààáââäæççççèèèçççççççççççæäããâááàààààààßßßßààààrrsssssssttttttuuuvvwxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxyyyyyyyyyzzzzzzzzzzz{|}~€€€€€‚‚‚ƒ„……‡ˆŠŠ‹‹ŠŠŠ‹Š‰‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’“”••••–—˜—˜˜˜˜™™™™ššœž ¢¢¢£££¤¤¤¥¦¨¨¨¨©ª¬®¯°±²²³³´´´µ¶¸¹ºº»»¼½½¾¾¾¾¿ÀÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÇÇÇÇÈÈÈÉÊËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÔÔÔÕÕÕÔÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ×ØÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÞßßßßààáâãäåçççèèèèèçççççççççæåääãâáááààààààßààßßààrrssssssstttuuuuvvvwxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyxxyxxxxxxxxyyyyyzzyyzzzzzzzzzz{{|~€€€€€€‚‚‚ƒ„………‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’“””••••–˜˜˜˜˜˜˜™™™™š›ž¢¢¢££££¤¤¤¥§¨¨¨©©ª­®¯¯±²²³³´´´µ¶¹¹¹º»»¼½½½¾¾¾¿¿ÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÆÇÇÇÇÈÉÊËÌÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÔÔÓÓÓÓÓÔÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ×ÙÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞÞßßßßàááâãäæçççèèèèèèèçççççççæåäääãâááááàààààßßßààrrssssssttttuuuuvvwxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyxxxxxxxxxxyyyyyzzzzzzzzzzzzzz{{{|~€€€€€€€‚‚ƒƒ„„„……†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’“””•••••–˜˜˜˜˜˜™™™™ššœž¡¢¢¢£££¤¤¤¤¥¨¨¨¨©ª«­®¯¯±²²³´´´´µ¶¹¹¹ºº»»¼½½¾¾¾¾¿ÀÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÆÆÇÇÇÈÉÊÊËÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÞßßààááâãåççççèèèèèèèçççççççæååååäâáááàààààßßàààrsssssttttttuuuvvwxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyxxxxxxxxyyyyyyzzzzzzzzzzzzzz{{|}€€€€€€€€‚‚‚ƒ„……„„„„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’”••••••–——˜˜™™™™™™™š›œ ¢¢¢££££¤¤¤¤¦¨¨¨¨©ª¬®®¯°±²³³´´´µµ¶¸¹¹ºº»»¼½½½¾¾¾¿ÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÆÆÆÇÇÈÈÉÊËÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÞßßààáâãåæçççèèèèèèèèçççççççææåååäââááàáàààààààssssstttttttuuvwxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyxxxxxxyyyyyyzzzzzzzzzzzzz{{{|}~€€€€€€€‚ƒƒ„„……………„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“”•••••–——˜˜˜™™™™™™ššœž ¢¢¢££££¤¤¤¤¥¦¨¨¨¨©«­®¯±²²³³´´´´µ¶¸¹¹ºº»»¼½½½¾¾¾¿ÁÁÁÁÁÁÁÂÂÂÃÄÅÅÆÆÆÆÆÆÇÇÈÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÞßßàááâãäçççççèèèèèèèèçççççççççææåäãââáááàààáààssssttttttttuuwxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxyyyyyzzzzzzzzzz{{{{||}~€€€€€€€‚ƒ„………………………†‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••––——˜˜˜™™™™™ššœž¡¢¢¢£££¤¤¤¤¤¥¥¦¨¨¨©ª¬®¯±²²³³´´´´µ¶¸¹¹¹º»»¼½½½¾¾¾¿ÁÁÁÁÁÁÁÂÂÂÃÄÄÄÅÅÆÆÆÆÇÇÇÈÉÊÌÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßßàáâãäæççççèèèèèèèèèçççççççççææåäãââááááááààssstttttttttuuwxxxxxxxxxxxxxxxxxxxxyyyyyyyyyxyyyyyyyyyyyxxxxxxxxyyyyyyzzzzzzzzz{{{||}}~€€€€€€‚ƒ„…‡‡†…………†††ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“••••––———˜˜˜™™™™šš›œŸ¢¢¢£££¤¤¤¤¤¤¤¥¦§¨¨©©«­®°²²³³´´´µµ¶¸¹¹¹º»»»½½½¾¾¾¿ÁÁÁÁÁÁÁÂÂÂÂÃÃÃÄÄÅÆÆÆÆÇÇÈÉËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖÖØÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÞßßàáâãäåççççèèèèèèèèèèççççççççæååååãâááááááààssttttttttttuvwwxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyxxxxxxxxyyyyyyzzz{{z{{{{{||}~€€€€‚ƒ„…‡ˆˆ‡†………‡‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’”••••–˜˜˜˜˜˜™™™™ššš›ž ¢¢¢££££¤¤¤¤¤¤¥¥¦¨¨¨©ª¬®¯²³³´´´´´µ¶¸¹¹¹ºº»»¼½½¾¾¾ÀÁÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÄÅÆÆÆÆÇÈÊËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖ×ØØÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝßßßàáãåæççççèèèèèèèèèèèçççççççæåääääãââáááááástttttttttttuuvvvvwwxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyxxxxxxxyyyyyyyzzz{{{{{{{|}~€€€€€‚‚‚ƒ„…†ˆ‰‰ˆ†………†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••–—˜˜˜˜™™™™™šššœž ¢¢¢££££¤¤¤¤¤¤¤¥¥¨¨¨¨©«­¯²²³³´´´´µ¶¸¹¹¹ºº»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÂÂÂÂÂÂÃÃÄÄÅÆÆÆÇÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÖ××ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞßßàáâäçççççèèèèèèèèèèèçççççæææåääääããâââááááttttttttttttuuuuuuvvxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyxxxxxxyyyyyyyzzz{{|{|||}€€€€€€‚ƒƒ„„…†ˆŠŠŠ‰‡†…†‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••–—˜˜˜™™™™™™šš›œŸ¡¢¢££££££¤¤¤¤¤¤¤¥§¨¨¨©ª­¯±²³³´´´´µ¶¸¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÄÅÆÆÇÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÒÒÒÒÒÒÒÑÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕ××ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞßßàáâäçççççèèèèèèèèèèèèçççççæææäääääãããâââáátttttttttttuuuuuuuuvwxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyxxxxxyyyyyyyzzz{{||}}~€€€€€€€‚ƒ„……†‡Š‹‹‹‰‰ˆ‡‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘“”•••••–—˜˜™™™™™™šš›œž ¢¢¢££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª­®°²³³´´´´µ¶¸¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÄÄÆÆÆÇÈÉËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞßßßàáãåçççççèèèèèèèèèèèççççççççåååäääãããââááttttttttttuuuuuuuuuvvxxxxxxxxxxxxxyyyyyyyyyyyyyyyzyyyyyyyyyyyxxyyyyyyzzzz{{|}~€€€€€€€‚‚ƒ„††‡ˆ‰‹‹‹‹‰Š‰‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••–—˜˜™™™™™šš›œœž ¢¢¢¢££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª­®°²²³´´´´µ¶¹¹¹¹ººº»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÇÈÉÊËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÑÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßààáãæçççççèèèèèèèèèèççççççççæææååäãããââááttttuttttuuuuuuuuuuuvvxxxxxxxxxxxxyyyyyyyyyyyyyzzyyyyyyyyyyyyyyyyyyyyzzzz{{|}~€€€€€€‚‚‚ƒ„†ˆ‰‰Š‹‹‹‹‹‹‹Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘’“”••••–—˜˜™™™ššš››ž ¢¢¢¢£££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª­®¯±²³´´´µµ·¹¹¹¹ººº»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÅÆÆÇÈÉËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÓÔÔÔÔÔÔÔÔÔÔÕÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßßßàáâåçççççèèèèèèèèèèçççççççççççæåääãââáááttttuuuuuuuuuuuuuuuuuvwxxxxxxxxxxxyyyyyyyyyyyyzzyyyyyyyyyyyyyyyyyyyyyzzzz{{|}~€€€€‚‚ƒ„…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••–—˜˜™™™š››œž ¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª­®¯±²³´´´µ¶·¹¹¹¹ººº»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÅÆÆÇÈÊÌÍÎÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÖØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßààâäçççççèèèèèèèèèèçççççççççççæåäãâââáááttttuuuuuuuuuuuuuuuuuuvxxxxxxxxxxxxyyyyyyyyyzzyyyyyyyyyyyyyyyyyyyyyyyzzzz{{||}€€€€‚‚‚ƒ„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’”••••–—˜˜™™™š›œœž ¢¢¢¢¢££££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª¬®¯±²³³´´µ¶¸¹¹¹¹¹º»»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÅÆÆÇÈÊËÌÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÖÖØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßßàáãæççççèèèèèèèèèèèççççççççççæäãâááàààátttuuuuvuuuuuuuuuuuuuvvwxxxxxxxxxxxxxyyyyyyzzzyyyyyzzzzyyyyyyyyyyyyyzzzzz{|||~€€€€‚ƒ„…†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘’”••••–——˜™™™š›žŸ¡¢¢¢¢¢££££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª¬®¯±²³´´´´µ·¹¹¹¹¹ºº»»¼½½¾¾¿ÀÀÀÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÇÉËËÌÌÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÖÖØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÙØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞÞßßßàáâåççççèèèèèèèèèèèçççççççççæäãâáààààààtttuuvvvvuuuuuuuuuuuuuvvwxxxxxxxxxxxxyyyyyyzzzzzzzzzzzzyyyyyyyyyyyyzzzzz{{||}~€€€€‚‚„†ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’”••••––—˜™™™šœ ¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¥§¨¨¨©ª«­¯±²³³´´´µ¶¸¹¹¹¹ºº»»¼½½¾¾¿ÀÀÀÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÇÈÊÌÌÌÌÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝÝÞßßßàáâäççççèèèèèèèèèèèèèççççççåäãâáàààßßßßtttuvvvvvvvuutttuuuuuuuvwxxxxxxxxxxxyyyyyzzzzzzzzzzzzzzzyyyyyyyyyzzzzzz{{{|}~€€€€‚ƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽ‘‘’“”••••––—˜™™™šœž¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¦§¨¨¨©©«­®±²³³´´´´µ¶¸¹¹¹ºº»»¼½½½¾¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÂÂÃÄÆÆÇÈÉËËËÌÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÖ××ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßààâäæçççèèèèèèèèèèèèèççççæåããâáààßßßßßßtttuvvvvwwvuttttuuuuuuuvvwxxxxxxxxxxyyyyzzzzzzzzzzzzzzzzzzyyyyyyzzzzzzz{{||}€€€‚ƒƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽ‘‘’“”••••––—˜™™™šœŸ¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¦¨¨¨¨©©«­®°²²³³´´´´µ·¹¹¹ºº»»¼¼½½¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÂÂÂÃÄÆÆÆÇÈÈÉÊËÊËÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÖÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÙÙÙØØÙÚÚÙÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÝÝßßßßàâäæçççèèèèèèèèèèèèèççççåäãâáàßßßßßßÞÞtttuvvvwwwvutttttuuuuuuuvvvwxxxxxxxxyyyyzzzzzyyyyzzzzzzzzzzzyzzzzzzzzz{{||}~€€€‚ƒƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽŽ‘‘’“”••••––—˜™™ššœŸ¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¥§¨¨¨¨©©«­®°±²²³³´´´µ¶·¹¹¹º»»¼¼½½¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÂÂÃÃÃÅÆÆÆÇÇÈÉÊÉÊËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÔÔÔÕÕÕÕÖÖØØÙÚÚÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØ×ØØÙÚÚÙÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÝßßßààâäçççççèèèèèèèèèèèèçççåäãâáàßßßßßÞÝÝÝtttuuuvvwwuuttttttuuuuuuuuvvwxxxxxxxyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzz{{{|}~~€€€€‚ƒ„…‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽŽŽŽ‘‘’”••••––—˜™™š›œŸ¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¦§¨¨¨¨©©«­®¯°°²²³³´´´µ¶¸¹¹º»»»¼½½¾¾¾¿¿ÀÀÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÆÇÇÈÈÈÉÊÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÔÔÔÕÕÕÖ××ÙÚÚÚÚÚÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙØØØØØ×××ØØ××××××××ØÙÚÚÚÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÜÜÝÞßßàáâäçççççèèèèèèèèèèèççççääâáàßßßßßÞÝÝÝÜtttuuuuvwvuuttttttuuuuuuuuuvwxxxxxxxyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzz{{{{|~€€€€‚ƒƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽŽŽŽŽ‘‘’”••••–—˜˜™™š›Ÿ¢¢¢¢¢££¢£££££££¤¤¤¤¤¤¥¦§¨¨¨¨©ª¬­®®¯°°²²³³´´´µ·¹¹¹º»»¼½½¾¾¾¿¿ÀÀÁÁÁÁÁÁÁÂÂÂÂÂÃÄÅÆÆÇÇÈÈÈÈÈÉÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÕÕÖÖ×ØÙÚÚÚÚÚÚÚÛÛÛÛÛÚÚÙÙÙÚÚÚÚÚÚÚÚÚÙØ×ÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖ××ØØÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÞßßàáãåçççççèèèèèèèèèèèçççæäãâáàßßßßÞÝÝÜÜÜttttuuuvvvvuttutttuuuuuuuuuvvwxxxxxyyyyyyyyyyyyyyyyzzzzzzz{zzzzzzzz{{{{|}~€€€€€‚ƒƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽ‘’“”••••–—˜™™™šœž¡¢¢¢¢¢££££££££££¤¤¤¤¤¤¥¦¨¨¨¨©©ª¬­®®¯¯°±²²³´´´µ¶¸¹¹º»»»¼½¾¾¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÆÇÈÇÇÇÈÈÉÊËÎÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÕÕÖÖ××ØØÙÙÙÚÚÚÚÚÛÛÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚØ×ÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÖÖ××ØÙÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÞßàáãäåççççççèèèèèèèèèççççæäãâáààßßÞÞÝÜÜÜÜtttuuuuvvvvuuuuuuuuuuuuuuuuvwxxxxxxyyyyyyyyyyyyyyyyzzzzzzz{{{{zz{{{{{|||}€€€€‚‚ƒƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’”••••––—˜™™ššœŸ¢¢¢¢¢£££££££££££¤¤¤¤¤¤¥§¨¨¨¨©ª«¬­­®®¯°±²²³´´´´µ·¹¹ºº»»¼½½¾¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÄÆÆÆÇÇÇÇÇÈÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÔÕÕÕÖ×××ØØÙÙÚÚÚÚÚÚÚÚÚÙÙÙÙÙØØÙÙÙÙÙØ××ÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖØÙÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÞßàáãåæççççççèèèèèèèèèçççççåãâáàßßßÞÝÝÝÜÜÜttuuuuuvvvvvuuuuuuuuuuuuuuuvxxxxxxxxyyyyyyyyyyyyyyzzzzzzzz{{|{{{{{{{{|||}~€€€€€€‚‚ƒƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽŽŽ‘’“”••••–—˜™™™š› ¢¢¢¢£££££££££££¤¤¤¤¤¤¥¦¨¨¨¨©ªª«¬­­®®¯°±²²³´´´´µ·¹¹¹º»»»½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÂÃÃÄÅÆÆÇÇÇÇÇÈÉÊËÌÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÕÖÖ××ØØÙÙÚÚÚÚÚÚÚÚÙØØÙØØØØØØØ×××ÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖ×ØÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÝÞßàáãæççççççççççççèèèççççççæäâáàßßßÞÝÝÜÜÜÜuuuuuuvvvwvvuuuuuuuuuuuuuuvvxxxxxxxxyyyyyyyyyyyyyzzzzzzzz{{|||{{{{{{{{|}}~€€€€€€‚ƒƒƒ„‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽ‘‘’”••••–—˜™™™š›œž¢¢¢¢¢££££££££££¤¤¤¤¤¤¥¥¦¨¨¨©©ª««¬­­®®¯°±²²³´´´´µ·¹¹¹º»»»¼½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÆÇÈÈÈÈÉÊËÌÏÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÓÓÓÔÔÔÔÕÕÕÖÖ××××ØÙÚÚÚÚÙÙÙØØØØ××××××ÖÖÖÕÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖ×ØÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÞßßàâäæççççççççççççççççççççæäãâáàßßßÞÝÝÜÜÜÜuuuuuuvvvvvvvuuuuuuuuuuuuvvwxxxxxxxxyyyyyyyyyyyyyzzzzzzzz{{||||{{{{{{{|}}~€€€€€€‚‚ƒƒ„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’“”•••–—˜˜™™šš›Ÿ¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¥¦§¨¨¨©ªª«¬¬­­®®¯°±²²³´´´´µ¶¸¹¹º»»»¼½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÆÇÈÉÉÉÊËÍÎÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÓÓÓÔÔÔÔÔÕÕÕÕÖÖÖÖ××ØØØØØØ××××Ö×Ö××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÕÕÕÖ××ÙÚÛÚÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝßßàáãäææççççççççççççççççççæåãâáàßßßÞÝÝÜÜÜÜÜuuuuuuuvvvvvvuuuuuuuuuuuvvwwxxxxxxxxyyyyyyyyyyyyzzzzzzzz{{{{{|||{{{{{||}~€€€€€‚‚ƒƒ„…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘’“”•••–—˜˜™™™š›Ÿ¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¥¥¦¨¨¨©©ª«¬­­­®®¯¯°²²³³³´´´µ¶¸¹¹ºº»»¼½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÇÇÈÉÉËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖÖÕÕÕÕÔÔÔÕÕÕÕÕÕÔÔÔÔÔÔÔÔÕÕÕÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞßßàâãååæççççççççççççççççççæäâáààßßßÞÝÝÜÜÜÜÜuuuvvuvvvvvvvvuvvvvvvvvvvwxxxxxxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{||{{{{|}}~€€€€€‚‚‚ƒ„…ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘’’“””•••–—˜˜™™™ššœž¡¢¢¢¢£££££££££¤¤¤¤¤¤¤¥¥¦§¨¨¨©ª«¬­­®®®¯¯°±²²³³³´´´µ¶¸¹¹º»»»¼½¾¾¿ÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÆÈÈÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÕÕÖÖÖÖ×××××ÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÕÕÕÔÔÔÔÔÔÔÔÔÕÕÕÖÖØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßßàâãåååæççççççççççççççççççåãâáààßßßßÞÝÜÜÜÜÜvvvvvvvvuvvvvuuvwwvvvwwwwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{||{||}}€€€€€‚‚‚‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘‘’’““””••••––˜˜™™™™š›œŸ¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¥¦§¨¨¨©ª«¬­®®®®¯¯°±²²³³³³´´´´¶¸¹¹º»»»¼½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÆÈÉËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÕÕÖÖ××××××ÖÖÖÕÕÕÖÖÖÕÕÕÕÔÔÔÔÔÔÔÔÔÕÕÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßßàáâãäååççççççççççççççççççæäâááàààßßßÞÝÝÜÜÜÜvvvwwwvuuvvvuuuvwxwwwwxxxxxxxxxxxxyyyyzzzzzyyyyzzzzzz{{{{{{{{{{{{{||||}~€€€€‚‚‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘‘‘‘‘‘’“””••••••––˜˜™™™™šš› ¢¢¢£££££££££¤¤¤¤¤¤¤¥¥¦§¨¨¨©©ª¬­®®®¯¯°±²²²³³³³³´´´´µ·¹¹º»»»¼½¾¾¿ÀÁÁÁÂÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÇÈÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÕÖÖÖ××××ÖÖÖÕÕÕÖÖÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÔÕÕÕÕÖÖ×ØÙÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞÞßßßàââããäåççççççççççççççççççåãâáàààßßßÞÞÝÝÜÜÜÜvvwwwwvvvvvuuuuvwxxxxxxxxxxxxxxxxyyyyzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{|||}~€€€€‚‚ƒ„‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘‘‘‘‘’’’“”••••••––˜˜™™™™šš›œŸ¢¢¢¢£££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨©©ª«­®®¯°°±²²²²³³³³³´´´´µ·¹¹º»»»¼½¾¾¾¿ÁÁÁÂÂÁÁÁÁÂÂÁÂÂÂÃÄÅÆÆÆÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÖÖÖ×ÖÖÖÖÕÕÕÕÖÕÕÕÔÔÔÔÔÔÓÓÓÓÓÔÔÔÔÕÔÔÔÔÔÔÕÕÕÕÕÕÖ×ØÙÚÚÛÛÛÛÛÛÜÜÜÜÝÝÞßßßàáâââãäåçççççççççççççççççåãâáààßßßßßÞÝÝÝÜÜÜÜvvwwvuuuvvuuuuuuvxxxxxxxxxxxxxxxxyyyyzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{|||}~€€€€€€€‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘’’’’’’“”••••••––—˜™™™ššššœž ¢¢¢£££££££££¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨©©©ª¬­®¯°±²²²³³³³³³³´´´´µ·¹¹º»»»¼½½¾¾¿ÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÃÃÄÆÆÆÇÉÌÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ×ØÙÚÛÛÛÛÛÛÜÜÜÜÝÝÞßßààáââââãåæçççççææåååææåååäãáàààßßßßÞÞÝÝÝÝÜÜÜÜvvvvuuuuuuuuttuuvwxxxxxxxxxxxxxxyyyyzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{||}}~€€€€€€€€€‚ƒ„‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’’“““““”••••••––—˜˜™™™ššš››Ÿ¡¢¢¢£££££££££¤¤¤¤¤¤¤¥¦§¨¨¨¨¨¨©©ª«­®®°±²²³³³³³³³´´´´´µ·¹¹ºº»»¼½½¾¾¿ÁÁÁÁÂÂÂÂÂÂÂÂÂÂÃÃÃÄÆÆÆÇÉÌÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ××ÙÚÛÛÛÛÛÜÜÜÜÝÝÞßßßàáááââããåçççççæååäääåäãããâáààßßßßßÞÞÝÝÝÝÝÜÜÜÜwvvuuuuuuuuutttuuvxxxxxxxxxxxxxyyyyyzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{||}}~€€€€€€€€€‚ƒ…†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘’“”””””•••••––—˜˜™™™™ššš››œŸ ¢¢¢££££££££¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨¨¨¨©©ª¬®®¯±²²³³³³³´´´´´´µ¶·¹¹ºº»»¼½½¾¾¿ÀÁÁÁÂÂÂÂÂÂÂÂÃÃÃÃÃÄÆÆÆÇÉÌÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ØÙÚÛÛÛÛÛÜÜÜÝÝÞÞßßßàááâââãååççççççæååäåäããââáààßßßßÞÞÞÝÝÝÜÜÜÜÜÜÜvuuuuttttuuutttuuvwwxxxxxxxxxxyyyyyyzzzzzzzzzzzzzzzzzzzzz{{{{{{{{||}}}~€€€€€€€€€‚‚ƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘‘‘’“”•••••••••–—˜˜™™™™šš››œžŸ¡¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¥¦§§¨¨¨¨¨¨¨©©ª¬­®¯°²²³³³´´´´´´´´µ¶¸¹¹ºº»»»½½¾¾¿ÀÁÁÂÂÂÂÂÂÂÂÂÃÃÃÃÄÅÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖ×ØÙÚÛÛÛÛÛÜÜÜÝÞÞßßßàààáâââãåççççççççååäääãâááàßßßßÞÞÞÞÝÝÝÝÜÜÜÜÜÜÜuuuttttttuuuttuuuvvwwxxxxxxxxyyyyyyzzzzzzzzz{z{{{{zzzzzz{{{{{{{{{||}}~€€€€€€€€€€‚ƒ…‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘’’“”••••••••–—˜˜™™™ššš›››œžŸ ¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¥¥¦¦§§¨¨¨¨¨¨¨©ª«­®¯±²²³³³´´´´´´´µµ·¹¹¹ºº»»»¼½¾¾¿ÀÁÁÂÂÂÃÃÂÂÂÂÂÃÃÄÄÆÆÆÇÉËÍÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖ×ØÚÚÛÛÛÛÛÜÜÜÝÞÞßßßàààáââããåçççççççççååääâáààßßßßÞÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜutttttttuuuuuuuuuuuvwxxxxxxxyyyyyyzzzzz{{{{{{{{{{{{zz{{{{{{{{{{{{||}~~€€€€€€€€€€€€€‚„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽ‘‘‘’’“”•••••••––—˜˜™™™™ššš›œœžžŸ¡¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¥¥¦¦¦§¨¨¨¨¨¨¨©ª«­®¯±²²³³³´´´´´´µµ¶¸¹¹¹ºº»»¼½½¾¾¿ÀÁÁÂÂÃÃÃÃÃÃÂÂÃÃÅÆÆÆÇÈÉÌÏÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÖÖÖ×ØÚÚÛÛÛÛÛÛÜÜÜÝÞßßßàààáâããäæçççççççççæååãâáàßßßßÞÝÝÝÝÝÝÝÜÜÜÜÜÜÜÛÛtttttttttttttuuuuuuuvwxxxxxxyyyyyyzzzz{{{{{{{{|{{{{{{{{{{{{{{zz{{{|}~€€€€€€€€€€€€‚ƒ†‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘’’’“”•••••–––—˜˜™™™™™šš››œžŸ ¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨¨¨©ªª¬®¯±²²³³³´´´´µµ¶¶·¹¹¹¹º»»»¼½½¾¾¿ÁÁÁÂÂÂÃÃÃÃÃÃÃÃÄÅÆÆÇÇÉËÍÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×ÙÚÚÛÛÛÛÛÛÜÜÜÝÞßßßßààáâããäåççççççæææææäâáàßßßßÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛtttttttttttttttuutuuvwxxxxxyyyyyyzzzzz{{{{{{{{||{{{{{{{{{{{{{z{{{{||~€€€€€€€€€€€ƒ†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽ‘‘‘’’“””••••––—˜˜™™™™™™™š››œŸŸ ¡¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§§¨¨¨¨¨©©ªª¬®¯±²²³³³´´´´µ¶··¸¹¹¹ºº»»»¼½½¾¾¿ÁÁÁÂÂÂÃÃÃÃÃÃÃÄÅÆÆÇÇÈÊÌÏÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÕÕÖÖÖÖ×ØÙÚÚÛÛÛÛÛÛÛÜÜÝÞßßßßààáâããäåæçççççæåææåãáàßßßÞÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛtttttttttttttttttuuuuvxxxxxyyyyyzzzzz{{|||||||||||||||{{{{{{{{{{{{|}€€€€€€€€€€‚ƒ…‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’““””•••••–—˜™™™™™™™™šš›œž ¢¢¢¢¢¢££££££¤£¤¤¤¤¤¤¤¤¤¤¥¥¥¦§§¨¨¨¨¨¨©©ª¬®¯±²²³³´´´´´µ¶·¸¹¹¹¹ºº»»¼½½¾¾¾¿ÁÁÁÂÂÃÃÄÅÄÄÄÅÆÆÆÇÇÈÊËÎÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÕÕÖÖÖÖ×ØÙÚÚÛÛÛÛÛÛÛÜÜÝÝÞßßßßààáââäæåæççççæææåäâààßßÞÞÞÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛtttttttttttttttttuuuuvwxxxxyyyyyzzzz{{{|||||||||||||||{{{{{{{{{{{|}~~~~€€€€€€€€€‚…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’’“””••••••–—˜™™™™™™™šš››œž ¡¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦§¨¨¨¨¨©©©«­®®°²²³³´´´´´µ¶·¸¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÂÂÃÃÄÅÆÆÆÆÆÇÇÈÉÊÌÏÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÕÕÖÖ×××ØÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞßßßßßàááâãääæçççççççäãâàßßßÞÝÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛtttttttttttttttttuuuuvxxxxxxyyyyzzzzz{{||}}}|||}}|||||{{{{{{{{{{|}~~}}~€€€€€€‚…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’““””••••••––˜˜™™™™™ššš›œœžŸ¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦§¨¨¨¨¨©©ª«­®®°²²³³´´´´´µ¶·¹¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÂÂÂÃÃÄÅÆÆÆÆÇÈÉÊËÍÏÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÕÕ××ØØÙÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞÞßßßßàááââããåææççççæäâáàßßÞÝÝÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛttttttttttttttttttuuuvxxxxxxyyyyzzzzz{{|||||||||||{{{{{{{{{{{{{|}}~}}}}}~€€€€‚„ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘‘’““”””••••••–—˜™™™™™™šš››œœžŸ¡¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦§¨¨¨¨¨©©ª«¬­®°±²³³´´´´µµ¶·¹¹¹¹ºº»»¼¼½½¾¾¿ÁÁÁÂÂÂÃÃÄÆÆÇÇÈÈÉËÌÎÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÒÒÒÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÕÕÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞÞßßàààááââãäåååææäâáàßßßÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛtstsssssssstttttttuuuvwxxxxxyyyyyyzzzz{{{{{{{|||{{{{{{{{{{{{{{{|}~~~}|||||}}~~€€€€‚„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’’’“””•••••••–—˜™™™™™™ššš››œŸ¡¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦§¨¨¨¨¨©©©ª«­®¯±²²³³´´´´µ¶·¹¹¹¹ºº»»¼½½¾¾¾¿ÁÁÁÂÂÂÃÃÅÆÇÈÉÉÊËÍÏÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÒÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÕÖÖ×ÙÚÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßßààáááââãääääãáàßßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛssssssssssstttttttuuvvxxxxxxxyyyyyzzzzz{{{{{{{{{{{z{z{{{{{{{{{|}~~~}|{{{{{||}}~€€€€€‚„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘’’“”””•••••••–—˜™™™™™™ššš››œž ¢¢¢¢¢££££££¤£££¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦§¨¨¨¨¨¨©©ª«­®¯°²²³³´´´´µµ·¹¹¹¹ºº»»¼½½¾¾¿ÀÁÁÁÂÂÃÃÄÆÆÇÉÊÌÌÍÏÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÔÔÕÕÖ×ØÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßàààààáâãâââááàßßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚssssssssssstttttttuuvwxxxxxxxyyyyyyyzzzzzz{{{{{{{{zzzz{{{{{{|||}~~~||{{{{{{||}}~€€€€€‚„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘‘’“””•••••••––—˜™™™™™ššššš›œž ¢¢¢¢££££££££££¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦¦¨¨¨¨¨¨©©©ª«­®¯°±²²³´´´´µµ·¹¹¹¹º»»»¼½½¾¾¿ÀÁÁÁÂÂÃÄÅÆÆÈÊÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÒÒÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÕÕÖØÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßßßßààáââáâáàßßßßÞÝÜÜÛÛÛÛÛÛÛÛÛÚÛÛÛÚÚÚÚÚÚsssssssssssttttttuuuvwxxxxxxxxyyyyyyyzzzzzzzz{{{{{{zz{{{{{{||||}~~}}|{{{{{{|||}~€€€€‚„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’“””••••••––—˜˜™™™™™š™šššš›ž ¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦§¨¨¨¨¨¨©©©ª«­®®¯°²²³³´´´µµ·¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÂÃÃÅÆÆÇÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÕÕÖ×ØÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßßßààááááààßßßÞÝÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÙØÙØsssssssssssttttttuuuvwxxxxxxxxxxyyyyyyzzzzzz{{{{{{{{{{{{{{||||}}~~}||{{{{{|||}~€€€€‚„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘’“””••••••–——˜™™™™™™™™™šš›œž¡¢¢¢££££££££££¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦¦§¨¨¨¨¨©©©ª«¬­®®¯°²²³³´´´µ¶·¹¹¹ºº»»¼½½¾¾¿ÀÁÁÁÁÂÃÄÅÆÇÈËÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÑÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÒÒÓÒÓÓÓÓÓÓÔÔÔÕÕÖ×ÙÚÛÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßßßààààáàßßßÞÝÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÙØØØ×ssssssssssttttttuuuvwxxxxxxxxxxxyyyyyyzzzzzz{{{{{{{{{{{{{|||||}~}|||||||||}}}}€€€‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽ‘‘’““”••••••–—˜™™™™™™™™™ššš›œŸ¡¢¢¢££££££££££¤¤¤¤¤¤¤¤¤¤¤¥¦¦¦§§¨¨¨¨¨©©ªª«¬­®®¯°²²²³´´´´¶¸¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÁÂÃÄÅÆÇÉÌÏÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÒÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÕÕÖ×ØÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞÞßßßßàààààßßÞÝÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚÙÙØØØ××Össsssssssstttttttuuvwxxxxxxxxxxxxyyyyyzzzzzz{{{{{{{{{{||||||}}}}|||||||}}}}}}~€€€‚„…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽŽ‘‘’““”•••••–—˜˜™™™™™™šššš››œžŸ¢¢¢¢££££££££££¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨©©©ª¬­­®®¯°²²²³´´´´µ·¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÁÂÃÄÅÆÇÉÊÍÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÕÖÖ×ØÙÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝÝÝÝÞÞßßßßßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚØØ××××ÖÖssssssssssttttttuuuvxxxxxxxxxxxxxxyyyyzzzzzz{{{{{{{{{|||||||}}~~~}}|}}}}~~~~~~€€‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘’“””••••––—˜˜™™™™™™šššš›œŸ¡¢¢¢£££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨©©ªª¬­­®®¯°²²³³´´´´µ¶¸¹¹º»»¼½½¾¾¿¿ÀÁÁÁÁÂÃÄÆÆÇÈÊÌÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÕÕÖÖ×ØÙÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßßßÞÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØ××××ÖÖÖssssssssttttttttuuuvxxxxxxxxxxxxxxyyyyzzzzz{{{{{{{{{||}}}}|}}}~~~~}}}~~€€‚„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘‘’“””••••––—˜˜˜™™™™™™šš››œž ¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨©©ªª«¬­®®¯°±²²³³´´´´µ¶¸¹¹º»»¼½½¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÈÉÌÏÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÒÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÖ×ØÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞÞÞÝÝÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØ×××ÖÖÖÖssssssssttttttttuuuvxxxxxxxxxxxxxyyyyyzzzz{{{{{{{{{||}~~}}}}}~~~€€€€ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘’“”•••••–—˜˜˜˜™™™™™™šš››œž ¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦§¨¨¨¨¨©ªª¬­®®¯°±²²³³´´´´´µ¶¸¹¹º»»¼½½¾¾¾¿ÀÁÁÁÁÂÃÅÆÆÇÈÉËÏÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÒÒÒÒÒÒÓÓÒÒÓÓÓÓÔÔÔÔÔÔÕÕÕÕÖ×ÙÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØØ××ÖÖÖÖsssstssttttttttuuuvwxxxxxxxxxxyyyyyyyyzzz{{{{{{{{{||}~~~~~€€€€€€€‚ƒ†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽ‘‘’’“”•••••–—˜˜˜™™™™™™™šš›œŸ¡¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦¨¨¨¨¨©ª«­­®®¯°²²²³³´´´´µµ·¹¹¹º»»¼½½¾¾¾¿ÀÁÁÁÂÂÃÅÆÆÇÈÉÌÏÐÐÐÐÐÐÐÑÑÑÒÒÒÒÒÓÒÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÓÓÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÌÌÍÍÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÓÓÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÖ×ÙÚÚÚÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙÙØØ×ÖÖÖÖssssttttttttttttuvwwxxxxxxxxxyyyyyyyyzzzz{{{|{|||||}€€€€€€€€€€€€‚„‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘’“””•••••–—˜˜˜™™™™™™ššš›œŸ¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦§¨¨¨¨©©ª¬­®¯°±²²³³³´´´´µ¶·¹¹¹º»»¼½½¾¾¾¿ÀÁÁÁÂÃÄÅÆÆÇÈÉÌÏÐÐÐÐÐÐÐÑÑÑÒÒÒÒÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÒÒÒÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËËÌÌÍÍÌÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÑÑÒÒÒÒÒÒÓÓÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÖ×ÙÚÚÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙÙ××××ÖÖÖssstttttttttttttuuwwxxxxxxxxxyyyyyyyyzzz{{{||||||}}€€€€€€€€€€€€€€€€€‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽ‘‘’’“”•••••–——˜˜˜˜™™™™ššš›œŸ¢¢¢¢¢¢¢¢¢¢££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦¦§¨¨¨¨©©ª«­®¯°±²²³³³´´´´µ¶·¹¹¹º»»½½½¾¾¾¿¿ÁÁÁÂÂÃÄÅÆÆÇÉËÏÐÐÐÐÐÐÐÑÑÑÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÑÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍËËÊÊÊËÌËÊÊÊËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÑÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÖ×ØØØØØÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÙØØ×××ÖÖÖÕtssttttttttttttttuvxxxxxxxxxyyyyyyyyzzz{{|||}}}}~€€€€€€€€€€€€€€€€€€€€€‚„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽ‘‘‘’’”•••••–––——˜˜˜™™™ššš››Ÿ¢¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦¦§¨¨¨¨¨©©ª¬­®¯±²²³³³´´´´µ¶·¹¹¹º»»½½½¾¾¾¾¿ÁÁÁÂÂÃÃÅÆÆÇÈÊÎÐÐÐÐÐÐÐÑÑÑÑÒÒÒÓÓÓÒÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÏÏÏÐÐÏÏÐÐÐÐÐÐÐÐÐÐÐÎÍÌËËÊÊÉÊÊËÉÈÈÈÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÖÖØØØØÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙØØ××ÖÖÖÖÕsstttttttttttttttuvwxxxxxxxxyyyyyyzzzzz{||}}~~~~€€€€€€€€€€€€€€€€€€€€€‚‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽŽ‘‘‘’’“••••••–––——˜˜™™™ššš››Ÿ¢¢¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¦§¨¨¨¨¨¨©©ª«­®®°²²³³³´´´´µ¶·¸¹¹º»»¼½½¾¾¾¾¿ÁÁÁÁÂÂÃÅÆÆÇÈÊÎÐÐÐÐÐÐÐÑÑÑÑÒÒÒÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÍÍÍÍÎÍÍÍÏÐÐÐÐÏÐÐÐÏÍÌËÊÉÉÉÊÊÊÉÈÇÇÈÈÉÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÖÖ×××ØØÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙÙØØ×ÖÖÖÕÕÕsssttttttttttttttuuvxxxxxxxxyyyyyzzzzz{||}}~€€€€€€€€€€€€€€€€€€€€€€€€€‚‚ƒ…†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽ‘‘’’“”•••••••––——˜˜™™™šššš›Ÿ¢¢¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦§¨¨¨¨¨¨¨©©©ª¬­®°²²³³³´´´µµ¶·¹¹¹º»»¼½½¾¾¾¾¿ÀÁÁÁÂÂÃÅÆÆÇÈÊÎÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÎÎÎÎÐÐÏÎÍÌÌÌËËËËËËÌÍÏÐÎÍÍÎÎÍÍÌËÊÉÈÈÉÉÉÈÈÇÇÇÇÇÈÈÉÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÖÖÖÖ××ØÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØØÙØØØ××ÖÖÕÕÕÕsssttttttttttttttuuwxxxxxxxyyyyzzzzzz{|}}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ„†‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘’’““”•••••••––——˜˜™™™ššš›› ¢¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¥¦¦§§¨¨¨¨¨¨¨¨©©©ª¬­®°²²³³´´´´µµ¶·¹¹¹º»»¼½½¾¾¾¿¿ÁÁÁÁÂÃÄÅÆÆÇÉËÏÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÍÍÍÌÌÍÎÎÌËËËÊÉÊÊÊËËËÍÎÍÌÌÌÌÌÌËËËÊÉÈÈÉÉÉÈÇÇÆÆÇÇÇÇÈËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÒÒÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖ××ØØÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙÙØ×××××ØØ×ÖÖÕÕÕÕsssssttttstttttttuvxxxxxxxyyyyzzzzz{{|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ…ˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘‘’’“””••••••••––—˜˜˜™™™ššššœŸ¡¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¦§§¨¨¨¨¨¨¨¨¨¨¨©ª«­®®°²²³³´´´´µµ¶¸¹¹¹º»»¼½½½¾¾¿ÀÁÁÁÁÂÃÄÆÆÆÇÉÌÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÌÌÌËËËÌÌÌÊÉÉÈÈÉÉÉÊÊËÍÌËËÊËËÊÊÊÉÉÉÉÈÈÉÉÉÈÇÇÆÆÆÇÇÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖ××ØÙÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØØ×ÖÖÖ×××××ÖÖÕÕÕÕsssssssssssssttttuvxxxxxxyyyyyzzz{{{|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ„‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘‘’’“””•••••••••–——˜™™™™šššš›œž ¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¥¥¦§§¨¨¨¨¨¨¨¨¨¨¨©ªª¬­®¯°²²³´´´´µµ¶¸¹¹¹º»»»¼½½¾¾¿ÀÁÁÁÁÂÃÄÅÆÇÈÉÌÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÍÌËËÊÊÊÊÊÉÈÈÈÈÈÈÉÉËËËËÊÉÉÊÉÉÉÉÈÈÈÉÉÈÈÉÈÇÇÆÆÆÆÆÆÇÇÉÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖØØÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙÙØ×ÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕsssssssssssssstttuvxxxxxxyyyyzzzz{{||}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒ„…ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘‘‘’’“””••••••••–––—˜™™™™šššš›œžŸ¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¥¥¦¦§§¨¨¨¨¨¨¨¨¨©©ªª«¬®®¯±²³³´´´µµ·¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÂÂÃÄÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÌËÊÉÊÊÊÉÈÈÇÇÇÈÈÉÉÊÊÊÊÉÈÈÈÈÈÈÈÇÇÇÇÈÉÉÉÈÇÇÆÆÆÆÆÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖ×ØØÚÚÚÚÚÚÚÚÛÚÚÚÛÚÚÛÛÛÚÚÙÙØ×ÖÖÕÕÕÕÕÕÕÕÖÖÖÖÕÕÕsssssssssssssstttuvxxxxxxyyyyzzzz{{|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ„„†ˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽ‘‘‘‘’““””••••••••–––—˜™™™™™šš››Ÿ¡¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¦¦¦§¨¨¨¨¨¨¨¨¨©©ªª«¬­®¯±²³³´´´µ¶·¹¹¹ºº»»¼¼½½¾¾¿ÀÁÁÁÂÃÄÅÆÆÇÈËÎÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÌÌËÊÊÊÊÊÉÈÇÇÇÇÈÈÉÊÊÊÊÈÈÈÈÇÇÇÈÇÇÇÇÇÇÈÉÉÈÇÇÆÆÆÆÆÆÆÇÈÊÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÐÐÑÐÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÖÖ×ØÙÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÛÚÚÙØ××ÖÖÕÕÕÔÔÕÕÕÕÕÖÕÕÕÕÔrrrrsssssssssstttuvxxxxxxyyyzzzz{{{|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒ‘‘‘’““”•••••••••––——˜™™™™™šš››Ÿ ¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¦¦§§¨¨¨¨¨¨¨¨©©©ªª«¬­®¯±²³³´´´µ¶·¹¹¹º»»»¼½½½¾¾¿ÀÁÁÁÂÃÄÆÆÆÇÉÌÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÊËËËÊÊÊÉÈÈÇÇÇÇÇÈÉÊÊÊÉÈÇÇÇÆÆÇÇÇÇÆÆÇÇÇÈÈÈÇÇÇÇÆÆÆÆÆÇÇÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÓÒÒÒÒÒÒÒÑÑÑÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÖ××ØÙÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚØ××ÖÖÖÕÕÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔqrrrsssssssssstttuvxxxxxxyyyzzzz{{||}~€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘‘’“””•••••••••–——˜˜™™™™ššš›œžŸ ¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨©©ªª««¬­®¯²²³³´´´µ·¸¹¹¹º»»»¼½½¾¾¾¿ÀÁÁÁÃÃÅÆÆÇÈÊÎÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÓÓÓÓÓÔÔÔÓÓÓÓÓÔÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÊÊÊÊËÌËÊÉÉÈÇÇÇÇÇÈÈÉÊÊÉÈÇÇÆÆÆÆÆÆÆÆÆÆÆÇÇÇÈÈÈÇÇÇÇÇÆÆÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÔÔÔÕÖ×ØØÚÚÚÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚØ××ÖÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓqrrrssrssssssstttuvwxxxxyyyzzzzz{{|}}~€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽ‘‘‘‘’“””••••••••––—˜˜™™™™ššš››Ÿ ¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨¨©©©©ª««¬­®¯°²³³´´´µ¶·¹¹¹ºº»»»¼½½¾¾¾¿ÁÁÁÂÂÄÆÆÆÇÉÌÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÓÓÓÓÓÔÔÔÔÓÓÓÔÔÔÓÓÓÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÊÊÊËËÌËÉÉÈÇÇÇÇÇÈÈÉÊÊÉÈÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÇÇÇÇÇÇÆÆÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕ×ØÙÚÚÙØÙÙÚÚÚÚÚÚÚÚÚÚÙØ×ÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓqqrrrrrrrssssstttuuvxxxxyyyzzzzz{{{|}~€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚ƒƒƒƒ…‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒ‘‘‘’’“”••••••––––—˜™™™™™šš››œŸ¡¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨©©©ªª«¬­®®¯°²³³´´´µµ·¸¹¹¹º»»»¼½½¾¾¿¿ÁÁÁÂÂÄÆÆÇÈÊÍÍÎÎÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÊÉÉÊÊÊËËÊÉÉÈÇÇÇÇÇÇÈÉÉÉÈÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÇÇÆÆÆÇÇÆÆÇÈÈÉÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÕÕÖØÙÙÙØØØØÙÙÚÚÚÚÚÚÙÙ××ÖÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÔÓÓÓÓÓÓqqqqqqqrrssssttttuuvxxxxyyyzzzzzzzz{|}~€€€€€€€€€€€€€€€‚‚‚‚‚ƒ„„„†‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒ‘‘‘’““”•••••––––—˜™™™™ššš›œœŸ¡¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©©ªª«¬­­®®¯±²³³´´´´µ·¸¹¹¹º»»»¼½¾¾¾¿ÀÁÁÁÂÂÃÅÆÇÉÉÊÊËÌÍÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËÉÉÉÉÉÊÉÉÉÉÈÇÇÆÇÇÇÇÈÉÈÈÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÇÆÆÆÇÇÇÇÇÇÇÈÊÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÕÖ×ÙØØ×××ØØØÙÙÙÙÙÙØ×ÖÖÕÕÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÒÒÒqqqqqqqqrrsssttttuuwxxxxyyyzzzzzzzz{{|}€€€€€€€€€€€€€€€€‚‚‚‚ƒ…†‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒ‘‘’’“”•••••–––—˜˜™™™™ššš›œœŸ ¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©©ªª«¬­­®®¯°²²³³´´´µµ·¹¹¹¹º»»»¼½½¾¿¿ÀÁÁÁÂÂÃÅÆÇÇÈÈÉÉÊËÍÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÒÒÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËÊÉÈÈÈÈÈÈÈÈÈÇÆÆÆÆÆÆÇÈÈÈÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÆÆÆÆÆÆÆÆÇÇÇÉÊÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÕÖÖ×××ÖÖ××ØØÙÙÙÙØØ×ÖÖÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒqqqqqqqqrrsssttttuvwxxxxyyyyzzzzzzzz{{|~~€€€€€€€€€€€€€‚‚‚ƒ„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒ‘‘’’“””••••–——˜˜™™™™™šššš›œžŸ ¡¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨©©©ªª«¬­­­®¯°²²²³³´´´µ¶·¸¹¹¹ºº»»¼½½¾¿ÀÀÁÁÁÁÂÃÅÆÆÆÇÇÇÈÉÊËÎÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍËÊÊÉÈÇÇÇÇÇÇÇÇÇÇÆÆÆÆÆÆÆÇÇÇÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÅÆÆÆÆÇÆÆÆÆÆÆÆÆÆÆÇÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÕÕÖÖÖÖÖÖÖÖ×ØØÙØØ×ÖÖÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑqqqqqqqqrssstttttuvwxxxxxyyyyyyzzzzz{{{}~~€€€€€€€€‚‚ƒ„…ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽ‘‘’’“””••••––—˜˜˜™™™™™šššš››œžŸ¡¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¥¥¦¦¨¨¨¨¨©ªª««¬­­®®®¯²²³³³´´´´µ¶·¹¹¹¹ºº»»¼½¾¾¿ÀÁÁÁÁÁÂÃÄÅÆÆÆÆÇÈÉÉËÍÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËÊÉÉÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÆÆÆÆÆÆÆÅÅÅÆÆÆÆÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÈÊÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖ××ØØØ×ÖÖÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑppqqqqqqrssttttttuvxxxxxyyyyyyyyzzzzz{{|}~~€€€€€€€€‚ƒ„…ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽ‘‘’““”•••••–——˜˜™™™™™™ššššš››žŸ¡¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨©©««¬­­®®®¯°²³³³³´´´µµ¶¸¹¹¹ºº»»¼½½¾¾¿ÀÁÁÁÁÁÂÂÃÄÅÆÆÆÇÈÈÉËÌÏÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÔÓÓÓÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËÊÉÉÈÇÆÆÆÆÆÆÆÆÆÆÆÆÅÅÅÆÆÆÆÆÆÇÇÆÆÆÆÆÆÅÅÅÅÆÆÆÆÆÆÆÆÆÆÇÇÆÆÆÆÆÆÆÇÇÇÈÉÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖ×ÖÖÕÕÕÔÔÔÔÔÓÓÓÓÓÓÒÒÒÓÓÓÒÒÒÑÑÑÑÑÑÑppppqqqrssstttttuuwxxxxxxyyyyyyyyzzzzz{{|}}~~€€€€€€€‚ƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘’’’””••••––——˜˜™™™™™™™ššššš›œŸ ¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ª¬­­®®®¯°²²³³³´´´´µ¶·¹¹¹¹ºº»»¼½½¾¾¿ÀÁÁÁÁÁÁÂÃÄÄÅÆÆÇÇÈÈÊÌÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÍÌÌËÊÊÈÇÇÆÆÆÆÆÆÅÆÆÆÅÅÄÄÄÅÆÆÆÆÆÆÆÆÆÆÆÆÆÅÅÅÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐppppqqqrsstttttttuvxxxxxxxxyyyyyyzzzzzz{{||}}~~~€€€€€€€‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘’’“”•••••––—˜˜™™™™™™™™™šššš›œžŸ¡¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨¨©©ª¬­®®®¯°±²²³³³´´´µµ¶¸¹¹¹¹º»»»¼½½¾¾¿ÀÁÁÁÁÁÁÂÂÃÄÅÆÆÆÇÇÈÉËÌÏÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÓÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÍÎÎÏÐÐÐÐÐÐÐÐÐÐÐÏÍÌËËÊÉÈÇÆÆÆÆÅÅÄÄÄÅÅÄÄÄÄÄÄÅÅÆÆÆÆÆÆÆÆÆÆÆÅÅÅÅÅÆÆÆÆÆÆÆÆÆÆÇÆÆÆÆÆÆÆÆÇÇÈÈÉËÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐppppqqrssstttttttuuwxxxxxxxxyyyyyyzzzzz{{{||}}~~€€€€€€‚‚ƒ…‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘‘’““”••••–––—˜˜™™™™™™™™™™ššš›œœž  ¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¥¦§¨¨¨¨¨©©ª«¬­®®®¯°²²³³³´´´´µ¶·¹¹¹¹¹º»»¼½½½¾¾ÀÀÀÁÁÁÁÁÂÂÃÄÅÆÆÆÇÈÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÐÏÏÏÎÍÍÍÍÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÍÍÎÎÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÌËÊÉÈÇÇÆÆÅÅÄÄÄÄÄÄÃÃÃÃÃÄÅÄÅÅÆÆÆÆÆÆÆÆÆÆÅÅÅÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÇÈÉËÌÌÎÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐpppqqqrsssssstttttuwxxxxxxxxxyyyyyyzzzzz{{{|}}}}~~€€€€€€‚ƒ…‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘‘’“””••••––––—˜˜™™™™™™™™™™šš››œžŸ ¢¢¢¢¢¢¢££££¤¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨©©©ª«­­®¯¯°±²²³³³´´´´µ·¸¹¹¹ººº»»¼½½¾¾¿¿ÀÁÁÁÁÁÁÂÂÃÄÅÆÆÆÇÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÎÍÍÌÌÌÌÌÍÍÏÐÐÏÎÎÎÏÐÐÐÐÐÐÏÎÎÍÍÍÏÐÐÐÐÐÐÐÐÐÐÐÏÍÌËËÊÈÈÇÆÆÆÅÄÄÄÄÄÃÃÃÃÃÃÃÄÄÄÄÄÅÆÆÆÆÆÆÆÆÆÆÆÅÆÆÆÅÅÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÉÊÊËÌÍÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐppqqqrsssssssttttuvxxxxxxxxxxxyyyyyzzzzz{{{||}}}}~€€€€€‚ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’“””•••••––———˜™™™™™™™™™™ššš››œŸ ¡¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨©©©ª«¬­®®¯°±²²²³³³´´´µµ·¸¹¹ººº»»»½½¾¾¾¾¿¿ÁÁÁÁÁÂÂÂÃÅÆÆÆÇÇÈÉËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÎÍÌËÌÌÌÌÍÍÎÏÐÏÎÎÍÎÏÐÐÐÐÏÎÎÍÌÌÌÎÏÐÐÐÐÐÐÐÐÐÐÏÎÍÌËÊÉÈÇÆÆÆÅÄÄÄÄÄÃÃÃÃÃÃÃÃÄÄÄÄÅÅÆÆÆÆÆÆÆÆÆÆÆÆÆÅÅÅÄÅÆÆÅÆÆÆÆÆÆÆÆÆÆÆÇÇÈÉÊÊÊËÌÍÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÐÐÑÑÑÐÐÐÐÐÐpqqqrssssssssstttuvwxxxxxxxxxxxyyyyyzzzz{{{{{|}}~~€€€€€‚ƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘‘‘’“””•••••––——˜˜˜™™™™™™™šššššš›œžŸ¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¥¥¦¦¨¨¨¨¨©©©©ª¬­®®¯°±²²²²³³´´´´µ¶¸¹¹¹ºº»»»¼½½¾¾¾¾¿¿ÁÁÁÁÁÂÂÃÄÅÆÆÆÇÇÈÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÍÌÌËËËÌÌÌÍÍÎÏÎÎÎÎÍÎÏÐÐÐÏÎÎÍÌËËÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÏÏÌÊÈÇÇÆÆÆÅÄÄÄÄÄÃÃÃÃÃÃÃÃÄÄÄÄÄÅÆÆÅÅÅÆÆÆÆÆÆÆÆÅÄÄÄÄÅÆÅÆÆÆÆÆÆÆÆÆÆÆÇÇÈÉÉÊÊËÌÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐpqqrrsssssssssstttuvvwxxxxxxxxxyyyyyyzzzzz{{{{|}~~~~€€€€‚‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘‘‘‘’“”””••••––——˜˜˜™™™™™™™™ššššš››œžŸ ¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©©ªª¬­®¯°°±²²²³³³´´´´µ¶¸¹¹¹º»»»¼½½½¾¾¾¾¾¿ÀÁÁÁÁÂÂÃÃÄÅÆÆÇÇÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÌËÊÊÊËËÌÌÌÌÍÌÍÍÍÍÍÏÐÐÏÎÍÌÌËÊËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÈÇÆÆÆÅÄÄÄÃÄÃÃÃÃÃÃÃÃÄÄÄÄÄÅÅÄÄÅÄÄÅÆÆÆÆÆÆÅÄÄÄÄÄÄÅÅÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÉÊÊËËËÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐqqqrrrrrrrssssstttuuuvwxxxxxxxxxyyyyyyzzzzz{{{|}}~~~~~€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽ‘‘’’’“”””•••••–—˜˜˜˜˜™™™™™™™™šššš››œžŸ ¡¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©©ª«¬®¯¯°°±²²³³³³´´´µ¶·¹¹¹¹º»»»¼½½½¾¾¾¾¿¿ÀÁÁÁÁÁÂÂÃÃÄÅÆÆÇÇÈÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÌËÊÊÊÊÊÊÊÊÊËËÌËËÌÍÍÍÎÎÎÍÌÍÌÌËÊÊÌÍÍÏÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÇÆÆÆÅÅÄÄÃÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÃÄÃÄÄÄÅÆÆÆÆÆÅÅÄÃÃÃÃÄÄÅÅÆÆÆÆÆÆÆÆÆÆÆÇÇÇÈÉÊÊÊËËÌÎÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐqqqrrrqqrrsssstttttttuuwxxxxxxxxxyyyyyyzzzzz{{||}~~~~~~~~€€‚ƒ„ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘‘‘’““””••••••–—˜˜˜˜˜˜˜™™™™™™ššš›››œžŸ  ¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¥¥§¨¨¨¨¨¨©©©©ª«­®¯°°±²²²³³³´´´´µ·¹¹¹¹¹ºº»»¼½½½¾¾¾¾¿¿ÀÁÁÁÁÁÂÂÂÂÃÄÅÆÆÇÈÉÊÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËËÊÉÉÊÉÉÉÉÉÉÊÊËËËÌÌÌÌÌÌËËËÌÌËÊÊÊÌÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆÆÆÅÅÄÄÄÄÃÃÃÃÃÃÄÄÄÄÄÄÃÃÃÃÃÃÄÄÅÆÆÆÅÅÄÄÃÃÃÃÃÃÄÄÅÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÉÊÊÊËÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐqqqqqqqqqrrsssssttttttuvxxxxxxxxxyyyyyyzzzzz{{{|}~~~~~~~}~}}~~€€‚ƒ„ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘‘’’“””••••••–—˜˜˜˜˜˜˜˜™™™™™™šš››œœžŸŸ ¡¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¥¥¥¦¨¨¨¨¨¨©©©©ª«­®¯°±²²²²³³³´´´µ¶·¹¹¹¹ººº»»»½½½¾¾¾¾¿ÀÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÇÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÊÉÉÉÉÉÉÈÈÈÈÈÈÉÉÉÊÊÊÊÊËËÊÊÊÊËÊÊÊÊÊËÌÎÎÐÐÐÐÐÐÐÐÐÐÐÐËÉÈÇÆÆÆÆÆÅÄÄÄÄÃÃÃÃÃÃÄÄÄÄÃÃÃÃÃÃÂÃÃÄÅÅÅÄÄÃÃÃÃÃÃÃÃÃÃÃÄÅÅÆÆÆÆÆÆÆÆÆÆÇÇÇÈÈÉÊÊËÌÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ
\ No newline at end of file
diff --git a/plugins/impex/heightmap/tests/data/sources/test_512x512.r16 b/plugins/impex/heightmap/tests/data/sources/test_512x512.r16
new file mode 100644
index 0000000000..7d1c1de256
Binary files /dev/null and b/plugins/impex/heightmap/tests/data/sources/test_512x512.r16 differ
diff --git a/plugins/impex/heightmap/tests/data/sources/test_512x512.r8 b/plugins/impex/heightmap/tests/data/sources/test_512x512.r8
new file mode 100644
index 0000000000..df3f59a7e5
--- /dev/null
+++ b/plugins/impex/heightmap/tests/data/sources/test_512x512.r8
@@ -0,0 +1 @@
+©¨¨¨¨¨¨¨¨¨¨§¦¦¦¦§§§§¨¨¨¨¨¨§§¦¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤££££££¢¢¢ žœ››šš™™™™™™™™™™™˜—–••••””’‘‘‘ŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ†…ƒ‚‚‚‚‚‚ƒƒƒƒ„………………†……„ƒƒ‚€€€€€€€€€€€€€€€}}|{zzzzzzyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxwwvuutttttttttttttsssssrrrrrrqqpooonnnmlljiiihhhhhggfdcbaaa```___________^^^^^^^^^^^^^^^^^^^^^^^___^^^^^^^^^^^^^^^____``aaabbcegghhhhhhhhiijlmnnopqqrsssttuwxxxxyyyyyyyyyyyyyzzzzzzz{{{|||||}€€€ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘‘‘’’“”””••••••••–––—˜˜©©©¨¨¨¨¨¨¨¨¨¨§¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¥¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤£££££¢¢¢ žœœ›ššššš™™™™™™™˜—––••••”“’‘‘‘ŽŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡†…ƒ‚‚‚‚ƒƒƒƒƒƒ„„……†‡‡‡ˆ‡‡†„ƒ‚‚€€€€€€€€€€€€€~}|{zzzzzzyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxwwvuuttttttttttttttsssssrrrrrqqqppoonnmlljiiiihhhhggfdcbaaa````___________^^^^^^^^^^^^^^^^^^^^^____^^^^^^^^^^^^^^^____```aaabcefgghhhhhhhiijlmnnoppqqrssttuwxxxyyyyyyyyyyyyzzzzzzzzz{{{{{||}}~€€€ƒ„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘‘‘‘’’’“””••••••–––———˜˜™ªª©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¥¥¥¦¦¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤££££¢¢¢¢ žœ›››ššššš™™™™™˜—–••••”“’’‘‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡†…ƒ‚‚‚‚‚‚ƒƒ„„ƒ„„……†‡ˆ‹ŠŠŠ‰‡†„ƒ‚€€€€€€€€€€€€}|{zzzzzzzyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxwwvuuuttttttttttttttssssssrrsrrqqpoonnnmlkjjiihhhhggfdbbbaa````___________^^^^^^^^^^^^^^^^^^^______^^^^^^^^^^^^^^_____```aaabcdfgghhhhhiiiijllnnoopqqrssttuwxxxyyyyyyyyyyyyzzzzzzzzz{{{||||}}~€€€‚ƒ…‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘’’’““”•••••––——˜˜˜™™™ªªªª©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§§¦¦¦¦§¦¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤££££¢¢¢¢¢Ÿžœœ›››››šš™™™˜——–••••”“’’‘‘‘‘‘ŽŽŽŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡……ƒƒƒ‚‚‚ƒƒƒƒƒƒ„„…†‡ˆ‹‹‹‹‹Šˆ‡†„ƒ‚€€€€€€€€€€€~}|{zzzzzzzzyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxwwvvuuttttttsssssstttsssssssssrrqqponnmmlkjjiiihhhggfdcbbaaa``````````_____^^^^^^^^^^^^^^^_________^^^^^^^^^^^^^^_____``aaaabcdfgghhhhhiiijkllmnnopqqrssttuvxxxyyyyyyyyyyyzzzzzzzzzz{{{||||}}~€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘‘’’“”•••••––—˜˜™™™™™ª««««ª©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¨¨§§§¦¦¥¥¥¥¤¤¤¤¤¤¤¤¤££££¢¢¢¢¡ Ÿžœœœ››š™™™™˜——–••••””“’’’‘‘‘‘‘‘‘ŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡†…„„ƒƒƒƒ„ƒƒƒƒƒ„…†‡‰‹‹‹‹‹‹‹Š‰ˆ…ƒ‚‚‚€€€€€€€€€€€€~}|{{zzzzzzzyyyyyyyyyyyyyyyyxyyyyxxxxxxxxxxxxxxxxxwwvuttttttttsssssstttsssssssssrrqqonnnmllkjjjiihhhgfdccbbbaaa````````_____^^^^^^^^^^^^____________^^^^^^^^^^^^^_____```aaabbcefgghhhhiijjjkllmnnopqqrsssttvxxxyyzzzzyyyyzzzzzzzzzzz{{{|||}}}~€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’“””••••––—˜™™™™™™©ª¬¬­«ª©©©¨¨¨¨¨¨¨¨¨©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§§¦¦¥¥¥¥¤¤¤¤¤¤¤¤¤££££¢¢¢¢¢¢¡¡Ÿžœ›š™™™™˜˜–•••••””““’’‘‘‘‘‘‘ŽŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ†„„„„„„„ƒƒƒƒƒ„„…‡‰‹‹‹‹‹‹‹‹‹‹ˆ†„ƒƒ‚‚€€€€€€€€€€€~}||{{zzzzzzyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxvuuttttttttsssssssttssssssssssrqqponnmmlkkjjiihhhggeddcbbbaaaa``````_____^^^^^^^^^^^_____________^^^^^^^^^^^^^_____````aabccefgghhhhiijjjkllmnnopqqrsssttvxxxyyyzzzzyzzzzzzzzzzzzz{{{||}}}~€€€‚ƒ…‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’“””•••••–—˜™™™™™™©ª«­­¬«ªª©©©©¨¨¨¨¨©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§§¦¦¥¥¥¥¥¤¤¤¤¤¤¤¤¤£££££¢¢¢¢¢¢¢ Ÿžœšš™™™˜˜—–••••••””“’’’’‘‘‘‘‘‘‘‘ŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ†…„„„……„ƒƒƒƒ„„„†‡‰Š‹‹‹‹‹‹‹‹‹‰‡…„ƒƒ‚‚€€€€€~}}||{{zzzzzzyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxvutttttttttsssssssttssssssssssrrqponnmmllkkjihhhhggfedccbbbaaaaaa```_____^^^^^^^^^^____________^^^^^^^^^^^^^^^^____````aaabdefgghhhhiijjkkllmmnnoqqrrssttvxxxxyyzzzzzzzzzzzzzzzzzzz{{|}}}~~€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’“”•••••––—˜™™™™™©ª«¬­­¬¬«ªª©©©©©©©©©©©©©©©©¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¦¥¥¥¥¤¤¤¤¤¤¤¤¤¤£££££¢¢¢¢¢¢¢¢¡Ÿ›š™™™™˜˜––••••••””““’“’‘‘‘‘‘‘‘‘‘‘‘ŽŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡††……†…„„„„„„„„†ˆ‰ŠŠ‹‹‹‹‹‹‹‹‰ˆ†…„ƒ‚‚‚€€€€€€~}||{{{zzzzzzyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxwvutttttttttssssssssssssssssssssrqqonnnmlllkjihhhhgggfeddccbbbaaaa```______^^^^^^^______________^^^^^^^^^^^^^^^^____````aaacefgghhhhiiijjkklllmnnoqqrrssttuwxxxyyyzzzzzzzzzzzzzzzzzz{{{|}}~€€€‚ƒ†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽ‘’’””•••••–—˜˜™™™™©ªª«¬­­­¬¬««©©©©©©©©©©©©©©©©©¨¨¨¨¨¨¨¨¨¨¨§¦¦¦¥¥¥¥¤¤¤¤¤¤¤¤¤¤££££££¢¢¢¢¢¢¢¢Ÿœ›šš™™™˜—––•••••••””””“’’‘‘‘’’’’‘‘‘ŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‡‡††††…„„„„……†‡‰ŠŠŠ‹‹‹‹‹‹‹‹‹‰ˆ‡†„ƒƒ‚‚‚‚‚€€€€€€}}||{{{zzzzzzyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxwvuttttttttttsssssssssssssssssssrqqonnnmlllkjiihhhggggffeddccbbbaa```______^^^^^________________^^^^^^^^^^^^^^^____`````aabcegghhhhhiijjkkkllmmnnopqrsssttuwxxxyyyyzzzzzzzzzzzzz{{{{{{{|}}~€€€€‚ƒ…‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽ‘‘’“”•••••––—˜™™™™©ªª«¬­­®®®­«ª©©©©©©©©ªªªªª©©©©¨¨¨¨¨¨¨¨¨¨¨§¦¦¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤£££££££¢¢¢¢¢¢ žœ›šš™™™˜˜—–•••••••••””””“’’““““’’‘‘ŽŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡‡‡‡††……†…†‡ˆŠ‹ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹Š‡…„„ƒƒƒƒ‚€€€€€€~~}||{{{{zzzzzyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxwwvvvuutttttttttttssssssssssstsssssrqqonnnmllkjjiihhhhhggggffeedcbbaa```_______^^^_________________^^^^^^^^^^^^^^_____`````aabcfgghhhhiiijkkkkllmmnnopqrsssttuvxxxxyyyzzzzzzzzz{{z{{{{{{{||}~~€€€€€ƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽ‘‘’””•••••–—˜˜™™™©ªª«¬­®®®®®­«ªªªªªªªªª«««ªªªª©©©¨¨¨¨¨¨¨¨¨¨§¦¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤£££££££££¢¢¢¢ žœ››š™™™™˜—––•••••••••••”””””””“’’‘‘ŽŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŠŠ‰ˆˆˆ‡‡‡ˆ‡ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡……„ƒƒƒ‚€€€€€€€~}||{{{{zzzzzyyyyyyyyyyyyxxxxyxxxxxxxxxxwwxwwvvvvuutttttttttttttssssstssssssssssqqponnmlllkjjiihhhhhhgggggfedcbaa````___________________________^^^^^^^^^^^^______```aaaacefghhhhiiiijkkklllmnnopqqrsssttuvxxxxyyyyzzzzzzz{{{{{{{|||||}}~€€€€‚ƒ„‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽŽ‘‘’“”•••••–—˜˜™™™©ªª«¬­®®®®®­¬«««««««««¬¬¬««««ª©©©©¨¨¨¨¨¨¨¨§¦¦¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤£££££££££¢¢¢¢¡ž››š™™™™˜˜—––•••••••••••••••”“’’’‘ŽŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‰ŠŠŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‡……„ƒƒƒ‚€€€€€€€€~~}}||{{{zzzzyyyyyyyyyyyxxxyyxxxxxxxxxxxxwvvvvvuvuutuuttttttttttttttttsssssssssqqponnmmllkkjjiiihhhhhhhgggfecbaaa```_________________________^__^^^^^^^_________```aaaabcfgghhiiiiiijkklllmnnnopqqrsssttuvxxxxyyyyzzzzzzz{{{{{{||}}}}~~€€€€‚ƒ„‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽ‘‘’“”•••••––˜˜™™™©©ªª«¬­®®®®®­­¬­¬«««¬¬­­­­¬­¬¬«ª©©©¨¨¨¨¨¨¨¨¨¦¦¦¦¦¥¥¤¤¤¤¤¤¤¤¤¤¤£££££££££¢¢¢¢ žœ››šš™™™™˜˜—–––•••••••••••••”“’’’‘‘ŽŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ†…„„ƒƒ‚€€€€€€€€~~}}|||{{zzzzzyyyyyyyyxxxxyyyxxxxxxxxxxwwvvvvvuuvuuuuuuuttttttttttttttssssssssrqqonnmmlllkjjjiiiihhhhhhggfecbbaaaa``______________________^^^_^^^^^^^^^______`````aaabceggghhiiiiijjkkllmmnnnopqqrsstttuvxxxxyyyyzzzzzzz{{{|{||}~~~€€€ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’“”••••••–—˜™™™©©ªª««­­®®®®®®®­­­­­­­­­­­­­­­­«ªª©©©¨¨¨¨¨¨¨¨¨§§§¦¥¥¥¤¤¤¤¤¤¤¤¤¤££££££££££¢¢¢Ÿœ››šš™™™™˜˜˜——––––•••••••••””“’’’‘‘ŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰ˆ†…„ƒƒ‚€€€€€€€€~~}}}||{{zzzzyyyyyyyyyxyyyyyxxxxxxxxxxwwwwwvvvvvvvvvvuuttttttttttttsssssssssrqqponnmlllkkkkjjjjiiihhhhggedcbbaaaa````____________________^___^^^^^^^_______````aaabcdfggghhiiiiijjklllmnnnooqqqrsstttuvxxxyyyyyzzzzzzz{{{{|||}~€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’’“”••••••–—˜™™™©©ªª«¬¬­®®®¯¯®®®®®®®®®®®®®®®®®®­¬«ª©©©¨¨¨¨¨¨¨¨¨¨§§¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££¢¢¢ žœ››ššš™™™™˜˜˜˜˜—––••••••••••””“’’‘‘‘ŽŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰ˆ†…„ƒ‚€€€€€€€€~~}}|{{zzzzzyyyyyyyyyyyyyxxxxxxxxxxxxxxwwwwwwwxxxwvuuttttttttttttsssssssssqqqonnnmlllllllkkkjiiiihhggfedccbbaaa````__________``________________________````aaabbdfggghhhiiiiijjklllmnnnopqqrsssttuuwxxxyyyyzzzzzzz{{{{{{|||}€€€€‚ƒ†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’’“”••••••––—˜™™™©ª««¬¬¬­®®®¯°°°¯¯¯¯¯¯®®®®®®®®¯®®­¬«ªª©©©©¨¨¨¨¨¨¨§¦¦¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££¢¢¢ Ÿœ›šššš™™™™™˜˜˜—–––•••••••••”””“’’‘‘‘ŽŽŽŽŽŽŽŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡†…ƒ‚€€€€€€€€€~~}|{{zzzzzyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxvuuutttttttttttsssssssssrqqponnmmmmmmlllllkjjjjihhgggfdccbaaa```````______``_______________________```aaaaabbcefggghhhiiiiijklllmmnnnopqrsssttuuwxxxxyyyyzzzzzzzz{{{{{{||}~€€€€€€€€‚ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’’“”•••••••–—˜™™™™ªª«­­­­®®®¯°°±±±±°°°°¯¯¯¯®®®¯°¯®®­¬««ªª©©©©¨¨¨¨¨¨§¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££¢¢¢¢¡Ÿžœ›››šš™™™™™™˜˜˜—––––••••••••””“’’’’‘‘ŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆˆ†„ƒ‚‚‚€€€€€€€€€€€~}||{{zzzzyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxwvvuuuuutttttttsssssssssrqqponnnnnnnmmmmlllkkkjihhgggfdcbbaaaaa`````````````____________________````aaaaabbcdffggghhiiiiijjllllmnnnopqqrsssttuwxxxxyyyyyzzzzzzzz{{{{{{||}~€€€€€€€€€€€‚„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’’““”•••••••–—˜˜™™™™ªª«­®®®®®¯¯±²²²²²²²±±°±°¯¯¯¯°°°¯®®®­¬««ªªª©©¨¨¨¨¨§§¦¦¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££¢¢¢¢¡Ÿœœ››šššš™™™™™™˜˜˜——–––•••••••”””“““’’‘‘ŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰ˆ…„ƒ‚ƒ‚€€€€€€€€€€€€~}|{{zzzzyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxwvuuuuuuutttttttttttssssrqqoonnnnnnnmmmmllllkjiihhggfedccbaaaaaa``````````___________________`````aaaaabbcdefggghhhiiijjjllllmmnnopqqrssttttuxxxxxyyyyyyyzzzzzz{{{{||||}€€€€€€€€€€‚ƒ…†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’“””•••••••–—˜˜™™™™™ª«¬­®®®¯¯¯°±²²²²²²²²²²²²±°°°±²±°¯¯®­­¬««««ª©©¨¨¨¨¨§§¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤£££££¢¢¢¢¢ žœ›››šššš™™™™™™™˜˜˜——–––••••••””””””“’’‘ŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡†„„„ƒ‚€€€€€€€€€~}|{{zzzzyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxwvvuuuuuuttttttttttssssssqqpoooonnnnnnnmmlllkjiihhgggfedcbaaaaaaa````````_________________```````aaaabbccdeefggghhiiijjklllllmnnopqqrssstttuvxxxxxyyyyyyyyzzzzz{{{|||||}~€€€€€€€€€‚‚„…†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’““”•••••••–—˜˜˜™™™™™««¬­®¯¯¯¯°°²²²²³³²²²²²²²²²²²²²²²±°¯®®­­¬¬«ªª©¨¨¨¨¨¨¨§¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤££££££¢¢¢¢ žœœ››››ššššš™™™™™™˜˜—––––••••••••”••””“’‘‘ŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰ˆ††…„ƒ‚‚€€€€€€~~~}}|{{zzzzzyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxwvvuvuvvuuttttttttsssssssrqqqppoonnnnnnnmllljiiihhhggffdcbbaaaaaaaa`````_______________```````aaaaaabbcddeffggghhhiijjklllllmmnnoqqrssstttuvwxxxxxyyyyyyyzzzzz{{{{|||||}€€€€€€€€€‚ƒ„†‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’“””•••••••–—˜˜˜˜˜˜˜˜¬­­®®¯°°°±±²²³³³³³²²²²²³³²²²²²²²²²°¯®®­­­¬«ªª©¨¨¨¨¨¨¨§¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤£££££££¢¢¢¢ žœœœœœœ››ššššš™™™™™™˜˜—––––••••••••••••”“’’‘‘‘‘ŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡‡…„ƒ‚‚‚€€€€€€~}}}}|{{zzzzzzyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxwvvvvvvvvuutttttttsssssssrrqqqqpooonnnnnmmlkjiiihhhhgfedcbbaaaaaaaa`````_____________`````aaaaaaaaaabcdeffgggghhhhijjkllllmmmnnopqrrsssttuvwxxxxxxyyyyyyyzzzzz{{{||}}}}}€€€€€‚‚ƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’“””•••••••––—˜˜˜˜˜˜˜˜®®®®¯°±±²²²²²³³³³³³³³³³³³³³³³³³³²²²°¯®®®­­¬«ªª©¨¨¨¨¨¨¨¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤£££££££¢¢¢¢ œœœœœœ›šššššš™™™™™™˜˜—–––––••••••••••••”“’’‘‘ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡†…ƒƒƒƒ‚€€€€€€~}}}}|{{{zzzzzzzyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxwvvvvvwwvutttttttssssssssrrrqqqppooonnnnmlkjiiihhhhggedccbbaaaaaaaaa````___________````aaaaaaaaaaabbceffggghhhhhijjkllllmmnnnopqqrssstttuwxxxxxxxyyyyyyyzzzzz{{|}}~}}~~€€€€‚‚ƒ„…†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’“”•••••••–––———˜˜˜˜˜˜˜®¯¯¯±²²²²²²³³³³³³³³³³³³³³³³³³³³³³²²²°¯®®®®­¬«ªª©¨¨¨¨¨¨§¦¦¥¥¥¥¤¤¤¤¤¤¤££££££££¢¢¢¢¡žœ››šššš™™™™™™˜˜—–––––•••••••••••••””“’‘‘ŽŒŒŒŒŒŒ‹‹‹Œ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡‡…„ƒƒƒ‚€€€€€€€~}}}}||{{{zzzzzzzyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxwwvvvvwwwvvutttttttsssssssssrrqqqqpooonnnmllkjiihhhhggfedcbbbbaaaaaa`````__________```aaaaaaaaaaaabbcdefggghhhhiijkkllllmmnnnopqqrssstttuvxxxxxxxxyyyyyyyzzzzz{{|}~~€€€‚‚‚ƒƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘’“”•••••••––——˜———˜˜˜˜˜™°°±±²²²²²²³³³³³³³³³³´´´´´´´³³´³³³³³²²°¯¯¯®®­­««ª©©¨¨¨¨¨§¦¦¥¥¥¤¤¤¤¤¤¤£££££££££¢¢¢¢ žžžžœœ››ššš™™™™™™™˜˜——––––•••••••••••••”“’’‘‘ŽŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡…„ƒƒƒ‚‚€€€€€€€}}}}}||{{{{zzzzzzzyyyyyyyyyyyyyyyyyyyxxxxxxxxxwwvvwwwwwwvuutttttttsssssssssrrrqqpoonnnmmllkjiihhhhgggfddcbbbbbaaaaa````________````aaaaaaaaaabbbcdddfggghhhhijjkllllmmmnnnopqqrssstttuvwxxxxxxxxyyyyyyzzzzzz{{|}~€€€€‚ƒƒƒ„…†‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘‘’“””•••••••––—˜˜˜———˜˜˜˜™™²²²²²²²²²³³³³³³³³³³´´´´´´´´´´´´´³³³³²²±°¯®®®­¬««ª©©¨¨¨¨¨§¦¥¥¥¤¤¤¤¤¤¤££££££££££¢¢¢¡  žžžŸžœ››ššš™™™™™™™™˜˜˜˜———–––––••••••••””“’‘‘‘ŽŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡†…ƒ‚‚‚‚€€€€€€€~}}}}}||||{{zzzzzzyyyyyyzzyyyyyyyyyyyxxxxxxxxxxwwwwwwwxwwvutttttttsssssssssssrrqqponnnmmllkjihhhhhgggfedccbbbbbbaaa`````_____`````aaaaaaaaabbbccddeefggghhhijkkklllmmnnnnoppqqrssttttuvwxxxxxxxxyyyyyzzzzzzz{{|}~€€€€‚ƒ„…†‡ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’““”•••••••––——˜˜˜˜———˜˜˜˜™™²²²²²³²³³³³³´´³³´´´´´´´´´´´´´´´´´³³³²²²°¯¯®®®­­«ªªª©¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤££££££££££¢¢¢¢¢¡ŸŸŸŸŸœ›šššš™™™™™™™™™˜˜˜˜˜˜˜—––––••••••••”“’’‘‘‘ŽŽŽŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡†…ƒ‚‚‚‚‚€€€€€€€~~~}}}}}|{{zzzzzzzzzzzzzzzzzyyyyyyyyyxxxxxxxxxxwwxxxxxxxwuutttttttsssssssssssrqqpoonnmmllkjihhhhhgggfedccccbbbbaaaa```````````aaaaaaaabbbbbbcdeeffgggghhhiijllllmmmnnnnoopqqqsssttttuuwxxxxxxxyyyyyyzzzzzz{{||}~€€€€€€€‚ƒ…‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••••••––—˜˜™˜˜˜˜˜˜˜˜˜™™™²²²²³³³³³³³´´´´´´´´´´´´´´´´´´´´´´´³³³²²±°¯¯®®®­­«««ª©©¨¨¨¨§¥¥¤¤¤¤¤¤¤£££££££££££¢¢¢¢¢¢   Ÿžœ›ššš™™™™™™™™™™™™™˜™˜˜˜—––––•••••••””“’’‘‘‘‘ŽŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ††…ƒ‚‚‚‚‚‚€€€€€€~}}~}||{{zzzzzzzzzzzzzzzzzzzyyyyyyyxxxxxxxxxxxxxxxxxxwuuttttttttsssssssssssrqqponnmmlljiiihhhhgggfeddccbbbbbaaaa`````````aaaaabbbbbbbbbccdefgggggghhhhijjlllmmmnnnnoopqqqrsssttttuuvxxxxxxyyyyyyzzzzzzz{{|}~€€€€€€‚ƒ„‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“”•••••••––——˜˜™™™˜˜˜˜˜˜˜™™™™³³³³³³³³³³´´´´´´´´´´´´´´µµµµ´´´´´´´³³³²²²±°¯®®®­­¬¬«ª©©¨¨¨¨¦¥¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢¡ Ÿžžœ›šš™™™™™™™™™™™™™™™™˜˜˜—––––•••••••””““’’’‘‘ŽŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡†…„ƒ‚‚‚‚‚‚‚€€€€€€~}|||{{{zzzzzzzzzzzzzzzzzzyyyyyyyxxxxxxxxxxxxxxxxxwvuttttttttttssttsssssrqqponnnmllkjihhhhggggfeedccbbbbaaaaaaaa```aaaaabbccccbbccdcdefggghhhhhhhiijjkllmmmnnnnoopqqqrsssttttttuvxxxxxyyyyyyyzzzzzz{{||}~€€€€€‚‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘’““”•••••••–—˜˜™™™™™™™˜˜˜˜™™™™™³³³³³³³³³´´´´´´´´´´´´´´µµµµµµµ´´´´´´´³³²²²±°°¯¯®®®­­¬«ª©¨¨¨§¥¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢ Ÿžžœ››šš™™™™™™™š™™™™™™™˜˜˜˜—––––•••••••••””““’’’‘ŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ‡†…ƒƒƒƒ‚‚‚‚‚€€€€€€€€€~}|||||{{{zzzzzzzzzzzzzzzzzzyyyyyyyxxxxxxxxxxxxxxxwwvuttttttttttttttsssssrqqonnnmllkjiihhhgggggffedcbbbaaaaaaaaaaaaaaabbccdddddddefffggghhhhhhhiiijjjkllmmnnnnoppqqqqrssstttttuuvxxxxxxyyyyzzzzzzz{{||}~€€€€€‚‚„…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”””•••••••–—˜™™™™™™™™˜˜˜™™™™™˜³³³³´´´´´´´´´´´´´´´´´´µµµ¶¶¶¶µµµ´´´´´´³³³²²²±°¯¯®®®®­­¬©©¨¨¨¦¥¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢ Ÿžœ›šššš™™™™šššš™™™™™™˜˜˜˜˜——––••••••••••”””“’’‘‘‘‘ŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰ˆ†„ƒƒƒƒƒƒƒƒƒ‚‚€€€€€€€€€€~}||||||||{{{zz{zzzzzzzzzzzzzyyyyyyyxxxxxxxxxxxxxxxwvuuuuuuuttttttttsssssrqqponnmlllkjiihhhgggggffdccbbaaaaabaaaaaaabbbddeeeeffffffggghhhhiiiiiiiijjkllmmmnnnopqqqqrrssssttttuuvwxxxxxyyyyzzzzzzzz{{|~~€€€€€€‚ƒ„…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘’““”••••••••––˜˜™™™™™™™™™˜™™™™™˜˜´´´´´´´´´´´´´´´´´´´´´´µµµ¶¶¶¶¶¶µµµ´´´´´³³³²²²±°°¯¯®®®­¬ª©¨¨¨§¥¤¤¤¤¤¤£££££££££££££¢¢¢¢¢ žžœ››ššš™™™šššššš™™™™™™™™˜˜˜—––••••••••••••””“““’’‘‘‘‘‘ŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‰ˆ…„ƒ‚‚‚ƒƒƒ„ƒƒ‚€€€€€€€€€~}|||||}}||{{{{{zzzzzzzzzzzzzzyyyyyyyxxxxxxxxxxxxxxxwvuuuuuuuttttttttssssrqqponnmmllkjiihhhgggggffedcbbaaaabbbbbbbbbbcdeffffffgggggghhhhiijjiiiiiijjkllmmmnnoopqqqrrsssssttttuuvwxxxxxyyyzzzzzzzzz{{|}€€€€€‚‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’”””••••••••––—˜™™™™™™™™™™™™™™™˜˜—´´´´´´´´´´´´´´´´´´´´´µµµµ¶¶¶··¶¶µµµ´´´´³³³³²²±±°°¯¯®®­«ª©¨¨¨§¦¥¤¤¤¤¤¤££££££££££££¢¢¢¢¢¡ŸŸžœœ››ššššššššš™šš™™™™™™™™™˜——––•••••••••••••””””“’’’‘‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆˆˆ‡†„ƒƒƒƒƒ„ƒƒ„ƒ‚‚€€€€€€€}}||||}}}}|||{{{{{{{zzzzzzzzzyyyyyyyyyxxxxxxxxxxxxxxwvvuuuuuuuttttttsssssqqponnnnmlkjjihhhhggggggfecbbaaaabbbccbbbccdfggggggggggggghhhhiijiiiiiiiijkllmmmnnoopqqrrssssssttttuuvwxxxxxyyyzzzzzzzzz{{|~€€€€€€‚‚ƒ„„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘“”••••••••••––—˜˜™™™™™™™™™™™™™˜˜˜—´´´´´´´´´µ´´´´´´´´´µµµµµ¶¶¶··¸··¶¶µµ´´´´³³³²²²±±°°¯¯®­«ªª©¨¨¨¦¥¤¤¤¤¤¤¤£££££££££££¢¢¢¢¢¢¡ Ÿžœœœ››ššššššš™™™š™™™™™™™™™˜˜—––••••••••••••••••••”“““’’‘‘‘‘‘‘‘‘ŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡‡††……„ƒ„„„ƒƒƒ„„ƒƒ‚‚€€€€~}|||}}}~~~}|||{{{{{{zzzzzzzzzyyyyyyyyyyyxxxxxxxxxxxwvvuuuuuvuuttttttssssrqqponnnmlljjihhhhhgggggfeccbbaabbbccccccdefgggggggggghhhhhhhijjjiiiihiiijkllmnnnnopqqqrsssssssttttuuwxxxxxxyyyzzzzzzzzz{{|~€€€€€‚ƒƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’””•••••••••–——˜˜˜˜˜˜˜™™™™™™™™˜˜˜—–´´´´´´´µµµ´´´´´´´´´µµµµµ¶¶¶··¸¸¸··¶µµ´´´´³³³²²²²±±°¯®­«ªª©¨¨¨§¥¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢¡Ÿžžœœ›››ššššš™™™™ššš™™™™™™™˜—––––––•••••••••••••••••””“’’’’’’‘‘ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ‡†‡†…………„„„ƒƒƒ„„„„ƒ‚‚‚‚€€€€€~}}}}}~~}}|||||{{{{zzzzzzzzyyyyyyyyyyyyxxxxxxxxxxwvvvvvvvvuutttttsssssrqqponnmllkjiihhhhhggggfedccbbbbbcccdddeffgggggggghhhhhhhhiijjjjiiiihiiijkllmnnnnopqqrssssssstttttuvwxxxxxxyyyyzzzzzzzz{|}€€€‚‚ƒ„…‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’”•••••••••••–—˜˜˜˜˜˜˜˜˜˜™™™˜˜˜˜˜˜—–´´´´´µµµ¶¶µµ´´´´´´µµµ¶¶¶¶¶¶·¸¸¸¹¹¹¸·¶µ´´´´³³³³²²²²±¯®­¬«ª©¨¨¨§¥¥¤¤¤¤¤¤¤£££££££££££¢¢¢¢¢¢¢¡ ŸŸžœœ›››ššššššššššš™™™™™™˜˜—————––•••••••••••••••••••”””“””“’‘ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡††………„„„„„ƒƒƒ„……„„ƒƒƒƒ‚€€€€€€~~~~~~~}}}|||{{{z{{zzzzzzzzzyyyyyyyyxxxxxxxxxwwwwwwwvvuttttttssssrrqqonnmmllkjiihhhhhhhggffedcccccddeeeffgggghhhhhhhhhhhiijjjkkjjjiiiiiijjkllmnnoopqqqrssssssttttttuwxxxxxxyyyyyzzzzzzz{{|~€€€‚‚ƒƒ…†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’”••••••••••––—˜˜˜˜˜˜˜˜˜˜˜˜™˜˜˜˜˜˜—––´´´µµ¶¶¶·¶¶µµµ´´´µµµµ¶··¶··¸¸¹¹¹¹¹¹¹·¶µ´´´´´³³³³²²²¯®­¬«ª©©¨¨¨¦¥¥¤¤¤¤¤¤£££££££££££££¢¢¢¢¢¢¢¢ Ÿžœ››››šššššššššššš™™™™™˜˜˜˜˜˜—––••••••••••••••••••••••••”“’‘‘ŽŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡†………„„„„„„„ƒƒ„…†††…„„ƒƒ‚€€€€€€€€~~~}}|{{{{{{zzzzzzzzzzzyyyyyyxxxxxxxxxxxxxwwvvvuttttttssssrqqponnmmllkjiiihhhhhgggffedddddeeffggggggghhhhhhhiiiiijkklkkkkjjiiiiijjkllmnnopqqqrsssssstttttuuvxxxxxxxyyyyyzzzzzz{{|}€€€‚‚ƒ„…†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’”•••••••••––—˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜—––•µµµµ¶···¸·¶µµµµµµµµµ¶·¸····¸¹¹¹¹¹¹¹¹¹·¶µ´´´´´³³³³²²°®®¬«ª©©©¨¨§¦¥¥¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢¢¢¡ ŸŸŸžœœ›››ššššš››šššš™™™™™™™˜˜˜™˜—–––•••••–––––––••••••••••••”“’‘‘ŽŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡†………„„„ƒ„„„„…†‡‡‡‡†…„ƒ‚€€€€€€€€€€€€€€€€€~}}|||{{{zzzzzzzzzyyyyyyxxxxxxxxxxxxxxxwwvvutttttssssrqqponnnmmllkkjjiihhhhggggfeeeffffgggggggghhhhiiijiiijjkllllkkkkjjjjiiijkllmnnopqqrsssssssttttuuvxxxxxxxyyyyyyyzzzzz{|}€€€€‚ƒƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘’“••••••••–––—˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜——–••¶¶¶·¸¸¸¹¸·¶¶µ¶µµµµµ¶¶¸¸¸¸¸¹¹¹¹¹¹¹¹¹¹¹¹·¶µ´´´´´´³³²²±¯®­«ªª©©¨¨¨¨¦¥¤¤¤¤¤¤¤¤££££££££££¢¢¢¢¢¢¢¢¢¢¢¡¡ žœ››››››››››››šš™™™™™™™™™™˜˜˜—–––––––——————–––•–••••••••”““’‘ŽŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ†……………„„„………‡ˆ‰ŠŠŠ‡…ƒƒ‚€€€€€€€€€€€€€€€€€€€€€€€~}||{{{zzzzzzzzyyyyyyyxxxxxxxxxxxxxxwwvvutttttssssrqqponnnnmmlllkjjihhhhhggggffgggggghggggghhhiijjkkkkkllllllkkkkjjkjjjjklllmnnopqqrsssssttttttuvxxxxxxxyyyyyyyzzzzzz{|~€€€€‚ƒƒ…†‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘“”••••••–––––˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜—––••··¹¹¹¹¹¹¹¸··¶¶¶µµ¶¶¶·¹¹¹¹¹¹¹¹¹¹¹¹ººº¹¹¹·¶µµ´´´´³³²²±¯®­¬«ª©©©¨¨¨§¥¥¤¤¤¤¤¤¤¤£££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢ žœ›››››œœœœ››šš™™™™™™™™™™™™˜˜˜———˜˜˜˜˜˜˜˜——–––––––••••••”“‘‘ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡††††††……††‡‰‹‹‹‹Š†„ƒ‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€~}}}|{{zzzzzzzzyyyyyyyxxxxxxxxxxxxxwwwvuttttttssssrqqponnnnmmmllljiiihhhhgggggggggghhhhgghhhhijkklllllllllllkkjjkkkkkkklllmmnnoqqqrsssssttttttuvxxxxxxxyyyyyyzzzzzz{|}€€€‚ƒ„„†‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘’”•••••–––––——˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜——–––•¹¹¹¹¹¹¹¹¹¹¸¸¸··¶···¸¹¹¹¹¹¹¹¹¹¹ººººººº¹¹¹¸·¶¶µ´´´³³²²°¯®­««ª©©©¨¨¨¦¥¥¤¤¤¤¤¤¤¤££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡Ÿžœœœœžž››ššš™™™™™™™™™™™™™˜˜™™™™™™™™˜˜˜˜—————––••••••”“’‘‘ŽŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆˆˆˆˆ‡‡‡‡ˆ‰‹‹‹‹‹‰…„ƒ‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€~}}|{{{zzzzzzzzyyyyyxxxxxxxxxxxxxxxwvuttttttsssrqqqpooonnnmmllkjiiihhhhhggghhhhhhhhhhhhhhiijklllmlmmllllllkkjkkllllllmmmnnnoqqrrssssstttttuuwxxxxxxxxyyyzzzzzzzz{}~€€€‚ƒ„…†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”•••––––———˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜——–––¹¹¹¹¹¹º¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹¹¹¹ºººººº»»»»ººº¹¹¹¹¸¶µ´´´³²²±°¯®­««ª©©¨¨¨¨¦¥¥¤¤¤¤¤¤¤£££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡ ŸžžžŸŸŸŸŸžœ››ššššššššššš™™™™™™™™™™™™™™™™˜˜˜˜˜˜——–••••••”“’‘‘ŽŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‰‰Š‹‹‹‹‹‹‹‰…„ƒ‚‚‚‚‚€€€€€€€€€€€€€€€€€€€}||{{{zzzzzzzzyyyyxxxxxxxxxxxxxxwvvuutttttsssrrqqqpponnnmmllkjjiihhhhhhhhhhhihhhhhhhiiijklllmmmmmmmllllllllllllmmmnnnnnopqrrrsssstttttuuvxxxxxxxxxyyzzzzzzzz{|}€€€ƒ„††ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’”••••–––——˜˜˜™˜™™™™™™™™™™˜˜˜˜˜˜˜˜˜˜˜˜˜—––¹ººººººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººººº»»»»»»»»»»»ººº¹¹·µ´´´³³²²±°®®­¬«ª©©¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤£££££££¢¢¢¢¢£¢¢¢¢¢¢¢¢¢¢¢¢¡  ¡¡¡¢¡ Ÿœ››ššššššššššššššššššššš™™™™™™™™™˜˜˜—––••••••”’’‘ŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰†„ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€~}|||{{{zzzzzzyyyyyxxxxxxxxxxxxwwwvvutttttsssrrqqqqponnnmlllkjjiiihhhhhhhiiiiiihhhiijjklllmmmmmmmmmmmllllllllmmnnnnnoopqqrrsssssttttuuvwxxxxxxxxyyyyzzzzz{{{|~€€€€‚„†ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’”•••••–——˜˜˜™™™™™™™™™™™™™™™™™™™™™™˜˜˜˜˜——–ººº»»»»ººº¹¹¹¹¹¹¹¹¹¹¹ºººº»»»»»»»»»¼¼»»»»»ºº¹¹¶µ´´´³³²²°¯®®­««ª©¨¨¨¨¨¦¥¥¤¤¤¤¤¤¤¤¤£££££££¢¢¢£££¢¢£¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡Ÿžœœ›››››››››››››œœ››ššššššš™™™™™™™˜˜˜—––••••••”“’‘‘ŽŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡„ƒ‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒ„„„„„„„„ƒƒ‚‚€€€€}}|||{{{{{zzzyyyyyxxxxxxxxxxxxwwwwvuttttsssssrqqqponnnmlllllkjjjiihhhiiiiiiiiiiiijjlllmmmmmmnnmmmmmmmllllllmmnnnnoopqqqrssssstttttuvwxxxxxxxxyyyyyzzzz{{{|}€€€‚ƒ…ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘’“”•••••–——˜˜˜™™™™™™™™™™™™™™™™™™™™™™™˜˜™™˜˜——»»»»»»»»ºººº¹¹ººººººººº»»»»»»»¼¼¼¼½¼¼¼»»»»º¹¹¸¶µ´´´³³²²°¯®®­¬ª©¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡ Ÿžœœœœžžœ››››šššššš™™™™™˜˜˜–––••••••”“‘‘ŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡…ƒ‚‚‚ƒƒƒ„ƒƒƒƒ‚ƒƒ„„ƒƒƒ„„„„„…††††ˆˆ‡‡†„ƒ‚€€€€€~~}}||{{{{zzzzyyyyyxxxxxxxxxxxwwwwvuttttssssrrqqpoonnmmmmmllkkkjiiiiiijjjkjjjjjjkllmmmmmmnnnnnnnmmmmmmmmmmmnnnnoppqqqrrssssstttttuvxxxxxxxxxyyyyyzzz{{{|}~€€€‚ƒ„‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘’””••••–—˜˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™™™™™™˜˜˜˜»»»»»»»»»»ºººººººººº»»»»»»»»»¼½½½½½½½½¼¼»»»º¹¹¸¶µ´´³³²²²°¯®®­«ª©¨¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤£££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡ŸžŸŸžžžžžžŸžŸŸ ¡¡Ÿœœœ››œ›››ššš™™™™˜˜——–––••••”“’‘‘ŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‡…ƒ‚‚ƒƒƒƒ„……„„„„…†…………………††‡ˆ‰ˆ‰Š‹‹Š‰‡…ƒ‚€€€€€€~}}||{{{zzzzyyyyyxxxxxxxxxxxxxwwuuttttssssrqqqponnnnnmmlllllkkjjjjjkklllkkkllllmmmmnnnnnnnnnnnnmmmmmmmmnnnnopqqqqrrsssssstttttuvxxxxxxxyyyyyyyzzz{{|}~€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘“””••••–—˜˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™˜˜˜¼¼¼¼¼»»»»»»»ººººº»»»»»»»»»»¼¼½½½½½½½½½½¼¼»»ºº¹¹·µµ´´³³²²²°¯®®¬ª©¨¨¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤£££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡    ŸŸ ¡    ¡¡¡¢¢¢¡Ÿžœœœœœœœ›ššš™™™™˜˜——–––•••”“’‘‘ŽŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š†„ƒƒ‚ƒƒƒƒ„…†…………†††††††††‡ˆ‰ŠŠ‰Š‹‹‹‹‹‰†„ƒ‚€€€€€~}}|||{{zzzyyyyyyxxxxxxxxxxxxwwvuuttttsssrrqqpponnnnnmlllllllkjjjjkllllllllllmmmnnnnnnnnnnnnnmmmmmmmmmnnnnopqqqrrrrssssstttttuvxxxxxyyyyyyyyzzzz{|}~€€‚ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘’””•••••–—˜™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™˜½½½½¼¼¼¼»»»»»»»»»»»»»»¼¼¼¼¼¼½½½½½½½½½½½½¼»»»º¹¹¹·µ´´´³³³²²°¯®¬ª©©¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ Ÿžžžžœ›šš™™™™™˜˜˜—––••••”“’‘‘ŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š†„ƒƒƒƒƒƒ„…††††……††……††ˆˆˆ‰ŠŠ‹‹‹‹‹‹‹‹‹Š‡…„ƒ‚‚€€€€€€€~}}}|||{zzzyyyyyyyxxxxxxxxxxwvvvuuttttsssrqqqppoonnnmmlllllllkjjjklllllllllmmmnnnnnnnnnnnnnnnmmnnnmmmnnnnopqqqrrrrrssssstttuuwxxxxxyyyyyyyzzzz{{|~€€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’“””•••••–˜˜™™™™™™™™™™™™™™™™™™™™šššš™™™™™™™™™™™™™½½½½½½½¼»»»»»»»»»»»»¼¼½½½½½½½½½½½½½½½½½½½¼»»»º¹¹¸¶µ´´´³³²²²¯®­ª©©©¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤££££££££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢  ŸŸ  Ÿžœ››šš™™™™™˜˜˜—–••••”“’‘‘ŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰†…„„„ƒƒ„…†‡††…„…„……††‡ˆˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ‡†…ƒ‚‚€€€€€€~~~}}|{zzzzyyyyyyxxxxxxxxxxxvvvvuttttssssrqqqqpponnnmmlllllllkkkllllllllllmmnnnnnnnnnnnnnnmnnnnnnmmmnnnnopqqqqqrrrrsssstttuvwxxxxxyyyyyyzzzz{{|}~€€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“”””•••••–—˜™™™™™™™™™™™™™™™šš™šššššššš™™™™™™™™™™™¾¾¾½½½½¼¼»»»»»»»»»¼¼½½½½½½½½½½½½½½¾½½½½½¼¼»»»ºº¹¹·µ´´´´³³²²¯®­«©©©¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤££££££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡¡  ¡¢ žœ››šš™™™™™™˜˜—–••••”“’‘‘ŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡……„„„„…†‡††„„ƒƒƒ„„…†‡ˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ…„ƒ‚€€€€€€€}|{zzzyyyyyyyxxxxxxxxxxwvvvvuttttssssrqqqqponnnmmmmllllllkklllllmmlllmmnnnnnnnnnnnnnnmnnnnnmmmnnnnnopqqqqqqrrrrssstttuvxxxxxxyyyyyzzzzz{{{|~€€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’““””••••–—˜™™™™™™™™™™™™™™™™™šššššššššš™™™™™™™™™™¾¾¾¾½½½½¼¼¼¼¼¼¼¼¼¼¼½½½½½½½½½½½½½½¾¾½½½½¼¼¼»»»ºº¹¹¸¶µ´´´³³²²°®­«ª©©¨¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤££££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡¡¢¢¢ žœ››ššš™™™™™˜˜—–••••”“’‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡…„„„…‡‡‡…„„„ƒƒƒƒ„……†‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰†„ƒ‚‚€€€€€€€~|{{zzzyyyyyyyxxxxxxxxxxwvvvvuttttssssrrrqqonnnnmmmmmmlllkkllllmmmmlmmmnnnnnnnnnnnnnnnnnnnnmmmmnnnooqqqqqqqqqrrssssttuvxxxxxxyyyyzzzzzz{{{|}€€€€ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘’’’“””••••–—˜˜™™˜˜˜˜˜˜˜˜™™™™™™™šššššššš™™™™™™™™™™™¾¾¾¾¾½½½½½¼¼¼¼¼¼½½½½½¾¾¾¾¾¾½½½½½¾¾¾½½½¼¼¼¼»»»ººº¹¹¸¶µ´´´³³²°¯®¬ª©©¨¨¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤£££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡ žœ››ššš™™™™˜˜—–••••”“’‘‘‘‘ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡†………†ˆ‡…„ƒƒ‚‚‚‚‚ƒ„„…†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡…„ƒ‚€€€€€€€€€€}|{zzzzyyyyyyyxxxxxxxxxxwwvvvuttttsssssrqqponnnnmmmnmmlllllllmmmmmmmmnnnnnooooonnnnnnnnnnnmmmnnnnoppqqqqqqqqrrssssttuvxxxxxxyyyzzzzzzz{{||}€€€€ƒ„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’“””••••––˜˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™™™šššš™™™™™™™™™™™™™™¾¾¾¾¾¾¾½½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½¼¼¼»»»»»ºº¹¹¹·µ´´´³³²±¯®¬«ª©©©©¨¨¨¨¨¨¨¨§¦¦¥¥¤¤¤¤¤¤££££££££££££££££££££££££££££¢£¢¢¢¢£££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡ žœœ›šš™™™™™˜˜—–••••”““’‘‘‘‘ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ†††‡ˆˆ†…„ƒ‚‚‚‚ƒƒƒ„…‡ŠŠŠ‹‹‹‹‹‹‹‹‹‹‹‹Š‰‡…„ƒ‚‚€€€€€€€€€~|{{zzzzyyyyyyxxxxxxxxxxxxwwvvuttttsssssrqqponnnnnnnmmllllllmmmmmmmmnnnnnnnooooonnnnnnnnnnnmmmnnooppqqqqqqqrrrssstttuvxxxxxxyyyyzzzzzz{{|}~€€€€ƒ„…†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’“””•••••–———˜˜˜—˜˜˜———˜˜™™™™™™™™™™™™™™™™™™™™™™˜¾¾¾¾¾¾¾¾¾½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½¼¼¼»»»»»ºº¹¹¹¸¶µ´´´³²²°®­¬«ª©©©©©¨¨¨¨¨¨¨¨§§¦¥¤¤¤¤¤¤¤££££££££££££££££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ž››šš™™™™˜˜—––•••••”“’‘‘‘‘‘ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡ˆ‰‰ˆ†…„ƒƒ‚‚‚‚ƒƒ„†‡‰‰Š‹‹‹‹‹‹‹‹‹‹Š‰‡††…„ƒƒ‚‚€€€€€€€€€}|{zzzzyyyyyyyxxxxxxxxxxxxwwvvuttttssssrqqpoonnnnnnmmmllllmmmmmmmmmnnnnnnnnoooooonnnnnnnnnnmnnnoopqqqqqqqrrssssstttuvxxxxxxyyyyzzzz{{{|}~€€€€‚ƒ…†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’“”••••••–––———–———–––—˜˜™™™™™™™™™™™™™™™™™™™™˜˜¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾½½½¼¼¼»»»»ººº¹¹¹¹¸¶µ´´´³²±¯®­¬«ªª©©©©¨¨¨¨¨¨¨¨¨¦¥¤¤¤¤¤¤¤¤££££¤£££££££££££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡Ÿžœ›ššš™™™™˜˜—––•••••”“’’’‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‰‰‰ˆ†…„ƒ‚‚‚‚‚ƒƒ…†‡ˆ‰Š‹‹‹‹ŠŠ‹‹Š‰‡†……„„„ƒƒ‚‚‚€€€€€€€€€}|{{zzzzyyyyyyxxxxxxxxxxxxxwwvvuutttsssrqqqpponnnnnmmmllmmmmmnmmmmmnnnnnnnnooooooooonnnnnnnnnnnoopqqqqqqrrsssssstttuvxxxxxxyyyyyzz{{||}~€€€€€‚ƒ…†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’“”••••••••––––––––––––—˜˜˜˜˜˜™™™™™™™™™™™™™˜˜˜˜¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾½½¼¼»»»»»ººº¹¹¹¹¹·µ´´´³³²°¯®­­««ª©©©©¨¨¨¨¨¨¨¨¦¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢ œ›ššš™™™™˜˜—–••••••”“““’‘‘‘‘ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‰‡‡‡…„ƒ‚‚‚‚‚ƒ„…††‡ˆ‹‹‹‹ŠŠŠŠ‰‰†…„„„ƒƒ„„ƒƒ‚‚€€€€€€€€€~}|{zzzzzyyyyyyxxxxxxxxxxxxwvwvvutttsssrqqqqpponnnnmmmmmmmmmnnmmmmmmnnnnnnnooonoooooonnnnnnnnnnooppqqqqqrrsssssttttuwxxxxxxxyyyyzz{{|}€€€€€‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘’’“••••••••••••••••••••–––———˜˜˜™™™™™™™™™˜˜˜˜˜˜¿¿¿¿À¿¿¿¿¿¾¾¿¿¿¿ÀÀÀÀÀ¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾½½¼¼»»»»»»ºº¹¹¹¹¸·¶µ´´´³²²°¯®­­¬«ª©©©©©¨¨¨¨¨¨§¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££¤¤££££££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ››šš™™™™˜˜˜—–••••••””““’‘‘‘‘ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆˆ‡‡‡…„ƒ‚‚‚‚ƒƒ„„……†‡‰‹‹‰‰‰ˆˆˆ‡…„ƒƒƒƒƒƒ„„„ƒ‚€€€€€€€€€€~}|{zzzzzyyyyyyyxxxxxxxxxxxxwwwvvutttssrrqqqqqponnnnmmmmmmnnnnmmmmmmnnnnnnnnnnnnnnooonnnnnnnnnnnoppqqqqqrrsssstttttuwxxxxxxxyyyyzzz{}~€€€€€‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’“”•••••••••••••••••••••••––——˜˜˜˜˜™™˜˜˜˜˜˜˜˜—ÀÀÀÀÀÀÀÀÀ¿¿¿¿ÀÀÁÁÁÁÁÀÀÀÀÀ¿¿¿¿¾¾¾¾¾¾¾½½¼¼»»»»»ººº¹¹¹¹¸·¶µ´´´³³²²°¯®®­¬ªª©©©©©¨¨¨¨¨¨¦¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ÿ›ššš™™™™˜˜—––••••••”“““’‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡‡†……„ƒ‚‚‚‚ƒƒƒƒƒ„…†ˆŠ‰ˆˆˆˆ‡†…„ƒ‚‚‚‚ƒƒƒ„ƒƒ‚€€€€€€€€€€}}|{{zzzzyyyyyxxxxxxxxxxxxxxxwwwvutttsssrrqqqqponnnnnmmmnnnnnnnmmmmnnnnnnnnnnnnnnnnooonnnnnnnnnooopqqqqqrsssssttttuvwxxxxxxxyyyyzzz{|}€€€€ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘’’“””•••••••••••••••••••••••––––————˜˜˜˜˜———˜—ÁÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÁÁÀÀ¿¿¾¾¾¾¾¾¾½½¼»»»»»»ºº¹¹¹¹¸·¶¶µ´´´´³³²²°¯®®­¬«ªªª©©¨¨¨¨¨¨§¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ÿ›šš™™™™™˜˜—––•••••””““’’‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡†††……„ƒ‚‚‚‚‚ƒƒƒƒƒƒ„„…‡‡‡‡ˆ‡‡†„ƒƒ‚‚‚‚‚‚‚ƒƒƒ‚‚€€€€€€€€€}||{zzzzyyyyyyyxxxxxxxxxxxxxxxwwvuuttssssrqqqqpoonnnnnnnnnnnnnmmmnnnnnnnnnnnnnnnnnnnooonnnnnnnooopppqqqrrssssstttuuvwxxxxxxxyyyyzzz{|~€€€€€€‚„‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’’’“””••••”””””••••••••••••••••––––—————–—–—–ÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾½½¼¼»»»»ººº¹¹¹¹¸·¶¶µ´´´´´³³²²±¯®®­¬«ªª©©¨¨¨¨¨¨¨¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££¤¤££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢Ÿœšš™™™™˜˜—––••••••””“’’’‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡‡‡………„ƒƒ‚‚ƒƒƒƒƒƒƒ„„…††††††……„ƒ‚‚‚‚‚‚‚ƒƒ‚‚‚€€€€€€€€€~}|{zzzzyyyyyyyyyyxxxxxxxxxxxxwvuuttttssssrrqqqponnnnnnnnnnnnmmmnnnnnnnmnnnnnnnnnnnooooonnnnnnooopqqqqqrsssssttttuuvvwxxxxxxyyyzzzz{|~€€€€€€‚„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘‘‘’’“””””““““““””””””””••••••••••–––——––––––ÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¾¾¾¾¾½½½¼»»»»ººº¹¹¹¹¹··µµ´´´´´³³²²±¯®®­¬¬«ª©©¨¨¨¨¨¨¨¨¦¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¡Ÿœš™™™™™˜˜—––••••••””“’’’‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡‡††………„ƒƒƒƒƒƒƒƒ„ƒ„…†…†………„„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€~}{{{zzzzyyyyyyyyyyxxxxxxxxxxxwvuuttttssssssrqqponnnnnnnnnnnnmmnnnnnnmmmmnnnnnnnnnooonoonnnnnnooopqqqqqrrsssssttttuvvwwxxxxxyyyzzz{|~€€€€€€€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽ‘‘‘‘‘‘’“““’’’’’’’“’’’““”””••••••••••–––––––––ÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾½½½¼»»»»ºººº¹¹¹¹¸·¶µ´´´´´³³²²±°¯®­­­¬ª©©¨¨¨¨¨¨¨¨¨¦¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££££££££££¢¢££¢¢¢¢¢ žœ›š™™™™˜˜——––••••••”““’’’‘‘ŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡‡‡†††………„ƒƒƒƒ„„ƒƒ„„……………„„„„ƒ‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚€€€€€€€~}|{{zzzzyyyyyyyyyyyxxxxxxxxxwvvuutttttsssssrqqpoonnnnnonnnnnnnnnnnnmmmmmnnnnnnnnnnnnnnoonnnnoooopqqqqqrrsssssstttuuvwxxxxxxyyyzz{{}€€€€€€€€€€‚„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’’’‘‘‘‘‘‘‘‘‘‘‘‘’’’“””•••••••••––––––•–ÁÁÁÁÁÂÂÂÂÃÄÃÃÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾½½½¼»»»»»ººº¹¹¹¹¹·¶µµ´´´´³³³²²±°®®®­¬ªª©¨¨¨¨¨¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££££££££££££££¢¢¢¢Ÿœ›šš™™™˜˜˜—–––••••””““’’’‘‘ŽŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‡†††††…„„ƒƒƒ„„„ƒƒ„…………„„ƒƒƒƒƒ‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚€€€~|{{zzzzzyyyyyyyyyyyxxxxxxxxwvvuuttttttssssrrqqpooonnooonnnnnnnnnnnmmmmmnnnnnnnnnnnnnnoooooooooppqqqqrrrssssssttttuvvxxxxxxyyyzzz{}€€€€€€€€€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’‘‘‘‘‘‘‘‘‘‘‘’“““””••••••••––––••ÁÁÁÂÂÂÃÃÄÅÆÅÄÄÃÃÂÂÂÂÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾½½¼»»»»»»ºº¹¹¹¹¹¸·¶µ´´´´´³³²²²±¯®®­¬ª©©¨¨¨¨¨¨¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££¤¤£££££££££££££££££¢¢¢Ÿœ›šš™™™˜˜˜—––•••••”””““’’’‘‘‘ŽŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡†…††……„ƒƒƒ„„ƒ„„„………„„ƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚€€€€~}||{zzzzzyyyyyyyyyyyxxxxxxxxwvuttttttttssssrqqqpoooooooonnnnnnnnnnmmmmmmnnnnnnnnnnnnnnooooooooppqqqqrrrssssssstttuvvxxxxxxyyyzz{{}€€€€€€€€€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽ‘‘‘‘‘‘‘’’’““”•••••••–––••ÁÂÂÂÃÃÄÅÆÆÆÆÆÆÅÄÄÃÃÂÂÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾½½½¼»»»»»ºº¹¹¹¹¹¹·¶µµ´´´´³³³²²²°¯®­¬ª©©¨¨¨¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££¢¢¢ žœ››š™™™™˜˜——–••••••””““’’’’‘‘‘ŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ‡††††……ƒƒƒ„ƒƒƒƒ„…†…„„ƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ„ƒƒƒ‚‚‚‚‚€€€~}|{{zzzzzyyyyyyyyyyxxxxxxxxwvuutttttttttsssrqqqppppppooonnnnnnnnnnmmmmnnnnnnnnnnnnnnnooooopppppqqqqrrsssssssstttuvwxxxxxyyyzzz{|~€€€€€€€€€€‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽ‘‘‘‘‘‘‘’““”•••••••–••ÂÂÂÃÄÄÅÆÆÆÇÆÆÆÆÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾½½½¼»»»»ºº¹¹¹¹¹¹¸·¶µ´´´´´³³³²²²°®®­«ª©©©¨¨¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££¤¤££££££¢¢¡Ÿœ›š™™™™™˜˜—–•••••••””““““’‘‘‘ŽŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡‡‡†…„„„„„„ƒ„„…†…„„ƒƒƒƒƒ‚‚‚‚‚‚ƒ‚‚ƒƒƒƒ„„…„„…„„„ƒ€€€~}|{zzzzzzyyyyyyyyxxxxxxxxwvvuutttttttttsssrrqqqppqqqpooonnnnnnnnnnnnnnnnnnnnnnnnnnnoooppppqqqqqqqrrsssssssttttuwxxxxxxyyyzzz{}€€€€€€€€€€‚ƒ„†‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŽ‘‘‘‘’’”””••••••••ÂÂÃÄÄÆÆÆÆÆÇÇÇÇÆÆÆÆÄÄÃÂÂÁÁÁÁÁÁÁÁÁÀÀ¿¿¾¾½½½½¼»»»ºº¹¹¹¹¹¹¹¸·µµ´´´´´³³³²²±¯®­¬ªª©©©©¨¨¨¨¨¨¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££¢¢¢ žœ›šš™™™™™˜˜––•••••••”””“““’‘‘‘ŽŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹ŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‰‰‡‡†„„„„„„„……††„„„„„„ƒƒ‚‚ƒƒƒƒƒƒƒ„„„„…†††‡ˆˆ‡…ƒ€€€€€}|{{zzzzzzyyyyyyxxxxxxxxxwvvuttttttttttssssrqqqqqqqqppoooooonnnnnnnnnnnnnnnnnnnnnooooqqqqqqqqqqqrrsssssssttttuwxxxxxyyyzzz{|~€€€€€€€€€‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’’“””•••••••ÂÃÄÄÆÆÆÆÆÇÈÈÈÇÇÆÆÆÅÄÃÂÂÂÁÁÁÁÁÁÁÁÀÀÀ¿¾¾¾½½½½»»»ººº¹¹¹¹¹¹¹¸¶µ´´´´´´³³³²²°¯®­««ªª©©©¨¨¨¨¨¨¨¨¨¨§¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££¢¢¡Ÿœ›šš™™™™™˜˜—––••••••••””““’’‘‘ŽŒŒŒŒŒŒŒŒŒŒŒ‹ŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆˆˆ†……………„„„…††………………„ƒƒƒƒƒ„„„„„…„………†ˆ‰Š‹‹Šˆ…ƒ‚€€€~}|{zzzzzyyyyyyyxxxxxxxxxwvuuttttttttttssssrrqqqqqqqqpoooooonnnnnnnnonnnnnnnnnnnooopqqqqqqqqqrrrrsssssstttttvxxxxxyyyzzz{|}€€€€€€€€€‚‚„…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽŽ‘‘‘’’“”•••••••ÃÄÅÆÆÆÆÆÇÇÇÈÈÇÇÆÆÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾½½½½¼»»»ºººº¹¹¹¹¹¸¶µ´´´´´´³³³³²²¯®®­¬««ª©©©©¨¨¨¨¨¨¨¨¨¨§¦¥¥¥¤¤¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££¢¢¢ ›ššš™™™™˜˜——–•••••••••””““’’‘‘ŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŠŠˆˆˆ‡††††……„„„…†‡†††‡†………„„„……†††††‡‡‡‡‰‹‹‹‹‹‹‰†„‚€€€€~|{{{zzzyyyyyyxxxxxxxxxwvuutttttttttttsssssrrqqqqqqqqppppooooooooooonnnnnnoooooopqqqqqqqqrrrrrrssssstttttuvxxxxyyyzzz{{}€€€€€€€€€‚ƒ„‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒ‹ŒŒŒŒŽŽ‘‘‘’’“”•••••••ÅÅÆÆÆÆÆÆÆÆÇÈÈÇÇÇÆÆÆÆÄÃÂÂÁÁÁÁÁÁÁÁÁÀÀ¿¿¾¾¾½½½¼¼»»»ººººº¹¹¹¸¶µ´´´´´´³³³³²²°¯®®­­¬«ª©©©©¨¨¨¨¨¨¨¨¨¨¨¦¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦§§§¦¦¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££¢¢¢¡žœ›šš™™™™™˜˜—––••••••••””““’’‘‘‘ŽŽŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‰ˆˆˆˆˆ‡‡††…„„„„…†‡‡‡ˆˆ‡‡†…………††‡ˆ‡‡‰‰‰ŠŠ‹‹‹‹‹‹‹‰†„‚€€€€}|{zzzyyyyyyxxxxxxxxxwvuttttttttssttssssssrrqqqqqqqqqqqpoooppooooooonnnnoooooppqqqrrrrrrrrrrrssssstttttuvxxxxyyyzzz{}€€€€€€€€€‚‚„…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒ‹‹‹‹ŒŒŒŒŽŽŽŽŽŽŽŽ‘‘‘‘’’”””•••••ÅÅÆÆÆÆÆÆÆÆÇÈÈÈÇÆÆÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁÀÀ¿¿¾¾¾¾½½½¼»»»»ººººº¹¹¸¶µ´´´´´´³³³³²²²°¯®®­­­«ªª©©©©©¨¨¨¨¨¨¨¨¨§¦¦¦§¦¦¦§§¦¦§§¨¨¨¨¨¨§¦¦¦¦¦¦¦¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤££££¢¢¢žœ››ššš™™™™˜——–––•••••••”““’’’‘‘ŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰ˆˆˆ‡‡‡‡‡†††……„„„†ˆ‰‰‰‰‰‰ˆ‡††††‡ˆ‰‰‰Š‹‹‹‹‹‹‹‹‹‹‹‹ˆ†ƒ‚€€€€€€€}{{zzzzyyyyxxxxxxxxxwvuttttttttsssstttssssrrrrrqqqqqqqqppppppoooopoononnoopppqqqrrssrrrrsssssssssttttuuwxxxxyyzzz{|~€€€€€€€€€€‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒ‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽŽ‘‘‘‘’“”””””••ÅÆÆÆÆÆÆÆÆÆÇÈÉÈÇÆÆÆÆÆÅÃÂÂÁÁÁÁÁÁÁÁÁÀÀÀÀ¿¾¾¾¾½½¼»»»»»»ººº¹¹¸¶µµ´´´´´³³³³²²²²±°¯®®®­«ªª©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§§§§§§¦¦¦¥¥¤¤¤¤¤¤££££¢¢¢Ÿœ››ššš™™™™˜˜——–••••••”””“““’’‘‘ŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŠŠŠ‰ˆ‡‡††††………………†‡Š‹‹‹‹‹‹‹Š‰‰ˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰†ƒ‚€€€€€€~|{{zzzzyyyxxxxxxxxxxvuttttttttsssssttsssssrrrrrrrqqqqqqqqqqpppppppooonnoopqqqqqrrssssrsssssssssttttuuvxxxxxyyzz{|~€€€€‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒ‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽŽŽŽŽ‘‘‘’“““““””•ÅÅÆÆÆÆÆÆÆÇÈÉÈÇÆÆÆÆÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾½½¼»»»»»»ºº¹¹¹·µµ´´´´´´´³³²²²²²±°¯®®­¬«ªªªª©©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦¦¥¥¤¤¤¤££££¢¢¢ žœœ›››ššš™™™˜˜—––•••••””““““’’‘‘ŽŽŽŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡†††……„„…†††‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ†„‚‚€€€€}|{zzzzyyyxxxxxxxxxxwuuttttttsssssstttssssssssrrrrrrrqqqqqqqqqqqppooonooopqqqqqrrrsssssssssssstttttuvwxxxxyyzzz{|€€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒ‹‹ŒŒŒŒŒŒŒŒŒŽŽŽŒŽŽŽŽŽŽ‘‘’’’’““”””ÅÅÆÆÆÆÆÆÆÇÉÉÇÇÆÆÆÆÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾½½½¼¼»»»»»º¹¹¹¸¶µ´´´´´´´³³³³²²²²±°°¯®­¬««««ªª©©©©©©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤££££¢¢¢ žœœ››ššš™™™˜˜—–•••••””“““““’’‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡†††…„„„…††‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰†„ƒƒ‚‚€€~}|{zzzyyyyxxxxxxxxxxvuuutttssssssssttsssssssssssssrrrrrrqqqqqqqqpooooooppqqqqqrrsssssssssstttttttuvwxxxxyyyzzz{}€€€‚‚„…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘’’““““”ÆÆÆÆÆÆÆÆÇÈÈÈÇÇÆÆÆÆÆÆÅÄÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁ¿¿¾¾¾½½½½¼¼¼»»ºº¹¹¹·µµ´´´´´´´³³³³²²²²²±°¯®­­­­¬«ªªª©©©©©©©ª©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©¨¨¨¨¨¨¦¥¤¤¤¤££££¢¢¢¢Ÿžœœ››ššš™™™˜—–•••••””“““““““‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‡†††……„„…†ˆˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ†…„„‚€€~|{{zzyyyyyxxxxxxxxxwvuutttsssssssssssssssssssssssssrrrrrrqqqqqqpooooopppqqqqqrrsssssssssttttttttuvwxxxxyyyzz{|~€€€‚‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽŽŽ‘‘‘’’’““”ÆÆÆÆÇÇÆÇÇÈÈÈÇÇÆÆÆÆÆÆÅÅÅÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾¾½½½½½¼»»»º¹¹¹¸¶µµ´´´´´´³³³³³³²²²²²°¯®®®®­¬««ªªªªªªªª««ªªªªªªª«ªªªªªªªªªª©ªª©©©©©©©©©©©¨¨¨¨§¥¤¤¤¤¤££££¢¢¢¢¡Ÿœ›šš™™™™˜˜—–••••””““””””“’‘‘‘ŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰ˆ‡††……„……‡ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡…ƒ‚€€}|{zzzyyyyxxxxxxxxxxwuttttsssssssssssssssssssssssrrrrrrrsrqqqqqqpooopppqqqqrrrrssssssssttttttttuvwxxxxyyyzz{{}€€‚‚‚‚‚‚‚ƒ„…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒ‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽŽ‘‘’’’““”ÆÆÆÇÇÇÇÇÇÈÈÈÇÇÆÆÆÆÆÆÆÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁ¿¿¾¾¾¾¾½½½½»»»ºº¹¹¹·¶µµ´´´´´´´´³³³³³³²²²±°¯¯®®­­¬¬«««««¬¬­­­¬¬¬­¬¬¬­­¬««««««««««ªªªªªªªªªª©©©¨¨¨¦¥¤¤¤¤£££££¢¢¢¢¡Ÿžœ›šš™™™™˜—–•••••”““”””””’‘‘‘ŽŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡†††……†‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡…‚€€€}|{zzzyyyyxxxxxxxxwvuttttttsssssssssssssssssssssrrrrrrrrrrqqqqqpppppppqqqrrrsssssssttttttttttuvvwxxxxyyzzz{|~€€€‚‚‚‚‚‚ƒƒƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒ‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽ‘‘’““””ÇÇÇÇÇÇÇÇÈÈÈÈÇÇÆÆÆÆÆÆÆÆÆÆÅÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁ¿¿¾¾¾¾¾¾½½¼»»»ºº¹¹¹¸¶¶µ´´´´´´´´´³³³³³³²²±±°¯®®®®­­­­­­®®®®®®®®®®®®®®®®­­­­­­­­¬¬««««««««ªª©©¨¨¨¨¦¥¤¤¤¤£££££¢¢¢¢¢ œ›šš™™™™™˜—–•••••”””””””“’’‘‘‘ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆˆ‡‡†‡ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‡„‚€€€}|{zzzzyyyyxxxxxxwvuttttttttsssssssssssssssssrrrrrrrrrrrrrqqqqqqqqppqqqrrrsssssssstttttttuuvwwxxxxxxyyzz{{}€€€€‚‚‚‚‚‚‚ƒƒ„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽ‘‘’’“””ÇÈÇÇÈÈÈÈÈÉÉÉÈÇÇÆÇÆÆÆÆÆÆÆÆÅÄÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁ¿¿¿¾¾¾¾½½½¼»»»ºº¹¹¹¸·¶µµµµ´´´´´´´´³³³³²²²²±°¯¯¯®®®®®®®¯¯¯¯¯¯¯¯¯¯¯¯¯°¯¯®®®®®®®®­­­¬¬¬¬¬«ªª©©¨¨¨¨§¦¥¤¤¤¤¤££££¢¢¢¢¡žœ›š™™™™™˜˜—–••••••””””•””“’‘‘ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰‰ˆˆ‰‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š†ƒ€€€}{zzzzzyyyyxxxxxxvuuttttttttssssssssssssssssrrrrqrrrrrrrrrqqqqqqqqqqqqrrrsssssstttttttuuuvxxxxxxxxxyyzz{|~€€€€‚‚‚‚‚‚ƒƒ„†‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽ‘‘‘’’“”ÈÈÈÉÉÉÉÉÉÊÊÉÈÇÇÇÇÇÆÆÆÆÆÆÆÆÅÄÄÃÂÂÂÂÁÁÁÁÁÁÁÁÁÀÀ¿¿¾¾¾½½½¼»»»ºº¹¹¹¹·¶¶¶µµµ´´´´´´´´´³³³²²²²²²±±±±±°°°±°°°°°±±±±±²²²²±°¯¯®®®®®®®­­­­­­«ª©©©¨¨¨¨¨§¦¥¤¤¤¤¤£££££¢¢¢Ÿœ›š™™™™™˜˜˜—–•••••••••••””“‘‘ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ„‚€€€}|{zzzzzyyyxxxxxxwvuuttttttttstssssssssssssssrrqqqrrrrrrrrrqqqqqqqqqqqqqqrssssttttttuuuvwxxxxxxxxxyyzz{|~€€€€‚‚‚‚‚‚‚ƒƒƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽ‘‘’’“”ÉÊÊÊÊÊÊËËËËÉÈÈÇÇÇÇÇÆÆÆÆÆÆÆÆÆÆÄÃÃÃÂÂÂÂÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾½½¼»»»ºº¹¹¹¹¸··¶¶µµµµ´´´´´´´³³³³³²²²²²²²²²²²²²²²²²²²²²²²²²²²²±°¯¯¯¯®®®®­­­­­¬ªª©©¨¨¨¨¨¨§¦¥¤¤¤¤¤£££££¢¢¡ž›š™™™™™˜˜˜˜—–••••••••••••“’‘‘ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‡„‚€€€}|{zzzzyyyxxxxxxxwvuutttttttttssssssssssssssrrqqqrrrrrrrsrrrqrrqqqqqqqqqrsssttttttuuvvwxxxxxxxxxxyyzz{}€€€€‚‚ƒ‚‚‚ƒƒƒƒƒ…†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’““ÉÊËËÌÍÍÍÌÌËÊÉÈÈÈÈÇÇÆÆÆÆÆÆÆÆÆÆÆÅÄÄÃÃÃÂÂÂÂÁÁÁÁÁÁÀÀ¿¾¾¾¾½½¼»»»ººº¹¹¹¹¸¸··¶¶µµµµ´´´´´´´³³³³³³³³³³³³³³³³²²²²³³³³³²²²²²²²±°°°¯®®®®­®®­¬ªª©©¨¨¨¨¨¨¨§¦¥¤¤¤¤¤££££¢¢¢ œšš™™™™™™™˜—–••••••••••••”“’‘‘ŽŽŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰…ƒ€€€}||{zzzyyyyxxxxxxxvvuutttttttttsssssssssssssrrrqqqrrsrrssssrrrrrrrrqqqqqqrssstttttuvwxxxxxxxxxxxyyzzz{~€€€€€‚ƒƒƒƒƒƒƒƒ„…†‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’’“ÉËËÌÌÍÎÏÎÎÌÊÉÉÉÈÈÇÇÇÆÆÆÆÆÆÆÆÆÆÆÆÅÄÄÃÃÃÃÂÂÂÁÁÁÁÁÁÀ¿¿¾¾¾½½¼»»»ººº¹¹¹¹¹¹¹¸¸··¶¶µµ´´´´´´´´´³³³³³³³³³³³³³³³³³³³³³³³³³³²²²²±°¯¯®®®®®­­«ªª©©¨¨¨¨¨¨¨¨§¥¥¤¤¤¤¤£££¢¢¢¡žœ›š™™™™™™™˜˜—–••••••••••••”’‘‘‘ŽŽŽŽŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ„‚€€~}|{{zzzyyyyxxxxxxwvuuttttttttttsssssssssssssrrqqqrrrsssssssssssrrrqqqqqqrssstttttuvwxxxxxxxxxxyyyzz{|€€€€€‚ƒƒƒƒƒ„„„……†‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’’“ÊËÌÍÎÏÐÐÐÏÍËÊÊÊÉÈÈÇÇÇÇÇÇÇÆÆÆÆÆÆÆÆÆÆÅÄÄÄÃÃÂÂÁÁÁÁÁÁÁ¿¿¾¾¾½½¼»»»»ººº¹¹¹¹¹¹¹¹¹¸¸¶¶µµ´´´´´´´´´´´´´´´´´´´´´´´´´´´³³³³³³³³²²²±°¯¯®®®®­¬«ªª©©¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤£££¢¢¢žœ›š™™™™™™™˜˜˜—–••••••••••••”“’‘‘‘ŽŽŽŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹†ƒ€€}|{{zzzyyyyxxxxxxxwvuutttttttttssssssssssssssrrrrrrsssssssssssssrrqqqqqrrsssttttuuvxxxxxxxyyyyyyzz{{~€€€€€€‚‚ƒƒƒƒƒ„„………†‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’“ËÌÍÎÐÐÐÐÐÐÎÍËËËÊÉÈÈÈÈÈÈÈÇÇÇÇÇÆÆÆÆÆÆÆÆÆÅÅÄÃÃÂÂÁÁÁÁÁÁÀ¿¾¾½½½¼»»»»»ººººº¹¹¹¹¹¹¹¸·¶µµµ´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´³³³³²²²±°¯¯¯®®­¬«ªª©©©¨¨¨¨¨¨¨§§¦¥¥¤¤¤¤£££¢¢¢ž›šš™™™™™™™˜˜—––••••••••••••”““’‘‘ŽŽŽŽŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ„ƒ€€€}|{{zzzyyyyxxxxxxxwvuuutttttttsssssssssssssssrrrrsssssssssssssssrrrqqqrssssttttuuvwxxxxxyyyyyyzzz{}€€€€€‚ƒƒƒƒƒƒƒ„…†‡‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘‘’ÌÎÐÐÐÐÐÐÐÐÐÎÍÌËËÊÉÉÉÉÉÉÉÈÇÇÇÇÇÇÆÇÇÆÇÆÆÆÆÆÅÄÃÂÂÂÁÁÁÁÁÀ¿¾¾½½½½¼¼»»»»»»ººººº¹¹¹¹¹¸¶¶µµµµ´´´´´´´´´´´´µ´´´´´´´´´´´´´´´´´³³³²²²±°¯®®­­««ª©©©©¨¨¨¨¨¨¨¨§¦¥¤¤¤¤££££¢¢ ›šš™™™™™™™˜˜——––•••••••••••••”“’‘ŽŽŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡„‚€€€}|{{zzzyyyyxxxxxxwvuuutttttttsssssssssssssssssssssssssssssssssssrrrqqrssssttttuuvxxxxxyyyyyzzzz{|~€€€ƒ„ƒƒƒƒƒ„…†‡ˆˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹ŒŒŒŒŒŒŒŒŒ‘‘‘’ÏÐÐÐÐÐÐÐÐÐÐÏÍÍÌÌËÊÊÊÊÊÊÊÉÈÈÇÇÇÇÇÇÇÇÇÇÇÆÆÆÆÆÆÄÃÂÂÁÁÁÁÁÀ¿¾¾¾½½½½½¼»»»»»»»»ººº¹¹¹¹¹¸·¶¶¶¶µµµµµµµµµµµµµµµµµµµµµ´´´´´´´´´³³³³²²²°¯®­­««ª©©©©©¨¨¨¨¨¨¨¨¦¥¤¤¤¤££££¢¢¢Ÿœ›šš™™™™™™˜˜˜——–••••••••••••••“’‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ…‚€€€}|{zzzzyyyyxxxxxxwvuuutttttttssssssssssssssssssssssssssssssssssssrrrrssssttttuuvxxxxyyyyzzzzz{|~€€€‚‚ƒ„ƒƒƒƒƒ„…†ˆˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹ŒŒŒŒŒŒŒŽŽ‘‘’ÐÐÐÐÐÐÐÐÐÐÐÏÎÎÍÍÌÌËËËËËÊÉÉÈÈÈÈÈÈÇÇÇÈÈÈÇÇÇÇÆÆÆÄÃÂÂÁÁÁÁÁÀ¿¾¾¾½½½½½½½½¼¼¼»»»»ºº¹¹¹¹¹¹¸¸·······¶¶¶¶¶¶···¶¶·¶¶¶µµ´´´´´´´´´´³³³²²°¯®®­¬«ª©©©©©¨¨¨¨¨¨¨¨¦¥¤¤¤¤££££¢¢¢ žœ›ššš™™™™™˜˜——––•••••••••••••“’‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š†…ƒ‚€€€~|{{zzzzyyyyxxxxxxwvuuutttttttssssssssssssssssssssssssstssssssssssrsssssttttttuvxxxxxyyzzzz{{|}€€€‚‚‚ƒ„„ƒ‚‚ƒƒ„„†‰‰‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹ŒŒŒŒŒŒŒ‘‘’ÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÎÎÎÎÍÌÌËÊÊÉÉÉÉÉÉÈÈÈÉÉÊÉÉÉÈÇÇÆÆÅÄÃÂÂÁÁÁÁÀ¿¾¾¾¾¾¾¾½½½½½½¼»»»»ººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸¸¸¹¹¹¹¹¸¸¸·¶µµµ´´´´´´´´´´³³²±¯®®­¬«ªª©©©©©¨¨¨¨¨¨¨§¦¥¤¤¤¤£££¢¢¢¢ œ›ššššš™™˜˜——–––••••••••••••”’‘‘ŽŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰†„ƒƒ‚€€€~|{{zzzzyyyyxxxxxxwvvuutttttttsssssssssssssssssssssssttssssssssssssssstttttttuvxxxxxyyzzz{||}€€€€‚‚ƒ„…„ƒƒƒƒƒ„…‡‰‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘’ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÏÐÐÐÏÎÎÎÍÍÌËËÊÊÊÊÊËËËÌËÊÊÊÉÈÈÆÆÅÄÃÂÂÁÁÁÁÁÀ¿¾¾¾¾¾¾¾¾¾½½½¼¼¼»»»ºººººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸·¶¶µµµµµ´´´´´´³²²±¯®®­¬«ªªªª©©¨¨¨¨¨¨¨¨¦¥¤¤¤¤££££¢¢¢¢ žœ›››šš™™™˜˜—––––•••••••••••”“’‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ†„ƒƒƒ‚€€€€}|{{zzzzyyyyxxxxxxwvuuuttttttttsssssssssssstttttttttttttssssssssssssttttttuuwxxxxyyyzz{{|}€€€‚ƒ„„…‡…„„ƒ„„†‡‰ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒ‹‹‹‹‹‹ŒŒŒŽ‘‘‘“ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÎÎÌÌÌÍÍÍÏÍÎÍÌÍÌËÊÉÈÇÆÆÄÃÃÂÂÁÁÁÁÁÀÀ¿¿¿¾¾¾¾¾½½½½¼¼»»»»»»»»»ººººººººººººººººº¹¹¹¹¹¹¹¹¸¸··¶¶µµ´´´´´³²²°¯®®­¬««««ª©©¨¨¨¨¨¨¨§¦¥¤¤¤¤££££¢¢¢¢¡Ÿžœ›šš™™˜˜———––––••••••••••”“‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡†…„ƒƒƒ‚€€€€}|{{zzzzyyyyyxxxxxxwvvuuttttttttttttttttttttttttttttttttttttssssssttttttuuvxxxxxyyzzz{|}~€€€€‚ƒ„…†‡ˆ‡†………†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒ‹‹‹ŒŒŒŽŽŽ‘‘‘‘’”ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÐÐÐÐÐÏÏÏÏÐÏÍËÊÈÇÆÆÅÄÃÃÂÁÁÁÁÁÁÁÁÁÀÀ¿¿¾¾¾½½½½½¼¼¼»»»»»»»»»»»»»»ºº»»»»»»ººººº¹¹¹¹¹¹¹¸·¶¶µµ´´´´³²²±°¯®­­­­«ª©©©©©©¨¨¨¨§¥¥¤¤¤¤££££¢¢¢¢¡¡ ž›š™™™˜˜˜——–—––––––••••••”“’‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡……ƒƒƒ‚‚‚€€€€}||{{zzzyyyyxxxxxxxwwwvuuuttttttttttttttttttttttttttttttttttttsttttttuuvwxxxxxyyyzzz{|}€€€€‚ƒ„†‡ˆŠŠ‰ˆ‡‡ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’’“”ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÉÇÆÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾¾½½½½½½½½½½¼¼¼»»»»»»»»»»»»»»»»»»»»ºº¹¹¹¹¹¹¹¸·¶µµ´´´³³²²±°¯®®®­«ªª©ª©©©©¨¨¨¨¦¥¤¤¤¤¤££££¢¢¢¢¢¢¡Ÿœšš™™™™˜˜——————–––––•••••”“’’‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡†…„ƒ‚ƒƒ‚‚€€€€~}|{{zzzyyyyxxxxxxxxwwvuuuttttttttttttttttttttttttttttttttttttttttuuuvwxxxxxyyyzzz{{|~€€€‚ƒ„†‰‹‹‹‹‹‹Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’““”•ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍËÉÈÇÆÆÆÆÄÃÂÂÂÁÁÁÁÁÁÁÁÀ¿¾¾¾¾¾¾¾¾¾¾½½½½½½½¼¼½¼¼¼¼¼¼¼½½½¼»»»»»»»ºº¹¹¹¹¹¹¹¸·¶µ´´´³³²²±°¯¯®­¬««ªªªªª©©¨¨¨§¦¥¤¤¤¤¤££££¢¢¢¢¢¢ ž›šš™™™˜˜————˜—————––••••••”“’’‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡†…ƒƒƒƒƒƒ‚‚‚€€€€~}|{zzzyyyyxxxxxxxxxwvuuuuuuuttttttttttttttttttttttuuutttttttttttuvwxxxxxxxyyzzzz{|}€€€‚„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘’’””••ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÈÇÇÆÆÅÄÃÃÃÂÂÂÂÁÁÁÁÀÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½¼¼¼¼»»»ºººº¹¹¹¹¹¸¶µ´´´´³³²²²°¯¯®­­¬¬««««ª©©¨¨¨§¥¥¤¤¤¤¤££££¢¢¢¢¢¢Ÿœšš™™™™˜˜———˜˜˜˜˜—––•••••••”“’’‘‘‘‘‘‘‘‘ŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡…„„ƒ‚ƒ‚ƒƒ‚‚‚€€€~|{zzzzyyyyxxxxxxxxwvvuuuuuuuutttttttttttuttuuuuuuuvvuuuttttttuuuwxxxxxxxyyzzzz{{|~€€€€ƒ…ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽŽŽŒŒŒŒŒŒŽ‘‘‘’“”•••ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌËÊÉÈÇÆÆÆÅÅÄÄÄÂÂÁÁÁÁÁÁÀÀ¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½¼¼»»»ººººº¹¹¹·¶µ´´´´³³³²²°¯®®®­­­­¬««©©¨¨¨¨§¥¥¤¤¤¤¤££££¢¢¢¢¢Ÿ›šš™™™™˜˜˜˜˜˜˜˜˜˜—–––••••••””“’’’‘‘‘‘‘‘‘ŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡…„„ƒ‚‚‚‚ƒƒ‚‚‚€€€~|{{zzzyyyyyxxxxxxxxwvvvvvvuuuuttttttttuuuuuvvvvvvwxwvuuuuuuuuuvwxxxxxxyyyyzzz{{|}~€€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽŒŒŒŒŽŽŽŽ‘‘‘‘’’“”•••ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÉÈÇÇÆÆÆÆÆÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÀÀÀ¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½¼»»»»»»ºº¹¹¹·¶µµ´´´´³³²²°¯®®®®®­­¬«ª©©¨¨¨¨§¦¥¤¤¤¤¤£££££¢¢¢ œ›šš™™™™˜˜˜˜˜˜˜™˜˜——––••••••”””““““’’’‘‘‘‘‘‘‘‘‘ŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‹‹‹‹‹‹‹‹‹Š‡…„„ƒ‚‚‚‚‚ƒ‚‚‚‚€€~|{zzzzzyyyyyxxxxxxxwvvvvvvuuuutttttttuuvwwxxxxxxxxxxwwvvuuvwwxxxxxxxyyyzzzz{{||~€€€€‚ƒ„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽŽŽŒŒŒŒŽŽ‘‘‘‘‘‘’’“”••••ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÊÉÈÈÇÇÆÆÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀ¿ÀÀ¿¿¿¿ÀÀÀ¿¿¾¾¾¾¾¾¾½½½¼»»»»ºº¹¹¹¸·¶µµ´´´´³³²±°¯¯®¯®®­­««ª©©¨¨¨¨§¦¥¤¤¤¤¤£££££¢¢¢Ÿœ››š™™™™™™™™˜™™™˜˜˜—–––••••••••”•”””“’’‘‘‘‘‘‘‘‘‘‘‘‘ŽŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰Š‹‹‹‹‹‹‹Š‡†„ƒ‚‚‚‚‚ƒ‚‚‚‚‚€€€}{{zzzzyyyyyyxxxxxxxwwwwvvvvvuuuuttuuuvvxxxxxxxxxxxxxxxxwwxxxxxxxyyyyyzzzz{{|}~€€€€‚ƒ†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹‹ŒŒŒŽŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’”•••••ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÌËÉÈÆÆÆÄÃÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¾¾¾¾¾½½½¼»»»º¹¹¹¹¸·¶¶µ´´´³³²²²±°°¯¯®®­­¬«ª©©¨¨¨¨§¦¥¤¤¤¤¤££££¢¢¢¡žœ››š™™™™™™™™™™™˜˜˜——––•••••••••••••”“““’’’’’’’’’’‘ŽŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŠŠ‰Š‹‹‹‹‹‹Šˆ‡…„ƒ‚‚‚‚‚‚‚‚‚‚€€€€}{{zzzzyyyyyxxxxxxxxxxxxxxwwvvuuuuuvvwxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyzzz{{{||~€€€€‚ƒ„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽ‘‘‘‘‘‘‘‘’’“”••••–ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÇÆÆÆÅÄÃÃÃÃÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾½½½¼»»»º¹¹¹¹¸··¶µ´´´³³²²²±±±°¯®®­­¬«ª©©©¨¨¨§¦¥¤¤¤¤¤££££¢¢¢Ÿœ›šš™™™™™™™™™™˜˜˜——––••••••••••••••””””““’““““’‘‘ŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆˆ‹‹Š‰‰ˆˆ†…„ƒ‚‚‚‚‚‚‚‚‚‚‚€€€€€~||{zzzzzyyyyyxxxxxxxxxxxxxxwwvvvvwwxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyzzz{{{||}}€€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽ‘‘‘‘‘‘‘’“”•••••–ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÉÇÇÆÆÆÅÆÅÄÄÄÄÄÃÃÃÂÂÂÂÂÁÁÁÁÂÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¾¾¾½½½¼»»ºº¹¹¹¹¹¸·¶µ´´´³³²²²²²²°¯®®­­¬«ª©©©¨¨¨§¦¥¤¤¤¤¤£££¢¢¢¡Ÿœ›šš™™™™™™™™™˜˜˜˜—––••••••••••••••••••””“””””’‘‘‘ŽŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡ˆŠŠˆ‡‡†…„ƒ‚‚‚‚‚‚‚‚‚‚€€€€€€~}|{zzzzzyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyzzzz{|||}}~€€€€€‚ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽ‘‘‘‘‘‘‘’“”••••––ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÈÇÆÆÆÆÆÆÆÆÆÆÅÅÄÄÄÃÃÂÂÂÂÂÃÂÂÂÂÁÁÁÁÁÁÁÁÁÀ¿¾¾½½½¼»»ººº¹¹¹¹¸·µµ´´´³³³²²²²²°¯®®­­¬«ª©©¨¨¨¨§¦¥¤¤¤¤££££¢¢¢¡Ÿž››šš™™™™™™™˜˜˜˜——––––•––––––••••••••••••••”“’‘‘‘ŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‰ˆˆˆˆˆ‡†…„„ƒ‚‚‚‚‚‚ƒ‚‚€€€€€€~}|{{zzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyzzzzz{{|}~~€€€€€ƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽ‘‘‘‘‘‘‘‘‘‘‘’’“”•••••––ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÊÉÈÈÈÈÇÇÆÆÆÆÆÆÆÆÆÆÅÅÄÄÄÄÄÄÃÃÂÂÂÂÁÁÁÁÁÁÀ¿¾¾½½½¼»»»ººº¹¹¹¸¶µµ´´´³³³³²²²²°¯®®®­¬«ªª©¨¨¨¨¦¥¥¤¤¤££££¢¢¢¢¡ žœ›ššš™™™™™™˜˜˜˜———––––––––––•••••••••••••””“’’‘‘ŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰ˆˆ‡†††…„ƒƒ‚‚‚‚€€€€€€€€€~}|{{zzzzzzyyyyxxxxxxxxxxxxxxxxxxxxxxyyyyyxxxxxxxxxyyyyyyzzzzzz{{|~~€€€€€€‚ƒ†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’“””••••–––ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÌËËÊÊÉÈÈÈÈÇÇÇÇÇÇÇÆÆÆÆÆÆÆÆÅÄÄÃÃÂÂÂÁÁÁÁ¿¾¾¾¾½½¼»»»»º¹¹¹¹¸·µµ´´´´´³³³³²²±°¯®®­­¬«ª©¨¨¨¨¦¥¤¤¤£££££¢¢¢¢¢ Ÿœ›ššš™™™™™™˜˜˜˜—————–————–––••••••••••••””““’‘‘ŽŽŽŽŽŽŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡††……„ƒƒ‚‚‚€€€€€€€€€€€€€€€~}}|{{zzzzzzyyyyyyxxxxxxxxxxxxxxyyyyyyyyyyyyxxxxxyyyyyyzzzzz{{|}~€€€€‚ƒ…‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽŽŽŽŽŽŽŽ‘‘‘’’’“’’‘‘‘‘’’’’“““””••••––––ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÍÌÌÌËÊÉÉÉÉÉÉÉÉÈÈÈÇÇÇÆÆÆÆÅÄÃÃÂÁÁÁÁ¿¾¾¾¾½½¼¼»»ºº¹¹¹¹¹·¶µ´´´´´³³³³²²±°¯®®­­¬ª©©¨¨¨§¥¤¤¤¤£££££¢¢¢¢¢ ŸŸž›ššš™™™™™™˜˜˜˜˜˜˜˜˜˜˜˜——–––••••••••••••””“’‘‘‘ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡†……„„ƒ‚‚€€€€€€€€€€€€€~~}|{{zzzzzzyyyyyyyyyyyyyyxyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{{{|~€€€€€‚‚‚ƒ„ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽŽŽŽŽŽŽŽŽ‘‘’’““”““’’’’’’’““””””•••••––——ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÍÌÌÍÎÎÍÍÌËËÊÊÉÈÇÇÆÆÆÄÃÂÁÁÁÀ¿¿¾¾¾½½½¼»»ººº¹¹¹¹¸¶µ´´´´´³³³³²²²°¯®®­¬«ª©©¨¨§¥¤¤¤¤¤£££££¢¢¢¢¢¡  Ÿœ›ššš™™™™™™™™˜˜˜˜˜˜˜˜˜——–––•••••••••••••”“’’‘‘ŽŽŽŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡†…„ƒƒƒƒƒ‚€€€€€€€€€€€€€€€€~}|{{{zzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{{||}€€€€€€‚ƒƒ„‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽŽŽ‘’’“””””””““““““““”””•••••–––——ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÊÊÉÇÆÆÄÂÂÁÁÁÁÀ¿¿¾¾½½¼»»»»ººº¹¹¹¸¶µ´´´´´³³³³³²²°¯®®­¬ªª©¨¨¨¦¥¤¤¤¤¤£££££¢¢¢¢¢¢¡Ÿœ›ššš™™™™™™™™™™™™˜™˜˜˜——–––••••••••••••””“’’‘‘ŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡†…„ƒ‚‚‚€€€€€€€€€€€€€€€€€~}|||{{zzzzzzyyzyyyyyyyyyyzzzzyyzzyyyyyyyyyyyyzzzz{{|}}€€€€€€€‚‚ƒƒ„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽ‘‘““””••••””””””““”””••••••––———ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÍËÉÇÆÅÃÂÂÁÁÁÁÁÀ¿¾¾½½¼»»»»»ºº¹¹¹¸¶µ´´´´´³³³³³²²°¯®®­«ª©©¨¨§¥¤¤¤¤¤¤£££££¢¢¢¢¢¢ žœ››šš™™™™™™™™™™™™™™™˜˜˜——––•••••••••••••”“““’‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‰‰‡†…„ƒ‚‚€€€€€€€€€€€€€€€€€€€€~~~~~€€~}}|{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyzzzzzz{{|}~€€€€€€€‚‚ƒƒ„…ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽŽŽ‘’“””••••••••••”””””••••••–—————ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÇÆÅÃÂÂÁÁÁÁÁÁÀ¾¾¾½½¼»»»»»ºº¹¹¹¸¶µµ´´´´´³³³³²²°¯®®­¬ª©¨¨¨¦¥¤¤¤¤¤¤£££££¢¢¢¢¢ žœ›šš™™™™™™™™™™™™™™™˜˜——–––•••••••••••••””““’‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡‡†…„ƒƒ‚‚€€€€€€€€€€€€€€€€€€€€€~}}}}}~~~~€€€€~}|{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{|}~€€€€€€€€‚‚ƒ„„…†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽ‘‘’””•••••••••••”””•••••••–———˜˜ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÑÑÑÒÒÒÒÒÒÒÓÓÓÒÒÒÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏËÉÇÆÅÄÃÂÂÁÁÁÁÁÁ¿¾¾½½½¼»»»»»ºº¹¹¹¹·µµ´´´´´³³³³²²°¯®®­«ª©¨¨¨¦¥¤¤¤¤¤¤£££££¢¢¢¢¡žœ›ššš™™™™™™™™™™™™™™™˜˜—––––••••••••••••””””““’‘‘‘‘ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ†††…„ƒƒ‚€€€€€€€€€€€€~}}||}}}}~~€€€€€}||{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{|}~€€€€€€‚ƒƒ„……†‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽ‘‘’“””••••••••••••••••••••––—˜˜˜˜ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÇÆÆÄÃÂÂÁÁÁÁÁÁ¿¾¾¾½½½¼¼¼»»»ºº¹¹¹¹·¶µ´´´´´´´³³²²°°®®¬ªª©¨¨§¦¥¤¤¤¤¤¤¤£££¢¢¢¢¡žœ››ššš™™™™™™™™™™™™™™˜˜—–––––••••••••••••”””””“’’‘‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡†………„ƒ‚‚€€€€€€~}||||}||}}}~€€€€€€€}||{{{{{{{{zzz{{{{{{zzzzzzzzzzzzzzzz{{||~€€€€‚‚ƒƒ„„†‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽ‘‘’“””•••••••••••••••••••–––—˜˜˜˜ÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÓÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÊÇÆÆÅÃÂÂÂÁÁÁÁÁ¿¾¾¾¾½½½½¼»»»»ºº¹¹¹¹·¶µ´´´´´´´³³²²°¯®­«ª©¨¨¨§¦¥¥¤¤¤¤¤¤£££¢¢¢¡Ÿœ››šššššš™™™™™™™™™™™˜˜˜—––––•••••••••••••”””””““’’‘‘‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ†…„„„ƒ‚€€€€€€~~~~~~}||||||||||}~~€€€€€€€~}||||{{{{{{{{{{{{{{{{{{{{{z{zz{{{||}~€€€€‚‚‚ƒ„………‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘’“”•••••••••••••••••–––––——˜˜™™ÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÊÈÇÆÅÄÃÂÂÂÁÁÁÁ¿¿¾¾¾¾½½½½¼»»»»ºº¹¹¹¹¸¶µ´´´´´´´³³²±°®­¬«ª©¨¨¨¨¦¥¤¤¤¤¤¤££££¢¢¢ žœ››ššššššššš™™™™™™™™˜˜—–––––••••••••••••••”””””“’’‘‘‘‘ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡…„„ƒ‚‚€€€€€~}}~~~~~~~}~}}}}||||{{{{{{{|}}~~€€€€€€€€~}~}||||||{{{{{{{{{{{{{{{{{{{|||}~€€€‚‚‚‚ƒ„…††‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒ‹‹‹‹ŒŒŒŒŒŽ‘‘’””•••••••••••••••–––––––——˜˜˜™ÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÓÓÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÊÈÇÆÆÄÃÃÂÁÁÁÁÁÀ¿¾¾¾¾¾½½½½¼»»»»ºººº¹¹¸¶µµ´´´´´´³³²±¯®­¬«ª©¨¨¨¨¦¥¥¤¤¤¤¤£££¢¢¢¢ žœ›››››šššššššš™™™™™™˜˜——–––––––––•••••••••••”””“’’’‘‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡…„„ƒ‚‚€€€€~}}}~~}}}}}|||||{||||||{{{{{|}}~€€€€€€€€€€~~}}|||{{{|||||||||}|}}}}~€€€‚‚‚ƒƒƒƒ„…†ˆˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‹‹‹‹ŒŒŒŒŒŽ‘’“”••••••••••–•–––––—˜—————˜˜˜˜˜ÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÕÕÔÔÓÓÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÈÇÆÆÄÃÂÂÁÁÁÁÁÀ¿¿¾¾¾¾¾½½½½¼»»»»ººº¹¹¹¸·¶µµ´´´´´³²²±¯®­¬«ª©¨¨¨¨§¥¥¥¤¤¤¤£££¢¢¢¢¡Ÿžœœœ›››››››ššš™™™™™˜˜˜———––––––––••••••••••••””““’’‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‡†…„ƒ‚‚€€€€~~}}}}}||||||{{{{{{||{{{{{{{{|}}}~€€€€€€€€€€€€€€€€~~}}|||}}}~~~~~~€€€‚ƒ‚‚‚ƒƒ…„„…†‡ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹‹ŒŒŒŒŒŽ‘’““”••••••••–––———˜˜˜˜˜˜˜˜˜˜˜˜˜˜ÑÑÐÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÕÕÔÔÓÓÓÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÇÇÆÅÄÃÂÂÁÁÁÁÁÁÀ¿¾¾¾¾¾¾½½½½¼»»»»ººº¹¹¹¹¸·¶µ´´´´´³³²±¯®®¬«©©¨¨¨¨§¦¥¤¤¤¤££££¢¢¢¢¢¢ ŸŸŸžœœœ››ššš™™™™™™˜˜˜˜˜——————–––••••••••••••”“’’‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡†…„ƒ‚€€€€~~}}}||{{{||{{{{{{{{{{{{{{{{{|}~~~€€€€€€€€€€€€€€€€€€~~~€€€€€€€€€‚ƒ„„ƒƒ„……††‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽ‘’““”••••••–––——˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜ÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖÖÖÖÖÖÖÖÕÕÔÔÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆÄÃÂÂÁÁÁÁÁÁÁ¿¿¾¾¾¾¾¾½½½½¼»»»ºººº¹¹¹¹¹¸·¶µ´´´´³³²²°¯®­«ª©¨¨¨¨¨§¥¤¤¤¤£££££¢¢¢¢¢¢¢¢¡¡  ŸŸŸžœ›››ššš™™™™™™™™™˜˜˜˜˜˜˜—––••••••••••••”“’’’‘‘‘‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆˆ‡†„ƒ‚€€€~~}}||{{{{{{{{{{{{{{{{{{{{{{{|}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ„†††††‡ˆˆ‰‰‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹‹ŒŒŒŒŒŽŽ‘’“”•••••––––——˜˜™™™˜™™™™™™™™™™˜˜ÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÓÔÔÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖ××ÖÖÖÖÕÖÕÕÔÔÓÓÓÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÈÇÆÆÄÃÂÂÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾½½½½¼¼»»»ºººº¹¹¹¹¹¹·¶µ´´´´³³²²±¯®­«ª©¨¨¨¨¨¦¥¤¤¤¤££££££¢¢¢¢¢¢¢¢¢¢¢¢¢ žœœ››šššš™™™™™™™™™™˜˜˜˜—–•••••••••••••””“’’‘‘‘‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡†…„ƒ‚€€€€~~}|{{{{zzz{{{{{{{{{{{{{|{{{{{|~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒ„„†ˆ‰‰‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽ‘’“””•••••–———˜˜™™™™™™™™™™™™™™™˜˜ÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÓÓÓÓÔÔÔÔÔÔÔÔÕÕÔÔÔÔÔÕÕÕÕÕÕÖÖ×××ÖÖÕÕÕÖÕÕÔÔÔÓÓÓÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÊÈÇÆÆÅÃÂÂÂÁÁÁÁÁÁÁÀ¿¾¾¾¾¾½½½½½¼»»»»ººº¹¹¹¹¹¹¹¸¶µ´´´´³³²²±¯®­«ª©¨¨¨¨¨¦¥¤¤¤¤£££££££¢¢¢¢¢¢¢¢¢¢¢¢¡Ÿžœ›››ššššš™™™™™™™™˜˜˜—––•••••••••••••””“’’‘’’‘‘ŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡…„ƒ‚‚€€€€~~}|{zzzzzzzzzzz{{{{{{{{{|{{{|}~€€€€€€€€€€€‚‚€€€€€€€€€€€€€€€€€€‚ƒƒƒ„†††‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽ‘’“”•••••––——˜˜™™™™™™™™™™™™™™™™™˜ÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÕÔÔÔÕÕÔÔÔÔÔÔÔÔÔÔÔÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÔÕÕÕÕÖÖÖÖÖ××××ÖÖÕÕÕÕÕÕÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÊÉÇÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÀ¿¾¾¾¾¾½½½½½¼»»»ºººº¹¹¹¹¹¹¹·¶µ´´´´³³³²±¯®­«ª©©©¨¨¨¥¤¤¤¤¤¤£££££££¢¢¢¢¢¢¢¢¢¢¢¢ Ÿžœœ›››››šššš™™™™™™˜˜—––•••••••••••••””““’’’’‘‘ŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ†…„ƒ‚€€€~|{{zzzzzzzzzzz{{{{{{{{{{|{||}~€€€€€€€€‚ƒ‚‚‚€€€€€€‚‚„†††ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘’“”•••••––—˜˜˜˜˜˜˜™˜™™™™™™™™™™™™ÑÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÔÔÕÕÔÔÔÔÔÔÔÔÔÔÔÔÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖ××ØØ××××ÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁ¿¿¾¾¾¾¾½½½½¼»»»»ºººº¹¹¹¹¹¹¹·¶µ´´´´³³²²±¯®­«ª©©©¨¨§¥¤¤¤¤¤¤¤£££££££££££££¢¢¢¢¢¢¡Ÿžœœœœœœ›šš™™™™™™™˜˜—––•••••••••••••””””““’‘‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Š‰†……„‚€€€€€€}|{zzzzzzzzzzzzz{{{zzz{{{||||}~€€€€€€€€‚ƒ‚ƒ„„ƒ‚‚‚‚‚‚‚‚‚‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’”•••••–––——˜˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™™™ÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖ××ØØØØØØ×ÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾½½½½¼»»»»ºººº¹¹¹¹¹¹¹·¶µ´´´´³³³²²¯®­«ªª©¨¨¨§¥¥¤¤¤¤¤¤¤£££££££££££¢¢¢¢¢¢¢¢ žžœ››šš™™™™™™™˜˜—–––––••••••••••••””““’‘‘‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡††„‚€€€€€€~}|{zzzzzzzzzzzzzz{zzzz{{{|||}}~€€€€€€‚ƒƒƒ„…†…„„„…„„ƒ‚ƒƒƒ‚ƒ„…†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘’“”•••••–––————˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™™ÑÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖÖÕÕÖÖÕÖÖ×ØÙÙÙÙÙÙØ×ÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÇÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾¾¾¾½½½½¼»»»»»ºººº¹¹¹¹¹¹·¶µ´´´´³³³²±¯®­¬«ª©¨¨¨§¦¥¥¤¤¤¤¤¤¤£££££££££££¢¢¢¢¢¢¢¢    Ÿœ››ššš™™™™™™˜˜———––––––••••••••••””“’‘‘‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡†„ƒ‚€€€€€~|{{zzzzzzzzzzzzzz{zzzz{{{{|}}~€€€€€€€‚‚ƒƒ„…†‡‡ˆˆ‰‰ˆ††……………†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘’“”••••–––––––—˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™™ÒÒÒÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÕÕÕÖÖÖÖÖÕÖÖÖÖ×ØÙÙÙÙÙÙÙØ×ÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÏËÉÈÇÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾¾¾½½½½½¼¼»»»»ºººº¹¹¹¹¹¹·¶µ´´´´´³²²°®®­¬«ª©¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤££££££££¢¢¢¢¢¢¢¢¢¢¢ žœœœ›ššš™™™™™˜˜˜——————–•••••••••••”“’‘‘‘‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡…ƒ‚€€€€€}|{{zzzzzzzzzzzzzzzzzz{{{{{|}}~€€€€€€‚‚‚‚ƒƒ„…†‡‰‹‹‹‹‹Š‰‰Šˆˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘‘’“”•••••––––––––—˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™ÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÕÕÕÖÖÖ×ÖÖÖÖ×××ØÙÙÚÚÚÙÙØ×ÖÖÕÕÕÕÕÔÔÕÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÈÇÆÆÅÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾¾½½½½½½¼¼»»»»»ºººº¹¹¹¹¸¶µµ´´´´´³²±¯®®­¬«ª©¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤£££££££££¢¢¢¢¢¢¢¢¢ žœ››šš™™™™™˜˜˜˜˜˜˜—––••••••••••”“’’‘‘‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ†„ƒ€€€€€}|{{zzzzzzzzzzzzzzz{{{{{{{{|}~€€€€€€‚‚ƒ‚‚‚‚ƒ„„……†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘‘‘‘‘’“”•••••––––––––———˜˜˜˜˜˜˜˜˜˜˜˜™™™™ÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖ××Ø×××ØØÙÙÚÚÚÚÚÚÚÙØ××ÖÖÕÕÕÕÔÔÕÔÔÔÔÓÓÓÓÓÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÉÈÆÆÆÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁ¿¿¾¾¾¾½½½½½½¼¼»»»»»»ººº¹¹¹¹¸·µµ´´´´³³²±¯¯®­¬«ª©©¨¨¨¨¨§¦¥¥¥¤¤¤¤¤¤¤£££££££££££¢¢¢¢¢¢¢ ŸŸžœ›ššš™™™™™™™˜˜˜˜—–––•••••••••”“’’’’‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ…ƒ‚€€€€€}|{{{zzzzzzzzzzzzz{{{{{{{{||}~€€€€‚ƒ„ƒƒ‚‚‚ƒƒ„……††ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹ŒŒŒŒŒŒŒŽŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘‘’’’“”•••••––––––––––——˜˜˜˜˜˜˜˜˜˜˜˜™™™™ÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÖÖ×ØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÙØØ×ÖÖÖÕÕÕÔÔÕÕÔÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÈÇÆÅÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁ¿¿¾¾¾¾½½½½½½¼¼¼»»»»»»ºº¹¹¹¹¸·µµµ´´´³³²±¯¯®­­¬«ª©©¨¨¨¨§¦¦¦¥¥¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢¡ Ÿžœ›ššš™™™™™™™™™˜˜˜—––––••••••”“““““’‘‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰†„‚€€€~}||{{zzzzzzzzz{{{{{{{{{{{||}}€€€€‚ƒ„„„ƒ‚ƒƒƒƒ„……††‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽŽŒŒŒŒŒŒ‹‹Œ‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽŽŽ‘‘’’““””•••••–––––––––––——˜˜˜˜˜˜˜˜˜˜˜™™™™™ÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÖÖÖÖ×ÖÖÖÖÖÖÖÖÕÕÕÖÖÖ××ØÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙØ×ÖÖÕÕÕÔÔÕÕÔÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏËÉÈÇÆÅÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾¾½½½½½½¼¼¼¼»»»»»ºº¹¹¹¹¸·¶µ´´´´³²²±°¯®®®­«ª©©©¨¨¨¨¨§§¦¥¤¤¤¤¤¤¤¤¤¤¤£££££££££¢¢¢¢¢¢¢¢Ÿœ››ššš™™™™™™™™™˜˜——–––••••••””““”“’‘‘‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ…ƒ‚€€€~}|{{{zzzzzzz{{{{{{{{{{{|||}~€€€€‚ƒƒ„…„„ƒ„„„„…†††‡ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽŽŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽ‘‘’““”•••••••––––———––––——˜˜˜˜˜˜˜˜˜˜˜™™™™™™ÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖ×Ø××××××ÖÖÖÖÖ××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØ×ÖÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÈÇÆÆÄÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾½½½½½½½½¼¼¼»»»»ººº¹¹¹¹¸¶µ´´´´³³²²±°°¯®­¬«ª©©¨¨¨¨¨¨¨¦¥¥¤¤¤¤¤¤¤¤¤¤¤£££££££££¢¢¢¢¢¢¢¡Ÿžœ›ššššššš™™™™™˜˜——––••••••””””“’‘‘‘‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ…ƒ‚€€€€~}||{{{{{{{{{||{{{{{{{{||}}~€€€€‚ƒ„…††…„………†‡‡‡ˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽŽŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘’“””•••••••––––—————––——˜˜˜˜˜˜˜˜˜˜™™™™™™™™ÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖ××ØØØ×ØØØ×××××ØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØØÖÖÖÕÕÕÕÕÕÕÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÊÈÇÆÆÅÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾¾½½½½½½½½½¼¼»»»»»ºº¹¹¹¹·µ´´´´´³³²²²²¯®®­¬«ªª©©¨¨¨¨¨¨§¥¥¤¤¤¤¤¤¤¤¤¤¤¤££££££££££¢¢¢¢¢¢¡Ÿœœ››šššššš™™™™˜˜—––••••••••”””“’’‘‘‘‘ŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹†„‚€€€€€~}|{{{{{{|||{{{{{{{{||}~~€€€€‚ƒ…†‡‡‡††††‡‰‰ˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽŽŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’“”•••••••––—————˜——˜˜˜˜˜˜˜˜˜™™™˜™™™™™™™™™™ÓÓÓÔÔÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖ××ØÙÙÙØØØÙØØØÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙÙØ×ÖÖÖÕÕÕÕÕÕÕÔÔÔÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÇÆÆÆÄÃÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾¾¾¾¾¾½½½½½½¼¼¼»»»ºº¹¹¹¸¶µ´´´´´´³³²²°¯®®­¬«ªª©©¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££¢¢¢¢¢¢¢¢¡Ÿžœœ›››ššš™™™™˜˜–––•••••••••””““’’‘‘ŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‡„ƒ‚€€€€€~}|||||||}|{{{{{{{{||}€€€€‚ƒ…†ˆ‰‰ˆ‡‡ˆ‰Š‹Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŽŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽ‘‘’“”•••••••––––—––—˜˜—˜˜˜˜˜™˜™™™™™™™™™™™™™™™šÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖÖÖÖÖ××ØÙÚÚÚÙÙÚÚÚÚÚÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚØ××Ö×ÖÖÕÕÕÕÕÔÔÔÔÓÓÓÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÈÇÆÆÅÄÃÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾¾¾¾¾¾¾¾½½½½½¼¼»»»ºº¹¹¹¸¶µ´´´´´´³³²²°¯®­­¬««ª©©¨¨¨¨¨¨¨¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤£££££¢¢¢¢¢¢¢¢¢¢¢ Ÿœœœ››šš™™™˜˜—––––••••••••””““’’‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ†„‚€€€€€€~}}}}}}}|{{{{{{||}~€€€‚ƒ…‡Š‹‹ŠŠ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘’“””•••••••––——————˜˜˜˜˜˜˜™™™™™™™™™™™™™™™™™ššÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØ×××××ÖÖÕÕÕÕÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆÅÄÃÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾¾¾½½½½½¼¼»»»»º¹¹¹·¶µµ´´´´´³³²±°¯®®­­¬«ª©©¨¨¨¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££¢¢¢¢¢¢¢¢¡Ÿžœœ››šš™™™˜˜—––––•••••••••””“’‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‡…ƒ‚€€€€~~~~}}|{{{{{||}}~€€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹ŒŒŒŒŒŒŒŒŽŽŒŒŒŒŒŒŒŒŒ‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽ‘‘’’”••••••••–––––——————˜˜˜˜˜™™™™™™™™™™™™™™™™™ššÒÓÓÓÓÔÔÔÔÕÕÕÕÕÖ××ØØØÙÚÚÚÚÚÚÚÚÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÜÛÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØØØ×ÖÖÖÖÕÕÕÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÈÇÆÆÅÄÃÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¿¿¿¿¾¾¾¾½½½½½¼¼»»»º¹¹¹¸·¶µµ´´´´³²²±°¯®®®®­¬«ª©©©¨¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££¢¢¢¢¢Ÿžœ›šš™™™™˜˜˜—––•••••••••••”“’‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‰†„ƒ‚‚€€€€€~}||{{{||}}~€€€€€€€‚„†‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘‘’’“”••••••••––––——————˜˜˜˜˜˜™™™™™™™™™™™™™™™ššššÒÒÓÓÓÓÓÔÔÔÔÕÕÕÕÖ×ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚÙØØ××ÖÖÖÕÕÕÔÔÓÓÓÓÓÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÌÊÈÆÆÆÅÄÄÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀ¿¿¿¾¾¾¾¾¾½½½½¼»»»ºº¹¹¹¹·¶µ´´´´³²²²±°¯¯®®®­¬«ª©©¨¨¨¨¨§¦¥¥¤¤¤¥¤¤¤¤¤¤¤¤££££££££££££££¢¢¢¢ŸŸžœ›šš™™™™˜˜——––••••••••••””’‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹Š†…„ƒ‚€€€€€€€€€€~}||||}}~~€€€€€€€€‚ƒ„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŒŒŒŒŒŒŒŒŒŒŽŽŒŒŒŒŒŒŒ‹‹‹‹ŒŒ‹‹‹ŒŒŒŒŒŒŽŽ‘‘’’“””•••••••••––––—————˜˜˜˜˜˜™™™™™™™™™™™™™™ššššššÑÑÒÒÓÓÓÓÓÔÔÔÕÕÕÖÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚÙÙØ×××ÖÕÕÕÔÔÔÓÓÓÓÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÌÉÇÆÆÆÅÄÄÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾½½½½¼¼»»ºº¹¹¹¹¹·µ´´´´³³²²²±°¯®®®®­«ª©©¨¨¨¨¨§§¦¥¥¥¥¥¤¤¤¤¤¤¤££££££££££££££¢¢¢¢¢¢¡žœ›šš™™™™˜˜——–––••••••••””“’‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ†…ƒ‚€€€€€€€€€€~}}}}}~€€€€€€€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŒŒŒŒŒŒŒŒŽŽŽŽŒŒŒŒŒŒŒŒ‹‹‹‹ŒŒ‹‹‹ŒŒŒŒŒŽ‘’““””••••••••–––––––————˜˜˜™˜˜™™™™™™™™™™™™šššššššÑÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙÙØ×ÖÕÕÕÔÔÔÓÓÓÓÓÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÈÇÆÆÆÅÄÄÄÃÃÂÂÁÁÁÁÁÁÁÁÁÂÂÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾½½½½½¼»»»ºº¹¹¹¹·µµ´´´³³²²²²°°°¯®®¬«ª©©©¨¨¨¨¨¨§¦¦¦¥¥¤¤¤¤¤¤¤£££££££££££££££¢¢¢¢¢Ÿžœœ›šš™™™™˜˜——–––••••••””““’‘‘ŽŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰†„‚€€€€€€€€€€~~~~~€€€€€€€€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŒŒŒŒŒŒŒŽŽŒŒŒŒŒŒŒŒŒŒŒŒ‹‹ŒŒŒ‹‹‹ŒŒŒŒŽ‘’“””•••••••••–––––––––——˜˜˜˜˜˜˜™™™™™™™™™šššššššššÑÑÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖ×ØÙÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÞÞÞÞÞÝÝÝÝÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÙ××ÖÕÕÕÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆÆÅÅÄÄÄÃÂÂÂÂÁÁÁÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾½½½½½¼»»»ººº¹¹¹·¶µ´´´´³³³²²²²°¯®®­¬ªª©©©¨¨¨¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤¤£££££££££££££¢¢¢¢¡Ÿžœ›ššš™™™˜˜——––•••••••””“’’‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‡…ƒ‚‚€€€€€€€€€€€‚„…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹ŒŒŒŒŒŽŽ‘‘’”•••••••••••–––––––––——˜˜˜˜˜˜˜˜™™™™™ššššššššššššÑÑÑÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÕÖ×ØÙÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÞßßßßßßßÞÞÞÞÞÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÚÚÚÙØØ×ÖÕÕÕÔÔÓÓÓÓÓÓÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÊÈÇÆÆÆÆÅÅÅÅÄÃÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÀ¿¾¾¾¾¾½½½¼¼»»»»»º¹¹¹·¶µ´´´´´³³³³²²±¯¯®­¬«ª©©©©¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢ žœ››šš™™™™˜˜—––––•••••””““’’‘‘Œ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ…„ƒ‚‚€€€€€€€€€€€€‚‚ƒ„‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽŽŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽ‘’“••••••••••––––—–——–———˜˜˜˜˜˜˜˜™™™™™šššššššššššššÐÑÑÑÑÒÒÒÓÓÓÔÔÔÔÔÕÕÕÕÖ×ÙÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝßßßßßßàßßßßßßßÞÞÝÝÝÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÙØ×ÖÖÕÕÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÈÇÆÆÆÆÆÆÅÄÃÃÂÂÂÂÂÂÂÂÂÃÃÂÂÂÂÁÁÁÁÁÁÁÀÀ¿¿¾¾¾¾½½¼¼»»»»»º¹¹¹¸·¶µ´´´´´³³³²²²°¯®®­«ªª©©©©¨¨¨¨§¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤££££££££££¢¢¢¢¢ Ÿžœœ››šš™™™˜˜——––•••••••””“““’‘‘ŽŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰†…ƒƒ‚‚‚‚€€€€€€€€€€€€€€€€€‚‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽ‘‘’“••••••••–––——————————˜˜˜™™˜˜™˜™™™™™™šš›š››šššššššÐÑÑÑÑÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÕÖØÙÚÛÛÛÛÜÜÜÝÝÝÞÞßßßàáááààààßßßßßßßßÞÞÝÝÜÜÛÛÛÛÛÛÛÛÛÚÚÚÙØ×ÖÖÕÕÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÉÇÇÆÆÆÆÆÆÅÄÄÃÃÃÃÃÃÃÃÄÄÄÃÃÂÂÂÂÂÁÁÁÁÁÁÀ¿¾¾¾¾½½½¼¼¼»»»º¹¹¹¸·¶µµ´´´´´³³³²²±°¯®­¬««ªª©©¨¨¨¨¨¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££¢¢¢¢¢¢ Ÿžœ›šš™™™˜˜˜——–••••••••”•”“’‘‘‘ŽŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‡……„ƒƒ‚€€€€€€€€€€€€€‚‚‚‚‚‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽ‘‘’’”•••••••––———˜˜˜˜˜˜˜˜˜˜˜™™™™™™™™™™™™™šš››››››››››››ÐÐÑÑÑÒÒÒÒÓÓÓÔÔÔÔÔÔÔÕÕÖ×ØÚÚÛÛÛÛÜÜÝÝÞßßßàáââââáááááàààààßßßßÞÞÝÜÜÛÛÛÛÛÛÛÛÛÛÚÚÙØ×ÖÖÕÕÔÔÔÔÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÉÈÇÆÆÆÆÆÆÆÅÄÄÄÄÅÅÅÅÅÅÅÄÃÃÂÂÂÂÁÁÁÁÁÁ¿¿¾¾¾¾½½½¼¼»»»ºº¹¹¹¸¸·¶µµ´´´´³³³²²²±°¯®­­¬«ª©¨¨¨¨¨¨§§¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤££££££££££¢¢¢¢¢¢Ÿžœ››šš™™™™˜˜˜—–••••••••••”“’’‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ††…ƒ‚€€‚‚ƒƒƒƒƒ„…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽ‘‘’“”•••••––—˜˜˜˜˜˜™™™™™™™™™™™™™™™™™™™™™ššš››››››››››œ›œÐÐÑÑÑÑÑÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÖØÙÚÛÛÛÛÜÜÝÝÞßààáãååäããããâââááááàààßßßÞÝÜÜÛÛÛÛÛÛÛÛÛÚÚÙÙØ××ÖÕÕÔÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÉÈÇÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÅÅÄÃÃÃÂÂÁÁÁÁÁ¿¿¾¾¾¾½½½¼¼»»»ºº¹¹¹¹¸·¶¶µµ´´´´³³³²²²±°¯®­¬ª©©¨¨¨¨¨¨¨¨¨§¦¦¥¤¤¤¤¤¤¤¤¤¤££££££££££¢¢¢¢¢¡žœ››šš™™™™˜˜˜—–––•••••••””“’’’‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹Šˆ‡…„ƒ‚‚‚‚‚‚‚ƒƒƒƒ„„„„…†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’”•••••––—˜˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™šššš›››››œœœœœœÐÐÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÔÔÔÕÕÖØÚÚÛÛÛÛÜÜÝÝÞßàáäççççæåäåääãããããââáààßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÙÙÙ×ÖÕÕÔÔÔÓÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÌÊÊÉÈÈÇÇÇÇÇÇÆÆÆÆÆÆÇÆÆÆÆÆÆÆÅÄÃÂÂÁÁÁÁÁÀ¿¾¾¾¾½½½¼»»»»º¹¹¹¹¹¸·¶µµ´´´´´³³³³²²²°¯®­¬ª©©©¨¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤££££££££££¢¢¢¢¢ žžœ››šš™™™™™˜˜˜——–––•••••”“““’’‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰†…„ƒ‚‚‚‚ƒƒƒ‚‚‚‚‚ƒ„„……†††‡‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒŒŽŽ‘‘’“”•••••––—˜˜™™™™™™™™™™™™™™™™™™™™™™™™™ššššš›››››œœœžŸÐÐÑÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÔÔÕÕÖ×ÙÚÛÛÛÛÜÜÜÝßßàâäæçççççççææååææåääãáàßßÞÝÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙ×ÖÕÕÔÔÔÓÓÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÏÍÌÊÉÉÈÈÈÈÈÈÈÈÇÇÇÈÇÇÇÇÇÇÆÆÆÅÄÂÂÁÁÁÁÁÀ¿¿¾¾½½½¼»»»»ºº¹¹¹¹¹¸·¶µµ´´´´´´³³³²²²°¯®­¬«ª©©©©¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤££££££££££¢¢¢¢¢ Ÿœ››ššš™™™™˜˜˜˜˜—––•••••”””“’‘‘ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ†…„„„„„…„„„„„„„„…†‡ˆˆ‰‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘ŽŒŒŒŒŽ‘‘’””•••••––—˜˜™™™™™ššššš™™™™™™™™™™™™™™™ššš››››››››œœžžŸ ¡ÐÐÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÔÕÕÖ×ÙÚÛÛÛÛÜÜÝÞßßàáãæççççççççççççççææãâàßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙ×ÖÖÕÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÎÍÌËËËÊÊÊÉÉÉÉÉÉÈÈÈÈÈÈÈÇÆÆÅÄÃÂÂÁÁÁÁÁÀ¿¾¾½½½¼¼»»»ºº¹¹¹¹¹·¶¶µµµ´´´´´´³³²²²°¯¯®­¬««ª©©©¨¨¨¨¨¨¨¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤£££££££¢¢¢¢¢¡Ÿžœ››šš™™™™™™˜˜˜—––•••••••””’‘‘‘Œ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡‡ˆ‰‰‡†‡††‡ˆ‡‡ˆ‰‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽ‘‘‘‘‘‘‘‘ŽŽŽŽŽŽŽŽ‘‘’“””••••••–—˜˜™™™ššššš››šššššššššššššššš››››››››œœœœžŸ ¡¢¢ÐÐÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÕÕÖØÙÚÛÛÛÜÜÜÝÞßßàáãæçççççççççççççççåäâáàßßÞÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚØ×ÖÕÔÔÔÔÔÓÓÓÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÌÌÌËËËÊÊÊÉÉÊÊÊÉÇÇÆÆÄÃÂÂÁÁÁÁÁ¿¾¾¾½½½¼»»»»ºº¹¹¹¹¹··¶¶¶µµ´´´´´³³³²²²°¯®®­­¬«ªª©©¨¨¨¨¨¨§¥¥¥¥¤¤¤¤¤¤¤¤¤¤£££££££¢¢¢¢¢¢¡Ÿžœ›šššš™™™™™™˜˜—––•••••••”“’‘‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’’’‘‘‘‘‘ŽŽŽŽŽŽŽ‘‘‘’“””•••••––—˜™™™™šš›œ›œœœœœ››šššššššššš››œœœœœœœœœžžŸ¡¢¢¢¢ÐÐÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕ×ØÙÚÛÛÛÜÜÜÝÞßßààâåççççççççççççççæåäâáàßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚ×ÖÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÏÎÌÌÌËËËËËËÉÈÇÆÆÄÃÂÂÂÁÁÁÁ¿¾¾½½½¼¼»»»»ºº¹¹¹¹¹¸¸·¶¶µµ´´´´´³³³²²²±±¯¯®®­­¬«ª©¨¨¨¨¨¨§¦¦¥¥¤¤¤¤¤¤¤¤¤£££££££££¢¢¢¢¢¡Ÿœ›››ššš™™™™™™˜——––••••••”“’’‘‘‘ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽŽ‘‘‘‘’’’’’‘‘‘‘ŽŽŽŽŽŽŽŽ‘‘‘‘’“””••••••––—˜™™™™šš›œžžžœ›šššššššš››œœœœœœœžŸŸ ¢¢¢¢¢ÐÐÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÕÕÖØÙÚÛÛÛÜÜÜÝÞßßßàâåçççççççççççççççåäâáàßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚØÖÕÕÕÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÎÎÍÍÍÍÌËÉÇÆÆÅÃÃÂÂÁÁÁÀ¾¾¾½½½¼¼¼»»»ºº¹¹¹¹¹¹¸··¶¶µµ´´´´´³³³²²²²±°¯®®®­«ª©©¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤££££££££££¢¢¢¢¢ žœœ›››ššš™™™™™˜˜——––•••••”““’’‘‘ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽ‘‘‘‘‘‘’’’’’’’‘‘‘ŽŽŽŽŽŽ‘‘’’“”•••••••––—˜™™™™šš›œžŸ   Ÿžœ››ššššššš›œžžžžŸ ¡¢¢¢¢¢¢ÐÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÕÕÖ×ÚÚÛÛÛÜÜÜÝÞßßßáâäåææçççççççççççççåãâàßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÏÍÉÇÆÆÅÄÃÂÁÁÁÁ¿¾¾¾½½½½¼»»»»ººº¹¹¹¹¹¸¸¸·¶µ´´´´´´³³³³³³²²²°°¯®­¬ª©©¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤£££££££££££¢¢¢¢¡Ÿžœœ›ššš™™™™™˜˜——–•••••”””“’‘‘ŽŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽ‘‘’’’’’““““’’’’’‘‘‘‘’““”••••••••–—˜™™™ššš›œž¡¢¢¢¢¡Ÿžœ›šššššš›œžžžžžŸŸžžžžŸŸ ¢¢¢¢¢¢¢¢ÐÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÕÕÖØÚÛÛÛÛÜÜÜÝÝÞßàáãääåæççççççççççççæåãâáàßßßÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚØÖÖÕÕÔÔÔÕÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆÄÃÂÁÁÁÁ¿¾¾¾½½½½¼¼»»»»ººº¹¹¹¹¹¹¹·¶µµ´´´´´´´´³³³³²²²²°®®­«©©¨¨¨¨¨¨§§¦¥¤¤¤¤¤¤¤¤£££££££££££¢¢¢¢¢¡ Ÿžžžœ››šš™™™™™˜˜—–•••••••”“’‘‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽŽ‘’“““““””””““’’’’‘‘‘‘‘‘’“”••••••••–—˜™™™ššš›œŸ¢¢¢¢¢¢¢Ÿœ›šššš››œž ŸŸŸ  ¡  Ÿ ¡¡¢¢¢¢¢¢¢¢¢ÐÐÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÔÕÕÖØÚÛÛÛÛÛÜÜÜÝÞßàáãäååæççççççççççççæçäâáààßßßÞÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚØÖÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÇÆÅÃÂÂÁÁÁÀ¿¾¾¾¾½½½¼»»»»»»ºº¹¹¹¹¹¹¹¸·¶µµµ´´´´´´´´³³³³²²°¯®­«ª©©¨¨¨¨¨¨§¦¥¥¥¤¤¤¤¤¤¤££££££££££¢¢¢¢¢¢¢¡¡  žœœ›šš™™™™˜˜——–••••••”“’‘‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽ‘‘’“””””••”””””“““’’‘‘‘‘‘‘‘‘‘’“”••••••••–—˜™™™š›››œŸ¡¢¢¢¢¢¢¢ žœ›››œœœž ¢¡ ¡¢¢¢¢¡¢¢¢¢¢¢¢¢¢¢¢¢¢ÐÐÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÕÕÖØÚÛÛÛÛÛÜÜÜÝßßàáãäåæççççççççççççæçåäãâáààßßßÞÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÙ××ÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÉÇÆÅÃÂÂÁÁÁÀ¿¾¾¾¾½½½¼»»»»»»ºººº¹¹¹¹¹¹¸·¶¶¶µµµ´´´´´´´³³²²²¯®®¬«ª©©¨¨¨¨¨¨§¦¦¥¤¤¤¤¤¤¤¤¤¤¤££££££¢¢¢¢¢¢¢¢¢¢¢¡ Ÿœ›šš™™™™™˜—–••••••”““’‘ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘’“””•••••••••••”””““’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’”•••••••––—˜™™™š›œž ¢¢¢¢¢¢¢¢¢ Ÿžœœž¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£ÐÐÑÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÔÔÕÕÖØÚÛÛÛÛÛÜÜÜÝßßàáâäåççççççççççççççæäããâáààßßßßÞÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚÙØØ×××××××ÖÖÖÖÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÉÇÆÅÃÂÂÁÁÁÁ¿¾¾¾¾½½¼¼¼»»»»»»ººººº¹¹¹¹¹¹¸¸···¶µµ´´´´´³³³²²°¯®­«ª©©©¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤¤££££££££¢¢¢¢¢¢¢¢¢¢¢ žœ››šš™™™™˜—–••••••””“’‘ŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘‘’’“”••••••••••••••••”””“’’’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’“””••••••––—˜™™™š›œžŸ ¢¢¢¢¢¢¢¢¢¢¢¢ Ÿžžž ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££ÐÐÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÕÕÖ×ÙÚÛÛÛÛÛÜÜÜÝßßàáâäåççççççççççççæååäãâáààààßßßßÞÝÝÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙÙØ×ØØØØØØ×××ÖÖÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÉÇÆÆÄÂÂÁÁÁÁ¿¿¾¾¾½½½¼¼¼¼»»»»»»ººº¹¹¹¹¹¹¹¹¹¹¸¶¶µµµ´´´³³³²²°®®­«ªª©©©¨¨¨¨¨§¦¦¥¤¤¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢¢¢¡žœ›šš™™™™˜—––•••••””“’‘ŽŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘’’’“”•••••••••••••••••••••”””““’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’““””•••••––—˜˜™™™š›œžŸ ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢  ŸŸ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££ÐÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÕÕÖ×ÚÚÛÛÛÛÛÛÜÜÝßßàáâãåççççççççççææåääãâáàààààààßßßÞÞÝÝÞÝÜÜÜÜÜÛÛÛÛÛÛÛÚÚÙÙØÙÙÚÙÙÚÙØØ×ÖÖÖÖÖÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÇÆÆÃÂÁÁÁÁÁÀ¿¾¾¾½½½½½½¼¼¼»»»»»»ºº¹¹¹¹¹¹¹¹¹¸··¶µµ´´´´³³²±¯®®­¬«ª©©¨¨¨¨¨¨§§¦¥¥¤¤¤¤¤¤¤£££££££££££££££¢¢¢¢¢¢¡Ÿœ›ššš™™™˜—––•••••””“’‘ŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽ‘‘’’“””••••••••••••••••••••••••”””““’’’‘‘‘‘‘‘‘‘‘‘’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’“””•••••––––—˜™™™š››žŸ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££ÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÕÕÖØÙÚÛÛÛÛÛÛÜÜÝÞßàáâäæçççççççææååäääãâááààßßßßààßßßßßßÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÙØ××ÖÖÖÖÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÌÈÇÆÄÂÂÁÁÁÁÁÀ¿¾¾¾¾½½½½½½¼»»»»»»ººººº¹¹¹¹¹¹¹¹¸·¶µ´´´´³³²±°®®­­¬«ª©¨¨¨¨¨¨¨§¦¦¥¤¤¤¤¤¤¤¤££££££££££££££££¢¢¢¢¢¡žœ››šš™™™˜—––•••••””“’‘ŽŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘‘‘’“””•••••••••••••••••••••••••””””““’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’’’’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’’“””••••••––—˜˜™™™šš›œŸ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££¢¢¢£¢¢¢¢¢£££££ÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÕÕÕÖØÙÚÛÛÛÛÛÛÜÜÝÞßàáâåæçççççæååäãããããâááààßßßßßßßààßßßßßÞÝÜÜÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙØ××ÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÏËÈÆÆÃÂÂÁÁÁÁÁÁÀ¿¾¾¾½½½½½½¼¼¼»»»»»»ºººº¹¹¹¹¹¹¹¸¶¶µ´´´´³²²±¯®®®­¬ª©©¨¨¨¨¨¨§¦¦¦¥¤¤¤¤¤¤¤¤££££££££££££££££¢¢¢¢¢¡Ÿžœœ›šš™™™˜—––••••••”“’‘ŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘‘’““””••••••••••••••••••••••••••”””““’’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’’’’““’‘‘‘‘‘‘‘‘‘‘‘’’’’““““””••••••–——˜˜™™™šš›œŸ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££££¢¢¢¢£££££ÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÔÔÔÕÕÖÖ×ÙÚÛÛÛÛÛÛÜÜÝÞßàáâåççççæåååäããâââááààààßßßßßßßßààààßßÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÚÚÚÙ××ÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÏÊÇÆÅÃÂÂÁÁÁÁÁÁÀ¿¾¾¾¾½½½½½½¼¼»»»»»»»»ººº¹¹¹¹¹¹·¶µ´´´´³³²²±°¯®­¬«©©¨¨¨¨¨¨¨§§¦¦¥¤¤¤¤¤¤¤¤¤££££££££££££££¢¢¢¢¢¢ Ÿžœ›šš™™™˜—––••••••”“’‘ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘‘’“””””•••••••••••••••••••••••••”””““’’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’““““””“’’‘‘‘‘‘‘‘‘‘’’“”””””•••••••–—˜˜™™™™šš›œž¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££££££££££££££ÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÔÔÔÕÕÖÖ×ÙÚÛÛÛÛÛÛÛÜÝÞßàáâåæææåääãããââáááàààààßßßßßßßßßßßààßßÞÝÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÚÚÚØ××ÖÖÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÍÉÇÆÅÄÃÂÂÁÁÁÁÀ¿¿¾¾¾¾¾½½½½½¼¼¼¼»»»»»»ººº¹¹¹¹¹¸¶µ´´´´³³²²²°¯®®­«ª©©¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤£££££££££££££¢¢¢¢¢¢¢ žžœ›š™™™˜˜—––••••••””’‘ŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒ‘‘‘’“““””••••••••••••••••••••••••••”””““’’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’“”””””“’’’’’‘‘‘‘’’“””••••••••••–—˜˜™™™™šš››œžŸ¢¢¢¢¢¢¢¢¢¢¢¢££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££££££££££££££ÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖ×ØÚÚÛÛÛÛÛÛÜÝÞßßáâåæåäãããââââáááàààßßßßßßßßßßßßßßßßßßßÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚØ××ÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÏËÉÇÆÆÄÃÂÂÁÁÁÁÀ¿¾¾¾¾¾¾¾½½½½½½¼¼»»»»»»ººº¹¹¹¹¹·µµ´´´´³³²²±°¯®­¬ª©©¨¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤£££££££££££££¢¢¢¢¢¢¢¡ žž›šš™™™˜——––••••••”“‘ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘‘‘‘’“““””••••••••••••••••••••••••••””““’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’”””””””“““’’‘‘‘‘’’“”••••••••••–—˜˜™™™™šš›››ž¡¢¢¢¢£¢¢¢¢¢¢¢££££¢¢¢¢¢¢¢¢££¢¢¢¢¢££££££££££££££££££££ÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÖÖØÙÚÛÛÛÛÛÛÜÝÞßßáãäääããââáááááááààßßßßßßßßßßÞÞßÞÞßÞÞÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØ×ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÍÊÈÇÆÅÄÃÂÁÁÁÁÁÀ¿¾¾¾¾¾¾¾¾¾½½½½¼¼¼»»»»»ºººº¹¹¹·¶µ´´´´³³²²²°¯®®¬«ª©©¨¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤£££££££££££¢¢¢¢¢¢¢¢¢ Ÿžœšš™™™˜˜˜——–•••••”“’‘‘ŽŽŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘‘’’’’“““”””•••••••••••”””••••••••••••””“’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’“””••”•”””““’’‘‘’’“””•••••••••–—˜˜™™™™šššš›œŸ¢¢¢¢£££¢¢¢¢£££££££¢¢¢¢¢¢¢£££¢¢¢£££££££££££££££££££££ÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖ×ØÚÛÛÛÛÛÛÜÜÝßàáâããããââááààáààààßßßßßßßßßßÞÞÞÝÝÝÞÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÓÓÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÐÏÌÉÈÇÆÅÄÂÂÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾¾¾½½½½½¼»»»»»»»ºº¹¹¸¶µ´´´´³³³²²±°¯®­¬ªª©©¨¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤£££££££££££¢¢¢¢¢¢¢¢¢¢Ÿ›šš™™™˜˜˜——–•••••”“’‘‘ŽŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘‘’’’“““““”””””••••••”””””””””•••••••••””“’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’’“”•••••••”””“’’’’“””•••••••–––—˜˜™™™™™šššš›œ ¢¢¢££££££££££££££££¢¢¢¢¢¢££££££££££££££££££££££££££¤ÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖ×ØÚÚÛÛÛÛÜÜÜÝßßàáââããââáààààààààßßßßßßßßßßßÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØ××ÖÖÖÖ××××Ø×××××ÖÖÕÕÕÕÖÖÖÖÖÕÕÔÔÓÓÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÐÏËÉÈÇÆÅÃÂÂÁÁÁÁÁÁ¿¿¾¾¾¾¾¾¾¾¾¾½½½½¼¼¼»»»»»º¹¹¹·¶µ´´´´³³³²²²°®®­«ªª©©©¨¨©¨¨¨¨¨¦¦¥¥¤¤¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢¢¢¢Ÿœ›š™™™™˜˜—––••••”““’‘‘ŽŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘‘’’““““““”””””””••••”””“““””””””••••••••”“’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’’’“”••••••••”””““’“””•••••••–——˜˜™™™™™™ššš››œŸ¢¢¢¢£££££££££££££££££££££££££££££££££££££££££££££££¤¤ÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÔÔÔÔÕÕÕÖ×ØÙÚÛÛÛÛÜÜÜÝßßàááââããááàààßßßààßßßßßßßßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙØ××××××××ØÙÙÙÙÙØØ×ÖÖÖÖ×××××ÖÕÕÔÔÓÓÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÐÎÌÊÈÆÆÄÃÂÂÂÁÁÁÁÁÀ¿¿¿¿¿¾¾¾¾¾¾¾¾½½½½½½¼»»»º¹¹¸·¶µ´´´´³³³²²±¯®®­¬««ª©©©©©¨¨¨¨§¦¦¥¥¤¤¤¤¤¤¤¤¤¤££££££££££££££¢¢¢¢¢¢ œ›š™™™™˜˜—–•••••””“’’‘ŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹ŒŒŒŒŒŒŽ‘‘‘’’““”““””””””””””•••”””“““““””””•••••••””“’’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’’’’“”••••••••••”””””””•••••••–—˜˜˜™™™™™™šš››œœŸ¢¢¢¢££££££££££££££££££££££££££££££££££££££££¤¤¤£££¤¤¤¤ÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÔÔÔÔÕÕÕÖ××ÙÚÛÛÛÛÜÜÜÝßßßàááâââáààààßßßßààààßßßßßßßÞÞÝÝÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙØØ××××ØØÙÚÚÙÙÙÚÚÙØØØØÙØØØØ×ÖÕÕÔÔÓÓÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÐÍËÉÈÆÆÅÄÃÂÂÁÁÁÁÁÁÀÀÀÀ¿¿¿¿¿¾¾¾¾¾½½½½½¼»»º¹¹¹¸·¶µ´´´´³³³²²±°¯®­¬¬««ªªª©©¨¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££¢¢¢ žœœ›š™™™˜˜––•••••”““’’‘‘ŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘‘‘‘‘‘’’““”””””””•••””””””••”””“““““””””•••••••”””“’’’’‘‘‘‘‘‘‘‘’’’’’’’’’“““““””•••••••••••••••••••••••–——˜˜™™™™™™šš›œœžŸ¢¢¢¢¢£££££££££££££££££££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¤ÐÐÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÕÕÖ×ØÙÚÛÛÛÛÛÜÜÝÞßßààáááááàààßßßßßßàßßßßßßßÞÞÞÝÝÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙÙØØØØØÙÚÚÚÙÙÙÚÚÚÚÙÙÙÙØØÙÙ×ÖÖÕÔÔÔÓÓÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÎÍËÉÇÇÆÆÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¾¾¾¾¾½½½¼»»º¹¹¹¹·¶µ´´´´³³³²²±°¯®­­­¬¬««ª©©¨¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤¤¤¤££¤£££££££££££££¢¢¢¡Ÿœ›š™™™˜—––•••••”“’’’‘ŽŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘‘‘‘‘‘’’“”””••••••••••””””””••””””““““”””••••••••”””“““’’’’‘‘’’’’’“““““““””””””••••••••••••••••••••••••––—˜˜™™™™™ššš›œž ¢¢¢¢¢£££££££££££££££££££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¤¤ÐÐÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÖ×ØÙÚÛÛÛÛÛÜÜÝÝßßßààááááàààßßßßßßßßßßßÞÞÞÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÜÜÜÜÛÜÜÜÛÛÜÜÜÛÛÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÚÚÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙØ×ÖÕÕÔÔÔÓÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÍÊÉÈÇÆÆÅÄÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÀÀÀ¿¿¿¾¾¾½¼»»ºº¹¹¹¹·¶µ´´´³³³³²²±°¯®®®®­­¬«ª©©¨¨¨¨¨¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££¢¢¢¢Ÿœšš™™˜˜—––••••””“““’‘‘ŽŽ‘‘’’’’’‘’’””•••••••••••••••••”””•”””””””””””••••••••••”””“’’’’’’’““““““””””””””•••••••••••••••••••••••••–––—˜˜™™™™™ššš››œžŸ ¢¢¢¢¢££££££££££££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ÐÐÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÕÕÕÕÖÖ×ØÚÚÛÛÛÛÛÜÜÜÝÞßßààááááàààßßßßßßßßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÚÚÚÚÚÚÚØ××ÖÕÕÔÔÔÓÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÍËÊÉÇÆÆÆÄÃÃÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÀ¿¾¾½½¼»»ºº¹¹¹¹·¶µ´´´³³³³²²±°¯¯®®®®­­«ª©©¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££¢¢¢¡›š™™™˜˜—–••••”””““’‘‘‘ŽŽŽŽŽŽŽŽŽŽŽ‘‘’““““’’““”•••••••••••••••••••”””••””””””””””••••••••••”””““““““”””””””•••••••••••••••••••••••••••••••–––—˜˜˜™™™™šššš››œŸ¡¢¢¢¢¢£££££££££¤¤¤¤¤¤££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ÐÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖ×ØÙÚÛÛÛÛÛÛÜÜÜÝÞßßààááááàààßßßßßßßßßÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÚÚÙØ××ÖÕÕÔÔÔÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÐÏÍËÊÈÇÆÆÆÅÄÄÄÄÃÃÃÂÂÂÂÁÁÁÁÁÁÁÁÀ¿¾¾½½¼»»»º¹¹¹¸·µµ´´´´³³³²²±°°¯®®®®­¬«ª©©©¨¨¨¨§¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££¢¢ ›š™™™˜˜—–•••••””“’‘‘‘‘ŽŽŽ‘’““””““““””••••••••••••••••••••••”••••••••””””••••••••••••””””””””””””••••••••••••••••••••••••••••••–––——˜˜˜™™™™™šš›››œœž ¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤££¤££¤£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥ÐÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÕÕÖÖ×ØÙÚÚÛÛÛÛÛÛÜÜÝÞÞßßàááááàààßßßßßßßßßßÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÝÝÝÝÜÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØ×ÖÕÕÔÔÔÔÓÓÓÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÍËÉÈÇÇÆÆÆÆÆÅÅÅÄÄÃÂÂÂÂÁÁÁÁÁÁÀ¿¾¾½½¼»»»º¹¹¹·¶µµ´´´´´³³²²²±°¯®®®®®­«ªª©©¨¨¨¨§¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££¢¢¢Ÿ›š™™™˜˜––••••••”“’’‘‘‘‘’“””••”””””•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••––––——˜˜™™™™™™ššš››œœžžŸ¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥ÐÑÑÑÑÑÑÑÑÒÒÓÓÓÓÔÔÕÕÕÖ×ØÚÚÛÛÛÛÛÛÛÜÜÝÞßßßàááààààßßßßßßßßßßÞÞÝÝÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÝÝÞÝÝÝÝÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØ××ÖÕÕÕÔÔÓÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÐÐÐÍËÊÉÈÈÇÇÆÆÆÆÆÆÅÄÃÃÂÂÁÁÁÁÁÀ¿¿¾¾¾½½»»ºº¹¹¸··µ´´´´´´³³²²²±¯®®®®®®­«ªª©©¨¨¨¨¨¦¦¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££¢¢¢Ÿœ›š™™™˜—––••••••”“’’’‘‘‘’“””•••••••••••••••••••••••••••••••••••••••”••••••••••••••••••••••••••••••••••••••••••••••••••••–––––———˜˜™™™™™™šš››œžŸŸ ¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¦ÐÑÑÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÖ×ÙÚÚÛÛÛÛÛÛÛÜÜÜÞßßàààààààßßßßßßßßßßßÞÝÝÜÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÜÜÜÝÞÞÞÞÞÞÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØ××ÖÕÕÕÔÔÓÓÓÒÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÍÌËÊÊÉÉÈÈÇÇÆÆÆÅÃÃÂÂÁÁÁÁÁÀ¿¿¾¾¾½¼»»º¹¹¹¸·¶µ´´´´´´³³²²±°¯®®®®®®­¬«ª©©¨¨¨¨§¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££¢¢¡žœ›š™™™˜—––•••••””“’’’‘‘‘‘‘‘‘’“”•••••••••••••••••––•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••––———˜˜˜˜™™™™šššš›œœŸ  ¡¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¦¦¦¦¦§ÐÐÑÑÑÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÖØÙÚÚÛÛÛÛÛÛÛÜÜÝÞßßàààààààßßßßßßßßßßÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßßÞÞÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØØ×ÖÕÕÔÔÓÓÓÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÍÌËÊÈÈÇÆÆÆÄÃÂÂÁÁÁÁÁÀ¿¿¾¾½½¼»ºº¹¹¹¹·¶µµ´´´´´´³²²°¯¯¯¯®®®®­­«ª©©¨¨¨¨§§¦¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££¢¢¡žœ›š™™™˜—–••••••””““’’‘‘‘‘‘‘‘‘‘’’’’”••••••••••••••••••–––•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••–––—˜˜˜™™™™™ššš››œžŸ¡¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¦¦§¨¨¨¨¨ÐÐÑÑÑÑÑÑÑÑÑÒÒÓÓÓÔÔÕÕÖØÙÚÚÚÛÛÛÛÛÛÛÜÝÞßßààààààßßßßßßßßßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÞÞßßßßÞÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÙØ×ÖÕÕÔÔÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÊÈÈÇÆÆÅÃÂÁÁÁÁÁÁÀ¿¿¾¾½¼»»ºº¹¹¹¸·¶µµ´´´´´³³²±°°°¯¯¯®®®®­«ª©¨¨¨¨¨¨¦¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££¢¢¢¡žœ›š™™™˜˜––••••••”“““’’’’‘‘‘‘‘’“”””•••••••••••••••••––––––•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••––––—˜™™™™™™š›››œœŸ ¢¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦§¨¨¨¨¨¨¨ÐÐÑÑÑÑÑÑÑÑÑÒÒÓÓÓÔÔÕÕ×ØÚÚÚÚÛÛÛÛÛÛÛÜÝÞßßààààààßßßßßßßßßßßßÞÝÝÝÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞÞÞßßßßßÞÞÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚØ×ÕÕÔÔÓÓÓÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÈÇÆÄÃÂÁÁÁÁÁÁÁ¿¾¾½½¼»»ººº¹¹¸·¶µµµ´´´´³³²²²±°°°¯¯¯®®­«ª©©¨¨¨¨¨§§¦¦¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££¢¢¢¢žœ›šš™™™˜—–•••••••”””“”“’’’‘‘‘‘‘‘‘’””••••••••••••••••••–––——–––••••••••••••••••••••••••••••••––•••••••••••••••••••••••••••••••••••••••––––—˜˜™™™™šššœŸ ¡¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¦¦¦§¦¦¦¦¦¦¦¦¦¦¦¦¦¦§§¨¨¨¨¨¨¨¨¨¨ÐÑÑÑÑÑÑÑÑÑÑÑÒÓÓÓÔÔÕÖ×ØÚÚÚÚÛÛÛÛÛÛÜÜÝÞßàààààààßßßßßßßßßßßßÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÝÞÞÞßßßßßßßÞÞÝÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚ×ÖÕÕÔÔÓÓÓÓÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÄÃÂÂÁÁÁÁÁÀ¿¾¾½½¼»»»ºº¹¹¸·¶¶µµ´´´´³³³²²²±±°¯¯¯¯®¬«ª©©¨¨¨¨¨¨¨§¦¦¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤££££££¢¢¢¢¢Ÿœšš™™˜˜—––•••••••••””””“’’’‘‘‘‘‘‘‘‘’“”••••••••–––•••••••–––——˜——–––•••••••••–••••••••••••••••••–——––––––––••••••••••••••••••••••••••––––––––—˜˜™™™™šš›œžŸ  ¢¢¢¢¢¢¢£££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦¦¦¦§¨¨¨¨¨¨¨¨¨¨§§¨¨§¨¨¨¨¨¨¨¨¨¨¨¨¨©©ÐÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÔÔÕÕÖØÚÚÚÛÛÛÛÛÛÛÜÜÝßßàááàààßßßßàßßßßààßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÜÜÜÜÜÜÛÛÛÛÜÜÜÜÝÝÝÞÞÞßßßßßßßÞÞÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÞÞÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚØ×ÖÕÔÔÔÔÓÓÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏËÈÇÆÅÃÂÂÁÁÁÁÁÀ¿¾¾½½¼»»»º¹¹¹¸··¶¶µµ´´´´³³²²²²±±°°¯®­¬ªª©©¨¨¨¨¨¨¨¨§§¦¦¦¦¥¥¥¥¤¤¤¤¤¤¤¤££¤£££££¢¢¢¢¢ ›šš™™™˜—––••••••••••••”””“’’‘‘’’’““”•••••••––——–––––––––——˜˜˜˜——–––––•••–––––••••••••••–•••–––——˜˜˜—————––•••••••••••••••••••••••––––––———˜˜˜™™™™šš›Ÿ¡¢¢¢¢¢¢¢¢£££££££££££¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¥¥¥¥¦§§§§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©©©ÑÐÐÑÑÑÑÑÑÑÑÑÒÒÓÓÔÔÕÕÖ×ÚÚÛÛÛÛÛÛÛÛÜÜÝÞßàáááààßßßàààßàààààßßßßßßßßßßßßßßßÞÞßßßÞÞÞÞÝÝÜÜÜÜÛÛÛÛÜÜÜÜÜÝÝÝÞÞßßßßßßßßÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÞßßßÞÞÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÙ×ÖÕÕÕÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÎËÈÇÆÅÄÂÂÂÁÁÁÁÀ¿¾¾½½¼¼»»º¹¹¹¹¸¸·¶µµ´´´´³³³³²²²²²±¯®­¬«ª©©¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤¤¤££££££¢¢¢¢¢Ÿœ›š™™™™˜—–––••••••••••••••”““““””••••••••–––—˜˜˜˜——––————˜˜˜˜˜˜—————–––––——––••••••••––––––––—˜˜˜˜˜˜˜˜˜—––••••••••••–––••••••••––––—————˜˜˜˜™™™™šš›œ ¢¢¢¢¢¢¢¢£££££££££££¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¥¦¦¦¦¨¨¨¨¨¨¨¨¨¨¨©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©ªªªªÐÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÔÔÕÕÖ×ÚÚÛÛÛÛÛÛÛÛÜÜÝÞßààááàààßßààààààáàààßßßßßßßßßßßßßßßßßßßßßßÞÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÞÞßßßßßßßßÞÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÞÞßßßßßßÞÞÝÝÝÜÜÝÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÙØ×ÖÕÔÔÔÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÎËÊÇÆÅÄÃÃÂÁÁÁÁÁ¿¾¾½½½»»ºº¹¹¹¹¹¹·¶µµ´´´´´´³³³²²²²°¯®­¬«ª©©¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤¤£££££££¢¢¢¢¢žœ›š™™™™˜—––––•••••••••••••••••••••••••–––—˜˜™™™™˜˜˜˜˜˜˜˜˜˜˜˜˜˜—————————˜˜——––––––––––——–———˜˜˜™™˜˜˜˜˜˜—––––••••••••–––—–––––––––——˜˜˜˜˜˜™™™™™™šš›œŸ¢¢¢¢¢¢¢££££££££££££¤¤¤¤¤¤¤¤¥¥¥¦¦¦¦¦¦§§¨¨¨¨¨¨¨¨¨©©©©©©©©©©©¨¨©©©©©©©©©©©ªª««««ÐÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÔÔÕÕÖ×ÚÚÛÛÛÛÛÛÛÜÜÝÝßßßàááàààßßßàààààààààßßßßßßßßßßßßßßßßßßßßßßßßÞÞÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞßßßßßßßßßÞÞÝÝÝÝÝÝÝÝÝÝÝÞÞßßßßßßßßßßÞÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÙ×ÖÕÕÔÔÔÔÓÓÓÓÓÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÌÉÇÆÆÄÄÃÂÂÁÁÁÁ¿¾¾¾½¼»»»º¹¹¹¹¹¸·¶µµ´´´´´´´³³³³²²°®®­­«ª©©©©©©©¨¨¨¨¨¨¨¨¦¥¥¤¤¤¤¤¤¤¤¤£££££££££¢¢¢¢¢žœ›šš™™™˜˜——––••••••–•••••••••••••••–––——˜˜™™™™™™™™™™™˜˜™˜˜˜˜˜———˜˜˜˜˜˜˜˜———————˜˜————————˜˜™™™™™™™™˜˜——–––––••••••–––—————–————˜˜˜˜™™™™™™™™™šššœž¡¢¢¢¢¢¢££££££££££££¤¤¤¤¤¤¤¤¥¥¥¦¦¦§¨¨¨¨¨¨¨¨¨¨¨¨¨©©©ª«ªªªªªª©©©©ªªªªªªªª««««¬¬¬¬ÐÐÑÐÑÑÑÑÑÑÑÑÒÓÓÓÔÔÕÕÖØÚÚÛÛÛÛÛÛÛÜÜÝÝÞßßßßßàßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÝÝÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞßßßßßßßßßßßÞÞÞÞÞßßßÞÞßßßßßàààßßßßßßÞÞÞÞÞÞßßÞÞÝÝÝÝÝÝÜÜÜÜÜÛÛÛÛÛÛÚÚØ×ÖÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÌÉÇÆÆÆÄÃÂÂÁÁÁÁ¿¾¾½½¼»»»ºº¹¹¹¹¸·¶µµµµ´´´´´´³³³²²°¯®®­¬«ªªª©©©©©©¨¨¨¨¨§¦¥¤¤¤¤¤¤¤¤¤££££££££££¢¢¢¢¡ž›šš™™™™˜˜˜˜———–––––•••••••••––––————˜˜˜™™™™™™™™™™™™™™™™™™˜˜˜˜˜˜˜˜˜˜™™˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™™™™™™˜˜˜———––––––•––––——˜˜˜˜˜˜˜˜˜˜™™™™™™™™™™™šš›œŸ¡¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦§¨¨¨¨¨¨¨¨¨¨¨¨©©ªªª««««««««ªªªª««««¬¬¬¬¬¬¬¬­­­­ÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÕÖ×ØÚÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßßßßßÞÝÞÞÞÞÞßßßßßÞÞÞÞÞßßÞßßßßßßßßßßßßÞÞÞÞßÞÝÝÜÜÜÜÜÜÜÝÝÜÝÝÝÝÝÝÞßßßßßßßßßßßßßßßßßßßßßßßàààáààààààßßßßßßßßßßßßßßßßÞÝÝÜÜÜÜÜÜÜÛÛÛÛÛÚÙØ×ÖÖÕÕÕÕÔÔÔÔÓÓÓÒÒÑÑÐÐÐÐÐÐÐÐÍÊÈÇÆÆÄÃÂÂÁÁÁÁ¿¾¾½½¼»»»ºº¹¹¹¹¹··¶¶¶µ´´´´´´³³³²²±¯¯®®­­¬¬«ªªªª©©¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤£££££££££¢¢¢¢¢¢¢Ÿžœ›šš™™™™™™˜˜˜˜˜˜˜——–––––––———˜˜˜˜˜˜˜™™™™™™™š™™™™™™™™™™™™™˜˜˜˜˜™™™™™™˜˜˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™˜˜˜˜———––––––––——˜˜˜˜˜˜˜˜˜™™™™™™™™™™™ššš›œž¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦¦§¨¨¨¨¨¨¨¨¨¨¨©©ªª««««¬¬¬¬¬¬¬¬«¬¬¬¬¬¬­­­­­­­­­®®®ÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÕÖ×ØÚÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÝÝÝÝÝÝÝÜÜÝÜÜÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÞßßßßßßÞÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞßßßßßßßßßßßßßßßßßààààààáááááààààààßßßßßààààààààßßßÞÞÝÝÝÝÝÜÜÜÜÛÛÛÛÛÚÚÙØ×ÖÖÖÖÕÕÕÔÔÔÓÓÒÑÑÑÐÐÐÐÐÐÐÎÊÈÇÆÆÅÄÂÂÁÁÁ¿¾¾¾½½¼»»»ºº¹¹¹¹¹¹¸·¶¶µ´´´´´´³³³²²±°¯®®®­­­¬¬«ª©©¨¨¨¨§¦¥¥¤¤¤¤¤¤¤¤£££££££££¢¢¢¢¢¢¢¢¡Ÿœ›šš™™™™™™™™™˜˜˜˜———–——˜˜˜˜˜˜™™™™™™™™š™™™ššššš™™™™™™™™™™™™™™™™™™˜˜˜˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™™˜˜˜˜˜˜˜———–––––———˜˜™™™™™™™™™™™™™™™™šš››œœŸ¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦¦§§¨¨¨¨¨¨¨¨¨¨©©©©ªª«««««««¬¬¬¬¬¬­¬¬¬¬¬­­­­­­­®®®®®ÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÔÔÕÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞÞßßßßßßßßßßßßßàààààáááââââââááààáááààààààáááâááààßßßßßÞÞÞÞÝÝÝÜÜÜÜÛÛÛÛÛÚÚÚÙØØ×ÖÖÕÕÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÏËÉÇÆÆÆÃÂÂÁÁÁ¿¾¾¾½½¼»»»ºº¹¹¹¹¹¹¹·¶µµ´´´´´´³³³²²±°¯¯®®®®­­¬ª©©¨¨¨¨§¦¥¥¤¤¤¤¤¤¤££££££££££¢¢¢¢¢¢¢¢¢¢ žœ›ššš™™™™™™™™™˜˜˜˜˜˜˜˜™™™™™™™™™™™ššš™™™šššššššš™™™™™™™™™™™™™™™˜˜˜™™™™™™™™™™™™™™™™™™™š™™™™™™™™™™˜˜˜˜˜˜˜————–———˜˜˜™™™™™™™™™™™™šššššš››œž ¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¥¥¦¦¦¦§§§¨¨¨¨¨¨¨¨¨¨¨©©©©ªªª«««««¬¬¬««««¬¬¬¬¬­­­­­­®®®®®®®ÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÖ×ÙÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞßßßßßßßßßßßßààááâââãäåäääãâââââââááááâââãããâááààßßßßßßßßßÞÞÞÞÝÝÜÜÛÛÛÛÛÚÚÚÚØ×ÖÖÕÔÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐËÉÈÇÆÆÄÃÂÁÁÁ¿¾¾¾½½¼»»»ºº¹¹¹¹¹¹¹·¶µµ´´´´´´³³³²²²±°¯¯®®®­¬«©©¨¨¨¨¨§¥¥¤¤¤¤¤¤¤£££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢ žœ››ššššš™™™™™™™™™™™™™™™™™™™™™™™šššššššššš›ššššš™™™™™™™™™™™™™™™™™™™™™™™™ššššš™™™™šššššššš™™™™™™™™˜˜˜˜˜˜˜˜——˜˜˜˜˜™™™™™™™™™™™™™šššš›››œžŸ¡¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¥¥¥¦§§§§¨¨¨¨¨¨¨¨¨¨¨¨©©©©ªªªªª««««¬¬¬«««««««¬¬­­­­­®®®®®®®®ÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÖ×ÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÞÞßßßßßßßßßàááããääåæççæååäããäääããããääåååäããââááààààßßßßßßßßßßßÝÜÜÛÛÛÛÛÛÛÚÚØ×ÖÕÕÔÓÓÓÒÑÑÑÐÐÐÐÐÐÐÐÐÌÊÈÇÆÆÄÂÂÁÁÁ¿¿¾¾½½¼»»»ººº¹¹¹¹¹¸·¶µµµ´´´´´³³³³²²²°¯¯®®®­«ª©¨¨¨¨¨§¦¥¥¤¤¤¤¤¤£££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡Ÿžœ››šššš™™™™™™™™™™™š™™™™™™šššš›ššššššš›››››ššš™™™™™™™™™™™™™™™™™™™™™™šššššššššššššššššš™™™™™™™™™™™˜™˜˜˜˜˜˜˜˜™™™™™™™™™™™™™™™™šš››œœž ¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¥¥¥¦¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©ªªªªªª«««¬¬¬«««««««¬­­­­­­®®®®®®¯®ÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÕÕÖØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞÞßßßßßßààáâäæççççççççççæçççææææççççççæåäããâââáááààààààààààßßÝÜÜÛÛÛÛÛÛÛÚÙ×ÖÖÕÔÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÐÎËÉÈÆÆÄÂÂÁÁÁÀ¿¾¾½½¼»»»»ºººº¹¹¹¸·¶¶µµµ´´´´´³³³²²²±°¯¯®­¬«©©¨¨¨¨¨§¦¥¤¤¤¤¤¤££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡ Ÿžœ››šššššššššššššššššššššš›››››››››››œœœ›šššš™™™™™™™™™™™™™™™™™™™™ššš›››››››››››ššššššš™™™™™™™™™™™™™™˜˜˜˜™™™™™™™™™™™™™™™™šššš›œžŸ ¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¥¥¥¦¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©ªªª«ªª«««¬««¬¬««««««¬­­­­­®®®®®®¯¯¯ÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÕÕÖØÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞßßßßàáâãäççççççççççççççççççççççççççççæååäããâãââáááááááààßÞÝÜÜÛÛÛÛÛÛÛÚØ×ÖÕÔÔÓÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÐÐÍÊÈÆÆÄÃÂÁÁÁÀ¿¾¾½½¼¼»»»»»ºº¹¹¹¹¹¸·¶¶µ´´´´´´³³³²²²±°¯®­¬«ª©©¨¨¨¨¦¥¥¤¤¤¤¤¤£££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡Ÿœœœœ››››››››œœ››››››››œœœ››››œ›œœœ››šššš™™™™™™™™™™™™™™™™™™šš››œœœœœœœ›››ššššš™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™šššššš››œžŸ¡¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¥¥¥¥¥¦¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©ªª««««««¬¬«««««¬¬¬¬¬¬­®®®®®®®¯¯°°°°ÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÔÔÕÕÖ×ÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÙÙÚÙÙÙÙÙÙØØØ×××××ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞßßßàáâäçççççççççççççççççççèèèèçççççççæææææåäããããããâáààßßÞÝÜÜÛÛÛÛÛÛÚØ×ÖÕÕÔÔÓÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÐÐÎÊÈÇÆÅÃÂÁÁÁÀ¿¾¾½½½¼¼¼»»»»ºº¹¹¹¹¹¸·¶µ´´´´´´³³³²²²±°®®­¬«©©©¨¨¨§¥¥¤¤¤¤¤¤¤£££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡ŸŸŸžžžžžžžžžžŸŸžžœœœœœžžœ›ššššš™™™™™™™™™™™™™™™™šš››œžžžžœ››››››šššššš™™™™™™™™™™™™™™™™™™™™™™™šššššš››œœžŸ ¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¥¥¦¦¦¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©ªª«¬¬¬¬¬¬¬¬¬¬«««¬¬­­­­­®®®®®®®¯¯°±±²ÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÔÕÕÖ×ØÙÚÚÚÛÛÛÛÛÛÛÛÚÚÚÙØØØØØ××××××××××Ö×ÖÖÖÖÖÕÕÖÖÖÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÞßßßàáâäçççèèèèèèèèççèèèèèèèèèèççççççççççççæååææåäãâáàßßßÞÝÜÜÛÛÛÛÛÚÙØ×ÖÕÔÔÓÓÓÒÒÒÑÑÑÐÐÐÐÐÐÐÐÐÐÎÊÈÇÆÅÃÂÁÁÁÀ¿¾¾¾½½½½½¼»»»ºººº¹¹¹¸·¶µ´´´´´´³³³³²²±¯®®­¬ª©©¨¨¨¨¦¥¥¤¤¤¤¤¤££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡   ¡¢¢¢¢¢¢¢¡ ŸŸŸ¡¢¢¡ ŸŸžžŸŸŸŸžœœ›ššššš™™™™™™™™™™™ššššš››œžžžžžœœœœ›››››ššššš™™™šššššš™™™™™™™šššššššššš››œœž ¡¢¢¢¢¢¢£££££££¤¤¤¤¤¥¥¥¦§§§§§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©©©ªª«¬­­­­­­¬¬«¬¬¬¬¬­­­­­­®®®®¯¯¯°°±²²ÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÔÔÕÕÖ×ØÙÚÚÚÚÚÚÚÚÚÚÙØ××××ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖ×ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞßßßààáâäçççèèèèèèèèèèèèèèèèèèèèèèçççççççççççççççæäâááàßßßÝÝÜÜÛÛÛÛÛÚÙØÖÕÕÔÓÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÎÊÈÇÆÅÃÂÁÁÁÁ¿¿¾¾¾½½½½¼»»»»ººº¹¹¹¹¸¶µµµ´´´´´³³³²²²°¯®®¬ª©©¨¨¨§¦¥¥¤¤¤¤¤£££££££££¢¢¢¢¢¢¢££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡ ¡ ŸŸŸŸ    žœœ››ššššššš™™™™™™šššššš››œžŸžžžžžžžžœœœœœœœœ››ššššššššššššššššššššš›››››››œžžŸ¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©©©ªª«­­­­­­¬¬««««¬¬¬­®®­­­­®®®¯¯°°±²²²ÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÕÖ×ÙÚÙÙÙÙÙÚÙÙØ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖ××ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞÞßßààáãåçççèèèèèèèèèèèèèèèèèèèèèèçççççççççççççççäãâááàßßÞÝÜÜÜÛÛÛÛÚÚÙ×ÖÕÔÔÓÓÓÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÎÊÉÇÆÅÃÂÁÁÁÁÀ¿¿¾¾¾½½½¼¼»»»»ººº¹¹¹¸·¶µµ´´´´´³³³²²²°¯®­«ª©¨¨¨¨§¦¥¤¤¤¤¤£££££££££££¢¢£££££££££££££££££££¢¢¢¢££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡¡¡¡¢¢¡Ÿœœ›šššššššššššššš›››œœœžŸ ŸŸŸŸŸžžžžŸŸžžžžœ››››››››››››››››››››œœœ››œœžŸŸ¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¥§¨¨¨¨¨¨¨¨¨¨¨¨©©©©©¨¨¨©©©©©©©©ª«¬­­­­­­­¬«««¬­­­­®®®­­®®®®¯°±±²²²²ÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÕÕÕÖØØØ×Ø×ØØØ××ÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÓÓÓÔÔÔÔÕÕÕÖÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßßßàáâäççççèèèèééèèèèèèèèèèèèèèèèèèèèèèèççççççççäãááààßßÝÝÜÜÛÛÛÛÛÚÚØÖÕÕÔÔÓÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÏÌÈÇÆÅÃÂÂÁÁÁÁÀ¿¾¾¾¾½½½½¼»»»»ºº¹¹¹¹¸·¶µµ´´´´³³³²²²±¯®­«ª©¨¨¨¨§¦¥¤¤¤¤¤££££££££££££££££££££££££££££££££££££££££¢¢¢£££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ žœ›ššššššššššš››œœžžŸ ¡¢¢¡ Ÿ   ŸŸŸŸ    ŸžŸ      ŸŸžœœœœœžŸŸ ¡¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¥¦§¨¨¨¨¨¨¨¨¨¨¨©©©©©©©©©©©©©©©©ªªª¬­­­®®®®­­¬¬¬¬­­­®®®®®®®®®¯°±²²²²³³ÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÕÕÖÖ×××××××××ÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßßààáãåæçççèèèéééééééééèèèèèèèèèèèèèèèèèèèèççççæäãâáààßÞÝÜÜÜÛÛÛÛÛÚÚ×ÖÕÔÔÔÓÓÓÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÐÐÏËÈÇÆÆÄÃÂÁÁÁÁÁÀ¿¾¾¾¾½½½½¼»»»»ºº¹¹¹¹¹·¶µ´´´´³³³²²²±¯®­«ª©¨¨¨¨¨¦¥¤¤¤¤¤¤££££££££££££££££££££££££££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡ Ÿžœ››››››››œœœœžŸ  ¡¢¢¢¢¢¢¢¢¢¢¢¡¡¡¡¢¢¢¢¡¡¢¢¢¢¢¢¢¢¢¢¢¡ ŸŸžŸŸŸŸŸŸŸ Ÿ    ŸŸŸ Ÿ  ¡¡¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¦§¨¨¨¨¨¨¨¨¨¨¨©©©©©ªªªªªªª«ªªªªªª«¬¬­®®®®®®®­­­­®®®®®®®®®®®¯¯°±²²²³³³ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖ×ÖÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÖ×ØÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßààáãäåçççèèèèéééééééééééééèèèèèèèèèèèèèèèçççççåãââàßßÞÝÜÜÛÛÛÛÛÛÚÙ×ÕÕÔÔÔÓÓÓÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÎÊÉÈÆÆÄÃÂÂÁÁÁÁÀ¿¿¾¾¾¾½½½¼»»»»ººº¹¹¹¹·¶µ´´´´´³³³²²°¯®­«ª©©¨¨¨§¥¤¤¤¤¤¤¤££££££££££££££££££££££££££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡ žœœœœœœœžžŸ ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡¡¡¡¡¡¢¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¦¨¨¨¨¨¨¨¨¨¨¨©©©©©©ª«¬¬«««¬¬¬««ªª«¬­­­®¯°¯¯®®®®®®®®®®®®®®®®¯¯°±²²²²³³³ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÓÔÔÔÕÕÕÖÖÖÖÖÖÖÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÖ×ØÙÙÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞÞßßààáâãåçççèèèèéééééééééééééééèèéééééèèèèèèçççççæäãáàßßÞÝÜÜÛÛÛÛÛÛÚÙÖÕÕÔÔÔÓÓÓÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÏÌÊÈÆÆÄÃÂÂÁÁÁÁÁ¿¿¾¾¾¾¾½½¼»»»»»ºº¹¹¹¹·µµ´´´´´³³³²±°¯®­¬ª©¨¨¨¨¦¥¥¤¤¤¤¤¤¤¤£££££££££££££¤¤£££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ŸžžžžŸ  ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡¡¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¦§¨¨¨¨¨¨¨¨©©©©©©©©ªª«¬­­­­­­­­¬««¬­­­®®¯°°¯®®®®®®®®®¯¯®®®®¯¯°±²²²²³³³³ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÕÕÔÔÔÔÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÕÕÖÖ×ØØØÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßßßàáááãåçççèèèèéééééééééééééééééééééééèèèèèççççççäâáàßßÞÝÜÜÛÛÛÛÛÛÚØÖÕÕÕÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÎÊÈÆÆÅÄÃÂÂÁÁÁÁÀ¿¿¾¾¾½½½¼¼¼»»»ººº¹¹¹·¶µ´´´´´³³²²±¯¯®®­ª©¨¨¨¨¦¥¥¤¤¤¤¤¤¤¤£££££££££££¤¤¤¤¤¤£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢¢¢¢¡ ŸŸžžžžžžžŸ ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¦¨¨¨¨¨¨¨¨¨©©©©©©ªªª«¬­®®®­­­­­­­­­­®®®¯°±±°¯¯®®®®®®®¯¯¯¯¯¯¯°°²²²²²³³³³ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÔÔÔÔÕÕÕÖÖÕÕÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÕÕÕÖ×××ØØØØÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÝÝÞßßßààááãæççççèèèééééééééééééééééééééééééèèèèèççççæãâààßßÞÝÜÜÛÛÛÛÛÛÚØÖÕÕÕÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÐÐÐÐÐÐÐÐÏËÈÇÆÆÅÄÂÂÁÁÁÁÁÀ¿¾¾¾½½½½½¼¼»»»º¹¹¹¹·¶µ´´´´´³³²²±°¯®®¬ª©¨¨¨¨§¥¥¤¤¤¤¤¤¤¤¤¤£¤¤¤¤££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢¢¢¢¡ ŸŸžŸ Ÿ  ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¥¥¦¨¨¨¨¨¨¨¨©©©©ªªªª««¬­­®®®®®®®®®®­­®®®¯°°±±±°¯¯¯¯¯¯¯¯°¯¯¯¯¯°°°²²²²³³³³³ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÔÔÔÕÕÕÖÖ×××××ØÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÝÝÞßßßßààáâäçççççèèèéééééééééêêêêêêêêêêêéééééèèèèççççæäâààßßÞÝÜÜÜÛÛÛÛÛÚÙ×ÖÕÕÕÔÔÔÔÓÓÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÍÊÈÇÆÆÄÃÂÁÁÁÁÁÀ¿¾¾¾¾½½½½½¼»»»ºº¹¹¹¸¶µµ´´´´³³³²²±¯®­«ª©©¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢¢¢¢¡¡¡¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¥¥¦¨¨¨¨¨¨¨©©©ªªª«««¬¬­®®®¯¯®®®®®®®®®®®¯°±±±±±±±°°°°°°°°°°°°°°°±²²²²³³³³³ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖ×Ö××ØÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßßààáâãåæçççèèèèééééééééêêêêêêêêêêêêêêéééèèèèèççççäâáàßßÞÝÝÜÜÜÛÛÛÛÚÚØÖÖÕÕÕÔÔÔÔÔÓÓÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÎËÉÈÆÆÅÄÂÂÁÁÁÁÀ¿¿¾¾¾¾½½½½¼»»»ºº¹¹¹¹¶µµ´´´´´³³²²±°®­¬ªª©¨¨¨§¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££££££££££££££££££££££¢¢¢¢¢¢££££££££££££££££££££££££¢¢¢¢¢¢¢££££££££££££¤¤¤¤¤¤¥¦§¨¨¨¨¨¨©©©ªª«¬­­­­­®®¯°°°°°°¯¯®®®®¯¯¯°±±±²±²²²²²²²±±±±±±±°±±²²²²³³³´´³ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÖÖÖÖÖØÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞßßßààâãååæçççèèèèééééééêêêêêêëëëëêêêêêêêééèèèèèççççåâáàßßßÞÝÝÜÜÛÛÛÛÛÚÙ×ÖÖÕÕÕÕÔÔÔÔÔÓÓÓÒÑÑÑÐÐÐÐÐÐÐÐÐÌÊÈÇÆÆÄÃÂÁÁÁÁÁÁÀ¿¾¾¾½½½½¼¼»»ºº¹¹¹¹·¶µµ´´´´³³³²±¯®®­«©©¨¨¨¨¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££££££££££££££££££££££££££££££££££££££££££££¤¤££££¤£££££££££££££££££££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©ªª«¬­­®®®®¯°°±±²±±²±°¯®¯¯¯°°±±²²²²²²²²²²²²²²²²±±±±²²²²³³³³´´´ÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÖÖÖ×ØØÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞßßàáâääåççççèèèèéééééêêêêêëëëëëëëëëêêêéééèèèèèççççåãáààßßßÞÝÜÜÜÛÛÛÛÛÚÙØ×ÖÖÕÕÕÕÕÔÔÓÓÓÒÒÑÑÐÐÐÐÐÐÐÐÏÍÊÉÇÆÆÅÃÂÂÁÁÁÁÁÀ¿¾¾¾¾½½½¼»»»ºº¹¹¹¹··¶µ´´´´³³³²²°¯®¬ª©¨¨¨¨¨§¦¦¥¥¥¥¤¤¤¤¤¤¤¤¤¤¥¥¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££¢¢¢¢¢¢¢¢¢¢¢£££££££££¤¤¤£££££££££££££££££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©ªª««­®®®¯¯°±±²²²²²²²²±°¯¯°°±±²²²²²²²²²²²²²²²²²²±±²²²²²²²³³³³´´ÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖ××ØØÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞßßàáãäåæçççèèèèèéééêêêêêëëëëëëëëëëëêêêéééèèèèèèçççåãááààßßßÝÝÜÜÛÛÛÛÛÛÚÚÙØ××ÖÖÕÕÕÔÔÓÓÒÒÑÑÐÐÐÐÐÐÐÐÐÏÌÊÈÇÆÆÄÃÂÂÁÁÁÁÀ¿¿¾¾¾½½½¼»»»»ºº¹¹¹¹·¶µµ´´´´³³²²°®­¬ª©¨¨¨¨¨¨¨§¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££££££££££££¤¤¤¤¤¤¤£££££££££££££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©ª«¬­­®¯¯°²²²²²²²²²²²²²²±±°±²²²²²²²²³³³³³³³³²²²²²²²²²²²²²³³³³´´ÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÑÑÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÕÖ××ØØØØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞßßàáãäåççççèèèèèééêêêêëëëëëëëëëëëëêêêêéééèèèèèèçççåãââáààßßÞÝÜÜÜÛÛÛÛÛÛÚÚÚÙ××ÖÖÕÕÔÔÓÓÒÑÑÑÐÐÐÐÐÐÐÐÐÐÌÊÈÇÆÆÆÄÃÂÂÁÁÁÁ¿¿¾¾¾½½½¼¼»»»ºº¹¹¹¹¸·¶µ´´´´³³²²°®­«ª©©¨¨¨¨¨¨¨¨§¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦§§¨¨¨¨§¦¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¤££££¤££££££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨¨©©ª¬­­®®¯±²²²²³³³³³³²²²²²²²²²²²²²²³³³³³³³³³³³²²²²±²²²²²²²²³³³³´´ÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÖ×ØØ×××ØÙÚÚÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÜÜÜÝÞßààâãåççççèèèèèéééêêêëëëëëëëëëëëëëêêêêééééèèèèèçççæåäãâáàßßßÝÝÜÜÜÜÛÛÛÛÛÛÚÚÙØØ××ÕÕÔÓÓÒÑÑÑÐÐÐÐÐÐÐÐÐÐÎÌÊÈÇÇÆÆÄÃÂÁÁÁÁÀ¿¾¾¾½½½½¼»»»ºººº¹¹¹¸¶µµ´´´³³²²°®®¬ª©©©¨¨¨¨¨¨¨¨§§§¨¨§¨¨¨¨§§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§§¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦§¨¨¨¨¨¨©©ª«¬­®¯¯±²²³³³³³³³³³³³³²²²²²²²²³³³³³³³³³³³³³³³²²²²²²²²²²²²³³³´´´ÍÍÍÎÏÐÏÐÏÏÏÏÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖ×××××ØÙÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÝßßàáãåæççççèèèèéééêêêëëëëëììììëëëëêêêêêééééèèèèèççççççåãâáàßßßÞÝÝÜÜÜÛÛÛÛÛÛÚÚÚÚÚØÖÕÔÓÓÒÑÑÑÐÐÐÐÐÐÐÐÐÐÐÏÍËÉÈÇÆÅÃÂÁÁÁÁÁ¿¿¾¾¾½½½¼»»»»»ººº¹¹¹·¶µ´´´³³³²°¯®­«ª©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦§¨¨¨¨¨¨©©©ª«­®®°±²²³³³³´´´³³³³³³³²²²²²²³³³³³³³´´´´´³³³³³²²²²²²²²²²³³³³³´´ËËËÌÍÌËËËÌÍÍÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÕÖÖÖÖ×ØÙÚÚÚÚÚÙÙÚÚÚÛÛÛÛÛÛÛÛÜÜÝÞßàáâäåççççèèèèèééêêêëëëëììììëëëëëëêêêêêéééééèèèèçççççççäãâáàßßßÞÞÝÜÜÜÜÛÛÛÛÛÛÛÛÚØÖÕÔÓÓÒÒÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÈÇÆÅÃÂÁÁÁÁÁ¿¿¾¾¾¾½½¼¼»»»»»ºº¹¹¹¸¶µ´´´´³³²°¯®­¬«ªª©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©¨¨¨¨¨¨¨¨§¦¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦¦§¨¨¨¨¨¨¨©©©ª¬­®¯±²²³³³³´´´´´´³³³³³³³³³³³³³³´´´´´´´´´³³³³³³²²²²²²²²²³³³³³´´ÉÉÊÊÊÉÉÉÉÊËÌËÌÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÓÔÔÔÔÕÕÕÕÖÖ×ØØØØØÙÙØØÙÚÚÛÛÛÛÛÛÛÛÜÜÝßßáâãåæççççèèèèééêêêêëëìììììëëëëëëêêêêêêêéééèèèèèçççççççæäâááàßßßßÞÝÝÜÜÛÛÛÛÛÛÛÚÚ×ÖÕÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÄÃÂÂÁÁÁÀ¿¿¾¾¾½½½¼¼»»»»»ºº¹¹¹¹¶µ´´´´³³²±¯®­¬¬«ªª©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©©©¨¨¨¨¨¨¨¨¨§¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§§§¨¨¨¨¨¨¨©©©©ª«­®®°±²³³³´´´´´´´´´´³³³³³³³³³³³´´´´´´´´´´´³³³³³³²²²²²²²²²³³³³´´ÇÈÈÈÇÇÇÇÈÈÈÉÊÊËÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÕÖÖ××××××Ø×ØØÙÚÚÚÛÛÛÛÛÛÜÜÝÞßàáããäæçççèèèèéééêêêëëìììììëëëëëëêêêêêêêêéééèèèèèèççççççæäãâáààßßßßÞÝÝÜÜÜÛÛÛÛÛÚÙ×ÕÔÔÓÓÓÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÌÉÇÆÆÄÃÂÁÁÁÁÁÀ¿¾¾¾½½½¼¼»»»»»ºº¹¹¹¸¶µ´´´´³³²±¯®®­¬««ªª©©¨¨¨¨¨¨¨¨¨©©¨©©©©©©©©©©©©¨¨¨¨¨¨¨¨¨¨§¦¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¦¥¥¥¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨¨¨¨¨©©©©ªª«­®¯°²²³³´´´´´´´´´´´´´´³³³³³³´´´´´´´´´´´´´´´³³³³³²²²²²²²²³³³³´´ÆÆÆÆÆÆÆÆÆÇÇÈÈÉÉÊÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖ×××××××ØØÙÚÚÛÛÛÛÛÜÜÜÝßßàââãäæçççèèèèééêêêêëëììììëëëëëëêêêêêêêêééééèèèèèèèèççççæåããâááààßßßßßÞÝÜÜÛÛÛÛÚØÖÕÔÔÓÓÓÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÎÊÈÇÆÅÄÂÂÁÁÁÁÁÀ¿¾¾¾½½½½¼¼»»»»ºº¹¹¹·¶µ´´´´³³²°¯®®­¬««ªª©©©©©©©©©©©©©©©©©©©©©©©©©¨¨¨¨¨¨¨¨¨¨§¦¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¦¦¦¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦¦¥¥¥¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨¨©©©ªª«­®®¯±²²³³´´´´´´´´´´´´´´³³³³³´´´´´´´´´´´´´´´´´´³³³²²²²²²²²³³³³´´ÆÆÆÆÅÅÅÆÆÆÆÇÇÈÈÉÊËÌÌÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÔÔÕÕÕÖÖÖ×××Ö×××ØØÚÚÛÛÛÛÛÛÜÜÝÞßßááâãåçççèèèèéééêêêëëììììëëëëëëëêêêêêêééééééèèèèèèèèèççççåääããâááàààßßßÝÜÜÛÛÛÚÚØÖÕÔÔÓÓÓÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÍÊÈÆÆÅÃÂÂÁÁÁÁÁÀ¿¾¾¾¾½½½¼¼»»»»»º¹¹¹·¶µ´´´´³³²±°¯®­­¬«ªªª©©©©©©ªªªªªªªªªª©©©©©©©¨¨¨¨¨¨¨¨¨¨¨§¦¥¥¥¥¥¥¤¤¤¤¤¤¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦§¨¨§¦¦¦¦¦¥¥¥¥¥¥¥¤¤¤¥¥¤¤¤¥¥¥¥¦¦¦¦¦¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦§¦¦¥¥¥¤¤¥¥¥¦§¨¨¨¨¨¨¨¨¨©©©ªª««¬­®¯°±²²³´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´³³³³²²²²²³³³³³´´ÄÄÄÄÄÄÄÄÅÆÆÆÆÇÇÈÉÉÉÉÊÊËËÌÍÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÕÕÕÕÖÖÖÖÖÖÖÖ×ØÙÚÚÛÛÛÛÛÜÜÜÝÞßààáãåççççèèèèééêêêëëëëììëëëëëëëëêêêêêéééééééèèèèèèèèèççççæåååäããâááààßßÝÜÜÛÛÛÛÚ×ÖÕÔÔÓÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÍÊÈÇÆÅÄÂÂÂÁÁÁÁÀ¿¾¾¾¾½½½½¼¼»»»»ºº¹¹¸¶µ´´´´³³²²±¯®®®­¬¬««ªªªª««¬¬«««««««ªªª©©©©©¨¨¨¨¨¨¨¨¨¨¨§¦¦¦¦¥¥¥¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦¦§¨¨¨¨¨¨¨¨§§¦¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦§§§¨¨§§¦¦¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦¦§§§¦¥¥¥¥¦§§¨¨¨¨¨¨©©©©©©ªª««¬­®®¯±²²³³´´´´´´´´´´´´´´´´´´´´´´´´µµµµµ´´µµ´´´´´´³³³³³³²³³³³³³³´´ÃÃÃÃÃÃÃÃÄÅÆÆÆÆÇÇÇÇÈÇÈÈÈÉÉÉÊËÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÕÕÕÕÖÖÖÖ××ØÙÚÚÛÛÛÛÛÜÜÝÞßßàáãåççççèèèèéééêêêëëëëëëëëëëëëêêêêêêééééééééééèèèèèèèçççççççååääãââààßÞÝÜÜÛÛÛÚÙ×ÖÕÕÔÔÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÎÊÈÇÆÆÄÃÂÂÁÁÁÁÀ¿¾¾¾¾½½½½½¼¼»»»»º¹¹¸¶µ´´´³³³²²²°¯®®­­­­¬««¬­­®®­­­­­­¬¬««ªª©©©©¨¨¨¨¨¨¨¨¨¨¨¨§§§§¦¦¦¦¦¦¥¥¥¦¥¥¥¥¤¤¥¥¥¥¥¦¦¦§§¨¨¨¨¨¨¨¨¨¨¨¨§§¦¦¦¦§¦¦¦¦¦¦¦§§§¨¨¨¨¨¨¨¨¨¨§¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¦¦¨¨¨¨¨§§§¨¨¨¨¨¨¨¨©©©©©©ªª«¬­­­®¯°²²²³³´´´´´´´´´´´´´´´´´´´´´´´´µ¶µµµµµµµµ´´´´´´´³³³³³³³³³³³³³´ÂÂÂÃÃÃÃÃÄÄÅÆÆÆÆÇÇÇÆÆÆÇÇÇÈÈÈÉËÌÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÕÕÖÖ××ØÙÚÚÚÛÛÛÛÛÜÜÝßßàáâäæçççèèèèéééêêêëëëëëëëëëëëëêêêêêêêêéééééééééééèèèèèççççççççççæäãâáàßßÞÝÜÛÛÛÛÚØÖÖÕÔÔÔÓÓÓÓÒÒÒÑÑÑÐÐÐÐÐÐÍÊÈÇÆÆÄÃÂÂÂÁÁÁÀ¿¿¾¾¾¾¾½½½¼¼¼»»»º¹¹¸¶µ´´´´³³²²²±¯®®®®®®­­­®®®®®®®®®®­­­¬«ªª©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§§§§¦¦¦¦¦¦¥¥¥¥¥¦¦¦¦§§§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¥¥¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©ªªªªª«¬­­­­®®¯±²²²³³´´´´´´´´´´´´´´´´´´´´´´µµµ¶¶¶µµµµµµµ´´´´´´´³³³³³³³³³³³´´ÂÂÂÂÂÂÂÃÃÃÄÅÅÆÆÆÆÆÆÆÆÆÆÆÇÇÇÈÉÉÉÊËËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÎÍÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÔÔÔÔÔÔÕÕÕÖÖ××ØÚÚÚÛÛÛÛÛÜÜÝÞßààáâãæçççèèèééééêêêëëëëëëëëëëëêêêêêêêêêêééééééééééèèèèèèçççççççççççäâáàßßßÝÜÜÛÛÛÚÚØÖÕÕÕÔÔÔÓÓÓÒÒÑÑÑÐÐÐÐÐÐÍÊÈÇÆÆÄÃÂÂÂÁÁÁÁ¿¿¾¾¾¾¾½½½½½¼»»»º¹¹¸¶µ´´´´³³²²²²°¯®®¯¯¯®®¯¯¯¯®®®®®®®®­¬¬««ªª©©©©©©©©¨¨¨¨¨¨¨¨¨¨¨§§§¨¨§§§¦¦¦¦¦§§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¥¥¥¥¥¥¥¤¤¤¥¥¥¥¥¥¥¦¦¦§§¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©ªª«««««¬­­­®®®¯°±²²³³³´´´´´µµµ´´´´´´´´´´´´´´µµµ¶·¶¶¶µµµµµµ´´´´´´´´´³³³³³³³³´´ÁÁÂÂÂÂÂÂÂÃÃÄÅÆÅÅÅÅÅÆÅÅÆÆÆÆÇÇÇÇÈÈÉÉÊÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÍÌËËËËËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÔÔÔÔÔÔÕÕÖÖ×ØÙÚÚÛÛÛÛÛÛÜÝÞßßàááâäçççèèèèéééêêêëëëëëëëëëëëëêêêêêêêêêééééééééééééèèèèèèççççççççççåãâáàßßÞÜÜÛÛÛÛÚÙ×ÖÖÕÕÔÔÔÓÓÒÒÑÑÑÐÐÐÐÐÐÍËÉÈÆÆÄÃÃÂÂÁÁÁÁ¿¿¿¾¾¾¾½½½½½¼»»»º¹¹¸¶µ´´´´³³³²²²±°°°°°±±±²±°¯¯¯¯¯¯¯®®­­¬¬«ªªª©©©©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§§§§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦¥¥¥¥¥¥¥¤¤¥¥¥¥¥¥¥¦¦¦§¨¨¨¨¨¨¨¨©©©©¨©©©©ªª¬¬¬¬¬­­®®®®®¯¯°²²³³³³´´´´µµµµµ´´´µ´´´´´´´µµµµ¶¶·¸·¶¶¶µµµµµµ´´´´´´´´³³³³³³´´´ÁÁÂÂÂÂÂÂÂÃÃÄÅÅÄÄÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÉÉÊËÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÌÌËÊÊÉÉÉÊÊÊÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÔÔÔÔÔÔÕÕÖ×ØÙÚÚÛÛÛÛÛÛÜÜÝßßßààáâåççèèèèéééêêêëëëëëëëëëëëëëëëêêêêêêêééééééééééééèèèèèèèèèèèèçççççåãâáàßÞÝÜÜÛÛÛÛÚÚÙØ×ÖÕÔÔÓÓÒÒÑÑÑÐÐÐÐÐÐÎÌÉÇÆÆÅÄÃÃÂÁÁÁÁÀ¿¿¾¾¾¾¾½½½¼¼»»»º¹¹¹¶µ´´´´´³³³²²²²±²²²²²²²²²±±±±±°¯®®®­­­««ªªªªªªªª©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©ªªª©©©©©©©©©©©©©©¨¨¨¨©©©©©©©©©¨©¨¨¨¨¨¨¨¨§¦¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦§§¨¨¨¨¨¨©©©©ªªª©ªªªª«¬­­­­­­®®®®¯¯¯°±²²³³³´´´´´µµµµµµµµµµµµ´´µµµµµ¶¶··¸¹¸·¶µµµµµµµµµ´´´´´´´´´´´´´´ÁÂÂÂÂÂÂÂÂÃÃÄÄÄÄÄÃÃÃÄÄÅÄÅÅÆÆÆÆÆÇÇÇÈÈÉÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÊÊÊÉÈÈÈÈÈÉÊÊËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÔÔÔÔÔÕÕÖÖ×ÙÚÚÚÛÛÛÛÛÜÜÝÞßßßààáãçççèèèèéééêêêêêëëëëëëëëëëëëëëëêêêêêééééêéééééééèèèèèèèèèèèèççççççåäâáàßÞÝÜÛÛÛÛÛÛÛÚØÖÕÕÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÍÊÈÇÆÆÅÄÃÂÁÁÁÁÁÀ¿¿¿¾¾¾½½½¼¼»»»º¹¹¹·µ´´´´´´³³³²²²²³³³³³³³²²²²²²±°¯¯®®®®­­¬¬¬«««¬««ª©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©©©©©©©ªªª«««ªªª«ª«««««ªª©©©©©©ªªªª©©©©©©©¨¨¨¨¨¨¨¨¦¥¥¥¥¥¥¥¥¥¥¥¦¦¦§¨¨¨¨¨¨¨¨¨©©©ª«¬¬¬¬¬­­­®®®­­®®®¯¯¯¯°°°²²³³³³´´´´´µµµ¶µµµµµ¶µµµµµµµµ¶¶·¸¹¹¹¹¸·¶¶µµµ¶¶¶µ´´´´´´´´´´´´´´ÁÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÃÃÃÃÄÄÅÅÆÆÆÆÆÆÇÇÇÇÈÉÉËÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËËÊÉÉÈÇÇÇÇÈÈÉÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÔÔÔÕÕÖ×ØÚÚÚÛÛÛÛÛÜÜÝÞßßßßàáãæççèèèèéééêêêêêêëëëëëëëëëëëëëëëëêêêêêêêêééêéééééééèèèèèèèèèèèçççççççäâáàßÞÝÜÜÛÛÛÛÛÛÚ×ÕÕÔÓÓÓÒÑÑÑÐÐÐÐÐÐÐÍÊÉÇÆÆÆÄÂÂÁÁÁÁÁÁÁ¿¿¾¾¾½½½¼»»»»º¹¹¹·µµ´´´´´´´³³³³³³³³´³³³³³²²²²±±°°¯¯®®®®®­­­­­­¬«ª©©©©¨¨©¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©©ªªªªªª«««¬¬¬¬¬¬¬¬¬­­®­­­¬«««««««««««««ªª©©©¨¨¨¨¨¨¨§¦¥¥¥¥¥¦¥¥¥¦§§§¨¨¨¨¨¨¨¨©©©©ªª¬­®®®®®®®®®®®®®¯¯°±±±±±±²²³³³´´´´´´µµ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶·¸¹¹¹¹¹¹¸·¶¶¶¶¶¶¶¶µ´´´´´´´´´´´´´ÁÁÁÁÂÂÂÂÂÂÃÃÂÂÂÃÃÃÃÃÃÃÄÄÅÅÆÆÆÆÆÆÇÇÇÈÈÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÊÊÉÈÇÇÇÇÇÇÈÈÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÓÓÔÔÔÕÕÖ×ØÙÚÚÛÛÛÛÛÜÜÝÝÞßßßßàâåççèèèèéééêêêêêêêêêëëëëëëëëëëëëëëêêêêêêêêêêêêéééééééééééèèèèèèèèèçççççåâáàßÞÝÝÜÜÛÛÛÛÚ×ÖÕÔÔÓÓÒÑÑÐÐÐÐÐÐÐÐÎÌÊÈÇÆÆÄÃÂÂÁÁÁÁÁÀ¿¾¾¾½½½¼»»»»ºº¹¹¹¸¶¶µµ´´´´´´´´´´´´´´´´³³³³²²²²²²±°°¯¯¯®®®®®®®­¬«ªª©©©©©©©©¨©©©¨¨©©©©©ªªªª«««««¬¬­­­­­­®®®®®®®®®®®®­­­­­­­­­­¬­­«ªª©©©¨¨¨¨¨¨¨¦¦¦¦¦¦¦¦¦¦§¨¨¨¨¨¨¨¨¨¨¨©©ªªª«­­®®¯®®¯¯¯¯¯¯¯¯°±±²²²²²²²³³³³´´´´´´µµ¶¶····¸¸········¸¸¹¹¹¹¹¹¹¹¹¸·····¶¶µµ´´´´´´´´´´´´ÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÄÄÅÅÆÆÆÆÆÆÇÇÇÈÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÉÈÇÇÆÆÆÆÆÇÇÈÈÈÉËÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÔÕÕÖ×ØØÚÚÛÛÛÛÛÛÜÜÜÝÝßßßàáäçççèèèèéééééêêêêêêêêêêêëëëëëëëêêêêêêêêêêêêêêêêéééééééééééèèèèèèèèèçççççåãáàßßßÝÜÜÛÛÛÚØÖÕÔÔÓÓÒÑÑÐÐÐÐÐÐÐÐÐÌÊÈÇÆÆÄÃÂÂÂÁÁÁÁ¿¿¾¾¾½½¼¼»»»»ººº¹¹¹¸·¶µµ´´´´´´´´´´´´´´´´³³³³²²²²²±±±²±°¯¯¯¯®®®­¬««ª©©©©©©©©©©©©©©©©©ªªª««¬­¬­­­®®®®®®®®®®®®¯¯®®®®®®®®®­­­­­­­­­¬«ª©©©©¨¨¨¨¨¨§¦¦¦¦¦¦§§§¨¨¨¨¨¨¨¨¨¨¨¨©©ªªª«­®®¯¯¯¯¯°¯¯¯°¯°°±²²²²²²²³³³³³´´´´´´´µµ¶·¸¹¹¹¹¹¸¸¸¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸··¶¶¶µµµ´´´´´´´´´´ÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÄÅÅÅÆÆÆÆÆÇÇÇÈÉËÌÍÎÎÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÏÏÍÌÊÈÇÇÆÆÆÆÆÆÆÆÇÇÇÇÈÉËÌÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÔÔÔÕÕÖ××ØÙÚÛÛÛÛÛÛÜÜÜÜÝÝßßààâäçççèèèèééééééééééêêêêêêêêêêëêêêêêêêêêêêêêêêêêêêêêêêêééééééééèèèèèèèçççççåâààßßÝÜÜÛÛÛÚØÖÕÔÔÓÓÒÑÑÑÐÐÐÐÐÐÐÐÌÊÉÇÆÆÅÄÃÂÂÁÁÁÀ¿¾¾¾½½½¼»»»»»ººº¹¹¹¹¸·¶µµµµµµ´´´´´´´´´´´³³³³³²²²²²²²²²±±°°°¯®®­­¬««ªªªªªª©©©©©©ªªªªª««¬¬­­®®®®®®®®®®®®®¯¯¯¯¯¯¯¯®®®®®®®®®®®®®­­­¬«ª©©©©¨¨¨¨¨¨§¦¦¦¦¦¦§§¨¨¨¨¨¨¨¨¨©¨©©ªª««¬­®®¯°°°°±±°°°°°±²²²²²³³³³³³³³´´´´´´´µµ¶·¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸·¶¶¶¶¶µµµ´´´´´´´´´ÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÄÄÅÅÆÆÆÆÆÆÇÇÈÉËÌÌÍÍÍÍÍÎÏÐÐÐÐÐÐÐÐÐÐÎÍËÊÉÈÇÆÆÆÆÆÆÆÆÆÆÆÆÆÇÈÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÔÔÔÔÔÔÕÕÖÖ×ØÙÚÚÚÛÛÛÛÛÜÜÜÜÝÞßßßàâäçççèèèèèèééééééééééééééêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêéééééééèèèèèèèèçççåâáàßßÝÜÛÛÛÛÚÙ×ÕÕÔÓÓÒÑÑÑÐÐÐÐÐÐÐÐÏÌÊÈÇÆÆÄÃÂÂÁÁÁÀ¿¾¾¾½½¼¼»»»»»»ººº¹¹¹¹¹¸···¶¶µµµµµ´´´´´´´´³³³³²²²²²²³²²²²²±°¯®®®­­­¬««ªªªªªªªªªªª««««­­­®®®¯¯¯¯¯¯¯¯¯¯¯¯¯°°°°¯¯¯¯®®®®®®®®®®®®®®­­¬«ªª©©¨¨¨¨¨¨¨§§¦¦¦§§¨¨¨¨¨¨¨¨¨¨©©©ªª«¬¬­®®¯¯°±²²²²²²²±²²²²²³³³³³³³³³´´´´´´µµµµ¶·¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº¹¹¹¹¹··¶¶¶¶¶¶¶µµµµ´´´´µµÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÄÄÅÅÆÆÆÆÆÆÇÈÈÉËËÌÌÌÌÌÌÍÎÏÐÐÐÐÐÐÐÐÐÎËÊÊÈÇÇÆÆÆÆÆÅÆÆÆÆÆÆÆÇÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÔÔÔÔÔÕÕÖÖ×ØÙÚÚÚÚÛÛÛÛÛÜÜÜÝÝÞßßßàâäçççèèèèèèèèèèèèèéééééééééêêêêêêêêêêêêêêêééêêêêêêêêêêêêêêêêéééééèèèèèèçççåâáàßÞÝÜÛÛÛÛÚÙ×ÖÕÔÔÓÒÒÑÑÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆÅÃÂÂÁÁÁÀ¿¾¾½½½¼¼»»»»»»»ººº¹¹¹¹¹¹¹¹¸¸¸·¶µµµµµ´´´´´³³³³³³³³³³³³³²²²²±°¯®®®®®­­¬¬¬«««««««¬¬¬­­®®®®¯°±±°°±±±±°°°°°°±±±±°¯¯¯¯¯¯¯¯¯¯¯¯¯¯®®®®­¬«ªª©©¨¨¨¨¨¨¨§§§§§¨¨¨¨¨¨¨¨¨¨¨©©©ª««­­®®¯¯°±²²²²²²²²²²²²³³³³³³³³³´´´´´´´´µµµµ¶·¸¹¹¹¹¹¹¹¹¹¹¹¹ºº¹ººººººº¹¹¹¹¸··¶¶¶¶¶¶¶¶¶µµµµµµµÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÄÄÅÅÅÆÆÆÆÆÇÈÈÉÊÊËËËËËËÌÌÍÏÐÐÐÐÐÐÐÏÍËÊÉÈÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÈÉËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÔÔÕÕÕÖ×ØÙÙÚÚÚÛÛÛÛÛÜÜÜÜÜÝÞßßààâäæçççèèèèèèèèèèèèèèèèèèééééêêêêêêêêêêêéééééêêêêêêêêêêêêêêêêêéééééèèèèèçççåâàßßÝÜÜÛÛÛÛÚÙ×ÖÕÔÔÓÓÒÑÑÑÐÐÐÐÐÐÐÐÎËÉÇÇÆÅÃÂÂÁÁÁ¿¿¾¾½½½¼¼»»»»»»»»»ººººº¹¹¹¹¹¹¸··¶¶µµµ´´´´´´³³³³³³³³³³³³³²²²²²±°¯¯®®®®®­­­­¬­­­­­­®®®®¯°±²²²²²²²²²²±²²±±²²²²°°°°°°¯¯°°°±±±°¯®®®­¬««ª©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©ªª«­­®®®¯°±²²³³³³³³³³³³³³³³³³³³´´´´´´´´´µµµ¶¶··¸¹¹¹¹¹¹¹¹¹¹¹¹ººººººººººº¹¹¹¹¸·········¶¶¶µµµµµÀÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÃÃÄÄÄÅÆÆÆÆÆÆÇÇÈÉÉÊÊËËÊËËÊËÌÌÍÏÐÐÐÐÐÏÍÌÊÉÈÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÈÉÊËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÓÓÓÓÓÔÔÔÕÕÕÖ×ÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÞßßßàâãåççççèèèèèèèèèèèèèèèèèèééééêêêêêêêêêéééééêêêêêêêêëëëëêêêêêêééééééèèèèçççäáàßßÝÜÜÛÛÛÛÚÚØÖÕÔÔÓÓÒÑÑÑÐÐÐÐÐÐÐÐÐÍÊÈÆÆÅÄÂÂÁÁÁ¿¾¾¾½½½½¼¼¼¼¼»»»»»»»»ºººº¹¹¹¹¹¸¸·¶¶µµ´´´´´´´´´´´´´´³³³³³³³²²²²²±°°°¯¯¯®®®®®®®®®®®¯¯°±²²²²²²²²²³²²²²²²²²²²²²±±±±±°°±±²²²²±°¯¯®®­­¬«ª©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©©ªª«¬­®®®®¯°±²²³³³³³³³³³³³³³³³³´´´´´´´´´´µµµ¶¶··¸¹¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»»»ºº¹¹¹¹¹¹¸¸¸¸¸¹¸···¶¶¶¶¶¶ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÃÃÄÄÄÅÆÆÆÆÆÆÆÇÇÈÉÊÊËÊÊÊÊÊÊËËÌÍÎÐÐÏÏÏÍÌËÊÉÈÇÆÆÆÆÅÅÅÅÅÅÅÆÆÆÆÇÈÈÉÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÓÔÔÔÕÕÕÖ×ØÙÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßàáãåçççççèçççççççççççèèèèèèéééêêêêêêêêéééééêêêêêêêêêêëëëëêêêêêêêêéééèèèèçççãáàßÞÝÜÜÛÛÛÛÛÚÙÖÕÔÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÍÊÈÇÆÆÃÂÂÁÁÁ¿¾¾¾¾½½½½½¼½¼¼»»»»»»»»»»ºº¹¹¹¹¹¹¸·¶µµ´´´´´´´´´´´´´´´´³³³³³³³³³²²²²²±°°¯¯®®®®®®¯¯°°²²²³³³³³³³³³³³³³²²²²³³²²²²²²²²²²²²²²²²²±¯¯®®®­¬ªª©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©©©©ªª«¬­®®®®¯°°²²³³´´´´´´´³³³³³³³´´´´´´´´´´´µµµ¶·¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»»»»ºº¹¹¹¹¹¹¹¹¹¹¹¹¸¸·······¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÄÄÄÅÆÆÆÆÆÆÆÆÇÇÈÊËËÊÊÊÊÊÊÊÌÌÍÍÎÏÎÍÎÌÊÊÉÈÇÇÆÆÆÅÅÄÄÄÄÄÄÅÆÆÆÇÇÇÈÈÈÈÊËÌÎÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÔÕÕÖÖ×ØÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÝÝßßàáâäæçççççççççççççççççèèèèèèéééêêêééêéééééêêêêêêêêêêêëëëëëëêêêêêêêééèèèèçççäâàßßÝÜÜÜÛÛÛÛÚÚ×ÖÕÔÓÓÓÒÑÑÑÐÐÐÐÐÐÐÐÎÊÈÇÆÅÄÃÂÁÁÁ¿¿¾¾¾½½½½½½½½¼¼¼¼»»»»»»»ºº¹¹¹¹¹¹¸·¶µµµµ´´µµ´´´´´´´´´´´´³³³³³³³³³³²²²±°°¯¯¯¯¯¯¯°±²²²³³³³³³³³³³³³³³³³³³³³³³²²²²²²²²²²²²²²²±°°¯¯®®­«ª©©¨¨¨¨¨¨¨¨¨¨¨¨©©©ªª©©ªªª«¬­®®®®®¯°±²²³³´´´´´´´´³³³´´´´´´´´´´´´´´µµµ¶·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»»»»»»ºº¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸¸¸¸¸¸¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÃÃÄÄÅÅÆÆÆÆÆÆÆÆÇÇÈÊËËËËÊÊÊÊÊËÌÌÍÍÎÍÍÌÌÊÉÈÈÇÆÆÆÆÅÄÄÃÃÃÄÄÅÆÆÆÆÇÇÆÆÇÇÈÉÊËÎÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÕÕÕÖ×ØÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÝßßàáâãåçççççççççææçççççççèèèèèéééêéééêééééêêêêêêêêêêêêëëëëëëëëëëêêêêéééèèèçççåãáßßÞÝÜÜÜÛÛÛÛÚØÖÕÔÔÓÓÒÑÑÑÑÐÐÐÐÐÐÐÏËÉÇÆÆÄÃÂÁÁÁÀ¿¾¾¾¾¾½½½½½½½½½¼¼¼¼»»»»»ºº¹¹¹¹¹¸·¶¶¶µµ¶¶¶¶µµµ´´´´´´´´´´´´´´´´´³³³³²²²±±±°±±±²²²²³³³³³´´´´´´´´´´³³³³³³³³³³³³²²²²²³³³³³²²²²±±¯®­¬«ª©©©©©¨¨¨¨¨©©©©ªªªªªªªª«¬­­®®®®¯°°±²³³³´´´´´´´´´´´´´´´´´´´´´´µµµµµ¶·¸¹¹¹¹¹¹¹ºººº¹¹¹¹ººº»»»»¼»»»»»ººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÃÄÄÅÅÆÆÆÆÆÆÇÆÇÇÈÉÊËËËËÊÊÊÊÊËÌÌÌÌËËËÊÊÉÈÇÇÇÆÆÆÅÅÄÄÃÃÃÄÄÅÆÆÆÆÆÆÆÆÆÇÇÈÈÉÌÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÕÕÖÖ×××ØØÙÚÚÚÚÛÛÛÛÛÛÛÛÜÜÝÝßßßààâãæçççççæååäåæçççççççèèèèééééêêêéééêêêêêêêêêêêêêêëëëëëëëëëëëêêêéééèèèççççäáàßßÞÝÝÜÜÛÛÛÚ×ÖÕÔÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÌÊÈÆÆÄÃÂÁÁÁÀ¿¿¾¾¾¾¾¾¾¾¾½½½½½½½¼¼»»»»ººº¹¹¹¹¹¸¸¸··¸¸¸¸·¶¶µµµ´´´´´´´´´´´´´´´´´³³³²²²²²²²²²²³³³³³´´´´´´´´´´´´´´´´´´´´´³³³³³³³³³³³³³³³²²²²°¯®­­¬ª©©©©©©©©©©©ª««¬«««««¬­­®®®®¯¯°°±²²³³´´´´´´´´´´´´´´´´´´´´´´µµµµ¶¶·¸¹¹¹¹¹¹¹ººººººººººº»»»»¼¼¼¼»»»»ººººººº¹¹¹¹¹¹¹¹¹¹¹¹¹¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÃÄÄÅÅÆÆÆÆÆÆÆÇÇÇÈÈÉÊËÌÌËÊÊÊÊËËËËËÊÊÉÉÈÈÇÇÇÆÆÆÆÆÅÄÄÄÃÃÃÄÄÄÅÆÆÆÆÆÆÆÆÆÇÇÇÈËÎÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ×ØÙÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞßßßàáâäåæçæåäãããääåççççççèèèèéééêêêéêêêéééêêêêêêêêêêëëëëëëëìëëëëêêêéééèèèèçççåãáàßßÞÝÜÜÛÛÛÚØÖÕÕÔÔÓÓÒÑÑÑÐÐÐÐÐÐÐÐÎËÈÇÆÅÃÂÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾¾¾¾¾½½½¼¼»»»»ººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸··¶¶µµµµ´´´´´´´´´´´´´´´³³³³³³³³³³³³³³´´´´´´´´´µ´´´´´´´´´´´´´´´³³³³³³³³³³³³³³³³²²°®®­­¬ªªªªªªª©©©ª«¬­­­­¬­­­®®®®¯¯°±±±²²³³´´´µµµµ´´´´´´´´´´´´´´´µµ¶¶···¸¹¹¹¹¹¹¹ºººººººººººº»»»¼¼¼½½¼¼»»»»»»ºººººº¹¹¹¹¹¹¹¹¹¹¾¾¿¿À¿¿¿¿ÀÁÁÁÁÁÁÂÂÂÃÃÄÄÅÅÆÆÆÆÆÆÆÇÇÇÈÈÉÉÊËËËËÊÊËËÊÊÊÉÉÉÉÈÇÆÆÆÆÆÆÆÆÆÅÄÄÄÄÄÄÄÄÅÅÅÅÆÅÅÆÆÆÆÆÇÇÈÊÌÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÖÖ×ØÙÚÚÚÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßàáâãääãããâââããåæçççççèèèèéééêêêêêêéééééêêêêêêêêëëëëëìììììëëëêêêêééèèèèèçççåãáàßßßÝÜÛÛÛÚÙ×ÖÕÔÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÌÉÇÆÅÃÂÁÁÁÁÁÁÀÀ¿¿¿¿¿¾¾¾¾¾¾¾½½½¼»»»»»»ºº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸··¶¶¶¶µµµµ´´´´´´´´´´´´´´³³³³³³³³´´´´´´´´µµµµµµµ´´´´´´´´´´´´´³³³³³³³´´´´³³³³²²±¯®®®­¬««««ª««ª««¬­­­­­®®®®®®¯°°±²²²²²³³´´´´µµµµµµ´´´´´´´´´´´µµµµ¶·¸¸¹¹¹¹¹¹¹ºººº»»»»ºº»»»»»»¼¼½½½½½½¼»»»»»»ººººº¹¹¹¹¹¹¹¹¹¹¾¾¾¾¿¿¾¾¾¿¿ÀÁÁÁÁÂÂÂÂÃÃÄÅÅÆÆÆÆÆÆÆÇÇÈÈÈÉÉÉÊËËÌËËÊÊÊÉÉÈÈÈÇÆÆÆÆÆÅÆÆÆÅÅÅÄÄÄÄÄÃÃÄÄÄÄÄÄÄÄÅÅÆÆÆÆÇÇÉËÍÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×ØØÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÝÞßßààáááâââááââââããäæççççèèèèéééêêêééééééêêêêêêêêëëëëëìììììëëëëêêêêéééèèèèççççåãáàßßÝÜÛÛÛÚÚØÖÕÕÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÍÉÇÆÅÃÂÂÁÁÁÁÁÁÁÀÀÀ¿¿¿¿¿¾¾¾¾½½½¼¼»»»»»ºººººººººººº¹¹¹¹¹¹¹¸·····¶¶µµµµ´´´´´´´´´´´´´´´´´´´´´´´´´µµ¶¶¶¶µµµ´´´´´´´´´´´´´³³³³³³´´´´´´´³³²²±¯¯®®­­¬¬¬¬¬¬­­­­®®®®®®®®®®¯°±±²²²²³³³´´´´µµ¶¶¶¶µµ´´´´´´´´´µµµµµ¶·¸¹¹¹¹¹¹¹ººº»»»»»»»»»»»»¼¼¼½½½½½½½¼¼¼»»»»»»ºººººººº¹¹¹¹¹¾¾¾¾¾¾¾¾¾¾¾¿ÀÁÁÁÁÁÁÂÂÂÃÄÅÅÆÆÆÆÇÇÇÇÈÈÈÉÉÉÉÊËËËÊÉÉÈÈÈÇÇÇÆÆÅÅÄÄÄÄÄÄÄÄÄÄÃÃÃÃÃÃÃÃÃÃÃÃÃÄÄÄÄÆÆÆÆÇÈÉÌÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖ×××ØÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞßßßàààáàààáááááááâäåçççèèèèééééééééééééêêêêêêêëëëëëììíìììëëëëêêêééééèèèèèççççåâàßÞÝÜÛÛÛÛÚØ×ÖÕÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÌÉÇÆÅÃÂÂÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¾¾¾¾¾½½½¼¼¼»»»»»»»ºººº»»ººº¹¹¹¹¹¹¹¹¹¹¹¹¸·¶¶µµµµ´´´´´´´´´´´´´´´´´´´´´´µµ¶····¶¶µµµµµµµµµµ´´´´´´³³³´´´´´´´´´³³²²±°¯®®­­­­­­­®®®®®®®®®¯¯¯¯¯°±²²²²³³³³´´´´´µ¶···¶¶¶µµµµµµµµµµµµµµ¶·¸¹¹¹¹¹¹¹ººº»»»»»»»»»»»¼¼½½½½½½½½½½½½¼¼»»»»»ºººººººº¹¹¹¹¾¾¾¾¾¾¾¾¾¾¾¾¿ÀÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÇÇÇÈÈÈÉÉÉÉÉÉÊÊÉÉÈÇÇÇÇÆÆÆÅÄÃÃÃÃÃÃÃÃÃÄÃÃÃÃÃÃÂÂÂÂÂÂÃÃÃÃÃÄÅÆÆÆÆÇÉËÏÐÐÐÐÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÖÖ×ÙÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞÞßßßààààààààààààáâäççççèèèèééééééééééêêêêêêêëëëëëìììììììëëëêêêêêééééèèèèèçççåãàßÞÝÜÛÛÛÛÛÚ×ÕÕÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÐÍÉÇÆÆÄÃÂÂÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾½½½½½¼¼¼»»»»»»»»»»»»ºººº¹¹¹¹¹¹¹¹¹¹¹¸·¶µµµµµ´´µ´µµ´´´´´´´µ´´µµµµ¶¶·¸¸¸¸·¶¶¶µµµ¶¶¶µµµ´´´´´´´´´´´´´´´´´´³³²²²°¯®®®®®®®®®®¯¯¯¯¯°°°±°°±±²²²²³³³³´´´´´µ¶·¸¸¸¸·¶¶µµµµµµµµµµµµ¶··¹¹¹¹¹¹¹ºººº»»»»»»»»»»¼¼½½½½½½½¾½½½½½½¼¼»»»»»ºººººººººº¹½½½½½½½½½¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÂÂÃÃÄÄÅÆÆÇÇÈÈÈÈÈÉÈÈÈÉÉÈÈÇÇÇÆÆÆÅÄÃÃÂÂÂÂÂÂÃÃÃÃÃÃÃÃÃÂÂÂÂÂÂÂÂÂÃÃÃÃÄÅÅÆÆÇÈÊÍÐÐÐÐÐÐÐÐÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÖÖ×ÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÝÞÞßßßßßßßßßßßßßààâäæçççèèèèééééééééééêêêêêêëëëëëìììììììëëëëêêêêêêéééèèèèèèçççãáßßÝÜÜÛÛÛÛÚØÕÕÔÓÓÓÒÑÑÑÐÐÐÐÐÐÐÐÍÉÇÆÆÄÃÂÂÂÂÂÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾½½½½½¼¼¼¼»»»»»»»»»»»»ºººººººº¹¹¹¹¹¸·¶¶µµµµµµµµµµµµµµµµµµµµµµ¶¶·¸¹¹¹¹¹¸¸·······¶¶µµµ´´´´´´´´´´´´´´´´´³³³²²°¯¯®¯¯®®¯¯¯°°°±²²²²²±±²²²³³³³³³´´´´´µ¶·¹¹¹¹¹¸···¶¶¶¶¶¶¶¶µ¶¶··¸¹¹¹¹¹¹ºººº»»»»¼¼¼¼¼¼¼½½½½½½½½½¾¾¾½½½½½½¼»»»»»»»»»»ººººº½½½½½½½½½½¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÂÂÃÃÃÄÅÆÆÇÈÇÇÈÈÈÇÈÈÈÇÇÇÆÆÆÆÄÃÃÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÄÄÆÆÆÇÉÌÐÐÐÐÐÐÐÐÐÑÑÑÒÒÒÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÖÖ××ØØÙÚÚÛÛÛÛÛÛÜÜÜÜÝÞÞßßßÞÞÞÞÞÞßßßààâãåçççèèèèééééééééêêêêêêêêëëëëììììììììëëëëêêêêêêééééèèèèèçççäáàßÞÝÜÜÛÛÛÚ×ÖÕÔÓÓÓÒÑÑÑÐÐÐÐÐÐÐÐÍÉÇÆÆÆÄÃÃÃÂÂÂÂÁÁÁÁÁÁÀ¿¿¿¾¾¾¾½½½½½½½½½½½¼¼¼¼¼¼»»»»»»»»ººººº¹¹¹¹¸··¶¶¶¶¶¶¶¶¶···¶¶¶¶·¶¶¶¶¶··¸¹¹¹¹¹¹¹¹¸¸¸¸¸¸¹¸·¶¶µµ´´´´´´´´´´´´´´´´´³³³²²±°°°°°°±±±²²²²²²²²²²²²²³³³³³´´´´´´µµ·¸¹¹¹¹¹¹¹¹¸···········¸¸¹¹¹¹¹¹¹ººº»»»¼¼¼½½½½½½½½½½½½¾¾¾¾¾¾¾¾½½½½¼¼»»»»»»»»»»»»ºº¼¼¼½½½½½½½½¾¾¾¾¾¾¿¿¿¿ÀÁÁÁÁÁÁÂÂÃÃÅÆÆÆÆÇÇÇÇÇÇÇÇÆÆÆÆÆÅÄÃÃÂÂÂÂÁÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÂÂÂÂÂÂÂÂÃÃÄÅÆÆÇÈËÏÐÐÐÐÐÐÐÐÑÑÑÒÒÒÒÒÑÑÑÑÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖ×ØÙÚÚÛÛÛÛÛÛÛÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÞßßààáãåçççèèèèééééééêêêêêêêêêëëëëììììììììììëëëêêêêêêêéééééèèèèçççãáàßßÝÜÛÛÛÚ×ÖÕÔÔÓÓÒÑÑÑÑÐÐÐÐÐÐÐÎÊÈÇÆÆÅÅÄÄÄÃÂÂÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾½½½½½½½½½½½½½½½½¼¼»»»»»»»»ºº¹¹¹¹¸¸········¸¸¹¹¹¹¹¹¸¸¸¸¸¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸·¶¶¶µµ´´´´´´´´´´´´´´´´³³³³²²²²²²²²²²²³³³³²²²²²²²²³³´´´´´´´´µµ¶¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸¸¸¹¹¹¹¸¹¹¹¹¹¹¹ººº»»»¼¼½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾½½½½¼¼»»»»»»»»»»»»º»»»¼¼¼¼½½½½½½¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÂÂÂÃÄÆÆÆÆÆÆÆÆÆÆÆÆÆÆÅÄÄÃÃÂÂÂÁÁÁÁÁÁÂÂÂÁÂÂÂÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÄÆÆÇÈÊÍÐÐÐÐÐÐÐÐÑÑÑÒÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÕÖÖ×ØÙÚÚÛÛÛÛÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÝÞßßààâäåçççèèèèééééêêêêêêêêêêëëëëìììììììììììëëëëêêêêêêêééééèèèèèççæäâàßÝÜÛÛÛÚØÖÕÔÔÓÓÒÒÑÑÑÐÐÐÐÐÐÐÏÌÊÈÇÇÆÆÆÆÅÄÃÂÂÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½¼¼¼»»»»»ºº¹¹¹¹¹¹¸¸¸¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸··¶µµ´´´´´µµµ´´´´´´´´³³³³³³³²²³³³³³³³³³³²²²²³³³³´´´´´´´µµµ¶·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»¼½½½½½½½¾½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½¼¼¼¼»»¼»»»»»»»»»»»»»¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÂÂÃÄÅÅÅÆÆÆÆÆÆÆÅÄÄÄÃÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÇÈÊÌÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÔÔÕÕÕÕÖ×ØÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÝÞßßàáâäåçççèèèèéééêêêêêêêêêêëëëëëëëëëëëëëëëëëëëëêêêêêêêêééééèèèèèççåâàßÝÜÜÛÛÚØÖÕÕÔÓÓÓÒÑÑÑÐÐÐÐÐÐÐÐÏÌÊÉÈÇÇÆÆÆÄÃÂÂÂÂÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½¼¼»»»»ºº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ºº¹¹¹¹¹¹¹¹¹¹¹¸··¶¶µµµµµµµµ´´´´´´´´´´³³³³³³³³³³³³´³³³³³²³³³³³³´´´µµµµµµ¶·¹¹¹º¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººººº»»»»¼½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½¼¼¼¼¼¼¼¼»»»»»»»»»»»»»»¼¼½½½½½½¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÂÂÃÃÃÄÄÄÄÄÅÅÄÃÃÃÂÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÇÈÊÌÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖ×ØÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÜÜÜÜÝÞßßàáãäæçççèèèèéééêêêêêêêêêêëëëëëëëëëëëëëëëëëëëêêêêêêêêêêêéééèèèèççäáàßÞÜÜÛÛÚÙ×ÖÕÔÔÓÓÒÑÑÐÐÐÐÐÐÐÐÐÐÐÎÌÊÈÇÇÆÆÄÃÃÃÂÂÂÁÁÁÁÁÁÀÀ¿¿¿¾¾¾¾¾¿¿¾¾¾¾¾¾¾¾½½½½½½½¼¼»»»ºº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº¹¹¹¹¹¹¹¹¹¹¹¹¹ºººººººººººº¹¹¹¹¸¸¸·¶¶µµ¶¶µµ´´´´´´´´´´´´´´´´´´´´´´´´³³³³³³³³´´´´´µµµµµµ¶·¸¹¹¹ººº¹¹¹¹º¹ºº¹¹¹¹¹¹¹¹¹¹ºººº»»»»»»¼½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¾¾¾¾¾¾¾¾½½½½½½½½½½½¼¼»»»º»»»»»»»»»»»¼¼½½½½½¾¾¾¾¾¾¿ÀÁÁÁÁÁÁÂÂÂÂÃÃÃÃÄÄÃÃÃÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÆÆÇÈÊÍÐÐÐÐÐÐÐÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÔÔÔÔÕÕÕÕÖ×ØØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝÝÞßßàáãåççççèèèéééêêêêêêêêêêêêëëëëëëëëêêêëëëëëëëêêêêêêêêêêêêéééèèèççãáàßÞÝÜÛÛÛÚØÖÕÔÔÓÓÒÑÑÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÈÇÆÆÆÅÄÄÃÂÂÂÁÁÁÁÁÁÁÀ¿¿¿¿¿ÀÀ¿¿¿¿¾¾¾¾¾¾¾½½½½½½¼¼»»»ºº¹¹¹¹¹¹¹¹¹¹¹º¹ºººººººººº¹ºººººººººººººººººººº¹¹¹¹¹¹¸¸····¶¶µ´´´´´´´´´´´´´´´´´´´´´´´´´´³³³´´´´´´´µµ¶¶¶¶··¹¹¹¹ººººººººººººººº¹¹¹¹ºººº»»»»»»»»¼½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾½½½½½½½½½½½¼¼»»ººººº»»»»»»»»»¼½½½½½½¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÂÂÂÂÃÃÃÃÃÂÂÂÂÁÁÁÁÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÅÆÆÇÈÊÎÐÐÐÐÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÔÕÕÕÖ××ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞßßàáãççççèèèèéééêêêêêêêêêêêêëëëëëêêêêêêêêëëëëêêêêêêêêêêêêêêééèèèççäâáßßÝÜÛÛÛÚÙ×ÕÔÔÓÓÒÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÇÆÆÆÆÄÄÃÂÂÂÂÁÁÁÁÁÁÁÀÀÁÁÁÁÁÀÀ¿¿¿¾¾¾¾¾¾¾¾½½½½¼»»»ººººººººº¹ºººººº»»»»ºººººººººººººº»»»ºººº»»»ºº¹¹¹¹¹¹¹¹¸¸¸·¶µµ´´´´´´´´´´´´´µ´´´´´´´´´´´´´´´´´´´µµ¶¶···¸¹¹¹¹¹ºººººººººº»»»»ºººººººº»»»»»»»¼¼¼½½¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀ¿¿¿¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½¼¼ºººººººº»»»»»»»¼½½½½½½¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÆÆÇÈËÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÕÕÕÖÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝßßàâåçççèèèèèééééêêêêêêêêêêêêëëëêêêêêêêêêëëëëëêêêêêêêêêêêêêééèèèçççäâàßÝÜÛÛÛÚÙ×ÕÕÔÓÓÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÍËÊÉÈÈÇÆÆÆÅÄÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¿¾¾¾¾¾¾¾½½½¼»»»»»ºº»»ºººººººº»»»»»»»»ººººº»»»»»»»»»»»»»»»»»»ººº¹¹¹¹¹¹¹¹¸·¶µµ´´´´´´´µµµµµµµµµµ´´´´´´´´´´´´´µµµ¶·¸¸¹¹¹¹¹¹¹ºº»»»»»»»»»»»»»»»ººº»»»»»¼¼¼¼½½½½½¾¾¾¾¾¿¾¾¾¾¿¿ÀÀÀÀÀÁÁÁÀÀ¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½ººººººººººº»»»»»¼½½½½½¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÁÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÆÆÇÉËÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÖ××ØÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝÞßßáâæççèèèèèèéééééêêêêêêêêêêêêêêêêêêêêêêêëëëëêêêêêêêëëëëêêêééèèèèççæâàßÝÜÜÛÛÛÚ×ÖÕÔÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÎÍÌËÉÈÇÆÆÆÆÅÃÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¾¾¾¾¾¾¾¾½½¼»»»»»»»»»»»»»»»»»»»¼»»»»»»»»»»»»»»»»»»»»»»»»»»»»»ººº¹¹¹¹¹¹¹¸·¶µµµµµµµµµµµµµµµµµµµµµµµµµ´´´´µµµ¶··¹¹¹¹¹¹¹¹ººº»»»»»»»»»»»»»»»»»»»»»»»¼½½½½½½½¾¾¾¾¾¾¿¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½ºººº¹¹ººººººº»»»»¼¼½½½½¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÅÆÇÉËÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÓÓÓÓÔÔÕÕÖ×ØÙÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝÞßàáäçççèèèèèèèèééééééêêêêêêêêêêêêêêêêêêêêêëëëêêêêëëëëëëëêêêéééèèèççæâàßÞÝÜÛÛÛÚØÖÕÔÔÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÉÈÇÇÆÆÅÄÃÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾½½¼¼»»»»»»»»»»»»»»»¼¼½¼¼»»»»»»»»»»»»»¼¼¼¼»»¼¼¼¼¼»»»»ºººº¹¹¹¹¹¹¸·¶¶µµµ¶¶¶¶µµµµµ¶¶¶¶µµµ¶¶¶µµµµµµ¶·¸¸¹¹¹¹¹¹¹ºººº»»»»»»»»»»»»»»»»»»»»»»»¼¼½½½¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾½½½º¹¹¹¹¹¹¹¹¹¹ººº»»»»¼½½½½½¾¾¾¾¾¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÅÆÇÈËÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÕÕÕÖØØÙÚÚÚÚÚÚÚÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÝßßàãæçççççèèèèèèéééééééééêêêêêêêêêêêêêêêêêêëëëëëëëëëëëëëëêêêéééèèèèççãáàßÝÜÛÛÛÚÙ×ÕÔÔÓÓÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÈÇÆÆÅÄÃÃÃÃÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁ¿¿¿¿¿¾¾¾¾½½½½¼¼¼¼¼¼»»»¼¼¼¼¼½½½½½¼¼¼»»»»»»»»¼¼¼½½½½¼½½½½¼¼»»»»ººººº¹¹¹¹¹¹¸··¶····¶¶¶¶¶¶···¶¶¶¶·¸·¶¶¶¶··¸¹¹¹¹¹¹¹ºººº»»»»»»»»»»»»»»»»»»¼¼¼»»»¼¼½½½½¾¾¾¾¾¾¾¾¿¿ÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀ¿¿¿¿À¿¿¿¿¿¿¿¿¿¾¾¾¾¾½½¹¹¹¹¹¹¹¹¹¹¹¹¹ºº»»»»¼½½½½½¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÔÔÕÕÖÖ×ØØØØØØØ××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÜÝÞßàâåçççççççèèèèèèééééééééêêêêêêêêéééêêêêêêêëëëëëëëëëëëëëëêêêêéééèèèçççâàßÝÜÛÛÛÚØÖÕÔÔÓÓÓÓÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÊÈÇÆÆÆÅÅÅÅÄÄÃÃÂÂÂÂÂÂÂÁÁÁÁÁÁÁÀ¿¿¿¿¾¾¾¾½½½½½½½½¼¼¼¼½½½½½½½½½½½½½¼¼¼¼¼¼¼¼¼½½½½½½½½½½½½½¼¼»»»»»»ººº¹¹¹¹¹¹¹¹¹¹¹¸¸····¸¹¹¸¸·¸¸¹¹¸¸··¸¹¹¹¹¹¹¹¹ººº»»»»»»»»»»»¼¼»»»»»»»¼¼¼¼¼¼¼¼½½½¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÂÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÁÁÀÀÀÀÀÀÀ¿¿¾¾¾¾¾½¹¹¹¹¹¹¹¹¹¹¹¹¹¹ºº»»»¼¼½½½½¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÏÏÎÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÔÔÔÕÕÖÖÖÖÖ×××ÖÖ×ØØØÙÚÚÚÚÛÛÛÛÛÛÜÜÞßàáäæçæçççççççèèèèéééééééêêêêêêêéééééêêêêêêëëëëëëëëëëëëêêêêêêêééééèèèçæâàßÝÜÛÛÛÚØÖÕÕÔÔÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆÆÆÆÆÆÆÅÄÄÃÃÃÃÃÂÂÂÂÁÁÁÁÁÁÁÀ¿¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½¾¾¾½½½½½½½½½½½½½½½½¾½½½½½½½½½½¼¼»»»»»»ººººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ºººº»»»»»»»»»¼¼¼»¼¼»»»»»»»¼¼½½¼¼½½½½¾¾¾¿¿¿¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¹¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»¼¼½½½½¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÂÂÃÃÄÆÆÆÇÈÉÊÌÐÐÐÐÐÐÐÐÏÍÌÌËÊÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÔÔÕÕÕÕÕÕÕÖÖÖÖÖ××××ØÙÙÚÚÛÛÛÛÛÜÜÝßßáããããããåæççççèèèèééééééêêêêêêêééééééêêêêêêëëëëëëëëëëêêêêêêêêêêéééèèèççãàßÞÜÜÛÛÚÙ×ÖÕÕÔÔÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÉÈÈÇÇÆÆÆÆÆÆÅÅÅÄÄÄÃÃÃÃÂÁÁÁÁÁÁÁ¿¿¿¿¿¾¾¾¾¾¾¾½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾½½½½½¼¼¼»»»»»ººººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ºººº»»»»»»»»»¼¼¼¼¼¼¼¼»»»»»»¼¼½½½½½½½½¾¾¾¾¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»»¼½½½¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÂÂÂÃÃÅÆÆÆÇÇÈÉËÍÎÏÐÐÐÐÍÌÊÉÉÉÈÈÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××ØÙÚÚÛÛÛÛÜÜÝßßààáàáááâãåççççèèèèèéééêêêêêêéééééééééêêêêêëëëëëëëëëëëêêêêêêêêêêêééèèèççäáßÞÜÜÛÛÛÚÙ×ÖÕÔÔÔÓÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÎÌËÊÉÈÈÈÈÈÇÆÆÆÆÆÆÆÅÄÄÄÃÂÂÁÁÁÁÁÁÀ¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½¼»»»»»ºººººººº¹¹¹¹¹¹¹¹¹¹¹¹¹ººººº¹¹¹¹¹ººº»»»»»¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼»»»¼¼½½½½½½½½¾¾¾¾¿ÀÀÀÀÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÄÄÃÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¹¹¹¹¹¹¹¹¹¹¹ºººº»»»»»¼½½½½¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀ¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÂÂÂÃÃÅÅÆÆÆÇÇÈÉËËÌÍÍÎÌËÉÈÈÇÇÇÇÇÇÈÉËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖ×ØÙÚÚÛÛÛÛÜÝÞßßßßßßßààáâäæçççççèèèéééêêêéééééééééééêêêêêêêêêëëëëêêêêêêêêêêêêêêêéééèèççåáßßÝÜÛÛÛÛÚØÖÕÕÔÔÔÓÓÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÎÌËËÊÊËÉÈÇÇÆÆÆÆÆÆÆÆÅÄÃÂÂÁÁÁÁÁÁÁÀÀ¿¿¿¿¿¿¾¾¾¾¾¾¾¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿¾¾¾¾¾¾¾½½½½½½¼»»»»»»ºººººººººººººººººººººººººººººº»»»»»»¼¼½½½½½½½¼¼¼¼¼¼¼¼¼»»»¼¼½½½½½½½¾¾¾¾¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÄÄÄÃÃÃÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÂÁÁÁÁÁÁÁÀ¿¿¹¹¹¹¹¹¹¹¹¹¹ººº»»»»»»¼½½½½¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÄÅÆÆÆÇÇÈÉÊÊËËËÊÉÈÇÇÆÆÆÆÆÆÇÇÈÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖØÙÚÚÛÛÛÛÜÜÝÞÞßßÞßßßßààâãäæççççèèèèéééééééééééééééêêêêêêêêêêëëëëëêêêêêêêêêêêêêééééèèèçæâàßÝÜÛÛÛÛÚÙ×ÖÕÕÔÔÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÏÏÎÎÎÌËÉÈÈÈÇÈÇÇÆÆÆÅÄÃÃÂÁÁÁÁÁÁÁÁÁÁÀÀÀÀ¿¿¿¿¿¿¿À¿¿¿¿¿¿¾¾¾¾¾¾¾¾¿¿¿¿¿¿À¿¿ÀÀÀÀ¿¿¾¾¾¾¾¾¾¾¾½½½¼¼»»»»»»»»»ººººººººººººº»»»ººº»ºººº»»»»»¼¼½½½½½½½½½½½½½½½¼¼¼¼¼¼¼½½½½½½½½¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÄÄÅÅÅÅÄÃÃÃÃÂÂÂÂÂÂÂÁÁÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÀ¿¹¹¹¹¹¹¹¹¹¹ºººº»»»»»»¼½½½½¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀÁÁÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÄÅÆÆÆÆÇÈÉÉÉÉÉÉÈÇÇÆÆÆÆÆÆÆÆÆÇÈÉÊËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖ×ØÙÚÛÛÛÛÛÜÜÜÝÝÝÝÝÝÞßßààáâãäæçççèèèèééééééééééééééêêêêêêêêêêêëëëëêêêêêêêêêêêêêêéééééèèççâàßÞÜÜÛÛÛÛÚÙØÖÕÕÔÓÓÓÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËËËÊÊÉÉÈÇÆÆÆÅÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÁÁÁÁÁÁÀÀ¿¿¿¿¿¿¿¿¿¿¿ÀÀÀÀÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾¾¾¾½½½½¼»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»¼¼½½½½½½½½½½½½½½½½½¼¼¼¼¼¼½½½½½½½½¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÂÂÂÂÃÃÄÅÅÅÅÆÆÆÆÆÅÅÄÄÄÄÃÃÃÂÂÂÂÂÂÃÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁ¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»¼¼½½½½¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀÀÀÀÁÁÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÄÅÆÆÆÆÇÈÈÇÈÈÈÇÇÆÆÆÅÄÄÅÅÆÆÆÇÈÉÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÕÖ×ØÙÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÞßßàááâãäçççèèèèééééééééééééééêêêéêêêêêêêêëëêêêêêêêêêêêêêêééééééèèççãàßÞÝÜÜÛÛÛÛÚÙ×ÖÕÔÔÔÓÓÓÓÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÍËÉÈÇÇÆÆÅÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¿¿¾¾¾¾½½½½¼¼¼»»»»»»»»»»»»»»»»»»¼»»»»»»»»»»¼¼½½½½¾¾¾¾¾¾½½½½½½½½½½½¼¼½½½½½½½½½½¾¾¾¾¿¿ÀÁÁÁÁÁÁÂÂÃÃÄÅÆÆÆÆÆÆÆÆÇÇÆÆÆÆÆÆÆÅÄÄÄÃÃÃÃÄÄÃÂÂÂÂÂÁÁÁÁÁÁÁÁÁ¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»¼¼½½½½¾¾¾¾¾¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÄÅÆÆÆÆÆÇÇÇÇÇÇÆÆÆÅÄÄÄÄÄÅÆÆÆÇÇÈÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÕÖ×ØÙÚÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÞßßààáâãåçççèèèèéééééééééééééééééééêêêêêêêëêêêêêêêêêêêêêêêêéééééèèççäáàßÞÜÜÛÛÛÛÛÚØÖÕÕÔÔÔÓÓÓÓÓÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÊÉÇÇÆÆÄÃÃÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾½½½½½¼¼¼¼¼¼¼¼¼¼»»»¼¼¼¼½½½¼¼¼¼¼¼¼½½½½½¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½½½½¾¾¾¾¿ÀÁÁÁÁÁÁÂÂÃÄÅÆÆÆÇÆÆÆÆÇÇÈÈÈÇÇÇÆÆÆÆÆÆÆÅÅÅÅÅÅÄÃÃÃÂÂÁÁÁÁÁÁÁÁÁ¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»¼¼½½½¾¾¾¾¾¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀ¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÄÄÅÆÆÆÆÆÆÆÆÆÆÆÅÅÄÃÃÃÃÄÅÆÆÆÆÇÇÈÊËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÖ××ØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝßßßàáâãæççèèèèèéééééééééééééééééééêêêêêêêêêêêêêêêêêêêêêêêéééééèèèèçæâàßßÝÜÜÛÛÛÛÚÙ×ÖÕÕÔÔÔÓÓÓÓÓÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÌÉÈÇÆÆÆÅÄÄÃÃÃÂÂÂÂÂÂÁÁÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÀÀÁÁÁÁÁÁÁÁÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾½½½½½½½½½½½½½½½¼¼½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½¾¾¾¾¾¿ÀÁÁÁÁÁÂÂÃÅÆÆÆÇÈÇÇÇÇÈÉÉÉÉÉÈÈÈÈÇÇÇÆÆÆÆÆÆÆÆÅÅÄÄÃÃÂÂÁÁÁÂÁÁÁÁ¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»¼¼¼½½½¾¾¾¾¾¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¿¿¿¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÃÄÅÅÅÆÆÆÆÆÆÅÄÄÃÃÃÂÃÃÄÅÅÅÆÆÆÇÈÉÊÌÎÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ××ÙÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßààâäæççèèèèèèéééééééééééééééééééêêêêêêêêêêêêêêêêêêêêêééééééèèèèççâàßßÝÜÜÛÛÛÛÚÚØ×ÖÕÔÔÔÔÔÓÓÓÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÈÇÇÆÆÅÅÄÄÄÃÃÃÃÃÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁ¿¿¿¿¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½¾¾¾¾¾¾¿ÁÁÁÁÂÂÃÄÆÆÇÇÈÉÈÈÈÈÉÉÉÊÊÉÉÉÉÈÈÈÇÇÇÇÆÆÆÆÆÆÆÆÅÄÃÂÂÂÂÂÂÂÁÁÁ¹¹¹¹¹¹¹¹¹¹¹¹¹ºº»»»»¼¼¼½½½¾¾¾¾¿¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÄÄÄÅÅÅÄÄÄÃÃÂÂÂÂÃÃÄÃÄÄÄÅÆÆÇÈÊÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÖ×ÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÝÞßßàáâäæçççèèèèèèèèèèèèèèéééééééééééêêêêêêêêêêêêêêêêêêêééééééééèèèççäáàßÝÜÜÜÛÛÛÛÚÙ×ÖÕÕÕÔÔÔÔÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÉÈÇÇÆÆÆÆÅÅÄÄÄÃÃÃÃÃÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÃÃÃÃÃÃÃÂÂÂÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½¾¾¾¾¾¿ÀÁÁÁÁÂÂÄÆÆÇÇÈÉÉÊÉÉÊÊËËËÌËÊÊÊÉÉÈÇÇÇÇÇÆÆÆÆÆÆÆÆÅÃÂÂÂÂÂÂÂÁÁÁ¹¹¹¹¹¹¹¹¹¹¹¹¹ºº»»»»»»¼½½½½¾¾¾¾¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÀÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¿¾¾¾¾¾¿¿¿¿¿¿¿¿¿ÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÄÄÄÄÃÃÂÂÂÂÂÂÂÂÂÃÃÃÄÄÆÆÇÈÊËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÖÖØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÝßßààáãåççççèèèèèèèèèèèèèèéééééééééééêêêêêêêêêêééééééééééééééééèèèççäáàßÞÝÜÜÛÛÛÛÚÙ×ÖÕÕÕÕÔÔÔÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏËÉÈÇÇÆÆÆÆÆÆÆÅÄÄÄÄÃÃÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÃÄÄÄÃÃÂÂÂÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾¾¾½½½½½½¾¾¾¾½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½¾¾¾¾¾¿ÀÁÁÁÁÂÃÅÆÇÇÈÈÉÊËËÌÌÌÌÎÎÏÍÍËÊÉÉÉÈÈÈÇÇÇÆÆÆÆÆÆÆÅÄù¹¹¹¹¹¹¹¹¹¹¹ºº»»»»»»»¼¼½½½¾¾¾¾¿¿¿¿ÀÀÁÁÁÁÁÀÀÀÀÀÀÀÀÁÁÁÀÀ¿¿¿¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿¿¿¿¿ÀÁÁÁÀÀÀ¿¿ÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÄÅÆÇÈÉÊËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÛÜÜÝÞßßàáâäæççççèèèèèèèèèèèèèèéèèèèéééééééééêêêêééééééééééééééééééèèèççåâàßßÝÜÜÛÛÛÛÚÙØ×ÖÖÕÕÕÔÔÓÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÈÈÇÇÇÇÆÆÆÆÆÅÄÄÅÄÄÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÃÄÄÄÃÃÂÂÂÂÂÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¾¿¿¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¿ÀÁÁÁÂÂÃÅÆÇÈÈÈÉËÌÍÎÎÎÎÏÐÐÐÍÌËÊÉÉÈÈÇÇÇÇÇÆÆÆÆÆÆÆÄÃÃù¹¹¹¹¹¹¹¹¹¹¹ºº»»»»»»»¼¼½½½½½¾¾¾¾¿¿¿ÀÀÀÀÀÀ¿¿¿¿¿¿¿ÀÀÀÀ¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¾¾¾¾¿¿ÀÀÀÀ¿¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÃÂÂÂÁÁÁÂÂÁÁÁÁÂÂÂÂÃÄÆÆÇÈÈÉËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÜÜÝÝÞßßàáâäæççççççèèèèèèèèèèèèèèèèèééééééééêêééééééééééééééééééééèèèççåâáàßÞÝÜÛÛÛÛÚÚÙØ××ÖÕÔÔÔÓÓÓÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÉÉÈÈÈÇÇÆÆÆÆÆÆÆÆÅÄÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÃÃÃÄÄÄÄÄÃÃÂÂÂÂÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¿ÀÁÁÁÁÂÂÃÆÆÇÈÈÊËÌÎÏÐÐÐÐÐÐÐÐÎÍÌÊÊÊÉÈÈÈÇÇÇÇÇÇÆÆÆÆÅÄÃÃÃÂÂÂù¹¹¹¹¹¹¹¹¹¹ººº»»»»»»»»¼½½½½½¾¾¾¾¾¿¿¿¿¿¿À¿¿¿¿¾¾¿¿¿À¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÆÆÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÕÕÖ××ØÙÚÚÛÛÛÛÛÛÛÛÛÜÜÜÝßßßàâãåçççççççççèèèèèèèèèèèèèèèééééééééééééééééééééééééêêéééèèèççæäâàßßÝÜÛÛÛÛÛÚÚÚØ×ÖÕÕÔÔÓÓÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÊÊÉÈÇÇÇÇÆÆÆÆÆÆÅÄÃÂÂÂÂÁÁÁÁÁÂÁÁÂÂÂÂÂÂÂÂÃÃÃÃÄÄÅÄÄÃÃÃÃÂÂÂÁÁÁÁÁÀ¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÂÂÄÆÆÇÇÈÊÌÎÐÐÐÐÐÐÐÐÐÐÏÎÍËÊÊÊÉÉÈÈÈÇÇÇÇÆÆÆÆÆÅÄÃÃÃÃø¸¹¹¹¹¹¹¹¹¹ºººººº»»»»»»¼½½½½¾¾¾¾¾¾¿¾¾¾¿¿¿¿¾¾¾¾¾¾¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÆÆÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÔÔÔÕÕÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÝßßàááâââãåçççççèèèèèèèèèèèèèèèèèèééééééééééééééééêêêêêêééééèèççççäâàßÞÝÜÜÛÛÛÛÛÚÚÙ×ÖÕÕÔÔÔÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËÊÉÉÈÇÇÇÇÇÆÆÆÆÄÃÂÂÂÂÂÂÂÂÂÂÂÂÂÃÂÂÂÂÂÂÂÃÃÃÃÄÅÅÅÅÄÄÄÃÃÂÂÁÁÁÁÁÀ¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÂÂÃÄÆÆÆÇÈÉÊÌÎÐÐÐÐÐÐÐÐÐÐÏÍÌËËËÊÉÉÈÈÈÈÈÇÆÆÆÆÆÆÅÄÃÃÃø¸¸¸¸¹¹¹¹¹¹ºººººººº»»»»»¼½½½½¾¾¾¾¾¾¾¾¾¾¿¾¾¾¾¾¾¾¾¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÇÇÈÊËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÔÔÔÕÕÖÖ×ØÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÝÞßßßààààâãæçççççèèèèèèççççèèèèèèèèèéééééééééééééêêêêêêêééééèèèçççäâàßÞÝÜÜÛÛÛÛÛÛÚÙ×ÖÕÕÕÔÔÔÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÌÊÉÉÈÇÇÇÇÆÆÆÅÄÃÃÂÂÂÂÂÂÂÃÃÃÄÃÂÂÂÂÂÂÃÃÃÃÄÄÅÆÆÆÆÆÅÅÄÃÃÂÁÁÁÁÁÀÀ¿¿¿¿¿¾¾¾¾¾¾¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾½¾½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÂÂÃÄÆÆÆÆÇÈÈÉËÎÐÐÐÐÐÐÐÐÐÐÎÍÍÌÌËËÊÉÉÉÉÈÇÇÆÆÆÆÆÅÅÃÃ÷····¸¹¹¹¹¹ººººººººº»»»»¼½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½¾¾¾¾¾¾½¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÇÇÈÉÊÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÓÓÓÔÔÕÕÕÖÖ××××ØÙÙÙÚÚÚÛÛÛÛÛÜÝÞÞÞßßßßàáâåçççççççççççççççèèèèèèèèèèèéééééééééééêêêêêêêéééèèèèçççåâàßßÝÜÜÜÛÛÛÛÛÚÚØ×ÖÕÕÕÔÔÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÉÉÈÈÈÇÇÆÆÅÄÃÃÃÃÂÃÃÃÃÃÄÄÄÃÃÂÂÂÂÃÃÃÄÄÅÆÆÆÆÆÆÆÆÆÆÄÂÂÁÁÁÁÁÀÀ¿¿¿¿¿¿¿¿¿¿¿¿¿À¿¿¿¿¿¿¿¿¿¿¾¾¾¿¿¿¿ÀÀ¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÂÂÃÄÅÆÆÆÆÇÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÎÍÎÎÎÍÌÌËËÊÊÈÈÇÇÆÆÆÆÆÄÃÃÂÂÂÁ¶····¸¹¹¹¹¹¹¹¹¹ºººººº»»»»¼½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½¼¼¼¼¼½½½½½½½½½½½½½½¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÄÄÅÆÆÆÆÇÈÈÊËÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÖÕÕÖÖ××××ØÙÚÚÛÛÛÛÜÜÜÝÝÝÞßßßàâäççççççççççççççççççèèèèèèèééééééééééêêêêêêêêêéééèèèèçççåâáßßÞÝÜÜÜÛÛÛÛÛÚÙ×ÖÖÕÕÔÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÌËÊÊÊÊÉÈÇÆÆÆÅÄÄÃÃÃÃÃÃÃÄÄÃÄÄÃÃÂÃÃÃÄÄÄÅÆÆÆÆÆÇÇÇÇÇÆÆÄÂÁÁÁÁÁÁÀÀÀ¿¿¿¿¿¿¿¿¿ÀÀÀÀ¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÀÀÀÀÀÀÀ¿¿¿¿¾¾¾¾¾¾¾¾¾½½½½½¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÂÂÂÃÄÅÆÆÆÇÇÇÈÉÌÎÏÐÐÐÐÐÐÐÐÏÎÎÎÎÏÎÍÍÍËÊÉÉÈÇÇÆÆÆÆÅÄÃÃÂÂÁ¶···¸¸¹¹¹¹¹¹¹¹¹¹ººººº»»»»»¼½½½½½½¾¾½½½¾¾¾¾¾¾½½½¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½¼¼¼»»»»¼¼½½½½½½½½½½½½½½¾¾¾¾¾¾¾¿¿¿ÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÅÅÆÆÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖ×ØÙÚÛÛÛÛÜÜÜÜÜÝÝÞßßàâäæççççççææçæççççççççèèèèèèééééééééêêêêêêêêêêééééèèèèçççåâáàßßÞÝÜÜÛÛÛÛÛÚÚØÖÕÕÕÔÔÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÎÍÌÊÉÈÇÆÆÆÆÅÄÄÄÄÄÄÄÄÃÃÄÄÄÄÃÃÄÄÅÄÄÅÆÆÆÇÇÇÇÈÈÇÇÆÅÃÂÂÁÁÁÁÁÁÁÀÀÀÀÀÀÀÀÀÁÁÁÀÀÀÀÀ¿ÀÀÀ¿¿¿¿¿ÀÀÁÁÀÀÀÀÀ¿¿¿¾¾¾¾¾¾¾¾¾½½½½¾¾¾¾¾¾¾¾¾¿¿¿¿¿ÀÁÁÁÁÁÂÂÂÂÃÃÄÅÆÆÆÇÇÈÉËÌÍÏÏÐÐÐÐÐÐÐÐÏÏÏÐÐÐÐÐÎÌËÊÉÈÈÇÇÇÆÆÄÄõ¶··¸¹¹¹¹¹¹¹¹¹¹¹ºººººº»»»»»¼½½½½½½½½½½½½½½½½½½½½½½½½¾¾¾¾¾¾½½½½½¼¼¼¼¼¼»»»»»»»»»¼¼½½½½½½¼¼½½½½½½½¾¾¾¾¾¾¿¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÃÃÄÆÆÆÇÈÊÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÕÖÖ×ØÚÚÛÛÛÛÛÜÜÜÜÝÞßßàáãäæçæåääääääæçççççççèèèèèèééééééêêêêêêêêêêêêééééèèèèçççåãáààßßÞÝÜÜÛÛÛÛÛÚØÖÖÕÕÔÔÓÓÓÒÒÒÒÒÒÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÈÈÇÆÆÆÆÆÅÅÅÅÅÅÄÃÃÄÄÅÅÄÄÅÅÆÅÅÆÆÇÇÈÈÈÈÈÈÈÇÆÆÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÁÁÁÀÀÀÀÀÀÁÁÁÁÁÁÀÀÀ¿¾¾¾¾¾¾¾¾¾¾¾½½¾¾¾¾¾¾¾¾¿¿¿¿¿ÀÀÁÁÁÁÁÁÂÂÂÂÂÃÄÅÆÆÆÆÇÈÈÉÊËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÌËÊÉÉÈÇÇÆÆÄõµ¶·¸¹¹¹¹¹¹¹¹¹¹¹¹¹ºººººº»»»»»¼¼½½½½½½½½½½½½½½½½½½½½½½½¾½½½½½½¼¼¼»»»»»»»»»»»»»»»»¼¼¼¼¼¼¼»¼¼½½½½½½½¾¾¾¾¾¿¿¿¿¿ÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÃÄÅÆÆÇÇÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖ×ØÚÛÛÛÛÛÛÛÜÜÜÝÞßàááâãäãâââáââäåçççççççèèèèèééééééêêêêêêêëêêêêêééééèèèèçççäãâáàßßßÝÜÜÛÛÛÛÛÚØÖÖÕÕÔÔÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÊÉÈÈÇÆÆÆÆÆÆÆÅÅÆÅÄÄÄÄÅÅÆÅÆÆÆÆÆÆÆÇÈÉÉÈÈÈÈÇÇÆÆÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÆÆÇÈÈÈÉÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËËÊÉÈÇÆÆÄÃôµµ¶·¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººººººº»»»¼¼¼½¼¼¼¼¼½½¼¼¼¼¼¼¼¼¼¼¼½½½½½½½½¼»»»»»»»»»»»ººº»»»»»»»¼»»»»»»»»¼¼½½½½½½¾¾¾¾¾¾¾¿¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÇÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÖ×ÙÚÛÛÛÛÛÛÛÜÜÝÞßßàààááááááááãäååæçççççèèèèèééééêêêêêêêêêêêêêêêééééèèèçççæäããáàßßßÝÜÜÛÛÛÛÛÚØ×ÖÕÕÔÔÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÉÈÈÇÆÆÆÆÆÆÆÆÆÆÆÅÄÅÅÆÆÆÆÆÆÆÆÆÇÈÉÊÊÉÉÈÇÇÆÆÅÄÄÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÅÆÆÆÇÇÇÈÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÌÌËÉÇÆÆÄô´µµ¶·¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»¼¼¼»»»»¼»»»»»»»»»»»»¼¼¼½½¼¼¼»»»»»»»»ººººººººº»»»»»»»»»»»»»»»»¼¼½½½½½¾¾¾¾¾¾¾¾¿¿¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÇÈÊÌÍÎÏÐÐÏÎÍÎÌÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÕÖ×ØÚÚÚÛÛÛÛÛÜÜÜÝÞßßßßààààààáâããäåæçççççèèèèèééêêêêêêêêêêêêêêêêêééééèèèççççæåäáàßßßÝÜÜÛÛÛÛÛÚÙ××ÕÕÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÊÉÉÈÈÇÇÆÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÈÉÊËÊÉÉÈÈÇÆÆÅÄÄÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÅÆÆÆÆÇÇÈÊËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÊÈÆÆÄô´´´µ¶¶¶···¸¸¸¸¸¸¸¹¹¹¹¹¹¹¹¹¹ºº»»»»»»»»»»»»»»»»»»»»»»»»»¼¼¼»»»»»ºººººººººº¹ººººº»»»»»ººººº»»»»»¼¼¼½½½½¾¾¾¾¾¾¾¾¿¿¿¿¿ÀÁÁÁÁÀÀÀÀÀÀÀÀ¿¿¿ÀÀÀÀÁÁÁÁÁÁÁÂÂÂÃÄÆÆÇÈÊÊËÊÊÊÊÉÉÉÈÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÕÕÖÖ×ÙÚÛÛÛÛÛÛÛÜÜÝÝÞÞßßßßßààáââãääåçççççèèèèèééêêêêêêêêêêêêêêêêêéééèèèççççççåãáààßÞÝÜÜÛÛÛÛÛÚÙØ×ÖÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÊÊÉÉÈÈÇÇÇÈÇÇÆÆÆÆÆÆÆÆÆÆÆÇÇÇÇÈÉÊËÌÊÊÉÈÈÈÆÆÆÅÄÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÂÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÄÅÆÆÆÆÇÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÊÈÇÆÅÃô´´´´µµµ¶¶¶¶¶¶¶¶¶¶¶·¸¹¹¹¹¹¹¹¹ºº»»»»»»ºº»»»»»»º»ºº»»»»»»»»»»»»»ººººº¹¹¹¹¹¹¹¹¹¹ºººººººººººººº»»»»¼¼¼¼½½½¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÀÀ¿¿¿¿¿¿¿¿¿¿¾¾¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÂÃÄÅÆÇÈÈÈÇÇÇÇÇÇÇÆÆÇÈÉÊËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÔÔÕÕÖÖØÙÚÚÛÛÛÛÛÛÜÜÜÝÝÞßßßßààáâãããäæçççççèèèèééêêêêêêëêêêêêêêêêêêéééèèèççççççåãáàßßÞÞÜÜÛÛÛÛÛÚÚÙØÖÖÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËËËÉÈÈÇÇÈÉÈÈÇÆÆÆÆÆÆÇÇÇÈÈÉÉÉËÌÍÌËÊÊÉÉÈÇÆÆÆÅÄÃÃÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÂÂÂÂÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÄÅÆÆÆÆÇÈÉËÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏËÉÇÆÆÄÃô´´´´´´µµµµµµµµµµµµ¶¶·¸¸¸¹¹¹¹¹ºººººººººººººººººººººº»»»»»»»»ººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººººº¹¹¹¹¹ººº»»»»»¼¼½½½¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¾¾¾¾¿¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÂÂÃÆÆÇÇÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÖÖ×ØÚÚÛÛÛÛÛÛÜÜÜÝÞßßßààáâââãäåçççççèèèèéééêêêëëëëëëêêêêêêêêéééèèèèèèçççæåãâáàßßÞÜÜÛÛÛÛÛÚÚÚÙØ×ÖÕÕÕÕÔÔÔÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÏÎÍÍËÊÉÈÈÈÉÊÊÈÇÇÇÇÇÇÈÉÉÉÊÊÊËÍÎÏÍÌËËËËÊÈÇÆÆÆÅÄÃÃÂÂÂÂÂÁÁÁÁÁÁÁÁÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀ¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÀÀÁÁÁÁÁÁÁÂÂÂÂÂÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÅÆÆÆÇÇÈÊËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÇÆÆÅÄó³³´´´´´´´´´´´´´´´´µµ¶····¸¹¹¹¹¹¹ººº¹¹¹¹¹ºººººººººººººº»ººººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»¼¼½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÀÁÁÁÁÁÂÂÄÆÆÆÅÅÄÄÄÅÅÄÄÄÅÆÆÆÇÇÉÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÐÐÐÑÑÑÑÑÑÑÒÓÓÓÔÔÔÔÕÕÕÖ×ØÙÚÛÛÛÛÛÛÜÜÝÝßßààááâââãåççççççèèèèééêêêëëëëëëëëêêêêêêééééèèèèèèççççåäâáàßßÞÜÜÛÛÛÛÛÛÚÚÚÙØ××ÖÕÕÔÔÔÔÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÏÎÍËÊÉÈÈÉÊËÊÉÈÈÈÈÉÉÊÊÊÊËËÍÏÐÐÎÍÍÍÌÌËÉÈÇÆÆÆÅÄÃÃÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¾¾¾¾¾¾¾¾¾¾¾¿¿ÀÀÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÇÇÈÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐËÈÇÆÆÄÃó³³³³´´´´´´´´´´´´´´´´µ¶¶¶¶·¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ºººººº¹¹¹¹¹¹¹¹¸¸¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»»¼½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÂÃÄÄÃÃÃÃÃÃÃÃÃÃÃÃÄÅÆÆÆÇÈÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÔÔÔÕÕÖ×ØÚÛÛÛÛÛÛÜÜÝÞßàààáááâãåççççççèèèèééêêêêëëëëëëëëëêêêêêééééèèèèèèççççæåâáàßßÞÝÜÜÛÛÛÛÛÛÚÚÚÚÚØ×ÖÕÕÔÔÔÔÔÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÊÉÉÉÊËÍÍËÊÊÊËËËËËÌÍÎÐÐÐÐÐÎÍÍÌÌÊÉÈÇÆÆÆÆÅÄÃÃÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¾¿¿¿¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÁÁÁÁÁÁÁÂÂÂÃÄÄÅÆÆÆÇÈÉÊÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÇÆÆÆÄIJ²²³³³´´´³³³³´´´´´´´´´µµµ¶¶¶·¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹º¹¹¹¹¹¹¹¹¹¸·¶¶¶¶··¸¸¸¸·····¸¹¹¸··¸¹¹¹¹¹ºº»»»»»¼½½½½¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¿ÀÁÁÁÁÂÂÃÂÂÂÂÂÂÂÂÂÂÂÂÃÃÄÆÆÆÇÈÊÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÔÔÕÕÖÖØÚÚÛÛÛÛÛÜÜÝßßààáááâäæççççççèèèèéééêêêëëëëëëëëêêêêêêêééééèèèèèççççççåâáàßßÞÝÜÜÛÛÛÛÛÛÛÛÛÚÚÙ×ÖÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÊÊËÌÍÎÎÎÎÎÍÍÍÍÍÏÐÐÐÐÐÐÐÏÎÍÍÌÊÉÈÇÇÇÆÆÆÅÄÃÃÃÂÂÃÃÃÃÃÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀ¿¿¿¿¿¿¿¿¾¾¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÂÁÂÂÂÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÊÈÇÆÆÆŲ²²²³³³³³³³³³³³´´´´´´´´µµµ¶¶···¸¸¸¹¸¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸·¶·¶¶µµµµµ¶¶···¶¶¶µ¶¶··¶¶¶¶·¸¹¹¹¹ºº»»»»»¼¼½½½¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½½½½½½½½½¾¾¾¾¿¿ÁÁÁÁÂÂÁÁÁÁÁÁÂÂÂÂÂÂÂÂÃÃÅÆÆÇÈÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÖ×ÙÚÚÛÛÛÛÜÜÝÞßàááââäæççççççèèèèéééêêêêëëëëëëëêêêêêêêêéééééèèèèççççççäáààßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÚÚØ×ÖÖÕÕÕÕÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÍÌÌÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍËÊÉÈÇÇÇÆÆÆÆÅÄÄÃÃÃÃÄÄÄÄÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÂÂÂÁÁÁÁÁÁÁÁÁÁÀÀÀÀ¿¿¿¿¿¿¿¿¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÁÁÂÂÂÂÃÄÅÆÆÆÆÆÆÇÈÉÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆƱ±²²²²²²²²²²²²³³³³³´´´´´µµµ¶¶¶¶¶¶······¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·¶µµµµµµµ´µµµµ¶¶¶¶µµµµµ¶¶µµµ¶¶·¹¹¹¹¹ººº»»»»¼¼½½½½¾¾¾¾½½½½½¼¼¼¼¼¼¼½½½½¼¼¼¼¼¼½½½½½½½¾¾¾¿¿ÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÅÆÆÇÈÉËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÒÒÒÓÓÓÔÔÕÕÖ×ØÚÚÛÛÛÛÜÜÝßßàááâãåççççççèèèèééééêêêëëëëëëëëëêêêêêêéééééèèèèèèççççæãáààßßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÚÙØ××ÖÕÕÕÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÊÉÈÇÇÇÇÇÆÆÆÆÅÅÄÄÅÅÅÅÄÄÃÃÂÂÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÀÀÀÀ¿¿¿¿¿¿¿¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÃÃÄÅÆÆÆÆÆÆÇÈÊÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÊÉÈÆÆ°°±²²²²±±°±±±²²²³³³³³´´´´´µµµµµµµµµ¶µ¶¶··¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸¶¶µµ´´´´´´´´´´´µµµµµµµµµµµµ´´µµµ¶¸¹¹¹¹¹ºººº»»»¼¼½½½¾¾½½½½½¼¼¼¼»»»»¼¼¼¼¼¼¼¼»»¼¼¼¼¼½½½½¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÇÈÉÊÌÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÖ×ØÚÛÛÛÛÜÜÜÞßàááâãäæççççèèèèèééééêêêëëëëëëëëëêêêêêêêêééééèèèèèèèçççåãááààßßÞÞÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙØ×ÖÖÖÕÕÔÔÔÓÓÓÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÉÈÈÈÈÇÇÇÆÆÆÆÆÆÆÆÆÆÅÅÄÃÃÂÂÁÁÂÂÂÂÂÂÃÃÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀ¿¿¿ÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÃÃÄÅÆÆÆÆÆÆÆÇÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÎËÉÇǯ¯¯°°°¯¯¯¯¯¯¯°±²²²³³³³´´´´´´´´´´´´µµµµµ¶¶·¸¸··¸¹¹¹¹¹¹¹¸·¶µµ´´´´´´´´´´´´´´´´´´´´´´´´´´´´µµ¶¶·¹¹¹¹¹ººº»»»»¼¼½½½½½½½¼¼¼»»»»»»»»»»»»»»»»»»»»»»»¼½½½½¾¾¾¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÇÈÊËËËÍÍÍÎÎÎÎÏÐÎÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÔÔÕÖÖØÚÛÛÛÛÛÜÝÞßàááâãæççççèèèèèééééêêêëëëëëëëëëëêêêêêêêêééééèèèèèèèççæãâáààßßßßÞÝÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙØ××ÖÕÕÔÔÔÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÉÉÈÈÈÈÈÈÇÇÆÆÆÆÆÆÆÆÆÆÅÄÄÃÂÂÂÂÂÂÃÃÄÄÃÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÂÂÃÃÄÄÅÆÆÆÆÆÆÇÈÈÊÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÉÈ®®®®¯®®®®®®®®¯°°²²²²²³³³´´´´´´´´´´´´´´µ¶¶¶¶¶¶¶··¸¹¹¸·¶µµµ´´´´´´´³³´´´´´´´´´´´´´´´´´´´´´´µµ¶·¸¸¹¹¹¹¹ºº»»»»»¼½½½½½¼»»»»»»»»»»»»»»»»»»»»»»»»»»»»¼½½½½¾¾¾¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÅÆÆÇÈÈÈÉÉÉÊËËÊÊÌËËËÌÎÍÍÎÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÖØÚÛÛÛÛÜÜÝßßàáâãåççççèèèèèèéééêêêëëëëëëëëëëëêêêêêêêéééééèèèèèèçççåãâáààßßßßßÞÞÝÝÜÜÜÛÛÛÛÛÛÚÚÚØ××ÖÕÕÔÔÔÓÓÓÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËËÊÊÉÉÉÉÉÈÇÇÇÇÆÆÆÆÆÆÆÆÅÅÄÃÃÃÃÄÄÄÅÅÄÄÃÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÁÁÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÃÃÄÅÆÆÆÆÆÆÇÇÇÈËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÊÉ­­­®®®­­­¬¬¬­®®¯°±²²²²²³³³´´´´´´´´´´´´µµ¶µµµµµ¶¶¶·¶¶µµ´´´´´´³³³³³³³³³³³´´´´´´´´´´´´´´´´´´µµ¶¶·¹¹¹¹¹¹ººº»»»»¼¼¼¼¼»»»»»ººººººººººººººººººººº»»»»»»¼½½½¾¾¾¿¿ÀÀ¿¿¿¿ÀÀÀÁÁÁÁÁÁÁÁÂÂÃÄÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÉÉÉÉÉÊËÍÏÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÓÓÔÔÕÕ×ÙÚÛÛÛÛÜÝÞßßàâäåçççççèèèèèéééêêêëëëëëëëëëëëëêêêêêêêéééééèèèèèççççäãâáààßßßßßßÞÞÝÝÜÜÜÜÛÛÛÛÛÚÚØ×ÖÖÕÔÔÔÔÓÓÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËËËËËËÊÉÈÈÈÇÇÇÇÆÆÆÆÆÆÆÆÅÅÅÅÅÆÆÆÆÅÅÄÄÃÃÂÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÃÄÄÅÆÆÆÆÇÇÇÇÇÉÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌËÊÉ«««¬¬¬«««ªª««­­®¯¯¯°°±²²²²³³³³³³³³´´´´´µµµµµµµµµµµµ´´´´´´³³³³²²²²²²²³³³³³³³´´´´´³³³³³´´´´´µµ¶¶¶·¸¹¹¹¹¹ººº»»»»»»»»»»ººº¹¹¹¹¹ºº¹¹º¹¹¹¹¹¹¹¹¹¹ººº»»»»¼½½½¾¾¾¾¿¾¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÇÇÇÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÔÔÕÕ×ÙÚÛÛÛÛÜÝÞßàáãåçççççèèèèèéééêêêêëëëëëëëëëëëêêêêêêêêéééééèèèèèçççåäâááààßßßßßßÞÞÝÝÝÜÜÜÛÛÛÛÚÚÚØ×ÖÕÕÔÔÔÔÓÓÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÌÌÌËËËÊÊÉÉÈÈÇÇÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÅÄÄÃÃÂÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÃÄÅÅÆÆÆÆÇÇÇÈÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊɪªªªªª©©©©©ªª«­®®®®®¯¯°°±²²²²²²²²³³´´´´´´´´´´µµµ´´´´´´´³³³³²²²²±±±±²²²²³³³³³³³³³³³³³³³³´´´´´µµµµ¶·¸¹¹¹¹ººº»»»»»»»ººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ººº»»»¼½½¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÀÁÁÁÁÁÂÂÂÃÄÅÅÄÄÅÅÅÅÆÆÆÆÆÆÆÆÆÆÇÇÇÈËÏÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÔÔÕÕ×ØÚÛÛÛÜÜÝÞßàâåçççççèèèèèéééêêêêëëëëëëëëëëëêêêêêêêêêéééééèèèèçççæäãâááààààààßßßÞÝÝÝÜÜÜÛÛÛÛÚÚÙØÖÕÕÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÌÌËÌËËËÊÉÈÈÈÈÇÇÇÇÇÇÆÆÆÇÇÇÇÇÇÇÆÆÆÄÄÃÃÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÅÆÆÆÆÇÇÈÈÈÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉ©©©©©©©©©©©©©ª¬­­­®®®®®®¯¯°°±²²²²²³³´´´´´´´´´´´´´´´´³³³³²²²²±°¯¯¯¯°°±±²²²²³³³³³³³³³³³³³´´´´´´´´µµµ¶·¹¹¹¹ºººººººººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ºº»»»¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿ÀÁÁÁÁÁÁÂÂÂÃÃÃÃÃÃÃÃÃÃÄÄÅÅÅÅÆÆÆÆÆÇÉÍÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÖ×ÙÚÛÛÛÜÜÝßßàãçççççèèèèèéééêêêêêêëëëëëëëëëëêêêêêêêêêêééééèèèççççåäââááàààààààßßÞÞÝÜÜÜÜÛÛÛÛÛÚÙ×ÖÕÕÔÔÔÔÔÓÓÓÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÍÌÌÌÌÌËÊÉÉÉÉÉÈÈÈÈÈÇÈÈÈÈÈÉÈÈÇÇÆÆÅÄÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÆÇÇÈÈÉÊËÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÌËɨ¨¨¨¨¨¨¨¨¨¨©©©ª««¬­­­­­­­®®®¯¯°°±²³³³³´´´´´´´´´´´´³³³²²²²²±¯¯®®®®®®®¯¯°±²²²²²²²²²²²²³³³³´´´´´´´´´´µ¶¶¸¹¹¹¹¹¹¹ºº¹¹¹¹¹¹¹¸¸¸¸¸¸¹¹¸¸···········¸¸¹¹¹¹º»»»»¼¼¼¼¼½½½½½¾¾¾¾¾¾¿¿ÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÄÅÅÆÆÆÇÈËÎÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÕÖ×ÙÚÛÛÛÜÜÝßàâæçççèèèèèéééééêêêêêêêëëëëëëëëëêêêêêêêêêêéééèèèèçççåäãââáááááááàßßßßÝÝÜÜÜÜÛÛÛÛÚÚØÖÕÕÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÍÎÍÍÍÍÌÊÊÊÊËÊÉÉÉÉÉÉÉÉÉÊËËÉÈÇÆÆÅÄÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÆÇÈÈÉÊÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÎÍËÊÊɨ¨¨¨¨¨¨¨¨¨¨¨¨©©©ªªªªªªªª«¬­­®®¯¯°²²³³³³´´´´´´³³³³³³²²²±°¯¯®®­­­¬¬­­­®®¯¯¯°±±²²²²²²²²²³³³³´´´´´´´´´´µµ¶¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸··¶¶¶¶···¶¶¶¶¶¶¶¶µµµµµ¶¶¶·¹¹¹ºº»»»»»»»»¼½½½½½¾¾¾¾¾¾¿¿¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÃÃÄÅÆÆÇÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÖ×ÚÚÛÛÛÛÜÝßàãçççèèèèèèééééêêêêêêêêêêëëëëëëëêêêêêêêêêêéééèèèçççæåäããâââââââáàßßßÞÝÜÜÜÜÛÛÛÛÛÚÙØÖÕÕÔÔÔÔÔÔÓÓÓÓÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÎÎÎÎÎÍÌÌËÌÌÌÌËËÊÊÊËËËËÌÎÍËÈÇÆÆÅÄÃÃÃÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÃÄÅÆÆÆÆÇÈÉÊËËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÉÉȨ¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©©©©©©©©ª««¬­®®¯°²²²³³³³³³´³³²²²²²±°°¯®®®­¬««ªªª««¬­­®®®®¯¯°°°°°±²²²²²³³³³³´´´´´´´´µµ¶··¸¸¸¸¸¹¹¹¹¹¸·¶¶µµµµ¶¶µµµµµµµµµ´´´´´µµµ¶·¹¹¹¹ºº»»»»»»»¼¼½½½½½½½¾¾¾¾¾¿¿¿¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÆÆÇÈÉËÏÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÖ×ÚÛÛÛÛÜÜÞßáæççèèèèèèééééêêêêêêêêêêêêëëëëëëêêêêêêêêêêééèèèççççææåäãããääããáààßßßÞÞÝÜÜÜÛÛÛÛÛÚÙ×ÖÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÎÎÍÍÍÍÎÎÍÍÍÌÌÌÍÍÍÎÐÐÏÌÉÇÇÆÆÅÃÃÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÄÄÅÆÆÆÇÇÈÉËÌÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÉÉȧ§¦¦¦§§§¨¨¨¨¨¨¨©©¨¨¨¨¨¨¨¨©©ªª«­­®¯±²²³³³³³³³²²²²²±°¯®®®®­¬«ªª©©©©©ª«¬¬¬¬­­®®®®¯¯¯¯°²²²²²³³³³³³³³´´´´´µµµµµµµ¶¶¶¶···¶¶µµµµµµµµ´´´´´´´´´´´´´´´´µµ¶¸¹¹¹¹¹ººººº»»»»»¼¼¼¼¼½½½½¾¾¾¾¾¾¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÖØÚÛÛÛÛÜÝßàäççèèèèèèéééêêêêêêêêêêêêêêëëëëëëêêêêêêêêêééèèèèççççççæååååååãâáààßßßÞÝÝÜÜÜÛÛÛÛÛÚÙ×ÖÕÕÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÏÐÐÏÎÏÐÐÏÏÏÏÐÐÐÐÐÍÊÈÇÆÆÅÄÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÅÆÆÆÆÇÈÉÊÌÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÊÉÉȦ¦¥¥¥¦¦¦¦¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©ª««­®®¯°²²²³³³²²²±°°¯¯®®­­­¬«ª©©©©¨¨©©©ªªªªª«¬­­®®®®®¯¯°±²²²³³³³³³³³³³´´´´´´´´´´´´µµµµ¶¶µµµ´´´´´´´´´´´´´´´´´´´´´´´µµ¶·¸¹¹¹¹¹¹ºººº»»»»»»»»¼¼½½½½¾¾¾¾¾¾¿¿¿¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÆÆÇÈÊÌÏÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÔÔÕÕ×ÙÚÛÛÛÛÜÞàâåçèèèèèèéééêêêêêêêêêêêêêêêëëëëëëêêêêêêêêééèèèèççççççççççççæäãâáààßßßÞÝÝÜÜÜÛÛÛÛÛÚÚØÖÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÈÇÆÆÄÃÃÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÆÆÆÇÈÉÊÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÊÊÉ¥¥¥¥¥¥¥¥¥¥¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©ªª«­­®¯°²²²³²²±°¯¯®®­­¬¬««ª©©©¨¨¨¨¨¨¨¨©©©©©ªª«¬­­®®®®¯¯°±²²²²³³²²³³³³³³´´´´´´´´´´´´´´µµµ´´´´´´´´´´´´´´³³³³³³³´´´´´µµµ¶¶¸¹¹¹¹¹¹¹ººº»»»»»»»»¼¼½½½½½½¾¾¾¾¾¾¿¿¿¿¿ÀÀÀÁÁÁÁÁÁÁÂÂÂÃÅÆÆÇÈËÎÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÔÔÕÕ×ÚÚÛÛÛÜÝßàãççèèèèééééêêêêêêêêêêêêêêêëëëëëëëêêêêêêêêééèèèèççççççççççççåäâáááàßßßÞÞÝÜÜÜÛÛÛÛÛÚÚ×ÖÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÉÇÆÆÄÃÃÂÂÂÂÁÁÁÁÁÁÁÁÂÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÃÃÂÂÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÆÇÇÇÈÉÊÌÎÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍËÊɤ¤¤¤¤¤¤¤¥¥¥¦¦§§¨¨¨§§§§¨¨¨¨¨¨¨©©ª«¬®®¯±²²²²±¯®®®­¬«ªªªª©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©ªª«¬­­®®®¯¯°°°±²²²²²²²³³³³³´´´´´´´´´´´´´´´´´´´´´³³³³³³³³³³³³³³³³³³´´´´´µµµ¶·¹¹¹¹¹¹¹¹ºººººº»»»»»¼¼¼¼½½½½¾¾¾¾¾¾¾¾¿¿¿¿ÀÀÁÁÁÁÁÁÂÂÃÄÅÆÆÈÊÌÎÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÔÕÖØÚÚÛÛÜÝßßáäççèèéééééêêêêêêêêêêêêêêêëëëëëëëëêêêêêêêééèèèèèçççççççççççåäãááááàßßßßÞÝÜÜÜÛÛÛÛÛÚÙØÖÕÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÉÈÆÆÄÃÃÃÂÂÂÂÁÁÁÁÁÁÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÂÃÃÄÄÃÂÂÂÂÁÁÁÂÂÂÃÄÅÆÆÆÇÇÈÈÉÊËÎÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËʤ¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦¦¦¦¥¦¦§§¨¨¨¨©©©ª«­®¯°±²±¯®®®­¬ªª©©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©©ª«¬­­®®®®®¯¯°±²²²²²²²²³³³³³³³´´´´´´´´´´´´´´³³³²²²²²²²²²²²²²²²³³³´´´´´´µµ¶·¸¸¹¹¹¹¹¹¹¹¹¹ºººº»»»»»»»¼½½½¾¾¾¾¾¾¾¾¾¾¿¿¿ÀÁÁÁÁÁÂÂÂÃÅÆÆÇÉÊÌÍÏÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÕÕ×ÙÚÛÛÛÜÝßàâççèèééééééêêêêêêêêêêêêêëëëëëëëëëêêêêêêééééèèèèèçççççççççççåãâááááààßßßÞÝÜÜÜÜÛÛÛÛÚÚØ×ÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÈÆÆÅÄÃÃÂÂÂÂÂÂÁÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÄÃÃÂÂÂÂÂÂÃÃÄÄÅÆÆÆÇÈÉÉÊËÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÌˤ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¥¦§¨¨¨¨¨©©ª«­®¯°¯®®­¬«ªª©©©©¨¨¨¨¨¨¨¨¨§§§§¨¨¨¨¨¨¨¨¨¨¨¨©©©ª«¬­­­­­®®¯¯°°±²²²²²²²³³³³³³³³³³³³³´´³³³³²²²±±±±±²²²±±±°±²²²³³³´´´´´´µµ¶¶¶·¸¸¸¹¹¹¹¹¹¹¹¹ººººº»»»»¼½½½½½½¾¾¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÂÂÃÄÆÆÇÈÉÊËÌÎÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÖ×ÚÛÛÛÛÜÞßàãççèèéééééêêêêêêêêêêêêëëëëëëëëëêêêêêééééééèèèèèèèèèèèççççççäãââââááààßßÝÝÜÜÜÜÛÛÛÛÚÚØ×ÖÖÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÇÆÅÄÃÃÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁÂÂÄÅÆÄÃÃÃÂÂÂÃÃÄÅÅÆÆÆÇÈÉÉÊËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÌˤ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ª­®®¯®­¬«ª©©©¨¨¨¨¨¨¨¨¨¨¨§§¦¦¦¦¦§§§¨¨¨¨¨¨¨¨¨¨©©©ª«¬«¬¬­®®®¯¯°°±±²²²²²²²²²²³³³³³³³³³³²²²²°°¯¯¯¯¯¯¯¯¯¯¯¯¯°°±²²³³´´´´´´µµµµµ¶¶¶¶¶·¸¸¹¹¹¹¹¹¹¹ººº»»»¼¼½½½½½½½¾¾¾¾¾¾¿¿ÀÁÁÁÁÁÂÃÃÅÆÆÇÈÉÊÊÌÏÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÕÕÖÙÚÛÛÛÜÝßàâåççèèééééêêêêêêêêêêêêëëëëëëëëëêêêêêêêééééèèèèèèèèèèèççççççæäããââââáàßßßÞÝÝÜÜÜÛÛÛÛÛÚÙ××ÖÖÖÕÕÕÔÔÔÔÔÔÔÔÓÓÓÓÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÆÆÅÄÃÃÃÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÆÆÅÅÄÃÃÃÄÅÆÆÆÆÆÇÇÈÉÊÊËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÎ̤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©ª«­®®­«ª©©©¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¥¥¥¥¥¥¦¦¦§§¨¨¨¨¨¨¨¨©©ªªª«««¬­­®®¯¯°°°±±±±°°±²²²²²²²²²²²²²±±°¯¯®®®®®®®®®®®®®®¯¯°²²²³³³´´´´´µ´´´µ´´µµµ¶¶·¸¹¹¹¹¹¹¹¹ººº»»»»¼¼½½½½½½¾¾¾¾¾¿¿ÀÁÁÁÁÂÂÃÄÆÆÆÇÈÈÉËÎÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÖØÚÛÛÛÜÜßßáãççèèèééééêêêêêêêêêêëëëëëëëëëêêêêêêêééééééèèèèèèèèèèççççççæåäãããâããáàßßßÞÝÝÜÜÜÜÛÛÛÛÚÚÙØØ×ÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÉÇÆÆÅÄÃÃÃÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÆÆÆÆÆÅÅÅÆÆÆÆÆÆÇÈÈÉÉÊÊÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎ̤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©ª¬­¬«ª©©¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¥¥¥¥¥¥¥¥¥¥¥¦¦§§§¨¨¨¨¨¨©©©ªªªªª¬­­®®¯¯¯°°°¯¯¯¯°°°°±±±±±±±±±°¯¯®®®­­­­­­­­­­­­®®®®¯°²²²³³³´´´´´´´´´´´´´´µµµ¶·¸¹¹¹¹¹¹¹¹ºº»»»»»¼¼½½½½½¾¾¾¾¿¿ÀÁÁÁÁÁÂÂÃÅÆÆÆÇÇÈÉÌÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÖØÚÚÛÛÛÜÝßàâæççèèéééééêêêêêêêêëëëëëëêêêêêêêêêêêêééééééèèèèèèèèèèççççççåääããäääãáààßßÞÞÝÝÜÜÜÛÛÛÛÛÚÚÚÙ×ÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÈÇÆÆÅÄÄÃÃÃÃÂÂÂÂÂÂÃÃÂÂÂÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÉÉÊÊÊËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏΣ£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨©ª««ªª©©¨¨¨¨¨¨¨§§§§§§¦¦¥¥¥¤¤¤¤¤¤¤¥¥¥¥¦¦¦§¨¨¨¨¨¨©©©©©©ª«¬­­®®®¯¯¯®®®®®®¯¯¯¯¯¯¯¯¯¯¯¯®®®­­¬«««««¬¬««¬¬¬­­­®®¯°±²²³³³´´´´´´´´´´´´´´´´µµ¶·¸¸¹¹¹¹¹¹ººº»»»»¼¼¼½½½½¾¾¾¾¿¿ÁÁÁÁÁÂÂÂÄÅÆÆÆÇÇÈËÎÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÕÖ×ÙÚÛÛÛÜÜÞßáäççèèèéééêêêêêêêêëëëêêêêêêêêêêêêêêêêêééééééèèèèèèèèèèèçççççåäääååååãáààßßßÞÝÝÜÜÜÛÛÛÛÛÛÚÚÙØ×ÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆÆÅÄÄÃÃÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÇÇÇÇÇÇÇÈÈÉÉÉÊËÌÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ£££££££££¤¤¤££££¤¤¤¤¤¤¤¤¤¤¤¥¦§¨¨¨©©©©©©©¨¨¨¨¨¨¨§¦¦¦¦¦¦¦¥¥¥¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨¨¨©©©©ªª«¬­­®®®®®®®®®®®®®®®®®®®®®®®­­¬«««ªªªªªªªªªªª«««¬¬­­®®¯°²²³³³´´´´´´´´´´´´´´´´µ¶¶·¸¹¹¹¹¹¹ºººº»»»»»¼¼½½½¾¾¾¿¿ÀÁÁÁÁÁÂÂÃÄÆÆÆÇÇÈÉÌÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÖÙÚÛÛÛÛÜÝßàãçççèèèééêêêêêêêêêêêêêêêêêêêêêêêêêêêêéééééééèèèèèèèèèèçççççææææåæççåãáàßßßßÞÝÝÜÜÜÛÛÛÛÛÛÚÚÙØ×ÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÈÇÆÆÆÅÄÄÃÃÂÂÂÂÂÂÂÃÂÂÂÂÁÁÁÁÁÂÂÂÂÃÃÄÆÆÆÆÇÇÈÈÈÈÉÉÊÊËËËÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¥¦§¨¨¨¨©©©¨¨¨¨¨¨¨§§¦¦¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨¨©©©©ªª«¬­­­®®®­­­­­­­­­­­­­­¬¬¬¬«ªªªª©©©©©©©©©©©©ªªªªªªª«¬­®¯±²²³³³³³³³³³³³³³´´´´´µµ¶··¸¸¹¹¹¹ºººº»»»»»»¼½½½¾¾¾¿¿ÁÁÁÁÁÁÂÂÄÅÆÆÆÇÈÉÌÏÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÕÖØÚÛÛÛÛÜÝßßáãççèèèéééêêêêêêêêêêêêêêêêêêêêêêêêêêêééééééééééééèèèèèçççççççæççççççäâàßßßÞÞÝÝÜÜÜÜÛÛÛÛÛÛÚÚÚÚØ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÓÓÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÈÇÆÆÆÅÄÃÃÃÂÂÂÂÂÃÃÃÃÂÂÂÂÂÂÂÂÂÂÂÃÃÃÅÆÆÆÇÈÈÉÉÉÊÊÊËÌÍÍÎÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ££££££££££££££££££££££¤¤¤¤¤¤¤¥¦§¨¨¨¨¨¨¨¨¨¨¨§¦¦¦¦¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨¨©©©©ªª«««¬­­­­­­­­¬¬««««««««ªªªª©©©©©¨¨¨¨¨¨¨¨¨©©©©©©©©©©ª«­®¯°²²²³³³³³³³³³³³³³´´´´´µµ¶··¸¹¹¹¹¹ºººº»»»»»¼½½¾¾¾¾¿ÀÁÁÁÁÁÁÂÃÃÄÆÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÔÕ×ÚÚÛÛÛÜÜÞßàáåççèèèééêêêêêêêêêêêêêêêêêêêêêêêêêêêêéééééééééééèèèèèççççççççççççççåãáàßßßÞÞÝÝÜÜÜÜÜÛÛÛÛÛÛÛÚÚÚÙØ×××××ØØØØØ××ÖÖÖÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÉÈÇÇÆÆÅÄÃÃÂÂÂÂÂÃÃÃÃÃÂÂÃÃÂÂÂÂÂÃÃÃÃÄÆÆÇÇÈÉÊÊÊËËËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ£££££££££££££££££££££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨§¦¦¥¥¥¥¥¥¤¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨¨©©©©ªªª«­¬¬­­­­¬¬«ªªªªªªªªª©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©ª«­®®¯°²²³³²²²²²²²²³³³´´´´´µµ¶¶·¸¹¹¹¹¹¹ººº»»»»¼¼½½¾¾¾¿¿ÀÁÁÁÁÁÂÂÃÄÅÆÆÇÈÉÌÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÔÔÕ×ÚÚÛÛÛÜÜÝßßàãççèèèèééêêêêêêêêêêêêêêêêêêêêêêêêêêêéééééééééééèèèèèèçççççççççççççæãáàßßßßÞÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙÚÚÚÙÙÙÙØØ××ÖÖÖÕÕÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍËÉÈÈÇÆÆÄÄÃÂÂÂÂÂÃÃÃÄÃÃÃÃÃÃÃÃÃÃÃÄÄÄÅÆÆÇÈÉÊËÌÌÌÌÍÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ££££££££££££££££££££££££¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨§¦¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨©©©©©ª«¬¬¬¬¬¬¬¬«ªª©©©©©©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©«­­®®¯±²²²²²²²²²²²³³³´´´´´µµ¶¶¶·¸¹¹¹¹¹ººº»»»»¼½½¾¾¾¾¿¿ÀÁÁÁÁÁÂÂÃÄÆÆÆÇÈËÎÐÐÐÐÐÐÐÐÐÑÑÒÒÒÓÓÔÕÕ×ÙÚÛÛÛÜÜÝßßàâæçèèèèééêêêêëêêêêêêêêêêêêêêêêêêêêêêêéééééééééééèèèèèèçççççççççççççäâáàßßßßßÞÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÙØØ××ÖÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÉÇÆÆÆÄÃÃÃÃÂÃÃÃÄÄÅÅÃÃÂÃÃÃÄÄÄÅÅÆÆÆÆÇÈÊËÌÍÎÎÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ££££¢¢¢¢¢££¢¢¢¢££££££££££¤¤¤¤¤¤¤¤¥¥¥¦§§§¦¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§§¨¨¨¨¨¨¨¨©©©©ª«««ªªªªªªª©©©©©©©©©¨¨¨¨¨¨¨¨¨§§§§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©©ª«¬­®¯°±±±±±±±²²²²³³³´´´´´´µµµ¶··¹¹¹¹¹¹ºº»»»¼½½½¾¾¾¾¿¿ÀÁÁÁÁÂÂÃÄÅÆÆÇÈÉËÎÐÐÐÐÐÐÐÐÑÑÑÒÓÓÓÔÕÕ×ØÚÛÛÛÛÜÝÞßßáäççèèèèéêêêêëêêêêêêêêêêêêêêêêêêêêêêêêêêééééééééèèèèèèèèèèèèèèèççççäãááàßßßßßßßÞÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÙ×ÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÓÓÓÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÉÈÇÆÆÅÄÃÃÃÃÃÃÃÄÅÆÅÄÃÃÃÃÃÄÅÆÆÆÆÆÆÆÇÉËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐУ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¥¥¦¦¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨¨¨©©©©ªªª©©©©©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¦¦¦¦§¨¨¨¨¨§§¦¦§§¨¨¨¨¨©©©ª«­®®¯¯°°°°°°°±²²²³³³´´´´´´´µ¶¶·¹¹¹¹¹¹ºº»»¼½½½¾¾¾¾¾¿¿ÀÁÁÁÂÂÃÃÄÅÆÆÇÈÉËÐÐÐÐÐÐÐÐÑÑÑÒÓÓÓÔÔÕÖ×ÙÚÛÛÛÛÜÝßßáãççèèèèééêêëëêêëêêêêêêêêêêêêêêêêêêêêêêêêêééééééèèèèèèèèèèèèèèèèçççåãâáààßßßßßßßÞÞÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙØ×ÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÉÈÇÆÆÅÄÃÃÃÄÄÄÅÆÆÆÅÄÃÃÃÃÄÅÆÆÆÆÆÆÇÈÊËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐТ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦§§¨¨¨¨¨¨©©©©©©©¨¨©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¥¥¥¥¥¥¥¦¦¦¦¦¦¦¥¥¥¦¦¦§¨¨¨¨¨©©ª«¬­®®®®¯¯¯¯¯°±²²²³³³³³´´´´´µµ¶·¹¹¹¹¹¹ºº»»¼½½½½¾¾¾¾¿¿ÁÁÁÁÂÂÃÃÄÆÆÆÇÈÉÍÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÖ×ØÚÛÛÛÛÜÝÞßàâççèèèéééêêêêëëëëëêêêêêêêêêêêêêêêêêêêêêêêéééééééèèèèèèèèèèèèèèèçççäãâáààßßßßßßßßÞÞÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚØ××ÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÊÉÈÇÆÆÅÄÄÄÄÅÅÆÆÆÆÅÄÄÄÃÃÄÅÆÆÆÆÇÇÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐТ¢¢¢¢¢¢¢¢¢¢¢¡¡¡¡¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££¤¤¤¤¤££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨¨¨¨©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§§§§§§¦¥¥¥¤¤¤¥¥¥¥¥¥¥¥¤¤¥¥¥¥¥¥¦§¨¨¨¨¨¨©©ª«­­®®®®®®®¯°±²²²²²³³³³´´´´µµ¶··¸¹¹¹¹º»»¼½½½½½½¾¾¾¿ÀÁÁÁÁÂÂÃÃÅÆÆÆÇÈËÐÐÐÐÐÐÐÐÑÑÑÒÓÓÓÔÕÕÖ×ÙÚÛÛÛÛÜÝßàâæççèèéééêêêêêêëëëëêêêêêêêêêêêêêêêêêêêêêêéééééééèèèèèèèèèèèèèèèçççåãâáààßßßßßßÞÞÞÞÞÝÝÝÝÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚØØ××ÖÖÖÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÉÇÆÆÆÆÅÅÅÅÆÅÅÆÆÅÅÄÄÄÄÄÆÆÆÆÇÈÈÉÊËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐТ¢¢¢¢¢¡ ŸŸŸŸžžžŸ  ¡¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££¤¤££££££££¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¦¦¦¦¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨©©ª««¬¬­­®®®®¯°°±±±²²²²³³³´´´´µ¶··¸¹¹¹¹º»»¼½½½½½¾¾¾¿¿ÁÁÁÁÁÂÂÃÄÅÆÆÆÈËÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÖÖØÚÛÛÛÛÜÝßßáäççèèéééêêêêêëëëëêêêêêêêêêêêêêêêêêêêêêêéééééééééèèèèèèèèèèèèèèççççäâááàßßßßßßÞÞÞÞÞÞÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØ×ÖÖÖÖÖÖÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍÌÊÈÇÆÆÆÆÆÆÆÆÅÆÆÆÅÅÆÅÄÅÅÆÆÆÇÇÉÉÊÊËËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐТ¢¡ ŸŸžœžžŸ ¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦¨¨¨¨¨©©©ªªª««¬¬­­®®¯¯¯°°±²²²²³³´´´´µ¶·¸¹¹¹¹º»»»¼¼½½½½¾¾¾¿ÀÁÁÁÁÂÂÃÃÅÆÆÆÈÊÍÐÐÐÐÐÐÐÐÑÑÑÒÓÓÓÔÔÕÖ×ÙÚÛÛÛÜÜÞßáãççèèèééêêêêêêëëëêêêêêêêêêêêêêêêêêêêêêêéééééééééééèèèèèèèèèèèèççççæäâáààßßßßßßÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÙØØ×××ÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÒÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÊÈÇÆÆÆÆÆÆÆÆÆÆÆÅÅÆÆÆÆÆÆÆÇÇÈÊËËËÌÌÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐСŸžœ››››››››››››››œŸ Ÿ ¡¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨§§§§¦¦¦¦¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨©©©©©ªªª««¬­®®®®®¯°°±²²²²³³´´´µ¶·¸¹¹¹ºº»»»»¼¼½½½¾¾¿ÀÁÁÁÁÂÂÂÃÄÅÆÆÇÉÌÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÕ×ØÚÚÛÛÛÜÝßàâåççèèéééêêêêêêëêêêêêêêêêêêêêêêêêêêêêêêéééééééééééèèèèèèèèèèèèççççæåãâáààßßßßßßÞÞÞÝÝÝÝÝÝÝÞÝÝÞÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÙÙØ×ÖÖÖÕÕÕÕÕÔÔÔÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌËÉÈÇÆÆÆÆÆÆÆÆÆÆÅÅÅÆÆÆÆÆÇÇÈÉÊÊËËÍÍÎÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐОœ››ššššššššššššššš››œœœž ¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤££££££££££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¥¥¦§§§¨¨§¦¦¦¦¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££¤¤¤¤¤¤¤¤¤¤¤¥¦¦§¨¨¨¨¨¨¨©©©©ªªª«­­®®®®®¯¯°°±²²³³´´´µ¶¶¸¹¹¹ºº»»»»»¼½½¾¾¿ÀÁÁÁÁÁÂÂÃÃÄÆÆÇÉËÏÐÐÐÐÐÐÐÐÑÑÑÒÓÓÓÔÔÕÖ×ÚÚÛÛÛÜÝßßáäççèèèéééêêêêêêêêêêêêêêêêêêêêêêêêêêééééééééééééééééèèèèèèèèèèèçççæåãâáààßßßßßÞÞÞÞÞÝÝÝÝÝÝÞÞÞßßÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚØ×ÖÖÖÖÕÕÕÕÔÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌÊÉÇÇÆÆÆÆÆÆÆÆÆÆÅÆÆÆÆÆÇÇÈÈÈÉÊËÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЛ››ššššš™™™™™™™™™™™™ššššš›œŸ¢¢¢¢¢¢¢£££££££¤¤¤¤££££££££££££¢¢¢£¢¢¢££££££££££££££¤¤¤¤¤¤¤¤¥¥¥¦¦§¦¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££££££££££££¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨¨¨¨¨©©ªª«¬¬­­­®®®®¯°±²²³³´´´µµ¶¸¹¹¹ºº»»»»»¼½½¾¾¿ÀÁÁÁÁÁÂÂÃÅÆÆÇÈËÎÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÕ×ÙÚÛÛÛÜÜÞßàãçççèèèééêêêêêêêêêêêêêêêêêêêêêêêéêêééééééééééééééééèèèèèèèèèèèçççæåãâáààßßßßßÞÞÞÞÞÝÝÝÝÝÝÝÞÞßßßÞÝÝÝÝÝÜÜÜÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÙØ×ÖÖÖÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÍËÉÈÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÈÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÐÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐКššš™™™™™™™™™™™™™™™™™™™™šššœžŸ ¡¢¢¢¢¢££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤£££¤££££££££££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨¨¨©©©ª««¬«¬¬­­®®¯°±²²³³´´´µµ··¹¹¹ºººº»»¼½½¾¾¾¿ÀÁÁÁÁÁÂÂÄÆÆÇÈÉÌÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÔÕÖØÚÛÛÛÛÜÝßàâäçççèèèéééééêêêêêêêêêêêêêêêêêééééééééééééééééééééééèèèèèèèèèèççççäâáààààßßßßßÞÞÞÞÞÝÝÝÝÝÝÞÞßßßßÞÞÞÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÚÙ×ÖÖÖÕÕÕÕÔÔÔÔÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÉÈÇÇÇÇÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÉÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÐÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐК™™™™™™™™™™˜˜˜˜˜˜˜˜™™™™™™™šš››œžŸ ¢¢¢¢£££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££££££££££££££££¤¤¤¤¤¥¥¥¦¨¨¨¨¨¨¨¨¨¨¨¨¨©©ªªªªª««¬­®®¯°±²²³´´´´µµ¶·¹¹¹ººº»»»¼½½¾¾¾¿ÀÁÁÁÁÁÂÃÅÆÆÇÉËÎÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÖ×ÚÛÛÛÛÜÝßßáãæççèèèèééééééééêêêêêêêêêêêêéééééééééééééééééééééééééèèèèèèèèçççæäâáààààßßßßßßßßßÞÞÝÝÝÝÞÞßßßßßßßÞÞÞÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÚÙØ×ÖÖÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌÊÉÈÇÇÇÇÇÆÆÆÆÆÆÆÆÇÇÇÇÈÉÉÊÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÐÐÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЙ™™™™™™™™˜˜——————˜˜˜˜˜˜™™™™ššš›››œŸ ¢¢¢£££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££££££££¢££££££££££££¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨¨¨¨¨©©©©©©ªª«¬­®®¯¯±²³³´´´´µµ¶¸¹¹¹ººº»»»½½½¾¾¿¿ÁÁÁÁÁÁÂÄÆÆÇÈÊÎÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÔÔÕÖ×ÙÚÛÛÛÜÝÞßàâäçççèèèèèéééééééêêêêêêêêêêêéééééééééééééééééééééééééééèèèèèèçççåäâáààààßßßßßÞÞßßÞÞÞÝÞÞÞßßßßßßßßßßßÞÝÝÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚÙ××ÖÖÕÕÕÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÉÈÈÇÇÇÇÇÆÆÆÆÇÇÈÈÈÈÉÉÊËËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÐÐÐÐÐÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЙ™™™™˜˜˜˜˜—–––––––––———˜˜™™™™šššš›œž ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡    ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££££££££££¢¢¢¢¢¢££££££££££££¤¤¤¤¤¥¥¦¦§§§§§¨¨¨¨¨¨¨©©©©©©©©ª«¬­®®¯°²²³´´´´´µµ·¸¹¹¹ººº»»¼½½½¾¾¿ÀÁÁÁÁÁÂÃÄÆÆÈÊÍÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÕÕÖÙÚÛÛÛÜÜÞßßàâäçççèèèèèèèééééééêêêêêêêêêêééééééééééééééêééééééééééééèèèèèçççåãâáàààßßßßßßÞÞßßÞÞÞÞÞÞßßßßààààààßßßÞÝÝÝÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÙ×ÖÖÖÕÕÔÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÊÉÈÈÈÈÇÇÇÇÇÇÈÉÉÉÊÊÊËËËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÐÑÑÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐɘ˜˜˜˜˜˜—––••••••–•••–––—˜˜™™™™ššš›œŸ ¢¢¢¢¢¡  ŸŸŸŸŸ ŸŸžžžžŸŸ ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££££££¤¤¤¤¤¤¤¤¤¤£££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¥¥¦¦¦¦§§¨¨¨¨¨¨¨¨¨¨¨¨©©©ª«­­®®°±²³³³´´´´µµ·¸¹¹¹ººº»»¼½½¾¾¾¿ÀÀÁÁÁÁÂÃÅÆÇÊÍÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÕÕÖØÚÛÛÛÛÜÝÞßßàâæççççèèèèèèèéééééêêêêêêêêêêééééééééééééééêêêééééééééééèèèèèççæãâááààßßßßßßÞÞÞÞÞÞÞÞÞßßßßßàààááàßßßÞÞÞÞÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÙØ×ÖÖÕÕÔÔÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÌËÉÉÉÈÈÈÈÇÈÈÉÉÉÊËÌÌÍÍÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÐÐÐÐÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐȘ˜˜————–••••••••••••••••–—˜™™™™™™ššœœŸ  Ÿžœœœ›œœžœœžŸŸŸ ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¢¢¢£££££££££¤¤¤££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¥¥¥¥¦¦¦§¨¨¨¨¨¨¨¨¨¨¨©©©©ª«¬­®¯°²²²³³³´´´µ¶·¹¹¹¹ºº»»»¼½½¾¾¾¿¿ÀÁÁÁÂÂÄÆÇÉÍÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÕÕÖØÚÛÛÛÛÜÜÝÞßàáãåçççççèèèèèèéééééêêêêêêêêêêééééééééééééééêêêêéééééééééèèèçççæãâááàßßßßßßÞÞÞÞÞßÞßÞÞßßßßßààááááàßßßÞÞÞÞÝÝÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÖÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÊÊÉÉÈÈÈÉÉÉÉÉÊËÍÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÐÐÐÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐИ——–––––••••••••••••••••••–—˜˜™™™™™šš››œœœœ›››ššššš›››œ››œœœžžŸ ¡¡¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¦§§¨¨¨¨¨¨¨¨¨¨¨©©©ª«­®¯°°±²²²³³³´´µ¶¸¹¹¹¹ºº»»»¼½¾¾¾¾¿¿ÀÁÁÁÂÃÅÆÈËÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÖ×ÙÚÛÛÛÛÜÝÞßßàáâäççççççèèèèèèèéééêêêêêêêêêêéééééééééééééêêêêêêêéééééèèèçççççãâáààßßßßßßÞÞÞßßßßßßßßßßßßààáââáàßßßßßÞÞÞÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËËËÊÊÊÊÊÊÉÊÊËÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÑÑÐÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЖ––••••••••••••••••••••••••––˜˜™™™™™™šš›››ššššš™™™™ššš›››››œœœœœœœžŸŸŸ   ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢££££££££££££¢¢¢¢¢¢¢¢¢¢¢¡¢¢¢¢¢¢¡¡ ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨¨¨¨¨¨©©ª«¬®®¯¯¯°±²²³³´´´¶·¸¹¹¹¹ºº»»¼½½¾¾¾¾¾¿ÁÁÁÁÂÄÆÆÉÍÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÕÖØÚÛÛÛÛÜÜÝÞßßàáâäççççççèèèèèèèééééêêêêêêêêêééééééééééééêêêêêêêêééééèèèçççççäâáààßßßßßßßßÞßßßßßßßßßßßßàáâââáààßßßßßßÞÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÕÔÔÔÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÍÌËËËËËËËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЖ••••••••••”””““““““““””••••––˜˜™™™™™™™ššš™™™™™™™™™™™šššššš›››œ›››œœœžžžžžžŸ ¡¢¢¢¡¡¢¡¡¢¢¢¢¢¢£££££¢¢¢¢¢¢¢¢¢ ŸŸŸŸžžŸ    ŸžžžŸŸ ¡¢¢¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¥¥¦§§¨¨¨¨¨¨¨¨¨¨¨©©ª¬­®®®®¯°±²²³³´´µ¶··¹¹¹¹º»»»¼½½½¾¾¾¿¿ÁÁÁÁÃÅÆÈËÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÔÕÕÖÙÚÛÛÛÛÜÜÞßßßàáâäåçççççççèèèèèééééêéééééêêééééééééééééêêêêêêêêééééèèèèççççäâáààßßßßßßßßßßßßßßßßßßßßààáââââáàßßßßßßÞÞÞÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚØ×ÖÕÕÕÔÔÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÎÍÍÍÎÎÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЕ••••••••””“’’’’’’’’’’“””••••––˜˜˜˜™™™™™™™™™™™™™™™™™™™™™ššš›››››ššššš›œœœ››œœžžžŸžžžžŸ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ŸžžœœœœœœœžŸŸŸŸŸŸ ¡¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¤¤¥¦¦¦¦¦¦¦§¨¨¨¨¨¨¨©ª«¬­­®®®¯°±²³³´´´µ¶¶¸¹¹¹ºº»»»½½½½¾¾¾¾¿ÁÁÁÂÄÆÇÉÎÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÔÔÔÕÖØÚÛÛÛÛÜÜÝÞÞßßàáâãåæçççççèèèèèèééééééééêêêéééééééééééééêêêêêêêêéééèèèèççççåãáàßßßßßßßßßßßßßßßßßßàààááâââââáààßßßßßßÞÞÞÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÚÚØ×ÖÕÕÕÔÔÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЕ•••••””“’’’‘‘‘‘‘‘‘‘‘‘’“””•••••––—˜˜˜˜™™™™™™™˜˜˜˜˜˜˜™™™™™™™šššššššš™™šš››ššš›œ›œœœœœ››œžŸŸ¡¢¢¢¢¢¡¡  žœœœœ›››››››››››››››œœœœžŸ ¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¥¥¦¦¦¦¦¦¦§§¨¨¨¨¨©ªª««¬­­®®¯°²²³³´´´µµ¶·¹¹¹º»»»¼½½½½¾¾¾¿ÀÁÁÂÃÅÆÈÌÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÕÕ×ÚÛÛÛÛÜÜÜÝÝÞßààáâãäæçççççèèèèèèéééééééééêêêéééééééééééêêêêêêêêêééèèèèççççåâáàßßßßßßßßßßßßßßßßßàààáâããâããâááàßßßßßßßßÞÞÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚØ×ÖÕÕÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЕ••••”“’‘‘‘‘‘‘‘‘‘‘’’”••••••••––—˜˜˜˜˜˜˜—————˜˜˜˜™™™™™™™™™™™™™™™™™™™ššššššššš››››šššš››œžžžžžžœœ›››››ššššššššššššššš››››››››œœžŸ¡¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦§¨¨¨¨©ªªªªª«¬­®®¯±²³³´´´´µµ¶·¹¹¹º»»»¼¼½½½¾¾¾¿ÁÁÁÂÃÆÇËÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÕÕ×ÙÚÛÛÛÜÜÜÜÝÞßßààáââäæççççççèèèèèèééééêééêêêêéééééééééééêêêêêêêêééèèèèçççæäâáààßßßßßßßßßßßßßßßßàááâããäãããâááààßßßßßßßßÞÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚØ×ÖÕÕÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЕ••”“’’‘‘‘’“”•••••••••–––———––––––––——˜˜˜˜™™™™™™™™™˜˜˜˜˜™™™™™™™™™™™šššš™™™™šš›››œœœœœœœ››ššššššš™šš™™™™™™™ššššššš›ššš›››œœž ¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¥¥¥¦§¨¨¨©©©©©ªª«¬­®¯°²²³³´´´´´µ¶¹¹¹ºº»»»»¼½½¾¾¾¿ÀÁÁÂÃÆÇÊÏÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÕÖÙÚÛÛÛÛÜÜÜÝÞßßßààááâäçççççççèèèèèèéééêêêééêêêéééééééééééêêêêêêêééèèèèçççåäâáààßßßßßßßßßßßßßßßààáââãäääãââáááààßßßßßßßßÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÙ×ÖÕÔÔÔÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЕ”“’’‘‘‘‘’“””••••••••••––––––•••••–––——˜˜˜˜˜™™™˜˜˜————˜˜™™™™™™™™™™™™™™™™™™™™ššš››››››››šššššš™™™™™™™™™™™™™™™ššššššššš››››œž ¡¢¢¢¢££££££¤¤¤¤¤¤¤¤¥¤¤¤¤¥¥¥¥¥¦¦¨¨¨¨©©©©©ª«¬­®®¯±²²³³´´´´µ¶¸¹¹¹º»»»»¼¼½½¾¾¾¿ÁÁÁÂÅÆÉÍÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÔÔÕÖØÚÛÛÛÛÜÜÜÝÞßßßßàááâãåçççççççèèèèèééééêêééêêêêééééééééééêêêêêêêééèèèèçççåãâááàßßßßßßßßßßààààààáââãääääããâááàààààßßßßßßÞÞÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚØ×ÕÕÔÔÔÓÓÓÓÓÒÒÒÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐГ’‘‘‘‘‘’’““”””””•••••••••••••••••••–––––—˜˜˜˜———–––––—˜˜˜˜˜˜˜™™™™™™™™™™™™™™™šššššššššššš™™™™™™™™™™™™™™™™™™™™™™ššššššš›››žŸ ¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦¨¨¨¨©©©©©ªª¬­­®®¯±²³³´´´´µ¶·¸¹¹ºº»»»¼¼½½½¾¾¿ÁÁÁÂÄÆÈÌÐÐÐÐÐÐÐÑÑÑÑÑÒÓÓÓÔÔÕÖØÚÛÛÛÛÜÜÜÝÝÞßßßßàááãäæçççççççèèèèèééééêééêêêêêêééééééééêêêêêêêééèèèèçççåãâááàßßßßßßßàààààààááâãäåääääãâââááàààààßßßßßÞÝÝÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚØÖÕÕÕÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÒÑÑÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐБ‘‘‘‘‘’“““““””•••••••••••••••••••–––––—–––––•••••–—–––——˜˜˜˜™™™˜˜˜˜˜™™™™™™ššššš™™™™™™™™™™™™™™™™™™™™™™™™™™™ššššššššš›œŸ ¡¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦¨¨¨¨¨¨©©©©ª««¬­®¯°²²³³´´´´µ¶·¹¹¹º»»»»¼½½½¾¾¿ÀÁÁÂÄÆÇÊÍÐÐÐÐÐÐÑÑÑÑÑÒÓÓÓÔÔÕÖØÚÛÛÛÛÜÜÜÝÝÞßßßßàááããåççççççççèèèèèéééêêéêêêêêêêêêêéééêêêêêêêêééèèèèçççæäâááààßßßßßàààááááááâãäææåæåäãââââááàààààßßßßßÞÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚØÖÖÕÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐБŽŽŽŽŽŽŽ‘‘‘‘‘’’’’’“””••••••••••••••••••••••••••••••••••••••–––—˜˜˜˜———˜˜˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ššššššš››œžŸ¡¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨©©©©ªª««¬­®¯±²³³´´´´µµ¶·¹¹¹º»»»»¼½½½¾¾ÀÁÁÂÃÆÆÈËÎÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÕÖØÚÛÛÛÛÛÜÜÝÝÝÞßßßààáâãäåæççççççèèèèèééééêêêêêêêêêêêêêêêêêêêêêêééééèèèççççåãâáàààààßàààááââââãäåæçççæåãâââââááààààààßßßßÞÞÞÞÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚØ×ÖÖÕÕÔÔÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐАŽŽŽŽ‘‘‘‘‘’’“”•••••••••••••••••••••••••••••••••••••••–––––––––––—˜˜˜˜™™™™™™™™™™™™™™™™™™™™™˜˜˜˜™™™™™™™™™™™™ššššššš›œŸ¡¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©©©ªª««­®¯°²³³´´´´´µµ¶¸¹¹º»»»»»¼½½¾¾¿ÁÁÂÃÄÆÇÈËÐÐÐÐÐÐÑÑÑÒÒÓÓÔÔÕÕ×ÙÚÛÛÛÛÛÜÜÝÝÝÞßßßßààáâãäåæççççççèèèèéééééêêêêêêêêêêêêêêêééééééééééèèèççççæäâááààààßàààááâäãääæçççççæåäãâââáááàààààààßßßßÞÞÞÞÞÝÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÙØ×ÖÕÔÔÔÓÓÓÓÒÒÒÒÒÒÓÓÒÒÒÓÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐАŽŒŒŒŒŒŽŽ‘‘‘’“”•••••••••••••••••••••••••••••••••••••••••••••••••–––——˜˜™™™™™™™™™™™˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™™™™ššššššš›œŸ¡¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨¨©©©©ªªª«¬®®°²²³³´´´´´µ¶·¹¹ºº»»»»»¼½½¾¿ÁÁÁÂÃÅÆÇÉÍÐÐÐÐÐÑÑÒÒÓÓÓÔÔÕÖ×ÙÚÛÛÛÛÛÛÜÜÝÝÞßßßßßààáâãäååççççççèèèèééééêêêêêêêêêêêêêéééééééééééèèèèçççççæãâáááààààààáâãäååæççççççæåäãâââááààààààààààßßßßßßÞÞÞÞÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚØ×ÕÕÔÔÔÓÓÓÓÒÒÒÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐАŽŽŒŒŒŒŒŒŒŒŒŽŽŽ‘‘‘’”””””•••••••••••••••””””““““”””••••••••••••••••••••••–––˜˜™™™˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜—˜—˜˜˜˜˜˜™™™™™™™™ššššš››œžŸ ¡¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨¨©©©©ªª««­®®°²²³³³´´´´µµ·¹¹¹ºº»»»»¼½½¾¾ÀÁÁÁÂÄÆÆÇËÐÐÐÐÐÑÑÒÒÓÓÔÔÕÕÖ×ØÚÚÛÛÛÛÛÛÜÜÝÞÞßßßßààáâãããäåæççççèèèèééééêêêêêêêêêêêéééééééééééééèèèèèççççæäãâááàààààáâããäæçççççççæååãâââááààßßààààááààßßßßßßßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚØÖÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÒÑÑÑÑÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐАŽŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘’““““““““””””“””””””“’’’’‘‘’’’““““””””••••••••••••••••••––—˜™˜˜˜˜˜˜˜˜———————————————˜˜˜™™™™™™™™ššš››œœžŸ¡¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©©©©ª««­®®¯±²²³³³´´´´µ¶·¹¹ºº»»»»¼½½¾¾¿ÁÁÁÂÂÄÆÇÉÏÐÐÐÐÐÑÑÒÓÓÔÔÕÕÕÖØÙÚÚÛÛÛÛÛÜÜÜÝÞÞßßßßàááâãããäåççççèèèèéééééêêêêêêêêêéééééèèèèèèèèèèèèèèèçççåãââááááááááâãäåçççççççæåääãâââááààßßßàààáááààààßßßßßÞÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÕÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÑÑÒÒÒÒÒÒÒÒÒÒÒÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÒÒÒÒÒÒÒÒÒÒÒÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐЎŒŒŒŒŒŒŒŒ‹‹‹ŒŒŒŒ‘‘‘‘’’’’’’’““’’’’’’’’’‘‘‘‘‘‘‘‘‘‘‘’’’’““””””””“““””””•••••••––˜˜˜——–——–—–––––––––––––––——˜˜˜˜™™™™™šššš›œœžŸ¡¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¦¦¨¨¨¨¨¨©©©ªªª«­®®¯°±²²³³³´´´µ¶·¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÂÃÅÆÈËÐÐÐÐÐÑÑÒÒÓÓÔÔÕÕÖ×ØÙÚÚÛÛÛÛÛÜÜÜÝÞÞßßßààáááâãäåççççèèèèèéééééêêêêêêêééééèèèèèèèèèèèèèèèèèçççåäãâááââáááââäåæçççççççæåääãââââáààßßàààààááááàààààßßßÞÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÒÒÒÒÒÓÓÓÓÓÒÒÒÒÒÒÓÓÓÓÒÒÓÓÓÓÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐЍŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’’’’’’’’’’’“””•••••••–––––––––•–––––––––•••••••––—˜˜˜˜˜™™™™ššš››œžŸ¡¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©©ªªª«­®®¯°°±²²³³³´´´¶·¹¹¹ººº»»¼½½¾¾¾¿ÀÁÁÁÂÄÆÇÉÍÐÐÐÐÐÑÑÒÓÓÓÔÔÕÖ××ØÙÚÛÛÛÛÛÛÜÜÜÝÞßßßààààáâãäåçççççèèèèéééééêêêêêéééééèèèèèèèèèèèèèèèèèèçççåãââáâââãâáâãäæççççççççæååäãââââáààßßàààààááâáááààààßßßÞÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÙ×ÖÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÑÑÑÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐЌŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’““““”•••••••••••••••••••••••••••••••––——˜˜˜˜™™™™šš››œžŸ¡¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦¨¨¨¨¨©©ªªªª¬­®®®¯¯°²²²³³´´´µ·¹¹¹¹ºº»»¼½½½¾¾¾¿ÁÁÁÂÃÆÆÈËÐÐÐÐÐÐÑÑÒÓÓÓÔÕÕÖÖ×ÙÚÛÛÛÛÛÛÛÜÜÝÞÞßßßßàààáâäæçççççèèèèèèéééééééééééèèèèèèèèèèèèèèèèèèèèçççåãââááâãããâããäçççççççççæåääãâããâááààààààààááââáááááàßßßßÞÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚÙ×ÖÖÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐЋ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽŽŽ‘‘‘‘‘‘’’“”•••••••••••••••••••••••••••••••–————˜˜™™™™šš›››žŸ¡¢¢¢¢¢££££££££££¤£££¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨©©©ªª«¬­®®®®¯°±²²³³´´´µ¶¸¹¹¹¹º»»»¼½½½¾¾¿ÀÁÁÂÃÅÆÇÊÏÐÐÐÐÐÐÑÑÒÓÓÔÔÔÕÕÖ×ÙÚÛÛÛÛÛÛÛÜÜÝÞßßßßàààáâãæççççèèèèèèèèèééééééééèèèèèèèèèèèèèèèèèèèèççççäãââááâãããäããåççççççççæååääããããâááààààààààáááâããââááàßßßÞÝÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚØÖÖÕÕÕÔÔÔÔÓÓÓÓÓÓÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐЋ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘’“”•••••••••••••••••••••••••••••••–————˜˜™™™™š››œžŸ¡¢¢¢¢¢£££££££££££££££¤¤¤¤¤¤¤¤¤¥¦§¨¨¨¨¨©©ªª«¬­®®®®¯¯°²²³³´´´µ¶·¹¹¹¹º»»»¼¼½½¾¾¾ÀÁÁÂÃÄÆÇÉÍÐÐÐÐÐÐÑÑÒÒÓÓÔÔÔÕÕÖØÚÚÚÛÛÛÛÛÜÜÜÝÞßßßßààááãåççççèèèèèèèèèèèèééééèèèèèèèèçèèèèèèèèèèèèççççåäããââãäääåååçççççççççååääåäääãââááàààààààááââãäãââááàßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚØ×ÖÖÕÕÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÒÒÓÒÒÒÒÒÒÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÐÐÐЋ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽ‘‘’“””””””””•••••••••••••••••••••••––——˜˜˜™™™™šš›œžŸ ¡¢¢¢¢£££££££££££££££¤¤¤¤¤¤¤¤¤¥¦§¨¨¨¨¨©©©ª«¬­®®®¯¯¯±²²³³´´´µµ·¹¹¹¹º»»»¼¼½½¾¾¿ÀÁÁÂÃÄÆÇÉÌÐÐÐÐÐÐÐÑÑÒÒÓÓÔÔÔÕÖ×ØÙÚÚÛÛÛÛÛÜÜÝÝÞßßßàààáâäççççèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèçèèèççççæååäääååååææçççççççççæåääääåääãâáááàààààààáááââäåäãâááàßßßßÞÞÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÙØØÖÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÔÔÓÓÓÓÓÓÓÓÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽŽŽŽŒŒŽ‘‘’“’’’’’’“”””•”••••••••••••••••••––——˜˜˜™™™™šš›œžŸŸ ¡¢¢¢¢££££££££££££££¤¤¤¤¤¤¤¤¤¥¦§¨¨¨¨¨©©ªª««­®®®¯¯°±²²³³´´´´µ¶¹¹¹ºº»»»¼¼½½¾¾¿ÀÁÁÂÃÄÆÇÉËÏÐÐÐÐÐÐÑÑÑÒÓÓÔÔÔÕÖÖ×ØÙÚÚÛÛÛÛÛÜÜÝÞßßßßàááãäæççççççèèèèèèèèèèèèèèèèèèèèèèèèèèèèççççèèçççççççææææææææççççççççççåäääääååäââááàààààààààáâââãåæåäâááààßßßÞÞÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚÙØÖÖÕÕÕÕÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÖÖÖÖ××ÖÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŽŽ‘’’‘‘‘‘‘‘’“””””””””””••••••••••••––——˜˜˜™™™™šš›œžžŸŸ¡¢¢¢¢££££££££££££££¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨¨©©ªªª«­®®¯¯¯°²²²³³´´´´µ¶¸¹¹ºº»»»¼¼½½¾¾¿ÀÁÁÁÂÃÅÆÈËÎÐÐÐÐÐÐÑÑÑÒÓÓÔÔÔÕÕÖÖ×ØÚÚÛÛÛÛÛÜÜÝÞßßßßàáâãäæççççççççççèèèèèèèèèèèèèèèèèèèèèèèèççççèçççççççççççççææçççççççççççæåååååæåäãâááàààààààààáââãäåççæäãááààßßßßÞÞÝÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚØ××ÖÖÕÖÖÖÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖ××ØØØ×ÖÖÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŒŒŒŒŒŒŒŒ‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’“““““““””””••••••••••––——˜˜˜™™™™™šš›œžžžŸ¡¢¢¢¢£££££££££££££¤¤¤¤¤¤¤¤¥¦¦¨¨¨¨¨©©ªªªª«­­®¯¯°±²²²³³³´´´µ¶¸¹¹º»»»»¼½½½¾¾¿ÀÁÁÁÁÂÄÆÇÉÎÐÐÐÐÐÐÐÑÑÒÓÓÓÔÔÔÕÕÕÖ×ÙÚÛÛÛÛÛÛÜÜÝÞßßßààáãäæçççççççççççççççççèèèçèèèèèèèèèèèçççççèççççççççççççççæççççççççççççæææææææåãâááààààààààààáâãäåæçççåäâáàààßßßßÞÞÞÝÝÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÚÚÚØ××××ÖÖÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÓÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖÖÖ××ØØØÙÙØ××ÖÕÕÕÔÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÔÓÓÔÔÔÓÓÓÓÔÔÔÔÔÔÓÓÓÓÒÒÒÒÑÑÑÑÑы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽŽŽŽŽŽ‘‘’“““’’’’“““““”•••••••••––—˜˜˜™™™™™ššš››žžŸ ¢¢¢¢¢£££££££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ªªªª«¬­®®¯±²²²²³³³´´´µ¶¸¹¹ºº»»»¼½½½¾¾¿¿ÁÁÁÁÂÃÅÆÈÌÐÐÐÐÐÐÐÑÑÑÒÓÓÓÔÔÔÕÕÖ×ØÚÚÛÛÛÛÛÜÜÝÞßßßààáãäãääåååææçççççççççççççççççèèèèççèèèçççççççççççççççççççæççççççççççççççççççæåãâááààààààààààáâãåæçççççæäâáàààßßßßßÞÞÞÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÙÙØ×ÖÖÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ××ØØØÙÙÙÙÙØ×ÖÖÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÓÓÓÓÓÒÒÒÒÒÑÑы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽ‘‘’“’‘‘‘‘’“’’’“”••••••••––——˜˜™™™™™šššš›œžž ¢¢¢¢¢¢££££££££££££¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©©©ªª«¬­®®°±²²²²³³³´´´µ¶·¹¹¹º»»»¼½½½¾¾¾¿ÀÁÁÁÁÂÄÆÇÊÏÐÐÐÐÐÐÑÑÑÒÓÓÓÓÔÔÔÕÖ×ØÚÛÛÛÛÛÛÜÜÝÝÞßßßàáââââããããããåæççççççççççççççççèèèçççèèèçççççççççççççççççççççççççççççççççççççåäââáààààààààààááâãäæççççççäââáàààßßßßßÞÞÞÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÙ×ÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÖ×××××ØØÙÙÚÚÙÚÙØØ×ÖÖÖÕÕÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÓÓÓÓÓÓÒÒÒÒÒы‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽ‘‘‘‘‘‘‘‘‘’’‘’’””•••••••––——˜˜™™™™™ššššš›œž ¢¢¢¢¢¢££££££££££££¤¤¤¤¤¤¥¦§¨¨¨¨¨©©©©ªªª««­®¯¯°±²²²³³³´´´µµ·¹¹¹º»»»¼½½¾¾¾¾¿ÀÁÁÁÁÂÄÆÇÉÍÐÐÐÐÐÐÐÑÑÒÓÓÓÓÔÔÔÕÕÖØÚÚÛÛÛÛÛÛÜÜÝÝÞßßààààààáááááâãäæçççççææçççççççççèèçççççèçççççççççççççççççççççççççèççççççççççåäãâááàààààààààáááââäæççççççåäãâááàßßßßßÞÞÞÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚØ×ÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÖÖ×ØØØØØÙÙÚÚÚÚÚÚÚÚÙØØ×ÖÖÕÕÔÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÒÒÒҋ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒ‘‘‘‘‘‘‘’‘‘‘’““”••••••––—˜˜˜™™™™™™ššššš›œžŸ¡¢¢¢¢¢££££££££££££¤¤¤¤¤¤¥¦§¨¨¨¨¨©©©©ªªªª«¬®®¯±±²²²³³´´´´´µ¶¸¹¹ºº»»¼½½¾¾¾¾¿¿ÁÁÁÁÂÃÆÆÈÌÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÕÕÖØÙÚÚÛÛÛÛÛÜÜÜÝÝÞßßààßßààààààáâãäæççæåäääåæçççççççèèèçççççççççççççççççççççççççççèèèçççççççççæäãââááàààààààààááââãäæçççççççåäãâáàßßßßßÞÞÞÝÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÙØ××ÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖ××ØØØÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙØ×ÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÔÔÔÔÓÓÓÓÓÓÒÒҋ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘‘‘‘‘’’“”••••••–——˜˜˜™™™™™™™ššš››œžŸ¢¢¢¢¢££££££££££££¤¤¤¤¤¤¥¦§¨¨¨¨©©©©ªªªªª«¬®®¯°²²²³³³´´´´´µ¶¸¹¹¹º»»¼½½¾¾¾¾¿ÀÁÁÁÁÂÃÅÆÈÊÎÐÐÐÐÐÐÑÑÑÒÒÓÓÓÓÔÔÕÖ×ØÙÚÚÛÛÛÛÛÜÜÜÝÞßßßßßßßßßßàààáâãäåååääããããäåæçççççèèèèèèççççççççççççççççççççççèèèèççççççççæåäãââáááààààààààááâããäçççççççççåãáààßßßÞÞÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÙØ××××××ÖÖÖÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÖÖ×ØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙØ×ÖÖÕÕÕÕÕÕÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÔÔÓÓÓÓÓÓÓӋ‹‹‹‹‹‹‹‹‹‹‹‹ŠŠŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘‘‘‘‘‘’”•••••••–—˜˜˜™™™™™™™™ššš››œž ¢¢¢¢¢¢££££££££££¤¤¤¤¤¤¥¥§¨¨¨¨©©©©ªªªªª«¬­®¯°²²²³³³´´´´´µ¶·¹¹¹º»»¼½½¾¾¾¾¿¿ÁÁÁÁÂÂÄÆÇÈÊÎÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÕÕÖ×ØÙÚÚÛÛÛÛÛÜÜÝÝÞßßßßßßßßßßßààáââââãââââââãäåæççççèèèèèèçççççççççççççççççççèèèèèèèçççççççæåäããâáááááàààààààááâãäåçççççççççåâáàßßßÞÞÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÙØØØØ×××××ÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖ××ØÙÚÚÚÚÚÛÛÛÛÛÚÚÛÚÛÛÛÛÚÚÚÚÚÚÙØ×ÖÖÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖ××ÖÖÕÕÕÔÔÓÓÓÓÓÓӋ‹‹‹‹‹‹‹‹‹‰‰‡†…………†‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŽŽ‘‘‘‘’“”••••••––—˜˜™™™™™™™™™ššš››Ÿ¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨©©ªªªªªª«­­®¯°²²²³³³´´´´´µµ¶¹¹¹º»»¼½½¾¾¾¾¾¿ÀÁÁÁÂÂÄÆÆÇÈËÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÔÔÕÕÖ××ØÚÚÛÛÛÛÜÜÝÝÞÞßßßßßßßßßßßààááááâááááááâãääæççççèèèèèççççççççççççççççèèèèèèèèèççççççççåããââáááááááààààààááâãåççççççççççåãáààßßÞÝÝÝÜÝÝÜÜÜÝÝÜÜÜÜÜÜÜÛÛÛÜÛÛÛÛÛÛÚÚÚÙÙÙØØØØØØ××ÖÖÖÖÖÕÕÕÖÖÕÕÖÖØØÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙ××ÖÖÖÖÕÕÕÖÖÖÖ×××××××ÖÕÕÕÕÕÖÖ××ØÙ××ÖÕÔÔÔÓÓÓÓÓӋ‹‹‹‹‹Š‰ˆ†…„„ƒƒƒ‚ƒƒ„…†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’”••••••––—˜˜™™™™™™™™™™ššš›œž¡¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨©©ªªªªªª«¬­®®°²²³³³³´´´´´´µ·¹¹¹º»»¼½½¾¾¾¾¾¿ÀÁÁÁÂÃÄÆÆÆÈÊÍÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÕÕÖÖ×ØÙÚÛÛÛÛÜÜÝÝÞÞßßßßÞÞÞÞßßßßàààààááàááàááâãäåæçççèèèèèççççççççççççççççèèèèèèèèèççççççççåããââááààááâáááááááââäçççççççççççæäâáàßßßÞÝÝÜÝÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÙÙÙØØ××ÖÖÖ×ÖÖÖ×ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚØ×××ÖÖÖÖÖ××ØØØØÙÙØ×ÖÖÕÕÕÕÖÖ××ÙÚÚÙ×ÖÕÔÔÔÔÔÔÔԋ‹‹‹Š‰‡‡…ƒƒ‚‚‚‚‚‚ƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŽ‘‘‘’”••••••––—˜˜˜™™™™™™™™™ššš›œž ¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¥¦¦¨¨¨¨©©ªªªªªª«¬­®¯°²³³³³´´´´´´µµ·¹¹¹º»»¼½½¾¾¾¾¾¿ÀÁÁÁÂÃÄÅÆÆÇÉÍÐÐÐÐÐÐÑÑÒÒÓÓÓÓÓÔÔÕÕÖ×ØÙÚÛÛÛÛÜÜÜÝÝÞÞÞÞÞÞÞÞÞßßßßààààààààààààáâãäåæççççççèèçççççççççççççççççèèèèèèèèçççççççååäãâáááààááãâââââãããäæçççççççççççæäâáàßßßÞÝÝÝÝÝÝÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙÚÚÙÙØØØØØØÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚØØØ×Ö×××ØÙÙÙÙÙÚÚØ×ÖÖÖÖÖÖ××ØÙÚÚÚÙ×ÖÕÕÔÔÔÕÕՊŠ‰ˆˆ‡…„ƒ‚‚ƒƒ„‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽŽŽ‘‘‘’“••••••––—˜˜˜™™™™™™™™™ššš›œŸ¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨©©ªªªªª«¬­®¯°²³³³´´´´´´µµ¶¸¹¹ºº»»¼½½¾¾¾¾¿¿ÁÁÁÁÂÃÄÅÆÆÇÉËÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÔÔÕÕÖ×ØÚÚÛÛÛÛÜÜÜÝÝÝÞÞÝÝÝÞÞÞßßßßàààààààààààááââäåççççççççççççççççççççççççççççèèèèèçççççççæäãããââáááááâããããããååæçççççççççççççæäâáàßßßßÞÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØØØØÙÙÙÚÚÚÚÚÚÚØØ××××××ØÙÚÚÛÛÚÙ××ÖÕÕÕÕÕՉˆ‡††„ƒ‚€€€€€€‚ƒƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽ‘‘’’”••••••––—˜˜˜™™™™™™™™™ššš›œ ¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¥¥§¨¨¨¨©©ªªªª««­®®¯±²³³´´´´´´µµ¶·¹¹¹ºº»»½½½¾¾¾¾¿ÀÁÁÁÂÂÄÅÆÆÆÇÉÊÍÐÐÐÐÐÑÑÒÓÓÓÓÓÓÔÔÔÕÖ×ÙÚÚÛÛÛÛÜÜÜÜÝÝÞÝÝÝÞÞßßßßßßàààààààààààááâããåçççççççççççççççççççççççççççççèèèèçççççççåäããããâááááââãääåææççççççççççççççççæäâáààßßßÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙÙÚÚÚÚÚÚÚÛÛÛÚÚÙØ××××ØÙÚÚÚÛÛÛÚÚÙØØ×××Öֆ……„„‚€€€€€€€€€€€€‚ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽ‘‘‘’“”••••••––—˜˜˜˜˜™™™™™™™šš››œ ¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨©©ªª««¬­®®°²²³³´´´´´´µ¶·¸¹¹ºº»»¼½½½½¾¾¾¿ÀÁÁÁÁÂÃÅÆÆÇÇÈÉÌÐÐÐÐÐÐÑÑÒÓÓÓÓÓÓÔÔÕÖ×ÙÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÝÞÞßßßßßßààààßààßßààááââãäçççççççççççççççççççççççççççççèèèèççççççæåãââããâáââáââãäæçççççççççççççççççççåãâáààßßßßßÞÞÞÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÚÙØØ×ØÙÚÚÚÛÛÛÛÛÛÚÚÚÚÙØ×ք„ƒƒ‚€€€€€€€€€€€€€€€‚„‡‰ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹ŒŒŒŽŽŽ‘‘‘’“”••••••–——˜˜˜˜˜˜˜˜™™™™šš››œž ¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¥¦§¨¨¨¨©©©ª««¬­®®°²²³³³´´´´´µ·¸¹¹¹ºº»»¼½½½¾¾¾¾¿ÀÁÁÁÁÂÂÄÆÆÇÈÈÊÌÐÐÐÐÐÐÑÑÒÓÓÓÓÓÓÔÔÕÕ×ÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÝÞÞÞßßßßßßàßßßßßßßßàááââãääååæçççççççççççççççççççççççççèèèèççççççåäãâââããâââââããäæççççççççççççççççççæäâááààßßßßßßÞÞÝÝÞÞÝÝÞÝÝÞÞÞÝÝÝÝÜÜÜÜÜÜÜÜÛÛÛÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÙØ׃‚‚‚€€€€€€€€€€€€ƒ„…††‡‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽŽŽ‘‘‘’“”••••••–———————˜˜˜™™™™šš›œœž ¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¥¥§¨¨¨¨¨©©ªª«­­®®°²²³³³´´´´µµ·¹¹¹¹ºº»»¼½½½¾¾¾¾¿ÀÁÁÁÁÁÂÃÅÆÇÈÉÊÍÐÐÐÐÐÐÑÑÒÒÓÓÓÓÓÔÔÕÕ×ÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÞÞÞÞßßßßßßßßßßßßßßßàááâãããããääååæççççççççççççççççççççççççèèççççççåäãâââããããããããäåççççççççççèèèèçççççäãâááààßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÚÚÙׂ€€€€€€€€€‚ƒ„ƒ„…‡‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘’“”••••••–––––––—˜˜˜˜™™™™š››œž ¢¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¥¦¨¨¨¨¨©©©ª«¬®®¯°²²³³³´´´µµ¶¸¹¹¹ººº»»¼½½½½¾¾¾¿¿ÀÁÁÁÁÂÃÅÆÆÇÊÌÎÐÐÐÐÐÐÑÑÒÒÓÓÓÓÓÔÔÕÕ×ÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞßßßßßßßßßßßßßßßàààáááââââãããääæççççççççççççççççççççççççèççççççåäãâââââããääääåæççççççççèèèèèèççççæäãááàààßßßßßßÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞßÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÜÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚف€€€€~~€€€€€€€‚‚‚‚ƒ„†‡‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘’”•••••––––••––––—˜˜˜™™™šš›œž¡¢¢¢¢¢¢¢¢££££££££££¤¤¤¤¤¤¤¤¥§¨¨¨¨©©©ªª¬­®¯°²²³³³´´´µ¶·¸¹¹¹ººº»»¼½½½½½¾¾¾¿ÀÁÁÁÁÂÂÄÆÆÇÉÌÏÐÐÐÐÐÐÑÑÒÒÓÓÓÓÓÔÔÕÖØÚÛÛÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÞÞßßßßßßßßßßßßßßàààààááááââââãäåççççççççççççççççççççççççèçççççæåããââââââãäåååççççççççççèèèèèèççççåäãáàààßßßßßßßÞÞÞÞÝÝÝÝÝÞÞÝÝÞÞÞßßÞÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞßßÞÞÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚڀ€€€€€~}~}}}}}}~€€€€€€‚„…†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŠŠŠŠ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŽ‘“”•••••––••••••–––—˜˜˜™™™š›œž ¢¢¢¢¢¢¢¢£££££££££££¤¤¤¤¤¤¤¥§¨¨¨¨©©ªª«¬­®¯±²²³³´´´´µ¶·¸¹¹¹ºº»»»¼½½½½½¾¾¾¿¿ÀÁÁÁÁÂÃÆÆÇÉËÎÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÕÕÖØÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÞÞÞßßßßßßßßßßßßßààààààààááááâãäæççççççççççççççççççççççççççççççæåããâââãââãäæççççççççççççèèèèèèèçççåäãáààßßßßßßßßÞÞÞÞÝÝÝÝÝÝÝÝÞÞÞßßßßÞÞÞÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÞÝÝÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÝÝÞÞÞÞÞÞÝÝÝÝÞÞßßßßßßßÞÞÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛڀ€€€}}|||||||||}~€€€€€€€€€‚ƒ„…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡‡ˆ‰‰ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒ‘’“•••••••••••••••––—˜˜™™™šš›œž ¢¢¢¢¢¢¢¢¢££££££££££¤¤¤¤¤¤¥¦¨¨¨¨©©©ª«¬­®¯±²²³³³´´´µ¶·¸¹¹¹¹º»»»»¼½½½½¾¾¾¾¿ÀÁÁÁÁÂÃÄÆÇÈÊÍÐÐÐÐÐÐÑÑÒÒÒÓÓÔÔÔÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÞÞÞÞßßÞÞÞÞÞÞÞßßßßßßßßßßàààáááâãäåççççççççççççççççççççççççççççççåãããââãââãäæçççççççççççççèèèèèèçççåãâáàßßßßßßÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÝÝÝÝÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÜÜÜÜÝÝÝÝÞÝÝÞÞÝÝÞÞßßßßßÞÞÞÞÞÞÞßßßßßßßßÞÞÝÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛڀ~}|||{{{{|{{||}}~€€€€€€‚ƒ…†‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‰ˆ‡†††‡‡ˆˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’”•••••••••••••••–—˜˜™™™šš››œž ¢¢¢¢¢¢¢¢¢£££££££££££¤¤¤¤¥¦¨¨¨¨©©©ª«­®®¯±²²³³³´´´µ¶¶¸¹¹¹¹º»»»»¼½½½½¾¾¾¾¿ÀÁÁÁÁÂÂÃÆÆÇÉÌÐÐÐÐÐÐÑÑÑÒÓÓÔÔÔÕÕ×ØÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÞÞÝÝÝÝÝÝÝÞÞßßßßßßßßßßßàààááââãåæççççççççççççççççççççççççççççåäãããâãããããåççççççççççççççççèèççççåâáààßßßßÞÞÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÝÝÝÞÝÝÝÝÝÝÝÝÝÞÞÞÝÝÞÞßßßßßÞÞÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßßßßßßßßÞÞÞßßßßßßßßßßÞÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ~}|||{{{{{{{{{{{{||}}~~€€€€€€‚ƒ„……‡‰ŠŠ‹‹‹‹‹‹‹‹Šˆ‡††…††‡ˆ‰ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘’”•••••••••••••••–——˜˜™™™šš››Ÿ ¢¢¢¢¢¢¢¢£££££££££££¤¤¤¤¤¥§¨¨¨©©©ª«­®®¯°±²³³³´´´µµ¶·¸¹¹¹ºº»»»¼¼½½½¾¾¾¾¿ÀÁÁÁÁÁÂÃÄÆÇÈÌÐÐÐÐÐÐÑÑÑÒÓÓÔÔÕÕÖ×ÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÝÝÝÝÜÜÜÝÝÝÝÞÞßßÞÞßßßßßßßàààááâãäåæççççççççççççççççççççççççççççåäääãäãããäåççççççççççççççççççççççäâáààßßßßÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàààßßßßßßßÞßßßßßàààßßßÞÞÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛ}||{{{{{{zzzzzzzzz{{|||||}~€€€€€‚‚ƒƒ„…†††‡‡‡‡‡‡‡‡‡†……„„…†ˆˆˆ‰ŠŠŠŠŠ‰ˆˆˆ‰‰Š‹Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘’“•••••••••••••••––—˜™™™™ššš›œžŸ¡¢¢¢¢¢¢¢£££££££££££¤¤¤¤¤¥§¨¨¨¨©©ª«¬­®®¯°²²³³´´´µµ¶··¹¹¹ºº»»»¼¼½½½½¾¾¾¿ÀÁÁÁÁÁÂÃÄÆÆÈËÐÐÐÐÐÐÑÑÑÒÓÓÓÔÕÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÝÝÝÝÞÞÞÞÞÞÞßßßßßààààáâãããäåççççççççççççæåæææçççççççççççåääääääääåæççççççççççççççççççççæäâáààßßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞßÞÞÞßßßßßßßßßßßßÞÞÞßßßßßßßßßßßßßßßààáààààßßßßßßßßßàààààààßßßÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛ{{{{zzzzzzzzzzzzzzz{{{{{{{|}~€€€€‚‚ƒƒ„„„„„„„„„„„„„„„„„„„†‡ˆˆˆˆ‡ˆ‡†………††‡‡‡‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘’“•••••••••••••••––—˜˜™™™™šššœŸ ¢¢¢¢¢¢¢¢££££££££££¤¤¤¤¤¥§¨¨¨¨©©ªª«­­®¯°±²³³´´´´µµ¶·¹¹¹ºº»»»¼¼¼½½½¾¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÉÎÐÐÐÐÐÐÑÑÒÒÓÓÔÕÕ×ÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÞÞÞÞßßßßßßàààááââââäåæçççççççççååäääååæççççççççççååäååäååæçççççççççççççççççççççæäãâáààßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÞÞÞÞÞÞßßßßßßàßßßßßßßßßßàààààààßßßßàààááááàààààßßßàààààáááááààßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛzzzzzzzzzzzzzzzzzzzzzzz{{{{|}~~€€€€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„…†‡††††…„„„„……†………†‡ˆˆ‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘’”•””•••••••••••••–—˜˜™™™™ššš›Ÿ¡¢¢¢¢¢¢¢££££££££££¤¤¤¤¤¥¥¦¨¨¨¨©©ªª«¬­®¯°±²²³´´´´µµ¶·¹¹¹ººº»»»¼¼½½½¾¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÉÍÐÐÐÐÐÐÑÑÒÒÓÓÔÕÕÖÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÞßßßßßßßßààààáááááâãäåææçççççåäääãããäåççççççççççççææååæçççææççççççççççççççççççæåãâáààßßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞßßßßßßàßßßßßßßßàààááááááààààààáââââââááàààààááááââãããâáàßßßÞÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛzzzzzzzzzzzzzzyyzzzzzzzzzz{{|}|}~€€€€‚‚‚‚‚‚‚‚‚‚‚ƒ„……„…„„ƒƒƒƒƒ„„„„„„…†………†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘““““””•••••••••••––—˜˜™™™ššš›Ÿ¡¢¢¢¢¢¢¢££££££££££¤¤¤¤¤¥¥¦§¨¨¨©©©ªª«­®®¯±²²³³´´´´µ¶·¸¹¹¹¹ºº»»¼½½½½¾¾¾¾¾¿ÁÁÁÁÂÃÄÆÆÇÉÌÐÐÐÐÐÐÑÑÑÒÓÓÔÔÕÖØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞÞßßßßßßßßßßßàààààáââãäååçæææåääãâââäåæçççççççççççççæææææåæææçççççççççççççççççæåãâáààßßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞßßßààààßààààááâããâââááààááâããâãääãâââááááââããäåååãâáààßßßßÞÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛzzzyyyyyyyyyyyyyyyzzzzzzzzz{{||||}~€€€€€‚‚‚ƒƒƒƒƒƒ‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„…†ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘’’’’’“””””••••••••–—˜˜™™™šš›œž ¢¢¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¦§¨¨¨¨©©©ª«­®®¯°²²³³´´´´´µ¶·¹¹¹¹ºº»»»¼½½½¾¾¾¾¾¿ÀÁÁÁÂÂÄÅÆÇÈËÐÐÐÐÐÐÑÑÑÒÒÓÓÔÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÞßßßßßßßßßßßßààààààááãããääääååãâáââãäåæçççççççççççççççæåääåååççççççççççççççççæäãááàààßßßßÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞÞÞÞßßßààààààáááââääääââááááââãããããäæååäããããããåååæçççåäãâáààßßßÞÞÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛyyyyyyyyyyyyyyyyyyyzzzzzzzzz{{{{||}~€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘‘’’“””””•••••••––˜™™™™šš›Ÿ¡¢¢¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¦§¨¨¨¨©©©ª«­®®¯°²²³³³´´´´µ¶·¹¹¹¹¹ºº»»¼¼½½¾¾¾¾¾¿¿ÁÁÁÁÂÃÅÆÇÈËÐÐÐÐÐÐÐÑÑÒÒÓÓÔÕÖ×ØÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÞßßßßßßßßßßßßßßßßßààáááâââããäåãâááâãäåæççççççççççææçççæåäããääåæççççççççççççææåãâáààààßßßßßÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÞßßßßààààááâãäååääããââââããããããääåççççææååååçççççççççåäâáàßßßßßßÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛyyyyyyyyyyyyyyyyyyyyyzzzzzzzz{{{{||}~€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚„…†‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘’’“““””••••••–˜˜™™™š›œ ¢¢¢¢¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¦§¨¨¨¨¨©©ª«¬®®¯°±²²³³³´´´µµ¶¸¹¹¹¹ºº»»»¼½½½¾¾¾¾¿¿ÀÁÁÁÂÃÅÆÆÈÊÏÐÐÐÐÐÐÑÑÑÒÓÓÔÔÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞÞÞÞÞÞßßßÞßßßßßßßßààààááááããããââáâãäåæçççççççççææåæçççåäãããäääååçççççççççæåååãâáàßßßßßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÞßßßààààáâäåæååäããâããããääääääååæççççççççççççççççççççæäãáàààßßßßÞÞÝÝÝÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛyyyxxxxyyyyxxxxxxyyyyyzzzzzzzz{{{{||}~€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ„„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘‘‘‘‘’’’“””••••–—˜™™™š›œŸ¡¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¥¦¦¨¨¨¨¨©©ª«¬­®¯°±²²³³³´´´µµ¶¸¹¹¹¹ºº»»»¼½½½¾¾¾¾¿¿ÀÁÁÁÁÂÄÆÆÈÊÎÐÐÐÐÐÐÑÑÑÒÓÓÔÔÕÕ×ØÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÞÞÞÞÞÞÞÞÞÞßßßßßßßààààààááâãâãâââãääåæççççççæææååæçççæäãââããäääæççççççççæååäâáààßßßßßßßÞÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞßßßàààááâåæåäääãããããäåäääääåååæçççççççççççççççççççççåãâááààßßßßÞÝÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxxxxxxxxxxyyyyyzzzzzz{{{{{{||}€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘‘‘‘’““””•••–—˜™™™š›œŸ¡¢¢¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ª«­­®®¯±²²³³³´´´µµ¶¸¹¹¹¹¹ºº»»»¼½½¾¾¾¾¿¿ÀÁÁÁÁÂÄÆÆÈÊÎÐÐÐÐÐÐÑÑÒÒÓÓÔÔÔÕÖ×ÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÞÝÝÝÝÝÞÞÞÞÞßßßßßßßßàààáââããââãäååæççççççæååååæçççæåããããããääæçççççççççæåãâáàßßßßßßÞÞÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÜÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞßßßàááâãääåååäããããäääääääååæçççççççççççççççççççççççæåãââáààßßßßÞÞÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxxxxxxxxxxxxyyyyzzzzzzz{{{{||}~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ„†‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘’’“”••••–˜™™™šš›œ ¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©ª«¬­­®¯°±²³³³´´´µµ¶¸¹¹¹¹¹ºº»»»¼½½½¾¾¾¿¿ÀÁÁÁÁÂÃÆÆÇÊÍÐÐÐÐÐÐÑÑÒÒÒÓÓÔÔÕÕÖØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÝÝÝÝÝÝÜÝÝÝÞÞÝÞÞßßßßßßßßßààááââãââãäææçççççæäããäåæççççæäãââããääæçççççççççåãâáààßßßßßÞÝÝÝÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞßßßààáâããäååäãããäääãääääääåæçççççççççççççççççççççççååäãááààßßßßÞÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxxxxxxxxxxxxxyyyyzzzzzz{{{{||}}~~~~~~~}}}}}}}}}}}}~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒƒ…†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘’”••••–˜™™™™šš›œž  ¡¡¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©ª««­®®¯±²³³³´´´´µ¶·¸¹¹¹¹ºº»»»¼¼½½¾¾¾¿ÀÁÁÁÁÁÂÃÅÆÇÉÌÐÐÐÐÐÐÑÑÑÑÒÒÓÓÔÔÕÕ×ØÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÞßßßßßßßßßààáááâãâãäææççæææåäãããäåççççæääãâããäåæççççççççæäâáààßßßßßÞÝÝÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÞßßßààáââãäåääããääãäääãããääååçççççççççççççççççççççççæåäâááààßßßßÞÞÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxxxxxxxxxxxxxxyyyzzzzzz{{{{||}}~~~}}}|||||||||||||}}~€€€€€€€€€€€€€€€€€€€€‚‚‚ƒ„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’”••••–—˜™™™™šš›œžž ¡¡¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©ªª«­®®¯±²³³³´´´´´µ¶·¹¹¹¹ºº»»»¼½½½¾¾¾¿ÀÁÁÁÁÂÂÃÅÆÇÈËÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÔÕÖÖØÚÚÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞßßßßßßßßßààáááâããäææææåååääãâããåææææçååäããääåæççççççççåãâáàßßßßßßÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÜÜÜÜÜÜÝÞßßßààáââäåååääåääåääããããääæççççççççççççççççççççççççæåãâáááààßßßÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxxwwvwwxxxxxxxyyyyzzzzzz{{{|}}~~~~}||{{{{{{|{{|||||}}}~€€€€€€€€€€€€€€‚‚ƒ†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘’”••••–—˜˜™™™™šš›œžŸ¡¡¢¢¢¢¢¢££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ªª«¬®®¯±²³³³´´´´´µµ¶¸¹¹¹ºº»»»¼¼½½¾¾¾¿ÀÁÁÁÁÂÂÄÅÆÇÉËÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÕÕÕÖ×ÚÚÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÝÝÞÞÞÞÞßßßßßàááááâääåæåååååäãââããäææææææåååääåææçççççççåäâááàßßßÞÞÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÝÝÞßßààáââãäææååæåååääãããääåææççççççççççççççççççççççææåäãââááààßßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxwvvvvvwxxxxxxxyyyzzzzzzz{{|}~~~}||{{{{{{{{{{{{||||||}}~€€€~~~€€€€€€€€€‚ƒ…‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘“””•••––—˜˜™™™ššš›œž  ¡¡¢¢¢¢£££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ªª«­®®¯²²²³³´´´´´µµ¶·¹¹¹¹º»»»»¼½½¾¾¾¿ÀÁÁÁÁÂÂÄÆÆÇÉÌÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÔÔÕÕÕÖ××ØÙÚÚÙÙÙÙÙÙÙÙØØØØÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÜÜÜÜÝÞÞÞÞßßßßßßàààáââäååääåååäãâââãäæçççççææææææçççççççççåäâááàßßÞÞÝÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÜÜÜÜÝÝÞßßààáââãäæçççççææåäåååååææææççççççççççççççççççççççæåäãââáááààßßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛxxxxxxxxxwvuuuvvxxxxxxxyyyzzzzzzz{{||~~}|{{{{{{{{{{{{||||||||}}~€€~~}}}}~~€€€€€€€€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’“••••––—˜˜™™™šš››œŸ  ¡¢¢¢¢¢££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ª«¬­®¯°²²²³³´´´´´´µ¶·¹¹¹¹º»»»¼½½¾¾¾¾¿ÀÁÁÁÁÂÂÄÆÆÈÊÍÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÓÔÔÕÕÕÕÖÖ×××ØØØØØØØØØ×××ØØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÜÜÜÜÝÝÝÞÞßßßßßßßààááâãååååååääããââäåçççççççççççççççççççççæäãâààßßÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÜÜÜÜÝÝÞßßßààáâãäåççççççççææçççççææççççççççççççççççççççççççæååãââáááàààßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚxxxxxxxwvuuuuuuvxxxxxxxyyyyzzzzzzz{{|}~~}}|{{{{{zzz{{{{{{{{|||||}~~}}|||}}}~€€€€€€€€€‚ƒ„‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽŽ‘‘‘’’”•••••–—˜˜™™™šš›œžŸŸ  ¡¢¢¢££££¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨©©©ª«¬­®¯±²²³³³³´´´´µµ¶·¹¹¹¹º»»»¼½½¾¾¾¾¿ÀÁÁÁÁÂÂÄÆÆÈÊÍÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÔÔÔÕÔÕÕÕÕÖÖ××××××××ÖÖÖ××ØØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞÞÞÞÞßßßààààáâäåååååääããããäåçççççççççççççççççççççæäâáàßßßÞÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßßàááãäåççççççççççççççççæææçææççççççççççççççççççççæåääãâáâáààààßßÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚxxxxxxwvuutttuuvwxxxxxxyyyyzzzzzzz{{{|}}}}||{{{zzzzz{{{{{{{{|||||}~~}}|||||||||}}~€€€€€€€€€‚ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’“•••••––—˜™™™™šš›œžžŸŸŸ¡¢¢¢£££¤¤¤¤¤¤¤¥¥§¨¨¨¨¨©©ªª«­®®¯±²²²³³³´´´´µµ¶·¸¹¹¹º»»»¼½½½¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÉÌÐÐÐÐÐÐÐÐÐÑÑÑÑÒÓÓÓÓÔÔÔÔÔÔÔÕÕÕÖÕÖÖÖÖÖÖÖÖÖÖÖÖ××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞÞßßßßàààáâäæåååæåääääåæçççççççççççççççççççççåãâáàßßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÞßßààáâãåççççççççççççççççæååææææçççççççççççççççççæååäääääââáááááàßßÞÞÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚxxxxxxvuttttttuvwxxxxxxxyyyzzzzzzzz{{{||||||{{zzzzzz{{{{zz{{{|{||}~~~~}}}|{{{{{{{{|||~€€€€€€‚„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’””••••––˜˜™™™™š›œœžžŸ¢¢¢££££¤¤¤¤¤¤¥¥§¨¨¨¨¨©©ª«¬­®¯±²²²²³³³´´´´µµ¶·¹¹¹ºº»»»¼½½½¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÉËÏÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖ×ØØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÞÞßßßßààáâãåæååææååååæçççççççççççççççççççççæåäâáàßßÞÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßààáâäæççççççèçççççççççæååååæææçççççççççççççççæåäãããäääãââááááààßßÞÞÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚxxxxwvuuttttttuvwxxxxxxxyyyzzzzzzzzzz{{{{||{{{zzzzzzzz{{zz{{{{{{||}~}}|||{{{{{{{{{{{|}€€€€€€‚„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”•••••–—˜™™™™šš›œœœœœž¢¢¢¢££££¤¤¤¤¤¤¥§¨¨¨¨¨©©ª«­®®°±²²²²³³´´´´µµ¶¶·¹¹¹ºº»»»¼½½½¾¾¾¿ÁÁÁÁÁÂÃÄÅÆÆÈÊÎÐÐÐÐÐÐÐÐÐÐÑÑÑÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖ×××ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÞÞßßßßààáâãäåååææææçççççççççççççççççççççççæåäâáàßßÞÝÝÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßàááâäççççççèèèèèèççççççæåäåæææççççççççççççççæåäãâââãäääãââáááààßßßÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÚxxxwvuttttttttuvwxxxxxxxyyyzzzzzzzzzzz{{{{{{{zzzzzzzzzzzzzzz{{{{{|}||||{{{zzz{{{{{{{|}~€€€€€‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘’“”••••••–—˜™™™™š›››››œœž¡¢¢¢££££¤¤¤¤¤¤¥¨¨¨¨¨¨©©ª¬­®¯°±²²²³³³´´´´µµ¶·¸¹¹¹ºº»»»¼½½¾¾¾¾¿ÁÁÁÁÁÂÃÄÅÆÆÇÉÌÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÔÕÕÕÕÕÕÖÖÖÖ×××ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÞßßßßàáââãäåååæçççççççççççççççççççççççççæåãâáàßßÞÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßààáâãåçççççèèèèèèçççççççæååæççççççççççççççççåäãâáááâââãäãâááááàßßßßÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚxwvvutttttttttuvwxxxxxxyyyyyzzzzzzzzzzzz{{{{{zzzzzzzzzzzzzzz{{{{{|||{{{{{{zzz{{{{{{{|}}~€€€€‚‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽ‘“”••••••–—˜™™™™ššš››››œ ¢¢¢¢££££¤¤¤¤¤¥¨¨¨¨¨©©ª«­®®¯°±²²²³³´´´´´µµ¶·¹¹¹¹ºº»»¼½½½¾¾¾¿¿ÁÁÁÁÂÂÃÄÅÆÆÇÉËÎÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÖÖÖ××ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÞßßßààááâãäææççççççççççççççççççççççççççåäâáààßßßÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßßààáãäççççèèèèèèèçççççççææææççççççççççççççææäãâáááááááâãäãâââááàßßßÞÞÝÝÜÜÜÛÛÛÛÛÛÛÛÛÚÚÙwvuuttttttttttuvxxxxxxxyyyyyzzzzzzzzzzzzzzz{{zzzzzzzzzzzzzzzzzz{{{{{{zzzzzzzz{{{{{{{|||}~€€€€‚ƒ„‡‡‡ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽ‘“”””•••••–˜™™™™™ššššš››œž¡¢¢¢£££££¤¤¤¤¥§¨¨¨©©ª«¬­®®¯°²²²²³³´´´´µµµ¶·¹¹¹ºº»»»¼½½¾¾¾¾¿ÀÁÁÁÁÂÂÃÄÆÆÆÇÈÊÌÏÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÖÖÖ×ØÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÞßßßààááâãåççççççççççççççççççççççççççæäâáàßßßßÞÝÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞßßßßàáâäåçççèèèèèèèçççççççææææççççççççççççççæåãâáààààááááâãääããâáààßßßÞÞÞÝÜÜÜÜÛÛÛÛÛÛÛÚÚØvutttttttttttuuvwxxxxxxyyyyyyzzyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zzzzzzzzzzzzzz{{{{{{|}~€€€€‚„„…„…†‡ˆ‰‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽ‘’’’“”••••–˜™™™™™™™šššš›œ ¢¢¢¢££££¤¤¤¤¥§¨¨¨©ªª«­®®¯¯°²²²³³³´´´µµµµ¶¸¹¹¹ºº»»»¼½½½¾¾¾¿ÀÁÁÁÁÂÂÃÄÅÆÆÇÇÉËÎÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÓÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ××ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßßààáâãæçççççççççççççççççççççççççäâáàßßÞÞÝÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßßàáãäçççèèèèèèèççççççççæææçççççççççççççåäãâáàààààààáááâãäääãâáàßßßßÞÞÝÝÜÜÜÛÛÛÛÛÛÚÚÚØuttttttttttttuvvwxxxxxxyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{|}}€€€€‚‚‚ƒƒƒ„„…†‡‡Š‰‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’’’“”•••–—˜™™™™™™™šššš›œž¡¢¢¢££££¤¤¤¤¥¦¨¨¨©ª«¬­®®¯¯±²²²³³³´´´´µµ¶¶·¹¹¹ºº»»»¼½½½¾¾¾¿ÀÁÁÁÁÁÂÃÄÅÆÆÇÇÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖ××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÝÞßßààáãåçççççççççççççççççççççççæåãáàßßÞÝÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÙØØ××ØØÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßßàáâäççççèèèèèèççççççççæçççççççççççççæåäãâáààßßßààààááââããäääâáààßßßÞÞÝÜÜÜÜÛÛÛÛÛÚÚÚØuttttttttttttuvvwxxxxxxyyyyyyyyyyyyyyyzzzzzzzzzyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{||}~€€€‚‚‚‚ƒƒ„……††ˆ‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘’’’”••••—˜˜˜˜˜™™™™™ššš›Ÿ¢¢¢¢£££¤¤¤¤¤¥§¨¨©ª«¬­®®¯°±²²²³³³´´´µµµµ¶·¹¹¹ºº»»»¼½½¾¾¾¾¿¿ÀÁÁÁÁÂÃÄÄÆÆÇÈÉËÌÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÖÖÖ××ÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßàáâäåççççççççççèçççççççççæåäâáàßßÞÝÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÙØØ××Ö××ØØØØÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßßßàâãæçççèèèèèçççççççççæææççççççççççæåäãâáààßßßßàààáááââããäääãâáààßßßÞÞÝÜÜÜÛÛÛÛÛÚÚÙØuttttttttttttuvvwxxxxxyyyyyyyyyyyyyyyyyzzzzzzyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{||}~€€€‚‚ƒ„„„…†‰‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘‘’“”•••–˜˜˜˜˜˜™™™™™™š›œ ¢¢¢££££¤¤¤¤¥¦¨¨¨©«¬­®¯¯°±²²²³³´´´´´µµµ¶¸¹¹¹ºº»»»½½½¾¾¾¾¾¿¿ÀÁÁÁÂÃÄÄÆÆÇÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÕÕÖÖØÙÙÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞßßßàâäåæçççççççççèçççççççççåäãáàßßßÝÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÙÙÙØ××××ÖÖÖ××××ØÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÞßßßàáãæççèèèèèèçççççççççæææææççççççææåäãâáàààßßßßßààááââââããããââááàßßßßßÞÝÜÜÛÛÛÛÛÚÚÙØttttttttttttuvvvxxxxxxxxxxxxxxxxxxxyyyyzzzzzyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{||}~€€€€€€€‚ƒƒƒƒ„…ˆ‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽ‘‘’“”•••–—————˜˜™™™™™™š›œž ¢¢¢£££¤¤¤¤¤¥§¨¨©ª¬®®°±²²²²³³³´´´´µµµ¶·¹¹¹¹º»»»¼¼½½½¾¾¾¾¿¿ÀÁÁÁÁÂÃÅÆÆÇÇÈÉÊËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÒÒÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÖ×ØÙÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝßßßàáâäæççççççççèççççççççççæäâáàßßÞÝÜÜÜÜÜÜÛÛÛÛÛÛÚÚÙÙØØ×××ÖÖÖÖÖÖÖ×××ÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÝÞßßààáäçççèèèèèèççççççççæçæççæçççççææææäãââáàààßßßàààááááââââââááààààßßßßßÝÜÜÛÛÛÛÛÚÚÚØttttttttttttuuvwxxxxxxxxxxxxxxxxxxxxyyyzzzyyyyyyyyyyyyyzzzzzzzzzzzzzzzyyyzzzzzzzzzzzzz{{{|}€€€€€€€€€€€€€‚‚‚ƒƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’”••••–––––——˜˜˜™™™šš›Ÿ¡¢¢¢£££¤¤¤¤¥¦¨¨©©«®¯°²²²³³³³´´´´µµµµ¶·¹¹¹¹º»»»»¼½½½¾¾¾¾¾¿¿ÁÁÁÁÂÃÄÆÆÆÇÇÈÉÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÖÖ××ØØÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞßßààáâäçççççççççççççççççççåäáàßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÚÚØØØ××ÖÖÖÕÕÖÕÕÖÖÖ×ØÙÙØÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÝßßßàáâåççççèèèèèèççççççæååææççççççæåææåäããâááààßßßàààááááááââááàààààààßßßßÞÝÜÜÛÛÛÛÛÚÚÙttttttttttttuvvwxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzyyyyyyzzzzzzzzzzzzzz{|}€€€€€€€€€€€€€€‚‚ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••–––––——˜˜™™™™šš›Ÿ¢¢¢¢££¤¤¤¤¥¦¨¨¨©«®¯°²²³³³³´´´´´µµµµ¶¸¹¹¹¹º»»»»¼½½½½¾¾¾¾¾¿ÀÁÁÁÂÃÄÅÆÆÆÇÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÖÖÖÖ××ØØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝßßßàáâãåçççççççççççççççççæäãáàßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙØØ××ÖÖÕÕÕÕÕÕÕÕÕÖ×ØØØØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞÞÞßßßàáãæççççççèèèèççççççåääåæççççççååæææåäããáààààààààáááááááâááàààßßßààààßßÞÝÜÜÛÛÛÛÛÚÚÚtttttttttttttuuvwxxxxxxxxxxxxxxxxxxxxyyyyyyyyyxxxyyyyyyzzzzzzzzzzzzyyyyyyyyzzzzzzzzzzzzz{|~€€€€€€€€€€€€€€€‚‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘’“”•••••–––––——˜˜™™™™šš›Ÿ¢¢¢££¤¤¤¤¤¦¨¨¨©ª­¯°²³³³´´´´´´´µµµ¶·¹¹¹¹¹º»»»»¼¼½½½¾¾¾¾¾¿ÀÁÁÁÂÂÄÅÆÆÆÇÈÉËÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÖÖÖ××ØÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßàáâãäççççççççççççççççæäâáàßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙØ×××ÖÕÕÕÕÕÕÕÕÕÕÖÖ×××ØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞÞÞßßàáâäæççççççèèèèççççççåääåæççççççååææççåäãâáààààààááááááááâáààààßßßßàààßßÞÝÜÜÛÛÛÛÛÛÚÚtsttttstttttttuuvwxxxxxxxxxxxxxxxxxxxxyyyyyyyxxxxyyyyyyyzzzzzzzzzyyyyyyyyyyyyyzzzzzzzzz{{|~€€€€€€€€€€€€€€€€‚ƒ†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’“”•••••––––––—˜˜™™™™š›œ ¢¢£££¤¤¤¤¥¨¨¨©©¬®±²³³´´´´´´´´µµ¶·¸¹¹¹¹¹º»»»»»¼½½½½½¾¾¾¿¿ÁÁÁÂÂÃÄÆÆÆÇÇÈÊÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÖÖ×ØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝßßßààáâãåççççççèççççççççæãâáàßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÚÚØ××ÖÕÕÕÕÕÕÕÕÕÕÕÖÖ××××ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝÝÞÞßßßàáãäæçççççççèçççççççæäããäåæçççççææææçæåäãââáàááááááâââââáááààßßßßßßààààßÞÝÜÜÜÛÛÛÛÛÛÚsssssssssssttttuuuvwxxwwwxxxxxxxxxxxxxyyyyyyyxxxxxyyyyyyzzzzzzzzyyyyyyyyyyyyyyyzzzzzzzz{{}~€€€€€€€€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’““”•••••••––––—˜˜˜™™™š›ž¢¢¢£££¤¤¤¥§¨¨¨©«®°²³³´´´´´´´´µµ¶·¸¹¹¹¹ºº»»»»»¼½½½½½¾¾¾¾¿ÁÁÁÁÂÃÄÆÆÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÖ××ØØÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßààáâäççççççèèèççççççåãâáàßßÞÞÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙØ×ÖÕÕÕÔÔÔÔÕÕÕÕÕÖÖÖ××ØØÚÚÚÛÛÛÚÚÚÛÛÛÛÛÜÜÜÝÝÞÞßßààâäæççççççççççççççççåäããääåæççççççççæååäãããâââáááâââââââááàààßßßßßßßßßßßßÞÝÝÜÜÛÛÛÛÛÛsssssssssssstttttuuuvvvvvwwxxxxxxxxxxxxxyyyyxxxxxxyyyyyyzzzzzzzzyyyyyyyyyyyyyyyyyzzzzzz{{}~~€€€€€€‚ƒ†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’’“”••••••••–––——˜˜™™™š›ž¡¢¢£££¤¤¤¥¦¨¨¨©«®¯²³³´´´´´´´µµµ¶¸¹¹¹¹¹ºº»»»»»»¼½½½½½¾¾¾¿ÀÁÁÁÂÂÃÆÆÆÇÉËÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÓÓÒÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÖ××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßàáâãæççççèèèèèçççççäâáàßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÚÚÙØ×ÖÖÕÕÕÔÔÔÔÔÕÕÕÕÖÖÖ×ØØÙÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÜÜÝÝÞßßààâãåçççççççççççççççççåäääääåæçççççççæææååååååäãâââããããââááààààßßßßßßßßßßßßßÞÝÜÜÛÛÛÛÛÛssssssssssssstttttttuuvvvvwwxxxxxxxxxxxxxxxxxxxxxxyyyyyyzzzzzzzyyyyyyyyyyyyyyyyyyyzzzzz{{|~~~~}}}~~€€€€€‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’“”••••••••–––——˜˜™™™šœž¡¢¢£££¤¤¤¤¥¨¨¨©«­¯±²³´´´´´´´µµ¶·¸¹¹¹¹¹¹ºº»»»»»¼½½½½¾¾¾¾¿ÁÁÁÁÂÂÃÅÆÆÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÖÖ×ØØÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝÞßßßßàáâäççççèèèèèççççæãâáàßßÞÞÝÜÜÜÛÛÛÛÛÛÛÚÚÙØ××ÖÖÕÕÕÔÔÔÔÔÔÕÕÕÖÖÖ×ØØÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÝÞÞßßàáâãåçççççççççççççççççåäääääåæççççççççææææççççæåäãäããâââááàààßßßßßßßßßßßßßßßßÝÝÜÜÛÛÛÛÛrrrsssssssssssssttttttuuuvvwxxxxxxxxxxxxxxxxxxxxxyyyyyyyzzzzzzzyyyyyyyyyyyyyyyyyyyzzzzz{{|~~}}||||}}~€€€€‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’’’”•••••••••––––—˜™™™š›œŸ¢¢¢£££¤¤¤¥§¨¨©ª­®°²³³´´´´´´µµ¶·¸¹¹¹¹¹¹ºº»»»»»¼¼½½½¾¾¾¾¿ÁÁÁÁÁÂÃÅÆÇÇÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÓÔÔÔÔÔÕÕÕÖ××ØØØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝÞßßßßàáâåççççèèèçççççåãáààßßÞÞÝÜÜÛÛÛÛÛÛÚÚÚÙØ×ÖÖÖÕÕÕÔÔÔÔÔÔÔÕÕÕÕÖÖ×ØØÙÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÝÞßßßàáâäæçççççççççççççççççæåääääåæççççççççææææçççççæåäãââââááàààßßßßßßßßßßßßßßßßßÞÝÜÜÜÛÛÛÛrrrrrrrsssssssssstttttttuuvwxxxxxxxxxxxxxxxxxxxxxyyyyyyyzzzzzzyyyyyyyyyyyxxxxxxyyyyzzzz{{|~~}}||||||}~€€€€‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’“”•••••••••––——˜™™™šš›¡¢¢£££¤¤¤¥§¨¨©ª­®¯±²³³´´´´´µµ¶·¸¹¹¹¹¹¹ºº»»»»»»¼½½¾¾¾¾¾¿ÀÁÁÁÂÂÃÅÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖ××ØÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßßàáäæçççèèèçççççäãáàßßßÞÝÜÜÛÛÛÛÛÛÛÚÚÙÙØ×ÖÖÕÕÕÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ×ØØÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÜÜÞßßßàáâäçççççççççççççççççççææååååæççççççççæææææçççæåääãââááàààààßßßßßßßßßßßßßßßßßßÞÝÝÜÜÛÛÛrrrrrrrrrrrssssssssstttttuvwwxxxxwxxxxxxxxxxxxxxxyyyyyyyzzzzzyyyyyyyyyyyyxxxxxxxyyyyzzz{|}~}|||||||}}~€€€€€‚ƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’“”””••••••••–——˜˜™™™š›œŸ¢¢£££¤¤¤¥¦¨¨©ª¬®®°²³³´´´´´µ¶¶··¸¹¹¹¹¹ººº»»»»»¼½½½¾¾¾¾¿ÀÁÁÁÂÂÃÅÆÆÈÊËÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÕÕÖ×ØØÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÝÞßßßàâäççççèèççççæäâáàßßÞÝÜÜÛÛÛÛÛÛÛÚÚÙØØ×ÖÖÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ××ØÙÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÝßßßàáâäæççççççççççççççççççççæååæçççççæææåååååååæææåäãâââááàààààßßßßßßßÞÞßßßßßßÞÞßßÞÝÜÜÜÛÛrrqqqqqqqrrssssssssssttttuuuvvvvwwwxxxxxxxxxxxxxxyyyyyyzzzzzzyyyyyyyyyyyyxxxxxxxyyyyzzz{{|~~~}|||||||}}~€€€€‚‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’“””””””•••••––—˜˜™™™ššœž¢¢£££¤¤¤¥¦¨¨©ª¬­®¯±²³³´´´´µ¶·¸¸¸¹¹¹¹¹¹ºº»»»»»¼½½½¾¾¾¿¿ÁÁÁÁÂÃÄÆÆÇÉËÍÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÖ××ØØØÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßàáãåççççèççççäãáàßßÞÝÜÜÜÛÛÛÛÛÛÚÚÙØ××ÖÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖ××ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝßßßàáãäåæçççççççççççææææçæçççææçççççæääååååååååååääãââââáááàààßßßßßßßßÞßßßßÞÞÞÞÞÞßßÞÝÜÜÜÛrrrrqqqqqrrsssssssssssttttuuuuuvvvwxxxxxxxxxxxxxyyyyyyzzzzzzyyyyyyyyyyyyyyxxxxxyyyyyzzz{{|~~}}}||||||}}~€€€€€‚‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’“”””””•••••••––—˜™™™ššœž¢¢£££¤¤¤¥¦¨¨©ª­®®¯°²³³´´´µ¶·¸¹¹¹¹¹¹¹¹¹ºº»»»»¼¼½½½¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÊÍÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÕÕÖÖ×ØØØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÞßßàáâäæçççççççæãâáàßßÞÝÜÜÛÛÛÛÛÛÛÚÚØ××ÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×ÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßààâãäååæçççççççççççææææåææçççççççæåääääåååäääããââãââââááàààßßßßßßßßßßßßßÞÞÞÞÞÝÞÞßßÞÝÝÜÜrrrqqqqqqqrrssssssssssttttttuuuvvvwxxxxxxxxxxxxyyyyyyzzzzzzyyyyyyyyyyyyyyyyxxxyyyyyyzzz{{|~}|||||||||}~€€€€€€€‚‚„…‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”””””•••••••––—˜˜™™ššœž¢¢£££¤¤¤¥¦¨¨¨ª¬®®®°±²³´´´µ¶¸¹¹¹¹¹¹¹¹¹¹ºº»»»¼¼¼½½½¾¾¾¿ÁÁÁÁÁÂÃÅÆÇÈËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖ×ØØØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝßßßáâãæçççççççæãááàßßÝÜÜÜÛÛÛÛÛÛÚÚÙØ×ÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ÙÚÚÚÚÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßßàáâããääæçççççæçççççæåååääåæçççççææåääääåäãäãâââáááâââááààààßßßßßßßßßßßßßÞÝÝÝÝÝÝÞÞßßÞÞÝÜrrqqqqqqqqqrrssssssssstttttttuuuuvwwxxxxxxxxxxxyyyyyyzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{{}}}|||||||||}~€€€€€€€‚„…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“””•••••••••••––˜˜™™™šœž¢¢£££¤¤¤¥¦¨¨¨ª«­®®¯±²³³´´µ¶¸¹¹¹¹¹¹¹¹¹¹ºº»»»¼¼½½½½¾¾¿ÀÁÁÁÁÁÂÃÅÆÇÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖ××××ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÞßßàáãæççççççæåãáààßÞÝÜÜÛÛÛÛÛÛÚÚÚÙ×ÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ÙÚÚÚÚÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßààáããããäåæçæåååååæææææåääääååççæææåæåääääãããâââááááááâááààààßßßßßßßßßßßßßÞÝÝÝÝÝÝÝÞÞßßßÞÜqrrqrqqqqqqqrssssssssssttttttuuuuvvwxxxxxxxxxxxyyyyyzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{||}||||||||||}}€€€€€‚ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘’”””••••••••••––—˜™™™š›ž¢¢£££¤¤¤¥¦¨¨¨©«¬­®¯±²³³´´µ¶¸¹¹¹¹¹¹¹¹ºººº»»»¼½½½½¾¾¾¿ÀÁÁÁÁÂÂÃÅÆÇÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖ××ÖÖ×ØÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÞßßàáãäåæææçæåäãâàßßÞÝÜÜÛÛÛÛÛÛÚÚÙØ×ÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßàáâãããäååææåäääääåææææåääãäääååææææææååääãããââáááááááááááààààßßßßßßßßßßßßÞÞÝÝÝÝÝÝÞÞßßßÞÝqqrrrqqqqqqqrrsssssssssstttttuuuuuvwxxxxxxxxxxxyyyyzzzzzyyyyyyxyyyyyyyyyyyyyyyyyyyyzzz{{||}||||||||||}}~€€€€‚‚„…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’””•••••••••••–—˜™™™š›¢¢£££¤¤¤¥¦¨¨¨©ª«­®¯°²²³´´´µ·¹¹¹¹¹¹¹ºººº»»»¼½½½½¾¾¾¾¿ÁÁÁÁÁÂÃÄÆÆÇÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÕÕÕÖÖ×ÖÖÖ××ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÞßßàááâãããääääãâáàßÞÝÝÜÜÛÛÛÛÛÛÚÙØØ×ÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×ÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÝÝÞßßàáâãããäåååäãããâããäåæååæåäããääååååæååååååääãâââáááààááááââááàààààààààààßßßßÞÞÝÝÝÝÝÝÞßßßßÝqqrrrqqqqqqqrrsssssssssttttttuuuvvvwxxxxxxxxxxxyyyyzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{{|}}}||||||||}}~~€€€€‚‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“””•••••••••––—˜™™™š›¢¢¢££¤¤¤¥¦¨¨¨©ª«¬­®¯²²³´´´µ·¹¹¹¹ººººººº»»»¼½½½¾¾¾¾¿ÀÁÁÁÁÂÂÃÅÆÇÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÕÕÖÖÖÖÖÖÖÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÞßßßààààáááââââáàßßÞÝÜÜÛÛÛÛÛÛÚÚÙØ××ÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×ÙÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßáâããããäåæäãââââââããäååæääããääååææçææååææåäãââââááàáááááâââááààààààààààßßßßßÞÝÝÝÝÞÞÞßßßßÝrrrrrrqqqqqqrrrssssssstttttttuuvvvwxxxxxxxxxyyyyyyyyzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{{|}}}}}}|||||}}~€€€€‚‚„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“””•••••••••––—˜™™™š›ž¢¢¢££¤¤¤¤¦¨¨¨¨©ª«­®®°²³´´´µ¶¹¹¹ºººº»»»»»»¼¼½½¾¾¾¾¿¿ÁÁÁÁÁÂÃÄÆÆÇÈÉËÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÕÕÖÖÖÖÖÖÖ××ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÞßßßßßßßßààààááààßßÞÝÜÜÛÛÛÛÛÛÚÚÙ×××ÖÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×ØÚÚÛÛÛÛÛÛÛÛÜÜÜÜÝÞßßßàáâäääääååäãâááááâââãääääããããääåææçççæååæåäâââáâááàáááááâââââáááàáááààßßßßßßÞÞÝÝÝÞÞßßßßßÞrrrrrrrqqqqqqrrssssssttttttttuuuvwwxxxxxxxxxyyyyyyyyzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{{|}}}}}}||||}}~~~~€€€‚„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’”””•••••••••–—˜™™™š›¡¢¢£££¤¤¤¥¦¨¨¨©©ª«­®¯²²³´´´¶¸¹¹ºº»»»»»»»»¼½½½¾¾¾¿¿ÀÁÁÁÁÂÂÄÅÆÇÈÈÊËÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÔÔÔÕÖÖÖÖÖÖÖÖ××ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÞÞÞÞÞÞÞßßßßßßàààßßßÞÝÜÜÛÛÛÛÛÛÚÚÙ×××ÖÖÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ØÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞßßßààâãäääãããããâááááááâââããããââââãããäåæçææååååäâââââááàáááááââââââááâââáààßßßßßßÞÞÞÝÞÞÞÞßßÞßÞssssrrrrqqqqqrrsssstttttttttttuuvvxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyxxyyyyyyyyyyzzzz{{{|}}}}|||}}}~~~~~~~€€€‚„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”””•••••••••–—˜™™š› ¢¢£££¤¤¤¥¥§¨¨¨©©ª¬®®°²³´´´µ·¹¹¹º»»»»»»¼¼½½½¾¾¾¿¿ÀÁÁÁÁÂÂÃÄÆÆÇÈÈÉÊÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÔÔÔÕÕÖÖÖÖÖÖ×××ØÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÜÜÜÜÝÝÝÞÞßßßßßßÞÝÝÜÜÜÛÛÛÛÛÚÙØØ×ÖÖÖÖÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖ×ØÚÚÛÛÛÛÛÛÜÜÜÜÜÝÞßßààáâãããããâââââááàááááââââââááááââââããåæææååååãâââââáááááââââáââââãããâáàßßßßßÞÞÞÝÝÞÞÞÞÞÞÞÞÞÞsssssrrrrrrrrrssssstttttttttttuuvvxxxxxxxxxxyyyyyzyyyyyyyyyyyyyyyyxxxxxxxyyyyyyyyyzzzz{{||}}~}}}}}}~~~~~~~€€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“””””••••••••–—˜˜™™šœ ¢¢£££¤¤¤¤¥¦¨¨¨¨©©«­®¯²²³´´µ¶¸¹¹ºº»»¼¼¼½½½½¾¾¾¾¿ÀÁÁÁÁÁÂÃÄÅÆÆÇÇÈÉÊËËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÕÖ×Ö×××××ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÞßßÞÝÝÜÜÜÛÛÛÛÛÛÚÙØ××ÖÖÖÖÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖÖ×ÙÚÛÛÛÛÛÜÜÜÜÜÝÝÞßßàáââââââââááááááàààááááááááàààààáááââäååæææææäããããââááááâââââââãããäåãáààßßßÞÞÝÝÝÝÝÝÝÞÞÝÝÝÞÞssssssrrrrrrrssssstttttttttttuuuuwxxxxxxxxxxyyyyzzyyyyyyyyyyyyyyyxxxxxxxxyyyyyyyyyzzzz{{||}}~~}}}}~€€€€‚ƒ„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“””””•••••••••–—˜™™šœŸ¢¢£££¤¤¤¤¥¥§¨¨¨¨©ª¬­®°²³´´´µ·¹¹ºº»»¼½½½½½¾¾¾¾¿¿ÀÁÁÁÁÂÃÄÄÆÆÇÇÈÈÈÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÕÖ×××××××ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÝÜÜÜÜÜÜÛÛÛÛÛÚÚÙØ×ÖÖÖÖÖÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÖÖ×ÙÚÛÛÛÛÛÜÜÜÜÜÝÞÞßßààááááâááááááááàààààààààààààààßààáááââãäåççççåååääããââââââââââãããäåæäâáàßßßÞÞÝÝÜÝÝÝÝÝÝÝÝÝÝÝssssssrrrrrsssssssttttttttttuuuuvwxxxxxxxxxyyyyyzzyyyyyyyyyyyyyyyxxxxxxxxyyyyyyyyyzzzz{|||}}~~~€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’““”””•••••••••–—˜™™š›ž¢¢££££¤¤¤¤¥¦§¨¨¨¨©ª­®°²³´´´µ¶¹¹¹º»»¼½½¾¾¾¾¾¾¿ÀÀÁÁÁÁÂÂÃÄÅÆÆÇÇÇÈÈÉÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÕÖ××××ØØ××ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚØ××ÖÖÖÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖ×ÙÚÛÛÛÛÛÛÜÜÜÝÞÞßßßààááààáááááááàààßßàààààààààßßßßßßàààááââãæççççççæååäääããããããããääääååãâàßßßßÞÞÝÝÜÝÝÝÝÝÝÝÝÝÝÝssssssssssssssssstttttttttttuuuvwwxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxyyyyyyyzzzzz{{|||}~€€€€€€‚„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’“”””•••••••••–—˜™™š›ž¢¢££££¤¤¤¤¥¥¦¨¨¨¨©ª¬®¯²³´´´µ¶¸¹¹º»»¼½½¾¾¾¾¿ÀÀÁÁÁÁÁÂÂÂÃÄÅÆÆÇÇÇÇÈÈÉÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÕÖ××ØØØÙØØØÙÚÚÚÚÛÛÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÛÛÛÛÛÛÛÚÚÚÙØ××ÖÖÖÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖØÙÚÛÛÛÛÛÛÜÜÜÝÞßßßßààáààààààààààààßßßßßààààßßßßßßßßßßßààáááâåçççççççæåääååååääääååååååäãáààßßßßÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝsssssssssssssssstttttttttttuuuvvwxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxyyyyyyzzzzzz{{{|||}~€€€€€€€‚ƒ…†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’’““”•••••••••–—˜™™š›ž¢¢£££££¤¤¤¤¥¦§¨¨¨©©¬®¯²³³´´´¶¸¹¹º»»¼½½¾¾¾¿ÀÀÁÁÁÁÁÁÂÂÂÃÃÄÆÆÆÆÆÇÇÈÉÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÔÔÔÕÕÖÖ××ØÙÚÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙØ×××ÖÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖØÙÚÛÛÛÛÛÛÜÜÝÞÞßßßßàààààßààßßßàààßßßßßßßßßßßßßßÞÞÞÞÞßßßààááâãæççççççææååååææææææææææåääãáààßßßßÞÞÝÝÝÝÝÝÝÝÝÝÝÝÞssssssssssssssttttttttttttuuuvvwxxxxxxxxxxyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyzzzzzzz{{{|||}~~€€€€€€‚‚„††ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘’’“”•••••••••–—˜™™š›ž¢¢¢££££¤¤¤¤¤¥¦§¨¨¨©«®¯²³³´´´µ¸¹¹º»»¼½½¾¾¿¿ÀÁÁÁÁÁÁÁÂÂÂÂÃÄÆÆÆÆÆÆÇÇÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÔÕÕÖÖ××ØÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÚÚÚÙØØØÙÙÙÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØ×ÖÕÕÕÔÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ÙÚÚÛÛÛÛÛÜÜÝÞÞßßßßßàßßßßßßßßßßßßßßßßßßßßßßßßßÞÝÝÝÝÝÝÞßßààááâäæçççççççæåååæçççççççççåãããâáààßßßßÞÞÞÝÝÝÝÝÞÞÝÝÞÞsssssssssssssttttttttttttuuuvwxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyyzzzzzzz{{||||}~~€€€€€€€€€€€‚‚ƒ…†‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’’“””””•••••–—˜™™ššœŸ¡¢¢¢££££¤¤¤¤¥¥¦¨¨¨©«­®±²³³´´µ·¹¹º»»¼½½¾¾¾¿ÀÁÁÁÁÁÁÂÂÂÂÂÃÅÆÆÆÆÆÆÆÇÈÉÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÔÔÔÕÕÖÖ×ØØØØÙÚÚÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÛÛÚÚÚÚÚÙØ××ÖÖ×××ØØØØØÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙØ×ÖÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÖÖ×ÙÚÚÛÛÛÛÛÜÜÝÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÝÝÝÝÝÝÝÞßßßàààáâåçççççççææææççççççççççåãããâáààßßßßßßÞÞÝÝÞÞÞÞÞÞÞßsssssssssssstttttttttttttuuvwxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyyzzzzzzzz{{|||}}~€€€€€€€€€€€€€‚‚ƒ„…†‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘’’“”””•••••–—˜™™š›œž¡¢¢¢££££¤¤¤¤¥¦§¨¨©ª¬®¯²²³´´µ·¹¹ºº»»½½½¾¾¿¿ÀÁÁÁÁÁÂÂÂÂÃÄÅÆÆÆÆÆÆÆÆÇÈÊÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÔÕÕÖ××ØØØØØÙÙÚÚÚÚÚÚÙÙØØØÙÚÚÚÚÚÙØØØ××ÖÖÕÕÕÖÖÖÖÖÖÖÖ×ØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙ××ÕÕÕÔÔÔÔÔÓÓÓÓÓÔÔÔÔÕÕÔÔÕÕÕÕÕÖ×ÙÚÚÛÛÛÛÛÜÜÝÝÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÝÝÜÜÜÝÝÞßßßààààáãæççççççççççççççççççççåäããââáàßßßßßßßÞÞÞÞÞßÞÞÞÞßssssssssssstttttttttttttuuuvwxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyyyzzzzzzzz{{|||}}~€€€€€€€€€€€€€‚ƒ„„…‡ˆ‰ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’““””•••••–˜˜™™š›œœŸ¡¢¢£££££¤¤¤¥¥§¨¨©ª«­®°²³´´´¶¸¹¹º»»¼½½¾¾¾¿¿ÁÁÁÁÁÁÂÂÂÃÄÆÆÆÆÆÆÆÆÆÇÈÊÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÕÕÖÖ××××××ØØÙÚÚÚÚÚÙØØ×ØØÙÙØØ××ÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖ×ØÙÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚØ×ÖÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÖ×ØÚÛÛÛÛÛÛÜÜÝÝÞÞÞßßßßßßßßßßßÞÞßÞÞÞÞÞÞßßßßßßßÞÝÝÝÜÜÜÝÝÞÞßßßßààáâäççççççççççççççççççççåääãââáààßßßßßßßßÞßßßßßßßßssssssssssttttttttttttuuuuuwxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyyyzzzzzzzz{{|||}~€€€€€€€€€€€€€€‚ƒ„„„…†‰ŠŠ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’’““”••••––˜˜™™ššš›œžŸ¢¢¢££££¤¤¤¤¥¦¨¨¨©ª¬®¯²²³´´µ¶¹¹¹º»»¼½¾¾¾¾¿ÀÁÁÁÁÁÁÂÃÃÅÆÆÆÆÆÆÆÆÆÇÈÊÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖ×××ÙÚÚÚÚÚÙØØ××Ø×ÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖ×ØÙÚÚÚÚÛÛÛÛÛÛÛÛÚÚÙØÖÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÖ×ØÚÚÛÛÛÛÛÜÜÝÝÞÞßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÝÝÞÞßßßßßßÞÝÜÜÜÜÜÝÝÝÞßßßßààáâäåçççççççççççççççççççæääãââááàààßßßßßßßßßßßßßßßssssssssttttttttttttttuuuuvwxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxyyyyyyzzzzzzzzz{{{||}}€€€€€€€€€€€€€€‚ƒ„„„……‡‰ˆˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘‘’’’““”••••––˜˜™™™ššš›œž¡¢¢££££¤¤¤¤¥¦¨¨¨©ª«­®°²³´´´µ·¹¹ºº»»¼½½¾¾¿¿ÀÁÁÁÁÁÂÂÃÅÆÆÆÆÆÆÆÆÇÈÉÊÌÍÎÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖ×ØÚÚÚÚÙØØ×ÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÓÔÔÔÔÔÔÔÕÕÖÖ×ØÙÚÚÚÚÛÛÛÛÛÚÚÚØ×ÖÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÖ×ØÙÚÛÛÛÛÜÜÜÜÝÝÞÞßßßßÞÝÝÝÞÞÞÞÞÞÝÝÝÝÝÝÞÞßÞÞßÞÞÝÜÜÜÜÜÜÝÝÞÞßßßßààáãååççççççççççççççççççæåäãââááàààßßßßßßßßßßßßßßßrssssssstttttttttttttuuvvvwxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxyyyyyyzzzzzzzzz{{{||}}€€€€€€€€€€€€‚„…………†‡ˆ‡‡ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘‘‘’’’“”••••––˜˜™™™™™šš›Ÿ¢¢¢£££¤¤¤¤¥¦¨¨¨¨©«­®¯²³³´´´µ·¹¹¹º»»½½½¾¾¿¿ÀÁÁÁÁÁÂÃÄÄÄÅÅÅÆÆÆÇÈÉËÌÍÎÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÕÕÕÖÖÖ×ØÚÚÚÚÙØ×ÖÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÖÖ×ØØÙÚÚÚÚÚÚÚÚÙØ×ÖÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÖ××ÙÚÛÛÛÛÜÜÜÜÝÝÝÞÞßÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÜÜÜÜÜÝÝÝÞÞßßßßßàáâãäåçççççççççççççççççæååäãââááààßßßßßßßßßßßßßßßrrssssssttttttttttuuuuvvwwxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxyyyyyyyzzzzzzzzz{{{|}}~€€€€€€€‚ƒ„…†††‡‡ˆ‡‡ˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘‘‘‘’’’“•••––—˜˜™™™™™™šš›ž¡¢¢£££¤¤¤¤¥¦§¨¨¨©ª¬­¯²³³³´´´µ·¹¹ºº»»½½¾¾¾¿¿ÀÁÁÁÁÂÂÂÃÃÃÃÄÅÆÆÇÈÊËÌÌÍÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖ×ØØØØØ×ÖÖÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÖÖÖ×ØØØÙÙÚÙØØ××ÖÖÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÖÖÖ×ØÚÛÛÛÛÜÜÜÜÜÝÝÝÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÞÞÞÞÞÞÞÝÝÝÜÜÜÜÝÝÞÞÞÞÞßßßààáâãäåçççççççççççççççççæåäããâáààßßßßßßßßßßßßßßßßrrssssssttttttttttuuuuvvwxxxxxxxxxxxxxyxxxyyyyyyyyyyyyyyyyxxxxxxxxxxxyyyyyyyyyyyyzzzzzz{{{|}}~€€€€‚‚ƒ„…†‡†‡††‡‡ˆˆ‰‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŽ‘‘‘‘’’“•••––—˜˜˜™™™™™™š› ¢¢¢£££¤¤¤¤¥¦¨¨¨¨©«­¯±²³³³´´´µ¸¹¹º»»¼½½¾¾¾¿ÀÁÁÁÁÁÁÂÂÂÂÂÃÃÅÆÆÇÉÊËËÌÍÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖ×××Ø×ÖÖÖÖÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖ×ØÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÞÞÞÝÝÝÝÝÝÝÜÜÜÝÝÝÝÞÞÞÞßßßààáâãäæçççççççççççççççççæåäãâááàßßßßßßßßßßßßßàßßrrrssssstttttttttuuuuvvwwxxxxxxxxxxxxyxxxxyyyyyyyyyyyyyyyyxxxxxxxxxxxyyyyyyyyyyyyzzzzzz{{||}~~€€€€‚ƒƒ„…†‡‰ˆ‡‡†††‡ˆˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘’’”•••––—˜˜˜˜™™™™™š›œŸ¢¢¢£££¤¤¤¤¥¦¨¨¨¨©«­®±²²³³´´´µ·¹¹¹º»»¼½¾¾¾¾¿ÀÁÁÁÁÁÁÂÂÂÂÂÃÃÅÆÇÈÉÊÊÊËËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÔÔÓÓÓÓÓÓÒÒÓÓÓÓÓÓÓÓÔÔÕÕÕÕÖÖÖÖÖ×ØÚÚÛÛÛÛÛÛÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÞÝÝÝÝÝÝÝÜÜÜÜÝÝÝÝÞÞÞÞßßßßàáââäæççççççççççççççççççæäãââáààßßßßßßßßßßßßàààrrrssssstttttttttuuvvwwxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyxxxxxxxxxyyyyyyyyyyyyyzzzzzz{||}~€€€€€‚‚ƒ„……‡‰‰Š‹Š‰ˆ‡†‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘‘’“”•••–——˜˜˜˜˜™™™™š›Ÿ¢¢¢£££¤¤¤¥¥¦¨¨¨©©«­¯±²²²³³´´µ¶¸¹¹º»»¼½½¾¾¾¿¿ÀÁÁÁÁÁÁÁÂÂÂÂÃÄÆÆÇÈÉÉÉÊÊÊËÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÕÔÔÔÔÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÖÖÖ×××ÙÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÝÝÝÝÝÝÝÝÜÜÜÜÝÝÝÞÞÞÞÞßßßßàááâãåçççççèèççççççççççççåäãââáààààßßßßßßßßààààrrssssssttttttttuuvvwxxxxxxxxxxxxxxxyxxxxyyyyyyyyyyyyyyyyyyyxxxxxxxxyyyyyyyyyyyyzzzzzzz{|}}€€€€€‚‚‚ƒƒ…†‡‰Š‹ŠŠŠŠ‰‰‡‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽ‘‘‘‘’“”••••———˜˜˜˜™™™™™š›Ÿ¢¢¢£££¤¤¤¥¥§¨¨¨©©«®¯°²²²³³´´µ¶·¹¹¹º»»½½½¾¾¾¿¿ÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÈÈÈÈÉÉÉÉËÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖ××ØÙÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÝÜÜÜÜÜÜÜÜÜÝÝÝÞÞÞÞßßßààááâäåççççèèèçççççççççççæääãââáàààààààßßßàààààrrssssssstttttuuuuvvxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxyyyyyyyyyzzzzzzzzzzz{|}~€€€€€‚‚ƒƒ„„…‡ˆŠ‹‹‹‹ŠŠ‹‹‰‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘‘’“”••••–—˜—˜˜˜˜™™™™š›œž ¢¢¢£££¤¤¤¥¦¨¨¨¨©ª¬®¯°±²²³³´´´µ¶¸¹¹º»»¼½½¾¾¾¾¿ÀÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÇÇÇÇÈÇÈÉÉËÌÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ×ØÙÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÞÞßßßßààáâããåççççèèèèçççççççççæåääããâáááààààààààßßààrrssssssttttuuuuvvvxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyxxyxxxxxxxxyyyyyzzyyzzzzzzzzzz{{|~€€€€€€€‚‚ƒƒ„……†‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’“””••••–˜˜˜˜˜˜™™™™™š›Ÿ¢¢¢££££¤¤¤¥§¨¨¨©©ª­®¯¯±²²³³´´´µ¶¹¹¹º»»¼½½½¾¾¾¿¿ÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÆÇÇÇÇÈÉÊËËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÖÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÞÞßßßßàááââäæçççèèèèèèèçççççççæåäååãâááááàààààßßßààrrssssssttttuuuuvvwxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyxxxxxxxxxxyyyyyzzzzzzzzzzzzzz{{||~€€€€€€€€‚‚ƒƒ„„„……†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’”””••••––—˜˜˜˜˜™™™™ššœž¡¢¢¢£££¤¤¤¤¦¨¨¨¨©ª«­®¯¯±²²³´´´´µ¶¹¹¹ºº»»¼½½¾¾¾¾¿ÀÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÆÆÇÇÇÈÉÊÊËÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÞßßßàááâãåççççèèèèèèèçççççççæååååäâáááàààààßßàààrsssssttttttuuvvwwxxxxxxxxxxxxxxxxxxyxyyyyyyyyyyyyyyyyyyyxxxxxxxxyyyyyyzzzzzzzzzzzzz{{{|}€€€€€€€€‚‚ƒ„„……„„„„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’”••••••–——˜˜™™™™™™™š› ¢¢¢££££¤¤¤¤¥§¨¨¨©ª«®®¯°±²³³´´´µµ¶¸¹¹ºº»»¼½½½¾¾¾¿ÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÆÆÆÆÆÇÇÈÈÉÊËÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÞßßààáâãåæçççèèèèèèèèççççççççæååæäãâááááàààààààssssttttttttuuvwxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyxxxxxxyyyyyyzzzzzzzzzzzzz{{||}€€€€€€€‚ƒ„„………………„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘’“”•••••–——˜˜˜™™™™™™š›œž ¢¢¢£££¤¤¤¤¤¥¦¨¨¨¨©«­®¯±²²³³´´´´µ¶¸¹¹ºº»»¼½½½¾¾¾¿ÁÁÁÁÁÁÁÂÂÂÃÄÅÅÆÆÆÆÆÆÇÇÈÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÞßßààáâãäæççççèèèèèèèèçççççççççæææäãââááááààáààssssttttttttuuwxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxyyyyyzzzzzzzzzz{{{{||}~€€€€€€€‚‚ƒ„………………………†‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••–———˜˜˜™™™™™š›œž¡¢¢¢£££¤¤¤¤¤¥¥¦¨¨¨©ª¬­®±²²³³´´´µµ¶¸¹¹¹º»»¼½½½¾¾¾¿ÁÁÁÁÁÁÁÂÂÂÃÄÄÄÅÅÆÆÆÆÇÇÇÈÉÊÌÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÓÓÓÓÓÓÓÓÓÓÓÔÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÝßßßàáâãäæççççèèèèèèèèèçççççççççææåääââááááááààssstttttttttuuwxxxxxxxxxxxxxxxxxxxxyyyyyyyyyxyyyyyyyyyyyxxxxxxxxyyyyyyzzzzzzzz{{{{||}}~€€€€€€€‚‚ƒ„†‡‡††………††‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“••••–——˜—˜˜˜™™™™šš›œŸ¢¢¢£££¤¤¤¤¤¤¤¥¦§¨¨©©«­®°²²³´´´´µµ¶¸¹¹¹º»»»¼½½¾¾¾¿ÁÁÁÁÁÁÁÂÂÂÂÃÃÃÄÄÅÆÆÆÆÆÇÈÉËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖÖØÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßàáâãäåççççèèèèèèèèèèççççççççæååäåãâââááááààssttttttttttuvvwxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyxxxxxxxxyyyyyyzzz{{{{{{{{|}}~€€€€‚ƒƒ„…‡ˆˆ‡†………‡ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’”••••–˜˜˜˜˜˜™™™™ššš›ž ¢¢¢££££¤¤¤¤¤¤¤¥¦¨¨¨©ª¬®¯²³³´´´´´µ¶¸¹¹¹ºº»»¼½½¾¾¾ÀÁÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÄÅÆÆÆÆÇÈÊËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖ×ØØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝßßßàáãåæççççèèèèèèèèèèèçççççççæåääääãââáááááástttttttttttuuvvvvvwxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyxxxxxxxyyyyyyyzzz{{{{{{{|}~€€€€€‚‚ƒƒ„…†ˆ‰‰ˆ†………†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••–—˜˜˜˜™™™™™šššœž¡¢¢¢££££¤¤¤¤¤¤¤¥¥¨¨¨¨©«­¯²²³³´´´´µ¶·¹¹¹ºº»»¼½½¾¾¾¿ÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÃÄÄÅÆÆÆÇÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÖ××ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞßßàáâäçççççèèèèèèèèèèèçççççææçåääääããâââááááttttttttttttuuuuuuuvxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyxxxxxxyyyyyyyzzz{{||||}}€€€€€€‚ƒ„„„…†ˆŠŠŠ‰‡†††‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘““”••••–—˜˜˜™™™™™ššš›œžŸ¢¢¢££££££¤¤¤¤¤¤¤¥§¨¨¨©ª­¯±²³³´´´´µ¶¸¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÃÄÅÆÆÇÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÒÒÒÒÒÒÒÑÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕ××ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÞßßààâäçççççèèèèèèèèèèèèçççççæçæåääääãããâââáátttttttttttuuuuuuuuvwxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyxxxxyyyyyyyzzz{{||}}€€€€€€€€‚ƒ……††ˆŠ‹‹‹‰‰ˆ‡ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’”•••••–—˜˜™™™™™ššš›œŸ ¢¢¢££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª­®°²³³´´´´µ¶¸¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÄÅÆÆÆÇÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÑÒÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÞßßßàáâåçççççèèèèèèèèèèèççççççççåååäääãããââááttttttttttuuuuuuuuuvvwxxxxxxxxxxxxyyyyyyyyyyyyyyyzyyyyyyyyyyyxxyyyyyyzzzz{{|}~€€€€€€€‚‚ƒ…†‡‡ˆ‰‹‹‹‹ŠŠ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••–—˜˜™™™™™šš›œŸ¡¢¢¢¢££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª­®¯²²³´´´´µ¶¹¹¹¹ººº»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÇÈÉÊËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÖ×ÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßßàáãæçççççèèèèèèèèèèçççççççççææååäãããââááttttutttuuuuuuuuuuuuuvxxxxxxxxxxxxyyyyyyyyyyyyyzzyyyyyyyyyyyyyyyyyyyyzzzz{{|}~€€€€€€‚‚ƒƒ…‡‰‰ŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘’“”••••–—˜˜™™™ššš›œž ¢¢¢¢£££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª­®¯±²³´´´µ¶·¹¹¹¹ººº»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÅÆÆÇÈÉËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÖØÙÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßßßàáâåçççççèèèèèèèèèèçççççççççççæåäããââáááttttuuuuuuuuuuuuuuuuuvwxxxxxxxxxxxyyyyyyyyyyyyzzzyyyyyyyyyyyyyyyyyyyyzzzz{{|}~€€€€‚‚ƒ„†‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’“”••••–—˜˜™™™š››œž ¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª¬®¯±²³´´´µ¶·¹¹¹¹ººº»»¼½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÅÆÆÇÈÊÌÍÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÖØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßààâäçççççèèèèèèèèèèçççççççççççæåäãââááááttttuuuuuuuuuuutuuuuuuvxxxxxxxxxxxxyyyyyyyyyzzyyyyyyyyyyyyyyyyyyyyyyyzzzz{{||}€€€€‚‚ƒƒ„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’”••••–—˜˜™™™š›œž ¢¢¢¢¢££££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª¬®¯±²³³´´µ¶¸¹¹¹¹¹º»»»¼½½¾¾¿ÀÀÁÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÇÈÊËÌÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÖÖØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞÞßßßàáãæççççèèèèèèèèèèèççççççççççæäâááààààátttuuuvvuuuuuuuuuuuuuvvwxxxxxxxxxxxxxyyyyyyzzzzyyyyzzzzyyyyyyyyyyyyyzzzzz{|||~€€€€‚ƒ„…†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’”••••–——˜™™™š›žŸ¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¥¦¨¨¨©ª«®¯±²³´´´´µ·¹¹¹¹¹ºº»»¼½½¾¾¿ÀÀÀÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÆÇÉËËÌÌÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÖÖØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÙØØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞÞßßßàáâåççççèèèèèèèèèèèçççççççççæäãááààààààtttuvvvvvvuuuutuuuuuuuvvwxxxxxxxxxxxxyyyyyzzzzzzzzzzzzzzyyyyyyyyyyyzzzzz{{||}~€€€€€‚ƒ„†‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘’’”••••––—˜™™™šœž ¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¦§¨¨¨©ª«­®±²³³´´´µ¶·¹¹¹¹ºº»»¼½½¾¾¿¿ÀÀÁÁÁÁÁÁÁÁÁÁÂÂÃÄÅÆÇÈÊÌÌÌÌÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙØÙÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÝÝÞßßßàáâäççççèèèèèèèèèèèèèçççççæåäãâáàààßßßßtttuvvvvvvvuutttuuuuuuuvwxxxxxxxxxxxyyyyyzzzzzzzzzzzzzzzyyyyyyyyyzzzzzz{{{|}~€€€€‚ƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘’“”••••––—˜™™™šœž¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¦§¨¨¨©©«­®±²³³´´´´µ¶¸¹¹¹ºº»»¼½½½¾¿¿ÀÀÀÁÁÁÁÁÁÁÁÁÂÂÃÄÆÆÇÈÉÊËËËËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÖ××ÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßààâäæçççèèèèèèèèèèèèèççççæåããáàààßßßßßßtttuvvvvwwvuttttuuuuuuuvvwwxxxxxxxxxyyyyzzzzzzzzzzzzzzzzzzyyyyyyzzzzzzz{{||}€€€‚ƒƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘’“”•••••–—˜™™™šœŸ¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¦¨¨¨¨©©«­®°²²³³´´´´µ¶¸¹¹ºº»»¼¼½½¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÇÈÈÉÊÊÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÖÖ×ØÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÙÙÙØØÙÚÚÙÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝßßßààâäæçççèèèèèèèèèèèèèçççæåäãáààßßßßßßÞÞtttuvvvwwwvutttttuuuuuuuvvvwxxxxxxxxyyyyzzzzzyyyyzzzzzzzzzzzzzzzzzzzzz{{||}~€€€‚ƒƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽŽŽ‘‘’“”••••––—˜™™ššœŸ¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¥§¨¨¨¨©©«­®°±²²³³´´´µµ·¹¹¹º»»¼¼½½¾¾¿¿¿ÀÁÁÁÁÁÁÁÁÂÂÂÃÃÅÆÆÆÇÇÈÉÉÉÊËÌÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÔÔÔÕÕÕÕÖ×ØÙÙÚÚÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØ×××ØÙÚÚÚÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÝßßßààâäçççççèèèèèèèèèèèèçççåäãâáàßßßßßÞÝÝÝtttuuuvvwwuuttttttuuuuuuuuvvwxxxxxxxyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzz{{{|}~~€€€€‚ƒ„…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹ŒŒŒŒŒŽŽŽŽŽ‘‘’”••••––—˜™™š›œŸ¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¥¦§¨¨¨¨©©«­®¯°°²²³³´´´µ¶¸¹¹º»»»¼½½¾¾¾¿¿ÀÀÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÆÇÇÈÈÈÉÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÔÔÔÕÕÕÖ×ØÙÚÚÚÚÚÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙØØ×××××××Ø××××Ö×××ØÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÜÜÝÞßßàáâäçççççèèèèèèèèèèèççççäãâáàßßßßßÞÝÝÝÜttttuuuvwvuuttttttuuuuuuuuuvvwxxxxxxyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzz{{{{|~€€€€‚ƒƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽŽŽŽŽ‘‘’”••••–—˜˜™™š› ¢¢¢¢¢££¢£££££££¤¤¤¤¤¤¥¦§¨¨¨¨©ª¬®®®¯°°²²³³´´´µ·¹¹¹º»»¼½½¾¾¾¿¿ÀÀÁÁÁÁÁÁÁÂÂÂÂÂÃÄÅÆÆÇÇÈÈÈÈÈÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÔÕÕÖÖ×ØÙÚÚÚÚÚÚÚÚÛÛÛÛÚÚÙÙÙÚÚÚÚÚÚÚÚÚÙØ×ÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖ××ØÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÞßßàáãåçççççèèèèèèèèèèèçççæäãâáàßßßßÞÝÝÜÜÜttttuuuvvvvuututtuuuuuuuuuuvvwxxxxxyyyyyyyyyyyyyyyyzzzzzzz{{zzzzzz{{{{||}~€€€€‚‚ƒƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽ‘’“”••••–—˜™™™šœž¡¢¢¢¢¢££££££££££¤¤¤¤¤¤¥§¨¨¨¨©©ª¬­®®®¯°±²²³´´´µ¶¸¹¹º»»»¼½¾¾¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÆÇÈÇÇÇÈÈÉÊËÎÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÕÕÖÖ×××ØÙÙÙÚÚÚÚÚÛÛÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚØ×ÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÖÖ××ØÙÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÞßàáãäæççççççèèèèèèèèèççççæäãâáàßßßÞÞÝÜÜÜÜtttuuuuvvvvuuuuuuuuuuuuuuuuvwxxxxxxxyyyyyyyyyyyyyyyzzzzzzz{{{{{{{{{{{|||}€€€€€‚‚ƒƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’”••••––˜˜™™ššœŸ¢¢¢¢¢£££££££££££¤¤¤¤¤¥¥§¨¨¨¨©ª«¬­­®®¯°±²²³´´´´µ·¹¹¹º»»¼½½¾¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÄÆÆÆÇÇÇÇÇÈÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÔÕÕÕÖÖ××ØØÙÙÚÚÚÚÚÚÚÚÚÙÙÙÙÙØØÙÙÙÙØØ××ÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖØÙÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÝÞßàáãåæçççççççèèèèèèèççççççåãâáàßßßÞÝÝÝÜÜÜttuuuuuvvvvvuuuuuuuuuuuuuuuvxxxxxxxxyyyyyyyyyyyyyyzzzzzzzz{|||{{{{{{{|||}~€€€€€€‚‚ƒƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽ‘’“•••••–˜˜™™™š›¡¢¢¢¢£££££££££££¤¤¤¤¤¤¥¦¨¨¨¨©ª««¬­­®®¯°±²²³´´´´µ·¹¹¹º»»»½½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÂÂÃÃÄÅÆÆÇÇÇÇÇÈÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÕÖÖ××ØØØÙÚÚÚÚÚÚÚÚÙØØÙØØØØØØØ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖ×ØÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÝßßàáãæççççççççççççèèèççççççæäâáàßßßÞÝÝÜÜÜÜuuuuuuvvvvwvuuuuuuuuuuuuuuvvxxxxxxxxyyyyyyyyyyyyyzzzzzzzz{{|||{{{{{{{{|}}~€€€€€€‚ƒƒƒ„‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’”••••–—˜™™™š›œž¢¢¢¢¢££££££££££¤¤¤¤¤¤¥¥¦¨¨¨©©ª««¬­­®®¯°±²²³´´´´µ·¹¹¹º»»»¼½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÆÇÈÈÈÈÉÊËÌÏÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÓÓÓÔÔÔÔÕÕÕÖÖ××××ØØÙÚÚÚÙÙÙØØØ×××××××ÖÖÖÕÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖ×ØÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÝÞßßàâäæççççççççççççççççççççæäãâáàßßßÞÝÝÜÜÜÜuuuuuuuvvvvvvuuuuuuuuuuuuvvwxxxxxxxxyyyyyyyyyyyyyzzzzzzzz{{||||{{{{{{{|}}~€€€€€€‚‚ƒƒ„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’“”•••–—˜˜™™šš› ¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¥¦§¨¨¨©ªª«¬¬­­®®¯°±²²³´´´´µ¶¸¹¹º»»»¼½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÇÇÈÉÉÉÊËÍÎÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖ××ØØØØØØ××××Ö×Ö××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÕÕÖ××ÙÚÛÚÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝßßàáãäææççççççççççççççççççæåãâáàßßßÞÝÝÜÜÜÜÜuuuuuuuvvvvvvuuuuuuuuuuuvwwwxxxxxxxxyyyyyyyyyyyyzzzzzzzz{{{{{|||{{{{{||}~€€€€€‚‚ƒƒ„…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘’’“”•••–—˜˜™™™š›Ÿ¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¥¥¦¨¨¨©©ª«¬­­­®®¯°°²²³³³´´´µ¶¸¹¹ºº»»¼½¾¾¿ÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÇÇÈÉÊËÌÍÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÕÕÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖÖÕÕÕÕÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÕÕÕÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßáâäååæççççççççççççççççççæäâáààßßßÞÝÝÜÜÜÜÜuuuvvvvvvvvvvvuvvvvvvvvvvwxxxxxxxxxyyyyyyyyyyyyyyzzzzz{{{{{{{{{{|{{{{|}}~€€€€€‚‚‚ƒ„…ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’’’“”••••–—˜˜™™™ššœž¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨©ª«¬­­®®®¯¯°±²²³³³´´´µ¶¸¹¹º»»»¼½¾¾¿ÁÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÄÅÆÆÆÈÈÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÕÕÖÖÖÖ×××××ÖÖÖÖÖÖÖÖÖÖÕÕÕÕÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÔÔÔÔÕÕÕÖÖØÙÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßßàâãåååæçççççççççççççççççæåãâáààßßßßÞÝÜÜÜÜÜvvvvvvvuuvvvvuuvwwvvvwxxwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{|||||}}€€€€‚‚‚‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‘‘‘’““””•••••–—˜˜™™™™š›œŸ¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¥¦§¨¨¨©ª«¬­®®®®¯°°±²²³³³³´´´´¶¸¹¹º»»»¼½¾¾¿ÀÁÁÁÁÁÁÁÁÁÁÁÁÂÂÂÃÃÅÆÆÆÈÉËÍÎÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÐÐÐÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÕÕÖÖ××××××ÖÖÖÕÕÕÖÖÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÖÖ×ØÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÞßßàáâãäååççççççççççççççççççæäâááàààßßßÞÝÝÜÜÜÜvvvwwwvvuvvvuuuvwxwwwwxxxxxxxxxxxxyyyzzzzzzyyyyzzzzzz{{{{{{{{{{{{{||||}~€€€€‚‚‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘‘‘‘‘‘’“””••••••–—˜˜™™™™šš›¡¢¢¢£££££££££¤¤¤¤¤¤¤¥¥¦§¨¨¨©©«¬­®®¯¯¯°±²²²³³³³³´´´´µ·¹¹º»»»¼½¾¾¿ÀÁÁÁÂÁÁÁÁÁÂÁÁÂÂÂÃÄÅÆÆÇÈÊÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÕÖÖÖ××××ÖÖÖÕÕÕÖÖÕÕÕÕÔÔÔÔÔÓÔÔÔÔÔÔÔÕÔÔÔÔÔÔÔÕÕÕÕÖÖ×ØÙÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞÞßßßàâãããäåççççççççççççççççççåãâáàààßßßÞÞÝÝÜÜÜÜvvwwwvvvvvvuuuuvwxxxxxxxxxxxxxxxxyyyyzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{|||}~€€€€€‚‚ƒ„‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘‘‘‘‘‘’’’“”••••••–—˜˜™™™ššš›œŸ¢¢¢¢£££££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨©©ª«­®®¯°±±²²²³³³³³³´´´´µ·¹¹º»»»¼½½¾¾¿ÁÁÁÁÂÁÁÁÁÂÂÁÂÂÂÃÄÅÆÆÆÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÖÖÖ×ÖÖÖÖÕÕÕÕÖÕÕÕÔÔÔÔÔÔÓÓÓÓÓÔÔÔÔÕÔÔÔÔÔÔÕÕÕÕÕÕÖ×ØØÚÚÛÛÛÛÛÛÜÜÜÜÝÝÞßßßàáâââãäåçççççççççææççççççåãâáààßßßßßÞÝÝÝÜÜÜÜvvwwvuuuvvuuuuuuvxxxxxxxxxxxxxxxxyyyyzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{|||}~€€€€€€€€‚ƒ„‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘‘’’’’’’’“”••••••––—˜™™™ššš›œž ¢¢¢£££££££££¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨©©©ª¬­®¯°±²²²³³³³³³³´´´´µ·¹¹º»»»¼½½¾¾¿ÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÃÃÄÆÆÆÇÉÌÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ×ØÙÚÛÛÛÛÛÛÜÜÜÜÝÞÞßßààáââââãåæçççççææåååææåäåäãáààßßßßßÞÝÝÝÝÝÜÜÜÜwvvvuuuuuuuutttuvwxxxxxxxxxxxxxxyyyyzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{||}}~€€€€€€€€€‚ƒ„‡‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’’“““““”•••••––——˜˜™™™ššš››Ÿ¡¢¢¢£££££££££¤¤¤¤¤¤¤¥¦§¨¨¨¨¨¨©©ª«­®®°±²²³³³³³³´´´´´´¶·¹¹ºº»»¼½½¾¾¿ÁÁÁÁÂÂÂÂÂÂÂÂÂÂÃÃÃÄÆÆÆÇÉÌÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖÖ××ÙÚÛÛÛÛÛÜÜÜÝÝÝÞßßßàáááââããåçççççæååäääåäããââáààßßßßßÞÞÝÝÝÝÝÜÜÜÜwvvuuuuuuuuutttuuvwxxxxxxxxxxxxyyyyyzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{||}}~€€€€€€€€€‚ƒ…†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘’“””””••••••–——˜˜™™™™ššš››Ÿ ¢¢¢££££££££¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨¨¨¨©©ª¬®®¯±²²³³³³³´´´´´´µ¶·¹¹ºº»»¼½½¾¾¿ÀÁÁÁÂÂÂÂÂÂÂÂÃÃÃÃÃÄÆÆÆÇÊÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÖ×ØÙÚÛÛÛÛÛÜÜÜÝÝÞÞßßààááâââãåæççççççæååäåäããâááàßßßßßÞÞÞÝÝÝÜÜÜÜÜÜÜvuuuuttttuuutttuuvwwxxxxxxxxxxyyyyyyzzzzzzzzzzzzzzzzzzzzz{{{{{{{{||}}}~€€€€€€€€€‚‚ƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘‘’’“”•••••••••–—˜˜™™™ššš››œžŸ¡¢¢¢££££££¤¤¤¤¤¤¤¤¤¥¥¦§§¨¨¨¨¨¨¨©©ª¬­®¯°²²³³³´´´´´´´´µ¶¸¹¹ºº»»»½½¾¾¿ÀÁÁÂÂÂÂÂÂÂÂÂÃÃÃÃÄÅÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖ×ØÙÚÛÛÛÛÛÜÜÜÝÞÞßßßàààáâââãäççççççççæåäääãâááàßßßßÞÞÞÞÝÝÝÝÜÜÜÜÜÜÜuutttttttuuuttuuuvvwwxxxxxxxyyyyyyyzzzzzzzzz{{{{{{zzzzzz{{{{{{{{{||}}~€€€€€€€€€€‚ƒ…‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘‘‘’’“•••••••••–—˜˜™™™ššš››œžŸ ¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¥¥¦¦§§¨¨¨¨¨¨¨©ª«­®¯±²²³³³´´´´´´´µ¶·¹¹¹ºº»»»¼½¾¾¿ÀÁÁÂÂÂÃÃÂÂÃÂÂÃÃÄÅÆÆÆÇÉËÎÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖ×ØÚÚÛÛÛÛÛÜÜÜÝÞÞßßßàààáââããåçççççççççååääâáààßßßßÞÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜutttttttuuuuuuuuuuuvwxxxxxxxyyyyyyzzzzz{{{{{{{{{{{{zz{{{{{{{{{{{{||}~€€€€€€€€€€€€€‚„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽ‘‘‘’’“”•••••••––—˜˜™™™™šš››œžžŸ¡¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¥¦¦¦§¨¨¨¨¨¨¨©ª«­®¯±²²³³³´´´´´µµµ·¸¹¹¹ºº»»¼½½¾¾¿ÀÁÁÂÂÃÃÃÃÃÃÂÃÃÃÅÆÆÆÇÈÉÌÏÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÖÖÖ×ÙÚÚÛÛÛÛÛÛÜÜÜÝÞßßßßààáâããäæçççççççççææåãâààßßßßÞÝÝÝÝÝÝÜÜÜÜÜÜÜÜÛÛtttttttttttttutuuuuuvwxxxxxxyyyyyyzzzz{{{{{{{{|{{{{{{{{{{{{{{zz{{{||~€€€€€€€€€€€€‚ƒ†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘’’’“”•••••––—˜˜˜™™™™™šš››œžŸ ¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨¨¨©ªª¬®¯±²²³³³´´´´µµ¶¶·¹¹¹¹º»»»¼½½¾¾¿ÁÁÁÂÂÂÃÃÃÃÃÃÃÃÄÅÆÆÇÇÉËÍÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×ÙÚÚÛÛÛÛÛÛÜÜÜÝÞßßßßààáâãääåççççççæåæææãâáàßßßÞÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛtttttttttttttttuutuuvwxxxxxyyyyyyzzzzz{{|{|{{{||{{{{{{{{{{{{{z{{{{||~€€€€€€€€€€€ƒ†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽŽ‘‘‘’’“””••••––—˜˜™™™™™™™š››œŸŸ ¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§§¨¨¨¨¨©©ª«¬®¯±²²³³³´´´´µ¶··¸¹¹¹ºº»»»¼½½¾¾¿ÁÁÁÂÂÂÃÄÃÃÃÃÄÄÅÆÆÇÇÉÊÌÏÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÕÕÖÖÖÖ×ØÙÚÚÛÛÛÛÛÛÛÜÜÝÞßßßßàààâããäåæçççççæåææåãáàßßßÞÞÞÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛtttttttttttttttttuuuuvxxxxxyyyyyzzzzz{{|||||||||||||||{{{{{{{{{{{{|}€€€€€€€€€ƒ…‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’““””•••••–—˜™™™™™™™™šš›œž ¢¢¢¢¢¢££££££¤£¤¤¤¤¤¤¤¤¤¤¥¥¥¦§§¨¨¨¨¨¨©©ª¬®¯±²²³³´´´´´µ¶·¸¹¹¹¹ºº»»¼½½¾¾¾ÀÁÁÁÂÂÃÃÄÅÅÅÄÅÆÆÆÇÈÉÊÌÎÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÕÕÖÖÖÖ×ØÙÚÚÛÛÛÛÛÛÛÜÜÝÝÞßßßßààáââäååæççççæææåäâààßßÞÞÞÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛtttttttttttttttttuuuuvwxxxxyyyyyzzzz{{{|||||||||||||||{{{{{{{{{{{|}~~~~€€€€€€€€€‚…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘‘’’“””••••••–—˜™™™™™™ššš›œž ¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦§¨¨¨¨¨©©©«­®®°²²³³´´´´´µ¶·¸¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÂÂÃÃÄÅÆÆÆÆÆÇÇÈÉÊÌÏÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÔÔÔÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÕÕÖÖ×××ØÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞßßßßßàááâãääæçççççççäãâàßßßÝÝÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛtttttttttttttttttuuuuvxxxxxxyyyyzzzzz{{||}}}|||}}|||||{{{{{{{{{{|}~~}}~~€€€€€€‚…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŽ‘‘’’““””••••••–—˜˜™™™™™šš››œœžŸ¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦§¨¨¨¨¨©©ª«­®®°²²³³´´´´´µ¶·¹¹¹¹ºº»»¼¼½½¾¾¿ÀÁÁÂÂÂÃÃÄÅÆÆÆÆÇÈÉÊËÍÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÕÕ××ØØÙÚÚÛÛÛÛÛÛÛÛÜÜÜÝÞÞßßßßàááââããåææççççæäâáàßßÞÝÝÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛttttttttttttttttttuuuvxxxxxxyyyyyzzzz{{|||||||||||{{{{{{{{{{{{{|}}~}}}}}~€€€€‚„ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒ‘‘‘’““”””••••••–—˜™™™™™™šš›››œžŸ¡¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦§¨¨¨¨¨©©ª«¬­®°±²³³´´´´µµ¶·¹¹¹¹ºº»»¼½½½¾¾¿ÁÁÁÂÂÂÃÃÄÆÆÇÈÈÈÉËÍÎÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÒÒÒÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÕÕÖ×ØÙÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞÞßßàààááââãääåååæäâáàßßßÞÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛtsssssssssstttttttuuuvwxxxxxyyyyyyzzzz{{{{{{{||{{{{{{{{{{{{{{{{|}~~~}|||||}}~~€€€€€‚„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’’’“””•••••••–—˜™™™™™™ššš››œŸ ¢¢¢¢¢¢££££££¤£¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨¨©©ª«­®¯±²²³³´´´´µ¶·¹¹¹¹ºº»»¼½½¾¾¾¿ÁÁÁÂÂÂÃÄÅÆÇÈÉÉÊËÍÏÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÒÒÒÒÒÒÑÑÑÑÑÒÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÕÖÖ×ÙÚÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßßßààááââããäääãáàßßßßÝÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛssssssssssstttttttuuvvxxxxxxxyyyyyzzzzz{{{{{{{{{{{z{z{{{{{{{{{|}~~~}|{{{{{|||}~€€€€€‚„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘’’“”””•••••••–—˜™™™™™™ššš››œž ¢¢¢¢¢££££££££££¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦§¨¨¨¨¨¨©©ª«­®¯°²²³³´´´´µµ·¹¹¹¹ºº»»¼½½¾¾¿ÀÁÁÁÂÂÃÃÄÆÆÇÉÊÌÌÍÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÔÔÕÕÖ×ØÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßßààààáâââââááàßßßÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚssssssssssstttttttuuvwxxxxxxxyyyyyyyzzzzzz{{{{{{{{zzzz{{{{{{|||}~~~||{{{{{{||}}~€€€€€‚„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘‘’“””•••••••––—˜™™™™™ššššš›œž ¢¢¢¢££££££££££¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦¦¨¨¨¨¨¨©©©ª«­®¯¯±²²³´´´´µµ·¹¹¹¹º»»»¼½½¾¾¿ÀÁÁÁÂÂÃÄÅÆÆÈÊÌÍÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÕÕÖ×ÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÝÝÞßßßßßààáââáááàßßßßÞÝÜÜÛÛÛÛÛÛÛÛÚÚÛÛÛÚÚÚÚÚÙsssssssssssttttttuuuvwxxxxxxxxyyyyyyyzzzzzzzz{{{{{{z{{{{{{{||||}~~}}|{{{{{{|||}~€€€€‚„‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒ‘‘’“””••••••––—˜˜™™™™™™™šššš›ž ¢¢¢¢£££££££££¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦§¨¨¨¨¨¨©©©ª«­®®¯°²²³³´´´µµ·¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÂÃÃÅÆÆÇÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÕÕÖÖØÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßßßààááááààßßßÞÝÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÙØØØsssssssssssttttttuuuvwxxxxxxxxxxyyyyyyzzzzzz{{{{{{{{{{{{{{||||}}~~}||{{{{{|||}~€€€€‚„‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘’“””••••••–—˜˜™™™™™™™™™šš›œž¡¢¢¢££££££££££¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦¦§¨¨¨¨¨©©©ª«¬­®®¯°²²³³´´´µ¶·¹¹¹ºº»»¼½½¾¾¿ÀÁÁÁÁÂÃÄÅÆÇÈËÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÑÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÒÒÓÒÓÓÓÓÓÓÔÔÔÕÕÖ×ÙÚÛÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞßßßßßààààààßßßÞÝÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÙØØØ×ssssssssssttttttuuuvwxxxxxxxxxxxyyyyyyzzzzzz{{{{{{{{{{{{{|||||}~}|||||||||}}}}€€€‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽ‘‘’““”••••••–—˜™™™™™™™™™ššš›œŸ¡¢¢¢££££££££££¤¤¤¤¤¤¤¤¤¤¤¥¦¦¦§¨¨¨¨¨¨©©ªª«¬­®®¯°²²²³´´´´¶¸¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÁÂÃÄÅÆÇÉÌÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÒÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÔÔÕÕÖ×ØÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÞÞßßßßàààààßßÞÝÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚÙÙØØØ××Össsssssssstttttttuuvwxxxxxxxxxxxxyyyyyzzzzzz{{{{{{{{{{||||||}}}~}||||||}}}}}}~€€€‚„…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽŽŽ‘‘’““”•••••–—˜˜™™™™™™šššš››œž ¢¢¢¢££££££££££¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨©©©ª¬­­®®¯°²²²³´´´´µ·¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÁÂÃÄÅÆÇÉÊÍÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÕÖÖ×ØÙÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÞÞßßßßßßßÞÝÜÜÜÜÛÛÛÛÛÛÛÛÚÚÚÚÚØØ××××ÖÖssssssssssttttttuuuvxxxxxxxxxxxxxxyyyyzzzzzz{{{{{{{{{|||||||}}~~~}}|}}}}~~~~~~€€‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŽ‘‘’“””••••––—˜˜™™™™™™™ššš›œŸ¡¢¢¢£££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨©©ªª¬­­®®¯°²²³³´´´´µ¶¸¹¹º»»¼½½¾¾¿¿ÀÁÁÁÁÂÃÄÆÆÇÈÊÌÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÕÕÕÖ×ØÙÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÝÝÞßßßÞÞÞÝÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØ××××ÖÖÖssssssssttttttttuuuvxxxxxxxxxxxxxxyyyyzzzzz{{{{{{{{{||}~}}}}}}~~~~}}~~~€€‚„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘‘’“””••••–——˜˜˜™™™™™™šš››œž ¢¢¢¢££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦¨¨¨¨¨©©ªª«¬­®®¯°±²²³³´´´´µ¶¸¹¹º»»¼½½¾¾¾¿ÀÁÁÁÁÂÃÄÆÆÇÈÉÌÏÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÒÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÕÖ×ØÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÞÞÞÝÝÝÝÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØ×××ÖÖÖÖssssssssttttttttuuuvxxxxxxxxxxxxxyyyyyzzzz{{{{{{{{{|}}~~}}}}}~€€€€ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘’“”•••••–—˜˜˜˜™™™™™™šš››œž ¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¦¦§¨¨¨¨¨©ªª¬­®®¯°±²²³³´´´´´µ¶¸¹¹º»»¼½½¾¾¾¿ÀÁÁÁÁÂÃÅÆÆÇÈÉËÏÐÐÐÐÐÐÐÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÒÒÒÒÒÒÒÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÑÑÒÒÒÒÒÒÒÓÒÒÓÓÓÓÔÔÔÔÔÔÕÕÕÕÖ×ÙÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÝÝÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØØ××ÖÖÖÖsssstssttttttttuuuvwxxxxxxxxxxyyyyyyyyzzz{{{{{{{{{||}~~~~~€€€€€€€‚ƒ†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽ‘‘’’“”•••••–—˜˜˜™™™™™™™šš›œŸ¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦¨¨¨¨¨©ª«­®®®¯°²²²³³´´´´µµ·¹¹¹º»»¼½½¾¾¾¿ÀÁÁÁÂÂÃÅÆÆÇÈÉÌÎÐÐÐÐÐÐÐÑÑÑÒÒÒÒÒÓÒÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÓÓÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÌÌÍÍÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÓÓÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÖ×ÙÚÚÚÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÝÝÝÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙÙØØ×ÖÖÖÖssssttttttttttttuvwwxxxxxxxxxyyyyyyyyzzzz{{{|{|||||}€€€€€€€€€€€€‚„‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘’“””•••••–—˜˜˜™™™™™™ššš›œŸ¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦§¨¨¨¨©©ª¬­®¯°±²²³³³´´´´µ¶·¹¹¹º»»¼½½¾¾¾¿ÀÁÁÁÂÃÄÅÆÆÇÈÉÌÏÐÐÐÐÐÐÐÑÑÑÒÒÒÒÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÒÒÒÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËËÌÌÌÍÌÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÑÑÒÒÒÒÒÒÓÓÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÖ×ÙÙÚÙÙÙÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙÙ××××ÖÖÖssstttttttttttttuuwwxxxxxxxxxyyyyyyyyzzz{{|||||}}}}€€€€€€€€€€€€€€€€€‚ƒ…‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽ‘‘’’“”•••••–——˜˜˜˜™™™™ššš›œŸ¢¢¢¢¢¢¢¢¢¢££££¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦¦§¨¨¨¨©©ª«­®¯°±²²³³³´´´´µ¶·¹¹¹º»»½½½¾¾¾¿¿ÁÁÁÂÂÃÄÅÆÆÇÉËÏÐÐÐÐÐÐÐÑÑÑÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÑÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍËËÊÊÊËÌËÊÊÊËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÑÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÕÕÖ×ØØØØØÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÙØØ××ÖÖÖÖÕtssttttttttttttttuvxxxxxxxxxyyyyyyyyzzz{{|||}}}}~€€€€€€€€€€€€€€€€€€€€€‚„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽ‘‘‘’’”•••••–––——˜˜˜™™™ššš››Ÿ¢¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦¦§¨¨¨¨¨©©ª¬­®¯±²²³³³´´´´µ¶·¹¹¹º»»½½½¾¾¾¾¿ÁÁÁÂÂÃÃÅÆÆÇÈÊÎÐÐÐÐÐÐÐÑÑÑÑÒÒÒÓÓÓÒÓÓÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÏÎÏÏÐÏÏÐÐÐÐÐÐÐÐÐÐÐÎÍÌËËÊÊÉÊÊÊÉÈÈÈÉÊËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÖÖ×ØØØÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙØØ××ÖÖÖÖÕsstttttttttttttttuvwxxxxxxxxyyyyyyzzzz{{||}}~~~€€€€€€€€€€€€€€€€€€€€€‚‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽ‘‘’’’“••••••–––——˜˜™™™ššš››Ÿ¢¢¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¥¥¥¥¥¦¦§¨¨¨¨¨¨©©ª«­®®°²²³³³´´´´µ¶·¸¹¹º»»¼½½¾¾¾¾¿ÁÁÁÁÂÂÃÅÆÆÇÈÊÎÐÐÐÐÐÐÐÑÑÑÑÒÒÒÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÍÍÍÌÍÍÍÍÏÐÐÐÐÏÐÐÐÎÍÌËÊÉÉÉÊÊÊÉÈÇÇÇÈÉÉÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÖÖ×××ØØÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÙÙØØ×ÖÖÖÕÕÕsssttttttttttttttuuvxxxxxxxxyyyyyzzzzz{||}}~€€€€€€€€€€€€€€€€€€€€€€€€€‚‚ƒ…†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽ‘‘’’“”•••••••––——˜˜™™™šššš›Ÿ¢¢¢¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¥¥¥¥¦¦§¨¨¨¨¨¨¨¨©©ª¬­®°²²³³´´´´µµ¶·¹¹¹º»»¼½½¾¾¾¾¿ÀÁÁÁÂÂÃÅÆÆÇÈÊÎÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÎÎÎÎÏÐÏÎÍÌÌÌËËËËËËËÍÏÐÎÍÍÎÍÍÍÌËÊÉÈÈÉÉÉÈÈÇÇÇÇÇÈÈÉÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÕÕÕÖÖÖÖ××ØÙÙÙÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÙØØÙØØØ××ÖÖÕÕÕÕsssttttttttttttttuuwxxxxxxxyyyyzzzzzz{|}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ„†‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘’’““”•••••••––——˜˜™™™ššš›› ¢¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¥¦¦§§¨¨¨¨¨¨¨¨©©©ª¬­®°²²³³´´´´µµ¶·¹¹¹º»»¼½½¾¾¾¿¿ÁÁÁÁÂÃÄÅÆÆÇÉËÏÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÍÍÍÌÌÌÎÎÌËËËÊÉÊÊÊËËËÍÎÍÌÌÌÌÌËËËÊÊÉÈÈÉÉÉÈÇÇÆÆÇÇÇÇÈËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖ××ØØÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙÙØ×××××ØØ×ÖÖÕÕÕÕsssssttttstttttttuvxxxxxxxyyyyzzzzz{{|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ…ˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘‘’’“””••••••••––—˜˜˜™™™šššš›Ÿ¡¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨¨¨¨¨¨¨¨©ª«­®®°²²³³´´´´µµ¶¸¹¹¹º»»¼½½½¾¾¿ÀÁÁÁÁÂÃÄÆÆÆÇÊÌÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÌÌÌËËËÌÌÌÊÉÉÈÈÉÉÉÊÊËÍÌËËÊËËÊÊÊÉÉÉÉÈÈÉÉÉÈÇÆÆÆÆÇÇÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖÖ××ØÙÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÙØ××ÖÖÖ×Ö×××ÖÖÕÕÕÕsssssssssssssttttuvxxxxxxyyyyyzzz{{{|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ„‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘‘’’“””•••••••••–——˜™™™™šššš›œž ¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¥¥¦§§¨¨¨¨¨¨¨¨¨¨¨©ªª¬­®¯°²²³´´´´µµ¶¸¹¹¹º»»»¼½½¾¾¿ÀÁÁÁÂÂÃÄÅÆÇÈÉÌÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÍÍÌËËÊÊÊÊÉÉÈÈÈÈÈÉÉÉËËËËÊÉÉÊÉÉÉÉÈÈÈÉÉÈÈÉÈÇÇÇÆÆÆÆÆÇÇÉÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖØØÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÙÙØ×ÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕsssssssssssssstttuvxxxxxxyyyyzzzz{{||}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒ„…‰‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘‘‘’’“””••••••••–––—˜™™™™™ššš›œžŸ¢¢¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¥¥¦¦§§¨¨¨¨¨¨¨¨¨©©ªª«¬®®¯±²³³´´´µµ·¹¹¹ºº»»»¼½½¾¾¿ÀÁÁÁÂÂÃÄÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÌËÊÉÊÊÊÉÈÈÇÇÇÈÈÉÉÊÊÊÊÉÈÈÈÈÈÈÈÇÇÇÇÈÉÉÉÈÇÇÆÆÆÆÆÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÖÖ×ØØÚÚÚÚÚÚÚÚÛÚÚÚÛÚÚÛÛÛÚÚÙØØ×ÖÖÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕsssssssssssssstttuvxxxxxxyyyyzzzz{{|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ„…†ˆ‰Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽ‘‘‘‘’““””••••••••–––—˜™™™™™šš››Ÿ¡¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¦¦¦§¨¨¨¨¨¨¨¨¨©©ªª«¬­®¯±²³³´´´µ¶·¹¹¹ºº»»¼¼½½¾¾¿ÀÁÁÁÂÃÄÅÆÆÇÈËÎÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÌÌËÊÊÊÊÊÉÈÇÇÇÇÈÈÉÊÊÊÊÈÈÈÈÇÇÇÇÇÇÇÇÇÇÈÉÉÈÇÇÆÆÆÆÆÆÆÇÈÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÒÓÓÓÓÓÔÔÔÔÕÕÖÖ×ØÙÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÛÚÚÙØ×ÖÖÖÕÕÕÔÔÕÕÕÕÕÖÕÕÕÕÔrrrrsssssssssstttuvxxxxxxyyyzzzz{{{|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ„†‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘‘‘’““”•••••••••––——˜™™™™™šš››Ÿ ¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¦¦§§¨¨¨¨¨¨¨¨©©©ªª«¬­®¯±²³³´´´µ¶·¹¹¹º»»»¼½½½¾¾¿ÀÁÁÁÂÃÄÆÆÆÇÉÌÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÊËËËÊÊÊÉÈÈÇÇÇÇÈÈÉÊÊÊÉÈÇÇÇÆÆÇÇÇÇÆÆÇÇÇÈÈÈÇÇÇÇÆÆÆÆÆÇÇÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÓÒÒÒÒÒÒÒÑÑÑÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÖ××ØÙÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÙØ××ÖÖÖÕÕÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔqrrrsssssssssstttuvxxxxxyyyyzzzz{{||}~€€€€€€€€€€€€€€€€€€€€€€€€‚‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽ‘‘‘’“””•••••••••–——˜˜™™™™ššš›œžŸ ¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨¨¨©©ªª««¬­®¯²²³³´´´µ·¸¹¹¹º»»»¼½½¾¾¾¿ÀÁÁÁÃÄÅÆÆÇÈÊÏÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÓÓÓÓÓÔÔÔÓÓÓÓÓÔÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎËÊÊÊÊËÌËÊÉÉÈÇÇÇÇÇÈÈÉÊÊÉÈÇÇÆÆÆÆÆÆÆÆÆÆÆÇÇÇÈÈÈÇÇÇÇÇÆÆÆÆÇÈÊÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÔÔÔÕÖ×ØØÚÚÚÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚØ××ÖÖÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓqrrrssrssssssstttuvwxxxxyyyzzzzz{{|}}~€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚ƒ…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽ‘‘‘‘’“””••••••••––—˜˜™™™™ššš››Ÿ ¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¦¦§¨¨¨¨¨¨¨©©©©ª««¬­®¯°²³³´´´µ¶·¹¹¹ºº»»»¼½½¾¾¾¿ÁÁÁÂÂÄÆÆÆÇÉÌÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÓÓÓÓÓÔÔÔÔÓÓÔÔÔÔÓÓÓÓÓÓÓÒÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍËÊÊÊÊËËÌËÉÉÈÇÇÇÇÇÈÈÉÊÊÉÈÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÇÇÇÇÇÇÆÆÆÇÈÉËÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕ×ØÙÚÚÙØÙÙÚÚÚÚÚÚÚÚÚÚÙØ×ÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓqqrrrrrrrssssstttuuvxxxxyyyzzzzz{{{|}~€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚ƒƒƒƒ…‡ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒ‘‘‘’’“”••••••––––—˜™™™™™šš››œŸ¡¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨¨©©©ªª«¬­®®¯°²³³´´´µµ·¸¹¹¹º»»»¼½½¾¾¿¿ÁÁÁÂÂÄÆÆÇÈÊÌÍÎÎÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÊÉÉÊÊÊËÊÊÉÉÈÇÇÇÇÇÇÈÉÉÉÈÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÇÇÆÆÆÇÇÆÆÇÈÈÉËÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÕÕÖØÙÙÙØØØØØÙÚÚÚÚÚÚÙÙ××ÖÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÔÓÓÓÓÓÓqqqqqqqrrssssttttuuvxxxxyyyzzzzzzzz{|}~€€€€€€€€€€€€€€€‚‚‚‚‚ƒ„„…†‡Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒ‘‘‘’““”•••••––––—˜™™™™ššš›œœŸ¡¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©©ªª«¬­­®®¯±²³³´´´´µ·¸¹¹¹º»»»¼½¾¾¾¿ÀÁÁÁÂÂÃÅÆÇÉÉÊÊËÌÍÐÐÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËÉÉÉÉÉÉÉÉÉÉÈÇÇÆÇÇÇÇÈÉÈÈÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÇÆÆÆÇÇÇÇÇÇÇÈÊÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÓÔÔÕÖ×ÙØØ×××ØØØÙÙÙÙÙÙØ×ÖÖÕÕÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÒÒÒqqqqqqqqrrsssttttuuwxxxxyyyzzzzzzzz{{|}€€€€€€€€€€€€€€€€‚‚‚‚ƒ…†‡ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒ‘‘’’“”•••••–––—˜˜™™™™ššš›œœŸ ¢¢¢¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©©ªª«¬­­®®¯°²²³³´´´µµ·¹¹¹¹º»»»¼½½¾¿¿ÀÁÁÁÂÂÃÅÆÇÇÈÈÉÉÊËÍÐÐÐÐÐÐÐÐÐÐÑÑÑÒÒÒÒÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËÊÉÈÈÈÈÈÈÈÈÈÇÆÆÆÆÆÆÇÈÈÈÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÆÆÆÆÆÆÆÆÇÇÇÉÊÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÕÖÖ×××ÖÖ××ØØØÙÙÙØØ×ÖÖÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒqqqqqqqqrrsssttttuvwxxxxyyyyzzzzzzzz{{|~~€€€€€€€€€€€€€‚‚‚ƒ„†ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒ‘‘’’“””••••–——˜˜™™™™™šššš›œœžŸ ¡¢¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨©©©ªª«¬­­­®¯°²²²³³´´´µ¶·¸¹¹¹ºº»»¼½½¾¿ÀÀÁÁÁÁÂÃÅÆÆÆÇÇÇÈÉÊËÎÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÎÌËÊÊÉÈÇÇÇÇÇÇÇÇÇÇÆÆÆÆÆÆÆÇÇÆÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÅÆÆÆÆÇÆÆÆÆÆÆÆÆÆÆÇÇÈÊÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÑÑÑÑÑÑÑÑÑÑÑÑÒÒÓÓÓÓÓÔÔÕÕÖÖÖÖÖÖÖÖ×ØØÙØØ×ÖÖÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÑÑÑqqqqqqqqrssstttttuvwxxxxxyyyyyyzzzzz{{{}~~€€€€€€€‚‚ƒ„…ˆŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŽ‘‘’’“””••••––—˜˜˜™™™™™šššš››œžŸ¡¢¢¢¢¢¢£££££££££¤¤¤¤¤¤¤¥¥¦¦¨¨¨¨¨©ªª««¬­­®®®¯²²³³³´´´´µ¶·¹¹¹¹ºº»»¼½¾¾¿ÀÁÁÁÁÁÂÃÄÅÆÆÆÆÇÈÉÉËÍÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËÊÉÉÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÆÆÆÆÆÆÆÅÅÅÆÆÆÆÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÈÊÌÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖ××ØØØ×ÖÖÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑppqqqqqqrssttttttuvxxxxxyyyyyyyyzzzzz{{|}~~€€€€€€€€‚ƒ„…ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŽ‘‘’““”•••••–——˜˜™™™™™™ššššš››žŸ¡¢¢¢¢¢¢££££££££¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨¨©©««¬­­®®®¯°²³³³³´´´µµ¶¸¹¹¹ºº»»¼½½¾¾¿ÀÁÁÁÁÁÂÂÃÄÅÆÆÆÇÈÈÉËÌÏÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÔÔÓÓÓÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËÊÉÉÈÇÆÆÆÆÆÆÆÆÆÆÆÆÅÅÅÆÆÆÆÆÆÇÇÆÆÆÆÆÆÅÅÅÅÆÆÆÆÆÆÆÆÆÆÇÇÆÆÆÆÆÆÆÇÇÇÈÉÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖ×ÖÖÕÕÕÔÔÔÔÔÓÓÓÓÓÓÒÒÒÓÓÓÒÒÒÑÑÑÑÑÑÑppppqqqrssstttttuuwxxxxxxyyyyyyyyzzzzz{{|}}~~€€€€€€€‚ƒ„…‡‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘’’’“”••••––——˜˜™™™™™™™ššššš›œŸ ¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©ª¬­­®®®¯°²²³³³´´´´µ¶·¹¹¹¹ºº»»¼½½¾¾¿ÀÁÁÁÁÁÁÂÃÄÄÅÆÆÇÇÈÈÊÌÍÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÓÓÓÓÓÓÓÓÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÎÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÍÌÌËÊÊÈÇÇÆÆÆÆÆÆÅÆÆÆÅÅÄÄÄÅÆÆÆÆÆÆÆÆÆÆÆÆÆÅÅÅÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÑÑÑÑÑÐÐÐppppqqqrsstttttttuvxxxxxxxxyyyyyyzzzzzz{{||}}~~~€€€€€€€‚ƒ„†ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒ‘’’“”•••••––—˜˜™™™™™™™™™šššš›œžŸ¡¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨¨©©ª¬­®®®¯°±²²³³³´´´µµ¶¸¹¹¹¹º»»»¼½½¾¾¿ÀÁÁÁÁÁÁÂÂÃÄÅÆÆÆÇÇÈÉËÌÏÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÓÒÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÍÎÎÏÐÐÐÐÐÐÐÐÐÐÐÏÍÌËËÊÉÈÇÆÆÆÆÅÅÄÄÄÅÅÄÄÄÄÄÄÅÅÆÆÆÆÆÆÆÆÆÆÆÅÅÅÅÅÆÆÆÆÆÆÆÆÆÆÇÆÆÆÆÆÆÆÆÇÇÈÈÉËÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐppppqqrssstttttttuuwxxxxxxxxyyyyyyzzzzz{{{||}}~~€€€€€€‚‚ƒ…‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘‘’““”••••–––—˜˜™™™™™™™™™™ššš›œœž  ¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¤¤¥¦§¨¨¨¨¨©©ª«¬­®®¯¯°²²³³³´´´´µ¶·¹¹¹¹ºº»»¼½½½¾¾ÀÀÀÁÁÁÁÁÂÂÃÄÅÆÆÆÇÈÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÒÒÒÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÐÏÏÏÎÍÍÍÍÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÍÍÎÎÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÌËÊÉÈÇÇÆÆÅÄÄÄÄÄÄÃÃÃÃÃÃÄÅÄÅÅÆÆÆÆÆÆÆÆÆÆÅÅÅÅÆÆÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÇÇÈÉËÌÌÎÎÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐpppqqqrsssssstttttuwxxxxxxxxxyyyyyyzzzzz{{{|}}}}~~€€€€€€‚ƒ…‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŽ‘‘’“””••••––––—˜˜™™™™™™™™™™šš››œžŸ ¢¢¢¢¢¢¢££££¤¤¤¤¤¤¤¤¤¥¥¦¨¨¨¨¨©©©ª«­­®¯¯°±²²³³³´´´´µ·¸¹¹¹ººº»»¼½½¾¾¿¿ÀÁÁÁÁÁÁÂÂÃÄÅÆÆÆÇÈÉÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÎÍÍÌÌÌÌÌÍÍÏÐÐÏÎÎÎÏÐÐÐÐÐÐÏÎÎÍÍÍÏÐÐÐÐÐÐÐÐÐÐÐÏÍÌËËÊÈÈÇÆÆÆÅÄÄÄÄÄÃÃÃÃÃÃÃÄÄÄÄÄÅÆÆÆÆÆÆÆÆÆÆÆÅÆÆÆÅÅÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÉÊÊËÌÍÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÒÒÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐppqqqrsssssssttttuvxxxxxxxxxxxyyyyyzzzzz{{{||}}}}~€€€€€‚ƒ„†Š‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŽ‘‘’“””•••••––———˜™™™™™™™™™™ššš››œŸ ¡¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¥¥¥¦§¨¨¨¨©©©ª«¬­®®¯°±²²²³³³´´´µµ·¸¹¹ººº»»»½½¾¾¾¾¿¿ÁÁÁÁÁÂÂÂÃÅÆÆÆÇÇÈÉËÌÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÎÍÌËÌÌÌÌÍÍÎÏÐÏÎÎÍÎÏÐÐÐÐÏÎÎÍÌÌÌÎÏÐÐÐÐÐÐÐÐÐÐÏÎÍÌËÊÉÈÇÆÆÆÅÄÄÄÄÄÃÃÃÃÃÃÃÃÄÄÄÄÅÅÆÆÆÆÆÆÆÆÆÆÆÆÆÅÅÅÄÅÆÆÅÆÆÆÆÆÆÆÆÆÆÆÇÇÈÉÊÊÊËÌÍÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÐÐÑÑÑÐÐÐÐÐÐpqqqrssssssssstttuvwxxxxxxxxxxxyyyyyzzzz{{{{{|}}~~€€€€€‚ƒ„†‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽ‘‘‘‘‘‘’“””•••••––——˜˜˜™™™™™™™šššššš›œžŸ¢¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¥¥¦¦¨¨¨¨¨©©©©ª¬­®®¯°±²²²²³³´´´´µ¶¸¹¹¹ºº»»»¼½½¾¾¾¾¿¿ÁÁÁÁÁÂÂÃÄÅÆÆÆÇÇÈÉËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÍÌÌËËËÌÌÌÍÍÎÏÎÎÎÎÍÎÏÐÐÐÏÎÎÍÌËËÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÏÏÌÊÈÇÇÆÆÆÅÄÄÄÄÄÃÃÃÃÃÃÃÃÄÄÄÄÄÅÆÆÅÅÅÆÆÆÆÆÆÆÆÅÄÄÄÄÅÆÅÆÆÆÆÆÆÆÆÆÆÆÇÇÈÉÉÊÊËÌÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐpqqrrsssssssssstttuvvwxxxxxxxxxyyyyyyzzzzz{{{{|}~~~~€€€€‚‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘‘‘‘’“”””••••––——˜˜˜™™™™™™™™ššššš››œžŸ ¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¥¥¦§¨¨¨¨¨©©©ªª¬­®¯°°±²²²³³³´´´´µ¶¸¹¹¹º»»»¼½½½¾¾¾¾¾¿ÀÁÁÁÁÂÂÃÃÄÅÆÆÇÇÈÉÊÌÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÌËÊÊÊËËÌÌÌÌÍÌÍÍÍÍÍÏÐÐÏÎÍÌÌËÊËÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÌÉÈÇÆÆÆÅÄÄÄÃÃÃÃÃÃÃÃÃÃÄÄÄÄÄÅÅÄÄÅÄÄÅÆÆÆÆÆÆÅÄÄÄÄÄÄÅÅÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÉÊÊËËËÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÒÑÑÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÓÓÓÓÒÒÒÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐqqqrrrrrrrssssstttuuuvwxxxxxxxxxyyyyyyzzzzz{{{|}}~~~~~€€€‚ƒ…ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽ‘‘’’’“”””•••••–—˜˜˜˜˜™™™™™™™™šššš››œžŸ ¡¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¥¦§¨¨¨¨¨¨©©©ª«¬®¯¯°°±²²³³³³´´´µ¶·¹¹¹¹º»»»¼½½½¾¾¾¾¿¿ÀÁÁÁÁÁÂÂÃÃÄÅÆÆÇÇÈÊËÍÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÎÍÌËÊÊÊÊÊÊÊÊÊËËÌËËÌÍÍÍÎÎÎÍÌÍÌÌËÊÊÌÍÍÏÐÐÐÐÐÐÐÐÐÐÐÐÎËÉÇÆÆÆÅÅÄÄÃÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÃÄÃÄÄÄÅÆÆÆÆÆÅÅÄÃÃÃÃÄÄÅÅÆÆÆÆÆÆÆÆÆÆÆÇÇÇÈÉÊÊÊËËÌÎÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÓÓÓÓÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐqqqrrrqqrrsssstttttttuuwxxxxxxxxxyyyyyyzzzzz{{||}~~~~~~~~€€‚ƒ„ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘‘‘’““””••••••–—˜˜˜˜˜˜˜™™™™™™ššš›››œžŸ  ¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¤¥¥§¨¨¨¨¨¨©©©©ª«­®¯°°±²²²³³³´´´´µ·¹¹¹¹¹ºº»»¼½½½¾¾¾¾¿¿ÀÁÁÁÁÁÂÂÂÂÃÄÅÆÆÇÈÉÊÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌËËÊÉÉÊÉÉÉÉÉÉÊÊËËËÌÌÌÌÌÌËËËÌÌËÊÊÊÌÌÎÏÐÐÐÐÐÐÐÐÐÐÐÐÍÊÈÇÆÆÆÆÅÅÄÄÄÄÃÃÃÃÃÃÄÄÄÄÄÄÃÃÃÃÃÃÄÄÅÆÆÆÅÅÄÄÃÃÃÃÃÃÄÄÅÆÆÆÆÆÆÆÆÆÆÆÆÇÇÈÈÉÊÊÊËÌÍÎÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐqqqqqqqqqrrsssssttttttuvxxxxxxxxxyyyyyyzzzzz{{{|}~~~~~~~}~}}~~€€‚ƒ„ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽ‘‘‘’’“””••••••–—˜˜˜˜˜˜˜˜™™™™™™šš››œœžŸŸ ¡¢¢¢¢¢¢¢£££££¤¤¤¤¤¤¥¥¥¦¨¨¨¨¨¨©©©©ª«­®¯°±²²²²³³³´´´µ¶·¹¹¹¹ººº»»»½½½¾¾¾¾¿ÀÁÁÁÁÁÁÁÂÂÂÂÃÄÅÆÆÇÈÉËÍÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÍÌÊÉÉÉÉÉÉÈÈÈÈÈÈÉÉÉÊÊÊÊÊËËÊÊÊÊËÊÊÊÊÊËÌÎÎÐÐÐÐÐÐÐÐÐÐÐÐËÉÈÇÆÆÆÆÆÅÄÄÄÄÃÃÃÃÃÃÄÄÄÄÃÃÃÃÃÃÂÃÃÄÅÅÅÄÄÃÃÃÃÃÃÃÃÃÃÃÄÅÅÆÆÆÆÆÆÆÆÆÆÇÇÇÈÈÉÊÊËÌÌÍÎÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ
\ No newline at end of file
diff --git a/plugins/impex/heightmap/tests/kis_heightmap_test.cpp b/plugins/impex/heightmap/tests/kis_heightmap_test.cpp
new file mode 100644
index 0000000000..a7134db277
--- /dev/null
+++ b/plugins/impex/heightmap/tests/kis_heightmap_test.cpp
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2017 Victor Wåhlström <victor.wahlstrom@initiali.se>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "kis_heightmap_test.h"
+
+#include <QTest>
+#include <QCoreApplication>
+
+#include "filestest.h"
+
+#ifndef FILES_DATA_DIR
+#error "FILES_DATA_DIR not set. A directory with the data used for testing the importing of files in krita"
+#endif
+
+
+void KisHeightmapTest::testFiles()
+{
+ TestUtil::testFiles(QString(FILES_DATA_DIR) + "/sources", QStringList());
+}
+QTEST_MAIN(KisHeightmapTest)
+
diff --git a/plugins/impex/heightmap/tests/kis_heightmap_test.h b/plugins/impex/heightmap/tests/kis_heightmap_test.h
new file mode 100644
index 0000000000..b22fa1d2ba
--- /dev/null
+++ b/plugins/impex/heightmap/tests/kis_heightmap_test.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2017 Victor Wåhlström <victor.wahlstrom@initiali.se>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _KIS_HEIGHTMAP_TEST_H_
+#define _KIS_HEIGHTMAP_TEST_H_
+
+#include <QtTest>
+
+class KisHeightmapTest : public QObject
+{
+ Q_OBJECT
+private Q_SLOTS:
+ void testFiles();
+};
+
+#endif // _KIS_HEIGHTMAP_TEST_H_
diff --git a/plugins/impex/jpeg/kis_jpeg_export.cc b/plugins/impex/jpeg/kis_jpeg_export.cc
index b03fb7983f..c6d74f926a 100644
--- a/plugins/impex/jpeg/kis_jpeg_export.cc
+++ b/plugins/impex/jpeg/kis_jpeg_export.cc
@@ -1,222 +1,223 @@
/*
* Copyright (c) 2005 Cyrille Berger <cberger@cberger.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "kis_jpeg_export.h"
#include <QCheckBox>
#include <QSlider>
#include <QColor>
#include <QString>
#include <QStringList>
#include <QApplication>
#include <QFileInfo>
#include <kpluginfactory.h>
#include <KoColorSpace.h>
#include <KoColorProfile.h>
#include <KoColorSpaceConstants.h>
#include <KoColorSpaceRegistry.h>
#include <KisImportExportManager.h>
#include <kis_slider_spin_box.h>
#include <KisDocument.h>
#include <kis_image.h>
#include <kis_group_layer.h>
#include <kis_paint_layer.h>
#include <kis_paint_device.h>
#include <kis_properties_configuration.h>
#include <kis_config.h>
#include <metadata/kis_meta_data_store.h>
#include <metadata/kis_meta_data_filter_registry_model.h>
#include <metadata/kis_exif_info_visitor.h>
#include <generator/kis_generator_layer.h>
#include <KisImportExportManager.h>
#include <KisExportCheckRegistry.h>
#include "kis_jpeg_converter.h"
class KisExternalLayer;
K_PLUGIN_FACTORY_WITH_JSON(KisJPEGExportFactory, "krita_jpeg_export.json", registerPlugin<KisJPEGExport>();)
KisJPEGExport::KisJPEGExport(QObject *parent, const QVariantList &) : KisImportExportFilter(parent)
{
}
KisJPEGExport::~KisJPEGExport()
{
}
KisImportExportFilter::ConversionStatus KisJPEGExport::convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration)
{
KisImageSP image = document->savingImage();
Q_CHECK_PTR(image);
// An extra option to pass to the config widget to set the state correctly, this isn't saved
const KoColorSpace* cs = image->projection()->colorSpace();
bool sRGB = cs->profile()->name().contains(QLatin1String("srgb"), Qt::CaseInsensitive);
configuration->setProperty("is_sRGB", sRGB);
KisJPEGOptions options;
options.progressive = configuration->getBool("progressive", false);
options.quality = configuration->getInt("quality", 80);
options.forceSRGB = configuration->getBool("forceSRGB", false);
options.saveProfile = configuration->getBool("saveProfile", true);
options.optimize = configuration->getBool("optimize", true);
options.smooth = configuration->getInt("smoothing", 0);
options.baseLineJPEG = configuration->getBool("baseline", true);
options.subsampling = configuration->getInt("subsampling", 0);
options.exif = configuration->getBool("exif", true);
options.iptc = configuration->getBool("iptc", true);
options.xmp = configuration->getBool("xmp", true);
- options.transparencyFillColor = configuration->getColor("transparencyFillcolor").toQColor();
+ QStringList rgb = configuration->getString("transparencyFillcolor", "255,255,255").split(',');
+ options.transparencyFillColor = QColor(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt());
KisMetaData::FilterRegistryModel m;
m.setEnabledFilters(configuration->getString("filters").split(","));
options.filters = m.enabledFilters();
KisPaintDeviceSP pd = new KisPaintDevice(*image->projection());
KisJPEGConverter kpc(document, batchMode());
KisPaintLayerSP l = new KisPaintLayer(image, "projection", OPACITY_OPAQUE_U8, pd);
KisExifInfoVisitor eIV;
eIV.visit(image->rootLayer().data());
KisMetaData::Store* eI = 0;
if (eIV.countPaintLayer() == 1) {
eI = eIV.exifInfo();
}
if (eI) {
KisMetaData::Store* copy = new KisMetaData::Store(*eI);
eI = copy;
}
KisImageBuilder_Result res = kpc.buildFile(io, l, options, eI);
if (res == KisImageBuilder_RESULT_OK) {
delete eI;
return KisImportExportFilter::OK;
}
delete eI;
dbgFile << " Result =" << res;
return KisImportExportFilter::InternalError;
}
KisPropertiesConfigurationSP KisJPEGExport::defaultConfiguration(const QByteArray &/*from*/, const QByteArray &/*to*/) const
{
KisPropertiesConfigurationSP cfg = new KisPropertiesConfiguration();
cfg->setProperty("progressive", false);
cfg->setProperty("quality", 80);
cfg->setProperty("forceSRGB", false);
cfg->setProperty("saveProfile", true);
cfg->setProperty("optimize", true);
cfg->setProperty("smoothing", 0);
cfg->setProperty("baseline", true);
cfg->setProperty("subsampling", 0);
cfg->setProperty("exif", true);
cfg->setProperty("iptc", true);
cfg->setProperty("xmp", true);
cfg->setProperty("transparencyFillcolor", QString("255,255,255"));
cfg->setProperty("filters", "");
return cfg;
}
KisConfigWidget *KisJPEGExport::createConfigurationWidget(QWidget *parent, const QByteArray &/*from*/, const QByteArray &/*to*/) const
{
return new KisWdgOptionsJPEG(parent);
}
void KisJPEGExport::initializeCapabilities()
{
addCapability(KisExportCheckRegistry::instance()->get("sRGBProfileCheck")->create(KisExportCheckBase::SUPPORTED));
addCapability(KisExportCheckRegistry::instance()->get("ExifCheck")->create(KisExportCheckBase::SUPPORTED));
QList<QPair<KoID, KoID> > supportedColorModels;
supportedColorModels << QPair<KoID, KoID>()
<< QPair<KoID, KoID>(RGBAColorModelID, Integer8BitsColorDepthID)
<< QPair<KoID, KoID>(GrayAColorModelID, Integer8BitsColorDepthID)
<< QPair<KoID, KoID>(CMYKAColorModelID, Integer8BitsColorDepthID);
addSupportedColorModels(supportedColorModels, "JPEG");
}
KisWdgOptionsJPEG::KisWdgOptionsJPEG(QWidget *parent)
: KisConfigWidget(parent)
{
setupUi(this);
metaDataFilters->setModel(&m_filterRegistryModel);
qualityLevel->setRange(0, 100, 0);
qualityLevel->setSuffix("%");
smoothLevel->setRange(0, 100, 0);
smoothLevel->setSuffix("%");
}
void KisWdgOptionsJPEG::setConfiguration(const KisPropertiesConfigurationSP cfg)
{
progressive->setChecked(cfg->getBool("progressive", false));
qualityLevel->setValue(cfg->getInt("quality", 80));
optimize->setChecked(cfg->getBool("optimize", true));
smoothLevel->setValue(cfg->getInt("smoothing", 0));
baseLineJPEG->setChecked(cfg->getBool("baseline", true));
subsampling->setCurrentIndex(cfg->getInt("subsampling", 0));
exif->setChecked(cfg->getBool("exif", true));
iptc->setChecked(cfg->getBool("iptc", true));
xmp->setChecked(cfg->getBool("xmp", true));
chkForceSRGB->setVisible(cfg->getBool("is_sRGB"));
chkForceSRGB->setChecked(cfg->getBool("forceSRGB", false));
chkSaveProfile->setChecked(cfg->getBool("saveProfile", true));
QStringList rgb = cfg->getString("transparencyFillcolor", "255,255,255").split(',');
KoColor background(KoColorSpaceRegistry::instance()->rgb8());
background.fromQColor(Qt::white);
bnTransparencyFillColor->setDefaultColor(background);
background.fromQColor(QColor(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt()));
bnTransparencyFillColor->setColor(background);
m_filterRegistryModel.setEnabledFilters(cfg->getString("filters").split(','));
}
KisPropertiesConfigurationSP KisWdgOptionsJPEG::configuration() const
{
KisPropertiesConfigurationSP cfg = new KisPropertiesConfiguration();
cfg->setProperty("progressive", progressive->isChecked());
cfg->setProperty("quality", (int)qualityLevel->value());
cfg->setProperty("forceSRGB", chkForceSRGB->isChecked());
cfg->setProperty("saveProfile", chkSaveProfile->isChecked());
cfg->setProperty("optimize", optimize->isChecked());
cfg->setProperty("smoothing", (int)smoothLevel->value());
cfg->setProperty("baseline", baseLineJPEG->isChecked());
cfg->setProperty("subsampling", subsampling->currentIndex());
cfg->setProperty("exif", exif->isChecked());
cfg->setProperty("iptc", iptc->isChecked());
cfg->setProperty("xmp", xmp->isChecked());
QColor c = bnTransparencyFillColor->color().toQColor();
cfg->setProperty("transparencyFillcolor", QString("%1,%2,%3").arg(c.red()).arg(c.green()).arg(c.blue()));
QString enabledFilters;
Q_FOREACH (const KisMetaData::Filter* filter, m_filterRegistryModel.enabledFilters()) {
enabledFilters = enabledFilters + filter->id() + ',';
}
cfg->setProperty("filters", enabledFilters);
return cfg;
}
#include <kis_jpeg_export.moc>
diff --git a/plugins/impex/png/kis_png_export.cc b/plugins/impex/png/kis_png_export.cc
index f942a39304..9914f51d93 100644
--- a/plugins/impex/png/kis_png_export.cc
+++ b/plugins/impex/png/kis_png_export.cc
@@ -1,224 +1,225 @@
/*
* Copyright (c) 2005 Cyrille Berger <cberger@cberger.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "kis_png_export.h"
#include <QCheckBox>
#include <QSlider>
#include <QApplication>
#include <kpluginfactory.h>
#include <KoColorSpace.h>
#include <KisImportExportManager.h>
#include <KoColorProfile.h>
#include <KoColorModelStandardIds.h>
#include <KoColorSpaceRegistry.h>
#include <KisExportCheckRegistry.h>
#include <kis_properties_configuration.h>
#include <kis_paint_device.h>
#include <KisDocument.h>
#include <kis_image.h>
#include <kis_paint_layer.h>
#include <kis_group_layer.h>
#include <kis_config.h>
#include <kis_properties_configuration.h>
#include <metadata/kis_meta_data_store.h>
#include <metadata/kis_meta_data_filter_registry_model.h>
#include <metadata/kis_exif_info_visitor.h>
#include "kis_png_converter.h"
#include <kis_iterator_ng.h>
K_PLUGIN_FACTORY_WITH_JSON(KisPNGExportFactory, "krita_png_export.json", registerPlugin<KisPNGExport>();)
KisPNGExport::KisPNGExport(QObject *parent, const QVariantList &) : KisImportExportFilter(parent)
{
}
KisPNGExport::~KisPNGExport()
{
}
bool hasVisibleWidgets()
{
QWidgetList wl = QApplication::allWidgets();
Q_FOREACH (QWidget* w, wl) {
if (w->isVisible() && strcmp(w->metaObject()->className(), "QDesktopWidget")) {
dbgFile << "Widget " << w << " " << w->objectName() << " " << w->metaObject()->className() << " is visible";
return true;
}
}
return false;
}
KisImportExportFilter::ConversionStatus KisPNGExport::convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration)
{
KisImageSP image = document->savingImage();
KisPNGOptions options;
options.alpha = configuration->getBool("alpha", true);
options.interlace = configuration->getBool("interlaced", false);
options.compression = configuration->getInt("compression", 3);
options.tryToSaveAsIndexed = configuration->getBool("indexed", false);
- options.transparencyFillColor = configuration->getColor("transparencyFillColor").toQColor();
+ QStringList rgb = configuration->getString("transparencyFillcolor", "255,255,255").split(',');
+ options.transparencyFillColor = QColor(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt());
options.saveSRGBProfile = configuration->getBool("saveSRGBProfile", false);
options.forceSRGB = configuration->getBool("forceSRGB", true);
vKisAnnotationSP_it beginIt = image->beginAnnotations();
vKisAnnotationSP_it endIt = image->endAnnotations();
KisExifInfoVisitor eIV;
eIV.visit(image->rootLayer().data());
KisMetaData::Store *eI = 0;
if (eIV.countPaintLayer() == 1) {
eI = eIV.exifInfo();
}
if (eI) {
KisMetaData::Store* copy = new KisMetaData::Store(*eI);
eI = copy;
}
KisPNGConverter pngConverter(document);
KisImageBuilder_Result res = pngConverter.buildFile(io, image->bounds(), image->xRes(), image->yRes(), image->projection(), beginIt, endIt, options, eI);
if (res == KisImageBuilder_RESULT_OK) {
delete eI;
return KisImportExportFilter::OK;
}
delete eI;
dbgFile << " Result =" << res;
return KisImportExportFilter::InternalError;
}
KisPropertiesConfigurationSP KisPNGExport::defaultConfiguration(const QByteArray &, const QByteArray &) const
{
KisPropertiesConfigurationSP cfg = new KisPropertiesConfiguration();
cfg->setProperty("alpha", true);
cfg->setProperty("indexed", false);
cfg->setProperty("compression", 3);
cfg->setProperty("interlaced", false);
cfg->setProperty("transparencyFillcolor", QString("255,255,255"));
cfg->setProperty("saveSRGBProfile", false);
cfg->setProperty("forceSRGB", true);
return cfg;
}
KisConfigWidget *KisPNGExport::createConfigurationWidget(QWidget *parent, const QByteArray &, const QByteArray &) const
{
return new KisWdgOptionsPNG(parent);
}
void KisPNGExport::initializeCapabilities()
{
addCapability(KisExportCheckRegistry::instance()->get("sRGBProfileCheck")->create(KisExportCheckBase::SUPPORTED));
QList<QPair<KoID, KoID> > supportedColorModels;
supportedColorModels << QPair<KoID, KoID>()
<< QPair<KoID, KoID>(RGBAColorModelID, Integer8BitsColorDepthID)
<< QPair<KoID, KoID>(RGBAColorModelID, Integer16BitsColorDepthID)
<< QPair<KoID, KoID>(GrayAColorModelID, Integer8BitsColorDepthID)
<< QPair<KoID, KoID>(GrayAColorModelID, Integer16BitsColorDepthID);
addSupportedColorModels(supportedColorModels, "PNG");
}
void KisWdgOptionsPNG::setConfiguration(const KisPropertiesConfigurationSP cfg)
{
// the export manager should have prepared some info for us!
KIS_SAFE_ASSERT_RECOVER_NOOP(cfg->hasProperty(KisImportExportFilter::ImageContainsTransparencyTag));
KIS_SAFE_ASSERT_RECOVER_NOOP(cfg->hasProperty(KisImportExportFilter::ColorModelIDTag));
KIS_SAFE_ASSERT_RECOVER_NOOP(cfg->hasProperty(KisImportExportFilter::sRGBTag));
const bool isThereAlpha = cfg->getBool(KisImportExportFilter::ImageContainsTransparencyTag);
- alpha->setChecked(cfg->getBool("alpha", isThereAlpha));
+ alpha->setChecked(cfg->getBool("alpha", isThereAlpha) && isThereAlpha);
+ alpha->setEnabled(isThereAlpha);
+
+ bnTransparencyFillColor->setEnabled(!alpha->isChecked());
if (cfg->getString(KisImportExportFilter::ColorModelIDTag) == RGBAColorModelID.id()) {
tryToSaveAsIndexed->setVisible(true);
if (alpha->isChecked()) {
tryToSaveAsIndexed->setChecked(false);
}
else {
tryToSaveAsIndexed->setChecked(cfg->getBool("indexed", false));
}
}
else {
tryToSaveAsIndexed->setVisible(false);
}
interlacing->setChecked(cfg->getBool("interlaced", false));
compressionLevel->setValue(cfg->getInt("compression", 3));
compressionLevel->setRange(1, 9 , 0);
- alpha->setEnabled(isThereAlpha);
tryToSaveAsIndexed->setVisible(!isThereAlpha);
- bnTransparencyFillColor->setEnabled(!alpha->isChecked());
-
const bool sRGB = cfg->getBool(KisImportExportFilter::sRGBTag, false);
chkSRGB->setEnabled(sRGB);
chkSRGB->setChecked(cfg->getBool("saveSRGBProfile", true));
chkForceSRGB->setEnabled(!sRGB);
chkForceSRGB->setChecked(cfg->getBool("forceSRGB", false));
- QStringList rgb = cfg->getString("transparencyFillcolor", "0,0,0").split(',');
+ QStringList rgb = cfg->getString("transparencyFillcolor", "255,255,255").split(',');
KoColor c(KoColorSpaceRegistry::instance()->rgb8());
c.fromQColor(Qt::white);
bnTransparencyFillColor->setDefaultColor(c);
c.fromQColor(QColor(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt()));
bnTransparencyFillColor->setColor(c);
}
KisPropertiesConfigurationSP KisWdgOptionsPNG::configuration() const
{
KisPropertiesConfigurationSP cfg(new KisPropertiesConfiguration());
bool alpha = this->alpha->isChecked();
bool interlace = interlacing->isChecked();
int compression = (int)compressionLevel->value();
bool tryToSaveAsIndexed = this->tryToSaveAsIndexed->isChecked();
QColor c = bnTransparencyFillColor->color().toQColor();
bool saveSRGB = chkSRGB->isChecked();
bool forceSRGB = chkForceSRGB->isChecked();
cfg->setProperty("alpha", alpha);
cfg->setProperty("indexed", tryToSaveAsIndexed);
cfg->setProperty("compression", compression);
cfg->setProperty("interlaced", interlace);
cfg->setProperty("transparencyFillcolor", QString("%1,%2,%3").arg(c.red()).arg(c.green()).arg(c.blue()));
cfg->setProperty("saveSRGBProfile", saveSRGB);
cfg->setProperty("forceSRGB", forceSRGB);
return cfg;
}
void KisWdgOptionsPNG::on_alpha_toggled(bool checked)
{
bnTransparencyFillColor->setEnabled(!checked);
}
#include "kis_png_export.moc"
diff --git a/plugins/impex/png/kis_wdg_options_png.ui b/plugins/impex/png/kis_wdg_options_png.ui
index 405c28ee77..a5405291d3 100644
--- a/plugins/impex/png/kis_wdg_options_png.ui
+++ b/plugins/impex/png/kis_wdg_options_png.ui
@@ -1,215 +1,215 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>KisWdgOptionsPNG</class>
<widget class="QWidget" name="KisWdgOptionsPNG">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>546</width>
<height>243</height>
</rect>
</property>
<property name="windowTitle">
<string>PNG Options</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QGridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="horizontalSpacing">
<number>0</number>
</property>
<property name="verticalSpacing">
<number>6</number>
</property>
<item row="5" column="1">
<widget class="QCheckBox" name="chkSRGB">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;PNG&lt;/span&gt; files have &lt;span style=&quot; font-style:italic;&quot;&gt;two&lt;/span&gt; options to save &lt;span style=&quot; font-weight:600;&quot;&gt;sRGB&lt;/span&gt; information: as a tag or as an explicit profile. For use with in websites, &lt;span style=&quot; font-style:italic;&quot;&gt;disable&lt;/span&gt; this option. For interchange with other applications, &lt;span style=&quot; font-style:italic;&quot;&gt;enable&lt;/span&gt; this option.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Embed sRGB profile</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="chkForceSRGB">
<property name="text">
<string>Force convert to sRGB</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="KisDoubleSliderSpinBox" name="compressionLevel" native="true">
<property name="toolTip">
<string>Note: the compression level does not change the quality of the result</string>
</property>
<property name="whatsThis">
<string>&lt;p&gt;Adjust the compression time. Better compression takes longer.
&lt;br&gt;Note: the compression level does not change the quality of the result.&lt;/p&gt;</string>
</property>
</widget>
</item>
<item row="1" column="0" rowspan="2">
<widget class="QLabel" name="textLabel1">
<property name="toolTip">
<string>Note: the compression level does not change the quality of the result</string>
</property>
<property name="whatsThis">
<string>&lt;p&gt;Adjust the compression time. Better compression takes longer.
&lt;br&gt;Note: the compression level does not change the quality of the result.&lt;/p&gt;</string>
</property>
<property name="text">
<string>Compression (Lossless): </string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="textLabel4_2">
<property name="whatsThis">
<string>&lt;p&gt;Adjust the compression time. Better compression takes longer.
&lt;br&gt;Note: the compression level does not change the quality of the result.&lt;/p&gt;</string>
</property>
<property name="text">
<string comment="The compression will take a long time; saving the file will be slow.">Small File Size</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="textLabel3">
<property name="whatsThis">
<string>&lt;p&gt;Adjust the compression time. Better compression takes longer.
&lt;br&gt;Note: the compression level does not change the quality of the result.&lt;/p&gt;</string>
</property>
<property name="text">
<string comment="The file will save fast but will not be compressed a lot">Large file size</string>
</property>
</widget>
</item>
<item row="4" column="1">
- <widget class="QCheckBox" name="alpha">
- <property name="toolTip">
- <string>Disable to get smaller files if your image has no transparency</string>
- </property>
- <property name="whatsThis">
- <string>&lt;p&gt;The Portable Network Graphics (PNG) file format allows transparency in your image to be stored by saving an alpha channel.
-You can uncheck the box if you are not using transparency and you want to make the resulting file smaller .&lt;br&gt;Always saving the alpha channel is recommended.&lt;/p&gt;</string>
- </property>
- <property name="text">
- <string>Store alpha channel (transparency)</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
<widget class="QCheckBox" name="interlacing">
<property name="toolTip">
<string>Use interlacing when publishing on the Internet.</string>
</property>
<property name="whatsThis">
<string>&lt;p&gt;Interlacing is useful if you intend to publish your image on the Internet.&lt;br&gt;
Enabling interlacing will cause the image to be displayed by the browser even while downloading.&lt;/p&gt;</string>
</property>
<property name="text">
<string>Interlacing</string>
</property>
</widget>
</item>
- <item row="7" column="1">
+ <item row="3" column="1">
<widget class="QCheckBox" name="tryToSaveAsIndexed">
<property name="toolTip">
<string>Indexed PNG images are smaller. If you enabled this option, your image will be analyzed to see whether it is possible to save as an indexed PNG.</string>
</property>
<property name="text">
<string>Save as indexed PNG, if possible</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
+ <item row="7" column="1">
+ <widget class="QCheckBox" name="alpha">
+ <property name="toolTip">
+ <string>Disable to get smaller files if your image has no transparency</string>
+ </property>
+ <property name="whatsThis">
+ <string>&lt;p&gt;The Portable Network Graphics (PNG) file format allows transparency in your image to be stored by saving an alpha channel.
+You can uncheck the box if you are not using transparency and you want to make the resulting file smaller .&lt;br&gt;Always saving the alpha channel is recommended.&lt;/p&gt;</string>
+ </property>
+ <property name="text">
+ <string>Store alpha channel (transparency)</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
<item row="8" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Transparent color: </string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="KisColorButton" name="bnTransparencyFillColor">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>50</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Background color to replace transparent pixels with.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="6" column="0">
<spacer>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>414</width>
<height>16</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KisDoubleSliderSpinBox</class>
<extends>QWidget</extends>
<header>kis_slider_spin_box.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>KisColorButton</class>
<extends>QPushButton</extends>
<header>kis_color_button.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
diff --git a/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp b/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp
index 2767b3634c..5ad5888b6b 100644
--- a/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp
+++ b/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp
@@ -1,295 +1,302 @@
/*
* Copyright (c) 2002 Patrick Julien <freak@codepimps.org>
* Copyright (c) 2004-2008 Boudewijn Rempt <boud@valdyas.org>
* Copyright (c) 2004 Clarence Dang <dang@kde.org>
* Copyright (c) 2004 Adrian Page <adrian@pagenet.plus.com>
* Copyright (c) 2004,2010 Cyrille Berger <cberger@cberger.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kis_duplicateop.h"
#include "kis_duplicateop_p.h"
#include <string.h>
#include <QRect>
#include <QWidget>
#include <QLayout>
#include <QLabel>
#include <QCheckBox>
#include <QDomElement>
#include <QHBoxLayout>
#include <QToolButton>
#include <kis_image.h>
#include <kis_debug.h>
#include <KoColorTransformation.h>
#include <KoColor.h>
#include <KoColorSpace.h>
#include <KoCompositeOpRegistry.h>
#include <KoColorSpaceRegistry.h>
#include <kis_brush.h>
#include <kis_datamanager.h>
#include <kis_global.h>
#include <kis_paint_device.h>
#include <kis_painter.h>
#include <brushengine/kis_paintop.h>
#include <kis_properties_configuration.h>
#include <kis_selection.h>
#include <kis_brush_option_widget.h>
#include <kis_paintop_settings_widget.h>
#include <kis_pressure_darken_option.h>
#include <kis_pressure_opacity_option.h>
#include <kis_paint_action_type_option.h>
#include <kis_random_sub_accessor.h>
#include <kis_fixed_paint_device.h>
#include <kis_iterator_ng.h>
#include <kis_spacing_information.h>
#include "kis_duplicateop_settings.h"
#include "kis_duplicateop_settings_widget.h"
#include "kis_duplicateop_option.h"
KisDuplicateOp::KisDuplicateOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image)
: KisBrushBasedPaintOp(settings, painter)
, m_image(image)
, m_node(node)
, m_settings(static_cast<KisDuplicateOpSettings*>(const_cast<KisPaintOpSettings*>(settings.data())))
{
Q_ASSERT(settings);
Q_ASSERT(painter);
m_sizeOption.readOptionSetting(settings);
m_rotationOption.readOptionSetting(settings);
+ m_opacityOption.readOptionSetting(settings);
m_sizeOption.resetAllSensors();
m_rotationOption.resetAllSensors();
+ m_opacityOption.resetAllSensors();
m_healing = settings->getBool(DUPLICATE_HEALING);
m_perspectiveCorrection = settings->getBool(DUPLICATE_CORRECT_PERSPECTIVE);
m_moveSourcePoint = settings->getBool(DUPLICATE_MOVE_SOURCE_POINT);
m_cloneFromProjection = settings->getBool(DUPLICATE_CLONE_FROM_PROJECTION);
m_srcdev = source()->createCompositionSourceDevice();
}
KisDuplicateOp::~KisDuplicateOp()
{
}
#define CLAMP(x,l,u) ((x)<(l)?(l):((x)>(u)?(u):(x)))
KisSpacingInformation KisDuplicateOp::paintAt(const KisPaintInformation& info)
{
if (!painter()->device()) return KisSpacingInformation(1.0);
KisBrushSP brush = m_brush;
if (!brush)
return KisSpacingInformation(1.0);
if (!brush->canPaintFor(info))
return KisSpacingInformation(1.0);
if (!m_duplicateStartIsSet) {
m_duplicateStartIsSet = true;
m_duplicateStart = info.pos();
}
KisPaintDeviceSP realSourceDevice;
if (m_cloneFromProjection && m_image) {
realSourceDevice = m_image->projection();
}
else {
KisNodeSP externalSourceNode = m_settings->sourceNode();
/**
* The saved layer might have been deleted by then, so check if it
* still belongs to a graph
*/
if (!externalSourceNode || !externalSourceNode->graphListener()) {
externalSourceNode = m_node;
}
realSourceDevice = externalSourceNode->projection();
}
qreal rotation = m_rotationOption.apply(info);
+ qreal opacity = m_opacityOption.apply(painter(),info);
+
qreal scale = m_sizeOption.apply(info);
+
if (checkSizeTooSmall(scale)) return KisSpacingInformation();
KisDabShape shape(scale, 1.0, rotation);
static const KoColorSpace *cs = KoColorSpaceRegistry::instance()->alpha8();
static KoColor color(Qt::black, cs);
QRect dstRect;
KisFixedPaintDeviceSP dab =
m_dabCache->fetchDab(cs, color, info.pos(),
shape,
info, 1.0,
&dstRect);
if (dstRect.isEmpty()) return KisSpacingInformation(1.0);
QPoint srcPoint;
if (m_moveSourcePoint) {
srcPoint = (dstRect.topLeft() - m_settings->offset()).toPoint();
}
else {
QPointF hotSpot = brush->hotSpot(shape, info);
srcPoint = (m_settings->position() - hotSpot).toPoint();
}
qint32 sw = dstRect.width();
qint32 sh = dstRect.height();
// Perspective correction ?
// if (m_perspectiveCorrection && m_image && m_image->perspectiveGrid()->countSubGrids() == 1) {
// Matrix3qreal startM = Matrix3qreal::Identity();
// Matrix3qreal endM = Matrix3qreal::Identity();
// // First look for the grid corresponding to the start point
// KisSubPerspectiveGrid* subGridStart = *m_image->perspectiveGrid()->begin();
// QRect r = QRect(0, 0, m_image->width(), m_image->height());
// if (subGridStart) {
// startM = KisPerspectiveMath::computeMatrixTransfoFromPerspective(r, *subGridStart->topLeft(), *subGridStart->topRight(), *subGridStart->bottomLeft(), *subGridStart->bottomRight());
// }
// // Second look for the grid corresponding to the end point
// KisSubPerspectiveGrid* subGridEnd = *m_image->perspectiveGrid()->begin();
// if (subGridEnd) {
// endM = KisPerspectiveMath::computeMatrixTransfoToPerspective(*subGridEnd->topLeft(), *subGridEnd->topRight(), *subGridEnd->bottomLeft(), *subGridEnd->bottomRight(), r);
// }
// // Compute the translation in the perspective transformation space:
// QPointF positionStartPaintingT = KisPerspectiveMath::matProd(endM, QPointF(m_duplicateStart));
// QPointF duplicateStartPositionT = KisPerspectiveMath::matProd(endM, QPointF(m_duplicateStart) - QPointF(m_settings->offset()));
// QPointF translat = duplicateStartPositionT - positionStartPaintingT;
// KisSequentialIterator dstIt(m_srcdev, QRect(0, 0, sw, sh));
// KisRandomSubAccessorSP srcAcc = realSourceDevice->createRandomSubAccessor();
// //Action
// do {
// QPointF p = KisPerspectiveMath::matProd(startM, KisPerspectiveMath::matProd(endM, QPointF(dstIt.x() + dstRect.x(), dstIt.y() + dstRect.y())) + translat);
// srcAcc->moveTo(p);
// srcAcc->sampledOldRawData(dstIt.rawData());
// } while (dstIt.nextPixel());
// }
// else
{
KisPainter copyPainter(m_srcdev);
copyPainter.setCompositeOp(COMPOSITE_COPY);
copyPainter.bitBltOldData(0, 0, realSourceDevice, srcPoint.x(), srcPoint.y(), sw, sh);
copyPainter.end();
}
// heal ?
if (m_healing) {
QRect healRect(dstRect);
const bool smallWidth = healRect.width() < 3;
const bool smallHeight = healRect.height() < 3;
if (smallWidth || smallHeight) {
healRect.adjust(-smallWidth, -smallHeight, smallWidth, smallHeight);
}
const int healSW = healRect.width();
const int healSH = healRect.height();
quint16 srcData[4];
quint16 tmpData[4];
QScopedArrayPointer<qreal> matrix(new qreal[ 3 * healSW * healSH ]);
// First divide
const KoColorSpace* srcCs = realSourceDevice->colorSpace();
const KoColorSpace* tmpCs = m_srcdev->colorSpace();
KisHLineConstIteratorSP srcIt = realSourceDevice->createHLineConstIteratorNG(healRect.x(), healRect.y() , healSW);
KisHLineIteratorSP tmpIt = m_srcdev->createHLineIteratorNG(0, 0, healSW);
qreal* matrixIt = matrix.data();
for (int j = 0; j < healSH; j++) {
for (int i = 0; i < healSW; i++) {
srcCs->toLabA16(srcIt->oldRawData(), (quint8*)srcData, 1);
tmpCs->toLabA16(tmpIt->rawData(), (quint8*)tmpData, 1);
// Division
for (int k = 0; k < 3; k++) {
matrixIt[k] = srcData[k] / (qreal)qMax((int)tmpData [k], 1);
}
srcIt->nextPixel();
tmpIt->nextPixel();
matrixIt += 3;
}
srcIt->nextRow();
tmpIt->nextRow();
}
// Minimize energy
{
int iter = 0;
qreal err;
QScopedArrayPointer<qreal> solution(new qreal[ 3 * healSW * healSH ]);
do {
err = DuplicateOpUtils::minimizeEnergy(matrix.data(), solution.data(), healSW, healSH);
solution.swap(matrix);
iter++;
} while (err > 0.00001 && iter < 100);
}
// Finally multiply
KisHLineIteratorSP tmpIt2 = m_srcdev->createHLineIteratorNG(0, 0, healSW);
matrixIt = &matrix[0];
for (int j = 0; j < healSH; j++) {
for (int i = 0; i < healSW; i++) {
tmpCs->toLabA16(tmpIt2->rawData(), (quint8*)tmpData, 1);
// Multiplication
for (int k = 0; k < 3; k++) {
tmpData[k] = (int)CLAMP(matrixIt[k] * qMax((int) tmpData[k], 1), 0, 65535);
}
tmpCs->fromLabA16((quint8*)tmpData, tmpIt2->rawData(), 1);
tmpIt2->nextPixel();
matrixIt += 3;
}
tmpIt2->nextRow();
}
}
painter()->bitBltWithFixedSelection(dstRect.x(), dstRect.y(),
m_srcdev, dab,
dstRect.width(),
dstRect.height());
painter()->renderMirrorMaskSafe(dstRect, m_srcdev, 0, 0, dab,
!m_dabCache->needSeparateOriginal());
+ painter()->setOpacity(opacity);
+
return effectiveSpacing(scale);
}
KisSpacingInformation KisDuplicateOp::updateSpacingImpl(const KisPaintInformation &info) const
{
return effectiveSpacing(m_sizeOption.apply(info));
}
diff --git a/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.h b/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.h
index a5be6cf191..f7df52e583 100644
--- a/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.h
+++ b/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.h
@@ -1,80 +1,82 @@
/*
* Copyright (c) 2002 Patrick Julien <freak@codepimps.org>
* Copyright (c) 2004-2008 Boudewijn Rempt <boud@valdyas.org>
* Copyright (c) 2004 Clarence Dang <dang@kde.org>
* Copyright (c) 2004 Adrian Page <adrian@pagenet.plus.com>
* Copyright (c) 2004 Cyrille Berger <cberger@cberger.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef KIS_DUPLICATEOP_H_
#define KIS_DUPLICATEOP_H_
#include "kis_brush_based_paintop.h"
#include <klocalizedstring.h>
#include <kis_types.h>
#include <brushengine/kis_paintop_factory.h>
#include <brushengine/kis_paintop_settings.h>
#include <kis_pressure_size_option.h>
#include <kis_pressure_rotation_option.h>
+#include <kis_pressure_opacity_option.h>
#include "kis_duplicateop_settings.h"
class KisPaintInformation;
class QPointF;
class KisPainter;
class KisDuplicateOp : public KisBrushBasedPaintOp
{
public:
KisDuplicateOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image);
~KisDuplicateOp() override;
protected:
KisSpacingInformation paintAt(const KisPaintInformation& info) override;
KisSpacingInformation updateSpacingImpl(const KisPaintInformation &info) const override;
private:
qreal minimizeEnergy(const qreal* m, qreal* sol, int w, int h);
private:
KisImageSP m_image;
KisNodeSP m_node;
KisDuplicateOpSettingsSP m_settings;
KisPaintDeviceSP m_srcdev;
KisPaintDeviceSP m_target;
QPointF m_duplicateStart;
bool m_duplicateStartIsSet;
KisPressureSizeOption m_sizeOption;
+ KisPressureOpacityOption m_opacityOption;
KisPressureRotationOption m_rotationOption;
bool m_healing;
bool m_perspectiveCorrection;
bool m_moveSourcePoint;
bool m_cloneFromProjection;
};
#endif // KIS_DUPLICATEOP_H_