From 55479c8c8ee359d73062021f3c0d3948de17c274 Mon Sep 17 00:00:00 2001 From: ChrisLiu <70144550+chrisliu1995@users.noreply.github.com> Date: Wed, 28 Dec 2022 10:16:35 +0800 Subject: [PATCH] add docs(EN) (#32) * add docs(EN) --- docs/en/FAQ/FAQ.md | 16 + .../architecture.md | 0 docs/en/core_concepts/design_concept.md | 74 +++++ docs/en/developer_manuals/contribution.md | 29 ++ docs/en/getting_started/deploy_gameservers.md | 41 +++ docs/en/getting_started/gameservers_scale.md | 173 +++++++++++ docs/en/getting_started/hot_update.md | 71 +++++ docs/en/getting_started/installation.md | 46 ++- docs/en/getting_started/introduction.md | 39 --- docs/en/introduction.md | 64 ++++ .../basic_usage.md | 0 docs/en/user_manuals/network.md | 294 ++++++++++++++++++ docs/en/user_manuals/service_qualities.md | 127 ++++++++ docs/en/user_manuals/update_strategy.md | 83 +++++ docs/images/hot-update.png | Bin 40839 -> 39932 bytes ...64\346\230\216\346\226\207\346\241\243.md" | 2 +- 16 files changed, 1006 insertions(+), 53 deletions(-) create mode 100644 docs/en/FAQ/FAQ.md rename docs/en/{getting_started => core_concepts}/architecture.md (100%) create mode 100644 docs/en/core_concepts/design_concept.md create mode 100644 docs/en/developer_manuals/contribution.md create mode 100644 docs/en/getting_started/deploy_gameservers.md create mode 100644 docs/en/getting_started/gameservers_scale.md create mode 100644 docs/en/getting_started/hot_update.md delete mode 100644 docs/en/getting_started/introduction.md create mode 100644 docs/en/introduction.md rename docs/en/{tutorials => user_manuals}/basic_usage.md (100%) create mode 100644 docs/en/user_manuals/network.md create mode 100644 docs/en/user_manuals/service_qualities.md create mode 100644 docs/en/user_manuals/update_strategy.md diff --git a/docs/en/FAQ/FAQ.md b/docs/en/FAQ/FAQ.md new file mode 100644 index 00000000..51cb09b1 --- /dev/null +++ b/docs/en/FAQ/FAQ.md @@ -0,0 +1,16 @@ +## FAQ + +### Will a game server be deleted if a GameServer object is accidentally deleted? + +No. A game server is not deleted if a GameServer object is accidentally deleted. GameServer only records the state information about different O&M operations on a game server. If GameServer is deleted, another GameServer object that uses the default settings is created. In this case, your GameServer is recreated based on the default configurations of the game server template defined in GameServerSet. + + +### How do we better integrate the matching service and auto scaling to prevent players from being forced to log out? + +The service quality capability can be used to convert players' tasks of a game to the state of GameServer. The matching service perceives the state of GameServer and controls the number of replicas for the scale-in or scale-out. GameServerSet also determines the sequence of deletion based on the state of GameServer, thus achieving smooth logout. + + +### How do we use OpenKruiseGame in Massive Multiplayer Online Role-Playing Games (MMORPGs)? + +You can use OpenKruiseGame and KubeVela together to perform game server orchestration in complex scenarios. You can use GameServerSet to manage a single role server. + diff --git a/docs/en/getting_started/architecture.md b/docs/en/core_concepts/architecture.md similarity index 100% rename from docs/en/getting_started/architecture.md rename to docs/en/core_concepts/architecture.md diff --git a/docs/en/core_concepts/design_concept.md b/docs/en/core_concepts/design_concept.md new file mode 100644 index 00000000..87241a4e --- /dev/null +++ b/docs/en/core_concepts/design_concept.md @@ -0,0 +1,74 @@ +
+ +
+ +## Purpose of Open Source OpenKruiseGame + +I have been working on cloud-native services from Swarm to Kubernetes since 2015. The types of loads running on container clusters range from websites and API services in the early phase to transcoding and AI training later, and then to Metaverse, Web3, and graphical applications. We have witnessed how cloud-native technology is changing industries one by one. However, gaming is a very special industry. A large-scale game includes different roles such as gateways, platform servers, game servers, and matching services. Many game companies have performed cloud-native transformation on services such as platform servers and gateways. However, the containerization of game servers is relatively slow. After I talked with many game developers and O&M personnel, I have found that this situation is roughly attributable to the following key reasons: + +1. Replacing the deployment architecture of a running game server leads to an excessively high risk return ratio. +2. Some core features, such as game rolling update and merger and suspension of specified servers, are missing during cloud-native transformation of game servers. +2. We lack best practices and success stories on cloud-native transformation of game servers. + +To solve the above problems, we have joined forces with a number of game companies such as Lingxi Games, abstracted the general capabilities for cloud-native transformation of game servers, and developed the open source project OpenKruiseGame. We hope to deliver best practices on cloud-native transformation of game servers to more game developers in an open source project that is independent of all cloud vendors. We also hope that more and more game companies, studios, and developers can join the community, discussing practical problems and scenarios with others and sharing experience in cloud-native transformation of game servers. +Liu Zhongwei, initiator of the OpenKruiseGame project, Alibaba Cloud Container Service for Kubernetes(ACK)
+ +Lingxi Games has fully embraced cloud-native architecture. In the process of cloud-native transformation, we have clearly realized that game servers are different from other Web applications, and game server management in Kubernetes clusters is very complex. The management feature provided by Kubernetes-native workloads can hardly meet the daily O&M requirements of game servers. Deployment cannot generate fix IDs and thus is not appropriate for StatefulSet features. Whereas, StatefulSet cannot perform management on specified game servers flexibly. To overcome these difficulties, we have developed Platform as a Service (PaaS), which provides game server orchestration and management features to realize efficient O&M actions such as server activation and updates. + +Feng Moujie, head of Lingxi Games Container Cloud, Alibaba Group
+ +As a large-scale game distribution platform, Bilibili has a large number of internal and external game projects with a heterogeneous architecture, and these projects need to be managed and maintained. In the context of reducing cost and enhancing efficiency, it is imperative to migrate game projects from traditional virtual machines to Kubernetes. However, the native Kubernetes is relatively weak in the face of scenarios such as game rolling updates, multi-environment management, abstraction of partition servers for roll server games, and service access to Internet traffic. A low-cost and efficient cross-cloud solution is required to improve the preceding situation. OpenKruiseGame is developed based on OpenKruise and provides features such as fixed ID and in-place upgrade which are appealing to gaming scenarios. This offers an alternative choice for the containerization of game servers. + +Li Ning, head of Game O&M Team, Bilibili
+ + +When you try to perform cloud-native transformation of game servers, take network conditions as your primary concern. As game servers are migrated from virtual machines to containers, fixed IP addresses are required to ensure that the machine IP-based O&M method works in Kubernetes. The external service mode also becomes more complex, because it is no longer as simple as exposing ports on virtual machines. Besides, the state of each process of a game server in the pod can hardly be perceived. The recreation policy of native Kubernetes affects the game stability. Therefore, a specific perception policy is required for you to take different actions for different detection results. + +Sheng Hao, head of Game Cloud Platform, Guanying Mutual Entertainment
+ +## Why is OpenKruiseGame a workload? + ++ +
+ + +The key to cloud-native transformation of game servers is to address two concerns: lifecycle management and O&M management of game servers. Kubernetes has built-in general workload models such as Deployment, StatefulSet, and Job. However, the management of game server states is more fine-grained and more precise. For example, for game servers, a rolling update mechanism is required to ensure a shorter game interruption, and in-place updates are required to ensure that the network-based metadata information remains unchanged. A mechanism to ensure logouts occur only in zero-player game servers during auto scaling and the capability to allow to manually perform O&M, diagnosis, and isolation on game servers are required. The preceding requirements cannot be met by using only the built-in workloads of Kubernetes. + +The workloads in Kubernetes also act as an important hub for seamless integration with infrastructure. For example, you can use the Annotations fields to implement automatic connection of the monitoring system and log system to applications, use the nodeSelector field to schedule underlying resources and bind applications to these resources, and use the labels fields to record metadata information such as groups so as to replace the traditional Configuration Management Database (CMDB) system. Therefore, custom workloads are suitable for different types of applications in Kubernetes. OpenKruiseGame is a Kubernetes workload that is designed for gaming scenarios and allows developers to perform better lifecycle management and O&M management of game servers. Moreover, developers can make advantages of capabilities of cloud products by using OpenKruiseGame without the need to develop any additional code. + +## Design concept of OpenKruiseGame + +OpenKruiseGame consists of only two CustomResourceDefinition (CRD) objects: GameServerSet and GameServer. The design concept of OpenKruiseGame is based on state control, which divides different responsibilities into different workloads for control. + +* GameServerSet (lifecycle management) + Refers to the abstraction of lifecycle management for a group of game servers. It is mainly used for lifecycle control such as replica number management and game server launch. + +* GameServer (management and O&M operations on specified game servers) + Refers to the abstraction of O&M and management operations on a specified game server. It is mainly used for O&M and management operations such as update sequence control, state control of the game server, and network changes of the game server. + +After understanding the design concept of OpenKruiseGame, you can quickly draw some interesting inferences. Here are some examples: + +* Will a game server be deleted if a GameServer object is accidentally deleted? + +No. A game server is not deleted if a GameServer object is accidentally deleted. GameServer only records the state information about different O&M operations on a game server. If GameServer is deleted, another GameServer object that uses the default settings is created. In this case, your GameServer is recreated based on the default configurations of the game server template defined in GameServerSet. + +* How do we better integrate the matching service and auto scaling to prevent players from being forced to log out? + +The service quality capability can be used to convert players' tasks of a game to the state of GameServer. The matching service perceives the state of GameServer and controls the number of replicas for the scale-in or scale-out. GameServerSet also determines the sequence of deletion based on the state of GameServer, thus achieving smooth logout. + +## Deployment architecture of OpenKruiseGame + ++ +
+The deployment model of OpenKruiseGame consists of three parts: + +1. OpenKruiseGame controller + It performs lifecycle management of GameServerSet and GameServer. OpenKruiseGame controller has a built-in Cloud Provider module to adapt to the differences of different cloud service providers in scenarios such as network plug-ins. This allows OpenKruiseGame to universally deploy a set of codes for all scenarios. + +2. OpenKruise controller + It performs lifecycle management of pods. It is a dependent component of OpenKruiseGame and the OpenKruiseGame users and developers do not need to manage the controller. + +3. OpenKruiseGame O&M console [to be built] + It provides the O&M console and APIs for developers who want to use OpenKruiseGame in a visualized way. It allows you to perform lifecycle management and orchestration on game servers. diff --git a/docs/en/developer_manuals/contribution.md b/docs/en/developer_manuals/contribution.md new file mode 100644 index 00000000..3e07bc57 --- /dev/null +++ b/docs/en/developer_manuals/contribution.md @@ -0,0 +1,29 @@ +## Contribute to OpenKruiseGame +Welcome to the OpenKruiseGame community. Feel free to offer assistance, report issues, improve document quality, fix bugs, or introduce new features. See below for details about how to submit content to OpenKruiseGame. + +## Submit issues and participate in scenario-based discussions +OpenKruiseGame is a very open community. Feel free to submit various types of issues. The following list shows the issue types: +* bug report +* feature request +* performance issues +* feature proposal +* feature design +* help wanted +* doc incomplete +* test improvement +* any questions on project + + +When you submit an issue, make sure that you have performed data masking to ensure the confidentiality of your information such as AccessKey. +## Contribute to codes and documents +Actions that can offer help to OpenKruiseGame are worth encouraging. You can submit what you expect to fix in a pull request. +* If you find a spelling error, fix it. +* If you find a code error, fix it. +* If you find the missing unit tests, fix the issue. +* If you find a document incomplete or with errors, update it. + +## Need additional help +If you need help on other types of problems during cloud-native transformation of game servers, email us for further help. Email: zhongwei.lzw@alibaba-inc.com + +## Become a core contributor to OpenKruiseGame +You are also very welcome to participate in OpenKruiseGame meetings to jointly determine the future development of OpenKruiseGame. As a sub-project of OpenKruise, OpenKruiseGame is also discussed in our bi-weekly meetings when we discuss about OpenKruise. For more information, see Schedule. \ No newline at end of file diff --git a/docs/en/getting_started/deploy_gameservers.md b/docs/en/getting_started/deploy_gameservers.md new file mode 100644 index 00000000..ccd73737 --- /dev/null +++ b/docs/en/getting_started/deploy_gameservers.md @@ -0,0 +1,41 @@ +You can use GameServerSet to deploy game servers. A simple deployment case is as follows: + +```bash +cat <+ +
+ +### What is OpenKruiseGame? +OpenKruiseGame is a custom Kubernetes workload designed specially for game server scenarios. It simplifies the cloud-native transformation of game servers. Compared with the built-in workloads of Kubernetes, such as Deployment and StatefulSet, OpenKruiseGame provides common game server management features, such as hot update, in-place update, and management of specified game servers. + +In addition, OpenKruiseGame connects game servers to cloud service providers, matchmaking services, and O&M platforms. It automatically integrates features such as logging, monitoring, network, storage, elasticity, and matching by using low-code or zero-code technologies during the cloud-native transformation of game servers. With the consistent delivery standard of Kubernetes, OpenKruiseGame implements centralized management of clusters on multiple clouds and hybrid clouds. + +OpenKruiseGame is a fully open source project. It allows developers to customize workloads and build the release and O&M platforms for game servers by using custom development. OpenKruiseGame can use Kubernetes templates or call APIs to use or extend features. It can also connect to delivery systems, such as KubeVela, to implement the orchestration and full lifecycle management of game servers on a GUI. + +### Why is OpenKruiseGame needed? + +Kubernetes is an application delivery and O&M standard in the cloud-native era. The capabilities of Kubernetes such as declarative resource management, auto scaling, and consistent delivery in a multi-cloud environment can provide support for game server scenarios that cover fast server activation, cost control, version management, and global reach. However, certain features of game servers make it difficult to adapt game servers for Kubernetes. For example: + +* Hot update or hot reload + +To ensure a better game experience for players, many game servers are updated by using hot update or hot reload. However, for various workloads of Kubernetes, the lifecycle of pods is consistent with that of images. When an image is published, pods are recreated. When pods are recreated, issues may occur such as interruptions to player battles and changes in the network metadata of player servers. + +* O&M for specified game servers + +Game servers are stateful in most scenarios. For example, when a player versus player (PVP) game is updated or goes offline, only game servers without online active players can be changed; when game servers for a player versus environment (PVE) game are suspended or merged, you can perform operations on game servers with specific IDs. + +* Network models suitable for games + +The network models in Kubernetes are implemented by declaring Services. In most cases, the network models are applicable to stateless scenarios. For network-sensitive game servers, a solution with high-performance gateways, fixed IP addresses and ports, or lossless direct connections is more suitable for actual business scenarios. + +* Game server orchestration + +The architecture of game servers has become increasingly complex. The player servers for many massive multiplayer online role-playing games (MMORPGs) are combinations of game servers with different features and purposes, such as a gateway server responsible for network access, a central server for running the game engine, and a policy server responsible for game scripts and gameplay. Different game servers have different capacities and management policies. Hence, it is difficult to describe and quickly deliver all the game servers by using a single workload type. + +The preceding challenges make it difficult to implement cloud-native transformation of game servers. OpenKruiseGame is aimed to abstract the common requirements of the gaming industry, and use the semantic method to make the cloud-native transformation of various game servers simple, efficient, and secure. + +### List of core features + +OpenKruiseGame has the following core features: + +* Hot update based on images and hot reload of configurations +* Update, deletion, and isolation of specified game servers +* Multiple built-in network models (fixed IP address and port, lossless direct connection, and global acceleration) +* Auto scaling +* Automated O&M (service quality) +* Independent of cloud service providers +* Complex game server orchestration + +### What to do next + +* Install and use OpenKruiseGame. For more information, see [Getting Started](./getting_started). +* Submit code for OpenKruiseGame. For more information, see [Developer Guide](./developer_manuals/contribution.md). +* Submit [issues](https://github.com/openkruise/kruise-game/issues) to offer suggestions for OpenKruiseGame or discuss the best practices of cloud-native transformation of games. +* Join the DingTalk group (ID: 44862615) to have a discussion with core contributors to OpenKruiseGame. +* Contact us by email at zhongwei.lzw@alibaba-inc.com. + diff --git a/docs/en/tutorials/basic_usage.md b/docs/en/user_manuals/basic_usage.md similarity index 100% rename from docs/en/tutorials/basic_usage.md rename to docs/en/user_manuals/basic_usage.md diff --git a/docs/en/user_manuals/network.md b/docs/en/user_manuals/network.md new file mode 100644 index 00000000..4094e7f1 --- /dev/null +++ b/docs/en/user_manuals/network.md @@ -0,0 +1,294 @@ +## Feature overview + +As mentioned in [Design concept of OpenKruiseGame](../core_concepts/design_concept.md), the access network of game servers is the main concern of game developers. +For a non-gateway architecture, game developers need to consider how to expose external IP addresses and ports of game servers for access by players. +Different network products are usually required for access in different scenarios, and the network products may be provided by different cloud service providers. This increases the complexity of the access network. Cloud Provider & Network Plugin of OpenKruiseGame is designed to resolve this issue. +OpenKruiseGame integrates different network plugins of different cloud service providers. You can use GameServerSet to set network parameters for game servers. Moreover, you can view network status information in the generated GameServer. This significantly reduces the complexity of the access network of game servers. + +## Example + +### HostPort + +OpenKruiseGame allows game servers to use the HostPort network in native Kubernetes clusters. The host where game servers are located exposes its external IP address and ports by using which Internet traffic is forwarded to the internal ports of the game servers. The following example shows the details: + +Deploy the GameServerSet object that contains the network field. + +``` +cat <6OIJwJckU88)lM$^IvpW9N5uBLHXHbW_~1XMG85 zGOs`6*_(a_5t5vel3elt*A2uX&I3AyA1Uo0ooVd7U3`0+$z4$_`Sox*n~g}qXjZrP zuqvlgE?PT{AA5s8$4*bA{&2QnkYMY1SyNcIFn59;ay{)K$SUeMzo2Vq^sKI_IgtAa zX{+N^HYXk7^7I3k|B57|uQXRvZ^To3$BcQcK3;#t@fD4OaPHHD(XE1@=+oErowzm_ z@b}7$vyVbloO3b{({V$^^wjK*bf;jM9GiHP7^@1F6W&mfWxGV+qI?m;Q~O=a`2e}D z^p*tQ&6p8p&FjR^$#2ol_!=EKHr)CXPeTi6q_IuqrPWqm{=1!|SAlaXYDLz6B3@W_ z-yx`vmMjq_^2eWDBq40ytC@3pj2y~Mw;41X=VY^eJnuIpCDai_nk#d#G=E(lL?qZh z(t)_xg-^{AnV3w|Yfq+h!^&_{#mgep> z2$_m>IlXpQe#1mim}B1tE!Al6v&Q$jU7_c!y^~c9!#Ww^0T4#QOz!QsuOUbdu3C|* zL$&j~luLuyrnDVKp?B47n4bnkN|}1fxm(I_il6X*#eT+h&!SS)h(R|gg5$#DVY1t| zhr}YZPcB`dA1*JOh#$YUy)H%HdaiA!Qtu}5fu}AggFk}(y#;6fPBolvYQ?b{a@qr- zkP9ayT1j>Ah)?$&Ty6d9=LiO<>*p?CY$~4uQo*(=IOa2`jSBa&GH0|91^2~+1n8a@ zHdJEhkXCSY-;S3X(NN3TYK>qnhu)|xyr7SbC=qisi*uK>t+3v7enVaZMTJ6ZjMt{V z&v~une$aG#HS-=8Oft-dw^0MO_QoL;dLk_uwqC;}y4Fa{{kW_1C+-7{pH12!CyJ7H zg>F8X>hR9VmRBiTb` kDSZ8(;l`)r8>Kuse``Y znw&EivCMFQxU<@CGDZui+poqZIa(J}J$Coq5q?&5VQ-ys1dY#5-SU8rKCvY_-}wy< zwsd_8 24roA1!hyjhP9_V$a*yQUKg+n(j?nI4lIeWAJ#Ax7yNw?qYps<-tz3#zbfl6d zQs;O3rHgW{w4D>@9De3a!etD0xNWw`<$c!~t;>kcss2mKM)8ws%7`hXf^JHtFpU8N zfYV-jPJJs_w^7iF6U}Gga(=?#C4TE8-juE$G_;j0IMw^s`^)AkR@A}h`g%g@@|DM{ z4Trtu<`&&X+6T-CI!24!Ejcz5?pf|t3?W4g#RvyAv__5oNPZ`Od5^)f071&eDSq!) z>ZhHb-o+Uh{0WJXp}+x|9?XS65h`Y)&9bsGl?eDO{`FdbQ8%EMrleAM2%~jjnKzi7 zA;?|N=n>VU3+1r&aVEKKV?9G&7Z~XsxJ`#p57s=ZXb&8t%j|vUT!#-ygRJg*@@|xg zWR+iGzW2DnZQIRtRSb1`#04od|C}*GhDOj3<-uhK^ST6|y se0t0AvIZWALULmKiQsToMWNYlo>uc-`MQP=u+uF65h9D-31jW zj=3Mt5G?UHavkVX{E1aW^1)&^x>}MZ)-y?jtm9 j!~ahNMU1E{ZzSv2QxAlS-k^}Zfm5?2Hv!EM=?KP> zekk68TZ^0%=>pAmSRL2_k|{HaP26QbfG@LQmHpzT9q03M4g3_&y^Q{=ppjKfjS&8) zsdc{onjtDAIpyEW&_W=r^R}coZHw aYXHG}@WBRwBosJo#3cQ3zNotR6Kc#!C>yvy8l?i8dah177sN zFMa}%TyvN!Oj$h*lkXOC`ySUXtde?U&Y6~G>l&Kxf81#13uwBvjuN&l{RS5GB|mOQ zV72AW+(+}YBNAe3ORHlQwOTR)Wj>fg6k4xeJuiIsJD4q^Mu(;Ih-M$WWLRrJKtRCV z3BORaQ;8BH>y5OGQ9!+!a{XSdh=^3Rfn!vH)?t62nQ^`8t|zR%6B`scl>TW*mTJs{ zFor?6s$@AIt^xU8g1it1j+brIGeD>%+`aO6L*8-Gwe$g{y#CU}s!LZpb_U3CZ^yHs zLA|*~ILnBR*Yo|JJO^PB{cvlA0z`ZW_Vc`FB-^0Q&1)$38)B~36Z+AkT`~01K~Cd$ zGruH vIM1m&%wl6~I8I_ToH;;NXo?+ViW*F?%_HoW-+GC ze7R{zFWpVM-Ahg2kf8?I*m(QySPN-a4Jk+f(Wb5F%5(JtZCxRLMPBvuj^c=N=2Cea zDN&^!Lt+&ha%;e?*Ak=jm*8BRJv{*X&2Ll}ilm^!U2tP~Uvu-|^{H!r%GJH3Uf7&G z-# OS0%>8}Br1PYjF<>y^DK*>8=046E+-{e zg6n8b`^g@Wnzi(erg(ltmT$E81vE?>youHcT1>Xv-!8~>SwGUmG@n#9_NgST4pyr( zT`Mv&uu#dqyn7aT@R$Q}ac2W>9fc;UR7>|ddM%?jspHPdHCD>8Owp@2*QX|S%r$ 7)7 z-`wO$zRpD5L?7Y)@o=kWIw#v(YZt-Z gDEq%|0TLC20{m#R@L#OknuLk!36Rt5*4~lkQDB=VwCiV=@gm)IZoHI;<9_ zc4QoWpa~FUj`BZ-=&T+shd|eZ70-yv{cFIxjwBv^`a=cXi3X9-z)Q&J&9l* P^1h7Tl@%R zA*ws`-HY>1iESVm|87I-ZH?VGv3|j^JJg6C9IuV`2 W+(hIYwkCR@Q-WjQeJ5^2C$(QIJ909yKgjJtYd#_SX{j6pX1+65b#b_vCMH@V9 zRI+MCPbLz TALeGb1Px4;q?_1lV*J10^BD zcNEZB$?%Sca9kprQByul2fFvbu7|iLG&J%~f^~C$m|xS>Zs>&VFmcTiEKJ0H1~b%t zB)RWfYKM$bUkr?d43iCTT_Hv$2#3!OzU#jkYbf8V^Q&7A42gK+-|s%xvS~8Y$vF46 zT2SD0?cZ^C>88X=zM|zPYFfK2RS!NQiHcbeJXJaX?kSC9s)2mdTF}OOXoh<(YRN^x zuJ=MSGH&lW_8BgmtPv(GH@zv-AMovk>j_3dji$&iG6O#(5zJXow%6IiF^`v>fNHRB zZ(MmS6VH2H7ed5dl?tSdHyBVizUN8PI~boZ(2N{9w;Fj2z+3@A i6 UH)q{&N+?4F;scvurOZ8qQFp}l6u`0R~1+RN$j zL$X6lIF*~DZQBC6k%nAzDjySd>D!_?5o}RkkI3v6wY<`|=?x!#By)0;ORz%{_(ak* zbBs9oCM3d>Wc(*FGGbwBq|`=10ro;Obw(fG7WJYm1&yl}&pAY>Es=%5=R^auePD1| z=eWTj6+`l5ukL+CLGi!Gi3%}bjmOcql^5L@0IV-7*PL3oke46je2;;`EmllpS@c&N zhvvnp73gR@4AzYn1}!6Z6KC^*K`dcSCoHHv*9;k?9W%j*IX_hx5)y$Ndv*CJm(>&| zOr;esRysy>BY)II0c*ObYV-61guG$EnNRTi%z?l=f!fQ45SE9GoT;|WJFC$?*GiFw ztDAP(xuwcy6%8~u@zry#Z{{r BLNa{$U(qf7Z|;LOag9p6|yJXy_&HOh-spbJid z1A>QD;a!a0fqeM}*or`7pK2I>JoDFcNer=Cm;PFBx8L|p=}As(lHqpyk Lx1_Uj2d938A@uIgL5uP*)ULcvbwADvhdxWH8 zIkCJn#6nTA@UOC@c}S>LqCfj;;Y4O*+d6>8b^)_Y1q3o<;A++|hzq*%(DQWVWagT> z&^^Sv)4aN{ThD+FH{Q+_VGCWhdojw_eI`VbZiV(a2&1kkf)&)&xkBOn5zez>sc(m@ zoB_vP;SJjT5BC}&CF$Y)9vJ9KRQ#j_z>7;y0cUPFe^8$3joJED%-u*=2+Iu$7#s!M zoOgD4DRJ}&hhPQSe#*JLLn8q0`sOV7=@oFoB?^t5w=fwOVmFU&-JE1TN(n7)1NpoG zqAL%+1ZSI)(RcFA$*zwHt#fFGGnN5y>`xthwcAkxueMGdJ+cA&slv@PpArXfDd3`` zGyC8mWA|tt9-2Alt&$ nX3weo4%^((&*7)xSDTV39QbgU=AZ}(cFF_-%3 zV(fdo*DUs)ey_|FUm)|4`Euay`2XZFTA*(m9c3ZWr~N_yqJv{S!Q!ad8WFm?cqPTu zSM~7KW#1EJA#!GpcFvJ<*00$7R#CHb3;EQ8COVIqbNLINUx$vQGNEH|#Hv{vM^ZwT zZX}g~tUvKX3U4Rr ?{Pl}z&S(CVWPrdDgp+ZHb(fhiuG&XtGQ+fBm& zI)Of=OU7^9DXHu6yKU0U(VIa9b2E#W2=^v)IzyiO9#_3)Jtb-O>pW!YS&Slk);Ysn z;6pp1gIa&rE`uQo3ulLsmZn;&VSS1n5O_=Zz0TpV-6`YQcwL|H1?>5p^O_#sIOQoU zGL7xv@i07-0VJ|vadB}?Cg3e#e3$Z+b`jR50JfRez@$}wmiZ1C$Zb2SlQ>Z+bL}q| zK1X_FGQoT%yu2#E1%yWL@$XYi&rGaW6Ftt(N-N_gSI&WeQJ3NFOYWmV(#%pkOV?Hb zWE~CaM*B4E319X{xZ?_qR2N_MhoncNu%$B8Ev0U{SSeNv*z{4umx#ii$w2m`zT3Q0 z(_I%PwoARn3=^eXOo`P_@6^cfrR=)ho2_PVbUpS*q(pM8A`oM2&||^xP@P(UkEY6q zE`=*D=Fw 8>D)%UeIVK;)Px&W>V9)Esi~zTi0SVcpbCj-Zf`O-MxxT(y{r@M_^? zkYyN5t}j4Dx3VBJT#5
8i@#Uv8G(O{>&7NI(HyNUAhu&d zdV$%5jqp&|(EE+HPkgayW7T>*Ry**pW-9*8B2QPWzR}{`Dg51?0oL7I1 {nRzXwA6{ySq`P}H5p;RPb( zhiy%;pbjd*q|6h!_XtD|d*1Lq)MS7o5z~KDCirQp4_iklS&VQ+L>HwSj%0y@eQZzn z6~oPj#c(hKYj?@uutv9QOAByJ+SChYBR|)`R#umsUVq7&k$#rdbh&v_qBz_p7T+)# zQfG~?m?lDCw|wj*G+RLEu_{g^<8{{FL&U)9l5(xkyxFBdSu`an5Ve+qnb2ilKbJ-% zvSQBaSrY4CH>ud@MW#t5!-sH|r6!btgkZlMt!(u`Mv!u2t>>4<&BDec8^s%ri)!^q zR8e zhFX@3nv5AE>XyA{@vXMDMYA-r)$Mw(1dRc%?_pWGKI>^{nY~EdEBGZ8oHw*(n@F`o zy~sTu
xD&q$MhbWfO*2Iscm?R^!GHZ*LEO$x9mcBq|L`a*A% zx<$R;gS*}ryJ!9GQld(=Gg`d*?B{6V@(&1(;kNo!F73%^zG7Tz#F|2|RaOKe;61Np9V&LxkPd2Qinun&7&J-2(|PseQY}f&!R|jnqj2hI{oR zLx-Fm;|YJ)V+IeOB{J-Q=7vspto03mgP8QQgz?FG%%ML1D8X7I_#7AQ3%|N;*Sjd% z(J`FocLDqXywN=LD|Y?TZq;Y)v#Mo*>-gUc9tR}a7(77sEv`YDD+pDoO+yz~>%wOD zKqVUn{{lazI%tqbu<-Y2%zM6SG3pfMH!?E11-OageRqHt>sLIyDt!6oT)*4F1Xb^3 zRzAeup =x%15&WUYdq_#R}`5mK;v$pO&@H#eihpoOiM7e(;55=klo`a_%w0hss z$9vUg?e@)=_f4i1)Xq6+(aW?0Fg0x(5)p~@g3P+3ewl|Cy|jdMmc|{6nh62!79Fft z*9^Q%xz|$+$~G~G8MjNT!lyIE&KVi~WzKPz1Yq48(M^K>3*$2 lb( z>6_uGck^Ek*e&Zi9XdINJS9)hvtu=HE!~rjZT<+V@)8Q>29~E@GDU00P+lc|vH(_{ zzt^zrTz<~HqLn)E9;108bqwt_%MVacDh^VZCv&TaQ%UW`SO$W@_BrodjIiUDZ;r@z zjV(`wsF2R*CcIRCukXKGJ3id!XBNDNV40}Pnk8O8CG|WQk43?0Zdtn00wwB^U5a0W zWc^Es3bE iDv12~mPs6E_KNPJE0*G^rfQw&yYGxpW)11_V R5719;S0V^G10tG30!o3EahouomS;?c9Q{g_P8={&F 7xEEY^7cAB z-@;yFE9|fPGT2PK6bxz=$90KC=eP;*_Q=?D`yzk(Dcb2+oQlXBD||SZZ)vVFZd+js zUH5}PU}j0mg|jqHqeMP6(yp=TBzbq~OpMn=6)!JX3DmRXQ}m8Q%8`~1fB3 VChK=3{u*~9o!nd^YpiekNl?qas7~U~~^c7ef z%z+k((mAVEo%k3jSnc#J^i6}CO3i;5G%#p<)b7wTVGTTfKFYgxdJ+HyOa=W`eg-~8 ztPp0tM6iqlr5@>|QL5Ir IkY#KfkENXa=yjyXr->iLDU*Yklhv%i#g*JE}_DTQ7 zj8?5;E0}dRPPqlYP60EqyUH|MP@{Ix^^Of9e~&LU*HF9+*>+{_wI!bEJ;{{#s*3`D zTs%n5#Nv}~|5!!#v4QmH>aw}L`RiV#R5!JUIsXhd*HF>80(XifNHekJc{p%fS}y0S z3!SIQSb^A6XvC2I-r4D?J|pGYj~QLVwX+%e1lK-NaALtD4$tNmt7AV|wDDQGfNcwl zf8st@Z-Sj*C-*2PF4AH#Gv2qhA1Q;BVZIt$tl 02n# zUOGe4k=kmO>Y1p8^77)Ljluq=k9M%0XUfJz7mJ3yjcZyaRgz506UcW7UmN%Yer_8n zU3nNAPd=P-TYVBF`IufBl7>9Gs?1F=YnX8Og>(xb%$s3L869GUJM#J_l2L!|Q;J<) zp?Uq*iC|h3`+V`>bGdW~zD~_Yn$7IQaEr1Rm@H+z_C3?AMml}2!h!IUr}j4-*!`6r zi$a@m5HdZkK2umY#MiV4teau@nTr-4IbsIoB?Uq;p-&)=@O!gY>iT!GU^0c+HBnLJ z2h@;Hwd-ue kY+o&5)h~stYHcWJWoGutjXllh!X4VMGs!d^EPx!u7ce1`UnyiG0a1 zZy4 z>zsL}v^sSAa@6mxdm4z3MS=L$>PpEs~`72-maProP#00yud ziqnyGQIsjF%3Y{e^zArb_cfsB1LgoP;&F*Oh3yazf_6Qqa!xXB1rswYx`I#iap_Jo zdtQ84yEHWSdt-K$@ElW1NqjmZ;f0Zja$xZ^wdhJ=2hu5I0Rn$&3q )|}<5e(gos=Wg4 z?R$2}t$yFdZG{&+syHYA!-VFh#l#XBp|fmiY9@ls!@Q=8aq1S4#ygv_@R)NUJr!{Z z+Z#2M<>i?Qa^WDB^iz%!x5Z~0Oy4OvVHP&T%L{*styW7xVo37TjU6->Wd%PsDN#9W zGDm8LAC>Qqljl?J>wSPP7w3xy*GMCqG$=w3K-4SsAeTy3BpneDH(S>G!PkXUkKFcA z 5el9fR5oP$F)^`(gZPOjUFvS?wYy#)>?$vYj#(|s z(Yp?y$KIBQ*uJwlK2Y>-D+2G^`MPG|3jL_WemjUx2`rD*(XbaZiY4s%rfC(9HZdgc zX`A1m6ds;PuMwT<7y?o7kWY&RS_)01Ff-ct3~dAyv<^_lA_s>(wj*WZX2SE*1@6-b zn^ADt(g~g*iHV-n#+)`fBoi4DH1GGhP@M5H Sw>5w|E$ zIQHe9z(eQ4L!=hxJtaA|(Sk5=+eafbr!B}}kyv3mp@f~EYlS$E9oLEUrQ&Dg?*2>{ z)e0vR4%i#4*lBsf)Z6JYpGnP5_MWJJgx~s6*V?0AlV y!shog zn?fiOQ)6p;guYczUqTX|UZy9AyxS7r%v3sEQ6=`ZV! pdzdYF&uAC@V!qo?xAQ&IyhJzW J~2<_BP)rhl@m_msH&kS&~z?A4_Y+ zFW+vRs5X2=+34yjKFb#^azS;5AHG?2Ys?;A)sCW@tdyboRO$$rEjsidai3?q$o`Xw z4-QWXz+}viYKcRP4E(v2Ol&5~`7`y9^mn=IU`8yS%WJ$Je3{$t%VJPB{9kCi8#{L- zi pZPC`Gm7NLVJy6z=0k4I^3hmwSUku2XZ2@%O2|2nT;3FPUH%^-%g zQhJ&Rb+_~|wHSL%Z73<}B%ACIIACw{_!X1<(CEYC|KU|A$eK0vQLs-OWI}LvsS2(T z`yX-t0$ab4kT?+pC_>f%r^m!x_+R8qWbPLe;VOa?=?{YZOQ|oac$No>$sCKaKMp-3 zoSSz%zSb{H#kWvW#9N_g9$&cfk{Rh*qah`Cd+W$AwQ9XzA23p~hxJOw(7}@W7Y7Uq z8QGoyO!(IhtaX)TKWiglDvdEk`s{S%kVE+(TV1qcT1TmbDd`)LTzDgGl{mHyefOX$ zc@xu;uhTNW-d4;9)OW v{2$&pnC7Dy&ASGL3sn)|_6!a1ODm`UCVg~6k;g=$c*(zM zBdEV Ib#|=D* Tn}flE2IL5(_H*e{Ydb5_t0e({6=KzDa0SXliqNmOW8$u#_Y9oDWje z#%5Yj0#s@he27FO2JA?UG)}p)C46mx^t2x1KPzh WeFXE8nll{Yi038LE5QjqEu@z{H|rDloDE+EC9C7Ia`P8_Cj^|6UgAu<+#17 zC>+R%cJ)kSd2{lQ(~_3*5zb^Tf~^|+8mJIg3FUqv0=(wno{`%*@*8f7QB5WsRVGHe zJ-nJ_zD {ns6gaGz_ z3BvdZ!px`d4C33tbW|(^B)?t4YBX|4Q=oP AIP@1^xC%s#tJWpnfx5OvIL?`g5;) z_Zhtp25-Vjd!XZDl^%-ud*FdBr+;UrSPMwQ6K{B_g`uJQEq$*?(CHORT-{=sXoJ;& z<(_nw5w0R(c$nuy^@VhnGR~?S*K`JwQj|=tC0(nsKA1+6f$(zE>&szGj?$5Y>DNeP z( og+BS|wSBF-Iy$x3xB!cW#djPBf`VQp5l**jP!PO5z_Q* zcVx<2h9`VdVLZ$G_QO=eSJ!W7+e*j($M!Wf-xFHBA?SwA-CxFh3d$5-dkzh?qGmY3 zOaDXTl7EWhZ#Qk9ETj}Tlu6XE+P&_7JjOra_z*Z{@B~-n_TbMNlJOl73Gm%p#PZ;F zQeK2ai94l8ZN3l@WXi$%bfeMk)jz7C%g#UB!CeH89l*#MSg2BUonPDqzrxh9Mc!am z-=4YF)3{{Fq*+HwLjdY|+Oq0K(r}hKtggJXxH sx2W1+VyuZ?`iyONz@FN{_c_5@RT3i;X z*0kzW<8!0yyf3ahB+XwxRng9o@prTuKwba&&hm8beuSupC+eAjp9br`wwYC}i9|V& zos{%Cu6681!jZ7SRPyz=&-t7xgT)akHvQ9hfBp;L#1~36Wr@W0mg`!1Tn;g2ObTjm z80&Pt|9lW{??Ou;W^&fl|8Ri8v%pOwaLWL&dGs)VC5b@_Xd7%5vE%J&3lCVGi0?uL zTz}sGN*b)oJm%%r!W2b{uJm-42#u-_bS!L= mR(R8X6~q@ z?$qb40|;kX#kdqZfh+N1YABT9Byh?zU~GWs(yKp^4;pZJR~52DjBY7O4ap+cHWzi9 zb2=eEW)ljks&;Jd`;IlJWUqs!FO^R>(fhJ!B xl&K5HmQso}W56C*S>iA{0-EREU0 z@boc~<(_P`^cm!C2}Yrh+SbWR#N>X+R$b1g%Df1>!D-3qgxnohAU!ClIjx2r>-H4k zR&K`kskp6Oiys|KX%JMPMR=>2*?;|%)o&n%=3wo@pN6`!>dr86eJj|&&kYnfa^)#1 z=v=A_{A7h{(6+yN=xNc+GX84+j6cCt@V;*)aHrBPWb_dyLoz+u{-<|1;nFGIh4(MF zFOrN^K4Exn&Kc-XqaLK&yfM(r&-v3xm$o>{EE`wdst=;Z|KWM1?bzuET8J@2B82?O z@B=Bw*Y_8d1#vRe%!ZStSY9%T5m8%KqAUo^^mw}h5gB+hV`&Sp{tG`}pL$(x8b!QM zE4t(AZT{^3>eD91}$_ELaA=;pTQ8LxdBB{xa@b<~Q5_{X&=FlG`SF~O_Mrgzl z_)s(KK7A{gH0mZz!F4W_<4NA^D#1OKgPi!vYD@Ay=yD+ITmGIYv9)8~toPv>3s0$< z9PYMLK6lWr-bxvYne}_UBz+pxr`Y5Kh>&H-uLam}`YIENM5gi8S>exYs^;4MB 6Pr@TqD+Ke&9(BKR#&MX`|Kk zwb2l5r|I^jyi6c&I8~!PN#KQT?&1k=Gcdc3=?!GtdDVIr>v1w;<0c%6lEVrN6{$1} zj|ezd)(xF)2Sf~oq*jqb>9`=K(a|l_e%EsxRESpjEGz-|0D5YA=gatsjlSs9e%}YV zC?H>KdI0l2!xSA&tt-L^hqAs<+5y?`gMMVpaO22QK;6ZCw^O^3|A&jW42Wx4x`uI= z!QF#91a}xDAy|UDySux~;1E1`aCdjt;O_43e4KmEx$kqozdb#>dskQQuC7{Z`4rLj zO*Nw!Wt`t|SPsy@mHePV$)BXBOBbfEexVc%ygYxhBooYN0vA-bU_PD-ozo_1&k @?YwP09G588}iXAN&3vyssXv3UC2U*?sj zOBi&y#kgqN=Nh0f*FA(ed3=b$ct)b(5 $-U*S{ROZ|zi%GG>?@gVws 2wbVmQ=f6T(m>Mq9C-V@ldq%uByU?Y|_uSrqt4uz^oOkKWfx(k_%tvAuZoDv$X$ z$k;$Jxn{b3B(8?|YR%uLX8tVO(eRIX4E#xIj!7w0@= ECRGeG2T~^`c!<7U4+i=cGC%__)?;Ac zy6R^ 7MHWCQ%`NZ4@2$K*VvF%A4# z{CUv+s^6RyS{HTuXRJT$^# F(Z`f);#TaZ}IyEZ4uU_VmfIc+S ;d}T0aR+RiaVNf?#3l*hV(odSSna34UDZ9%=5pwu9YzzLWOI>CwJ5QNm3v zI{IytqRPdid=OELR1fP$)o7DHXuy}6>cNE+qRB{h(J>qL2?Oh==nt~ZW1e@n9iX|j zeN&}OXqRVols~qfm2Pq%)Jr{mwNi6rU9Ko0TW2vlJy#GD-q_};>^w4vtXVCk_GX%m z!OX;ltwQ{b+KhE9;rgvFe|;++%X45gbTEg+^l|S3*(;QY2^B|!&3|i2bfdK616c 3) zaG}#Te^t|bRxFjsq8n(Cf~m8)CK1=IO_ERe1BuRjO*UG2{DBz5)*m?K`gt++`OjOb z
Et6NgZi}3T)S6VT{H)fgn&Bd~ 6!hWHeVRgkPG0?_%S1Ym;GR_Uf zfW<(SiyQGTbR$vsFPZxOLTg{p2J5m+r*4}(ZKR)E^$q91pKAI`>(vK^@Uvf{B_8S= zJ8G<3t5vk!vu(9Y&s8HFvJc=PNf0|uXynvV&G5T@1LJ-r_ABkqK$wmjUq
?WulN13 ir8f=S#6n^2AN z8GIJ1iVG5xqY7E=0^Y}Qopl8slupE6Z{DVJHy}DksaFyZLF%kq9Q1r6*};lOO*hOG zX67X)$)?G8SseNNr^ARxJ%!RVlR>!xe%`=(R8|Co$tw9bVn BCpY*gS<`ePTY%#BPOl@I4xHj!z+3J*d|kK3qOO z=i^$iXa7OtK=e2f+B{j4Sl=`OV5&fzYa3e6p#Y6h4G=slkLq)LthJi?YPWx|qK`k( zV*bSJ{?c;N$L7u2q&AyoXBph~ha6TvoHoWY@sl|Ph7QNp!u%;=p5`O|b+ksN!+H~n zDjfvR<0Zdvb5KXYdB~Xkk{?)9KNCc9N52xYd#|`ayp!@DXv1Z5^@zhXtEAu&55>dv ze}RDsow1*6kyJbyYc;%D`K$!iepVB|rp|RHrhiU``@v&(CX_Bk%>?Il2+M%IH?B#c z_N~W(XVYpl=Ue)8QF&N zqw9;mT-H399d1d#Jyg %i3#Hd~rLEH+Pg8XYU+818ey#1%^4n{<_xWi0rq7yG z?i?i`GNNs#1m^oBCZXc?FXX?>so*6x8=SYtFYY@an<(B#DHjCA&tT_!e4a2IGk#0H zZ_L7ZjTkM>IXJ=M`+9j*vFh&{40eVd$_ZuUy=}``b*e?u|!(^CYU;HHbP6XxL8S zSLSYj^a7#gf8eyHcLQ3eC#jbfYv%GOcB}kvoc7cQtBIT)52X+s3aIB!0z4r!%fIPy znTl<$$CfCM?(t6e_&+F&7*kZ$)x=!SiQ6`mi*K}c^sF;1itmuJ^UL4f{#U%_nT(X4 z<;7ac;zcTJr7nf1@$C;ZZeN&PwdOJ#lN)E`oWY_NbCmLokUgS_S%6$2DYl+~!!61R zx2512UpCJwuIEFHcUSyj)=7TWxfb>0FQwrasxy3s=m+NafVoY-8=>;C({joQ9oLgS zyOPON4XNmzVhobe0)WX&nFskpO8aOLdPM?+UnWL@_WYfB;ClIbkkAi+iG#qtwq~C` z1Ro5utw}r0yntX7-?JGF4|o$gemL0%-y?XrQY%C(9tk mj3zb$kz8pGTE?@G;SVU-@kc%_LD}7E^XrrW0!Q!^BdVJ|Ww|X?gc0#6Vl6h5 zO_Db= sL=6zNa@z*QtczLrQ=r!sA}sPm6R(p8V+%oZ1*hlg;= BeTtOKJcUSo~e zV|H`}uU$c&SvZEGYlx0T3%$rZ#BYvdXF_erXWZqq?P`tC1a2p16FBmaHJV7LW_{Y- z$O3bA-D??|6pvBTyzE)H)xWDSl#gF`Gw6-J3_p)!q!|p&S+ }yXHex#mk=wfC65i^XN{U#Id*&x zaxYk(uNC{1$gd8R7fLH=Coo#HaqC;W{Uwp4iTPWt1Deq9v>n+w1wL%6%!WP4EzZhs z#Tb`R4=a;O-Q}w@mZ%xrRMIVB@-A#R-BGsFzcBX9(K`&D(i)vF8#FzB5`;~jFD}0+ zx-OxJxW2I4x>)Wu4@ER0NMyOX*QK$eB)du%iKqYybOL(hzAzC~tA`A6WyE7#Yf`qh zHAZoc5D>qb6x8{iQLV`L>O>uj>cG9@`GmGO+4dopP_42){8FbSte*ZaMVAI}@bx~d zf;O%rwE@1PbSa2Yb2ZzWLx|UIdQ~ms2x~z=E_}XF967SR3{^tDb$r{}ebI72eX5zS z(aDNXEIAP9YO9N=Ig`)CwYuQ(t-S@5W_4q&9MH047pJSuUEu*4+1|ueP`*othq+uG zp>vMSaY@AW_K+YrX~F$Pj`NPY-VGTkkNFB#b4s6z>zF&(PTekJJGuO1_*KmEEFDMg zdb5ksj%QV}nTxhjzEcKs^;KgINRXr=%7L)?ZtvD0-AJ*PFxygTEQxYd2pidP4N!C8 zkxLM=x0fz8PS2D GI<*`!dNI$qihvw0^qVBcrV?jx^ zMw!7xKJ}rdbAjBHMeZa3Z665{M=ycfvE3SaBO}{(t3i>8q5nA+cyYva4f=zWj&o8V z5c5>RYAlX?=%y~Rwt!jHMbN0BvuEy0Z}pQS#lqH&qssignW4Q#C&L(Xi6i#ylSe#x zFzrU00F$u$e9dDDT6}%^o&A3M%{qJLr &EY_=*s)utamQyC0eTbtBjb2M23Sp-z&{I zb7 =;)O^K8a*dk` FGYfpXRjB8T_AI`EMGi-wB`p&fxz){lOU0 z4<4I{=znQ}fBz2lkqMkz{{N|Ve)>=$ONSEsFGcqso*UMnJL>;F^+Q&VE+$_0;J+l% ze`Yb#dMNPk2KW&EQ-EMSi*9A79+o-Q%zNTDF4>___hlQl kKiMhF z7DfO48Dep@4X>(id&5$@`;|`9^+T3ywUqjVYL#v$h&5=>+M{Y0<0Cvqq_&_xIYMso z&{1(!Cz(JNyt5{^|BZ#|Jl_1cGWaQR6tsyy^d=@_pLLxfBi&>+%$u}4q6PoVf_g@! zO2ci@6m*+ewsMh&ay)dL)NmXPbf|GjEvqv6gR#JSp#Ychw*s3Y90W>(*V{R>#pP5f zvg){1vKZzta?`R#$Wu|{>4GtL3SYZY@5P_#Z>{`hjC;w}iymt&Y;zXYclC-(R&~UPqlxQyL<)zohgH`k2TDMwxq-oaPKCO8dP}UQnub zweoV72K!|GA#38{RAXFD4O;iCgW5Dja>-bLFmVRi2(r0%VMnURg(dRYPX+SfX3i92 zGaY?7{SMBDkSIzjX@VqnHjmn~TJOKia=moftx=kim nf}f+=6w_X)Eo8n=;vz}m!kIT;m>;c^$3`b|A(-;wcJFSE z%QNo1E%ZLUfoa !;*=oJFx}Rx}TUom f79^CZ`&{c0seMJg}S$hSK z_FDsakXVPhWK;bn>jde38+{Y>4FW<7%ms-H@(ZMO_HHBJ$_m2=2{UX3)n?~;RkA6M za$;?@Cd#NCWvb7BCfw`7NeI?2{`^A^;tS?Giaw$Q`F#MvhOrg1TTWl!O`+X S4Omy3vy8%!SI8e^SiW&hFAFov)RpHwYSHf`!F00jv#Um9tJ_7_VNA80d^#p zdu-r-l<;`SJbAsDV7gX`>idG={?Wf&`*$ef2X|J%pZ&4G;A4 %lIrppV02#W!tuu2Y1~Y&7XAYD{si@Ue>W<1kv6+a4FL+wK^YmDE&< zZ045_tqW{p;w0X>{Jw{jk(RA>%oQ1PXz2{9F)LNs J}0RI9Ra(q&;J` zdR5T5GP-6G4DG&-(Et2i>7vL&F2uu1(O8yn10nWeO~WU6Ghy|6k!;!Lmnzq$@FUB2 z%UR}HLOC|&i-ejt==EPM+xz`FA9M|b%_$$C `Lzj+iql#^H1FDTm9gkigS3iM8cS6v;Bc+*$&z1y+WpcYS@ zTB>~4!#sq`6iM9Ky+dF;mP@cw78gXTmck*}(48(Rw1|6g8YTZ6VcKzw0^S?*mn(I* zt+%gNlKop9a@+P18SUPG_VDkOu0{bSPWv6Ajaon1ba?$TmbWZli#1p(@_?=F DZ?>fbBbIG)mzvv{*qFY1f&!-YZ{^N@Qr5*~d+)@`_7zUYxTuJVWVY zY{1N*IBW(OJ&vEQffXvaM$ntpB{YgV8yTZ;o{t-O7ZsrVP(Iz*XW@;Dp6QTaS#vJW zQS#VZ(z>|7S1p|(++&^><_@25v_BYdkHFPwwnGhOUhyX|6PFFdVpvuzpwJyZRm2fg z@7LMqh^Rs)k-|wyW Gp?@olem>BE05n+*TZMEhgweD14NM)jS^ zgHeZYM7-92c2nq>7RY{(+-l95BkePYGdK>q4UO~wuZqmt7Oc35s5`0+u2_${xZ|E* zfgBHqAAEgNbH%R 7*RbBZGG_IC*Yf2~ zuYjR;F1wJp;nQ=iEwe$k< Qd)M=9@v7&!3Pa)hLmF)) zHP|Ab@2ZD~)A(HC2h$F_>ej*3&4}mEQI|D4+*|xvpi(ZGk_%LJ1+jmP6~|xvo`di# zK*lX4|5$U^`a4x%f19Z$J;c5MvP%!c4#*up^QlaAT()-0`|GhaOzDk# S4!0#bdMVj6$P+ Kc7$5?qlZDjauf!8vPRk%~vHr;u>1sy)0bd8re`%O2+&7${1DJ zSg`OnQS9;E8bkKo@r?5`L+|_1^Gw94hr3ysL*>%#?%0h@A?rMalKWy^WDO1{Rs0a= z-(M<_EOTI1ijXPZ9K>|1H+D?Ygv!?>1&*l|0*1SMHFD{UOi!%J4m-b)ybNBN%N?jc zz1(NqOsv;WYZJzAY$~08vCY|*kH|cZ&_zG;1SluaTHO6%Br=~&^*XFY%4smphbo5C zIakst%d?jy7{gl<347R#=bY?Kd{&gy#R w#O@ nH_?lU~kRkGdX*xs%`h}mZ0sl5Hro0{!Bf7>@iAk zq>8}%pL{IGx~rtXsTPXVQU1ot^G1mAh!IxLyDDXUWzrhtuE2*~eG5mt#T=ymZ8)Qs zRUr}0?80p%@5;HbfSt#6T{bQ;!<_5<#4o^T#8^Wl06XWKgxw7!@Cq!nozakiK-w6B zQ}pI%ZXtGL=ib_F=-K!uuQfi*g&O>4>g=~%^O&?I4_Zq8R)BsB$UOOcJ{b+#ix(G9 z#?V6q29Hm<*w5u`Su&QfDQb!7N~ler0#5b~g5cs*P#CmoF}Sw%b(+2_S&21ei^N!A z+@p#W@BLg|94|{p+OMsWrtu-2E~bhEZIjW#F7pTNStk62fx%*`9iXtt@JwCQ53&eY zDQyOCWLKUx)bRidr+;%+?g_2$%7-UycjhT@tu&E7xe0fo1uIcAwfIx~vd3Fw-;g=Q zf@+Jr7l%Y&(AJdwXjKA)J#Sxgg-Ni?@biAiz_2tUoiPTIZ<6>z`7Rt=rR0@RfS5{h z-$TA4>g8JS(?p&Lz;66UJ_7(kR2UA<@4GB1QMcJPcqnJWcpW+|kF=>c=d
$o|$0$1MSE`Nwo1caa6u(MX%+N+Z5JhYNQMD4TV3j3 z4#ipvuFEUzgQz #yb>t+VzE#0)r{hvgCwr)5o i>tV0yiW9g=9r|$g>3rhdH*rTNbZ@H) zy87Ef8nSTOlY!3X7%Q9(e#p(1L`x2Q{fo7ML9i*!$7BJ6H~*}To{(2c9%c_hQEY^G zr~7QhYOWIrP{f(vhP80-n)Vyjg*y` w8U`RJh zrLmo9&TM3)$A^gH(zGG>r~?NFPDTo)5AuaIkaL~HN#+eD4M}d;FPQE=b;S?=P5Zt* zXv_oT)@f`dQwm;KhOtwI&AFA}&wNL%rnTkCJS&{DVG0D3E{v+AsTAI8;ZLBL4c5(Y zRMGg_FBqUF*?7>_=QzDx$hS0`H(_Hvq@hq|&jd8(n(jgh0CiVap>X=cTcFAZ0dZbE zB{hyhpBgnG{P=cSW&y( 0g3#+h^bnfs!b(hjes6&>S)Q-Yq^$$wOT5^z>I6Bh zRsfmy3JbPX=*{z>fhU=C8!#c}fJzb<6N0a{i;4G7{S_*-m;7jN7TAMFp1;%{_G`TG zCv%f$`sz8=yXRn7z8}}%W2|7W0F+3g99r{OTPJ8BQ j zj{I@O9(=f0%zB!^-V*FUx2}1>^RzbA$oLM(&?yC0NT_gCl;*s&zB`p& b2U^D*K=~N^_L18kARU~jjYE>t(Wc-07Dxp;KBuO@TZUiUUPW*gldKJ zy&Trx&*ywM;|2X$ipukOkpabzt`mBO#**_f5{IL$va!@JC0YMa{T-T=nfN3&ov8 z@pXQ+P3CRSUA^5&yG2iV{-L|*D*(}_Du{p1PS)uWTeF|r_+VAZJM&59+(#6s11Sv- z+{)zmdQnW&{T`4!FL0n$J$o+Fzg1DSif#nW`a?x`9cxGD20HK&%zpg|3wST0%4AI2 zQC)J5XlOAfJ-c(@$c{E$oU;7xyAU+lOM+s}(ErfIHXXR)0`k-PbdboFbdDh8ej#u# zi#F|q?23i DGcCPoPJy3+{&0oeF)Tph|{) z%8RW;>X0!8Sj@PZ2Yt3V)=Pzs7}NyDCyO|e1ctcMk~iK*Y8RpifH?==0&ejo%2(Ix z>WkA<7EXEFqC{MJSR2b2mPzDi)Hd5!VbJcW(K4cL;7X#p-^GB*6d(1D(UK?8PUn(j zU (}@8};>CTo(WX$16*hM=Pbg^?kU9kR eEx$w&H6P3DOSjHOJXVT zb-17J&`VW~dz#RK(iyrMW8$4>%Z#WHjJ#p e%=mK~cWg6cC`( z-nqsR3fhYCNK)wM)2c#kMQHrFXe kH?9Y&A!NLNUCy_ib7C5SV?H2Z$ z*7bh~prNg*H!Yi3xI>#ctcgp6t%h!pi0(t_JWZ1P{sXA4r}DD5#7;AgBN~7wT*!lJ zZ!? p|ph<+ko-uAyJ8nXPU zvFSquXuZK!14kui;$Zz2$?{geehYwu9VGAkWP~iW-RH^GZ>5sxx<*|R2>L*^yRJuu zG9&I0Nwzs&-&<5Fo)*;`3$b*tExZ%vUu<;toD2lToX!36cc01!7KQ$j4Yu0K`q7|Y znGyXF4eek9rqc_?pot0lP?$O5S9&Wnp}oTDD_JpVK(n&gv(gC8NZrS#olaYXJm@+< z(W})?__wl~9vHkgPp|;nr(~|oz5*1ju2Vy ORb7mJ<5M_+ WWUT!|_NJ(Ls-+udn+a x{k?em91g|77g0?;*?T*qEURi68b zpfy=zfjGAQ4;}ugc!EGR;W$2_3Umq^xinK7po#6+WqfO@@;jkbaMr^r51%O`FVqS* z_V{Le2tAp~i-=mMMam-Nf=M*ebCs3uRuQZ!sPCs4s*_z7Tkl*I}MUXXoFUEKV zi`EzEy3N5}e^XPut_1wJNG;GlYZ>T%_TXYOUXf5YB4q!{THnRhYKZiR;|&4sMl+A? zp3j??Xp_g=hz%^(#wH4CgfhZ_KUs~j(3n_|q G?P|h(Pr-9K@aemspirZ(UR}tOds +VZ1lATOqyIZl!4ZwbzoLIrGSf zEaa(GVYrW4s7LhCn5GeWBB41XogXE7**7?R!OjD^EMLsw-dQBQ*VSUa!d5Y dZfe>yK8)uc^QQw zKO >9c-6_J@D=J-)M&pkpCb`vA-VmnMkUybm(sm~HBh2Z>v7n62|B|>8f{|eL+ zO>>PqU7;1i3|WfhYI**g2wTzhocjTvBD-MJI5ayN$!Qvfxqf ?_W6VLhn zO+LFhdf{aPQv>6{496?{u%fV2@`VxRP3t2ld-irCrk!O$)P6ilxbTtAA?^ `h@XwEr__No?F6)!><(pKOhA%49vSaM0-woKj&*bAqSCy28Mmg-hUAUaNZrn89;r zHse7;r*qe1lo;e&bv@j>o&{m8nrfy&=u4L3%4u0S{5o(A@ju(VlLzQ~jd49{(?bSI z?wnY1>1D&8$zfCK?yTkrm6a9F)VV{57jUi6-yDwBuh+< SMP&jx&XNv4Oq{P2#GM0Dr6 zn%y4_*KqwmTfX;vb7zns324)W@f^gNWsoF35h8kK0xJF-k-=qAMO4`3V^Otw7|%5) zffbz*i1oHY@Lc#2>jg=d8eChFT`y#%S6bii1NcBtHG1!Sb%)A8Bl3Tz2t8dLXjQ~U zyXq<{DPsJno@#K){>r_&io`q$801Iw{T7a{hoa==6rszBi0EXW+9o?#wt_o#C%?%+ znMD>po`FOlSdpdM^RrVK=?$R3pvuNeHgU~f$dD)}&Ay^(Km8D$v#t!eqEm!>s)gTR&MsZ>?H5od~x3(UZh zA+c~EFFT~w7jo)SV!CB$=O0PPny~%Du?e8l)xmtra~AHFr$H`}G;vACuLZQL ~TeIJ_ZKNT@2- SUmIfB-M@y{noZD>eIe$T z6|Pm3E*1wpwGAyE+vQOO{Ol3$>s#En(_{@9>UfjPGm<77IivFU^X7Uh=7@ Est#f4VJ(n~MEZ`eaGqMh_L}`w_n8XLSO0 z$oFpagbcuzB^DUCzc0hF585&5jpOknqAg^&M(Pk1buEO97Ogf@3^#*yCptXOg}|Ml ziVVcAGjF)ul3`hR06$w8uq=V`-|a7Mi{=v&-*>=ndO&!um#YbyXwM^fZ%x>UA^d>y z6Xo )(&L6r7GNOA~{S9w*ayJu_*4_gIbLv=pS|=Zv;=YRSBO%O)z_ekQY? za!~Nca)S~RWl7K?8@26ORy&m3^eD?Sj@jm2I3KCmHRA_k5kwQ9^j!D`*Ui~ttF>Zf zV1%QbHT=CxKvui|xEn$4)so1s4suOLpy-MA6jrYVdi|>1^aoguw%8s@CKmH^>y>3> z0Z|Ww@J}N-dc=62yh5&)(^xBD&ukOS#E|M8kx^tL-r)xR_m^C0yC-MEXJKX>7H$%@ zuJ?=v)lgN~TyXqCFGQ1gm+cL7P`?B1Bt}MyS62qYrO>$0s}QcQoi05ke;r;%6uaw6 zKz%{S3LMez(}auYvOI&mK6bj$@sd~60@7E04yJeP{Pd}}>Z%V%+ZXT~l`KMe^R*04 z9FM)YAA4AK+e7t(45?Rmia@^LDkX+KhHL4-5_Uy=>*d0ioB?A^mQmThXtHsFK4C10 zi0JHmXDs}n?yM|RrU ?|DczMS&EhhV__#W0gXOy7C_l9$YwV% ^0)#NP*1ECkOVVp9HcGe0z??5KC>$<3fQS=(U1z1)?}SXU)NRPX>PW_<~B zA2r3=nQu2;9%lRNlJM8I+D8RXoWMof@xQ{)5(0+reVb@~R{K1VsQ#5592C<->*vOI z4eXJ2sL8kbE9v`J)G^KlQ5IvhEu3*R)9emv+wnAzC)}rpXyX3e@0!6MptCYrWquX= zW06Py<#YbyzyH$D1beP6qfY}i^BKIgj^DwD3JWf03DfeoE4Nee4C`nhXi&+ZL;TyF z93F_|6|TwHf#WX>eh7o0kb6S@_l*DTq5sntZU^`6BJc3umanN`(UQqX*pxD_FTC1w zo~$OfdD6*!IRILVaXJAWS4%Yc#cvOCEtr45JPiXl2|A$_KT53T0)n9snLL;u<|vfGGQ|+Qi!I{KD^VMf7|_^@&P*aM{{rN z2>Ab*1}W5s+o28SKmLiW|2qKrXNn2jAI+2?O%$5{88G$3i |JD0f zv)zup@c#@r{Y@Ck-t5gW@4ue>pYD{hAI)JD$&d)(|EGI`F$8&x^mQSH6~_O(xgEqE zx=;?G{Qr#S3J(PVOiH}R< qdAv~{ z$}GqPCrN1brB141C1y}LP>0rrH$`I)(5FJG(S|5Tkd$Z_S!&QSgzzB6{3D~bm#%Py ztI`5mLDOxTevW6?x%&G*V+%6?D*360`1VAqQEVg~WU4QsBjU=+?ekQu#6V0g@!I)* z>e`s^cqP=aHb)jaC(qoAY4^;HU$a79MkL~!yqMHdV5KT%;!Zwt5@psQp7*yOTr$~i ziE?n}-4+>zG8$2iABr+@?qBJ_-@7LUxvm+Vg47N^8RKZ$rT&q<>-QRR8cS=uAWew) zr8;o`eJ^=_OaJhz-MtKbqr{E&E21Fvdg(l^t*!tR8*g=3-Qd)jvHh(_@L*z0AHJ=|KOOEJtd;Eai|$X|M=&HRctvGT$Kw zl65;~nU@KHaSO1VO+(juBoCCllqeD>#d%>J#wLSEEr0qo4iX!jyU^!vW}RZ?ptYq* zj8w|KNDX9U{HSm+ <%{(kk%)5{ z_L&XZX+GNBfW{KGSxN&(YYS?{c$Zan=XIau#-aUpOO0beG`g4@jr@4gDTr5YvYxco zd!Vtk<#VGJknL~A1Eg2PKPOE@>_t9mj}>2iK3jYf*V%mI2M4db+i5?8oQ^k-^XbD~ ziGPo7jn5+2*j`grjw;P Wt6vWvK-@arLSR!Ne0Ss%V>Um~{7h-HoN&{4VN7 zpzEI>pXpltuC)L4)Kb6(O-Tz9c`c8eyp<8%M$r+Xq2-apUZxS8<6{lQC`0C=GcI>J z!ibpHv_&0No2Y$eO&uFZp415s`mQuUSB6w0UK`L~NK1>BcU3_wld46n@}4}X+!0^A zzId#+z_=IdbBN2 q-P%8O88&$gI$M`02TYkvzdR)$DwyPngjt!er8 zZMvi7#rHx{~ ;BURV-FXRwBMI}NUHfRWop)89{30BpxQdetaaJ&jrT zhSJu_77iZqBMHKLta5=$^-o%~Z<~+BUaeUsGmKq#drKv*-e`WB{F)P|>bW=Qvz?9G zEsE!|(Ivme*H`L8+1|O}q8+9Ol}q4z?F0}`-U9fKO=6o2$eL_k)o;xoFTd<1bD P)ByFA}XyF)LH@S!Zzl&Nkwk(?V60~EQ$hItfX$i seGkkB$kWl3D>TwFYe*B6K32k9It=s5_wX7LIY-88uF+cgDQE$ zkILY7a>(7 6 zR46%@3>su_uCg<-v&)Xv6JO+2eRr1&WE^uR@Xh-2|LhV4*4>GH=CMX{Hi(z^QFI1J zl0`jHkMdyaKXz zx36uETj7cl4&|buu)1wg=zmVuCCY@rQRK!Vlq_3hLrbwAKUDV6@RnOs|3&{x_=<_S zfRa2W0{)~)oso~Y^+zV<1T&y6yL(;58}mmI70>fKtl8plQN)B)N<^r&1KdubogIuv zrF&gJVC0?rIvzX}5KW;mhH? oxD+Q-PZV?xGEKYkq+r zV-7Y{!HK@l=LAoJj>BYPU}$a&fqz$g(&Al06_p?+*XZKV94@+TjI>(D2W{C>c;+4| zr3H;JpuMhP;KzDpZMk|A9bj_4hy8`{tPg;IE4`D#LI_@`xRO<4-oyBFfPOI!4Q;Rf zGG4>_$AeW`pF=Ns-3G%8HN+!>aP+R&)%~J&2j3OCOAih~F)o_n*yg7)PkY-Lvt5{@ z8;F5BQog`wOU78i{tR|*UzH{EdcUX~ezgHq(xX-oL$rvxlVyl|cSM;o-!uk`I>*Qx zfV(n^ZS4eVoy9#?4@dJwYdto&3#!<*;&YB_qkPkEApqL(j>^B0$^IwsmE1-9gLW%V zmi4M?s*TLk$Pl9(gtJ`pz~*Wx)y(Z)aE9UVjbK+(CZr2`4Lk!+(wINd-!}|X(d$|n zst 7v z&w3$0RX#y?50I=&SEbKDkwzw^`J!lg;cqqPN=2*O=GqtO%(2gBLB$6)mFQ8DYj@r- z0{Z;!@Usz!+7(j}0_rp_AzF{Q)h1W)v#ypE=rih`-%Z0_{*5SYtub^(kS5Bt+u%#1 z)wVd6@OpAb-9i^ZU3XH|`%op^&k2d%p^k=KlNXMv%o@_GK5m_whE)LEA3^5><=o+7 zAfrSw3df$kyH6W}k+=9%`&(6Fei*P*^{I o0v zzmtoQO7tN)F2+^4uxb`>C;AOaUsFaQ`3Bd(AUC$r(PGStAY}XFYzC*WwT)0*voD0b z-c#+=x=M6ArKO8wwdBgV;6R6oY5LDYhUIDB+#5Q6&tgxMHW-%{>r~8g&NG>8CvT)= zL{W^ePMATs*HIaktfoW~(GT*y*6CJYnh S4P6;%R({9n4 z@iNN(C%*T)P7>C{ tB(63(7M1^@4CU;g;2kK}?S9Kj(It`}Ji>Lo>|7 z%3+7~qqKJZ=0A#cJ-EV66mV|SzmU6In79`uFbukD_zl~;ww~DsMY_FVr7hl`l^Lkx z4qmOz5rPHDIbNgr$=@?c$oD5Nzlo>rt2;iLVdi1KQ{VLku8!PVRu+}RYxD)bk{Hug zKCWp4EF?I~;-I)ou_Vv<$h-Jna=_5@pAUeO$khcKR@JIK0^urwqbhKyB|U^7XLNjR zfn=!9tL7~t^FrUX;zMSk0I&G| Qjf_R$n|u+H2PuaTeN+0Rv%csAkk1+8)G!^^a!*en4>x?=;&%0ShH%7BzLZ zH~E~kFF&7P&6B4_gtdVRHis;%s%JZ2tK82#D$BH~!#iy7Q)nY}Ei?;Xdfn}*k%}vP z3;QFoF?g|Exn=i{n)f)W8=ADmOJ;%kSjRDK+AgM%gmU(-;_211PRmj|qRwKmI4_1g zp6lJMIDVSA=KF_&piES>j`6$;1|B;X@3Mjvs!!A^3M(`^me>t;u6Fo%chW^g1$Ly8 z4K3q4wm;9V(8GHoUgi0@NzG@tOC^Zw(k>3BD=Dv(|BX>2F@(MKJhs CL`pF5>WQBx(Qzq$bWU& zchyJuhxcQ6VTw#`VMP4GE)xCg@wVmY!ca^Jd&imr;ye}C$zc0lZ}Iu2(DrDb59BhV zPne*>LwuWKG2baNw#-^*=%7CCL2wkEa+lvK@G;PbMFI87YY2WnsR5mYh}kFhK>{f` z7=w*#5FVT2n{L(lA8}L^*uGOQa{ebzxqW ML>f{mm&yyRGI`3 z3_*ibA&F8nKtMq05Sr4FssbWKIud#!O_AO^g7g-8{?T(h_uiNLa$oO$+hgpp#~y2} zJ=gkv^ILNo<(SuGd}WsB@GmeAcrz0ABZ-4G$Te(PlIDgc_3h9ukVDSzmHU3QUz$bi zw9r0?&PwhUH$eQa3 qh?7dvf2RZ#s2~A=#KJE6$2 U#fsSm4x^`>N z8gcYezEMrO6Zr8Ke;Ek~G38EmQm_R7{mDAQ4;d`@+K5|oY&Wo3za&LsaihkfnoNS~JQ`v|H)wZP_kH<0`k!Qswm3+5KG)(V1R=H4R#Xs$DJ!%%&W3 zEzP*Xv~@uV=k^7g1*O;>U+z>ySJ__s^%h>`avq*$w#{4E;tMqkHBs) AqX9|R5S}sffe9%ji9{=& zS&cx~rpp!`nqlt|0 ooX zutiw~0HBvIQrW%Al~!)8HV8$-KB15{qXQb8f?)Cy30c%C zn^e*AS`)JZMWm{0-M!y+ks|YFkEdY0`!AmXA|BdeQmuW`#TV?zT3=Us4O2SrwG&5A z)K)jfh`tRuh=S!?pZ9Gf+1Gw}>-Rn;7V>7giZW8LGbg?;vqfAdIFrZxgXmNH+MCqg z`&+Uv(joOV^gKPBXO$~YPgip~+P%jWKjg6UR;8+IEFP*kCnJHcR}T(nHboi_G?xq5 z`dEbc2#LukfZEFa-xhoJ*3I&<+ODe5;YKLgY-Q^UAjz$EAQHvRf9o gy aI{MM`tjN^2SzeB&dQr z7eL=f%9X%_aQ>>NG3P#Upg08d5IdEa-O*Xvdpun4MY9ZaMca`1hDIiW3EM%l%g5N+ zC6ZIupt=_>qE8c7>_e+^sIJ}R+Z|m9(=VwI&_z{5NOa!gUfE~3!W =S{g`b2Oa0W2OgcW X(Ej8nVea+j2bvcp}jZ#>++Es)&`LuuJ+M(0-eo((~UaW zuYb1p5L$;rzM!UDFf!~%9sT}i2hX!aXZ68#D+HA1m93Fp^Rb2(mAaZ4MhYwUYGPoY z%d3?i5d|pQTsAEKiSXmL81LP +Ya*qT_lkj_D`fpb6=qhWw; z9@3*yT)AKJ=cP}TC9@6zKMEbEeCxRVi%)$7tqNO3 c-p3^J&uZ+0vGTxUJ+;R3dNteH*8#+iVv()Qo1R=r6o=G9XvH&OSKzX zyskSV_1IcmH@=R+DdNnC>Vho4kVzokQWRfjl9z0Kiu~6+{i_(yrTT9_`KeBETq}CP zwe{6QF%()fa>Yeze7f=5Pnbb}wUkp}p;@lFD3RC5sLnDitRI@C`0PFJ+gI_B*3o+H zd&tBGtMj2BQ!s?RcQI*)MAeiR)U=6%;Aj1eg2!Kyw^|Z5y7Vl0AcC|46F~-_{2QKu zwyd|Sfb##i2q`pP77)1`K-Bdkk`6r$k`HWpV%26 z;#PP*{S+)iKvoyjnu* zf_Z-6*eB*HqhW8*O=0;=&CVvf$ErxCX>P#K;E~L({ZJCu;xwiLL~T4P=Ji@bnvNS5 z@hr;!_#|iI?Q!QAP--U28GX6Iwo3Iurx%y*_b+z{mM=X;qaRO2+jP-UNA9U&SoG6c z7KjQPr%U==a^y0Ntjd-f+~0(WmeC~_f1GP{imzYXW9Mjadb*2U*RZc&=nP;rT;{*% z0j8sc6t$rR3-oKx3w_r#gx_~f3mtb*ceKlYLw^RN51n#A QFtbr*dwzrsNbDVdEmwp+Kk7G(UoTsJjc+!FabD|Lqb@Y{pAYnOH${ z|Lr{pFEH>BJOWZKHGAuITR66bovDYhKL^~WKY6-hE`LIVQk4|Fx>0FkwfNH5-tP%w zC>RRB^xMKGTndVq*^dn0!dRXayZVXx`L1{S285Tn2TK|Tb mOJFhO8i;8~s zDCvPVbcgey`BiW~@Lh9f4M;J}x!!Uq)J>!1Q~@ljy4e+_cXLmgvOwgcZebUhCc~8I zQuXE3Vl+R*kzd?C3PbeiOty9YDrWs7F@4*7(LTISGd8O|wW_~e{@-6L(GOO2<%mFT zgx6x&QU!27?`#jR2z#IyVcT3P!;L05ccFRzwUaro&Cm|cyF1(s7?+%Dh}^=4$-0S2 z=GF9jQCQk1_>BOBOw@Vq%I=@Ux11HOkLg*D+N<)=scE>1_YCOKds(F k_@A90~%P} z8h4a`JNBF_i*x9H#=)4{>BNgHF03D}%J(YG$aaJ)G4U+V7Oa4Lg=Hg(kJN%uKowPd z{c>pcPS13^?K&RL)eH^T5w84O98q>v%C8ud0dfcei|J zzASry%TkcbpiMV!rPm-pYnbWi`J3RCirGz`%d6y)8^E^1$`4+G0XrYs!Zo{v&uN@t zpA++5yeLc+aC$I^UG>BJ((kgf L2u-VsNkp%Aw{6KHtq}`AEWi`4YlT>e{mNLwo#`Vm||)+z?R;l%q>Btt;6g zeIq~FK9llSye_2G`6@BhS}|{=hS;TWm-AP-9ssK1*V>qBg|6PjrkL8lvLd2XHih-2 z<{vWU8d| XK~t}{u6CnH7BXp|KioDBs=;EJqJIV}x>D0<35>h}bt5 iL>bZrd)lq5;)oWEN1v|^V{q8=K7kmY@(&5yR8}O|R@%Wv3 zR2M8tRCMf8<-KMywRJ~1-I&OrTiEb}xy~Kwoef?GUb&75qH5qXJz;&LIGev!cSafK zBsg |2^F6#;PA5WIVLOGWnB5) zO0qO7vOkwMdaZVvucU&H$$9PuQ;BBeN)o)L+^eMKiez=^!-hG$#i$Kd??yQnLG{z= zO>I!&xus^UV~4xXqwtx^zI%5NNjJKDC{5(2nTO}AS2fVvqc5KF!50~1_)W8Bnj9rs zNu;tdO-?0pnr;4EA)BNR&7DhwQ(a_6At#6nuk@{O8IdxviS(2Ki @7vz*h1;oPtx9RKEg>5fjBxH|$+mMZ1}}p2y1~WkyjdNEUWvo9X;@)?1{>@kdj1 zaugGb|1>Cr1_E(A_P^tyo_#vXKWq(dQu@m!;?NLBpp#gd8C5j-E&1$qwJ;&OwlA;P vm&LlA|3|m~;{y7l34e2*|Mf;v5I| #lXz-5>YNp7Q+qGqWR9m1QXJ(%&T_BBGR&{h&@nM2sXN zx*>Y!HsKAgYrhE*(PtvL5AQX-jkjT>84ob0-6q=zPR@Kia~fJ&+9 kF#diC#+m&7n&JK+W z#~pY*$5q%dEER_HU+`aL%p*+t|Nir?`hC4d_ievT$-sy+qe{gK$%WD*ueB-0VysTL zBS4EQTz=Hcoz5c#(mDVo9laj}-Sqaa04jQE;~UrL*j{0^NVSuSkv4(zPjN-v*39Q4 zu!5rdJUR PUpTF6zd zNd5qp(Jx`PF4J$=vi!nyxc^xO#C%YEBe88J3{sM;^)x<@_rf@@Lp ;@Pc|yG z1edcGXP*-5F%s6$D|S?judJ-ODaOb8)S$$vdB1_|bo8O7C#SkH(tFI42DUuw<4LOD zrrZSTW#ynLT*RJ!Z`EOx^-x|r{0^0CZEM^gy$$W-iJ@oSD=NeKYbA4!X*-ZZi^s8N z @$*Q2v-pqO&mB*cdE4GL!=91|`w{5`>Pz28a2E8_pNW$<`*rI4MXiRm2 zXZIasM>zlJ4#|y5F?rNN0vvR=)WS#3_%UY W3$%4#|)a!zw_1%wo z;JOxH*@1+9)-WLI95i(KeRzS|MWuvIMZtD7L$O<)tPJViSDn#{{>%pllp9+000gcI zP!G>;c!V@x%2%9u%$8g#A-(cne;IcXl;cgNTfsDxHfUvva4I$eY7(v3lizQxx{M|- zy`b>|HUCzjjA+mzb?|yv)}gZFQ=@F&Af9P5)49NfMDS~bi*DT@fbuR*YRQE+l9Vj& zD;c?JP0N`Dc^pi4b=D_?8?DT4wwl=^7;Zh}`^TH9tRPE@&iib>Pq3S@`uyW`A+y7A zF>^dXqW4Gt59zJ_+bS_ pR-JeZrfyr~)E~A_0zfk2j>(;J4Pr&6wj3~XM0(fG^5~_#UY+Av zuWC^fOdKVUD0}Df-g7O`PdY)aJD}N995m+vuCTfo@{C_K7_i@Asj0$lHqNKKL6K@q zuE!a4rZky5=%HdITXz=!-60!1p`qW6_}N0G9n8{&w();+0^$>2Yyq6NlsUd%u^F_G zlp77%tV=SDn}07jxTFI2lu!JLnC|?I)k5g oexj^b|SnsU6SyC9X)ijG;|WjZ)sXdGTi9762q MD4XK%vL9Yq<{Tn6*ipip?}7ro($>3-&gj(k?2$cG%AzUTaYHSC?K_)*+r_ zH+PojR|+E#>rT$i^HX1y!cahXS=Mqc;Ikme1X@2yeGAt#bXNPrW?AmvZ}!&$GhmUN zQ-NvXZRjUsy38(C*+2m d~}v;yYg(v!&Q&uXx&QFf%Vr)FX9scD-k=^;$g zMk5s%1krE^%7aTS(i|Ev)po!plnoTdBERQvhY9w~!A07{D~?A-5e}9<2SwwrFVr6e2B;1h>97!UYzk-wgpEAnabil^ zuWHkzTx)9-k5kS{+cF;Po$nD8daj)3TmSF43!en#Ti!@=XHcKpDr{johy8o4U$5-B z3%qCx43Oiz%)kW>YyrSYg?GJ}2p|zX5OLI7B`qu6nENvSXqVt*=Usn#op8C7kU~R6 zu*Wst3rRBSlQT<3G;v2`QD01@FotW17>}K?y`vUe@KgzZ?p1-5G?dq7PC>R#JR7wG zcmrqxbZ8k1z17j6f{IgdRW3tdto`_)0zFV6@AJcNNk#JUd5i!{Pw{E$_fUDZw1dEk zhk~jKdaEp()>B2A$H3{!+EALL+OYVA`32Tg a|a)|A|bwHv`3HrC}Y2g{CrKe8JvJ$*t|}99Rdn zW>a$Q6uF*bJLPlH^I#}!kdn_o92k ^zTbK< zq7S!^3S;@Q1I5T^0V4{~HR =t zv%nAB1JjMv?AQB@`T*V;7!<$q7PCsLo4qS4n;<*4Q6Fy0t5wF4KPIcSW0CqHu5YT} z!!@-oyE#G2 fIB+vRbTxl9jAOd{Wc zQ|p>l%4-lEwr~5(oCuc2l)aN=!frh!&s30JfW{q9@149BkfRJK@dlP@IL&KM8Bd5~ z9{V|JPF7889!U+JUZXK7Q>Y9rX|ZKhv3hTQzXoFJl~g)(2kmCH #$FeUv!iA1;x1w;6Q9X_Z^8A?RBB zESuDfzG+O@{e!|a+5DKhuHH8yDq-O!e!oEo?F_pw>^NcwliYa} TRiYtBJRDF8gZ6E*JU$ zg{iE4hvMBOb|RT4kt@BfL7C&AJQj;o`qz9#+m8jz8AWf%FWaQIW}|pA2dk#EqK9Ba z;eRz#%p*4$)&NeV-9mWHE?fK3+^$iw|BcCH62JgaR&i^(kX-MXoqT+EZe|t4rX&GO zQ&w=w@``_9&aDq!n)Q2O%~**?*bMpOf+&q|C8IPG%YKYgo1-4NDu6r76}~I-9X0Y| zDJ)k8d{n27(NL7^Tc)Z`9B#Q90=h5dY+3u}X?Xz*iv!FBm;qXWYhXR7&8do)4wSFm z-%ygcZ* 9Vc!4P=aFK3S+&Fa}%IQNX{_i72S? zpDCL^xtRxPxbe#gM= *maFS|#8{=>$G#mg%t0<#$_iky;qm&?e!5%ucp_k&S_?h}Vml|J#5BM#PXz(J|Ey zIKKV&W_V%5xiY#<9%?fkm=)F{h=qSAr6j1-XaCPey@KR7B8T(wqhz>GdXy3S|4_pK z4xwJxhh()_>&}UIHntbW)eI{8>5omLp9~JJb?$p3POh{CawI;$E!qx3p!is1>>)q* zIr^;vCsLrS+X(O>@y(> l7X4rqvP}ZQa>$&((qr8rw5;YfDZWjYbUHv z5iDaOsWaf&g@4$qy Z?b8O?UfAJZBYP z^-d%V#!G3dYcKQs HD^=|K`t|J;C|nyvquf5TlN1|UiJ;yV(?;P|E2W5e zPgy=XX+sMt9{{%iAsWy!hZqCOn^x1x`>f-B%78Mha 5gUU2tyf0mHQg0<%Rq%+_{&^)Qwp5#(ha@km?x_VgM#slm{UT3bqdx6-)gR8Q- z^|RAIA}}`rHB*-SQ#}^w?I<0}+O=D!la9#=77%}nD}2BA(0_ay>A&RS8H}Y 8$FpoSfPI_E;6nr8{{5^F{aLLsWk!Wl zfx8bLTloZ7dEApj>CD x(UEbV`RV$gQ}DQpInv_!Of0%Q$Z`&qZT)K$Fq!HDs)euz7U*&TZ?X} zZs5mZ7HwtxLV+cEjm9|8?kO5h-S6Hj1x6M9*cDt~SE_ybuw`JdD~wUXk<7CbiXn4n zP@PNgUT8KkG)Fd7Q;_vKukorfbIp5+&85abylr5+ZaZH941M=8;TQcb_m)}yW$c%c zp0xI4lH?B#EUJ63q6!WX5&0m7m3l^Ku?+F}kXOr F3|dUIT|^28E|PnF8^j@{Y Y(B?Ifj^DXM$$pCopo9=^CNet)pEeEn4|V-qV8tjF$ _;*7F}31 z|9CUL)nH!W^-e(Xm3f?QHA-g~2>o}5g<;h!CTIX3H&H)yhc}~iStb5eX^tw-gEj16 zhpG7J-^K;R#rG^3kv(pSii$Dw7W5^&H7j(m>u$0EW-hS6+}5Dz?8#1BwospRzsQ$6 z*Fb(_pb3RAQ1krpJ~yyydS%(j+(xOKkT{ ug*)P@+_Rex*|F&uo`HcF5{oI zF#G6V>hKHVv9?5ZUL@`v1DPl?@qmG#$oqB)On=_6L~9%s22NL?s1l1@A+IU)vskcT z*^o@vqZhckDPlW?YEX>$gu>geGN5*K<*io(PvEA@iQw||6?lm#wbX(Xew!p9T8%fu zImY+bx6`>K0Nodp59Ub0aOGGAE14TEl9*QWWBdK1DfC6=MU$L>cjJ`tn&2DljNL0q zOfgsY!F16#8X?`YoBakvJN`Waq&_350_h7SOa(s6AGf1)-K_gWZv-U#WMiJ_aM=(o zBi-@R@7_3P)Q?Ipn(c92iyYePj_S0R`eWtWTy*1w9d_qb;8Tv@#g6n%;TBuku>X3z zpw9LVfq${yS~MK^Ai$dSWA+D5r#_lDE1Jsl9|-z{O|m?Nup)h&{_Pi5e+e~~Uy27i z9L~Fby?ue`c*ISU9ykdeyNTISg#pl>3w`Fh(`F3MwP=f?yE}{@K3Eh)AYbX0mL48d zGiZqH{*(H0u(4qH7yM9J4|+1MF7yS$USF@aHWP7`k0Eshjil@q%4$V4^}?Leb&RAB zD;D9l@nELtC@EU&IZ<^z#?sN~t-lxCpcAGDMl3SkaV_F(G&rej?9Yt?favBO?;{9+ z7s(zeM2XkFGXUS!LT)?XonAAa^T`-G*Umtl{bBiI4sPCm@Wte-B;GOP!q;Kign`Rg z9v{5Gv!2_QMXoCVU!3=BdzeP^x&!yIQM|k!t~qC#+#3bdw`6OJH)@rsuuUzycdc-L zsO8=z&sN&-)j6a1RlK?YR?9YeiMI047kh#ptjIA$JBk~5ZfjX__K+IW j%k8w45>vgC%BPG9Gk%6W_91 lgI^hg^jJX_L=sW+~206jiQ6OEyD{3`-(e6tL2ax7CO z*X_7FjsKPmCabGYcpCNE;niA!`4ZKoV`*%{-uo?~-ItCGKBJPC4@38daTg3#XItb# z->;ES?Hr;EcoF$!cH7@pq_^x~#Fe4+Rcm7CFJ GMIwo8JfU$J`n*8HiN-0F}F!cRW=q0Q+G}X6o7MmiY>N43UXz{~|zP zs+aGoUG>1V(X+ynMQ?SdZcX8>T+!yoeeq?7>LZOKmO26l TvQD<%Hjmg8FuAKO6>1OX@U-r3) z@31`~H5_kF%ei}9L#zJ$hkPhYByPHQZ}^}{fKV4^t{oSRvkP44a>`Noj#x3rr?kG0 z7C0;nosG0T{Hv`tzh=?&(5lZz&KSQhWz0~rSw11B1n+nHSE2@0LJ3ma2+Q8=ihs6M zaPBaM(2Bwta+%UWKTYFM=!ODVT{Um7Syv`M&9)ltwvHs-kC75=4Os6(KbK%~DgTFe z$J*f|mp)p?W{X0mOweBgKRuYGw*HX?3Loh83R>=L-OJk(t7u9rRn597KZd}bJ)Tox zWcZt665|`Rc@nm{7JiEqy}+< U6g~#L^dn>N15YJzPsZUY=LmF65 z(>T8P=klkbV^z@Fq@^9HkB^Ayj+&acs?h&*{N~z0ePRxRNb9}XQM<8z H)YY1=gZxuR|OuF_R#@qGAUJku-9&kSpnPQl^ znx3KT^c!4oB(}-kq8VWu%2(gQ2!PZurF+F@yS4BuCDc#4Fip?f7|dYLV>4;_6Y4J9 zAna6B9@$|Xkc!=fPucaBNRj_3MwBW^w78;PlLS?>J zY)7Ezwj%(q5-S{j7}7sgLA!dX1GD->9ArX))2S8k4@R9^?fBs36R*TV6P)`M$) ;nS<5e{6)}xn$dqV9YB{ zq-8S=l?sWc?H!*>x>Ih&ZEp9mKHMvEvNrktH@q#w=WaXoR;b)p2h&wlZ2h0U&pzwh zx2HX$ON7`gy~$%zs+wch=ewwX>VbZUe&N{UJPYX1KDpa=2DA(xA3AUW?956H;`=r+ ztKl~);K-S$daLug#ZIB1FJu>i_&U7pyc2{6Ddq=*=-<%4SsJcccJb=ZskF5Cpp9s? z6L96?!&>iit7}ueF2`}jGCNG55}m#A?G|+pf#Z}tvAEkY)0Wh{Yl&ce%esfuO}~8` z`lELltE+0yJj?5TtF{J4d``W0^ZsjooezbYlm)oDN3oa^UG=v|P)O#*_>hYa#&;Cr zf)*94A3}1U9QKInjt;yXJXepNzmawJ==df&ppjcQze# D)-Wf$9 uiz_eLGA2*x%R-t(a^*+XSxdC zZdms~W}hodVJVtKES{WNWKGT7OI7MiG|AL1?pdym*4zF4h7nU rXzwv< zw_1Ak{@=Of?2C^-sMpOuqE O@D&ta?nT2 zE*ubE7k@{?|H9`=uRE*-o3Un)D-Q4~M`rd3?&jWWV+ffDeF_G%<_I_LH%@8jt?tFt z*K1q3et+$MjIbdvZwrr@7Jm~65y*EP;E_K@dn;wx{9A|H3Vw0-ZN0#XZl0S3S=odS z7Wm)L5Q5lDdvVNQ;3_Zd|6~U0c%qYVM^m2_z$zzrSm~x0-@d4 -J z6;cXhN*i=~HH!Ij#3CDvGo8Bq;pe*4DyQ5CqYX9Tn+hwn<1`9SSHdx}J#Kbtpz~t0 zwnKEQ5X0;{ugqGnqGefz31=qW*}o4VOk_CcIO}S0=4oo~KBRQ%eU{S4ON7IO*B4E9 zs12-oX^&rv2DVmEGKktGqwpwYL(aTA63#MNMtW2w`X%VQlyW+>27O~*HVEx$>T)$7 zLEA8)P1&P7_H$_ |Pxm!}@p|VYo{kzKF (NWlH=-8cgLs* zn1sy3p#IJempP1zw5uO-^&M*t(a!~SD4u6t;4HEhU(jOJY9M5CL|2w5HZ=j4ujjxu zl20|_4scL8R2S!Nm(`~r3fSm#?yo`^dJqm5D@#Y-)D&Q>+;TrBulbwpX4#`kIDAHU zx3$tmB*ylnlT@U6xpTlyKX=Y(F;{%M)M=i;w!+Y@MPsc#(eKCvCbgL9d%o}dlh<4( z$&$FKU*q2FNkxmzp#&`Uii&Db-7|u{3!*}1jxLTJ*ghOp*1_|N%8v>4;p(OEsHRa^ z{k>*h A2#n1|Z=?B}BE z% 1d* z)K${S!hWP&anmiu=kGorhtDDVzzV1e9X_@=|MYqlNsZE-HJskc4wGYM_i0%dC0F!r zIeXBYB!1kk;;B=l)IEiU_IpRg!afrEzj@#-un+0Ui?@l!yr?2;`BF6pd3NX}oxCi3 z!gVf0HS_DHx>FGqZ#}1A^*~P@=##!<{unyGZfXbWJTgsXC&y2^3mdV8WF(8bEK)P4 z^g?N8>X!}s8Gohk#+;cYKeaDwRiY$NM3aGdI$HhuyqfdFL62+ge|P^EsDqu%WJ 3TpQ-cGZir zAL56B3