From 5a92221cad108b814378165a43ff1ac9ec20ae7b Mon Sep 17 00:00:00 2001 From: Ezerous Date: Tue, 11 Jan 2022 16:15:12 +0200 Subject: [PATCH] refactor: debloat section 4.3 --- .../4.2.2.ui-technologies.tex | 2 - .../4.3.implementation-architecture.tex | 274 +----------------- .../4.3.1.software-units.tex | 9 + .../4.3.1.concordia-contracts-unit.tex | 5 + .../4.3.1.concordia-shared-unit.tex | 6 + .../4.3.1.eth-breeze-unit.tex | 7 + .../4.3.1.eth-drizzle-unit.tex | 7 + .../4.3.1.eth-identity-provider-unit.tex | 5 + .../4.3.2.concordia-application-service.tex | 43 +++ .../4.3.3.concordia-contracts-migrator.tex | 16 + .../4.3.4.concordia-pinner-service.tex | 22 ++ ...5.concordia-contracts-provider-service.tex | 18 ++ .../4.3.6.ganache-service.tex | 9 + .../4.3.7.rendezvous-server-service.tex | 9 + .../4.3.8.service-communication.tex | 26 ++ .../4.3.9.data-flow.tex | 28 ++ thesis.pdf | Bin 9132276 -> 9132398 bytes 17 files changed, 221 insertions(+), 265 deletions(-) create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.concordia-contracts-unit.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.concordia-shared-unit.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-breeze-unit.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-drizzle-unit.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-identity-provider-unit.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.2.concordia-application-service.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.3.concordia-contracts-migrator.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.4.concordia-pinner-service.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.5.concordia-contracts-provider-service.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.6.ganache-service.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.7.rendezvous-server-service.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.8.service-communication.tex create mode 100644 chapters/4.application-implementation/4.3.implementation-architecture/4.3.9.data-flow.tex diff --git a/chapters/4.application-implementation/4.2.implementation-technology-stack/4.2.2.ui-technologies.tex b/chapters/4.application-implementation/4.2.implementation-technology-stack/4.2.2.ui-technologies.tex index 4bbea95..c5f6070 100644 --- a/chapters/4.application-implementation/4.2.implementation-technology-stack/4.2.2.ui-technologies.tex +++ b/chapters/4.application-implementation/4.2.implementation-technology-stack/4.2.2.ui-technologies.tex @@ -2,8 +2,6 @@ Στην παρούσα υποενότητα περιγράφονται όσες τεχνολογίες σχετίζονται με τη διεπαφή του χρήστη (UI), δηλαδή με το Presentation tier. -% TODO: add technologies like redux, sagas - \input{chapters/4.application-implementation/4.2.implementation-technology-stack/4.2.2.ui-technologies/4.2.2.1.react} \input{chapters/4.application-implementation/4.2.implementation-technology-stack/4.2.2.ui-technologies/4.2.2.2.redux} \input{chapters/4.application-implementation/4.2.implementation-technology-stack/4.2.2.ui-technologies/4.2.2.3.redux-saga} \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture.tex b/chapters/4.application-implementation/4.3.implementation-architecture.tex index 854eff3..34fef3a 100644 --- a/chapters/4.application-implementation/4.3.implementation-architecture.tex +++ b/chapters/4.application-implementation/4.3.implementation-architecture.tex @@ -1,7 +1,7 @@ \section{Αρχιτεκτονική υλοποίησης} \label{section:4-3-implementation-architecture} -Το σύστημα υλοποιήθηκε χρησιμοποιώντας το μοντέλο αρχιτεκτονικής των μικροϋπηρεσιών. Το μοντέλο των μικροϋπηρεσιών βασίζεται στην αποδόμηση του συστήματος σε μικρές μονάδες, οι οποίες συνεργάζονται ώστε να προσφέρουν ένα ενιαίο αποτέλεσμα. Η προσέγγιση αυτή έχει πολλά πλεονεκτήματα σε σύγκριση με την ανάπτυξη μονολιθικών εφαρμογών % todo: add reference -. Ο βασικός λόγος για τον οποίο επιλέχθηκε η αρχιτεκτονική μικροϋπηρεσιών είναι η ευκολία που προσφέρει στη γρήγορη ανάπτυξη καινούριων χαρακτηριστικών, ταυτόχρονα από διαφορετικά μέλη μίας ομάδας, ασύγχρονα και χωρίς την ανάγκη συνεχής επικοινωνίας και συνεννόησης μεταξύ τους. Αυτό συμβαίνει επειδή κάθε μέρος του συστήματος (υπηρεσία) είναι αυτόνομο και η ανάπτυξή του είναι διαχωρισμένη από το υπόλοιπο σύστημα με το οποίο είναι αδύναμα συνδεδεμένο (loosely coupled). +Το σύστημα υλοποιήθηκε χρησιμοποιώντας το μοντέλο αρχιτεκτονικής των μικροϋπηρεσιών. Το μοντέλο των μικροϋπηρεσιών βασίζεται στην αποδόμηση του συστήματος σε μικρές μονάδες, οι οποίες συνεργάζονται ώστε να προσφέρουν ένα ενιαίο αποτέλεσμα. Η προσέγγιση αυτή έχει πολλά πλεονεκτήματα σε σύγκριση με την ανάπτυξη μονολιθικών εφαρμογών. % todo: add reference +Ο βασικός λόγος για τον οποίο επιλέχθηκε η αρχιτεκτονική μικροϋπηρεσιών είναι η ευκολία που προσφέρει στη γρήγορη ανάπτυξη καινούριων χαρακτηριστικών, ταυτόχρονα από διαφορετικά μέλη μίας ομάδας, ασύγχρονα και χωρίς την ανάγκη συνεχούς επικοινωνίας και συνεννόησης μεταξύ τους. Αυτό συμβαίνει επειδή κάθε μέρος του συστήματος (υπηρεσία) είναι αυτόνομο και η ανάπτυξή του είναι διαχωρισμένη από το υπόλοιπο σύστημα με το οποίο είναι αδύναμα συνδεδεμένο (loosely coupled). Το σύστημα συντίθεται από διάφορες μικροϋπηρεσίες, κάποιες από τις οποίες αναπτύχθηκαν στα πλαίσια αυτής της εργασίας ενώ άλλες αποτελούν δωρεάν λογισμικό ανοιχτού κώδικα. Οι μικροϋπηρεσίες αυτές συνοψίζονται στον παρακάτω πίνακα (πίνακας \ref{table:4-3-microservice-summary}). @@ -53,264 +53,12 @@ \label{figure:4-3-architecture-overview} \end{figure} -% ===== ===== -% Common software units -% ===== ===== -\subsection{Αρθρώματα} \label{subsection:4-3-software-units} - -Στο κεφάλαιο αυτό θα περιγραφούν με μεγαλύτερη λεπτομέρεια τα αρθρώματα που αναπτύχθηκαν. - -\vspace{0.5cm} -\textbf{Άρθρωμα concordia-shared} - -Το άρθρωμα concordia-shared αποτελεί μία βιβλιοθήκη χρήσιμων εργαλείων και σταθερών. Εδώ περιέχεται όλο το λογισμικό το οποίο πρέπει ή είναι επιθυμητό να συμπεριφέρεται με τον ίδιο τρόπο συνολικά στο σύστημα, όπως για παράδειγμα μέθοδοι παραμετροποίησης των υπηρεσιών και μέθοδοι καταγραφής (logging). Το άρθρωμα αυτό χρησιμοποιείται από το άρθρωμα concordia-contracts καθώς και από τις υπηρεσίες Concordia Application, Concordia Pinner και Concordia Contracts Provider. - -% make more sense -Το άρθρωμα αυτό γίνεται διαθέσιμο για χρήση με τη μορφή τοπικής βιβλιοθήκης με τη χρήση της βιβλιοθήκης διαχείρισης μοναδικού αποθετηρίου κώδικα (monorepo) lerna. - -\vspace{0.5cm} -\textbf{Άρθρωμα concordia-contracts} - -Το άρθρωμα αυτό επιτελεί δύο ενέργειες. Αρχικά, είναι το άρθρωμα στο οποίο αναπτύσσονται τα contracts που χρησιμοποιούνται από την εφαρμογή. Το άρθρωμα αυτό αναλαμβάνει τη μεταγλώττιση των contracts από κώδικα γλώσσας Solidity, στην κατάλληλη τελική μορφή JSON. Παρέχονται επίσης σενάρια ενεργειών (scripts) ώστε τα contracts να μεταφορτωθούν σε blockchain καθώς και στην υπηρεσία Concordia Contracts Provider. Αποτελεί επίσης βιβλιοθήκη η οποία μετά τη μεταγλώττιση και μεταφόρτωση των contracts σε blockchain παρέχει τα contract artifacts. Χρησιμοποιείται από τις υπηρεσίες Concordia Application και Concordia Pinner. - -Το άρθρωμα αυτό γίνεται διαθέσιμο για χρήση με τη μορφή τοπικής βιβλιοθήκης με τη χρήση της βιβλιοθήκης διαχείρισης monorepo lerna. - -\vspace{0.5cm} -\textbf{Άρθρωμα eth-identity-provider} - -Η λειτουργία της βάση OrbitDB απαιτεί τη δημιουργία ενός μοναδικού αναγνωριστικού χρήστη (identity). Για την εύκολη εξαγωγή ενός αναγνωριστικού χρήστη το οποίο να είναι μεν μοναδικό αλλά να είναι δυνατός ο επανυπολογισμός, χρησιμοποιήθηκε ο συνδυασμός της διεύθυνσης του χρήστη στο δίκτυο Ethereum με τη διεύθυνση του βασικού contract που χρησιμοποιεί η εφαρμογή. Ο υπολογισμός του συνδυασμού αυτού υλοποιείται από αυτό το άρθρωμα. - -Το άρθρωμα αυτό γίνεται διαθέσιμο για χρήση με τη μορφή βιβλιοθήκης μέσω του αποθετηρίου λογισμικού npm. - -\vspace{0.5cm} -\textbf{Άρθρωμα drizzle} - -Το άρθρωμα drizzle που χρησιμοποιείται στην υπηρεσία Concordia Application είναι μία τροποποιημένη έκδοση της Javascript βιβλιοθήκης Drizzle που προσφέρεται από τη σουίτα εργαλείων Truffle. Η τροποποιημένη βιβλιοθήκη αναπτύχθηκε στα πλαίσια της διπλωματικής με στόχο τη διευκόλυνση της χρήσης του Drizle και την επιδιόρθωση προβληματικών σημείων της πρωτότυπης βιβλιοθήκης. - -Το άρθρωμα drizzle υλοποιεί τις προγραμματιστικές διεπαφές μέσω των οποίων πραγματοποιείται η επικοινωνία της εφαρμογής με το blockchain. Για την επίτευξη της επικοινωνίας αυτής, η βιβλιοθήκη χρησιμοποιεί τη συλλογή βιβλιοθηκών web3.js η οποία αποτελεί τον πιο διαδεδομένο τρόπο διεπαφής με το blockchain σε αποκεντρωτικές εφαρμογές. - -Το άρθρωμα αυτό γίνεται διαθέσιμο για χρήση με τη μορφή βιβλιοθήκης μέσω του αποθετηρίου λογισμικού npm. - -\vspace{0.5cm} -\textbf{Άρθρωμα breeze} - -Το άρθρωμα αυτό αποτελεί μία βιβλιοθήκη περίβλημα (wrapper) της βιβλιοθήκης OrbitDB. Η OrbitDB είναι μία βιβλιοθήκη η οποία προσφέρει τις απαραίτητες προγραμματιστικές διεπαφές για τη χρήση της βάσης δεδομένων με το ίδιο όνομα. Μέσα από τη χρήση των βιβλιοθηκών που προσφέρονται από το IPFS για την αποθήκευση δεδομένων, η OrbitDB καταφέρνει να υλοποιήσει μία αποκεντρωμένη βάση δεδομένων. - -Το άρθρωμα breeze κάνει χρήση της βιβλιοθήκης OrbitDB, προσφέρει ωστόσο συγκεκριμένες προγραμματιστικές διεπαφές που διευκολύνουν τόσο την παραμετροποίηση της βάσης όσο και τη χρήση της, ενώ όπως και στο άρθρωμα drizzle το άρθρωμα breeze αναλαμβάνει να διορθώσει ορισμένα προβλήματα της πρωτότυπης βιβλιοθήκης. - -Το άρθρωμα αυτό γίνεται διαθέσιμο για χρήση με τη μορφή βιβλιοθήκης μέσω του αποθετηρίου λογισμικού npm. - -% ===== ===== -% concordia-app microservice -% ===== ===== -\subsection{Concordia Application} \label{subsection:4-3-concordia-application-service} - -\vspace{0.5cm} -\textbf{Περιγραφή - Στόχοι υπηρεσίας} - -Η εφαρμογή Concordia (Concordia Application) εκθέτει τις γραφικές διεπαφές μέσω των οποίων αλληλεπιδρούν οι χρήστες με το σύστημα. Αποτελεί τον δίαυλο επικοινωνίας του τελικού χρήστη με το blockchain και με τη βάση OrbitDB. Η αρχιτεκτονική της υπηρεσίας φαίνεται στο σχήμα \ref{figure:4-3-concordia-application-architecture}. Μέσω της εφαρμογής Concordia οι χρήστες μπορούν να: - -\begin{itemize} - \item περιηγηθούν και διαβάσουν το περιεχόμενο της πλατφόρμας - - \item δημιουργήσουν λογαριασμό χρήστη - - \item δημοσιεύσουν και τροποποιήσουν προσωπικές τους πληροφορίες όπως η τοποθεσία και η εικόνα προφίλ - - \item δημιουργήσουν θέματα (topics) - - \item δημιουργήσουν ψηφοφορίες (polls), καθώς και να ψηφίσουν σε αυτές - - \item δημιουργήσουν και τροποποιήσουν μηνύματα (posts) - - \item υπερψηφίσουν (up-vote) ή καταψηφίσουν (down-vote) μηνύματα άλλων χρηστών -\end{itemize} - -Η υπηρεσία αποτελείται από κώδικα γραμμένο σε Javascript ο οποίος γίνεται διαθέσιμος στους τελικούς χρήστες με τη μορφή εφαρμογής διαδικτύου (web application) μέσω ενός διακομιστή (server). Παρόλο που η υπηρεσία προσφέρει τη γραφική διεπαφή χρήστη μόνο στην αγγλική γλώσσα, έχει παραμετροποιηθεί ώστε να είναι δυνατή η εύκολη μεταγλώττιση της χωρίς την ανάγκη πραγματοποίησης μεγάλων αλλαγών στον κώδικα. - -Χρησιμοποιείται η βιβλιοθήκη React για την οργάνωση και ανάπτυξη των συνθετικών τμημάτων (components) του γραφικού περιβάλλοντος. Για το γραφικό περιβάλλον γίνεται χρήση του framework της Semantic UI. Χρησιμοποιείται η βιβλιοθήκη Redux για τη διαχείριση κατάστασης της εφαρμογής (state management), % todo: find a better greek translation -καθώς και η βιβλιοθήκη Redux-Saga για τη διαχείριση ασύγχρονων παράπλευρων ενεργειών (side-effects) σε ένα σύστημα βασισμένο σε συμβάντα (event-based). Άλλες βιβλιοθήκες χρησιμοποιούνται για διάφορα μέρη της υπηρεσίας, ενώ χρησιμοποιούνται επίσης τα αρθρώματα που περιγράφηκαν προηγουμένως για την επίτευξη διαφορετικών στόχων. Ο πλήρης κατάλογος των βιβλιοθηκών και αρθρωμάτων μπορεί να βρεθεί στον κώδικα της υπηρεσίας στο παράρτημα. % todo: add reference to the appendix containing the code or a link to it in the repo - -\begin{figure}[H] - \centering - \includegraphics[width=.7\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.2.concordia-application-architecture.png} - \caption{Αρχιτεκτονική υπηρεσίας Concordia Application} - \label{figure:4-3-concordia-application-architecture} -\end{figure} - -Για τη λειτουργία της υπηρεσία Concordia Application είναι απαραίτητα τα αντικείμενα (artifacts) που προκύπτουν από τη μεταγλώττιση των contracts και τη μεταφόρτωση/δημοσίευσή τους στο blockchain. Για την εισαγωγή των artifacts στην υπηρεσία έχουν αναπτυχθεί δύο μέθοδοι. - -Η πρώτη μέθοδος είναι η μεταγλώττιση και μεταφόρτωση των contracts πριν την παραγωγή του πακέτου λογισμικού της υπηρεσίας για τελική χρήση (production build). Με αυτό τον τρόπο η υπηρεσία θα έχει πρόσβαση στα artifacts μέσω της βιβλιοθήκης που παράγεται από το άρθρωμα concordia-contracts. Αυτή η μέθοδος έχει το μειονέκτημα ότι το τελικό πακέτο λογισμικού (production build) ``δένεται'' με όποια συγκεκριμένη έκδοση των contracts είναι διαθέσιμη κατά τη δημιουργία του πακέτου. Αυτό σημαίνει ότι σε ενδεχόμενη ενημέρωση των contracts πρέπει αναγκαστικά να δημιουργηθεί και νέα έκδοση του πακέτου λογισμικού της υπηρεσίας Concordia Application. - -Για την αποφυγή του παραπάνω προβλήματος αναπτύχθηκε η δεύτερη μέθοδος προσκόμισης των contract artifacts, η οποία είναι η λήψη τους (download) από μία άλλη τοποθεσία στο διαδίκτυο. Σε αυτή τη μέθοδο, η εφαρμογή κατά την εκκίνησή της πραγματοποιεί ένα HTTP αίτημα (HTTP request) σε διεύθυνση η οποία δίνεται ως μεταβλητή περιβάλλοντος (environment variable). Η απάντηση του αιτήματος αναμένεται να περιέχει τα artifacts ώστε η εφαρμογή να τα χρησιμοποιήσει. - -\vspace{0.5cm} -\textbf{Διανομή} - -Η υπηρεσία Concordia Application πακετάρεται μαζί με τον διακομιστή nginx και γίνεται διαθέσιμη για χρήση ως εικόνα docker (docker image) μέσω του αποθετηρίου εικόνων dockerhub. Κατά την εκτέλεση της εικόνας οι χρήστες μπορούν μέσω μεταβλητών περιβάλλοντος να ορίσουν παραμέτρους της εκτέλεσης όπως η διεύθυνση του εξυπηρετητή (host location) της εφαρμογής και οι τοποθεσίες των υπηρεσιών Rendezvous Server και Contracts Provider. - -% ===== ===== -% concordia-contracts-migrator microservice -% ===== ===== -\subsection{Concordia Contracts Migrator} \label{subsection:4-3-concordia-contracts-migrator} - -\vspace{0.5cm} -\textbf{Περιγραφή - Στόχοι υπηρεσίας} - -Η υπηρεσία αυτή αποτελείται από ένα εκτελέσιμο πρόγραμμα γραμμής εντολών βασισμένο στο άρθρωμα concordia-contracts που αναλύθηκε σε προηγούμενη υποενότητα (\ref{subsection:4-3-software-units}). Το πρόγραμμα, κατά την εκτέλεσή του, μεταγλωττίζει τα contracts και έπειτα τα μεταφορτώνει στο blockchain το οποίο είναι ορισμένο με χρήση μεταβλητών περιβάλλοντος. Τέλος, αν οι κατάλληλες μεταβλητές περιβάλλοντος είναι ορισμένες, το πρόγραμμα μεταφορτώνει τα τελικά artifacts σε αποθετήριο Concordia Contracts Provider. Η αρχιτεκτονική της υπηρεσίας φαίνεται στο παρακάτω σχήμα (σχήμα \ref{figure:4-3-concordia-contracts-migrator-architecture}). - -\begin{figure}[H] - \centering - \includegraphics[width=.6\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.3.concordia-contracts-migrator-architecture.png} - \caption{Αρχιτεκτονική υπηρεσίας Concordia Contracts Migrator} - \label{figure:4-3-concordia-contracts-migrator-architecture} -\end{figure} - -\vspace{0.5cm} -\textbf{Διανομή} - -Η υπηρεσία αυτή γίνεται διαθέσιμη για χρήση ως docker image μέσω του αποθετηρίου εικόνων dockerhub. Οι χρήστες μπορούν χρησιμοποιώντας μεταβλητές περιβάλλοντος να αλλάξουν τη διεύθυνση του blockchain και την τοποθεσία της υπηρεσίας Contracts Provider στην οποία το πρόγραμμα θα μεταφορτώσει τα contracts και τα artifacts. - -% ===== ===== -% concordia-pinner microservice -% ===== ===== -\subsection{Concordia Pinner} \label{subsection:4-3-concordia-pinner-service} - -\vspace{0.5cm} -\textbf{Περιγραφή - Στόχοι υπηρεσίας} - -Η υπηρεσία καρφιτσώματος περιεχομένου (Concordia Pinner) αποτελεί μία εφαρμογή τερματικού (temrinal application/cmd application) η οποία στοχεύει στο καρφίτσωμα (pinning) του περιεχομένου που αποθηκεύεται στο IPFS μέσω της βάσης OrbitDB. Η υπηρεσία είναι γραμμένη στη γλώσσα προγραμματισμού Javascript. Η αρχιτεκτονική της υπηρεσίας φαίνεται το σχήμα \ref{figure:4-3-concordia-pinner-architecture}. - -\begin{figure}[H] - \centering - \includegraphics[width=.6\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.4.concordia-pinner-architecture.png} - \caption{Αρχιτεκτονική υπηρεσίας Concordia Pinner} - \label{figure:4-3-concordia-pinner-architecture} -\end{figure} - -Η υπηρεσία αυτή υλοποιήθηκε για να εγγυηθεί η διαθεσιμότητα του περιεχομένου του συστήματος που αποθηκεύεται στο IPFS (τίτλοι θεμάτων, περιεχόμενο μηνυμάτων και άλλα). Λόγω του τρόπου λειτουργίας % todo: insert reference -του IPFS, το περιεχόμενο που αναρτούν οι χρήστες πρέπει να καρφιτσώνεται από άλλους χρήστες ή αυτόνομες εφαρμογές, όπως η υπηρεσία Concordia Pinner, ώστε να είναι διαθέσιμο. Αν το περιεχόμενο δεν καρφιτσωθεί, τότε θα είναι διαθέσιμο στους υπόλοιπους χρήστες μόνο από %todo: fix gender stuff -τον/τη δημιουργό, έτσι αν αυτός/αυτή δεν είναι ενεργός/ενεργή στο δίκτυο, το περιεχόμενο θα είναι αδύνατο να βρεθεί. - -Η υπηρεσία συνδέεται στο blockchain από όπου παρακολουθεί την κατάσταση του συστήματος και ``ακούει'' για νέους χρήστες, θέματα και μηνύματα. Η υπηρεσία συνδέεται επίσης στο IPFS, έτσι όταν δημιουργηθεί νέο περιεχόμενο στο σύστημα το καρφιτσώνει αυτόματα. Με αυτό τον τρόπο, διατηρώντας την υπηρεσία πάντα διαθέσιμη, για παράδειγμα εκτελώντας τη σε περιβάλλον διακομιστή (server), διαβεβαιώνεται η διαθεσιμότητα του περιεχομένου. - -\vspace{0.5cm} -\textbf{Διανομή} - -Η υπηρεσία αυτή γίνεται διαθέσιμη για χρήση ως docker image μέσω του αποθετηρίου εικόνων dockerhub. Κατά την εκτέλεση της εικόνας οι χρήστες μπορούν μέσω μεταβλητών περιβάλλοντος να ορίσουν παραμέτρους της υπηρεσίας όπως τη διεύθυνση του εξυπηρετητή (host location), τη διεύθυνση του blockchain, τις διαδρομές αποθήκευσης των δεδομένων στο σύστημα και τις τοποθεσίες των υπηρεσιών Rendezvous Server και Contracts Provider. - -% ===== ===== -% concordia-contracts-provider microservice -% ===== ===== -\subsection{Concordia Contracts Provider} \label{subsection:4-3-concordia-contracts-provider-service} - -\vspace{0.5cm} -\textbf{Περιγραφή - Στόχοι υπηρεσίας} - -Η υπηρεσία Contracts Provider αποτελεί μία βοηθητική υπηρεσία η οποία υλοποιεί ένα απλό αποθετήριο για τα contract artifacts. Είναι γραμμένη σε Javascript και διαθέτει δύο HTTP \textenglish{endpoints}, ένα για τη μεταφόρτωση (upload) των artifacts προς την υπηρεσία και ένα για τη λήψη (download) από την υπηρεσία. Η υπηρεσία υποστηρίζει επίσης την επισύναψη ετικετών στα artifacts, όπως η έκδοση (version) ή το κλαδί ανάπτυξης (branch, για παράδειγμα \textenglish{master/develop}). Η αρχιτεκτονική της υπηρεσίας φαίνεται το σχήμα \ref{figure:4-3-concordia-contracts-provider-architecture}. - -\begin{figure}[H] - \centering - \includegraphics[width=.6\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.5.concordia-contracts-provider-architecture.png} - \caption{Αρχιτεκτονική υπηρεσίας Concordia Contracts Provider} - \label{figure:4-3-concordia-contracts-provider-architecture} -\end{figure} - -Η υπηρεσία χρησιμοποιείται σε μία προσπάθεια αποσύνδεσης της βασικής εφαρμογής που υλοποιεί η υπηρεσία Concordia Application από μία συγκεκριμένη έκδοση των contracts. Οι λόγοι που αυτό είναι επιθυμητό αναπτύχθηκαν στην περιγραφή της υπηρεσίας Concordia \textenglish{Application} (υποενότητα \ref{subsection:4-3-concordia-application-service}). Ωστόσο, η υπηρεσία Contracts Provider αποτελεί σημείο κεντροποίησης του συστήματος, για το λόγο αυτό θεωρείται προσωρινή λύση η οποία θα μπορούσε να αντικατασταθεί από αποκεντρωτικές λύσεις όπως η μεταφόρτωση των artifacts στο IPFS και ο διαμοιρασμός τους από εκεί. - -\vspace{0.5cm} -\textbf{Διανομή} - -Η υπηρεσία αυτή γίνεται διαθέσιμη για χρήση ως docker image μέσω του αποθετηρίου εικόνων dockerhub. Οι χρήστες μπορούν χρησιμοποιώντας μεταβλητές περιβάλλοντος να αλλάξουν παραμέτρους της εκτέλεσης όπως η διαδρομή αποθήκευσης των μεταφορτωμένων contract artifacts. - -% ===== ===== -% rendezvous-ganache microservice -% ===== ===== -\subsection{Ganache} \label{subsection:4-3-ganache-service} - -\vspace{0.5cm} -\textbf{Περιγραφή - Στόχοι υπηρεσίας} - -Η υπηρεσία Ganache αποτελεί μία εφαρμογή τερματικού η οποία είναι μέρος της δωρεάν σουίτας ανοιχτού λογισμικού Truffle. Η εφαρμογή δημιουργεί ένα τοπικό, ιδιωτικό blockchain το οποίο ακολουθεί το πρότυπο του Ethereum. Επίσης, η εφαρμογή δρα ως miner στο δίκτυο, διεκπεραιώνοντας όλες τις συναλλαγές. - -\vspace{0.5cm} -\textbf{Διανομή} - -Για τη χρήση της υπηρεσίας αυτής αναπτύχθηκε μία νέα εικόνα docker που βασίζεται στην επίσημη εικόνα που διατίθεται από τη σουίτα και προσθέτει μερικές χρήσιμες λειτουργικότητες όπως η δυνατότητα αποκάλυψης των κλειδιών που δημιουργούνται κατά την εκτέλεση. Η υπηρεσία γίνεται διαθέσιμη για χρήση ως docker image μέσω του αποθετηρίου εικόνων dockerhub. Η εικόνα παρέχει τη δυνατότητα τροποποίησης των παραμέτρων εκτέλεσης με χρήση μεταβλητών περιβάλλοντος. Με αυτό τον τρόπο οι χρήστες μπορούν να αλλάξουν τον αριθμό των λογαριασμών που θα δημιουργηθούν, το ποσό του Ether που θα λάβει κάθε λογαριασμός καθώς και άλλες μεταβλητές. - -% ===== ===== -% rendezvous-server microservice -% ===== ===== -\subsection{Rendezvous Server} \label{subsection:4-3-rendezvous-server-service} - -\vspace{0.5cm} -\textbf{Περιγραφή - Στόχοι υπηρεσίας} - -Η υπηρεσία Rendezvous Server αποτελεί δωρεάν λογισμικό ανοιχτού κώδικα το οποίο χρησιμοποιήθηκε (αλλά δεν αναπτύχθηκε) στα πλαίσια της διπλωματικής και υλοποιεί το πρωτόκολλο rendezvous για την εύρεση ομότιμων χρηστών (peers). Η υπηρεσία είναι απαραίτητη για τη λειτουργία του IPFS, ώστε οι ομότιμοι χρήστες (peers) να μπορούν να ανακαλύψουν τις διευθύνσεις των υπόλοιπων χρηστών του δικτύου. - -\vspace{0.5cm} -\textbf{Διανομή} - -Η υπηρεσία αυτή είναι διαθέσιμη για χρήση από τους δημιουργούς της τόσο ως εφαρμογή μέσω του αποθετηρίου λογισμικού npm αλλά και ως docker image μέσω του αποθετηρίου εικόνων dockerhub. - -% ===== ===== -% microservice communication -% ===== ===== -\subsection{Διασύνδεση υπηρεσιών} \label{subsection:4-3-service-communication} - -Στο μοντέλο των μικροϋπηρεσιών, βασικό χαρακτηριστικό είναι η επικοινωνία των ξεχωριστών υπηρεσιών και η ανταλλαγή μηνυμάτων για την επίτευξη των λειτουργικοτήτων του συστήματος. Σε αυτήν την υποενότητα θα αναλυθεί ο τρόπος με τον οποίο οι μικροϋπηρεσίες επικοινωνούν μεταξύ τους καθώς και η φύση και το περιεχόμενο των μηνυμάτων που ανταλλάσουν. - -Στο παρακάτω σχήμα (σχήμα \ref{figure:4-3-communications-graph}) φαίνεται ο γράφος που οπτικοποιεί τα κανάλια επικοινωνίας μεταξύ των μικροϋπηρεσιών, καθώς και τα κανάλια επικοινωνίας των μικροϋπηρεσιών με το blockchain. - -\begin{figure}[H] - \centering - \includegraphics[width=.9\textwidth]{assets/figures/chapter-4/4.3.communications-diagram.png} - \caption{Γράφος οπτικοποίησης των καναλιών επικοινωνίας των μικροϋπηρεσιών} - \label{figure:4-3-communications-graph} -\end{figure} - -Εδώ αναλύεται η επικοινωνία κάθε μικροϋπηρεσίας: - -\begin{itemize} - \item \textbf{Contracts Migrator}: η υπηρεσία εκτελεί αίτημα HTTP κατά την μεταφόρτωση των \textenglish{contracts} στο Ethereum blockchain, επίσης εκτελεί αίτημα HTTP για την μεταφόρτωση των contract artifacts στην υπηρεσία Contracts Provider - - \item \textbf{Concordia Application}: η υπηρεσία εκτελεί αίτημα HTTP για την λήψη των contract \textenglish{artifacts} από την υπηρεσία Contracts Provider, εκτελεί αιτήματα HTTP για την διενέργεια συναλλαγών στο Ethereum blockchain και τέλος δημιουργεί κανάλι UDP επικοινωνίας με την υπηρεσία Rendezvous Server για την ανακάλυψη ομότιμων χρηστών (peers) στο δίκτυο IPFS - - \item \textbf{Pinner}: η υπηρεσία εκτελεί αίτημα HTTP για την λήψη των contract artifacts από την υπηρεσία Contracts Provider, εκτελεί αιτήματα HTTP για την ανανέωση και παρατήρηση της κατάστασης του contract στο Ethereum blockchain και τέλος δημιουργεί κανάλι UDP επικοινωνίας με την υπηρεσία Rendezvous Server για την ανακάλυψη peers στο δίκτυο IPFS - - \item \textbf{Rendezvous Server}: η υπηρεσία διατηρεί ανοιχτά κανάλια UDP επικοινωνίας με τους ομότιμους χρήστες μέσω των οποίων ενημερώνει την λίστα των διαθέσιμων, ενεργών χρηστών - - \item \textbf{Contracts Provider}: η υπηρεσία δεν υποκινεί καμία επικοινωνία παρά μόνο απαντά σε αιτήματα επικοινωνία από άλλες υπηρεσίες -\end{itemize} - -% ===== ===== -% data flow -% ===== ===== -\subsection{Ροή πληροφορίας} \label{subsection:4-3-data-flow} - -Στην παρούσα υποενότητα θα αναλυθεί η ροή της πληροφορίας στο σύστημα. Λόγω των πολλαπλών υπηρεσιών, της κατάτμησης την πληροφορίας και των διαφορετικών σημείων αποθήκευσης της, η ροή της πληροφορίας στο σύστημα ακολουθεί ένα σχετικά περίπλοκο μονοπάτι (σε σχέση με κλασσικές, μονολιθικές, κεντροποιημένες εφαρμογές). - -Αρχικά θα γίνει αναφορά στη διαδικασία αποθήκευσης των νέων πληροφοριών. Η μοναδική πηγή παραγωγής δεδομένων στο σύστημα είναι οι χρήστες και κατ' επέκταση η υπηρεσία Concordia Application, εφόσον είναι η μοναδική υπηρεσία με την οποία αυτοί αλληλεπιδρούν. Τα δεδομένα που δημιουργούν οι χρήστες (πληροφορίες χρηστών, τίτλοι θεμάτων και περιεχόμενο μηνυμάτων) κατατμήζονται πριν αποθηκευτούν. Η πληροφορία που εισάγεται στο σύστημα κατατμήζεται σε δύο μέρη. Στο blockchain αποθηκεύεται ένας δείκτης προς τα δεδομένα, ενώ τα πραγματικά δεδομένα αποθηκεύονται στη βάση OrbitDB. Ο δείκτης εκτός από την άμεση χρησιμότητα στην εύρεση των δεδομένων, παρέχει και την έμμεση λειτουργικότητα της δημιουργίας απαραίτητων μεταδομένων όπως ο αριθμός των θεμάτων στο σύστημα ή των μηνυμάτων σε ένα θέμα. - -Από την πλευρά της εύρεση των πληροφοριών στο σύστημα, η ροή είναι ως εξής. Αρχικά, είναι απαραίτητη η αναζήτηση στο blockchain για την εύρεση του δείκτη προς τα δεδομένα. Έπειτα, τα δεδομένα μπορούν να ανακτηθούν μέσω του IPFS από τον εκάστοτε χρήστη ή από κάποιον Pinner. - -Τέλος, παρακάτω δίνεται ένα παράδειγμα εισαγωγής πληροφορίας στο σύστημα και έπειτα ανάκτησης της ίδιας πληροφορίας. - -Έστω, χρήστης που δημιουργεί νέο θέμα. Τα δεδομένα που παράγονται είναι ο τίτλος του θέματος και το περιεχόμενο του πρώτου μηνύματος. Μεταδεδομένα της δημιουργίας είναι η διεύθυνση του/της δημιουργού του θέματος. Για την αποθήκευση του θέματος στο σύστημα δημιουργείται πρώτα συναλλαγή στο blockchain ώστε να δημιουργηθεί μία νέα εγγραφή στον πίνακα των θεμάτων. Η εγγραφή αυτή δεν περιέχει τίποτα παρά μόνο τη διεύθυνση του/της δημιουργού χρήστη. Αν η συναλλαγή είναι επιτυχής, θα επιστραφεί ο αύξων αριθμός του νέου θέματος. Έπειτα, στην προσωπική βάση OrbitDB του/της χρήστη και στον πίνακα των θεμάτων θα προστεθεί εγγραφή με αναγνωριστικό τον αύξων αριθμό του θέματος όπου θα αποθηκευτούν τα δεδομένα του τίτλου και πρώτου μηνύματος. Στο σχήμα \ref{figure:4-3-data-flow-insert} παρουσιάζεται γραφικά η διαδικασία. - -% todo: UML diagrams might be wrong, should the ethereum and orbitDb blocks be continuous? -\begin{figure}[H] - \centering - \includegraphics[width=.7\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.9.data-flow-insert.png} - \caption{Διάγραμμα ακολουθίας δημιουργίας θέματος} - \label{figure:4-3-data-flow-insert} -\end{figure} - -Έστω, χρήστης που επιθυμεί να διαβάσει το προηγούμενο μήνυμα. Αρχικά, πρέπει να διαβαστεί ο πίνακας θεμάτων από το blockchain. Η πληροφορία αυτή εμπλουτίζεται από τα δεδομένα του κάθε θέματος, τα οποία ανακτώνται από τις προσωπικές βάσεις Orbit κάθε χρήστη. Έπειτα, εφόσον το θέμα βρεθεί και ο αύξων αριθμός του είναι γνωστός, πρέπει να διαβαστούν από το blockchain τα μεταδομένα των μηνυμάτων του θέματος και συγκεκριμένα η διευθύνσεις των δημιουργών τους. Τέλος, μέσω του IPFS πρέπει να γίνει αντιγραφή των προσωπικών βάσεων των δημιουργών του κάθε μηνύματος και να αναζητηθούν σε αυτές τα εκάστοτε μηνύματα. Στο σχήμα \ref{figure:4-3-data-flow-read} φαίνεται το διάγραμμα ροής της πληροφορίας κατά την ανάκτηση πληροφοριών από το σύστημα. - -\begin{figure}[H] - \centering - \includegraphics[width=.7\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.9.data-flow-read.png} - \caption{Διάγραμμα ακολουθίας εύρεσης και ανάκτησης θέματος} - \label{figure:4-3-data-flow-read} -\end{figure} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.2.concordia-application-service} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.3.concordia-contracts-migrator} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.4.concordia-pinner-service} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.5.concordia-contracts-provider-service} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.6.ganache-service} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.7.rendezvous-server-service} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.8.service-communication} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.9.data-flow} \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units.tex new file mode 100644 index 0000000..7ca553b --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units.tex @@ -0,0 +1,9 @@ +\subsection{Αρθρώματα} \label{subsection:4-3-1-software-units} + +Σε αυτό το κεφάλαιο θα περιγραφούν με μεγαλύτερη λεπτομέρεια τα αρθρώματα που αναπτύχθηκαν. + +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.concordia-shared-unit} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.concordia-contracts-unit} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-identity-provider-unit} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-drizzle-unit} +\input{chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-breeze-unit} \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.concordia-contracts-unit.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.concordia-contracts-unit.tex new file mode 100644 index 0000000..b1b8266 --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.concordia-contracts-unit.tex @@ -0,0 +1,5 @@ +\subsubsection{Άρθρωμα concordia-contracts} \label{subsubsection:4-3-1-concordia-contracts-unit} + +Το άρθρωμα αυτό επιτελεί δύο ενέργειες. Αρχικά, είναι το άρθρωμα στο οποίο αναπτύσσονται τα contracts που χρησιμοποιούνται από την εφαρμογή. Το άρθρωμα αυτό αναλαμβάνει τη μεταγλώττιση των contracts από κώδικα γλώσσας Solidity, στην κατάλληλη τελική μορφή JSON. Παρέχονται επίσης σενάρια ενεργειών (scripts) ώστε τα contracts να μεταφορτωθούν σε blockchain καθώς και στην υπηρεσία Concordia Contracts Provider. Αποτελεί επίσης βιβλιοθήκη η οποία μετά τη μεταγλώττιση και μεταφόρτωση των contracts σε blockchain παρέχει τα contract artifacts. Χρησιμοποιείται από τις υπηρεσίες Concordia Application και Concordia Pinner. + +Το άρθρωμα αυτό γίνεται διαθέσιμο για χρήση με τη μορφή τοπικής βιβλιοθήκης με τη χρήση της βιβλιοθήκης διαχείρισης monorepo lerna. \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.concordia-shared-unit.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.concordia-shared-unit.tex new file mode 100644 index 0000000..33bed8e --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.concordia-shared-unit.tex @@ -0,0 +1,6 @@ +\subsubsection{Άρθρωμα concordia-shared} \label{subsubsection:4-3-1-concordia-shared-unit} + +Το άρθρωμα concordia-shared αποτελεί μία βιβλιοθήκη χρήσιμων εργαλείων και σταθερών. Εδώ περιέχεται όλο το λογισμικό το οποίο πρέπει ή είναι επιθυμητό να συμπεριφέρεται με τον ίδιο τρόπο συνολικά στο σύστημα, όπως για παράδειγμα μέθοδοι παραμετροποίησης των υπηρεσιών και μέθοδοι καταγραφής (logging). Το άρθρωμα αυτό χρησιμοποιείται από το άρθρωμα concordia-contracts καθώς και από τις υπηρεσίες Concordia Application, Concordia Pinner και Concordia Contracts Provider. + +% make more sense +Το άρθρωμα αυτό γίνεται διαθέσιμο για χρήση με τη μορφή τοπικής βιβλιοθήκης με τη χρήση της βιβλιοθήκης διαχείρισης μοναδικού αποθετηρίου κώδικα (monorepo) lerna. \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-breeze-unit.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-breeze-unit.tex new file mode 100644 index 0000000..aefdf84 --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-breeze-unit.tex @@ -0,0 +1,7 @@ +\subsubsection{Άρθρωμα breeze} \label{subsubsection:4-3-1-eth-breeze-unit} + +Το άρθρωμα αυτό αποτελεί μία βιβλιοθήκη περίβλημα (wrapper) της βιβλιοθήκης OrbitDB. Η OrbitDB είναι μία βιβλιοθήκη η οποία προσφέρει τις απαραίτητες προγραμματιστικές διεπαφές για τη χρήση της βάσης δεδομένων με το ίδιο όνομα. Μέσα από τη χρήση των βιβλιοθηκών που προσφέρονται από το IPFS για την αποθήκευση δεδομένων, η OrbitDB καταφέρνει να υλοποιήσει μία αποκεντρωμένη βάση δεδομένων. + +Το άρθρωμα breeze κάνει χρήση της βιβλιοθήκης OrbitDB, προσφέρει ωστόσο συγκεκριμένες προγραμματιστικές διεπαφές που διευκολύνουν τόσο την παραμετροποίηση της βάσης όσο και τη χρήση της, ενώ όπως και στο άρθρωμα drizzle το άρθρωμα breeze αναλαμβάνει να διορθώσει ορισμένα προβλήματα της πρωτότυπης βιβλιοθήκης. + +Το άρθρωμα αυτό γίνεται διαθέσιμο για χρήση με τη μορφή βιβλιοθήκης μέσω του αποθετηρίου λογισμικού npm. \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-drizzle-unit.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-drizzle-unit.tex new file mode 100644 index 0000000..a8b55e6 --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-drizzle-unit.tex @@ -0,0 +1,7 @@ +\subsubsection{Άρθρωμα drizzle} \label{subsubsection:4-3-1-eth-drizzle-unit} + +Το άρθρωμα drizzle που χρησιμοποιείται στην υπηρεσία Concordia Application είναι μία τροποποιημένη έκδοση της Javascript βιβλιοθήκης Drizzle που προσφέρεται από τη σουίτα εργαλείων Truffle. Η τροποποιημένη βιβλιοθήκη αναπτύχθηκε στα πλαίσια της διπλωματικής με στόχο τη διευκόλυνση της χρήσης του Drizle και την επιδιόρθωση προβληματικών σημείων της πρωτότυπης βιβλιοθήκης. + +Το άρθρωμα drizzle υλοποιεί τις προγραμματιστικές διεπαφές μέσω των οποίων πραγματοποιείται η επικοινωνία της εφαρμογής με το blockchain. Για την επίτευξη της επικοινωνίας αυτής, η βιβλιοθήκη χρησιμοποιεί τη συλλογή βιβλιοθηκών web3.js η οποία αποτελεί τον πιο διαδεδομένο τρόπο διεπαφής με το blockchain σε αποκεντρωτικές εφαρμογές. + +Το άρθρωμα αυτό γίνεται διαθέσιμο για χρήση με τη μορφή βιβλιοθήκης μέσω του αποθετηρίου λογισμικού npm. \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-identity-provider-unit.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-identity-provider-unit.tex new file mode 100644 index 0000000..693f9a5 --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.1.software-units/4.3.1.eth-identity-provider-unit.tex @@ -0,0 +1,5 @@ +\subsubsection{Άρθρωμα eth-identity-provider} \label{subsubsection:4-3-1-eth-identity-provider-unit} + +Η λειτουργία της βάση OrbitDB απαιτεί τη δημιουργία ενός μοναδικού αναγνωριστικού χρήστη (identity). Για την εύκολη εξαγωγή ενός αναγνωριστικού χρήστη το οποίο να είναι μεν μοναδικό αλλά να είναι δυνατός ο επανυπολογισμός, χρησιμοποιήθηκε ο συνδυασμός της διεύθυνσης του χρήστη στο δίκτυο Ethereum με τη διεύθυνση του βασικού contract που χρησιμοποιεί η εφαρμογή. Ο υπολογισμός του συνδυασμού αυτού υλοποιείται από αυτό το άρθρωμα. + +Το άρθρωμα αυτό γίνεται διαθέσιμο για χρήση με τη μορφή βιβλιοθήκης μέσω του αποθετηρίου λογισμικού npm. \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.2.concordia-application-service.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.2.concordia-application-service.tex new file mode 100644 index 0000000..aaa1630 --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.2.concordia-application-service.tex @@ -0,0 +1,43 @@ +\subsection{Concordia Application} \label{subsection:4-3-2-concordia-application-service} + +\subsubsection{Περιγραφή - Στόχοι υπηρεσίας} + +Η εφαρμογή Concordia (Concordia Application) εκθέτει τις γραφικές διεπαφές μέσω των οποίων αλληλεπιδρούν οι χρήστες με το σύστημα. Αποτελεί τον δίαυλο επικοινωνίας του τελικού χρήστη με το blockchain και με τη βάση OrbitDB. Η αρχιτεκτονική της υπηρεσίας φαίνεται στο σχήμα \ref{figure:4-3-concordia-application-architecture}. Μέσω της εφαρμογής Concordia οι χρήστες μπορούν να: + +\begin{itemize} + \item περιηγηθούν και διαβάσουν το περιεχόμενο της πλατφόρμας + + \item δημιουργήσουν λογαριασμό χρήστη + + \item δημοσιεύσουν και τροποποιήσουν προσωπικές τους πληροφορίες όπως η τοποθεσία και η εικόνα προφίλ + + \item δημιουργήσουν θέματα (topics) + + \item δημιουργήσουν ψηφοφορίες (polls), καθώς και να ψηφίσουν σε αυτές + + \item δημιουργήσουν και τροποποιήσουν μηνύματα (posts) + + \item υπερψηφίσουν (up-vote) ή καταψηφίσουν (down-vote) μηνύματα άλλων χρηστών +\end{itemize} + +Η υπηρεσία αποτελείται από κώδικα γραμμένο σε Javascript ο οποίος γίνεται διαθέσιμος στους τελικούς χρήστες με τη μορφή εφαρμογής διαδικτύου (web application) μέσω ενός διακομιστή (server). Παρόλο που η υπηρεσία προσφέρει τη γραφική διεπαφή χρήστη μόνο στην αγγλική γλώσσα, έχει παραμετροποιηθεί ώστε να είναι δυνατή η εύκολη μεταγλώττιση της χωρίς την ανάγκη πραγματοποίησης μεγάλων αλλαγών στον κώδικα. + +Χρησιμοποιείται η βιβλιοθήκη React για την οργάνωση και ανάπτυξη των συνθετικών τμημάτων (components) του γραφικού περιβάλλοντος. Για το γραφικό περιβάλλον γίνεται χρήση του framework της Semantic UI. Χρησιμοποιείται η βιβλιοθήκη Redux για τη διαχείριση κατάστασης της εφαρμογής (state management), % todo: find a better greek translation +καθώς και η βιβλιοθήκη Redux-Saga για τη διαχείριση ασύγχρονων παράπλευρων ενεργειών (side-effects) σε ένα σύστημα βασισμένο σε συμβάντα (event-based). Άλλες βιβλιοθήκες χρησιμοποιούνται για διάφορα μέρη της υπηρεσίας, ενώ χρησιμοποιούνται επίσης τα αρθρώματα που περιγράφηκαν προηγουμένως για την επίτευξη διαφορετικών στόχων. Ο πλήρης κατάλογος των βιβλιοθηκών και αρθρωμάτων μπορεί να βρεθεί στον κώδικα της υπηρεσίας στο παράρτημα. % todo: add reference to the appendix containing the code or a link to it in the repo + +\begin{figure}[H] + \centering + \includegraphics[width=.7\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.2.concordia-application-architecture.png} + \caption{Αρχιτεκτονική υπηρεσίας Concordia Application} + \label{figure:4-3-concordia-application-architecture} +\end{figure} + +Για τη λειτουργία της υπηρεσία Concordia Application είναι απαραίτητα τα αντικείμενα (artifacts) που προκύπτουν από τη μεταγλώττιση των contracts και τη μεταφόρτωση/δημοσίευσή τους στο blockchain. Για την εισαγωγή των artifacts στην υπηρεσία έχουν αναπτυχθεί δύο μέθοδοι. + +Η πρώτη μέθοδος είναι η μεταγλώττιση και μεταφόρτωση των contracts πριν την παραγωγή του πακέτου λογισμικού της υπηρεσίας για τελική χρήση (production build). Με αυτό τον τρόπο η υπηρεσία θα έχει πρόσβαση στα artifacts μέσω της βιβλιοθήκης που παράγεται από το άρθρωμα concordia-contracts. Αυτή η μέθοδος έχει το μειονέκτημα ότι το τελικό πακέτο λογισμικού (production build) ``δένεται'' με όποια συγκεκριμένη έκδοση των contracts είναι διαθέσιμη κατά τη δημιουργία του πακέτου. Αυτό σημαίνει ότι σε ενδεχόμενη ενημέρωση των contracts πρέπει αναγκαστικά να δημιουργηθεί και νέα έκδοση του πακέτου λογισμικού της υπηρεσίας Concordia Application. + +Για την αποφυγή του παραπάνω προβλήματος αναπτύχθηκε η δεύτερη μέθοδος προσκόμισης των contract artifacts, η οποία είναι η λήψη τους (download) από μία άλλη τοποθεσία στο διαδίκτυο. Σε αυτή τη μέθοδο, η εφαρμογή κατά την εκκίνησή της πραγματοποιεί ένα HTTP αίτημα (HTTP request) σε διεύθυνση η οποία δίνεται ως μεταβλητή περιβάλλοντος (environment variable). Η απάντηση του αιτήματος αναμένεται να περιέχει τα artifacts ώστε η εφαρμογή να τα χρησιμοποιήσει. + +\subsubsection{Διανομή} + +Η υπηρεσία Concordia Application πακετάρεται μαζί με τον διακομιστή nginx και γίνεται διαθέσιμη για χρήση ως εικόνα docker (docker image) μέσω του αποθετηρίου εικόνων dockerhub. Κατά την εκτέλεση της εικόνας οι χρήστες μπορούν μέσω μεταβλητών περιβάλλοντος να ορίσουν παραμέτρους της εκτέλεσης όπως η διεύθυνση του εξυπηρετητή (host location) της εφαρμογής και οι τοποθεσίες των υπηρεσιών Rendezvous Server και Contracts Provider. \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.3.concordia-contracts-migrator.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.3.concordia-contracts-migrator.tex new file mode 100644 index 0000000..0025d84 --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.3.concordia-contracts-migrator.tex @@ -0,0 +1,16 @@ +\subsection{Concordia Contracts Migrator} \label{subsection:4-3-3-concordia-contracts-migrator} + +\subsubsection{Περιγραφή - Στόχοι υπηρεσίας} + +Η υπηρεσία αυτή αποτελείται από ένα εκτελέσιμο πρόγραμμα γραμμής εντολών βασισμένο στο άρθρωμα concordia-contracts που αναλύθηκε σε προηγούμενη υποενότητα (\ref{subsection:4-3-1-software-units}). Το πρόγραμμα, κατά την εκτέλεσή του, μεταγλωττίζει τα contracts και έπειτα τα μεταφορτώνει στο blockchain το οποίο είναι ορισμένο με χρήση μεταβλητών περιβάλλοντος. Τέλος, αν οι κατάλληλες μεταβλητές περιβάλλοντος είναι ορισμένες, το πρόγραμμα μεταφορτώνει τα τελικά artifacts σε αποθετήριο Concordia Contracts Provider. Η αρχιτεκτονική της υπηρεσίας φαίνεται στο παρακάτω σχήμα (σχήμα \ref{figure:4-3-concordia-contracts-migrator-architecture}). + +\begin{figure}[H] + \centering + \includegraphics[width=.6\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.3.concordia-contracts-migrator-architecture.png} + \caption{Αρχιτεκτονική υπηρεσίας Concordia Contracts Migrator} + \label{figure:4-3-concordia-contracts-migrator-architecture} +\end{figure} + +\subsubsection{Διανομή} + +Η υπηρεσία αυτή γίνεται διαθέσιμη για χρήση ως docker image μέσω του αποθετηρίου εικόνων dockerhub. Οι χρήστες μπορούν χρησιμοποιώντας μεταβλητές περιβάλλοντος να αλλάξουν τη διεύθυνση του blockchain και την τοποθεσία της υπηρεσίας Contracts Provider στην οποία το πρόγραμμα θα μεταφορτώσει τα contracts και τα artifacts. \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.4.concordia-pinner-service.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.4.concordia-pinner-service.tex new file mode 100644 index 0000000..6c9386c --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.4.concordia-pinner-service.tex @@ -0,0 +1,22 @@ +\subsection{Concordia Pinner} \label{subsection:4-3-4-concordia-pinner-service} + +\subsubsection{Περιγραφή - Στόχοι υπηρεσίας} + +Η υπηρεσία καρφιτσώματος περιεχομένου (Concordia Pinner) αποτελεί μία εφαρμογή τερματικού (temrinal application/cmd application) η οποία στοχεύει στο καρφίτσωμα (pinning) του περιεχομένου που αποθηκεύεται στο IPFS μέσω της βάσης OrbitDB. Η υπηρεσία είναι γραμμένη στη γλώσσα προγραμματισμού Javascript. Η αρχιτεκτονική της υπηρεσίας φαίνεται το σχήμα \ref{figure:4-3-concordia-pinner-architecture}. + +\begin{figure}[H] + \centering + \includegraphics[width=.6\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.4.concordia-pinner-architecture.png} + \caption{Αρχιτεκτονική υπηρεσίας Concordia Pinner} + \label{figure:4-3-concordia-pinner-architecture} +\end{figure} + +Η υπηρεσία αυτή υλοποιήθηκε για να εγγυηθεί η διαθεσιμότητα του περιεχομένου του συστήματος που αποθηκεύεται στο IPFS (τίτλοι θεμάτων, περιεχόμενο μηνυμάτων και άλλα). Λόγω του τρόπου λειτουργίας % todo: insert reference +του IPFS, το περιεχόμενο που αναρτούν οι χρήστες πρέπει να καρφιτσώνεται από άλλους χρήστες ή αυτόνομες εφαρμογές, όπως η υπηρεσία Concordia Pinner, ώστε να είναι διαθέσιμο. Αν το περιεχόμενο δεν καρφιτσωθεί, τότε θα είναι διαθέσιμο στους υπόλοιπους χρήστες μόνο από %todo: fix gender stuff +τον/τη δημιουργό, έτσι αν αυτός/αυτή δεν είναι ενεργός/ενεργή στο δίκτυο, το περιεχόμενο θα είναι αδύνατο να βρεθεί. + +Η υπηρεσία συνδέεται στο blockchain από όπου παρακολουθεί την κατάσταση του συστήματος και ``ακούει'' για νέους χρήστες, θέματα και μηνύματα. Η υπηρεσία συνδέεται επίσης στο IPFS, έτσι όταν δημιουργηθεί νέο περιεχόμενο στο σύστημα το καρφιτσώνει αυτόματα. Με αυτό τον τρόπο, διατηρώντας την υπηρεσία πάντα διαθέσιμη, για παράδειγμα εκτελώντας τη σε περιβάλλον διακομιστή (server), διαβεβαιώνεται η διαθεσιμότητα του περιεχομένου. + +\subsubsection{Διανομή} + +Η υπηρεσία αυτή γίνεται διαθέσιμη για χρήση ως docker image μέσω του αποθετηρίου εικόνων dockerhub. Κατά την εκτέλεση της εικόνας οι χρήστες μπορούν μέσω μεταβλητών περιβάλλοντος να ορίσουν παραμέτρους της υπηρεσίας όπως τη διεύθυνση του εξυπηρετητή (host location), τη διεύθυνση του blockchain, τις διαδρομές αποθήκευσης των δεδομένων στο σύστημα και τις τοποθεσίες των υπηρεσιών Rendezvous Server και Contracts Provider. \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.5.concordia-contracts-provider-service.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.5.concordia-contracts-provider-service.tex new file mode 100644 index 0000000..f99d1b9 --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.5.concordia-contracts-provider-service.tex @@ -0,0 +1,18 @@ +\subsection{Concordia Contracts Provider} \label{subsection:4-3-5-concordia-contracts-provider-service} + +\subsubsection{Περιγραφή - Στόχοι υπηρεσίας} + +Η υπηρεσία Contracts Provider αποτελεί μία βοηθητική υπηρεσία η οποία υλοποιεί ένα απλό αποθετήριο για τα contract artifacts. Είναι γραμμένη σε Javascript και διαθέτει δύο HTTP \textenglish{endpoints}, ένα για τη μεταφόρτωση (upload) των artifacts προς την υπηρεσία και ένα για τη λήψη (download) από την υπηρεσία. Η υπηρεσία υποστηρίζει επίσης την επισύναψη ετικετών στα artifacts, όπως η έκδοση (version) ή το κλαδί ανάπτυξης (branch, για παράδειγμα \textenglish{master/develop}). Η αρχιτεκτονική της υπηρεσίας φαίνεται το σχήμα \ref{figure:4-3-concordia-contracts-provider-architecture}. + +\begin{figure}[H] + \centering + \includegraphics[width=.6\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.5.concordia-contracts-provider-architecture} + \caption{Αρχιτεκτονική υπηρεσίας Concordia Contracts Provider} + \label{figure:4-3-concordia-contracts-provider-architecture} +\end{figure} + +Η υπηρεσία χρησιμοποιείται σε μία προσπάθεια αποσύνδεσης της βασικής εφαρμογής που υλοποιεί η υπηρεσία Concordia Application από μία συγκεκριμένη έκδοση των contracts. Οι λόγοι που αυτό είναι επιθυμητό αναπτύχθηκαν στην περιγραφή της υπηρεσίας Concordia \textenglish{Application} (υποενότητα \ref{subsection:4-3-2-concordia-application-service}). Ωστόσο, η υπηρεσία Contracts Provider αποτελεί σημείο κεντροποίησης του συστήματος, για το λόγο αυτό θεωρείται προσωρινή λύση η οποία θα μπορούσε να αντικατασταθεί από αποκεντρωτικές λύσεις όπως η μεταφόρτωση των artifacts στο IPFS και ο διαμοιρασμός τους από εκεί. + +\subsubsection{Διανομή} + +Η υπηρεσία αυτή γίνεται διαθέσιμη για χρήση ως docker image μέσω του αποθετηρίου εικόνων dockerhub. Οι χρήστες μπορούν χρησιμοποιώντας μεταβλητές περιβάλλοντος να αλλάξουν παραμέτρους της εκτέλεσης όπως η διαδρομή αποθήκευσης των μεταφορτωμένων contract artifacts. \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.6.ganache-service.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.6.ganache-service.tex new file mode 100644 index 0000000..9f28f48 --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.6.ganache-service.tex @@ -0,0 +1,9 @@ +\subsection{Ganache} \label{subsection:4-3-6-ganache-service} + +\subsubsection{Περιγραφή - Στόχοι υπηρεσίας} + +Η υπηρεσία Ganache αποτελεί μία εφαρμογή τερματικού η οποία είναι μέρος της δωρεάν σουίτας ανοιχτού λογισμικού Truffle. Η εφαρμογή δημιουργεί ένα τοπικό, ιδιωτικό blockchain το οποίο ακολουθεί το πρότυπο του Ethereum. Επίσης, η εφαρμογή δρα ως miner στο δίκτυο, διεκπεραιώνοντας όλες τις συναλλαγές. + +\subsubsection{Διανομή} + +Για τη χρήση της υπηρεσίας αυτής αναπτύχθηκε μία νέα εικόνα docker που βασίζεται στην επίσημη εικόνα που διατίθεται από τη σουίτα και προσθέτει μερικές χρήσιμες λειτουργικότητες όπως η δυνατότητα αποκάλυψης των κλειδιών που δημιουργούνται κατά την εκτέλεση. Η υπηρεσία γίνεται διαθέσιμη για χρήση ως docker image μέσω του αποθετηρίου εικόνων dockerhub. Η εικόνα παρέχει τη δυνατότητα τροποποίησης των παραμέτρων εκτέλεσης με χρήση μεταβλητών περιβάλλοντος. Με αυτό τον τρόπο οι χρήστες μπορούν να αλλάξουν τον αριθμό των λογαριασμών που θα δημιουργηθούν, το ποσό του Ether που θα λάβει κάθε λογαριασμός καθώς και άλλες μεταβλητές. \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.7.rendezvous-server-service.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.7.rendezvous-server-service.tex new file mode 100644 index 0000000..5d6c638 --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.7.rendezvous-server-service.tex @@ -0,0 +1,9 @@ +\subsection{Rendezvous Server} \label{subsection:4-3-7-rendezvous-server-service} + +\subsubsection{Περιγραφή - Στόχοι υπηρεσίας} + +Η υπηρεσία Rendezvous Server αποτελεί δωρεάν λογισμικό ανοιχτού κώδικα το οποίο χρησιμοποιήθηκε (αλλά δεν αναπτύχθηκε) στα πλαίσια της διπλωματικής και υλοποιεί το πρωτόκολλο rendezvous για την εύρεση ομότιμων χρηστών (peers). Η υπηρεσία είναι απαραίτητη για τη λειτουργία του IPFS, ώστε οι ομότιμοι χρήστες (peers) να μπορούν να ανακαλύψουν τις διευθύνσεις των υπόλοιπων χρηστών του δικτύου. + +\subsubsection{Διανομή} + +Η υπηρεσία αυτή είναι διαθέσιμη για χρήση από τους δημιουργούς της τόσο ως εφαρμογή μέσω του αποθετηρίου λογισμικού npm αλλά και ως docker image μέσω του αποθετηρίου εικόνων dockerhub. \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.8.service-communication.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.8.service-communication.tex new file mode 100644 index 0000000..41f99c7 --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.8.service-communication.tex @@ -0,0 +1,26 @@ +\subsection{Διασύνδεση υπηρεσιών} \label{subsection:4-3-8-service-communication} + +Στο μοντέλο των μικροϋπηρεσιών, βασικό χαρακτηριστικό είναι η επικοινωνία των ξεχωριστών υπηρεσιών και η ανταλλαγή μηνυμάτων για την επίτευξη των λειτουργικοτήτων του συστήματος. Σε αυτήν την υποενότητα θα αναλυθεί ο τρόπος με τον οποίο οι μικροϋπηρεσίες επικοινωνούν μεταξύ τους καθώς και η φύση και το περιεχόμενο των μηνυμάτων που ανταλλάσουν. + +Στο παρακάτω σχήμα (σχήμα \ref{figure:4-3-communications-graph}) φαίνεται ο γράφος που οπτικοποιεί τα κανάλια επικοινωνίας μεταξύ των μικροϋπηρεσιών, καθώς και τα κανάλια επικοινωνίας των μικροϋπηρεσιών με το blockchain. + +\begin{figure}[H] + \centering + \includegraphics[width=.9\textwidth]{assets/figures/chapter-4/4.3.communications-diagram.png} + \caption{Γράφος οπτικοποίησης των καναλιών επικοινωνίας των μικροϋπηρεσιών} + \label{figure:4-3-communications-graph} +\end{figure} + +Εδώ αναλύεται η επικοινωνία κάθε μικροϋπηρεσίας: + +\begin{itemize} + \item \textbf{Contracts Migrator}: η υπηρεσία εκτελεί αίτημα HTTP κατά την μεταφόρτωση των \textenglish{contracts} στο Ethereum blockchain, επίσης εκτελεί αίτημα HTTP για την μεταφόρτωση των contract artifacts στην υπηρεσία Contracts Provider + + \item \textbf{Concordia Application}: η υπηρεσία εκτελεί αίτημα HTTP για την λήψη των contract \textenglish{artifacts} από την υπηρεσία Contracts Provider, εκτελεί αιτήματα HTTP για την διενέργεια συναλλαγών στο Ethereum blockchain και τέλος δημιουργεί κανάλι UDP επικοινωνίας με την υπηρεσία Rendezvous Server για την ανακάλυψη ομότιμων χρηστών (peers) στο δίκτυο IPFS + + \item \textbf{Pinner}: η υπηρεσία εκτελεί αίτημα HTTP για την λήψη των contract artifacts από την υπηρεσία Contracts Provider, εκτελεί αιτήματα HTTP για την ανανέωση και παρατήρηση της κατάστασης του contract στο Ethereum blockchain και τέλος δημιουργεί κανάλι UDP επικοινωνίας με την υπηρεσία Rendezvous Server για την ανακάλυψη peers στο δίκτυο IPFS + + \item \textbf{Rendezvous Server}: η υπηρεσία διατηρεί ανοιχτά κανάλια UDP επικοινωνίας με τους ομότιμους χρήστες μέσω των οποίων ενημερώνει την λίστα των διαθέσιμων, ενεργών χρηστών + + \item \textbf{Contracts Provider}: η υπηρεσία δεν υποκινεί καμία επικοινωνία παρά μόνο απαντά σε αιτήματα επικοινωνία από άλλες υπηρεσίες +\end{itemize} \ No newline at end of file diff --git a/chapters/4.application-implementation/4.3.implementation-architecture/4.3.9.data-flow.tex b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.9.data-flow.tex new file mode 100644 index 0000000..dc7b133 --- /dev/null +++ b/chapters/4.application-implementation/4.3.implementation-architecture/4.3.9.data-flow.tex @@ -0,0 +1,28 @@ +\subsection{Ροή πληροφορίας} \label{subsection:4-3-9-data-flow} + +Στην παρούσα υποενότητα θα αναλυθεί η ροή της πληροφορίας στο σύστημα. Λόγω των πολλαπλών υπηρεσιών, της κατάτμησης την πληροφορίας και των διαφορετικών σημείων αποθήκευσης της, η ροή της πληροφορίας στο σύστημα ακολουθεί ένα σχετικά περίπλοκο μονοπάτι (σε σχέση με κλασσικές, μονολιθικές, κεντροποιημένες εφαρμογές). + +Αρχικά θα γίνει αναφορά στη διαδικασία αποθήκευσης των νέων πληροφοριών. Η μοναδική πηγή παραγωγής δεδομένων στο σύστημα είναι οι χρήστες και κατ' επέκταση η υπηρεσία Concordia Application, εφόσον είναι η μοναδική υπηρεσία με την οποία αυτοί αλληλεπιδρούν. Τα δεδομένα που δημιουργούν οι χρήστες (πληροφορίες χρηστών, τίτλοι θεμάτων και περιεχόμενο μηνυμάτων) κατατέμνονται πριν αποθηκευτούν. Η πληροφορία που εισάγεται στο σύστημα διαχωρίζεται σε δύο μέρη. Στο blockchain αποθηκεύεται ένας δείκτης προς τα δεδομένα, ενώ τα πραγματικά δεδομένα αποθηκεύονται στη βάση OrbitDB. Ο δείκτης εκτός από την άμεση χρησιμότητα στην εύρεση των δεδομένων, παρέχει και την έμμεση λειτουργικότητα της δημιουργίας απαραίτητων μεταδομένων όπως ο αριθμός των θεμάτων στο σύστημα ή των μηνυμάτων σε ένα θέμα. + +Από την πλευρά της εύρεση των πληροφοριών στο σύστημα, η ροή είναι ως εξής. Αρχικά, είναι απαραίτητη η αναζήτηση στο blockchain για την εύρεση του δείκτη προς τα δεδομένα. Έπειτα, τα δεδομένα μπορούν να ανακτηθούν μέσω του IPFS από τον εκάστοτε χρήστη ή από κάποιον Pinner. + +Τέλος, παρακάτω δίνεται ένα παράδειγμα εισαγωγής πληροφορίας στο σύστημα και έπειτα ανάκτησης της ίδιας πληροφορίας. + +Έστω, χρήστης που δημιουργεί νέο θέμα. Τα δεδομένα που παράγονται είναι ο τίτλος του θέματος και το περιεχόμενο του πρώτου μηνύματος. Μεταδεδομένα της δημιουργίας είναι η διεύθυνση του/της δημιουργού του θέματος. Για την αποθήκευση του θέματος στο σύστημα δημιουργείται πρώτα συναλλαγή στο blockchain ώστε να δημιουργηθεί μία νέα εγγραφή στον πίνακα των θεμάτων. Η εγγραφή αυτή δεν περιέχει τίποτα παρά μόνο τη διεύθυνση του/της δημιουργού χρήστη. Αν η συναλλαγή είναι επιτυχής, θα επιστραφεί ο αύξων αριθμός του νέου θέματος. Έπειτα, στην προσωπική βάση OrbitDB του/της χρήστη και στον πίνακα των θεμάτων θα προστεθεί εγγραφή με αναγνωριστικό τον αύξων αριθμό του θέματος όπου θα αποθηκευτούν τα δεδομένα του τίτλου και πρώτου μηνύματος. Στο σχήμα \ref{figure:4-3-data-flow-insert} παρουσιάζεται γραφικά η διαδικασία. + +% todo: UML diagrams might be wrong, should the ethereum and orbitDb blocks be continuous? +\begin{figure}[H] + \centering + \includegraphics[width=.7\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.9.data-flow-insert.png} + \caption{Διάγραμμα ακολουθίας δημιουργίας θέματος} + \label{figure:4-3-data-flow-insert} +\end{figure} + +Έστω, χρήστης που επιθυμεί να διαβάσει το προηγούμενο μήνυμα. Αρχικά, πρέπει να διαβαστεί ο πίνακας θεμάτων από το blockchain. Η πληροφορία αυτή εμπλουτίζεται από τα δεδομένα του κάθε θέματος, τα οποία ανακτώνται από τις προσωπικές βάσεις Orbit κάθε χρήστη. Έπειτα, εφόσον το θέμα βρεθεί και ο αύξων αριθμός του είναι γνωστός, πρέπει να διαβαστούν από το blockchain τα μεταδομένα των μηνυμάτων του θέματος και συγκεκριμένα η διευθύνσεις των δημιουργών τους. Τέλος, μέσω του IPFS πρέπει να γίνει αντιγραφή των προσωπικών βάσεων των δημιουργών του κάθε μηνύματος και να αναζητηθούν σε αυτές τα εκάστοτε μηνύματα. Στο σχήμα \ref{figure:4-3-data-flow-read} φαίνεται το διάγραμμα ροής της πληροφορίας κατά την ανάκτηση πληροφοριών από το σύστημα. + +\begin{figure}[H] + \centering + \includegraphics[width=.7\textwidth]{assets/figures/chapter-4/4.3.architecture-4.3.9.data-flow-read.png} + \caption{Διάγραμμα ακολουθίας εύρεσης και ανάκτησης θέματος} + \label{figure:4-3-data-flow-read} +\end{figure} \ No newline at end of file diff --git a/thesis.pdf b/thesis.pdf index e293b20702aba1346c1f9564896deb8848662feb..adcd9ba843a16c0ece1caba0a65845b9abdb2366 100644 GIT binary patch delta 61613 zcmY(|Lv)}`urT1*wry)Bwr$(C`GynQw(W^+XOc-Wv2E+ipYz|%y^Ckjy=qj|={o(; zSPOC0R0|Op3K|L)3LXj(3Kvhcw z`=YB#jcN#Acl(1{594F_pY(arPH9B`34DNiBggj0(ufWl6VGx5NF?#C{#~vGpBT0d zg(t124k!kW^?j=>Vtv7Vj3zkV;XLKUKXc(^I{i3(83B*qsZBcqopgX7vcCGq_3&V#MN8h0LGT_Fk zDBhj?8?=X}wbk>`}+u`-c{ zsY5=A;8jI_{8CeaKS|W1T8dJJvo8E8K)Ds$Lapa-N6-)KoV9Dc)S|KPP~~K&3EK`X zJBIys8qpb%gZqoU3YH|cH{_0S_fv5a3Kh*UM!n%^5B)?YWq)c|o4d+Habc44DQtO6 zYZa@Rmc;v^fWVMKSDql1DnOK;f&Pt5a^zs2^RFHk>&s|c?BxqnklR5hP7gKuQ3m-j zoNc7HRreV1%;wy@fZax8r`-4k=J3nAe=B`3@lAwjcER-#f<6{^S1$Nzfptuo+c45! zy=^=+XnBm`R(k(W6d`474~L7tV>3jVltH+*h^`FeG}=vU-aX2IEZOgn3Kao}w($b^ zkXp!d^v1Ug=4l6ni_$gUOm=8F@)cUxf8vdqqFq)T_oZ5yQo^ZdqxiH{XfSx&fx=ax zq(8F@Fk$GYvAOMrx3CkSAaH3!nmA-wXUo8RD8z+!(m%KH`9V9zZgjr{aBk{iA9j_lVhIyPjDy14-Iz#neB_-}-grqI~)G&1@j9vwAN2x;Ojt z!J$hlmk;aNFXbJ3Hm|2nK92f`y5XVZId*YJ52`iqQgOq!0uF4@T=WzU)2 z8K34)Zcjt^^XP{_{sgmyU_GEe7w|E3oBjIg(fC>n{{=VSXY`n7>C7sd?(cduj6A_w z0?t@_!17b81OBIazwt*uHMUB+&gf-h;V9@51Pcdw6g^sJO15ofEW8KTh!JR=HikH% z1&_5G?Q&v)0Yi*&M+0=b4>e+P6y>r_BhHu<*ewic9Fi6vRG`1p)*#5*511j0r9(Xl zXo737zghYwVx%UcxaeW(%xDtOHQ@c?dP=TuyinRLCY-4pJUbj9IYN^U>G^y3_`sb4 zo)aP>$dH$zDm4l}9zTtq1W`Rgdy|3)-ik@YiOU_mgQ}qRznz#fDi;@ z43bwvstIViNd#^TPl;6ognThLkzHvWZ>325=;&l^ERsh&1f9FlptIFRXSA(h2^)qmd2O zjW7_BSIUMIy@1XqCJyh7cjF9VK*BCk=~v$ELfwI$)3s z<%bs>eql7KK(j?T>O#t|Qdykr*CBf+f*4_qQ1Ii>0Ge!GSTcL8dWeVy6WKGRHu6gGz}AuY|lp;fSypkY_N3LcaKEhLQ6R3egR=wl6U`;PTNCrC??8M+j!D`}X}*=*$tpvYpJ z<5|*XtLD=~AtyA2@~rFO2R|Rl%zr7kY^jjuro0^Tl3m5vN)1D%LHt1}7Q+8Es&7=B zZXNNGAfklv7wK^p!M(w}Ah}<8kYneuzY2?5ZZyhk_CVL}kcWsC*oG2Zf{_VqaZu{? zUJFEY%84qu2k~*hq@%IoF->;8+1aZdw(d_SeSsV4Qn&gKg(%@~2WEkC8K`0Sj_`?$ zD7>uUa>K1V*`TfHNu+>{9WM*}5$kbGpL3Bt_6LdpOzvwAtM6(T?u$@=+k*Cs5atYt zvxTmzdgZiFyb&i4&|9Sf9Von^b*B(J2T79T)E8F+em;K<$C6pcJ?&|}ECjg_e>px6 zJ}ZTTo0fy$_zY%?gmFOh9g=Pmi^o%X>#Mw!krB`64Qf4yT%A-G5J8Jt`-KS}wII0% zWhjG^^OIART6k|&ao4|s3yD-$%I)y zFBcR$&&|s-LFgoE3SL3!*wueWP@qbseeV^xmx71>XM$g=(-<6`Q32dv${FshP0i1) zi)_acg`&00x*wTVp^{}_FD#OnKDxZ$+$0<74Kx`2SL2cw;!`IZ!U9#+Tj5jLQhLVz zcCe{Ay{8nGrCxoj&0UAFeUqBGr+!QqQ0n3=EP9aPE%Rf@tuIb3*4LY+Q@Ko3=n7)S1r0|Px=+# zdD(eh$<*io^Cs7dhOQYc$GUx5@Q0vHpjsa%J{Z8lgmfh*AFF?c^1tj4)r({xDuPoT zKctfiu#=SJ+39Z)@@_Cn@cGLZ^tH6Gi{!>x*fh*Dm^Fh(O+>0t&|4DHnJuJySBcw5 zDZ$$~<5K&5yiqEJZNvZSj&hgPS>x*25MRI>Q7dE_JRz(sM~pMV7Vo|{*Tm5xAWgmq z3kcU!4NDVb{{4b6|Gl+oJ`jAO4`QpTQET$&2cc|OMt(lC2KAI@=*F)r+lFKjo??bX z0hWDtzxh4rkh1HH<%`DO7(SXFH^lBVS1LVq`q5uv(yD-WtAXQ!PvaaOoE)OLc~_-Y zAxmhQ^CrnJq9&CzFfUCI2GBoWzD_PJ{y;MqkM6YQ)be@pV|8)z$gN51=Coq^7cVvF z_D-pe@!oJ9%W?UNZ*tV`p({RdJtWFH1Jhib0`~n3QY=UaG6H&Mf)1>2*uY3g|)lKqbC<=NTA$G zqyIW7wHZ3SX1ez>Z0@?zzMh?fxHo7l`;;G5%o7s1C;|>Lya{CJKo}h^WMu^weWIwm z417H@QlMsFmc!=vUu!wjBOxkng}5=z3aqh%T@sQyq4%|TtI>@TiK~fqxT>~)j@Mbo zh6x5`b*0mA84TP>joNwF0~PvrYk*z4NdONOc*%sy1enI^Y+0b*TxC4!dL(86Yo&1$ z1w_;6Y6heX|1YPB%GiM**YF8~K2jx1OJM^KKEtp9Z*wF6KXYToOi~PX@PlPp)UrX zCFmC1!bvYb7uM~C6qZ5ztdeyR#Q?v>w^0F24?PGUrn0FOu?Q~AH4snNw^*~;-@`b z5+C&SF|$#h?@u+4*Z{s`aZq|hjnqN6&O|xTx%B@A46jCW@0Hl!urSwX6Q1ChVEP5A z{4ct)A=4~RRL1=w(JM-W!JD+~y5Y(;|87{{!ih#889?$=Rak5k!FdmzHS+1GZz0_= znN+d_d9|3^O{-znXtfa_nybjwpsVbTtob$b^BDXI_w4Rjtpz}19f{b};aGM^txXzz z%MQY6(Wo4-LmF=SXRFPU6rj$ZQ9fJbGfVCZK-#Y9YkY6M9;Z|T{=2d0;_rKDU%Rkt z%*~%+-s(K``8ggkYadj~<<{g+7*g;|8dSLeFJvOigcn zI{aN<7YXau=CkDe|YNgYSY7=?Z{k#y!M#=I+9I@92zif19K#-Rl%%dR8jGp zO8~nUTA-0i7aOZQ!z<26l{8DWTY#qdjhw>eumj-9?CULfx9Jk-C0H=SucFXccvy9xu(Kn7aHp-+(@Xz}4mbufRa%>)C!V%61@5 zi3!NM>4(dD=HnJ+{K0+vAkB??y^X^{S;glvIm~Op)>GLB*fqmxnN?lR1-?0|5{lpi) zxc*0l;ENO%xuz&>=59=7EJ;wYJ(?ZCRZ<~PgFNQP?Tc(JWO3;aLgV3B4XSz38DD4U zZQ?<9$W#S!tT8zd^)siMRh}6L1GadiITBf7Y%gL~A|hw>%fpK%DQv$S^?z$|Ws^Xu z2V$qL{hz=s*}ws^rkGo}pUb%N$%9*}MJdaSmv}!F1@1jZKmT-H&ds&mUxH=n_r)R4 z5PDCiZplg_JP5+|?8zZfv>yPogZ#Nr4+aMqI%xiinhB>ckg1!&pQ*D?gij3C{dtay zU3IJXzfbk~i{-%6Qd=`q`Yh(SCClY*L6bir*&F@nFK9lfo#tVZ{sC$(AD+%i{)1Mj zdY%Q>r=$X0&F?-t87k#Z`Dde{0qOHk8?gqyKW%<=)}&s5J3s=mhEh*JkokBzsFVPD zc+fTeH-c}3--x~ue6`L5m2axw)V`^I)A*+OP3xQXH=S>~-}Juee>3=I_|52>@i&ui zrr*rInSZnRX8FzPoAo!FZ?@m;zS)0s_~!V{sXgf0*-{^jle_&)&SeV{5Eji?G#C#n zCUZ&3O-m;F009R2&k9ECajNeLL| z`C9C*`&|fuWk&{~O1Q!uu+qK}a&hd5v+~dYw%JGF&w&An#2tCcH3#!i#@3}=VEHR( zxqQVhcM>(z{`w%It($z(Bb%UZFJ?DAFp`iv7BlkBQITQ!{Q9!d0M@-y03>$n@$*@Mes*z1%y>F$R(;7wH=Eh8sypGK5d zUe89&+VeZLVo)Lt&<9v_-Bn9GODv>!EXUF@;#X9ymoag%VYR9q*`@OcjCHu2F|XO6 z3QxUR3W^DCy0t=94-SSycmaeb3@)`Jq{L`p$MdFN>P4R_h02d*- z61mD*%Y#=JT2R|SOs$h5W2Tz<#6%OSsZTJ$KKPV`CBB=3iv@NRhsi3NXS(7E{t$fg zpZ%}~(Qpi+%T{3FjnRh{C#w*j_3D>=m_a6aWdAm0XgbefE~sItnX6T!zQvre0B^He zMK|3vZjTAh^0~4Q%hKYISSkL>ot*tdW3dXsN;awUkqZqFmyb&@3IFm#*?Lzs6?8wL zvX24upPGS^rZ7aRD?iQYsv33M^DBe!s!axeC}u@HB${p9LaZREvW2l+<;uw271f%$ zd&V0@abc<(?n`eQ-B^Sy?e(KL7K5<|L9kn~%}p5T9Tlz-ed_UFxdS_iQayer){sq| z+MM6f9~1XLvCWjM3HH4LRf?K(iEX^l+j4o)k^Zmx<3{Zgd3fKE0AZn;YE*SJ-ISDt z-brUSd;l(zLRxg(X&XnIu-H$Q$9-LBb!1jBYfW|A2f9!bmjY#VE?kswYA1=d0%-z; zHp<}vFA|F2q9B4%xM15Cff9AtL3-i6X^8-tQ7Rsgg*9hF>ZDdJ)@{1KUuwkT-j3gW zb`1YT9X8Zg!gDICRU;p6h&)rrwEX6Nk{{kj7?3u2)ER=@SK{_!CE>{$8TIRmDOI|K zsV!3_frv)DQ^b5?-Zn>RCA5hmg=Rv2RSR2l9jnU-w_+pDx1(88a9tG?d=#(}lBX zG%K3Smc?5-HY2KruVmcjdHn2SFS9z158nf3ZR%BZ_le%Ek^sKMb@MY4p6^+DHHPdY z&MyAw)*6OdUKoi^ZAi&|x9vaUTBI2MDzZ|$`qA3NRiz5Md_z7+@n z!o7`9N?HTb174pG4e&h?UT?9WjfH8}6 z5a|@kli*SsLdkPEnc3nn+61+Ev(yf7P2wd_q$=r)VKPzkIASVH%!G@58bEyL^HhY* z`%d;<$p|oc(U%gaqhX05=WiRn_6k5T!Je&?@&ubvPGO4=Oi}3hGD@ZN&k2)vMdy>1 zci6L+^md+HfPoO{yeUeAevXWd;QM&-D(6F7q zA})79#=@l4Xoq_M;D?_wfrHH8B+}UaQ;1!7twiU`4I@rSY5>S7o;~H-q_}|KU=YJW=i{!=vLsCbgBOmVrk`2h>84?4}s_HM4$8Y^E+Kwi}wAafR6#$7>(vrTG^!kSIa zVYEuvxMdgBmXZ=UCWIUZTO}=VYkh(Jx<@0aI8=5Q;B%R6Uh&XU4PR6n#yv|Yz&{=-A(POCMJNA<$vj4db}{a zKeTG-0~2d@4eGt`^)c@jD47XS*r;DGa5zV`_XcKi`@**hTH@ zh{iT;vnMV%%wV5--n^Lg><4?zwydCQ0`wI8mA{a8*mgD!XLu}Y*C5TwV!taQdv`G=jq+WQ00%l+ z7hcdZij%Uv@FzPE9;?XGJMpqq`+Tp6oF&jdBE z&biUlmhlq{T}*XOs8Sh@k%H!qWF80i#vJIYc-&-^{eeCorF?%X`!wX}^jC8>!NTS% z!Sg~9fx3tUZ}fCWyCx;dBXB%-lz%VEL5nx>n=3Q};QzJ1^b28tm(nsk15VQPp1bP$ z&&0s?!rP$$H}o$qB{(wLg)L+ztBqvrYdW}@ z9r;L>{_J4qx_|?91GlioDXC&E72|fxMjYU}Ca8KBBBQY^4 zlhs+rzzXL5Pgd+@a%9{IIy9og;IJeUgkU&>65WQFJDD<=t9^D2_qO0fg~OiKU_tF{CrRo_RzSppr!Y}~ z-mc{@*$!eM_Vqd-)E0Kuatk(8jNSlk*?5ZwRMC^!QWXll@jL}4C&j#(CdzD$blTJ; z7WLZhs*P^rX^)IgOGHUTo#_`)qo@p*h_|pAq|GAL-P7HRFU+NtXRAqTFlHz|Kr2RJ zpH;tb*0bUE=GY5*uM6i~o^p@B5#eKc-jCzqWCjG_s>C7W;n z9$89&Xb$EjTy&HcuN3^g4^=>uSk$CC*`JahdYX}i=@QOqIm#MoTWV4F-I+5U3;c~8 z6bmVX7*{bic5pqWM10E@|s)jk~l$F%f{o3785*fh&Yev#t(usmg|uoZ zJcXP5swZUr-^Fam@v}R!An_s>6lvog2jj9Ha+4+!rs_(0)AGlWIC{Lhf89S2r5774 z)PnrbLDvN6=j{w{PJ`UTrjlioeWKos>_gIn$FMw;CA7`;N~{L~-$E*oD1vricfJKN z`OL6w*DjwQLkg{(`-%LTcQXyNH_vuuaZuE+gw``@DEf)NGDWb1-Dff7;O@RD-nM35 zB|eie$5TesdhX8P-vYDGHU_QH-a#&+3$GojovEbtC%r?Y&G{{w8y^au8{VM{h7G0! z<>xV7@VU}2a`eXDgC|t)v~o?Lb;N@tfK&CMLbyvzu89vbF-?QM!|TPw&xiRb9#eD3 zu_}}{PMxf)x62R7Gf2rw7yHy&085owwu}CnkMGBw3_WMed{}t1_=l9Ax`&&rCv98p zAVN=LVC7oSKmWfMZ2!eK z*W0a}-u&|TL-tj-xA`-6T>rOT;OkR%%_^*Df+-Xe(y7p^ovvVez z=k5i2zkJ^AJxlxY7q$;c@##Ki$a7j}f1kv3KOMe*C_5P4mAaL+_}nzjo{~wz28Oj1#zicvvTDrL2=9z8gu#oJ>*Sd(fDPn z-l%ytTV9ya^gx*fihvvb?8&sa`Q(+Nm!zH|D@-hK8|l^w8Z#|mGy}~l+NF5RXI*uQ z356uqB5&3bEjM=4DvNX`Bi2Hz0Ev|a2F;htG@H)*UT;AX=&Cvlywqv(Bt87xz=<4` zj=w90dN=BS07<7GX2|pqo)}I6yk8iVYsU;e<%V1ZtQ>Q)|4onM=q*0Ue4 z;1&i`4Z=DHAJef$vc{e+kwK`wRM^^$3~p(7t{rJMa^#stFe#}Ds^iic+>LvJyhO+W zxZfYbCLwOLAi*|)As9W7Ch=f{8}t+1#UMn{s=U!{-hToK9YhvX2+Bt~%5xa1N0DsF za3J+rZbAI8_;8TC<2FI;$wUm=DpE~~E3=zH^OTGTI8r0SfuQLQUPe!%JBVyR;tG~^ zUF7viAPD~v;e4#*1YAi^l3KlLYTy?h1+H3hh2kAv>E1o?>eNN+m{YrVaL5+&96FTgJh?uj7CIjaWJ8?$$7tw`{bD!x5pw zMIAm&LS0Hn%_59j0=rAV-D2fr&K#g*`3D>N^G}65@M|8A;asCYMKdM{E)Ea1t}~DN zx5$BU!ESrv02Ckn~ z!_^ckU>{)Z5=`79m}dmFln;q6y_+{q)e6#3ce~u!AwSl}x#`C0>KasWN=8OO--KS^ zh-h94TpKL)t3!ma^1-{|hK-|G*{u7^y=rZhXFaCj(*M@i8W?QHNeT-D%kn6aO(f-N z_;nZ51T&Zj8zY=yO&Q^g9-)-)jfE$MC6msnta@ptsy5pR)7Gg3rg?SBu$5SJSfOc6 z8n%OCm;?*7)C`D~?dM*_cPJK>B$C80Nu2ZnaUKy5Mm{`uPWm9oIZKdEzXlz9pR}_3 zqxDYNy4&!K_txnWbY)Q!D!9_Z*p1{SNuqR<`X!lfAq9TV78Uoka@0qNoV zf`YNCAH3TM)kD;mWn&(jF2gqLpo-fHQ8?SuL!U(Sfz0TQ42S)DPdVX%T|eJ~ugf{TY~|<=H@J`GOO)*VPcW$#sTWn5Dqm9+ zV{J}sl7g7_#QCu4jn;76Jo_o z4_fHSo|$4*3fMcqWIG>85!h73i{Ok6dm-ML?stkrG76iZHkfhSFh)_R&QigaIy zl`}jMf33jo$sJ<2TzI~u;zft#IU zoz7;Je^13OiQWhHe(`$8U>9F}bYYUpYw=OtJ9i;ii7a9NY$IOX^x;TMBG4-)C>LS7yUE6i>W_XA$CR{0q0KxVRul_)`w5V{xtfXB=#%2W zn-On)@nY8-jB5s6{1KwF^dAo0*KJ$!<<={c<1<8jx6)F`xzs+GI6^BUajI1p62a*o z#};?Qq69Oh_V?u~QnBFbCw)yE+~oV8>&A+$U~s0y*L1P(gLby)ZTdC(612wRM(bL6J&W)<#-J@g*p-s^%91;Yd$gh*>C^P$9b;Fc3el~SNXp_%__qGI92Sg7t8en z=6Rbopy>)l3ZnKN$JRV93mt#Tn&$kFHQg`{{^uL~R76VDa9%WY4e>{#kg_f`oPT~( zwl+@N)l!&2HZ}=pvYp0_+oATbbL+ZkgzcY+T#?P(u*<-GZ_+moAI_6_qOwf;K>RQ3 z1>f{CF6X!LpC07~3#&(Ex3OJG6l1CNTYQPe(X(geizQ^4dn?uSJ;wT&QvGA+sVZ3+ z_N8_2Lt|aA7PlENT=u_xf!b-CJhdHBRL8~DaL1S=$(*|Y2}VA}6s`xi*ZnW|H{qPn zuFlSBjb2X7acpL!+s)+Pxp7HpJi_W{D)~hjV3P}3|8a-onb_*Fdr@foh-q9eMsAJ1 zUyZG9u-^7?#F@Mv+{HU)wNn9=LS;4X>i_)nfSs4(tjm7mi{Ve z3?XiI^TG3AhLX9loZElU1F9=^EO;`(y39ARKkKJ~zAMV#GT93nz3?6PJaQQ1Be0v* zK5-6jn%BrW?U}sR_hrKtW)?9ocA_oUk6Tu*7hl}-sg7Xwy91CsyfK#t(m86}BNlEd zMUd=dkJ9emUWPwD9apqmw;tZU{^Ax3sOu>ZFO zcQA8J#}YI{O2?vbqXsyB{-4ggR%arPf)lA{PV)d+P3s*Dsr1*i%!x)dHp#tkU#0;>rurwbopT{S4Cdkq@0?#n#Y=Y zZO%ZGg?d&&Ppm6IAD<=SOFt+3y0gy1Ucy7Zg6mGPYo)!Jp1H8IO6Lv3G3h%x|NB<6 z1eUK|h36l*2jTYS4MDHUJ$@|j(lKX1AE}{ve8M?Tm<;=~?J*bC(G=KrT>vB%863?9 z@E*(%cPFwr`}O{&xFDj})OvV|bqr<$uHc2Q>DKVdiEzdc3T~p6_~`djKGysrSZ#7M z^{$i8(R`ct;{9Bc9RZ-j*TwE<5x7IMukNV zcj$U6?fNkKorzeL>xShI2U1`(eXqMaAb~ryW?!1w<-&2&mmwvspy_UY4<|zz?98OY;;zE<0%_7&?eX#uUq*y=rmfK72+!y1+l)p?GykJAIkP_$Wwk?$#B76;tF{&|dMBtK>}#6r{8)&uk1lTzBI+3xQ6(8Y6#o ztQneCaF}4+Kqkx=v12;2J(?e0=|Qp<=3x?ydwAlj)8riUxPiGirihcIZP&?#=ltO_fX`+G^*#d6A#vtvsG%v+_Icw%rl zzo#&A@c|VfmOFwNX{lFtp-~*hc@QX~BH?`t%w9fGxol_a|LQf9W}E{w(ReXMM}*o- zLU9d#haIO#FpesQ#x_pY0fVljWVn8#k=s`D z({LUGBr#NQ*!_wv@vUZWJ7Zi8e^fiHru=07Rd%>+5nE;TDzD2JqV$KV z`i5V?NsUM@tgDCIUc`s2j$vlhWrOPc`0f*Jg0XZ6*Twcd0r~W#tq}gt**r@^7H|ek zsEhOl3kQZ0Q7nT+q!LNBM3>rsd{hr|G!GT}`tkHe3GSdtzgG#&IS0qeF-3Ay%aH!I zjT2=1l8ehTJ3)jYOs`ccLh^>$7n9WVESBdW;YuO|j-+Zg+M?c`qLf$OROutl)oi@A zH)4W7FSU#n14LAdf|tf@M1(Cb(+-P9wg3K3sT%W5`zh&aRg2&L`>$wkS;uuATf7SU zym)kk1aaM!qG4ic9t8yKi7;O$oNh@4_u0Y6ubg+}nBYys56P*?Jwf{TIn@B7kQWwb z_@LpnjDE_<12k%|X_^`wCGPZ%u;{2qMT6m1M(xwq5g5=K(=JBQu@!~z`CRf||KJWO zHONBq@7nsgyPW@UQP=&Sa^KbDIZ=xPL%TYh+{5T->=r_9{Zs+5;+wKoFy1K@%+=q3 zC(gv5oE1)apo1{_I8vV27WF>X9kJu4`~>3Hh~4x^0uxiJXMg^40kft7ZCFB#t?MHl z673|>1ObSXq2A@$SEneWqzAMXT7S4~7J9U8Ec0D$DHE+l+ZT!?HVJP#iT}J)3f>4? zn!&)d>_-~DDNEd24W$iqxpDJ$co@_m6GH4bD)Z%`uzLrMt=IA}-VS#iGG>?@`e|2S z@4axCAzBNYX-86(?%0^1pdB4y%c9|9Ai32(5(~hAkCBYnL(N3OwS}!k4LZ2sFWNzQ zwhUIaRr95uoc@VG6(D6^S}aM0zl3mH!LHjN@vGS{)8NfKRz|=1>vD8Mn-vV|xaM=U zQE?pbd-(}=Fb>;`3n+gr9s6jw7i zxC5XwQ$5}}ySuE|H`&F;$;m7N$|@(qn#b8*e9$he{}9XlU~R-15Bld;+C~s+nTiWF z#2pi8SPfjQB!2Sr9InLD-`IAa-Dshh8_2$SsN9i}&u|k!iUasdQ+0&*3b$$)01jSE zMLmU8xV)!8_j2yDx6GiBW(qY_7HKQ&96-^+pqGx1FDz(d_o8ohU(jc!Qz%20no0$ zx*S2ZGjHLm5n?JL2Duqcq-k*wy%<5qy+OPtsKlUReK7zyu3M%1Io$utGVC+?4L+j4 zxrcglYrcRGke&Y_=4}nJp#8uwfvF>Nn`NJZ=;j51Iez9~-a^S|3ASgRV@YL`{U@t~@V4Xu+A)Di zCPUo2B2+*@H&5?B|5Hxn`>i`2tGk+1jq zFK`9}Sif{oL{Ic~fYGhs6^!jiIw`d~Ht^TU5M(HvBw5%6e!iUqdP-Iy#OOZ&RvTWu zh(b5FfONb_Yvdp2H5==-R;yc{~M;aDa7~ z!*An@kN&*7iIo0ay@TkmDLwi2tR{s?_DuV#Os_)^y{GZ7ehc%n5v&K@v(i9!z!erg~R7E!mpPZaQi7$p}$2Ui?_o@wG1#9Q@hfp zP;|_vA+I12^{y0n^)}W2!hoR~{0F?f_`ke0qVY#4AnU}h`Kp?yOCz^zQeUj=c-M^|T0s;EIYDBbW!xvbci7I`gJiKIA#md8g=N?u{pg3AW=?(u#kkGzAtgA~;R=Aa;Xcjpjy9s2brl_2c!@`^ zZ@@f(_^aSYa$Ip|gL@liJMF7ZE5aI=@sd-;PK|+Zv6|N-p^PdeFz0htDTA*jZpbZk z^=emA@zP7?hz#+J0(CN8a1PuPwv?p3X=eto+JTQ68lRYJv!+T$KWUkYQ{-*NUS+=Y z6d^1n7gRBm^&LcyTJ1`y2mh{rEi#rTAsEL!wVVunh-_*f9VzFi!?NsiHQ7+#H$#AT zCWT|nDaFm941$8I+~Klsr(E~vc%nra+LA=wF;&$!*3d-Nz;xYgJp{Zdzc@Ayxa^je z=YJ|vKG;EdP`995fK6HEM6h_q2_6DryxYD>J0xA=%VQ~&OfI)Y45Hv zS`s!2!`B19IY_VW8>-h;k<=ALTmKW2}v#4qC^Jb8Ty&X z^42vk7e?QhkA`c}i3f0kne!1_xR3im(U30o$I+YjzrD#QLrS@DR*5B;iO*WFF2Xly zyTLC6vdS~g*zxEvVzlrk?KbX2-BpIcNlxHA^Borpt7J)W`sJmQMl}+`IZDyLv+r0P zGgV=gh$U0C&YyvIRQQCd^@VC#nDHpQK&WMv!9%d0lOZQ-(E{xW{qrN9Lk1KRluaLG z__?CT=Uu7lBfb<21!15j=MN)m_ja1gJGY1j)*p{#erE)n2%wsoo_;p1YDrHr8O;&m zvCc|o!$I!&=l`skQR=898qfnWD&|IV5lcU*pW|&-KF`;aNNrq(M-L>lt&N=yd&+Vt zv;xqOuFd$-bb;3W2=yvgZ4xt9M$ydKji-EZEPo4%abN4H_$%i&>kpcmLv`kYvj*Q3d;uCSt%VKl-iJ3w~z`W_| zBS-_GQqVOXLg@fIp{=Yg8Mb;;7(#tHmDsy<+fS>{3xK19P_##IZovgL_qXP0#ak=U z=fI)l;Jez;X}LRyxBcm6P7hk|gH3IUNq}bH1z~b}5vtV3^y{QV5la+?@(=N%X9*5i z6VlHs6=StK|DtF>b=0#NVb@kzYjfjNbL(@X(CPePOI+7n)|K?+Q`NCL;kd#sP{laQ zRMwX84seilLuXXp(OM_5_%dbgnaPZSf8>_wIWy1@lO#_vYR0YO`dN<6_y986;`02k zwRz6u>h_=Wv1;I$*?5X}E#t-&l0OVp3x7!o4&`iZUY~-Wk=7rTmcg3b@t5o2Qq)&3 zR+HesTpi7h0?g@C8BNKtX=3Oc@$=jV7o5g*Ou+SL3q;N_6#?E^mbKk-?{T-0>k4mR zalegh_|I#6JURr=rJguf4||<#N%^UaFw2t5X*ox%t=JdBR~alBWc#M(f-H`+6gLnB z{M_~@NK{4Iz!;4)8Xlocz3`OdtR^Pv>s`r?7L2m(e1nJ7n%lIqVeANF zqyW?d!5r3Ut=z}WQcTDo>;qcLmM+~hV-v}A+R6{RCXmEhq})6y&@KBJiQoHhg9j-0 zuDC}P{JOtqLtF-GquaNnt`RX}$jotlr7aUjiAIkz|#cR(X3Ha=Hq&EoA^?2EuZ};86&JE6Xw1)%BwHE$Ht1ulxT4OMAs(;$K>$zi zMLu-IAeZ`T_ivlgYx>PKaZZS^58sl0?z5^J{;ihDyBzILy+&?79feX^LA-{v zadkMt4A&L!?S{vpLV>}4Ng?|r#(ali@JcmutgiiiYNer!MKOXUWaJmE))%wz1VM3> zH)>&tN$T4&N& z08ZDrX3k5@z9V6Nw&&~TYwi0(_I3C5Sc=H=(+QGkzVQjt)}!dn=KAGaaflx<;4Ju> zm=_Y_=Bo5@ib6IQ^ER@Jb9V8G5q~KLnl*eoza31z$H&@z&dw^YP&pOYyuyR-Za-?t zSvw=8?toYd?!;8YaT`QF;o7-FQy!e}JW81rMVA#)A?C#M;#QOL^La0aNo-dtyHxDq zg}_P7KVF?-ZbJ;>b-;Dlm7D^|LA!N}|6}L~xb^i$2B{pIBD2mRV5kyD(x z69VZN%qO^O_3xF#e}Qu-d~vAIZ^3ydUUaxD#ZwzQ^;>w0tt zTDtRWVg&;WhfD0f=z&BW-W2s*;h|f5G|~}qsEHnF1+37j1ZuU!OGm6!*-aHz^h$x> zg^*|4=)gn#e?+DlpXiN1gM>#2HNT!(NzpMbUPri74xj(kBihpP?L_ubNw&k>dekdd zZL0NRru@T>ro6p2LvryXMR=W~1^iTUW-8%^vi?Dpq{`-z9li#2H)mE~MN|`a6767Y zvr~>YZ%iF>qf%3R52wE%b#lWDnNLg#DWmppc4}63>>MFkkz#4USuD<~%^!hCc6RXv zA1PvP*4R#%04p=I_{zjkj`kp`Ke8|u$D_{`eQes9PQ&JGO~WP`uTFSIz-k6e9$LB` z&(5?N-mzioTx~~u4V7E#A^fs&N1z8bJZze>GQP5tLIdABYz)K0jF^)%CYs_VR(7rM zBxp|^kmN@Q!|eouh>aI3ds~$PF@O3m#Ap@USgl}`|2Fv%O=4W}|EM~r;7p@!Ysa>2 z+jhFsv2EM-7u&XN+qUg=>~!p$oPXC}wa>+K``)ZowZ=QW@~^!?^EDoF!mD_6tCP|UR2xeo8ro1NzOhVo=&f{k0fY8 z%(wfi5npq0t;U7Fc_HdzSEVWUb{Q>jS%_mSNy?LN>Hy|d<-T;8*g9Eaowb*4{HIw6 z$ghHc{(%1?ik}je&nfVlmTeXhuW+E%$6kuYm5O6ATo3Y$ENB($(s&Y&iQQM-XGkm0 z32@2G{Iy(waY0*CBK2ElsuY9W?nBq84%;Ll{oLKbzagmNHzvtH(ThpGv;^#N?a3(H zX-OOBfGj}DC0jlh$@!j>wiAc*h~ZY$M&AIRn7Ao^ME?v`M>WSR++~_N7|1 zZw~Yq)q+G!z8h1}8oc}4-%e1tc0>k6z1OqnTB;SsZ)d&ZYBFad!Q(g!H%&dUs*5l< zl(fjvA_~>Pr6)@V8oZEKg%VU3lQ`j3-Jy@ukOTnLSaa85?nB%Sn_RJkR%=1@1(mir zxytDwIq^x`3YY|(!8O0_(EJObvrHxZn7ph;T_;Wj(~3rdzi( zOEQ4w5e`L@d~IUBgzGoQVu5!SQ>JMg2G}eP(Il6)(iOu{aB3;)?eA4wWUhKi#S#@H zLQ8O8Ez1QI){8k6=ZCZjqbsQzF=9STP}UnBtHGq0D|#6vPY=p(WUjw^ko!=C-A{9O z$0aUP2P=jEo-5002$vq_76$xMggSL6Q(FK}2|8!N5h2Lp!0{Q2WmKeV>Gt(-b!Mi5 zW_fZte{l-cGr6$983U6+DYO-(rzPH2i_f{qe5n0jWfpCnUQl)z&qmy=mZQWE!e`Zp zXxwG+RyX3~9T3fMpG#nWa5iBz^N+DeXK&>_EGXDkdS%K0JdC$S->>MgrM*J9H>5RroBu{BO|K z>2{NZ!oV(+V$sdM5KVGTXk{=TKP7eM34;Mo&tu z?j%3iOLtS%j-+QY7&IvPLd}mINVQgn(q#&Xsy3q>yo@2Z@x_ZM`&YJ)SOCzZB(*b) zV9^q%9v6OnV0mKvJSe=p@dzHahv-&dm%+Wj?}vH^13>lam=-1?gn3`FkrSZS;*`n! za$@!D?k(Gq2fR?{N}Vads9TQ>tI1no{qKn>CZ5DNJAc&V=WUOm|# z{azE@ab()RedRL8Z#e|1aeOphNH}@@gN4uC}|6y^nq1MDkfUS33U@@vWQhIl^NTNsh2X8=h}^sJsdxFM9PiY?~XM zoc~A#)qxQ1PaH;`Sx~N!&(X{+b3x1U$6Z%H6@vBa2Z#y zPU^Zln!2_!70>bNex?!5AP9()8(5BRYU6G^pIe%Jk zMa$l5pXuF7;mmU);R*w`Sc7Oe@AZ0Uj8+Rq4bl@*PZOcI@wyG>Q!9DA0w`^AY+!7B zuVfed!{DVuUdP=si%x)wrVGemb~>$7i8?DeOctL?I(jGTXZz-H1!gCH_TY64bav5_ z&7AMmI-uc?c}ryu`UMyI<6&TQac*3!nh9Azk}ceUaXFh zAg|(M9h_&iRT)MGQCtF85VWhYJ%7-SfFsF)dDjaSZ<1Dv%&}fjZtwfu=N8-k-bFo$ zh=zQWR5eGzNh{%g-~9kZkq)uUi!0iNxW6>#jsRqt5Uo|wx%5V-l zUG-y;T;X~)uq38mGOaqADP1fv8e4}owb?`gIXYV0(4b}?$C>fs4ks!hS?KI1=w}1| zY76<}qafjKdaCZ(z4M6?V`lv0sk=PG5GTsR=5nc8hw7D9t-ojJBKSP>Y47%=B&~{E z-vEaaNqptSF>OALDBSckTn3iAQKL(ojIIa`h32POqI9G;&}XlRAH;Z_B7#B8)ca(2 zr4zbR{&rR==>Jp*jD3idEugxz!FJ*X=Lc4C zNq{L@T=X{oDrTdlx$K{1Ah=t+s_0#MD+G|GSLVnph_8AM%HT0QT+!wGDYh#e$So?-sp7`9p!68pF6pJ)qiDV_nT*#IUBWnAb{IyHxwaY)9k2va^kUYmfZP!x`I@V_$oZtum1Zw2U(n0MhGluYg0yA+^Ce(z?oZK9 zHZ0X#Z8PJO!09BXnFMVS%cg=5xVngk8Z+A%BO(d0ooC4;e~z}DltxB(Ua@kNKW`G! zc~kz*XZ9I%O_o>4B*4j25%)tbm#ydS^W~h>uD@h36xLKpY_TT|vaHO%9Haz?LljgL z9yp(>vIIHJnbwHI#wir9F9^VCxLdId6_uNT@G0Fxajj=2HY?Q-kTVrsH9uj1XtD=w z6DrA-6PIH@p3N*t)2mvZTB0PK{N2{6n!a2%9t{qOKhM}OnlY>=6zVF~A(Nyk`#^CGqn2g|H+tAI0VOG3s~$XGSOF9lLpQ@A8*p-n zUg;9#$ZMKE=8!bvb}}tmJa@SGuvxZ*Hl|gG9@R^2l(HuIz*j+b0zZ;(7rqQc(tWYby1#OH1-K`Bg*l_s5ot^G|&e32sPv2Td)IBWWtVKF|4D1>@30B%vAavo?5^^s_uSxte*%s6MM%=VihFwQaz& zSw}wM07W~}h;Xr_dbDN|IV7uAN+ce?@H`gBJ7y(ju2MOrvvfNB%E6y&Ui|HoT<5~- zqLP%u2mJ~Gad?&3tjyzJf6^YMOLN@kP8+N31G-#@+AB)A@CHx|K`$LZ~;%A5>$?iAA+(K)BR z-#*8-;LHNNJqB?yv@Z1Smvgz(+*)Z#Bh!IT%Fv8H&mmB@>4mqt?o(gfv!RACCKi7j zvilBq5liw7_tcyIaUn#O=I?pM*lGH^-u5s3T11bM;PXN74!cG13H+xiM%w_|#j<-V zuysPZe2bWFuLnVa#-+@JgHxZX+^_P&7xYVF)b$H6w7}A5gB(gvI`nnKC-4XPB*e9T zCUmXa`njO2YrdU*mej;eyiNz&m+f@B>RL2=xQpACRDp%-_EL$tONh#{zjT})<*V5I zwpY7KS8PA7D|-%IE<#bw^!~beZ!V6P3m?MoV+J~o>eb}Ek$Q&dD#0#<&E~s?wXYqR z4jYq={w~Bn_xl9XuT$oC9G=WZ0|yDVWYWz2-LCJ8 zAjw!lszV_jYU{p%E3_iu|H!v$&B++jR)p;n+H=T`f@e@BPlx!eJyT45S78j-=Imvn zv2Qzu;nX6>_A9Xf|NZlXUkYR{?&7m|&xV+w-=0L%Eb$>w)Lq}iq~twiQW;h!r! z3V;*M>wq?U;lkjRiK&;dF6^rNtTyacVa`MMHAz`1qQLt+*sPtL-M!`uOlgj6wu+u- zUrbqEhDxD#VgF5^Y0#LoM-9m}AAJeZ*>|?L8Q-ncC^2D!5z`ZjDi;J@-dBqKJONU3 zWBx3{vhlW6wQQV1Q5yYsfJkxk&Lfus3eenkr~QQVMppMAusOEE#>@F_d+8+rSz-0q z9X38cJZ-&kN&^fH`aB%6as07AF?|C+T-0X?CYtJcSjF`7QoA^3l zEP!-6zH@a(uJ-y8oL4lC3wUS*B8Z?8T1dP*`p^+GZC}f9Xr{@SnfgF2Ve&g zNVGt;pBYLZ)qt^kJH1GCO5xYqUcG$?wtv=aDNcMb7+n}Y<7j*0_m7rmqAv05Jg*ONn|)FJKFk&9!HAmpIliQta~upq7y zBz~>+C4Bd`T;M60kS9=1y87Be7zo_lRX`L_SmW@n z-OBnh2=Ds#INM-HE6l~Gh$nAB99HW-TZM_SFsg9K69;RCR7g75B-h_yB0&czoM=cO zArvwv_9c|mD<@K^-6H|b`Px%4wFFLHRtP4(hOnZ|8CCq4AQ)^N2kb7IOgnys`wW@d z34HO4YuSlh{IJ6)7}1hVP=F}KyN}qo0}MOQr|?pq!$({LCj>qUw`QmXXtbgJZF*zR zGN06@(`Ch5yj{r|wD=-QP4_j29`oD8LKN@fw6l$9HYc(7e4>E3 zj$y`(8d(h5Uwrue@v6ApGm2=?#MC$oCDqk1+c*vq1HAa#>KbUvU;wAxf+mX-ksByF zowhNkuvxzehPJ72L3>^ie+EmmqiwLK5m7_l9qihv%$km3m(0ToyavxD1Epjx+(hxv zP{1OUlrY$?@d{LU0q%(;*k6LM_G-BCgq@a{ey&`Svx#`+jk0UcGoGV@JGVCTErc=j zY;R6HQCGbp>teW5K7gZUG|#a+X2^(58#=YGr^rjqE&Oc1QI=B3FUjhnXsVByjD$#@ zaX^qo(VsU*?nFU|Fjmy{U1D$y)Du}ov}EyG&>fTZ9&RairZicnB->Vr$3p1z)nPgH z%TedTc_>wjyfeQ%;-YYm5MbOV@ zBF~_F&*n2i_7!PRs`>o7s0T~6ucD*0Y}kNmZb=~N2V5nh#lS4ki^hQ{1C0I}l*}Y? zFlXDon*;j%Uuq#pH8rJdAZO5Hhy^te%T1I;^c%*2mV2m`tyU&A3HaMf{2-3YbN^_R zI!bI884~wt2tW!PAh2S`It#{DZofC`mhh7HmT;?E11g9H)WV)|PCLg1n|w311FWJP zC}sWMd^|s~artG{{5lH1n-MT? zT^t+GRtf5CF=Nf&mL3SdNrAffbFd^-Y&UfxXCD%6YmtH=0ch`nmm`{ zkcB8$gI&Q^v;Qb)WhPi^enxymr`kcoBR+Tk20OF3>XCr^$k5^51j8_Xy`c9&nbMkB zVFHE(BH%4z(W0b?fK-u3MpUQ9a5p|D89(`^VXn%h4g~!DF&ux?MsDB(wr4@P?qy_1B}bF{(= z62I+#{gpsJ^!D8s62LFJxQ_uhZ5MbIGReK!nD>A~)DxJLs~GI5Qk^c@C3ZX+ab{Z= zDnArDAN36qtk7s$i`zUa?k?Jf`R3YWl4B|j^re928~WsbFKN)#(70noF&A{SO`W*( z0Yrv8#A`yh%nW|Qn#c`FNN2}ZL*E)@G)JN?d?au2Ed*oJ%mRn0S`yCrEW&{uL`!u}YACns+R`Q9l12DBz))gK?i6Nqp>JN+Pbp;UJI&TT(mTmQ@ z)bK{=xUW+B_-$WePWUXu0?9t}TL#1rwPWq>BER-K?`kQ8l^x|isJ_gsK=c_Lbm>ga zBYHMJ^qHKq_n^1X(xn!QPm^YPZ}e6iX?#bRisMv2_8|YHM3ukFyGi61t~Wdc14d2o zz(R{$Xg1bHOux$AE;%E2w~)c@59H8hju_DlMEZEv7VXS!>14AO&Es=57#ijY5;q14 z1AaZcX+JvR@EJmG2t`73zJ1%s1M4-FINxmJr;i(7KsxWmJO_DhY^RnxyH_uBW5C3I zOGP-DvbQtXttU5YQeM%G;XZZgL4R!`enX;JoD=`2zVy=Nn#%)VWnubnSF8D_A^DI4 z<)VpRAd`|c3Nl~!bzN()rSS*>pOB>y-j?g7>AV#N>MUOpJ`=OUj`s! z8SqhBl2^L7h_~4Em9FN+eejM>-hW{aQEQ=W5yJ>Yms;(m9w54zBeMLarhx~ zM0+%8n$bKrsiwoFdvB8N^i|CYUNxk$tpJ#?+f`xAg>ho}$^zmx5BXF$C@^k~pGcLd~j(rW%Q*%kmm z*N3N4a`+~L@4ak>4xG@n#Wn%;&Na#r4rfu&4OY=AuCt=LW8^_Cs8br^){ucUE&`~~ zpm+-^2X;0Rj!Z7_ez_d1oP;4r%z5aRw1eXrjv! zEduE<+?|WsCndutTp@(RNo&)!UjU9}R1Rbr%5=*^3=GMo7)E_7a1fs%r7O!lspqbg zf$J2VP43UaVM8)uL^3X_%BZKZGUg=mW-%i!QPMXTtGLwkblD3Ss>hn`2)=4pp|af* zAPu{IN@@8GhmMS}v?Q4Csc^KYsSo{AdPT7wu< zh2SfBIM~6aaw`>znTt8Iu#EG34kzd<`6;YE!m2+CuJ%RLDg%*qwg#Sjn*hs_t-d~c zhd*O5(4Fs~yh=p#D!eRZIR@FH0|`IQE@h~|CBtPr@UYuo(2KnOFcLz|>87z?14NE> zZkv)bCX8vv^B*DEHD!qhbpVKuZd~g{tLGD8+{S|+aYH;FJsmE|)ddDVk-=R|R40Ur z*JtRnf0u&<<6Uk)+6v=_mY6@9`B(YzN|^5sQ-d|mVylB%tS1IdWQZ@|jtfus&ZWP*r7 zAuQzA;RnQ(zE5-Zko^8Y$SHf*SyI2UdXV;v`V$3;jWBTUHkxuqW5uX}t3$D;LkV@A z?UeyuPj^!KUGjWcbW&>C_qP^rizVz>` z#hWaoHG#$P#N-ob172b%*HJ$S4V_m9uN4fvIYvxgeWg^<4PcIL>jcERgp86DQ#haR zTSTkIpxQT7pWhmpE_xrm%{DSrySCdIvTIk=t`p6??dt(S>f-U+W> zRBjo$55R9mF0D0;)Mfo1Y$hx;l>M?Py|P0m#KiOF?;A_`ar!@Duh?+}QV_oM5~uSG z5~oj55rO(wbug~;7p7ZJu0d$Znaq67Ac#zRkm?v zMl=0%qBK#BvbH?j_@*Y1jYJvM4K~7)3W~qdefV$Pk$B*^mR_;aS#2tbgQ6>l1cBxK z0DifeEtcG6aP2i?uTuPAA0wDUd-V1qHmpW5hR#oMf@wY%d7I>y9?f5;h zK_r$EBEZ+J%0v26-|JePRP9=v*^pkQC#QY+C&zt-C#QLuLykndsE07Bm;Tegz$2RN zSN5`65-DltzgD-|?=w{fdK9yUw8M`d=&X+*om2qX6wt!5^Cx%OygyzI9}!JE0LYPL zZCfDF(cA>D(R21v*h8g$#vN&^OM}{`eROc#jMwC+4VAUE?Yy51Q7C%+NE+zN2 zM(RKiLcd4yD;a!K@^7H2bmCn-IUrohZXELMRIV6FYA@Yt)ulCgv~flO(O%Q3`kgXh zCHh>eo?xdELHsTF{I-je>&f#d4S$C}@GRovb{6G*I}S=$z=HaUz}M5xd5tQ8A!WUp zcv?$-q^$NcGjjgsBNJ9e;6Z{As*T&OdM)|gE5XqHwlWZqaX8%H>(4ox$e6C6DGj9Yfp6{7mf(JifIK27!uIC%8A&XB+}rE$F!SPD!Bw8)@y@%I1z#bjE-Y z+05u&`knnCaRhino2CwN)>t_E+Wpvz{rH*V0)+Lx-}HWFeZ3+6L>eS?ahB$;N>oNh z>^slwM$VV!j`sE{1KdMyzCS+hAD(l4^HX7?JFs?Zf7Tcr)x6#h$jMJ^Mp&(_Y)HW! zQPs)s_ROw?GXC!f?fg-%?vcb-wnONL8{5R2*;h48(sw{9@ewBmKyQCj5W6sd9i8L= zhEp?lmnQM9R^9x0_auP%n+kG&*<-XW3>|(p+u$zeD}Hwf5c36xi3wbqHF+uDhjRmK zb!Qhi%P)%Uu0%w`S{O7zNGYevg=UAk0kb$ecHHQSc>==p9#=n-Hjt)c=nv;dr#P#~ zApHQ-Ly~Z<0qH$4y9~N|839j>#?&K(b{w!~|GRkMIs&mC>fbVY_REm$^V8K0QQJTw ziL5&2LaVGaK+U6~H!c?DwG5|O!Kaham^qL7PQH*VE=B#6e)QC}yv^1RNLFUd96a(v z!z~hF9?ufTdL#^X@k((GTmA+Gwx)nq@P3rvLG1`;;1BvsI)}5{hise1BUqT{v|vfk zZRf=Ix`Rl@1<8zhx)mC9YLe-256uK_K?(c?Ehr5OAW@uXQyr|~#O;v{b}#A${uqQz zOY4lf6aAve^x;Pvjuoz3%3@&Y;!|PIRb!!NV2u@Y09Q_ej1KTveGkVyREa#sSO@ma zpe(p?^EuSrWq)XGuUMh^xFMT3g;+Ji=x{$8xb^OzyapF-!0q|S0&bZ3J%9@kB3 z$%SMAwA;!-*v9$GIwbkO8ID~+rF{%IulC#V9r5af7^4@3~#k$wA*0;jK})BFMTHnc&K{`D`6M4VarWrtNNkc zKPyGn$|%K%-mSpIHgpO}c$MSQfk$D`o<7e1YLM^sdyHs>lvnrA5r2^kC&BJcNI4?R z-J!H*rcTkZ>P9t++E#FJF54ZI(4qao)^A0qW?~1mkf_9=|3`sbxx0qTh;|my%bdLo zs6v{?|77p0Y$-8pcGOW}3N3+>#w|EgKzQC<#7YhMz?82a?BGZY;p{{K6<_+ZAnI1n zpd8FqDpe;Xuvx$$!MhMy5Uc^+Ja}W}@JVB5s_Q|TJ+301Hd8t~X#>&nrU7ai;%8^H zxqCFnlUOuy{!y*R3cvg>!P>Ni8Pf(8z_OXiT-3=dOg|HZ7f2FTk~mF0lo>{@DuQ`J z@|6G$Y6^`Wkc6EFaucll0x5`0U6=PlL#9&p^in<2HCcTJ=j(`R*LF?YKth%3(!<1e zfq0yF`jrA=;PpqVISXsoikmqWO|Drqj*{JUU17kIH1;?jSyL6#biD$Bj({Exuq+%} zIDZT6wc06igc^!vERBPT>|dX=@bt9(A`%=HmB5lh0w3`zJr79k_~Xn1-RcY~s$6R~ zW_hF_x}Ulv?@clcG?!b4WIrZZ$)9dXbyHBpTZB^HF+4xDXWkssfeOPBSeF2F_z0#f zcK~+8xC3j5h68yM7@iD;Sr^s}a7d?kpm7)?%8fd7Xh7j2+al9WK5a(t%UUDTmTIuJ z`g2DW9*s*&oI|z`Y?D|WwI+p%exC^fPvlSrcj!#cEoSXiT~lUnd9IT6wE~RZFo9J4 zC;zsJbpfCE+*KJl;u2*S>d$sLjge)ApNq>i09l~UZ%8q| zZT5E6g*a3nWC;eA2n9xETC!u`Z5WgCbM&5!@0zX}xq~9aBvI&>_Fy7vY-kqdrs^7E z8^hicHTsMv<4FggpI&)CZw`40N$EVVVk8FaY(eXJ$bwthxy$A91<64!tR zUyk87oN^SY%}>)I$4tz34pW8(ZMQfTXPN^g5hyIy`q`RGN9>KSyPJ0AywFQP#WU z6-&3z0~%vr_P8$YE129=dmq~KxHQOuPqH*EqYJNvm| z1o(u>1d1F(rJG}6xipn^GN#Ns9_D*Ek#F*=JYUVU(CjgQ8_TGrgK$eZvFKDcWQOZR;8zhQPq!`rJ- zvQGuA*x7i+sV<}12&2EInaq;#VYggQ57slwoG3jsSNX^`;{#t})>p#nhAMhe2}J{s zL(W^`r0SFbl>>~+p=nf2Vv8;O#7|T>gCp6`O@G2Yg3Dfa*3=UI>_&Gx657ADFurkS zl04VEHY+*6EXo|HK)MeoB$F_C_@Br2}4wlk!brky8 zeRv-iEd;MOWir)PO|7@);dwh({X)~kD13PjA>Hw4$GN5ukDH^rTa+`i8E6t!BDchf zIR^wqwl!aFBI!c(Urg9@G5Mkwn+MTQb7H(zCOy{}S_|KQJ2I~hK%I14fXD#K<_rm@ zC+dU%b{FzO@PXOoN~mh6x}Q~H7x31jHaZgbM@y_`r#~^Qj3x5d=B8H!4xX@E9IBJB zh>ON+Q94>yYN9;(Qjt^q>1YZ?m##TgUrjFE9Yg)<1u|qi8uIxmscMOf=5<^a z`FRD(A>)6e_j=@lzwbA+fib*bI)j@wZVK4| zC;2%|wkVnlQ*d&&WTkv3pTATc;5qg|tGvh)T)MwE6moLlr%9I;f6FwXF>c?ciQ%`X zt@tFdIn=uYpDfz~rhtthxX80Anm1N^r?NXfq0gULBnzKu<<+ui|1)ODQOCz zEdtAyT_;5gTQ)IQaVhei%q@F#nsT+Y7R@d?<;A7>q*ln&P2rj8heKAJq>68P>e88e zYO@DRt|34OC9c%91}75ohpt?0JVi-X0q9pPGL{}8#+Q%R4^NsvJY)L3+!C+5^B=&a_-T>V;sMNSPy;+V^4LaceZ?Z!$> ziA3;~=Fk)tx^{ksXk$Ktap%b{)L@XnHPn*bX~ItZzF_=@Rd_`&@Lj~_gL z@cO~~2cI8&e*pa8_k;fr0Y3!(5cEUv4`iG$8(bnV*RPxG~TeZC>7Cp`4+%0F=3Qx8` z!J@O$YHrtKr7pZ!@o9a#vjt-X#oVv9nvhCr>0(wFmgmSZ*qBU~Uco znn8$Vu7B~w=9VPzMWiTQqNuXXk+olB6ZZDQS{p{~nOzl0^hXxBGjCNBW+eKx#tp<2 z?fuKaXJ{=>(7rE~&b1HysNEQ}_!4bSU`|pUHX)=*ji87hqJ;U)(vl~SShL8FFIX`M zxb^$5hJayvkqF71`yE4mcM_%5GSyDEc(R4#O~r zl&_J@@HcNk>9nU5d+$PD0dSg-JB4|W0O+m(+&$wi zU=m3vZv;RaWE6Fd-%Z z?^KrBbUXReesDjj@>q~~HGKrNbTuq)Px6C%?ivWtJsLx>;33dyB<(Qp8p*wF#b)Te z0Ez@WeHwGh@Phn3ID6qdz=!@J8Z>-`kRk;KQ$i8SE8fnuF&}xVF{H4PcjCl=%Ck)j;PSIJLY%+kjK>Ic)+W3>wIRUX}8?mYofDun-emJQxtS zR6ZBWDlvZ+G$nR*Ko;!F@M};#2|QR5kJyM7f@S(FFvJ6OE+`z8NDL&FzgXD4zs-JC zA9)+(6*lXx_>j}F6SjLny?+^qA{cp=;{NXsZs}mPG=EQdngI^3;u8OaVf1!(kqm#3 zkMCGO*2nFIjNt3y~X`hC1{ zecAf!uc_w>z%Bo4(5>+TJm&*Jm5Bb^Kg84HH|qo~(C53i>r;VVSJubp?5>RO=`KCR z?5?!l<7^7yE`wkWV$<62!$Sq9*<$AK(d9;4g9dvNUym3LDrn$uz2TvX>tV9mLciw* zV8mRoA_Ux9VEyc|zCA_;z3pk-7gs4~t*B)23#$}Qz%aI_7?X(5Wa*-J?t+#87sIp< zsh%d0T6)OLoLRshed`*r@imeIzh|wK#-e`^Joc6qw5(JQItiilKWUN+3*~c?KbEhk z5*0IUT03Lru@rbu?ULcYl0Hfu+FRqq@asxNOWjsHieb7!wotjcv`}D!DfOkkjo2YW z2T;NsK!?9t-|4Kf9pXln@ksohHz!o24^2%k0t#o2#IlBSJeVSED^w52r|O+s#DUOm z1iA|bi66T?SF9KrJe*HzZ;Kdid?U4p9hz#yCJ=B1?Sj-$)5mIF{{*FFU453Y`*+Cv z<_31qv+V*g%7=3>&6=1UMIcj=XqXjNy*r@{K&&cVpQbzN04u1PHB22|9HOLva|;_x zJP;|Gmkk2>l54NkHa=9@K~5i3w|ji+XQ$>zjB;qT9vYge=y?vNw;==WX_$-FWFH|x z(&80C={pdW2dSzA|f=>u1p z_v^D=zEA~u5x~Y2Zp2`^BEPAPvfIGEiiZ>dE4d$64V-MogjUbk-E6Q8u0~6RK)dM4 z5=$E%QFBD!o_m5|UywYol8pwqBNhFd~MD`NbugaoHOPft*#PHUDo`rrgwFBwnUE*E|)jp*g0TVi+=mawYR zpjPY>e-?JGYT~tWs;l}%Gg+PV)o(jlmXWrdUj0rIHF7c?U&BwnM>bzfP(Lr(F}7x9 zP>n#g(=8z9vbKix+fcpv2{^eY01m0|$ok*Uy>fs7p4;1d&MBrlE1`>5YqNU7dqIvj zw>Ab_9g5~XPt(KGb7RDa=yf7uv4csovW$8K1RJQqXX2#TaC7bJ``4oa&L_cu_(ZkT z$W^yeN=&uJRxN8OHt7c^`^j|9Liq}?OpARsb)io;Fm-} zJi63s?xmGV(aN1q#X!c&a5$)^4{08C2eamIN)O?n=V=T88>ZT zrj}hCM=hsMRWNX4l6#vqbtx}g005_?{y^zMLb;fk35jmAd_5)RD%4xJz}Sx%8+qU9 zcFaE(HqNA{0mGTg&kh)Wb<%zfB^ixfY^J5CO*|AH7xID9WDK%q%iVIMGZO+6Eto41raV@f|W9LOPJY1l_Rd z{G?RxtiuzDs!q+%561;KSDpJAch;{z9J;<)ZfM&cqvPYXYPuV%vmfSNc?4mm**G^z zFjt6I2|(=_gS|@*PY%$U%2;{-BKE}65Lrh^B3f~H9Zk8!H|`HK)LDoKni#6rL~td7 z7VKL%%Bk!-goos-6BqBo!SG}*C6C5IWjJ=j#8msd!Y4U;OsxiVL=L}XXd=?gH#QYh z;6O*2GQWK_c`7(TzeObCL&Q52p zf9vS#$Xpn|T_gg!(z0e}Y$?ANb7jAr-X?$Y3_k8m{i$^y?!Vrua+P@>N_us-WErk& zX4}@ELc4!Mx#!6J1QzilFv>&$NVRd2ykYl7dJ$W zJkH`tXDOBykQ`Pr{^UigGy(TOU62qHeAT0kRGvLPT)OmDE`#@D(8fqeM*K0QpQt}R z%$IVaR|C&A+g2AcAb;!|DhjH<{4&V``&2cpS9j$gO!_{ zp59qShIC!uhLNjycgoT$GWc%T&^$)SOaWU3HA@>_E8yotBfM}lJ$!Xox{2z$Gx=F; z0zufW4ew0P3h6^Wd2svG{aRJscuw<4YV6KL$NLPKBIK*D2jCFw*3Qc1pe&M)lzufu zmn!oChqD6Arhn%s;>4D_VuufZxlW5aw+$-DadD>cc(}N&69C;ZiLBQaY3j@#a#9R~ zcl_n)0=B9!(P&6hj6TRJ(!}noi`i+xUks{7s{i1#a1X^ru^uN=^d-COpS9BZBHQuBa!Woh&8H{`(;(Ey#O0~-m$oB`uzI@8q~i5(bh?<8LY{UUcP5;fkgA0E-cw*C0cPyzFhnqmVPvt?TvVcz7yB zZo)WON;EI1_8%Qr1p}v{K9CK%K&=xDfSsj(>m3==0*00GplN;q->9=StCi*EAN3j{ zJ^%C+3iz5nXJ3PpzAiV0=fPc1vO6Ak!>xSx9$c;aluxacL0J>kCZwz9IVSmxx zM^P8q*j~100xvJAFS+oFG}ARp5`1hrPa&*e>l;rgCbNcXtf8m3)lKg#;YCv(c?K0b z#wG9Kb_bpo`N&gD1_fOuFsYmg@35UAWJ8z##z35QDQH=h)kza2gciV(}+ezIA z7(=9rPOIsO!#Q9^E*nS;ER4K_#!qdv`EpmUu~ha|Vz?8a+g;!jAt|={d7TKRUe1b0 zM`sY;P)+ECRqbbqID<4wERBkZy?g6TKX>>j^qwTa#ej+zk}K1I?OwL@U?gO z@dec_)8>mZi?wBd?c)lEV*tJQWgpDv6pE^8F}o+|hKO+1kBAEWhavJq&+jtr&cxMvXyNjCJ%N@Zo$iN!CNZ!T6)kM=x2I zcsf-zr;#VBr$M;N3(uZ=o%70Titad6=6?gyMX)bTsOaPZ+e6~fvrP43GF@n>C-(I7 z7<2;5WHi3#;b%%vp8}KUOeza? zDAZzh-qCQD|Doy~qcaP-b?w-;ZQHhO+qR!L9dvBlwv&$0v2EK8JeyS|d_Ee{l?xDaoc1T*VPWEJj%ktS|g3AioF!5-3+@PTr`*b?&uPz)$&$w~K`6l1bg6hPcgD`JJjAyAe31Ai3&%YqpzgMx!Wr-EX^;jF`l z1NsU3#hsK)0D)eAfE9uEfs}Mn?r^n=yH`72% zu_0BU9mi=&(ttu2fr6Nm%L?V=UGVAhlS6B1B1^)h1GHiP;zSa3=c9qkBA4G%8W+7X zo^q}WO`;)-6Y7G>qqle$ZTk`RQy3L7p%uR`R=e?m@i zgU8Fo_NQ9=f_*ULzy^4QNu^dI$Y}Ty_9HQ98@}X#(C&98>Lrpf36+VET0JsagV-Wo zDHRf&SQ8bt*Dh-Ac^t+97y}l55l%3iOr-L<0>CX&A~?=qz6z`L^m*I$`7!UA#0yBwv9$Q&%8;BI#jR^)>yATj0kWBKWSp>FF0@@TR z0PGN~BB#(#Ec3?`TgBM*QQAYUG>}}W_zVIazxMAs0SFX$m~=kcnTsJ z3?N|wEGxeOa z{*>U3UF*l&%S+vJ_xpy=L%{d2hiA)r&#uh<(P!O*qFC1%dTh3t$$%W zX%BXTSy7_>l#Zk|c#T@j*o@B!>diWJrR)ekW*dESa7XNueNr$#@@xOVqp2r|#$d*y zYQs03O=;>npmU?n;X2AIAHW+@!!g3ZqQ|pP0=1#-n7dB?vax01+;Wu~-PHz~=hkcL zH&VLE+*`yEek&#b-5E#xj`?vi1Efrsv-eqx>B|C6s3!ovwekg2imF(&Su z9gVNbG^l8IituE>&z_#Ow1lISx{>vk_hZ{*s8_cGaPBj_TF&A&0!%w-L{IrVgkL+i z=+tt2;QM?U-jKmI#GI#i!X8Z_`!C)i;pv48Q%<+m#!-&#AQ^w%;P?FNIxkg_jf9`% zd-)M$fvJ1%phaU=;59spu=hXG@?lGw5tg6cB>STeT6!vdvZgGM4 zKx^-0QgV<=4lgUaw?@J(;JFawYPb47^H1eO%|*iD(0_%CYAr zCWJGAt0c9;vwbu_hLkV1JrX`H=$-G|)*~t51o-@nnX6RCF|#tu_o%Lb2KBH+Mv0!6rhISRJv&Qk$)S=H+mDIjzpnu9=`b{` zx$fk=0DNtHXj;!0kOH<0w#r-|KA)bRM~O8-ki4T2y~O|zI_}fyJ7}4$VK< z-D^W5Jf8J(un6n{LmBT%P1Nyh=WhA)6I=nB0HTh@bQ!VVuHge!7gtqp@QI~wD?hKt zlYMTSnk~k@U_p;$GY34k(o`xK#sEqpbcBv=WORhCXRE#K!OH4SvIg8W*aQ+E!u#|! zhpzTc?ak?jsbP|8S}{<8-Z04fxff(YKBbRa>A3j$sU7zlhq}~NEhjkC0#p;HrhaBI zfK$`b*e9H$%U(allOxn$5`kHKXS>T+wmUCEq9KLVS6hd6{xHq$UT^;{-v^i+%#Sad zwhTbWd%Zzz@5g(zYJ{NRPj?fQz>nX&HeG+^5s5lIW?AJ)-ehkQ-*bY0T45pTXl1~6 zUybAPM;GQy?{wQaCb#>PUxAIsq(u@O-c?Cak&xO0K+4QZ4rJ*eqO8x69REF}1mt@PA zLTAbxO#V%VTm5nOmIc9^{g6A^6@8)NVyb#gTNo?#A>YUjy$}m?m@7uy;mT+ngG%f$ zyznAu3tW1W`|Aff=qtv63C%2p7339gJN6@57*Z;urw$`pEUP_T>N0DxT2bdIZ&T-* zGQW#`H+v`j{t*!2%81Lu(2}yk$n_4j0-e@aWsLKXCNS-C#UM#- z7&roRVy2^L)2egOxEA>W;__e!cpUWt{{P^&x!Qk5L4eFO2RLvjz0K`f4$X@=KxoGZ z3@lqdOi+IW4H^`WTY+GG0qiD`=u7>K=580ED4RH;&g%WuKE?+F-X+v&H>Bb7?q&xm zjq=fSl~D5YiTbWg!~@N3k*W4@MNGRHJ$a{@d%=vtysh_{>Wgz6;}QG`H=O3eV2Da_ z!|2Ik6X3D=ob087bBCVVSp>^;+J-2a`ydR5EhBZVB-q+sRQv}r_YrScDJNsAa%0V+ z<;S_pH|{zND=sg#j!)y4V72GR$MDmo#g|1IueP#>3Yx9Adz(-QpW|#(Lf4IIZ_d(n zCV?+l)l3%T{N3?2m1|`aE1rGohWmItZ-e0`H=x#gU< zHjx)nv!b-FY{-ty-PF0yI@LjJ>K#}4)ONDBG^y!3hUY*YgRSeqf_>wV7yr*&=NS-h zJK&b8O%Sssj;wSh{{apZdV($-I=*Jjf(C?Y?(%#LDm(A(n7VexV8;wkH6 zt5R14rdKlC3(^5K3uO5$E(ngSPQCZy2c!d zpIOS*L5j-+ZhpeQT=3kIgv~_tCvyI?p@0&X-fbbQ;DAssDMUzj%wkgx?DZIyhRff! zv!PowCnxT(VYW%)YwLQ#%~S-$I(Sm0TkU3J;wDM57P;JYb-M9~L#2Dn_R;d0>G8u9 zvOt)HKkN$WLl>YCGZm6!2HS*|^Ryp`C}j~t+RQR|K9X~6`bBf|&3XrO^JE(eMF1-o zcrfMkh(EggKsSd}Ub4UB?X@COOQ+TY|G`CS!3@8Dl0vc{qr^{(t_;HDO}S#0dx9bw z;eMiYn1_im3*#c6ZtZYP_^ELmIf8Fsz8g;pU7|$fq&$<%N2(+<{1{&69}4J}4#!0M zD#wv=FB$LioSgoy=9Mh8nZ5&NzRhr!NS_Od!cpTS*&bsnt;>SsIN;d>rMC{b`UTvQ zOoe{w@PqiL3v}ssOLO8&GKZLK9TJq5W*uV_$2eqK9-8%dKVR&#pr!3fw%wQasuRp& zz!B=001_uxZd(N+CsuZu@}}NxSB(TRo>q)l@+J{r#SSE#Ut>haaUcQNf0OTpHvKft z>x8uhFrH9%8v}ovx;BH`{Uxjk$VSfnm#eTvxW9ne{yr1%5;+B`EU1NVQE{d|bOxiB zzks2m_75hezOk)HxTq485-a?(6}CKcDEi}&r*2_5=>G-aNpzi|SVDbZ+y}{%QKQq4 z*L6*%SrmQZ*byE;?<~oE#3?Mh&958S)iK~gMkCXpQ^}=#L;-8H-=O;+Dg^%~*pVa( zz(Mc)fj5LcmHJ0Mna3b&i2t10R|-;;*1eV}=7Cx&3DSyJmcrj5IU-W{q-(?liQ*)| zw$!HYh7Lf$NkM~KLUcltTh7W;NryNLSb?!XZmsHYT15gH>VZMGh6W(&?daqJD^%&| zRzx@(0)M}m;=v0&6ZOKQ!%-+UAdQNAYOMygsP>NOsBvka_19R6NAlI1sG)OM&?&5F zkw9XIl$5~e6M-M#wu*Y`JBc( zu7H++g}?x0x|ykARJx(5rkW%vYfs2a99a>$KuY*em6H}V=7+FWiDc!*RQ~?}>7y*N zVZ(U?MHSF6;>%D9)5?`A7s>e#1or6flA!frgrJ|w4G^v|<-jSXRHe|RLK&J-{s+5| zD9XnaK_KV1`M*OC768qUC5PLs@5RkOA}$Ou66lA{9ZIfvQq~!(U@AHm96`yc74k&r z<_@S*6%D4*gfaBX$)(2N_zB6W@t9)ttgqkWL*tX|Gxo-eKw!hKx<_O}l>o|SYA@af|JWWZK=xPJ-RaWv6nwIR`B#0NhL%*TB@J8QIuFOOBNcNpE*0V!s~=p zqT##D>LHP^9zX;(jhev()ZV31=`J3RR_z%@TA}=0eRYW1jFml*lP9bwIE@wV1lK7Il@(q>MYVmT>m9 z9BldlS!w24)BWE?CcVaa^^~ZT-by)=&`Op_Ct{4EN$OVjQd}Ot^MrtsT|bK`B6W3X z)+8Vq2_CfJn!H4J?i&H@sNTc0?NOClbw>jo|HMcG}N zP*{;JAcFnjsi`^YUyDMOB-{V?UvxnT=8#3D;HZb zXDi*(?77LLihW|+aDx1OD;G%XW0D!7w0VNTP1~eGOyq#?Uzz4#2Y?=Pa-ET3-(i{N z7~0}g4CZd)l6&bw$WYlIF2V8Frh_n12b>3CC1`J|(1^rc8wU4Hxwu~6>?$~*YG{D`i_bGM|Au&bBWH^H9|0L7W469w_t>(KG{`}+~0ftPvg6v74sKu!@4$DU9m zs)5-*jhC}4x6h=S1F$+el9e(rzqgv(H^v(L_X$Fup|;aYM{l{G-C|{Qsi(YwR5M60 zCQcIVyxu%EHV%Y?Yg!kG{hE!(AekPpbHCTIJ*&jP+FkH-Oh89#5^Dqz9K z&10|*i%?T@etBVXmD}66`%n?)cN{0d6{Xia{Ho?blI_W>sCmTrRsPn*Ky^eC?RV^$ zG?#uGsrkkJ++_-{HpVA(G0y=^nc4_^ds+_H*~m)gT<4IZn*6_pdtToHA)RP#WU=^?XD#ZO zCo9)M9*hK5gj|@IDZv zjwQMdaMmm8##nimYhy_E-^L%kG4)ouIklbyZ4lsn*E?cbUVHz^>8x9cO?%g^UwW;N z@56+AHpaN#b>eo(9~wL9=+&JK+yQqlSg-KEXcA0O59~u7SFhxy(f2*EPGStG2yd{K&iM%OCL(zF)3b8#S(;5RagtM6T zJI{M!$5Vmm7God?KBH9N9|wjt`)$j%4*=#WUS%h*dhqOSeQAny-+C--Zu$2}?_K!Z zB((fsL)-|v+-3{m)bI#lF7nyHn-xZ=L3`z2b0JR0xy<@ghXiOi$wfp;v{(>iR};A+ zc+YK>>>(4&vWYE1r6|sYOGe0SmB` zOCMK37Jk$!a3t}o)=&yH3ky+&GAdfvE2jnB6KQ2px*eVr`h#o$fy3czq&xw6o6%1s z0_I`WuMAvZLc6K715Af*RDq5_IGZlX-2yZ)o`Pa@!V1GrqX7awqfYq zk0E=>O6)-k48i~xf&^bu3#rS{NH+wN@V3WmXc0@bX!?RzR0`F(NkY#Wya5mzRmk~@ zt-Klc_)5x|j1XVe@wC)LfUhRL|21TtpfpQ>>5m^nM(;NTQl*h93zV*mNmi87*rmT! zN5=z>uOxN?zF0(R1J<@tGVUjNqS0c4I)gqfYAhGM16F5Ksw*F?z)2}iLBRoU<+1O# zUo4`*%TI8>7CLR5t^rAL*8?nNgfg~(AZVI+3IzU=S%v+DFRA;2f=F?pEe_r*)U918S2yav78fK@3NnwOzHEJ4SrXPhOsdeJd4=cSQ!kKGR>?1tg$4bn+36UkFu z#I9fSMl^lGVVHytaABDAeZr@ntl$Dm{ZU@3aP0dz>HGN*^kAn(lnJQ;{5-4}0=}Ok z@~gWS=CE-G-ozsi|2Zz4*ba9vxAtODbJ~UL7=0dD`w(rA8Q--9XRQ4FN@4f>0Oy?3 zCz3JYBwyky{#ss5iY;@hedjl_0lf)~&BeZglaLNNy{Eqp5((A)#1WUH{dmSSJLU{m zPBa;L-|{L7VEq>Kmp{wBD8JBNlV;qWxAPY{{q-(EdvkBAB>+$I1U=5?DQ)qX{@G`x z^m*qCf4U+0n|@RBFlS^dNGjWXFV^}@MfS8UVt(N0`2nq{eF*oBA=>qrgeY52F$7qo zg{wSI<=URAwFqDf>hQ6q9qi-s$LGxS{;_kS!eg-A;kJk-_pc7}rqdf2hgx}d>Ctn7 zJ(*1h9<4Y%wFcN9!lmzws$SHswr}6&&3HyiaEKqr?3np~BWDWkOH$g4sah$#KFxcI zeDwp0wpz~f&p*&sS&!nzz7ky8m)X3DyXt;71te+t*AOn~2o}j6TRVmbEI14Dl6|*O zD?M7&mD<`mDZCD6Jyc)IT_v%%pHI{mZ~XqLldtK2+6TORM}I~g@~mRo2E@AGZ;*Sx zyuMYlDI6hwh`&krSn2u=y~ON{R6KM47G2<<@7ouw4wFyxOw|tny~f>GK5RKTKldh} z?73rY>_}xuD;2YoA2}K7UwS0^uCe`lsF=B~yS32bdhUMCM&CdzbtNDiej34`+Fpd1$3!NP6}rve2`5 z@4lJYU8`FOnhP!U|Egk`++!I@>!odH>}DuRngrmTzdv|&R8%`I8O!ulAOsBFTwHcl z&PYcj7&xp~ZvHKHVRfC5-|($65S%v*G{{q+M|30NHfU>UtNr#nKYhz^NS}CR)fPoW z{n54e>unygWO1lOTbOuLihXc;4XbW1E%Pg79qP*ss&y+o7~=AVfO<67;R7XNb=%e| zMFo73yD~YO%i+$%3TS%+~h_2wi|MsU4bj;TD(i?vVIZhcvi_kS`UEahu~4Xpj#FaU*}{VD14;-0g;Orgl_sF*I;W#9WD=@p!Jod^3dEcPA3!n31%0xEQdJpCZj3tL{OTUu4N0rg zGi>!Liuc29sz;To=DgbEDX1z`B|=#A$!Z2%`L<|tk@+b~JiF+VcuTIr<>hxl$U30> zzeIE^p+z9+)C>S7iYSCy#&qsyJxsu2K#V|=gOI{NTAh&~^=i_1BNIZLI$H5=rlC)Z zI3MnbNY<3u1;;qVood`rjH*Xeej<*=w_t|etkd?Lco$pgeDD1UU3 zmBIY>#s0DsJD0aocyXwg5sOydNE=rO4*`f;@&O=GSM>lTTARRmYIrdGJX6VXvgkND z6gDGxQ<5$0?uUODa?&nfiwNn9Xc53^WCio->-$K{O0XeM)v}4E=(rVOe^km;VXH6c zT7a@8Fe|`~%oUrcfk&TGb&wHLs% zD$QguZkz!5KvuZ(qRXioi8w|#I>anDXxp!9gjLqb8%1O~N!c*&b?i}B_-oq5=c^S3 zkt1d6T$xsJoC%r6X@N~=;~2o=_p3D!p~ue4E$Y(XTI1`*AdOmRRQc1*q~2r#D+pnT z<$PC((mJ6h&Xpi0O9E?TnL*E1+Q29Bkk(RGow9&m%3VCOVg*sRu@q5w;*yzE=*ls_ z_QB6NMizm-LSk@k@V3_$f%L^q6bVu+(75xO-6SE($Hf=$tQILcwK@kO!jo&2r9dgR z#NGHpBJSsH~ce;o$!bmYtdPOzN0JTQ4U34Pj$?4xVzA*k`rKyiQ3hw8RsCmVrEdz9@^v z;N3zYh?sa@@a7{e5Vkf|OsTOCUSE|D32PMEu1e1IHYc$cosS}h; z?N!mqY!630rdddf?k-rSgvcayibUKi>v{~JXjYqEPFq?=EU)g9nVs1!yWsd47cRGG zdQb0BQ(bHkk4Ja5tPGm*%JHw-6T(=&QomY|nUq3xV=0P04@kY=XexR45#_1G#I zdqVjgbOvQqRaBPajiBZD7pYN}k z?VyT@r(~1REF}|$HjB+|l11Yms|))dDQwhCg+9Ft=wp}PU~8$qSEak}SMp2%R2+;n z)Q6U%@?~j+TjCUjKa5u^M^+)I3Yu;FI!|U_wE^ut8M71Zn?=}lx5RVqxVnMR_65ls z?%a)E&4%5ao~KuX_fAYN#Icj4c*!5e9ikCfXo4&$6#O%U;aBVeph?*P`@CPaOMTI(G(8&x-WK<++~AunS7Fc=4@E{DG?F_? z=)LmX@40&G8}I?-lqc_3z>I$${XtoqpfSE2Z-w2GLiIoXzNgd<^j#6EhL2xnI))=k z$$y#1=HkB}8O3MV_2H=&*gWIhj19_mrw{XNdEXdYAgX5H8UMm>VHHElB zenGk_30QDqj$R%ewF7iAYL5{Qi!p9mjmHQ!Tn-PU8IGpoHhf5E z^P-yY9SqfNCSOdoO=SsyXA)tuWV+ueCgkE&cFLkQ_DgJ#f5t|ROVQapqvRSqT`T`H ze;q<&Yt31O^!c#cNRapBN7XT;H*ieWM#$V(eFyYGc_%&O1lN>`z%*3bQTlw86`}=$9;OkB~6OwvrSjJV|E3S_b^HY?i7oxM*|G~EUCylf3<8iBubLac>eI|l1 z_a+a(U18Ym|8cB{n0G^%_wfE(==1J-!F79Y6;~Rhc7Qn|i9pkU;1=-)pI^4mm-MVB z;rsFJyRN%RB@P$xOddmq|5c!dnL^$p*1d0X4MWGCazOyWISN>_XdAfwJmVRkyDcCPupHA}!d(aIctB^IQxiqWh79%6hyQZx69BwEI;&Kz9kX@A zRUn2hdXJ^#lvrAGoW74CIbfqq!7O#%(~U;Sh5?lZxDjEXWA&uZKP8!%zGf6Tl zX<@9V39b(xQ?A*V?^A z_gLN{Ua|rhKovw-6)A-s^!pvayo!A@pj})2!qdY^%U}Ex|KiUB?CH!m3}0FdwW$q7ooM&?Z8| z`WTr)3Rs{yWA0N)zrlZMAG=_uWBS=8OcsH;%KM$;rEywdP2)+YKMk<_|yt? z2)XhM7K}&(tqaTMAVIX2^DS!lkNv2v6KaE8%YOl07>Ia57R97Y5r8_>DU|P=a`g1o zE(8FGakfr^1{i)0N1~;X=p(s9$^OzhDu3x|!{w$yY3J%eZhWDs$V*LQd=O3NOi;mM zcq3PtSjNtndAz@Qg-j%*GR-z$lccmHF|;JpE*qsaA+3x;OQq-Jxgtx``3-7FL9j{d zNx>}H`b`ti$*ZtiBc`d$Ht zZ={BlI|z6o`*a4a-?KN3d5sU_Q$Ku*_Do@4gZ6FO-#7Ny zYTafOTDoGWr2RQVT8#N?P0P8jI9g8x%Y|DMrGbKxo7H-;R~^orhR(9u_1iCvRTwqc z1^h+Y)91%-JB&>Nj$vyyfBbMxKpFuST+2kPddo(}Tnp^y6!5`LM5#5YD8pL&e{8J8 z>0Ku@u$NmH3-P_pY_INsx;N(C)(Q%b?y@yKs=Es>7a=<)FV`$A{oM$?q6ycwc{IZ; z#7&l@xu0mqDloZm326x&TLYd^xSw*f`MO#o9W?Ti*SmukOEb6jJ61aUrzHT39Jj>{ z4p+VS&S!&He+BfbuvzEjP$g=(E3m!5r-VwdTOO4)dcwMndqNqL2_)t@omU5>&#q{t z91Z6fYB#?%uEx5BL_LZN!WV1!D~MlUa9q$0`x{O5TX!eftu5_o4J(j2=cQ1ot9dJs ze_(L#QY1iDoYkowW#@gUeZK(YKQ43~y5{gU)zE_TVo8?T02S0dbT;H^>wViRqL^aG zXBay!YJWfQvx6vJlYa$4(%6NLn9bS!44+|T!E!N0SI(Vi3C!CZqDbl4KPI2Sz0n1H zayDfGh!!iH9Twj4 zmKkI-71%cL!1VWR!d|p$)NK9GOW#5*PU@-hP(4$yAY|~SeWmX|d?~f7&%2!j7HB@0 zUcPk^xXW_Vs-}Pqa;E_%!v$T$D@;ijHPFkxjEq}CJnWAJ2Xw*8Wj+Ki|O!hJ(>@Gdker99)NgOaa~>Wo;+bylN!ra066S9{SQA%^{I%ApS~$%KID*NW=I42!jF!n|^DUU`hK~r1pum z))nO+pANF)hSYMi1j8$%|H))8j)pX;jTMqvSDLn}z2Hn)lsdX_MOYCFs8cYR+hElm zeHq^kLTs6&1zS3^D(oG5Lg$sG`-*9};J>U^-?_B*_E$l95RpbuET~GOD9(iW0W|9)(52*pZi!j$@FP_4+HV4fc%L{@TJ#Y zTiPf~=qOin=e98yxqrnVcOVy12;W|lkq8vG`bf)JeDT#!6Szucx!a^VX(ncq>c1o3 zQ|$TzP`p>KLGgdB!A6Vz1w2c8Djcnna4U}T=YWsHsJc{rg6da);BF)^^jDjz7(GHKx_9jdI+K+ zKBsbmd!bf@@Buk!YKvYWw@ht5C-uT!_Cb4;@HcLxO`FTb zgrsvE)g%D8)gK7i&oAC9+;uNFT_|ML)UdEc-^|kWsyn(wcu0v5R()JNBW4~rC@4ik zH9nB2bpd93nNfY-(yqFJ{!X(1%$#a2YqQqw;q2rpq&Y$GgyujsjXk}z04hp7j%s~2 zJPW%eTPg5RjT5bxGV|osjlEN@ouZ`U?65cUHgkL@7e_|xqnYd3=Q-Hl`+ zZ|)mP$1EdB2vH*aC`cP=BeNYNyV;Pv6_pR+4HGFPm`!6U zW$l8)U)0x%&VZ;7)&G9fA*g?N@Xhv8)*(3cWqqya3gAKOIjq|IhI_GW7aaV;zGeh0 zHL@V2^j)pCAnfQwOb`|>9xIcJtEbJL{A#~;p@{T^!Qy0cSRID_b_1N$57-v-Sx*Nr zOPgzLz44_LG@i5K))L>t`dO-F+INR*4Zx<}b!)eRPI?%vA*3&$C1sjus5-=fC0{fI zj(;l$x%j|O{LN3tL`N+$u~5svSqbs+4w!8xKe~ui!gGmyiBH)N9 z`~jk=)&KhMoQ||p!f1F9X67{ECulNI_J4y7j3{hCN%G%6*yzE#|2j`Qw6S$PuAh>j zGwK5RYl ztuC|z_}%P!p0RYla6t1QJ07^kWn+*IEPKclvDs<=@G%)l*he9gED$KrCW5qQ$NxNhsvh z%0M#08R=3^!rUjP-}EagI${ciLaFh79r`JW0Uh zN!Dy{H0TP&BA_xt#8lu@soYe)m*Rpig?y?D zEXZ(%;FN^l0U`GtqDhKtWSD4khs0x$M?~l2c3f1T&`Jm_Vk*HXNHwa5re!hMoZ0&T z2`h_Y@eIXCEOdBq1D|H*=79ugWXXSPKBuxnXnunXabk}_+6&>R1r9_sAse@O=L>O> zxbk!7b){3y9d9qlLt~H!qcF%okbB<-cV@?)<;oB43E);nyB^q=K#RB=HjCtA>VKh|QR!|fLfQ^~;|4s1GSDjM`5km4ip}kf%g>!;! zmd8PX;rLU|u0iNmTwg=>Or-ff+lT2GuXAx)vKYd??IaA+rg+aDxVkqT(a8aLZ~@YHS>90!J+sRZm)?8FgSW4ypa`D zL3bqf7i_71{Pkex&*RoTGu5j6&{359vCK=zKE575Mrr`xXpz!$@)CCLM(lT3+*Em3?BB8tqtu!uC6OVnU-Qv6D@FCgl~1J$%W!e}&L=CnH-JaPcr|1M^v zpCs>C#Do-n^9e(!t4@211to=yLMSYSlYpX($(B5;v;Aiz2qceo%ed#=R7BaNKvk=jku9r*Ss3 zKl6Onu`sg*AedUU-t7JH@})PY(&4Lrdg93s)Ycrn_93`aI}>GGwv~i>shjd6m{R8} zw(lDqjkK4KE?tnkyG_0Mb;&Szi>O#GxyLOnaz?hY{79c0(J8EYLCRx0BM_;T_AHIJ zc(o76D|(JNF5)#+nDS$88CR#9$Bw5F)KSZT7x3?p|9Pp-bGZM^k?Vh1V?48C2oqA6=T8)_sycdl zWe$>xh{&)It}u%m+p{no`UZ=|?hYpI#O$Bc>n+cd6U?Kd4z+nT!oLh=4e@ujcNnYkTN!=sl!*Eu-i5dw&!3}qsVc-w2$wfYC%C#VeXq;LZKU2rUv=eT*DsGBSWKny>lkY-6uGslDip1FbL@* z^UIyQ)#UtwPd=e+n@`sixp94C*fUmDrmal5WmEoG)y`VCSdZ)2+r+M^*s|j-Y@`n* zl1Zc`B=r84Ub10Lw?nmLPp(Io6R=%yrC6pwkSHC~GugFkkuxa;Y+E#Srz8$M__5el z%5dn$^&~a_-h=1hR~=J#Ubd-CUbC;QXa3Me9qk@V{VY66mrp(5n4UPylI6AyOAm}f z6P%ObrlMSu2qM#?DIjB!MqDCNm*SrXfJeB<`_NDogH==z-W|O$6@d9J(n1nC5;vHT z$JcDsnb+D}_cMk71b5CEa5xP?-0TlKcRX?M+*q5r@uobguDsBRNdNAXYBsnaNru3_ zW&SB>i2hh!A0bWAe#5rfVQ|;6DAh+i{Hb)fMbung&{1FtL!AzdR!RPkfK zdT95|#oG^y&!9QV&(~1VWc7TI6{x1@1hO4t&J`Ih{bBYrT-qCc{r({JboqVwXs;z< zM!8l}>saBr+z)MKSM}uP1A0Z=4uqM#RU`F;Mtc{)j@R6sqp5LFbIFBJ-kJZ!I$7P7 zMi34>lds7KaBgVa02+46|8|<1yT7cC^8j5R-_k1n1Nq$)1ism14Kn&2eneZCSN0Mz zENNBZl$sn78rD^6@MREmX{~ACWAngarK*^U3?Y)|T$BKQr5$j|hqaw%`W?jN>wguvDe+ z;-Q8%8NC9J5N{Fi%7P>>tKAFjN{yg<#e2RRtf#mhbMUGjTHx5;fx|!w2yotUHs4(% zcol^J`1ze=UMb;-5io)~(VaGnNg2SXhXr)0rz*11;XjN01DdZuu|Fzo!g(+z3seF2 z$?q1-aEhh|_@`k6Kh)(Vue zsx`>QAi_7js(}RW-$I{8X-!nwtK!`q=XxWLNzvxgzrb>JoZ60ud{2%Bwnf zYfR44tqc+4zv6HscDBBVquB6xnl{LO_5p1R}2Dp>emM$B^5b-aq?)RK36!_LbHE_PFT<5C|gTlK8l(=q<*W z^%WmTX}Lp`Md>iEGCU21OC!53Qkb{+jtoG{Rk452x^awu;45RkYAWYeyD}1d zn|~#)K)+7vtFXVQTbQ>>7<$;D)WXF*3U(6`pt$MJf+om{5*i3(fqO73>t`eS;?UYh z9HF{6*$NGuU+&hMos|vz?ln%a>#K;hoUV;CSh2EzWYg}HE9I-ymh7|tMod$G_&+Kp z?fm86F9i!5=l>EhN(~PGu{w0l(n=aR9b$;k#Y7TjvKkQWM(mIL|6_G8!yNxa%!%iT zui^}2MW$*|ame9@&30jkFpaVEa`X`tf2>NvBb10sn`gm&BzB^jr3HhXh*amt(f8e( zUQXTHWKGoq92kOgfi3`k!1*RiwQCxoOadM!Dj0}tMc&cFBW$p1mS5m)Ee+kO1ZU5w zYMsd%(=@g8v&b|*&#z6|6gHm8I(t`bqfb~cXxMpcemi~A-Fpe zJh;0%1Wj;v4?MU_aOXjS6S$oB+^@cSf8DD2HG67ms=N2D-D_5_m5P5##mUJbO&X2v z2Iu=^-H`#d^=Y4hDsb+XSJlv?7p~M{)2&+6AZ#of`>}itNtEB285bL+Uu9LYaEkAh zm(+Ob-b~A@&vccm!Q?YR$~%=?eH2E?8-T(FpT6=PzH_r~ju7dyO*O02&*bJ0p~1}w z92Xs;j8T9#O9e8gn8&R~SN|Y<#G&aNi=QdSVS2BIHjF+i+aOrS7dlj(9Z{k&sUEF3 zkvOd+azS;1MF%=sHOHN^Pr)-G>5wB!Pcna=U4!?FPwK6}{bxb>{>0{*p&BKZutDAx zz4l7)yJk-|BxgysSW@qH*Q47B4*a2Ha+Eng`5!>*Kju!Ty%{*EtENMp`GlQQ9ey~e z;keT^4?Uza3LHwM`3A=z%_xWlTN1&cMiN~j2F+(3SyDCFS;zQ6TpL{{*bgg6a{pl+G!Ype@^{ELlqF9IH#&$vDBgsKQLFd_m9 z&G&)h7$mecW4;c!LX0|X?%UP)P(S*?k;C0|EZeWFTc93NhN+Z+QvEs7s&HuM$LYV4 zrpBPOI;A7lK{{p0fnG&USty~#FlFU0CpdW!5z|nrMWffytQOwylYFsAYY+MRIX4tU zE&j=t%NJ9-F>Y_Yjm>JXKBw12h89rb*SC1H@sy8AYl-IMkU{>uW z{5!>_)DV*#MM+e;B}(0@!+#$S3hH_Cg(&(AjU@hZRC9>m@hd$))X{aH`f}rr96=Pa z!}zo^&(5P&$ArWyCeg&{b89_8UkfLNCDvllg@D{CK zp8989K|E}Tx_0J66s*axM3;%WMEN)6dyn8zvJ6Z(=ta=I&9Y*ZR_lWNTx~N=0HxST zyX<6b(?elbTBVwK8B5y`Rr%1+Bzo)DeBf*^9vRiIZTt zkm^1ymTx?TGt3Rft+;(6nq(d*OK1pEss|2H;&_)$9P=kU&?FwqHij1}By48Yia zogH5m{Ex|Fl|#{CGT8t=nA?tg{a1XM^^DM{4yTkQ(eMYbSWtUA7ej!_-%@&Xyg2I6 zZ0x*lquyv*RDB<$K3ZNI+Uv2b?(2C~QLggKXi==ziRxndznAV6}R+^(flT-P?_&L7qP%Gj95ChqrBd<8|3 zc(!9fl-G{`w!IB!E?jEf(#^l-i^NUMH;v&Y=_E0y+6E{U5l>L4C{YlN10oWr22x7T zcHf1Wr1MQA&*b+e$Qv6VNH zr`N2>a-^_HNX$gQL2o2EuvGf0qb|V|R#Ao-?t>Uru^&}|e#d;p+|VMqptWbwz{-oh zqyuk1#mc@g-++Yd?jq@P2vFk-yC0g3O;#1sfPR`X`$ia>jk`-ye>ss$<36*k(u}X5 z*=z_(_n?zbYl>A!Ybw>E8DwqvJdR-QNFAKUTPl&J6lf#2}9*iI$s)Bh|7NKT#%jln1y zNCCbK7q)18z=0vT_tF3!A`TX^IZd``xsAY4oXb0K5 zifnVBZfYPRbRMG~9ie)>DdvZX;oe?H+8SI}Cg4d4sEAO!f@hz3S0a7%c{h_xDx6JQ zDAuzZeFXN?UNkpf-XwK7L*cua-MuK%=Z&RWdzP&1-D%lSM(D8YI7GAL%Aa%-Xskw4 z-fAxvNb5%K$>j%rYh22Q6vH>eW0#CT=fz6Q3@gpRc0hkF#KIobnwCJMmN>5xuQB9T zgp`{F2!~j~g#w4Q;+Q<;F!XTO&|dnXyzz&biP(kcJmo`4h~ihVg())(`;uEeeVLEtY{9@=X$ll~6Bf!XaJ<<$E)Ti22dRuJP6N1) z6g+~A3=WtAHMsy(k6&|-@_D)6J}us6&Q$F@4cNP?t}H;bW9N0ysDARm44G^zfcWvb z?>BGxb85`WP_L1^3QK^3ctrA8mZn*ZCe?E5K1kVe z3^kQh@BYujg(-foj7|hvvZYqFI=jhHYxE*<74Y>M>Exxf6eEZvNvw#-oMcylkZ0lu zynS?4NA-xs2$1#Y(9*^-^qSN5kRrL7G;$%Mv4#EqJVdlwUyuvs1g?sZRur_pBEf3= z)4GYy+VP_UrKQ~E$R)6dHOk3Y6oRl)X2mJLsU?3(2I_pn4e9?}AWgo3IFExdptsl`6SgT_s3yqCo_@#1Ke`rg50NL!1QC=T8a5n*Q$>S#;?$L~5 zAF*RkhlO6_rHRU+SFH6}FaBVtD!!kb(95~~w%npl{g2P+Y3xrGTJ+wld~tfnW7@%c zil7{oS(kZo^PRmV2BuG*bm}hFaSP&ZOIXb?zJ_3KbpBpCcun(6(NQdEMB6a+h;PZG zw}QUmfHlLFP))GbcPw{g2uxjiZ3@KYBIe_9ly`a$L@Xk8A=w6B82_z_Z-|e1ZzkPl z+?3b>bxEYhb;>B-^fu7>!jj=;&|+GTPNCaoGaUH&(3;ta7#q&n<33!mgq}P2;`Fd} z*(gQmAqklV&(9r2;PA(nGRU;^p0a zgUGDwlP(fnniy#2ZZ06u=V zovpy37+Ha6K>jTQIN;@Vhl^I!n6rimYuWU5w>pEo?>7egcE~Xt`8oIZa&Ph_Jkgyf zvTI4-!uMtHHpaC$yJEc0OR|6dQ6a>%qx`9x0eb@!q|fan8d<&=kUfd7{97JaL%m9l zmsx7rIs<2Rej)`5EJ8jxV9&=WUraHLArH34=MNRB9xF`s==5{3e+*dPu|4 zFBVs|-k-o@u#a=3F%efFJmO;UF0wRtO{+-EA;-sIf?ama>W(l)33 z^`_667wHP`7OqIegNZ;6I)%$Nk>#nHBU>r%aI|rBMjoj;*!gESuP^p(K;umlk^+EN2GxJ zM(CGL@~@1x5({ice{aNrcjio&m+UzR2tOTUo?7i=8pg0Q+?Ai=H@GXjq6@$9JyS)s zpeq?pL+ucvlLjiriVZ2xC$b__uPMV$o-ny^JKvVB)7FTS?W$*UGKi_ z7q$Jk$i~D}NZ6?3il^*OhZEHdiKlXti8U zEXE%g@YSq^8d;~=1F5=;R(Rv)jF_90tLZEj{wE!zx?dB>*T=gkz0(+Tvbf}eu*_@7 zsz*h(?_&0PMnmNT&+y!0$ddk4gJG-oroT6_Bs(T1=iD~`DGh%!c$C3r@@#$mF?z5J zbrX4`q{b>}LQmz#+y_hSM z=1jCr%baxoT~d{d3s;Lvm%pGWDI;HVL>qVYKgM`ka`L$Ij=E2jX3c2#$fjO0Np`^V z6^b#M3*D?aF+3EsN~SNNo}eH1zodVfA@NMHqjBEU_!qGNr4Vyg4dW8JA>|&^b5tw__Ag@_U|I{_N}%Qher}?3Wg}tHc58U7@agcQM+=&7NL=v!ji!L z*N-u2f=_f@9x)VQ*}XU03)E#CU5u(=8561<7SvA9#Cy`F>{U$Y6RQ|jI8vVIz9Z@3 zUTl>90<7H}(0R+6R5CL1+11~m7%%PP_HU$Tk3YOH`gPsySx^39nX}t>nDW0iO5oEE z&=Ncwq>ZUxjFOFC8k;2)FrbpNPjwcoFfbCSyEggkNl1bemss1WAb;jtOqQHjfE*f> zvCflyoDJS5RPv7dhaOkfsn~#Dq-E{gU%gwA1~9C{)YnfLEQ*sF;&*g*EbT2eI~S*m z*3@-xCc=!)5-jS4eD!!-d?;=pZQUbFeBnj(2f}|9*A}gr>||u8Tgylr)+%AT1B*cl zpQG$;j0eXQ9~{(rbx+?@}*Iynx#etAc9=HU2Z%69CE^)6xdkCpJe?%%o3#j*#IgJE>* zCT}c>_i`&a%eXx>cD24x=T0xT>|tx5g8l6FjCE_nR?pohYoz$qau%?)$K+^BLlkj( zD?xXy`Q$G!q?nOsQx8nfrrz-xg&a1AKa$;Q`axCnffycMgk2q#3@K>_55JfQ}rC-*C=eftKSz{9JpTpd@v~#x3 zI&NLtDweRZ=wv2?U2!r@Z-r>7&%@5aOG%MwHcLuk{;D3c)n$i{MJApZks~Vv0w{y^ zu|MHX3dT&=uGVR+{M2yp%dkO{{mHA!a%vSLxXS!JYN=SJdc~sI3L}d7=7)?)^H?>m z?;>Tr!M^tTrctYoD%UKpwz9{kcVO?#yBaA)W~n8oqUOnN{!1%vGRw${)Yt3H+>0PS z+sN%H8Q>Ik{JyjOiymsJl42B09&jh}exC}WyiIKxJ7tpIz;*k}^Twj2-|B)x;7s8? zwqBC^_sjgVQ_d3FdeiJ-x9w(YO}(Q*0&neTGN?r5?C1JL5{)pp7E}0z0)r^##=(#> zpkD7f`9q5MC^}7sQVM}oMHlo!CgoFA0b}UY+$Og-L1pF7tSgdUO**Na037@nbz7ve z^!YGmAq^iT9I(upu_Rjg&&6^wOLnWL<+qYKnmuQ!a+1U&?8PDC81 z_IzT0PQ>Ct7JU9I$Q5YCUbNoC(F>NPe!V=|d})2Zegz=`mex01nO{?08<(J7TgeKx zf`Z;2@0_>Zc20nDpzHlLlm}Y!-`?c`?IK{^m`v4*fy1T!fU+#T=7+`zidXvJ)0nRI`Ua89p0=P0|TPayXqq4=>_D9Q~F@t@xRPAT`yrXM?h8K#s}aleZtT(e!ShLeG*Bu!r) ze?$Z49zSkA1Nwwy_OVPMQJMMAd%EebRI!hpOMZ6pJj#4V0*(8Y)0W<{KEF%iv{?4O z;I#@VV82+_-Y0S7!I@B-@+2&Bo9-CI$>1Y()cIoDoRhg6=q}djuWvuQ`m^M@KF6JA?Cr6iu-F#raohdFq{WSxyv@3hu8v%Q(7m! z8%MktKtT~j5^uEAp-3FBu=jpM>?3RPh)+J;lvPlKF>G98Y-tAjNI;5Gp8??ijZp8OXH;0jAzfW*9U`Z@Dkr8F z3)?Gn)j|$UZct@7-@lHGwfVU}K&D;_CCt1FXd?aTH)1>I`1w+i%wBXd_se8QA~4{m z4i~lwn{Y9YD#7lAvv7N)#~~WXv^rL>fYqG6kt5=}UAGZYL;2BYJ!Fs!Ths56MoAk> zee!NJusW$)%53lfXG+A3Rb_{!^JMuGor`#_2v zAlwzM7&<-J0Ey$$n_U2ZbtXen0X4}F8tNtxjQboKT#?3<4^1R%?12BqzCR#k1L=Zz zR7fR$Ptwca3Jp0zNvIV3llvx8U^mH?lWppuXxKb;kJ$c^|A)5|l-qJGs?4K9sbg+N z?#Yz!BfNocW->>@(O*X5#eV}&{Xb4Kfyt{T^BkI^={pwKt6QgrQUi%!5C``DnA^d!exNH9~RM50S71=yek zK#ytKp*9to%P8|9zfecRp&`wqO%)lT3|KOUb*5x7Z35=eZ=+@SnF9fqzdJe6V;{AB zgBo^Qr+>0*#vJ^iep&1`YRfeH?oydpAq^*F1!Hnv8{3Yt?#X}C#zwF3_?utjH@1X1 z$5zpdwemhJ)2h{;lW?To#58Fu1MtM`o^=DwfSEGCPY`hWidvsLxh4=LpJveMVRp%W z9I|^jH)O{S^AKZ_1UDixD#OS&kN=!0v7vAC*?CaZY3;(b(V9Q#+2`Vv%cG#^1^L&( z6XmUSdCA$o7bscP+jRkvjU4cioA1;5;n6KJXGRu0C(`c);ti;Aj)+@Oi^5iL)W&A} zd#56BjY;$KHg(q7rpf`_ga>}1puNP9Eb9ET9=E^>rPYdO=5An;`p9D1=l)=l-;V-u zh;D`oF~YT6|As~;jfL=ESc&@s?(-s|&FCSE;e+J<-xw1IdCVRJ1W$(RgBMMPAY}|Q zBoF6*k)dMB7(Mj=L_R1^8Kv+s=ouVbF|<(J+yegt6(Ms9u*urFxqFav^6+J7GkM!?a1iL&jpY3Ovkp9d#R z4Z}*gYVvZ$mQv{pKA#=A@1sxi419O#N5}Y%CEYL1pY~lVnqOA)>kz?Q=C>?!tJE{e zFwOW4b=nP|ksa3&blvX&Jqik{n3Pcl`getQUw7D#5W+*I8Nemo89tLTg;qRR6 z1j(%B7=s3(QRE}|%2W&%MjCuV3)FmOA)=0EqEMG+SD&6gez|4!k+Gs+UJ>Js+#x`+ zmeYnnmm{L25o5-h7Z}9Jf+Ieoz~I0KQH?BXPxETG*C7fkBPHPgv@H8Jm8n_7H7wEP zxM?CqbIr1Z^)EaiWt^V=y~h*d;2>m!xnyuNscf!rFP~FclG4-k`F(Xt-;9+ zzgl|buC0gBA)f3Dre!aZ75m4ZD*k7+s%Pau5K&lbe~B@*#24_!%$8E_ioVdRP{??P z7v|9T?m=K6vB(<01$N?Si6PJJa!zo}gdU$HsNpP7yFku{H#I3|GF^SN!}y)@C5ae#+S~8+$s<3*{slqWV98eJib@ru_0)5}Kv_9rRmU>li;+&$ zf?|%`(2PcFgSbE!i1P1|S4)E-RA7o{Vp#T#5Uem_w_@T{F|eTb_L_|8S_L`Gzzi+} zI?tA5^oA0E$R(gj9o9}5T9_76jKbumN#&ssJy0)MX4EIl6pO7N{LNdKscc?1B0Q~6 zvU+f?4(NJ5t2_Svhq~d4L~q~Fi~<^5CUaot8dW($9#PhWA3IrsXvIT$e_M=trCDbl zjQ4Xm=0~5>$=@{JS(>ibWCKm&0upmZxAV2tI)i?IQZ*YSn#+0Z^iSK^!RxAMtNVRP z#Mw*G@xjTdgks1Xop+R($IzVORuBCPw$!J0s9PEaO^1PgSR|itiq*b6B&h){$jUJ? z{PE<%b%fj%e^9}6K_GaRwukT9mTQ}6onhfZ7`0qOewvpZ``$ppu(_;uYcBmPu7y%g zu4EY?@#yLE+tjo>0H@8>5b{TK3Thih;W& z_M|Hm9+8hSgn?{7zwh}&&CAQ8+=Mv}(v?Ht3ZfB2e(2<9*|E~L*dNz(&ufnX+w0I> z%7a?pD95}4FwOx5d7G@nrWd#^RY^rU=SF4B!N1RpN+vk=_wrd4GBYd&J}?FoNA=NB z^l{wPi4SCD(++a~t;Rh38QqF8_>$%V0+s@NoO}WT99C8W)?DU%e7sy7mYiJXT;@D{ zJlvwf|F0)9@RVZ6A$bHc1e9Xvfd7k&%Clzcf@7OLaxIF7V2u%m`H(EF3YjD!i77yb z#iHB*O$moUlROTouuonLktD;JNgVbGBVrY;anB&Z-u7#;h~b&BbDW3}DQHPKuJr|o z?|D64xXr)xUu=E3=mDqg@lPj+J?H*8RAmvp6_DVWt`G%AAAX;(#?Ozr2E=3S^6$Pc zV(E_hT1I`RBC5TQ+B>uLglc_DS(Mo2eq1{>a}DWf>L}vx?`;v3&W$kDBVkk>3#uL* zLSShXG|Fu-*OB{y;8=>}+9C}<`7?^f5fP)F=Tcyh%K^T&=tD-RtWkA7oWd|whjqTC)nam*gzBCOgM#g9O@haG@cvCEws&*efp zJ@CMRWV;8)4|lXHe7)IeKWZ*Ix>NP|^$Zk-rjV~;Yl(WK27L#4-A&?{hjbDkkrxv) z^zih)a%>@cR+;ff(y>Ida@g+9j68n}g)a)E_0_J(_(!s529nqnTkm&t-GXtbzDcrU6BtOU`VvGNCBga4f|Wg(suA$)&j{-EUyvP6>Uf^Qv-nS zdAs5=etZSWUy=Mp=}fuEofq(AJC6%&V7niD!_<4Ob>#V0d#HgnB$3G&Tnref5sHv$ zqNVpOm8Vyv*eaPN__L+-J(1L1@J%<&BFo}w+A6-xVWp!{fYR>$fxWxsw@&*TwISI^ z&W=pKOzPfFvnQ7u>*UuMv-y(%RO;h9!U5WOH!rbN2Q|4?+AcsV81HS8Xretds)}UL?pP_2|#)RIn^_ITD_(@f6W;EU=X-0{ zvl_t}=^!}~GB6LJQD2h>)&5&4G(rH7eL+!ti#s7TqZ5fjHb_msF9d9 z{G*v)_4z=ciuGf}agpRNcZ^0+)f{NI)~@5EXZnL%ypy|AK*Huf<{sC@8%X9D z08fxpI-bH-N4m}#7f9z6(`b@}`kSC-&EQ>f>qV4fv&7B4|HFq08JjQ&uzr#qC&P4X z7HvH*{YZ5UQ+p(*QO7nYCD)4m1im7>+e#ajt*r46G(^%Y>R zGXeVW)>ANZ#w07wz7i(d( zw6eT$S>N#VNhP|^7MYsxZ*VF|JoJ3d?mQmm!o+jlieLHnsQ9)wBz`S z4gT|=Jidky9g=&*FZiQXlaws>e6IcXWH&nXbvV!>wOOQ#?r9F(+oEBNHRJt4Y`Tk7 z1EkE6S=4A1aMvlFh}G-g5N`i5WT-w|k9%p_6ZH(Z+YZ2TzWitGM0q?2tLf!k=m|Sp zVvo_kf-c35J;-h}aq6|A^W5bsHz6AHlR9}nKj$@r=K1{kn;;>PC6z;n3J0v^Pl6G1 zVOleHWofaNzE3SfIxDb-mWIj$UMnUOZ@`o-SiOLNRKt59eubdZ0*~P(u;Z>1ge;-f zE!1N#y!{rjCr_-RhIY!qk2|{Kllu+pJ(WP@(KV#WkdjXpF#X2= zZ68r*PrGa6Sc7;h31Pqtxt~3@@Q5FEK+A`)`U=uyK#d)TtReEjg>br0KX%ES5OqZN z@jnCgTv9n-6?yeWqyeH4Q@+9QGn?I4TY^v#dFAqaN7N(D`DM*M5tU3+TUO;*AoC9D#Y*MTjA%Uc2WLi~WCjcR$BrUU zm#A-pd={9z5k;`7wg;(=B4GG&JVj?~J1o(ZCAw`sx&lEuEwlk{;#go_UF=}Tt8RMX)Qu3dA@J?t3flfr z&XwuGX)Vg%DQio~f2i^{Czu{8@gY{5$&v}gR4d8{Ra_(Im$~zL;+(#b6`CaY@t$hm zLQGTmM%7=T=oW^o8M;9Dm_00qJMf`7=T@GD|5`5M~b#o{<0Q&cRZb|Jk&g- zVxNb1YaCsnapaV;ou0Y^#NVJ!#?1>l$^{83{(R1je?DO@oGw}dS>WmXAr=0HbWLtD zO5}s(d>buS>F$c5Ktnos=7V)7APws9e+=`+jGC=%tlp~6PzSvKzy7II3$(>r`EYG@ z9@X7ImN)4laO!IkOVftCyyNGmqv_li_Xuy_fNMHawJcB4BikJcZ&N(IQ(YCg1HT}k zl>j2a4160O3`qW1-YM$fyXH37yS(G48gD_7X+M}LidlVo(xC6Fl}8}R1yFaQAlj`f z%GV$$;4a@V%#Yf+D4)ptiuKf3D&baYp)=zC><%aFx%5YYjMSSZ5B4Aj#$Edt637r?v2yAf;X!sIj>_@8P^cR9exJc_sx z=kLOH`Oy?1+?|}^la5g7Maf+gla6BfV5;qm`VfNt=+}IF4hGvFl&;w2>;FkQAfn)p z%EICe;olVDfk+=RPf_34X1!352H1#AqgP2*UZ%Qt{XyC|W(gd+^HFtv3Y@lfmE*^C zL=cBYRh|uASK52zv43-Hz@aslbBOHLShn#u=e(CT9y|{XZ6G@}uxC7FJT_ZMn;Yjx z_Egba<{JG&O&p2k0yiyTER!1naH%gp+nD3B4!389-nv4t_RCcELe)tc#~8+iSDx8D z6J@9gJ&3;oHFth=yyx_C!%!uD{_*$KTe>mq+!9Jwrxyo+qP{@Y;%&cZ=IKOAHJvVr&X)E{;pnq z-B1njSYHj{9}F4{77QK?5&R<h zxVO_7@&Yw@nP8UrxrN6y5bVRUKXi+=Is^byT{Aet@6jFs#E6!a-s&Z3c_O zbbxzp3D-`q3au5cSMv}DFqeg@liD9xqn>FEk_|fQCKU5)j+Wdz?1fE=IQ~!I zlOz~ib3IcNmi;dfQLz0$kwB?^`=+$;{R7-QlioK8wVs&VqBU=S0Le;Te5Sw$)W2YC zqhmCmq#=6?4C8&YE<7}IFtMoC%hq^=G0X&bCAz$W!rTW4uVGvbeT&*eu)IAqRgajs z1_H@^ntB3l^qHy#@fiP_=YB27DmuaZ*!W_~)`>OCGjeMLzJa$|5taeX3Y0@s zWersWrlNvOYI`Y)W`9B&Q;}-y;&@D}LzRPVDer-0s6!A)fO_xnfPG3jDA)d06TB8$ zjUU}m2;B;;nQ~oEA7(r`Dp5_LVvDCTXL!7aaaAA(R^CtbKlu8TGZRV}-jQlO^-NWQ zBLgkz@}T2|P)Dz%!&V1n?00xthMMzO6tt8?z4gZf5&c{(wl<^gFhzyrL#F~E%%k`` z>Kd|BqK5)KfV7CLn4UUu!>Gt*EGf1ra1VW0$#b}3ZpqnYv?_M9U^bWy$x(dCBOi)q z)pb%dNHwCyA*z^Pblfty-j>PlJ7zE<2@Qyi!7WR$=@ff-0w*LQsbW%4O2vNAHVML5 zklJu7R7OuM`sv%)YqE_mtmcU65;ZEQO;JW{VQ%xsY_j#N36ZoE(Ok-^6v*s7ph3T3 zL~S^Q=@iw{nPk?Wcd+6i(Q&9n8rZE^W=g=k$i;u|r+w|>34j)-@$ca=0QyyQ`&u3T zT?uvEZo4B{C@lTEvGrR%Rd~Q^yje}7lM5s7x~LZ%?rHiodR{#D@NF=V++IEzcHf=$ z^J>+tQpoMi%+sUi{fOyo`)-|ne_c2F@Of?}%A4}j?b@8l&7Ia~@;m+Z+5Ps6bpJlO z&>tUke)B)hlY;)3{?=5x2kdS59FE)5y~R-7bS8fP%VYXBckH6LH^04_dto{?Y7Nf0 zUm5%e-evd7b4il8Nfw-<&hhi-I*{}rOOP{I*{vISipiqdzAoNR^LCuMJwjrgA(TOi z_rJ09{Z-Ss{BC^zOXq%vej?XbaDZcT`iNUj6zLRi+o#(F4gV8s9FUh|2S$)%AN=ry z8rx0x{st4)^T9RXId<^xYem1VD>8Po_A2O+3kSgp%M~3LziB7H(+krHYZD`#>LR5d zF$ec)Hg`y&mgA;0pzE5~RqGvZ_2(DBMcym>pJ%g{z4d`ral$~?K+M_om zlNlgGAm`sL|D)KOIbb4cefC0swUOxC;nU2oN7v@-bf6dPkx8TbL{n#K!E`s<_8{yp z_Ci34niDo&)z*(J+C65!y(GADS%$;sHN`^^D=_R1lwk}Q-HGYurI8vYzFw7Zi+rH2!(nl+-0$pbusktLz%!TI_Gx$O=8FL9F%Vb7fy z3&CUEL9M45S^gli97abBRARvtg0Fz?kusLqzVkt9HU(zM;1W3Cf+!H1UZ)it;NbyS zsSt`nA^i=zYRl2e2xAD*8Oh?*L#vAPvRRW;>tCC(Nd;5qL6J0QRu1UDu;4Vp&%wp! z22TBUz5XXb%IqS=wjhV;P+tYz-f4mm*2q46bo$ zs(VyLz|*H9?cxm1ZIeW331T)Tbe?&|qcZB;3%eCQojQqLAKabpgMw{|VH|)ev4D(V z+srJHFD#{HNa=DlF;b~?a8oG>eOqj@KGnh+a zmPpQ7^>!iN=^WJrX)@#_`|m+Yh#bgI#jFw#63h%DIVi41V!#hE{Zde&r4rZ!g)QYf z*h%y?XfAU}s&??rIRlX9zqVK!x!^7nl-{^l_^^+^NEPL4Y6hASNvB~48u9+myoKtio1vK zzcKOYoX}}0UuAP(>{(Y$j>>SDE9PpT};FFy0#kOm7)k} zdy5|NIZx6fQ+lv`^|8!|5y7S%(rOAdy*@V^8c>|AS>BE!JiC>k0XDb*h!VbksSrJI zt}cCpS6-R2Rd|5{D%C?n%cLq(?!0Z5i28ZUjM0+)k$}j+_JoAPRqvploxWhb2ztUl zFe=nXv{HVTF|jTN;EP~K{ei;gnhy|fDw1J*b=$!ss29-Ioc7rs!Q26FiHI9^VAkWM zW<#miR}fi8TEJTVE*7zlXx5$PtE@D_*9Z0rlo1(on#MKs+)U&kGhFeJWgn8OrG;;z z#9vAXfICNl!ogV6mn3ajrw%54_|A`TPSa)D^qMmb%AwCspL$-+9c(uMZqK;|juHDVAzmnOX($p`WFsrdX{uJ~rE2_0* zMPR^+THvfASe=s4nbP>XWAvdi|LcXKlHBBq0u(k5`!wrx3u^W9@@nEUsclYwy1ex| zquwIuRbVhGT*5m0d3AD?W9tdF-rZ?|)K4GWU!J|V}6JG>Gz8^V>R)TwjpR9%F9 zKlo3dt)ry|TpZT?im-Scuo4;bZYF*&LhlW(6_f^a#xg! z1epE!WYpyGb{LArXqJ&k3zZ> zrT_!MtAgC4A%a_p%3!mCF)tew>$sB>e~(BrHzg7jsN;|KSwAtZV@eLEU%P6G&C7n? ztNh=AkF2%~rfPjA;|bBz_dZAxSBbO7odERBQe)Pine-|21|e5Au%}Pi@7VP@8lbpI zxRkOY`4-VJn)yw}&}oSq5cuTo={AR45F3~DW0SEbmCW3=Qw2e=vRsUdX?dMpz56KX znzdZ@BDAIwb`r4|gtuYnv4nBsZK3es^BiUV<-|8*YOqrVe4?dDiVHNzd~W7bAb=yo z2X<^Z$iJ|KQ@$%yiV?}!_u}i}tyYM37_{+n2h?-+uCjP_J2d`lG|Mm}esH{vNRNbb zLQw=ypw5}9#*FIkXw%)Q+8YlrVv)H#FdowlG84ox-b0s-J)0`J z2>$90Der^bSxl~_m(yz0+wkB{6s2oW6%9l+zL|NubR84!+&vq$LIPZRJg0PM`~1U- zB8IOs5{XKr(%W?52L{0TY7?b-asKRzJ}q*YCe8$bt@YH_UH5;lGW~jc8_c?T{yf+< zYit~L^W*IGxJbQNCuXW>Gor$(xRThj^X{d2_QN`?;~vT4uVUh_aoZTK(fs=x-Apnh z5@Glp^DIl7vM4SID-ckJ9JpztJ`O;AVlx_Ba z3fiT>wBz5OrGOJ0)-rmNiP1eyCApAJS3l06hoiMcI{@47(zSUeAeZ#$G@C?H-Cx{qK~-P8OeS8!|Ys&TN?d@1AC-HO!|cKJU2c`&U2IUs1p0r5agzl6oW z{QI{KzCP?Oc%DX5HC&X6oPcC_IkK%vmmqcHI~loCvopYz72w-{ReAM(dhj~!<=Zhx z?PwSIW0Id6DiQWM>G_1@?=A`=g4>@v-|{fw2LAKV=fV_I0_YIPYw&(*)z?dTFP@=0 zD>KgDZ<)_QZa7I(OR@!Yf_#J$M8%o=(@hcF8=i=R`GpM~gqUuBG6PInb2!t}n!bIr z>JGH}P$mH4XoMQVFS%6aWyO>y*@84whyS8M)&ES8m0n(2MF)?gVoL^Q*_$s6j-8C( zR)s_)65bh<&En%8p4~F|@nv32R)h;Eu1)Dc&wlIlXBs&rWttrUpaW)R^}q649@0wT z+~HX)w2Ci>u`?eA02HFesS%s}_Eqbc!O?2PPEY`!Z8r3Gfm^)WDg{eJliS+VS|%>< z+s&Ps!pE;B^ihD+0C=T^Y2#=8QvKuX;?)8C;8p@!{xY<=Jpb2%RlmiVyd<|{VG7Kn z;)C8+|4W#IuJBO_X_PUgKdmdbTAc!0NScjgn0b7099>r&H&Wb~*ue|@ZDhS`)xwM$ zyDEUO*}87qDhu*a4-6hN!8BUE&T_^g6a6_CrMSw@a<$I$KBJfII&a4o;MbC4k5za1 z?&@Q4J!V|OcM!7^2aG;fDT&#;pM%eI-Q8^VP|n zE@;>!Q^Pm+a*0fo{pKs+AXl#P@ypd%q*vC$doxDQo5hNwqblVR-0lZJR$uBFphPrw zl2)IJhZYueg9n5UL;yqxL2NEAp6NE}E4ND@d2NE%26 zNES#ANFGQ5=ogS8kP?tGkP6UmAXOkWAax)OAWa}GAZ;KWAYC9mAblVMAVVM{AY&jC zAX6YSAafuKAWI-CAZs8SAX^|iAbTK()}R|lGhHwq=GF^2r=1@F(Db1;ET<5c-}e&h z23^ejeg)Hr6}55$5<~E_W_MZuQ$diZHLDTsSOn{WfS1zd;GW(xxA}HTloU2h)^5}3 zP|YY^X#I-F`B>f$hh>K}T`i+4+ca^bwFqpTpAl^nIE5RA;z~Ovv6aaAtubDlr! zR$A}|FVLaiW)@fgoyCYbe{1b|VAf}EnCs6B2|57M?-ta^_#UVij=3nW^1g0`60=j_ zbV{|KyeTxSn>*v^ww{vtSDfNHA-F-v#j@F;&oLAfqY{oZF*N8mfI@VW$?9aMWJ}=! zc_T*kmaKgfo$R`-WVMvEA$iOchMVGV>+&->ex%D@UVt<}{+&9lWKAezS?GV88#R1;`q|Gx=Ej6LH~@ z#sV)tI|xc}(wABfTR%P#@#X%7eM#d`Hzh!d6|}Qriclr?P%M$eE)RwhuuWK#Z_Sj! zFB{EU%3cX@-CnPU@4?aC&(-2BhfPXSB^!A}Z?`uct(aej^v&8@4>5|tZkgIXLc>l% z*GtDIClHx-k=mcv`@pK+{DT&hfb))WXtySJnzC72M%%UUq#_^72i_wy!AlFn=$5+f zoH{#0-yg1C%u}ciU+5(O3mIzVm0sp@Xq8*eAm9f09eo(dRy3o7JbcF%BpLwPOG(S< zQz2r2@AQ-={xfR=?wmF}zo7<7oFMCb=vgq20y+z!(Y+4rshQYlnzdt}ihP1TTKcI& zV`rPZvm8++?=O2(A|u4^s@V~?EzMDP&sY$}T3nS|;-oakS9-aa+j+3Ae2w`iFT zuQ?+CWM{J$k0aJw(uw49dfF1>agGjk`MuOCVZdXhkoa^by#B0lr&Jc^bL78Be+_lA z3i1|ennK@{!&8YbbVTV)Oz-SomIhwIw^Wz&k$}333GywEbL|_FN8TU^un!!^GGh{* z28d-coIhgoF?tm9{y_xj^%T&L-f;!wfolu^S}*<7%)^2or;aoQQ%AxtCRQ%8ZhpDE zD`Y2lte;<3bGJnfuW3tEzA#bEXSWvx>&wMjy@>xFZd(Uul{a+UZ}-!Z5s9Wx87Y<4 z=eCPEBUXkvRbUsuho#iZm~p&P&}g$1(}PJV+F|f64y-nfu;{^?H=UV0p5M*AX$=ej zZ$EuvZz;MC{jCExu*-_PXcOE31Gzscs&|Mm%xFu&7zZo4X`4B@AUzzp5LQ$x<~S|E zt{OzHB~~mp@HLnOYbM*P0mlMnf2}yvNfOgA2L@>oTz@?^B$T8qV z5N1;eVmsk#o?j4QzldQ>IK&F4LU0SPB2>i|!rP>E$>@ZZ%Vs{F_v7J&zALItd8a+axU~8wX7E2*00)xPkR$AXb#M}Z1*;UDB?F^z5ONyEbS+8?vx%K6#nql4EEL1^}PRk~r?6Z`wGJq5uU6}y=A zR3~u*I6?dzfFqd#tnlM7`A0#ElJ@aT6}NBfR``U;6j##foV{h{{A2)3?;i9mhj zu`qGJQ~8T7sw3yTJu&>C=zcf&WCE}VOwt+Xv1W@8Cn+s%@^lfx2{dQ}1VFG*Kn`vH z6|=h_7G6cJ7r@_pMW(@|7}%Gmbm({Oo?Y}4hCRNkL%!uas;{a|SX3fYPPbI12;b`T zN$^qXf;*R*t7jq{9~A4gqYN?MKO2PG8c(KBFHyv29k^vBi_Yp|@}s$V*p;>PwC{Ww zHo=O!|9-N0*uIwskBo){EPqj_C|~PVQyOYx+j)(*;&pP+M+&qL{9A@QfNa{Hug;f} zz?tL@kbBGcvm#Y(r_$8S9(;)4bh}lnORsS_UG8mroC$5H&VhmpQ~R)u$n)4Rj+`!LyMdJux55uiZV~&e)eFdB>{!9V(q#$rbUQ%-eZJxE zi5=HME8G*ho>Ajoaiz?s-waMben$68||@AcfY{3gS)YRcFdmnm_j4Ym$pj zVV$Il4PokJ_Bx%#E)>m%={JLJFHexzQj=+*lVdY(#R0mOf_^%IQ8*Z6U1+$KVICp>w-50Izdm)Z7IsI0vLaRMs z%z@D18PqYL|IFFG48QLGXp0SZ`VE8Qh?(IWr%r+V1gQN^@72qzl3tM-83vFHUC!gD z@tQF2Q1I{#{a(Y(no)AiV?q?9x>y~(#0PP7ppKuv1g!v1q4(p+@&@q5VxLlof_{(eB1pQgCQ-rKsSbenQGXARDht=n zfB=8fY+Da<8xvcP7#$_`>}N1>-FSyB*D_wh};Eic|74XC26HPRrbg-S44*)%iL z;**d|4WEQ22lH5`6m0K2)S zr1eeM{MX{59)_0?8@CCsmQ%b-*Pc?v6V| zVU&1O9^SO1=ydO3%-WNc=WnAc58j2OImTS{(erz}4@s>ijuGtKQ#+04ZU`tJU(+O1l^Cj>=T zI9{5tvlDt+E4B+2fQ{>a54$V8@ksjiyX)FAA`jauWf2vq!6|?H&>kEjtDGdHukWa0 zjiPwvl$3QsW9B%?L|qvg^hn=%zJC`*zi7V~ODz;w=!qdPgsf|E_Gm_`dfU-&jtFcxP4O{AympY}$$tJGnfB$z zLgu=-T0hFM9pl!xnH*DHFT0l-a+iC%;m7=)fikhhdVX*G;9OnkNzVU}bPM;{v$v@Z zI4!7Zzw>j|CA@2G*wth*otpC)a9?`M{}sCbsF}uPfMv1bv;teNey-;p)Q#fT&rALV zhOLIblgESG4rw5C+J&@nNOGp)?t_|R2SVnI*mf^E8aKQVfMc2j4=L?XhyY`YMz>M% z37gj`24ar-=Y-UCUey4US`Sh*fBS6@@Z@05Z9PD;w}oEswL)hP;|%L=hY>L#{p-Ha zqj1C#AjwEJM4#bCGG3H`z&MW>WYRJ}5eL^j$s5DGk0*t9YxWz3U&@S;nuXpa5CSq_ zgwNJm`bV_R4}DbBL95Or_ohN(hN>TiOhq)_klGl1{-jt5%kR#8Q^*n_KQkTc0MUav zQ*aqLYu`@KXGzI0d#V`FK8R!vpkt}fUIkRQ+6x7^kbNC>-Gx^{=@}A#jL~{W1asA~fCdaHZwi>WAQ?pfLLz*{_>#G2jPl*ZmqSM^SFXn) zePq(?rkKdg_Gve=k@ynptcy$#NPyXH0yyvRo%O-I5;}^q2@?940(Umdisn4MX^G%7 z{Fn@vHs?8I?;nQ1=8nK|^DuREEsVWNeL*FiJ8T6mELP_Xv3x928GVj%Kq02q(@*7h zJ}Zrt-V8%Jt8(M)w+4~wbV!mrbwbmmw%o>1@`Z|o#_(}5>ceKN3Bp+RYUT!65(@@c z)>=N&&hRT|BYXTjDj3!6p!KD-lv&eE^Y!RM!!ZyqXu!ZaEp*JB{f)x~I;m^PJVT)@ z)M-jWN32bGHX7SY1%XX9AetnoEX3JK4Bkx{mM0)QdO^$~)<%mRdtDak%tj=KVJbty zmNj_AK(iGLBbx=1mfcFM?c6JO4*vNWVtZEtQdZ-#)PWo|?o+oc{uaVDSJ(H#w;}t* zLRjeCsYTwc)%IM?#(=dSK$hGxkX9Is|1(q#+NjYisG^BF9}edyAaYBztPQ!9RL)cR z=Xc-RPR?+&*vxMwyn7kJB55LFrct!XpOKA<_tc-LxMXtl+K*um{9YWbXUlFy8H{GH zaALApC^(u4DImHm!6|~?O5j{D@Wa=t@sreI!9Qg;V~r+^FL;-$TBd&YZx2M%xGEWk!g-v=jRzneKiF zvd<<4^)^4&M7WrwwT=;|jO&4en^lZGRPJ}N^2@QIoEWRZ)NLh*S(BWQI8?5KM&`l?JW*_*NaV^n zy9$VVdm2480KgiFTRj}ttZcXxAa+z?T40VKyTRmkhx*|!-V#kZqtr|`VupV_@LSmH z!VVl@Iuj;2>Io$xK<$QGP~@qLKCS^GvV{eC?+Fkd)m@t~zl5wR?pVjRi5T&cc9x$E zMqr8Xx1rNwG~Gfc5!75Ym|5Y{EEy}~G>hJw>_yw;0Q#{*dEx(>4e?cmt>cN%Of^J7 z=y(SBN^2`x&ncW_^GgxY3U{d}Y~#Mwh%dy)FC&p8=EFJ(_6)h`zUS?3q?jT3LV|Yd zRl1?kvg^-ruVR(4snTJk_5S5(1e4*=IQ$Qx_o}WwmUf zv;Y!P{1neEZ7HJK8oYF5`gg$54S@hh>Y%TQJZNQ*zDn+gE6tmcpp|8R1g66HyB6Ci zUstRjAVS6MkJ)x>T`W2b4;%XmGRHaka)Wgu8^8 znh1=qa^^^bL&8SE1T=UQy9)*xKfj{9_o63Ok4iqc2evCG^>0UvaB3AU?x;^H^|VuB zLMd)j39NW}g7)LM-Esgfi+8deUwT}5B!5HN>E1KBDFAAm z1E99*qEKFW4D*FM#C85ae$Y*5*{zR#t&`6_&F$b%X!@G2s|A7T!On>|6 z0T$6o<~_d?sj~nRJQ(#rK)NiWVjUp%7l0szVP~Oj7TW^F4?pvz2P!b{q`-#$52vMf8q0>z1fYF~ z=J_f;>or5~Tdo$VWVPklTP7O0&Bx=PLTHS@{j`}ybR!VoltL%doE`lTc#Dq9ZH~bb zZFW(HgCkUjd-*aQi$11H!xl14iw4c$ignATX63AAzO?UF(^hkO=(uvi{xoFK>)|k#tkJ>_w_N z$2+%i**j8%gd>AR{5l~7h!0)2xs@qaaU{U?Md9sC?cz0t?2uk zI&KPvqS!;Wx8p55x3}#UQu4OT{nE=F0mnbMY`S6WHA$73LdP1Wo8Wm8d5v+6Xsy6q zTrgvrt|w6&`2z;+1T{_`5cz%*IH^}n4R?-pe|ePw7MM}&hYQ9ij6Cj zJFzNe@w5fq4Pfhn zUj~tE6lS~n4R`yob%TiCo=tz@SYC5_%qIPIJ=9|NqI>>$?b}#+k8BrWV;~65MGtQi zw@j|4OFBhmIa*<&!9b!&u$=Mbny&c!q2qiu`0ZQB@aw4Z`^HgB1I^6# z(+>0<^Y2{Z5zkTlcW-c2jJW3g!ozL8WRwv`RI_^huW!EfB%1F_nobpkMP`N4qh8a4 zxcg7(S)y}-QGid**Oxc{I`eD%*4c$0?=R8&!!w&{W?t|2j(;CUfasW!bZ;E+m@h3% zY!$(FR@L56R)SOa$0PSQl%C1M8gneeVmf_#!F>sRQC+2D3l5`>uak>BsWgHT>;T5B zuD*Fk>Im50<^58G81koqv7jmdnBJ?kG&ud%V~S&xC=Uh&Ub&{sTfFQlel?@C$|2J z!aj&j9;a`^atO$cF4st^jH5yUD>=u5hI8*n1Qh?2*6_Od`Dh8*KV@w`C6~G5K33QE0Lgr}gh$NL*l<)G)sF$U(VLUOrTcm9 z@%x}{o6O|hLp1S&sqlhgi3hyU*RigE&&ff(57*A0q*8To?%B%h95r;KH3-s>D zD|uK7Gys?S4Bpr6xdKx2cu4`cdQ&SF1p-?8 zf1Q1g(d!89(%xc`uleX~mUAN5N~72RXbgI9UQ~zIEz?I{+bdlBdq;GrqcAF8Tomci zDd9Kv&TJ>+js2rv|AB`otIG@B_7m(e@i@#Bh1`W;azbiMWf4DaQ>TGJCZAA77B*L1 zCIDPd`C%cVjNBwOb@DKU%=Zf`t%FKJMrJ)uHouu#MVU$ z-ZZ9Dk}F+=uY^<|#*t>eh#_438Eg@f5qrzAJz|4Pw5*)b9#mt0qcsJ)(l=0ES1?j_ zLwS$n2-I>aL2A&#uh|!6;z(m7Nqflh#sdf)#c7*qwdAZa6s?pxGjo6U^<50?>wHSB zY=@`ot3kUikMVkHn7E}3K>jJgVi%QzJm`YJnfP^H@wi4Uy1(oz91d+a$K*sgAN$k zo}g+Dc~QfteH|IDe7XKZeWWlcpTAQT7atjm*K;J5pCr4A3<6T0!)+8syR4k?EWzWq zkdx@_=1al@g}uIYS2X{jz!ccc$A-OzUiM~2H=geX6FCrgOo|wOZ1WF6=|PXAk|{z$ z^`EnK|0}U(p%HEi2`a$Pva8K6s~_ORG+oxCYn=uCj3v;SwI_7Gx(#t7d@&-cUECJ2 zvZnDSyZWZZ`z8fzQ3m0*lJf z*;+5kKUsp>4ZLU12JyHKJ)Y~SJ3!G{!0sDq8t{97t#`T_W;gCS-{6gDtpwzByKuyH zx@Swa7->f+7Te5mWk*Dp(+OWkUf7{wv?B7c^drS26VpzC{th%xZ;8=cllf7`xaxD7 z>jtyw_Y<6~_H*6!gGF~9Nku7_a1ioL?YC~MZJDd35y4n!W_;ZWt#SSWvX|4;F|2tP zRon%&nneF#5q9pGSUNc*jwOIiL;80a1HD$VThb=G-SVD-md3E#VyUu#Z?5A6Wy8X` zBUws_dthz4P5lnx7Q)n0ta6qYo=fhid>@AMv5S&?e{kVM4vN<%(#uNkZC#P%5?JXI z-!#+aNth{8`Rck}Lvc8`l#IW)QoO%oYNw6VmCC@+rTA4}h2MN{NmGD{>*kMgw5L5= z&KG!``*698JW-Yq7gf#BE!jXpfk&v(%ybXfzaUqciY!nGs-_`@4v1_9tH-sQu9%&K zLJihMu$P%NyrdXnNqY+|0=T{jEOyS^h>?z0Lv$rMr8x)X&|l2#+^YJPr8$Hh4`+qf zKG~eo*kh3oLql{;?1ljRl;o5%8Dp|_^O%^ni}gQajK0T7R|S`KiI2icR}j6a=I4Ji za>tzM{!q_*OHN%cm_YJ`T0fW97GZYVx+DC9u7a50|Qc`Y!yF zS7(OtR2{jQ=$w#s+?b#_^jnY&ox_T!Vz9M$(K$*qQ)4{aO*?o-< zJe4I2pQ$h}S93TUWnV(_ywHqaO2aDr3yRF59@pyI`Ybzh#X>Io zKAvtDM?juelEVvVkhcTlqHwZlz<*UqTQ|c0^-tU%U;jG$ccYvpguXd)7b@G#sa#TQ zx#mIEcRs!2s#(+GV#htbQt($&)0`QN3+=i~vrY=kmkdaj(BC;?c$znDi54{651+Ae z`d|4SK3H5{Mv>%MIfeWZB~7L5z&gnC+1nSjHw=HJH{A%cDM?!+`erc3Zsx&%=6CV- zZ1`T-6SjC?SQ}zAG_3zy%v#m8RmVG6Jj>qZmiv^n8c7|qCCWVbe&75CeG*P=NULY^ zL~HF~aLIoIewGu;3x}C5?AAhICH!D&^I#r^vLujH` zYJ8OB`pJ1IAN~3@FURuNd1CROx8|!_P4C$|W$x+=Q4+_SO;Ri7Tzd8_BVJlb{>*yF znTZpxHWu9iQ?D-*UGFE`zxh3YUsjJ#vx?w}!NB9Qpe4r4deNB)z?C~Jy`*(C56d)1 zozuj$n|8HP=h=%@Pd9nNRJuE@lSZ9!RnET3RsCvGKqD|`QXtuzew6?K<;&q(3mAQI z-L4GmKZ4bCgH%ytH7buUP&{xg&i{0i3vrZD711den!gb-rmuxPo7kQ(g|22jhJ6Wy zWPHgdsJW)Kh6sQL)B?Ky3I2O;K@kX7_@$NC_);>#m?Qrz?!=fAWS`hLW+-(;o4x)! z&!|}NR;5i<&jG2+Q%`sMcj_NfhoHb4rQ}XKI*ehyYFaTIb%*!1G8-`^0!*|&VWRte z75g$`Rywq#zfe3)WMfe1#?XHuJS$YfT$SgrCq3?oDXvP70-PBc9T%=IBd3FClPA=5 zDL{rcLqM?{5sH*neA+8FpNdqvkjJZ#+oAdQqGS}h7FlWM8bz)#C}F-1r|4{c@CG!a z5smRwbZJTW?BPD>sYWVBlTiwmo=?I20OxBluT}aDk;oL4>s7JfUvWwYH71Z3gO0JQ z{`V?iFLwZh0D$A->*t@kq$Py6$P{YZ_euxfO;1;HZ!u43T@^mm*tsZx*2|R~;6+t- z9yP}F_J>7_TRDaJ+PcR=0}UF=N#Z?&mBjbYrRd>-3a)x(qmYx)mg=DiJe?y6EJJoN zPBujVBy9N}w{0uMrZ49+4f5cQIm(`MSxsG8C3IzEJK!4EQ*T@dfr|$b&y}NTzdSg1 zy6-v|Gf>y?EgB8wcm_p^HB3J54t{FipG{`Gj=Nag=BhF35BSHHgs{+kL!c5=0LuNN zZyk+OrdMK7bo}9zaE6oW@{=7&8$QH`8`4kI>^<=Rs}7E;=hbo8qmngG&Qx~f5=T=AuMt5LV*&iL41HLN$UOIGFNS1HWqC{ehF`AZq# z7uXjombJ(=W)gL1e(7bi!#M#9Ur8U5%@;D>zcP0tODrshoAukcT=6^fPM9^KA>C4&~9@qF07K}w0pux*WvQ!&I!h4o9j4U$#81_g&6Y5_T6w~<| zJH;pO^gxLEuv0Viwwbuf?(C87#_vqA&GmgvT-#LEndJ1JihX7LNtunmvZ0=ltTlk( z-cHs9i$Q5mW0M&3+nA}FDI*&0i9)9PT#r*sk}T1n5vPVbbTJCk3&eP%&HH_A`-0Kg z9Ez_SmJcve0-x4t%EKNx@4XdJS+D$%Cf_HY1CMh~PTS-eR@utXJ25LC~jU&|EB< z^@4za5z2S2H_Fq=Sv_5N>^e2Tw!qD{n3dvA<|o;c7_uOmby-zL8N*9K;J+wwQtc}| zqykG^n8F*0s7Sd=a#UPWbusS!s>H|;a`sY+f_K&(5U5l{Z(Msuy0E5Vb2m7#JxXEV2sOOe3%lXvc$rN4y!*Ae^Fi_S4mVgxanW93aY=efRizzC#nYbl&&BPK zYg)FpOJoT)fvk9;GIFgDVStt4%|C{W(_CIdLGPr`~D9k^{Itody^?9LqMBD|>v#+Uba31(gKFaFfW(x(a z^|W;FbQ@Ft`l&4Z_*cN_S&E8QtCrA5OJ0~CrzT;z#1(3W9|y?sua!pRXq3B=2+%{*|9Oiu6P`uvA@Zos{%SD;b`qlKnpah9oB9A5t*A zQmz#~t~4~N5yy>DWzqVH0QPNUm;)X8wcvKY0Vk-g>F(|pVp2`ndDpO%6(i;SMCum- zI9dC`la$^w$H0DYi7fs*wxLK;Aq%lu5A}Um3ILtks@(c-R+(UO&GrW{|GyEAX^rvN zEl%X_6S_xm24{VL38KKEP-iygR^l){XI8N9Z{R?BvR3ANv@R==o$G z8!v_h3E%6+fRv=iGvX0$6w!!JV_h7L}sUL&EX&dQA)X<<$qS zY_^xQ#|J(O-Ib_RVUo@ov~?F+C@f)lm1FK;%lp80j=hkai&Qg)MG!&k-f^xsgwejl zBMBTFQw}%@WCP%jnE2bW;ay+U18 z1`r?m^HR(=mjmyp_?>=66p_JEM`y9SO269M6y$H-N9wh?fM$I*0I^`GNOjoaP=4S34j zNk>7A@nfkayADFH_V8ku^%r1D zs4`dJi^($&f&LmA#!b+GPpxyLd&G=wvIp7nE?s&rK0~J<2b*O^PSlc4`!CamTWiG` z8o9&mprxMNdO|anOd6Z9+H#mgxi&+B;r&{y??-x+#e9a?9>{f~VGBMyz1HPF1#^2_ zIJQkiR#D3nFQ-SlizOpV&ECv7;{kx1;b?z(pxhFXfQNCNk#dITV3FYhGLwbtf2caA z=rF?d>jzC^HMSeuwr$(CF>x9-wrw=FZQD*7+xhqV&doV%&F^NeXRW>GefECdT*;>P z?5gbdDuWX@GW?sC(yfpQrI<{&%scU3!EBPWKtg^|cl(l+Mb2`>Oe?Mqfrmn(h*mNM zEFyd24$)C-^PUlF>?hPUZs(a)NELy7^~}za$;fMNtkNI#Ev5$>2m0fcJ#VzU?qSkuOFMVPJ%Ul}w`( zdean8;vsofbbm1WWUvDiex=5;bi0==eCitCM+h}sZ;%EDj4&PW)YkV@t|@jP z)8x?m={z;P4ex?*obm;h>oS48pkqf|X_SoMKFF*>CJdc$G%hW<5z5L3K3w4ik;-Ak zkD834Dg5yvdnW3YI6P&@jIXkSDm#!vD9D7?;xsdv+2*Ma?|0zaM$tE9(0 zAJ%(1yy7W(Yvp1)t^Ej`-COrw3$yxjNR6nj+0$li$2q=qaw*z6p1P6|;=`_caq>+F zl6w}r3lVwRAWixit;yCGPeh^2h!D%a?mMDGwqDNj?B1C#{aXO`jm?H8H~Gfaw-jIB z?JkZe2DO59tJi%0`Zh&ch{%9dQ0_$AIVN1 zLfj1zCRE!(Ind=T``>KTLpoEKslR%2*ll+8}8kcHz}u zxH6e=(U;dZfg`_2i0lX+3GKQ)gZf@qT5`LatoIj*Pk$2b%ksFfr$xYI4bV-?r7YSf z&QfANFo_4v;>^8?1`3X$CsRwwl+%xM3G3c$CA!JJhmU_-^E4AZYKA<9I>bqV79zv{ zsefhh&`3c|emty@!{s{@-MC(1=%`oiYj=~g%xT^tIb9vK$VQ`Ztx5OwINseGOW*My z+1zM$4a)`CnErcQQlvHd`)&ljYg+jPLJPQnHF!pv2s~gD*bc<)IQsX`|3Po)SSCu< zzQ}BW8E=X{y7!8mQEJhQQWcd=?~f6d))p0QuW5C_oXAlRM9vkW?~$r znc%ucKUzh1cG!>E8CnTDPw@5LUj!T;f6;a?KYTsw_`O@DbQ~G<-M;8FAXqzrE^#(e z87EJ_b<2-&)!2-Tc|qhr`kZ4?+)7fy$1I>!qw`_&sXq@=YZz~8dbfNZx2|!3cZj}j zo%NkDSGM>_@S~sZG}>YtxC^6G2bX7dq^bb7*ms=;yTlt;&iz9*#xXN=!wZ~X?UF0# zx5D~FmD;lMd)|^0-T-`GjqkUu%*^SML5@r3os@1;6{Gl-sFN`9gHpLQqv)6U;FH-6 z!=(|)4y-2a3Xdtet0}}|8jr3iB`uF&IgocAnQKe=}!UTakKWiPTKG&Y>hG>Y@4WeRiot@MD0lM#ps&k(;t;{ z2pQZzS>lzR1m9XsBY_x)^=d6Ox8X94 z?4dHKRmBnWEcs17N8aMw5dPfgwnSn=s#a<;zYZlQNa5ww8Fj0_MYG*)T%Di%CQ9^_ZlQe~Vo7(8g(@v904==WayeIb zuz8d^sC)Uk22FgjT9uT*;4oz0W&48?zhf-+PySH{u`b886c@{j2I0-+I84nQyO$F3 zOF8+=t#-+ZL1sDTi_01Du+}CQ1}8J+twl)nNDwV$RovQXJwUE_TbRtX_c$qa&``P) zT*iwTQ)aJcgKHu_JA)ObA@&G;`oexrgxfB}AIwO(OM1(m)R_#ny(B}u*UmHYN=n-j z^ZF{Ck_&uXD-WPJq*h^7*dSSQP#tt>~dz}#}vP4nU*V2!qxysU7Nd9(@ z5&BJ4pzJ|h5@1s2%_xkkeh6*HG&ot;6ap=BDiO<3Dt*AeGe$H%c)O4p@s0fvxmtaS zA-XoGy(}Ph(;Sds2k~#rMSf`llZiAU=3F>2h!7oTGTv#vj+Vcv)yAWUfPiqRC$;|q z{+BpW(tY2W?m@9U{~A*$v*l6|tSknx=%}K)g~!TD3ZO%<;8+@f#*G}Pu8~bKHm2@@3O3KeAvKqxn(+uO4U zd)dX|bax|T=9#~HPaVT!mXhl(Cf0E32M(0jc3y`G5Ld(Uyj$p)bIE{8B1O-$<@jzT z@+TUs=Rud%fHzuy&|M?#RctP0VPg#zqI=aK0PwydXPd45U>|C4M)pBnKF-MvLR9s5 z5Gwv;iSB5^LGQPOKW>Z7+cx$`ANZ1rR$;WH1~FTNq4VT$&NlVavUkR8ryXAC<>ak` zzHTb6Al2uLWwe5(4v_A?ZL&Bh_s9leusF;iL7$D$gs!Hf=RzpF33O<);&|UE&l6=w z1HR#J%d0bY@iMvO>qmh%YDm>T;)7Do(849B;n-(ZZubo>V_{DGco@@wPRj*aH3@85iGOrNn!D7aurW z;(DGWlW&PcKauv&vOj_i*hH3W&qcmyb8oOkZSfHoxllA0JHjddGOVJ$y>FDUz&f6Y z3{g>G3a6YcmeoooR|h96H!j6TRsD<{#GjTmcqW_3XY6m$PRhR=ROp=TngjY&wW=s& z)A#=t6GSKO`)qWGr_493W)a*jf#~97EoeY%Hy2e$%q3tDZ43B!xYi|)kt3Y*q|8|l zVq@AL##Pv7d#UWXmx^e8+7$G20DpqXmTdY9M5mP`Xmuf@kz_o=ak;x>(OZY^wCR1u zAq;w}mLSgW2|VH1XbJd&7ri9oU&p3z&;r{sLG`D&+54w9*V}}(9qpTMzn^N%=;8=+ zLF}S7+z}2a9|>dU|53RL^otT*=+9TpD(mTFRj7wQ_+BapRkp`#Txw?p1;AgVa!Uk! zXt)~dJn%#mx$rslh?WbRk&X!?gElxSqrJ}i<8r$G>+E^kmU25eBU}uo9gufHbVbGr z;|xTM?zQ>gTW)nQ+F}nYhsEP~ubvj+JhR9-Kq|D1s@1aCN46+yY!JlfPp)3}oa*6blK|hQl ziEDu=1BWnCrDt&w*!K6HE6d{j(*VbyJzzKv^#{O;nN}Pq%G0U5BXXl(?xdiycetFq zl~~0?uu%`pfp==weaf3MLioKbkq8IRv#!FXmy6Q4b2miuO7?Me?E0lqb8)(~V!T+UBqlzv%X)*;7c?A!W3;7~Dkmi-mZ?X% zJtTkd_tE6-j=BZk`XT&V*QY$a@j^MV#P6R~n*N1z3i&QubYCAOU*K_SzmNW7og zpp=0BiM@1cjsK=@h2K1;K7(wl-a_m-5sjT7T!nXV7ese!$74}^?f?=bQ zQO2fl+eD0}Zq>?Ws_zYb;%1hzR(-R;*ZcA9Q;vJK;P~3$TI0}3y5;zp)wl8Fw)Fhu z$y!aRYg$N-+30hy_MX$7(~+&RRnkK?SaJUTaPq!jm7V!0Z&T1^`3CQQ%@JR_B`YTB zgn2PXL!>g>mkxOpAXrPslg=B;_lJg8j;)DxdR7L&{>YmHzS!uc#or}}m3(j#r#0at z%bZ>~QXhr;I&W0j;^@XxMhTXV-g$3$r_~uoz7dVI3U2XqXVS%xhWO2^&i(B%xx(jN zOkvIhs>k9KrOSgw!9Xlqw$CGEjYnUkYBW->BWjGRj@+vn@M8-SM6yi0o)nHD`=`s# zN0z8AC_U>NOLk6y*SA`%g|QF2L$ea*oXyTX&uDn2E22)4@y6uRCjD)Dmp*Xxyg0>p z*s3-|l)DQxVE9VaV3Qd3=rHyym_dtjp;$}X9xesa;TR-&o|5YQL%qB+$hfy3w3pbg zA#^S(&U>}OOsH2k(t}aW#lb0g91}j=xEY3s{WmL|F$E3&IniZ7zt!0uL$@wV1YLd* z@`6mY4W*<1LTmnh?5RJ=Bgiyk42|BEvf1Q@2{flb&6stjSkB1Un_@3HgK2-)_{Jbe zJr_%aL857-FOCMs##e&{iew(y&0kqx0pV8Ho?sd3YLB+`7IN<cgq68JL^ z?!wlLB?XQdI@xgmR?u$`i3J-G#Gh2+$f}f#Zv9v+xoh0FAzyzsx|-D9%?!@K!vtBf z8OW;Q!i7d-YTIM-P-WZp%0FVw&`aWuW!cP1Aq%4IL~oKNl>+cvEnlG-bM&2Z> zD!biJ;V>jjAW&a2p)NbNt8EU!u_0Wec^(U_q4~vxfzH@lx~f>+n(wX zbW(-GTPeHuqrWQ*tS$R|3T1Qe7s zC~iK?xsHh*Ue(UD;CWCJzu0kvo_0xKNns&*9{jaSdA)FNmUQCp9?H=x>!uM)AfS3?&IM%wWyzFX(*^JSD!v+4)0L_2(WBz9DqLCg zAlV)5Ze#Kd<7X}#elUHpQ)sqN^A#TPx_BwwY<_)MyouIF{sf0vDZR44QE{!fz*OyP zEYc(2S-OuVpO37y+%EFhHwGKh;=|}ZoQ-Qu9nl64ura=>EiTZ*??dpZHNdy2CQ~8_ zsej+L0(T6^q%4ec5)a6BXHaVB1&@L}*d1vB!boRG2}H_j&zvE~%zQ?)a?b_Uc?>Ts z!8vy=!A2)1ln)iSg@e63IOpdZtw@1yYU|`hTkk8>%}P3^|MN+nZc9&-@G*-+LelX zB9kUKvuE>`93BZ*F{zfi|58yO&5RXIC|GEqu@8KwoBIrjgFnpGT9fum6zZ46-eE{h zt0YzCv%6M-+9p#7HyvJa;+_E4>Pq!NRp3w>uoUK~v(MjX45;^JUIauNGO01js=W_s zwYTGbR4Stc8LLhOnajw)RG%wtAba<+|K!`-~mXdj@h^~o$E<`jn0y_1fH8V3HqStU0>l|24!8*=5t#QyxPT* zN20Vnf$q`b<^7=uY-h+cq+KK5vcN9L>U}k6jSLuM(SqT*tegA$8=Nq{UOiONCFYlWT*} zmY;Hb_>_HcF(-lxR@-qADP^m1KV`Eq*i>@&wB8}24H^rk3cSv1)o~^x=|rB^E9gX0 z7V{Q(zR5EewgT?4!#pQKaM$cEM4{)-$8%S%L>{xog|iy{1RC9|796)Iw?iuW`#4b- z<);*!fwMsaP#S+`*lP%(c<|Uq$X}c6L;n6Y!q|Eco$Su|5VMqjMeaH65{IXc=lC}* z^G0vyix3i_{gNgKxw5eZ!DX9TZ^ZpDP?tv3Dc0WCHUwJwY&0VlIO|5|^;BtVyi{3) z=Pat8WOMp2GlaZTqaaX|3pu|D_^e2qj$HG!0Zg=5N3{VQ*;FT zyVjO$k8Ehfa+J&x^B3rt6!89R3=tRob@HI|;DpU%1i2;<3C;fcrKT&TFt#}56^b^T9R zl=pp@|F|HkPPZH`fQ6m$zt6K8wZ^OOnvl1SDeuA5Ji0+bF+|sMHz7FMiD9Li+F>F( zzKRbfVsWJstL{j80|+(u;KH0gIC$m>5;8?z6B5)D+#L}dwE%f~Kgng_^flyT=xw{J zIOoff+|tZ8Grdc1o@`1k?38#AH!-sd|Em>%A*w>!OS%lb+)e%t6~|{u8|-*0RTDjE z-d;GqE%TZQZR=-hhhb{;lYvFT9DkWBe(U4$!5&p|YE}zL@|DwySGOUfQH3Jji&ykD zuG+`_^vBDKo1=Q3s8@+g8@;7c#xat-m(*ObJ(Dh@?$6oEv@Rc2D(Ixk+c-Mmjd>b? zN--Rba~uPjvNe{tY+_=FBT*hF$Fms1I_J4Xy)8bG@5b@8S)Rvs@9p@NhwFqRXX3ByzrEtOLnxd{x{PZ!N;U6uq`0XJN1#x z|8i$3c1vib6G>3G(6JDfl_Yf!h^T?U3MG;hs+)v*h;I{F078!He6C^UT)=F79^D|o z_2!`kMU(GTxwl3WD_+o=+UO+xSyD$Ws zel{7@Ud@dAU5Uw`@O4jk(0B*nV?kKXfoVFcd8Z2hwx_M$Jo1CwwbUpu{Uor}?)#i{ z-X)k)%Wdk)K*7|r0jS~G#2_f_GKuiTcQ2)ai)SM!kSmnXa-~Wgb_QL^#(WblsltLA z9?t99_5^V+q-}Hp4Q}}FNS+p~o5UzkzHvbv>ncv=UV7{?#q0+znpvno80(I{O>KD2 zX3lrp2?Tn)abYrcHuACE>+cAq4BS|-xC&6)(s+GcwC?2g-zg4yo zjAFYIU13~ zQc`t4vt2Xha*p3l%@zCt3Y&dhn+C&Dib-=8Ek1g}D%S~dOUptfX{bb2kbFZ~WUxda zLWYZJOtVGvY5(n}$smq!R(sGGp~9BxW7XX+0JEH7p;1=t|zrGLL4 zCggWkkS@kOj86AjpkXb-w?*sc<e_^W}9Sjl0B#5c**htmS3o+CvEPeWRp+gowQ4L5;nc_cXQhL_Ic z|M(`VLhfw?Vw!Pqc!wRYuRI2%B3+{4rg zFkR=`dEJ?V_s9{pX-6$B`*a9((_adM(nkgspIzQ!C-l+JaVT>Qy2%Esm(WGLDcH*9cK9 z6$_>u_qwM83#No3#rtuR`nk)D&ts8p`UF|2%8NO4Wyw?FcG``uU0bnl93>$(qlWz< z@oP;0M5H5s@I$I~37Bd>M6#`RDia=~vFPAlym~jEo_1*>n^xr}qN1nsl}=fioB1`q zcxUvW+KEuAF^`CTQ6M_VC!0e5)ZqFvfjGgy0mTI1INlDgky~a3`x&(sJMaDnVtFE` z<&lx9_+Z;@`BL-7ai}*2RE+Ic4CuwSW6kWfyW8dM?*YwxxX2j{$SBBrk+lN<#v&-0Fth1AvC5kVj;*{h<9YNCqPN7D>Z1_ru zQ=1eJscS8+CNa(`uT(-Rx?`vRqs_rWwf%>vXU-*?ek+O9=~k)bo0Y!lkdQqylgI3b zU>=5P`VLuCe92ZUZHjP(xzAoW>Ob8)ki^twpGPPTqcE<2i&yWXXYVS;My)M#F= zA7XqG%%W+m34*qu5Q?eYYse9a>l?>`Yt#e~-n57`Af_5i073y4kfYONg{2azqTV6> z%HYVxl*_j<4^P={r&vwuCQOmo>&9qvLTf9B_MPZGR4cZ*^h|OWbBzL%XvI>M+zPH9 ziAYko(Vj?cK^473t8G!v(Z@!Zgso~rspHRX<=mFWF>1lZg%K^!0iIovSvY!+Yf=Mn z6(1=`3(6yAr(0+FH}mQdpD@NyirzFjaj|IHIMRSU0zB(oj3UgK(6{Zf6r>H_b*I_s zs^D?zSx?$l+wiJVTc$TlrLJwYJpyk{m-vw@)<9&N*`?l0?d%jbS7%ol!cg>Pe0LniK4cH`yZAuCb z3YAH?U5OtF(Y_TRcxQpR{+8KTH`QLov*jAYF=7eN_Bah*MKZYlM=rAhQQ$TD^}36H z<;i>erj5fJp?}QhN&d$ho+2_2pj6btebfI|;GTh13o~Ky(h1nlo=tQ&?;PmX z+za$fa#|18EbLQLhJFXQfa_sNKHO(($6MUA71k8IroSwf^_lV5U3up*Q{9T&foWA= zpcI?PeG3rGy@$X3|18zJ*HJ5Ab4OJ3_}-IQ^Mmetow0r!a)^5Rj!DAmPW87*P8AW! zGr($J3)sk_P+&Rx7C*P?nXUi5PSBBr)qd`zq`Yupwfq}Nw`Nk}tC&iX!@$2c_iyFF zIv%P@UfM}(GSt##f4`Ga^IEA>a-LKy^~doMaXfLNqZ~;0VwOaz8~#27a6)9#gvV%K zYWP10gc`r62u@?7Bt5&615BJu|Ff+i3#a|}d0W-A`UK*Hh`nZyQ3S{+#2my5odo0b zzn%SG>~RBO6q-%u7?9xJrV;rRU1iR%+mbmdpC$6MnMM*RWLfxMliW?mTCVI#^?Y{q zVu_^G>z#oNHT?H%tU{P&jI*d?Y}(!L2*duaz1LAbl5tNROY@co1!Sw}o%-rgYc^^5 z-I-oTwKecs6TLOtQt+wAyl>Dh1Vm)>f`%sE>uZFhSx9Uc`are?!{g8JyRv!#jD(@s z=Xy6_b`FbZpf4&5yCnbfYUb=O(DjuzeO9?S*y>NNG!w#JEis~}{uLsOWj;^>?8ceI zS5@67F6z9D|LTWF#3wp91VN)wn*w1VN~}Z2)SH^}H2LKHGUAPNsyw9e(UnMn{*Cyz z@&iM7P9p@&jMgX*I$)sbRc5))bI;(=n+652(5$&R0p}H*^4a%~rPt}%vqSMI!}Xk$ z6H3$OEPSWQbV570+U9;uLX#eJ;DU6YEi~9gD@OScVLa^UWOnGsIzb&~R?vqFHxBs~ zuysJcG$eykS$YMbs+y>(R%?W?6fKYIZjcI+vLKcT2v^#Ck)78jBLyPiJPbgYbSudhZ?aO= z35GB;8)yXdW$P2N<;4XF5KtGZ9mNAi&#h)|C`qfXwibRqioHg>b(aBsffrFHN$=HW zLy?Y6^AizBHaW{V8cx$;dow+ccM7n|%1BD;I#O19y2NVTv+UW=Vi(G}j}qpp)FO8R z-tgDulVuuJnd%S|c~oHY-|fq1<}_xS$|1@n>t8PHqND@cWVrK0Va`RqF_MBig*lN2XoSBjGnK6JKK2BEaoL>)=6s(ALK5J|%X!bDvXp2mh2 zW?c}1c)>3Dxo(XXxFrfCfr$(@IC8+B%elwb&1a$TU-$8IDa7y*FEYSZ4w#tyFw*P@ zsm>fcoMLAOQALtCbO<|T9tUv@XfDtv)I-Ev#m1DRpeHKnEJ3Nn8d;FuyJUs`K!{rT z-Ov>bX&FUfGa4na+mrTMu@tuh;k#O&ZVzelkSX>|#Q=Vg4O9GZuarTGLyE(Lh&?Un zQP0m^9jz=wBICq zC1L~eY(3#6QPz38sb(AEX!}7|vSPvNRt3nQ83Qhhgg8uDK5Ip;e)Zi^V$=-n%+|fD zwHTH5tgprtmL!43fhy!h!l>ed`y|}Zn+~KZmHF#aYAn_uD1DEa39i%%6s2+;xYbU` z0Q+OZ=$ZG9_oosdv!hiRzZK*QNFAk8JI}J#pCiQ!N%N6A_@;Nlg6>w?T&#o2=`3LP zwu0Pft;RiWZeaK)iYFbM6OzJBAU_c6qU4bORz?I{9^FX~((SMVNwITY+)sCEO+H#N zmw2@mdvRr}m2QH{J&GpOf^w3y&Ju6a~#)_=WzM2|78Gn7r2n z(~$kG;Ju?@_X(Gy=Wce#YSlO|N@Y&39Dz~RN0LnD^+)>;DbmVRAJUrw0oi!s10+a1 zFZ7_*BII4vD-pzE?4!%nGs}yY*u1|*(ZBVHE9X$d#CbGu^Ssa_txPdw9_I#8uXE6z z9(E0R%}nS4-JS@p!Gn5N*?(ezWbc@nUhAls*U!YxTbj-lE~MdukXmehpUmf1Y7sTt z_&M;6>JIuV7~}N0^d6~=h;LI%oTt39&nZo``#3Mwnr2Km>+iGe6DcYNa#=EP)itsf zg$iae+p^&d@+WKFLBVtE>m2E16 zu(X8YKGfEiU1lyztY$u7H0*|X=WYoy2MEq$tBkX@8GM($;XdwOJXUxF_4IJy^;O81 z;iA6ua-l+#c!Rci`1wVdXj>{*X8Ez$vg41zD9i7sO;oWzGJ;-ew?nDY>8Rq8Qik%IbLGhk`(LEn)Cp>; z$*3`B{_=X2$ix-=mdt5j#j&M=e=9Q=6MpbEl%Q3U-uf}e)wrA=2UStCK|L(Sk z)(M0+9$g~oRa-)|l+#!Huv{iszG#~=TyzC~bJrP~KjAo_C{GXQhdqNd85qObi5%W*2ew6%>IN%mdvZ8}BwDrpyZ zKMRD>La;V7CHUhFyTPV59*J0Q(2{=^C}gcZ$wed`8O5818drL*mRtF03GMBgwvQri zUhMA2a^X@W>@B9CCoWOYde-LShFgXc7Y+S+%L)6qY03zl`AlyCGhwzEFqSh^tt@9f zF>TLB^phqdl&#L~S;40)?8k%!P`Au zouN^ZRb3E~y19jKwq7tyGu4%sL_vwfaNN2;AHfw6^H=Vp)UFu(Jxr>yHOa2-1%~tP zSSo)o1x8xbQdVq2hR5?^hL6E`l=MMZq~08usJ4%OZ!Z<9d>&=1Y}aP8ntu+^4CwL7 zy7K>xaw)q#{&v$)J#K-}9u+oZ_Es2Wu^^?Mydg87ijmj;IR(-@QI;3KL6!W(UnSLR zrQ4WN<}DGy$J%6g((>~x*eNe7?#&N03{wUkozI!HhX|yJJxa*##8UW9|KqRP~}P}XjI6T2jAT-}AF z`SBp9j+;(B8UrU+O3}&(F-(x zZ^%CRNOi{ESogLeeABdTin?4dv)qb9ytgB-?<-QD+>qVh-|V`{YprwI-&7ohDaFKyLuNj|Zi5{hXEUex=u!ll3O1n{57kbl?oC@gP{L08Rb{(QM4Pj$oLH?vu{+u} zrGbi&U(&)*I2QAe>ORkYQIg}Lko>dKGEgI#ms{W1i*+F6OPop&&ZN_^u*!J&% zkHaqyilnyxf8H7<1@Hb3kAHan!|Na3|M2;T??3$h0sO=N9|8Xe{729~g8vcnkI;XF z{o_}&6nr>mIKccr>HP~`TYKErxX*0;SpsL!0mC?&F5JLD(=404eo%}`_7?D{kKB~x zDqT&IC^74+k5_N}DI8XknhVFLsPh4TM&2_!bj>SKwZ&%x?)8@)uDB@qZBBxlvaDtQ z>4lJko3wU|7oF31=@xR`Bi{$zU0)p_@)~qeF0&shovTdP;o@5u9d((VHQ=$l|PRDhF%&TtI4t`k8 zwmmFNp-4j0mKcAf0kg5IIx^qhgp|5Bv`aY4%fe$Do=GyTMY z;aEb4tIjRmA*ku;*sGO-kQE(qg830akt|UjJ`j9d2=n8V3^hFP2DJi-+yrz2Y;IS= zt7Df!4#vsQKtMe#4o@PCI%>~fqYkQC$`_%)16G8RfqZM%5~6BAS#1G!aPrpPW0`zH zN01$K8}b&zWQOY+AA(l`*g@L@A>W5bQWV;8eva|(N!^2%pv6KeO%X7JbQbcb^$-!% zRs*5V;>aP%GbFA+ory1J z---dGnpjLhf@cPA2{-HC3bL7D

$y> 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 HOC$V0<+#Qg