From 06c678343b97f1cf11696c5e835b74a9fba160c9 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Wed, 4 May 2022 11:29:28 +0800 Subject: [PATCH 1/6] Create docs/zh-Hans/Deployment/Index.md --- docs/zh-Hans/Deployment/Index.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 docs/zh-Hans/Deployment/Index.md diff --git a/docs/zh-Hans/Deployment/Index.md b/docs/zh-Hans/Deployment/Index.md new file mode 100644 index 0000000000..9df24e56f0 --- /dev/null +++ b/docs/zh-Hans/Deployment/Index.md @@ -0,0 +1,9 @@ +# 部署 + +部署ABP应用程序与部署其他.NET或ASP.NET Core应用程序并没有什么不同. 你可以将其部署到云服务提供商(例如Azure、AWS、Google)或内部部署服务器、IIS或任何其他web服务器. ABP的文档中没有太多关于部署的信息. 你可以参考提供商的文档. + +但是, 在部署应用程序时, 有些主题是你应该注意的. 其中大多数是一般的软件部署注意事项, 但你应该了解如何在基于ABP的应用程序中处理它们. 我们为此准备了指南, 建议你在设计部署配置之前仔细阅读这些指南. + +## 指南 + +* [部署到群集环境](Clustered-Environment.md): 讲解了当你希望同时运行应用程序的多个实例时, 如何来配置应用程序. From 8931c8ad10bcebd914f0a2c8b3b566aa4b849122 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Wed, 4 May 2022 19:26:51 +0800 Subject: [PATCH 2/6] Create Clustered-Environment.md --- .../Deployment/Clustered-Environment.md | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 docs/zh-Hans/Deployment/Clustered-Environment.md diff --git a/docs/zh-Hans/Deployment/Clustered-Environment.md b/docs/zh-Hans/Deployment/Clustered-Environment.md new file mode 100644 index 0000000000..d98ef86c28 --- /dev/null +++ b/docs/zh-Hans/Deployment/Clustered-Environment.md @@ -0,0 +1,99 @@ +# 部署到群集环境 + +本文档介绍了在将应用程序部署到**多个应用程序实例同时运行**的集群环境中时应注意的内容, 并解释了如何在基于ABP的应用程序中处理这些内容. + +> 无论你使用的是整体式应用程序还是微服务解决方案, 本文档均有效. 适用于一个流程. 应用程序可以是整体式web应用程序、微服务解决方案中的服务、控制台应用程序或其他类型的可执行过程. +> +> 例如, 要将应用程序部署到Kubernetes并进行配置, 以便应用程序或服务在多个POD中运行, 那时应用程序或服务将在集群环境中运行. + +## 了解集群环境 + +> 如果你已经熟悉集群部署和负载均衡器, 可以跳过本节. + +### 单实例部署 + +考虑作为**单个实例**部署的应用程序, 如下图所示: + +![deployment-single-instance](../images/deployment-single-instance.png) + +浏览器和其他客户端应用程序可以直接向应用程序发出HTTP请求. 你可以在客户端和应用程序之间放置一个web服务器(例如IIS或NGINX), 但仍有一个应用程序实例在单个服务器或容器中运行. 单实例的配置**限于规模**, 因为它在一台服务器上运行, 并且你受到服务器容量的限制. + +### 集群部署 + +**集群部署**是在一台或多台服务器上**同时运行**应用程序**多个实例**的方式. 通过这种方式, 不同的实例可以满足不同的请求, 并且可以通过在系统中添加新服务器来扩展. 下图显示了集群使用**负载均衡器**的典型实现: + +![deployment-clustered](../images/deployment-clustered.png) + +### 负载均衡器 + +[负载均衡器](https://en.wikipedia.org/wiki/Load_balancing_(computing)) 有很多特性, 但它们基本上会将**传入的HTTP请求转发**给应用程序的实例, 并将响应返回给客户端应用程序. + +负载平衡器可以使用不同的算法来选择应用程序实例, 同时确定用于传递传入请求的应用程序实例. **循环**是最简单、最常用的算法之一. 请求被轮流传递到应用程序实例. 第一个实例得到第一个请求, 第二个实例得到第二个请求, 依此类推. 在所有实例都被使用之后, 它返回到第一个实例, 并且下一个请求的算法也是类似的. + +### 潜在问题 + +一旦应用程序的多个实例并行运行, 你应该仔细考虑以下内容: + +* 当你有多个实例时, 存储在应用程序 **内存中的任何状态(数据)** 都将成为问题. 存储在应用程序实例内存中的状态可能在下一个请求中不可用, 因为下一个请求将由不同的应用程序实例处理. 虽然有一些解决方案(比如粘性会话)可以解决这个问题, 但如果你想在集群、容器或云中运行应用程序, **最好将其设计为无状态**. +* **内存缓存** 是一种内存状态, 不应在集群应用程序中使用. 你应该使用**分布式缓存**. +* 你不应该在**本地文件系统**中存储应用程序所有实例都可以使用的数据. 不同的应用程序实例可能在不同的容器或服务器中运行, 并且它们可能无法访问同一个文件系统. 你可以使用**云或外部存储提供商**作为解决方案. +* 如果你有**后台工作者**或**作业队列管理器**, 则应小心, 因为多个实例可能会尝试执行同一作业或同时执行同一工作. 因此, 你可能会多次完成相同的工作, 或者在尝试访问和更改相同的资源时可能会出现很多错误. + +集群部署可能会有更多问题, 但这些是最常见的问题. ABP被设计为与集群部署场景兼容. 以下各节介绍了将基于ABP的应用程序部署到集群环境时应执行的操作. + +## 切换分布式缓存 + +ASP.NET Core提供了不同类型的缓存功能. [内存缓存](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory)将对象存储在本地服务器的内存中, 并且仅对存储该对象的应用程序可用. 集群环境中的非粘性会话应使用[分布式缓存](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed), 除了一些特定场景(例如, 你可以将本地CSS文件缓存到内存中. 它是只读数据, 在所有应用程序实例中都是相同的. 出于性能原因, 你可以将其缓存到内存中, 而不会出现任何问题). + +[ABP的分布式缓存](../Caching.md)扩展了[ASP.NET Core的分布式缓存](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed)的基础设施. 默认情况下, 它在内存中工作. 当你要将应用程序部署到集群环境时, 应该配置实际的分布式缓存提供程序. + +> 即使应用程序不直接使用`IDistributedCache`, 也应该为集群部署配置缓存提供程序. 因为ABP框架和预构建的[应用程序模块](../Modules/Index.md)正在使用分布式缓存. + +ASP.NET Core提供了可以用作分布式缓存提供程序的多种集成, 如[Redis](https://redis.io/)和[NCache](https://www.alachisoft.com/ncache/). 你可以按照[微软文档](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed)了解如何在应用程序中使用它们. + +如果你决定使用Redis作为分布式缓存提供程序, **请遵循[ABP的Redis缓存集成文档](../Redis-Cache.md)** 了解将其安装到应用程序并配置Redis所需遵循的步骤. + +> 根据你在创建新ABP解决方案时的偏好, Redis缓存可能会预先安装在你的解决方案中. 例如, 如果你在MVC UI中选择了*Tiered*选项, Redis缓存将进行预装. 因为, 在这种情况下, 解决方案中有两个应用程序, 它们应该使用相同的缓存源来保持一致. + +## 使用合适的BLOB存储提供程序 + +如果你在[文件系统提供程序](../Blob-Storing-File-System.md)中使用了ABP的[BLOB存储](../Blob-Storing.md)功能, 则应该在集群环境中使用另一个提供程序, 因为文件系统提供程序使用应用程序的本地文件系统. + +[数据库BLOB提供程序](../Blob-Storing-Database)是最简单的方法, 因为它使用应用程序的主数据库(或另一个数据库, 如果你配置的话)来存储BLOB. 但是, 你应该记住, BLOB是大型对象, 可能会迅速增加数据库的大小. + +> [ABP商业版](https://commercial.abp.io/)启动解决方案模板预装了数据库BLOB提供程序, 并将BLOB存储在应用程序的数据库中. + +查看[BLOB Storing](../Blob-Storing.md)文档以查看所有可用的BLOB存储提供程序. + +## 配置后台作业 + +ABP的[后台作业系统](../Background-Jobs.md)将要在后台执行的任务进行排队. 后台作业队列是持久性的, 排队的任务能够保证执行(如果失败, 将重新尝试). + +ABP的默认后台作业管理器与集群环境兼容. 它使用[分布式锁](../Distributed-Locking.md)来确保一次只能在单个应用程序实例中执行作业. 请参阅下面的*配置分布式锁提供程序*部分, 了解如何为应用程序配置分布式锁提供程序, 以便默认后台作业管理器在集群环境中正常工作. + +如果不想使用分布式锁提供程序, 可以使用以下选项: + +* 停止所有应用程序实例中的后台作业管理器(将`AbpBackgroundJobOptions.IsJobExecutionEnabled`设置为`false`)只保留其中一个应用程序实例, 以便只有单个实例执行作业(而其他应用程序实例仍可以对作业进行排队). +* 在所有应用程序实例中停止后台作业管理器(将`AbpBackgroundJobOptions.IsJobExecutionEnabled`设置为`false`), 并创建一个专用的应用程序(可能是在自己的容器中运行的控制台应用程序或在后台运行的Windows服务)来执行所有后台作业. 如果你的后台作业占用大量系统资源(CPU、RAM或磁盘), 那么这是一个不错的选择, 这样你就可以将该后台应用程序部署到专用服务器上, 并且后台作业不会影响应用程序的性能. + +> 如果你使用的是外部后台作业集成(例如[Hangfire](../Background-Workers-Hangfire.md)或[Quartz](../Background-Workers-Quartz.md))而不是默认的后台作业管理器, 请参阅提供程序的文档, 了解如何为集群环境配置它. + +## 配置分布式锁提供程序 + +ABP通过[分布式锁](https://github.com/madelson/DistributedLock)库实现了一个抽象的分布式锁. 分布式锁用于控制多个应用程序对共享资源的并发访问, 以防止由于并发写入而导致资源损坏. ABP框架和一些预构建的[应用程序模块](../Modules/Index.md)出于一些原因正在使用分布式锁. + +但是, 分布式锁系统默认在进程中工作. 这意味着它实际上不是分布式的, 除非配置分布式锁提供程序. 因此, 如果尚未配置应用程序的提供程序, 请按照[分布式锁](../Distributed-Locking.md)文档为其配置提供程序. + +## 实现后台工作者 + +ASP.NET Core[托管服务](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services), ABP提供[后台工作者](../Background-Workers.md)在应用程序的后台线程中执行任务. + +如果你的应用程序有在后台运行的任务, 你应该注意它们在集群环境中的行为, 尤其是在后台任务使用相同资源的情况下. 你应该设计后台任务, 以便它们在集群环境中继续正常工作. + +假设SaaS应用程序中的后台工作者检查用户订阅, 并在订阅续订日期临近时发送电子邮件. 如果后台任务在多个应用程序实例中运行, 可能会多次向某些用户发送同一封电子邮件, 这会影响他们. + +我们建议你使用以下方法之一来解决此问题: + +* 实现你的后台工作者, 以便他们在集群环境中工作时不会出现任何问题. 使用[分布式锁](../Distributed-Locking.md)来确保并发控制是一种方法. 应用程序实例中的后台工作者可能会处理分布式锁, 因此其他应用程序实例中的工作者将等待该锁. 这样, 只有一个工作者在实际工作, 而其他的则在等待. 如果你实现了这一点, 你的后台工作者就可以安全地运行, 不必关心应用程序是如何部署的. +* 停止所有应用程序实例中的后台工作者(将`AbpBackgroundWorkerOptions.IsEnabled`设置为`false`), 只保留其中一个应用程序实例, 因此只有单个实例运行这些后台工作者. +* 停止所有应用程序实例中的后台工作者(将`AbpBackgroundWorkerOptions.IsEnabled`设置为`false`), 并创建一个专用的应用程序(可能是在自己的容器中运行的控制台应用程序或在后台运行的Windows服务)来执行所有后台任务. 如果你的后台工作者消耗大量系统资源(CPU、RAM或磁盘), 那么这是一个不错的选择, 这样你就可以将该后台应用程序部署到专用服务器上, 并且你的后台任务不会影响应用程序的性能. From a3172543aecb98fa57491bd15d31554af0033955 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Wed, 4 May 2022 19:30:43 +0800 Subject: [PATCH 3/6] add images and update docs-nav.json --- docs/zh-Hans/docs-nav.json | 14 ++++++++++++++ docs/zh-Hans/images/deployment-clustered.png | Bin 0 -> 41488 bytes .../images/deployment-single-instance.png | Bin 0 -> 30663 bytes 3 files changed, 14 insertions(+) create mode 100644 docs/zh-Hans/images/deployment-clustered.png create mode 100644 docs/zh-Hans/images/deployment-single-instance.png diff --git a/docs/zh-Hans/docs-nav.json b/docs/zh-Hans/docs-nav.json index fa38a203d0..f708415979 100644 --- a/docs/zh-Hans/docs-nav.json +++ b/docs/zh-Hans/docs-nav.json @@ -262,6 +262,10 @@ "text": "种子数据", "path": "Data-Seeding.md" }, + { + "text": "分布式锁", + "path": "Distributed-Locking.md" + }, { "text": "虚拟文件系统", "path": "Virtual-File-System.md" @@ -694,6 +698,16 @@ "text": "测试", "path": "Testing.md" }, + { + "text": "部署", + "path": "Deployment/Index.md", + "items": [ + { + "text": "部署到群集环境", + "path": "Deployment/Clustered-Environment.md" + } + ] + }, { "text": "示例", "items": [ diff --git a/docs/zh-Hans/images/deployment-clustered.png b/docs/zh-Hans/images/deployment-clustered.png new file mode 100644 index 0000000000000000000000000000000000000000..74177482c5e768e71ac6d8d6e1340d06f7dbd176 GIT binary patch literal 41488 zcmcG$WmMKp)INF(D7T=5AV{ZlNq0(@bfsl z_-}SWgYp9Q-^?fdC9&>*k4CHb;okf=bHfPsdGT+?KLYdr_F-$YO|TH3t1xw*@ntQO zg5NbN2TOrvXxv}JTACn@<%3<42TLy@Zp0s8|IhCTe*t?kd;Zq0&KYw)lR;ANm~J+x z=~&_F2xdncJuu<$-^=O#@0b7o^Rxdy?!lt~V3Sr~P-m=E zo!#-2%+8B$Gfl=YJyuFifn29WKWiFKHX`JL zUoh81zq)1==uQ$~7wP~dG8P?P{Nr_XgenL%-5-QzQN?A&&RY}Rs^&3ag`*3KX=~4j z8^c4mv2@>jfSmYrB`tgvY2|X+Q7?6JbUf^5TDM&xG440!n-SgG zWViF#uM_XqntPFA>DYn4>1=7cH|Q4M36Aw{H1`*>Flq%&04 z;M=$~)*IlNvTy#a`18|Pa?`+n@~#J}-~Na@Rkp_Y<^ zQMj8O+ZA9Z*wVbe84q|qJ(i{tFD=Mb615HwN8$#2@eZFkLWtB` zQ_f=6`#z0gZlY^(QOgBN6xicJ*VM=oyKu5=gBZWi<)2qBwL^Pu_xD`&6^W8^>GSEe z`~cBH;i)z%(UH6gFE7dR_TnYBk?y@e2W&dt?(l)P**UuhNn5s62WC<{4&U=r{FE+( z)uIMf`%GCWQv&5BB^E--Kos_IjY;Dhwht`J)OOYIGBnC2;jVc#O9o{`kkv5(;I{SU ziX?5?wrg2UMSCTUnM_gTWg-5y22SgOA6rv&FKn2>2CU{uchlXSZy@}{T5wDZ;UHPnH%kB zuR<`aX30+c95`l*cQ*6t$}q+f3^uCP4c&9m8wV8Fe@PGys4GJ!Q3XBd%=g#VA{6dW z1fdO0CyQF78koq|o13tZMvnhZYm>Tso4VZjO3hAI1qE(w&bWe$42gC6dh_*1WWG$= z<&c8ZF?LxryX$l>3F<6NyQ|9WP{&liSDyB&{Ar+Qi$@ZmmfsZ4&# z8MY_6m&V^*JL+_I%5@i(_E&nUu2Wp46-J0S{UTwyJ{PLTxP6@s+nnboz?*%dYucNS zZ9P|M*cbB=Z?|oufrn*Fzer;LI8GV7zr~s4W(pCSf+E zfArnMy#~SYP)A5-h%vR(v%C*MrR$#&)Axw2e||^XI<;PH@Nm@s5kl-5916ib^hFt; zPD(g#_U-DGh+Ere;ovJ!`XGhAybY%IybaBI&z5AZQbUUC_-C#^!Ojg;KibgqEq(By zzafq_eOSm{&(qQAQek%eAv%!*f`nvS>o@7rCotB(h>}K%g zRLmj)U-*!Hr-ltBTBi7|^ZI@4Ba;w*mj=1JbEp`yNLp*?^TxKBPvk_^euI~^UALC_ z=BN-y)wQYlUhvOS;5N~g2G8B?bsdenMiJu=%1bCwP^1P#ww$tLP+SCRXk>JEduwP^ zd!Yz{aQ+uGakSrhdS4>){cedtzm^z}IiYpQ0U_vVmWBS!(*g-AuT3`QBPjwha$WNv zSVVYu_>UjxzF~&~b51FoJ!nL^qaRA;F>PdiRgn~2lH^O&yde6$QAyB9E?8JEA7#xP zfvJIlzsR0(rW{hn@?XTz8t_9?4sU<1dHT#6fwh?EtzRXBJCRoqq+U?OtRkPIqEXgj z2!m-IB@laRS)-2k?p>wfKzyVbE@YJP4?s+Aewu?Cm-U2rCBlH_`*YuKZV^~}EL(zl z@1(w&3%IzrXliQO*w~QQJWuj}`nM^)=t95Vp{`pgt!HxVsiRpHvv6$)d?^$(rbs-`kBziNL&y*R$=tKCo zeLv|!+F@T^Abg7X2CLFKNWl|<5{eL7<58{ZxFE_nDl|!}ymDxDb+|C|(p*mpYr_{s z-Xt6t^Ww$WiSBOk49qRJGBq{pYG!;=3PI4_b_xDqxqfy_#cf8n<3;1GYR-BQc zqpz>O?HL6FY5xE)zV-Ffgo}k&U_KTm1n{i8 zSM{m^d8m(CNk25-lv4$v^v7$c$eza|fPkiEb&7I+I%)^tMdLnvdtvSG+Y+P$b&PNn zgcB>=>RRlG+Pzs{w>JSkTg#-m{ z_}@Tw-uz>7KX>1JNi0f9#+i#6`I<$hL`bt1`j(Miv;-18@|8C1=(!{Hg$w=y0Q>WT z8{&XBB70xV)Fzzr16?iE+2PpU;nPIi_u6>u{dgm+(d0?jgiZAK;LjX@1^60#{U>tk zH|oqMvyHS1`rgE}Xu2k+kNox#Ho4-+ge#!<^Byq4IFv%Nu=oFV(!1uv{Xbvtb z?jwS(G(3)1BsGU(qLG|@p)BUpxw*Lv&NPY%SK2l8gX4-fNqPM+pzJP)Us6w&zPW^ zk7oEq`^lSMr$B(0xEW~?7(`OgxIIprRa%=IlT+~LtxcDk*fGu)anjZG6GaW<+J5)p z;hA{KOBYWBZp>d&Mb=p={~|16GYd~shZr8G)^um=+@%ebtD>T!o*t2)$>DrWfow+Y zo3IxUJeYs3@sCx7qntV7kYZd_HgxevMMJYBw8Rsf5EnNN$@qr~_;sb?blR2$2M*&{ zzTKvjZK3blDEoAXZKCfgd)Rjw4Qb_sq@MR}p0k39noK$$!N6($n zdlCSIV6D7h1*2(vu3txIiNHF%mhVcmM(fh00}Tw5>)&N8S)cwIDzX|(bjRc^AgJlA-NL~3&7W8EnhBFn2gV$ z=YEmX263oZU0wC_^9v3R9vqYk7>%dZkXKMpkeAog(jsu9fn;*XD#BSXBuNybn#inQzU1j2r^5@){1zf2u*-VuvzM$UcRYT3olpOj+@?VLsmqWX8sIb zf6x2Cm&m&d18F0cQ$Q&Aew8*Uo&nKT4t94A8U zEStu4>`9@>_wg5+V|G*5J;2BL~8ByU_7i7DkkRk#zqyuvViaErAV(| zhlGV`ROZfwI6!q_>_ojUq5xK8Mi`99 zQAfX6zqvhSewG-$M%2|!OwQ%_8YI+Mr)5pCb?W60SL2)mhqwLvMb1ckd^W=-D}9vC zUI2sVN`fF42KDMTii+sDFJVt8@Y_N(8{Hm#S7e{<2g=e!W6!9IDME7xjqU^6Fiese zQz%0R%M0gSnRhcZobYZQtIM>XPhel{$N8_#%5jgDOoQ&>0Pv3r#VjBZhR{+@{XrE3$E>eMpThO#6gv!sF}jED z5Cf8lwYIhfHUn(Q&Cz^~IfyO?^CS>_<@1th5*v%?#=y5`mQI#_KUG|FeIe*EbG%$k1DCmcG8hu1fMdYNPh*yj5hLzl2< zW(u=`@v!H*waFE|A_GWc>Fz{|GmYONy3?lLd@Oqaj=1;|9v%}Nox!w2qt-%PT3T9M+}6>t#(4(vi=0ce zoh)Y2?PO=}Aaxkgn=+X-mNXkRXeg$h-Cg3hw!AnWvNLkX>{9of?})vF4GIFTjf*5o zVTZ06Lz3D4B|==|=Pa6^g)}OP36#a=mu|@-78qem9H>;LjOjzesJK#^xIAeCM$SEy z5R(YtX;N!U5!$Bq8GxS6I3Ykrz1V5lsi^kA;X|_kCi3y|foRQ>nntq9(?*)sY*)(E zsgs;9O)5^`=1pavY^$5UT+#Gjj0EkzmRJo%dHEuS zSoEMFeaDMM7O*p}o5?xtdU}(Sk(O9K%3xoB@JAA0rD7;Z3x%YU0upaN{Zp;UiMBBT zBQ-IR-Sf`D{TdN+|H~N8gY52sMM!(WjQQ?%t&lxvRMnvtkvgbudbPaDj{q*+2Y~Cmld}2 zBhak31y9T3k_1BFP#R&$Xg?64qz)h(`*i6H;biMLMbcFE z%N^+#qhz9$PKB2e1byu)LMwI7IuJ-21sxsTr%$LW$|X}E-uyCnwZqZKiMZZ*xj53w zW5SF@@Ywt+woiyS{dxU7Ry4|jNX0jQ_p9;nA+Lv&wmd%iPMh^1JPa=Z(Pz2IN_yu9 zuia4CV_#v4H)In#S^jO>PqMsG0F9G}Dl$B6>Gr=RG%YM95F3l~_HNYv;P$-TD!s`e z2g`KT943iJA%pt$ZhEq_xebo`MvWu6_&K^@1W0i*8~v82OIfkwS+$eycz#4(XjR|` zO5Bo!k&)5=WP7b#z#qwIUah{K&imTFH{XaC(kq>Ni`oUE!dtS5L?T$WwsWJuiK7@W zLuL_I8#gWHPDj)V6fcn$Iq10o76yzag_|3f8J#vvoBuj(SR7!p^J<&DIUU@v$tLHc zwplH4tg+>LaPGs@KpZ%(9jz;P1#ji%{*)_6A{LrmDB2>0X1W~hqN$~EO>qbrb@SAG zSW0UqXvBS$@HPw+<|F`$gf#r;4-^@>*EtHG2m9T-PPpG6s&a85vf*^4FHaw>+f>Y| zCv)-V6AST_>c#cl$c9M^pEFB+G2b*G9oL(2=7`S92}g{@#Y~R=^Ac<%M^0d zf=i84`R=g0M?&W%AdjBVrN;i4R~RCzVfFmj`QEYg=wlcol3Lxlve%=uXFMbiujMI7FgFik$WGU5J8E2 zVZFx_M-Q4kFgmu+T|UMsJ%=uw?k=2@heJC{!6txneN2kuIiCx$V8tQ&ZB$_-i*QUE z=TY%2R;v9>!9q+?#j!g+^_r;5ALe0x2?{CAEiUIId7fKtfk0*jG&NJBqDH_<$6Bga z0S|CJ-&(^B0Wd^?@dC(GKj1BxfqFY@UsZS@N7f#V{?TEzjn8;1;Je;n&)v6g<;b{2 z#d76ZH;u7heAtYZhTXjfhAXLF1`UxxJG=XeqJkWzQoM2gZu>irPEDnVkINDMN}4oh zOxef5Mj_Tr#XXJps|=NXeJ@G%UWtV&r_X>)TqW9MiSKC`uEQusv+X(vJHl!zrCeM~ zD>0wZYJl(gioZtWoy;-xsi>X={xrQu9JKHVkFB zZ*DtQUrz|5o|JoQ-`$;5i1v9CQcC>UF27mO>3K`gX+cvW|8uUPTr+F2Y717D?e%hE zTEg>)w8s9$9luUS){_?rJpA4D=~;}#>0qsBmZE7tdjHP_R~4(}#v~n8jg?<|ry6KN zIBjS%)BBiSwGGPU&liWcT`&fNa&u>XvR6kcyk;naPrcy@+PG|csPr$m_5M{s9oV@c z;jlWAFJHa{?EPv76@phzO}yIp?VB^}F-3`TO%vqT(8=|;W}D5KCdngZOPvOXgO)=U z>_fJYw#Ei_SzNI8%{f>9{J5!NYL2>N^n~A1UOgMyC!Qt0T%P75G?9#lI%miuo1e|c z99`E$S3C;JO3j^7q<+mUTdf1Yuye54@mcmK7v2_b2a26P6msn#;RJH_uXS zSwcUNYM&8jCp&ab_Ih@X#?aKOAYq$uXu$$F?v3xKmVL< zbO#0@jmL*!O|W--U#?>86@QY`VPaGKs^7i^)6PCz<4c_mXpUxXjCR8e) z2LC)gtgMg(Bof~2>iMsD*q*68^Ym}jRE48U%k@4rqjOwQCK&mhZG9FIAtNV$zS)TS z^y!l_vZ0|NV76i1>&eO3MkDbW3k~+$oq>o1ZsQbRAjrl3KpppK8mk7dB#`+>Gn-sU z1bh$U@Bex}!18iNLxmAW)$ZD}e_0E%6qbEb`OiZ1^z;B;O(2+nJd21(Zz!3i)FLRG zB0>bnI|@old0!~Z%*?>%SX!29m$Q9%b9o7@p~HfeBtVr0BV)wb!Qt zHM@H2A(y_nv5E%R^H9n1t>uOvo)ZOi+fCk&h|6Awkq<@!LdWmF(Q3X1rEd?E+vK!3;e%*dvid5`$6}7lADgrX}Wsf^)`9FaisM&vUg1i zd*PP#on;E*5M-4c^KMm>|38ij(e z%k;_UZxbC%9b%xk)6qvr=0xEXFm#m+UQbRYrU^6Bo09TYGY%NmBq?A)&PR*U1Dkny zc~etUZ{NO!6Id0XNOkFZ;EN3skIB^rgw2E>x(0GI%Fy-m+jk+q7Zw&)R@%IupFHm_ zY<&XwPyTSS!A#@4As^PsUua?o=(9jNm@(FyM4xV9p-1SaQucft(lU(j);V^i7v|+M z%bg-ZmtLWx5|L`e}^iaI(U;j3#73kq0q+b_Ld@z!-*q*TEF z;M_Z62`X8ts)<8Jv>Jc<`;$L?{iaE$)9T?WKQ5F_F#vmhex8$)Gchq?JeU}rkT4TJ zu-BS+jK9cs;8D_1OtshQ${5y2?sM5)%Jx ziV9V3o7MJc5>X_4ZdF1Q?(sZ7{GawDtJDpyfpG}QX0opsgePElpAWI<80ce*?t`2$Lnh z>MxV(Em*0`>#J*9m&GYQL*HIrJKEYYCxPA!gut`50(mbPX~dlw^0QsJ=nWBfvEPHf zU%w&0MmTuRKr6VyNfC)hLijOHNHq&B$1}`|&DCs@CanzDS{}tzDi9)- zsHVEZFzGexSJ&4WoepL}VO6`u&G7(BKz1~wgjj*u^K4vc@*$?1mMLk7sk8Uxb;74o z%eyO4ppchbV|t(Tl*F%a*|aiPV@J(`7H+UYHtT9l#0P`@FgjjWYLzifK%o8!f(Y0J51g$R)W zTHkoagajFvUDt6n1dSZbPmyGKE+@hK#Ayp& zV2f1%MH=~-Y%g3LGfd64_>Ky$gcx>IAuuS23AWwQ(J=^_;Atl(DiV(?{|g00C}YYH z9{v++pzPr75Ux3{-&0;*mV&b2bQ zuyiVlIxTUcNefI63&vP~kGmeJMxE=`lOjb=f4!A?H+M19GE@3=ReL)n!>(m#7TBU;M`sHNMd7Pv8)dI;;-dxnU|V8lIiL_FJ`M z2Mse4E%zt%fXBYKeweBZBzkH+Em>Y_e75PNZ);&WH%uKqO%O*d+D*c0s54E*VCSgd zz@6L+j%SQjvEGcMF227oGcERVR@Ty5YK4`QltdNOub5>-b{WeSK0Q5!5~Zej?2hN< z?{=!Gseu%fDo%n1LpGh8gPz`ctuqijR2GL~N4#2+6sQf@FnuUg@&{0yBN9P5>S68_fc`Q|GG(;I09!GWpYJpQi#920*Dc*;NbVGggzct{H9_qARqkA`!B6{3P zr!5$&4Rcdj#~jRhYFM>|>+JR>DLuZ9W(t&Y=QcLpwfn*X6BdMiA|ewsnaGz0J0D9f zt4tLq{@-9>VX3I7po%lQJ=+|#8c3j5DN-C88v~#x4syJKfrWZolE{>Wtj0#{ptjy9 zf{}p%NePKYk6Sw0>M`hr6M9-hF%2ZhtQ?3BPq zlTH+Rd9;MH64z${kA%C!t7nB+IWR&L0OQUwO~4&fBUGvaNZ+=Rtz+err;@ym4l z?wji>f!cI0=cB?nZNMIh3@vZhejc*pe1MF?rm@?0>M}S8v|4Md5#H3Tce_Tlmep8dT&>K{`>-v)+sD^%mAsH83NB7ItNtpt7j)l~*+-xpV^{j>`_JD4(` zAn8OAr11l$?N^Xu07Q>`F64cBL_{p7vqeMvs4!?}p>-yu#OjXNuQ_BKt^(AsN8_s@ zR^fIWHmhnXvu`L8l9D)lULN~6rUYa+7-8LD>3|eib1n>$@2!CoviGI?Ohuv{Sad zQSzLMpR{VUp@w9JX|;K^Xhb}z6N@vFllKBCB`Qd!&yOM2ptkwf;p_GYS48@t2qKH_ z1mkjT4UD>$3}gEI)VX8K32CG8tzjrpX!c@vS^ak`!9qbbg#v36QA32BK1J=k-*tE| zk#vNT=cNsF5|k_(_PrKkPbu*Jb4`QB&pb7EJl>UNE! zgSkH*Gr4Ks{d-&l4%@mqD+qePnM@3C%qb}-b`o^F1fU?il$oZ%&&MYxC(D#3_Gtci zPsZ)s`kBmC0YEq@*UI zJ{Z*{CVps6`AiJz271dQwokC>9-XAeYGtHTofXQ(B_*^27?$(ZMY~8qO|PW#HehMv zrlzJQBg+pIQCAo!EP8l&P%2S=2?xjUGV-UojHDz9R3F4`kbM9)(CIEg`mQ-IkQay# zjj9FVFU-yMfjC%`^X69)Dg6DFAyuXtr{_m=AdF~zmJzrPy{DQ=zQCztPc=g1`htGA zOJ=*uR;CWB_zWrH7-7O=pr)RmnP`|K(79eSM64RjPvgfBZ6GJSxufR~dP4C>x}<>^ z=aWoH(P3CszWpA3rS$Cdj34^;Vt4+Z4Mn^|M2FK%mrCPc;CYSDYw~J(L-~WSB zAzw-jSfTdt*T=idrP@6#2&B4aG)o9%6Q^c9OK($#@OeF4_OFeLU$15Jz$4>xyPg?L z_-O(fhAz|dH56%$2fWmfQLWAE(I$?lL35bKu>Va*wa3p*wKDCNM!l|AaS|-xJ*iK1 z;9NU91&yAZy}Z0kOehp)phQ1XQ*j9hya5sd6l1zqji&-&G!FizrKyQQqw3>qB2Al< zpSULiXo%GH_{0PYcEl9<8OR)+kC$l^284u!P7AKU>z}XNp4G~H4XgMSObR1(2Dp?8 zKDW=Dhh2y$aBT&RGvj?C4(_cvnu<%Q<6Eu}RnXwlGx%OoXzLpe#OL>BHB)<5gMMM? zpg!_O9}_iY>O=9ek}?{N;9m-xcL?kjwN*JJNKRV9GN6(s63qX{fYp3|4^IF~T^g9QY+xi9xg*QK&5iS%N1xd}~nOtLmSIzXwY?B7XPwjwCS^G^kO3 z{P+=I)6+>8auS}+HAvIgyq`PlQ^TyXP85%c zP|3_Pjmb4h-m>H1MhY6)Xb98#J)B(-v|?>(Hapw*RrJ(V6F*^q7>ZwR`+dqz`s=?s z2%2DUe)O0@HbuV);}qKm8qwqoES7Oy<{6V3=Qx%rvxqSR#zZNj82u_$U{u}2CIQ2S z%fVhxSk2x$tL?CT-ibq7m+sytKO_=ASy%{~oB*ZO%zVF8xp-n`N)CO~hCVQd5+lg7 zq`q2IxILCkx)Q({R{Agr2 zAXo_6(AcP+cJVs|O}RwMIf<9- z`I&a{Wuewm2-@A#!)QGzARqvUaE@qHt=mE!HoUF9eHRJiP@Yuv@hk{axw)iUOrSqv zYcPokFlW&y{B8nQ@D}A#AWnA!v+C`|1Ph|ApYwXW`&3XB{zs$Guo}b``|V*C%op^k zzkINSjT*1lf(Ss4es*Rz00nxU#`H!8qagzRYmmeA;G|HG{#{?Mv{~ykO7E5#J4OA~ zC$&sPm$&dVH7XS&WWb9b11|^%a=XViZ;G<|fsHd4&0*anf@SR$T_FDqSdiTUVdBf` z8rkce{iWWnmW%>XK6+$Xwvf>df%a{+VfS-8?;BE5Kf**G)%LoUJtftXU%yuMjAASp zKA2zLjW>mMo`uFx1vcmY{PkcJA!5#e&1AhIS3D_SK`lrzT2P)+Rh3^RQ(B_YcFo77 z+)8bWv2+}lLTcjU-M=Y?KX7NQS6E&kHr~+}Ej%kWlTW#)Y+KYPWtTDn>)Ki0(6E+p zw>6YF$W^O(esb*zX-A_3@qvcspyhfQbRVuPH8~&F z6Tj-wuTZ6l2L+$~^0sC07|pezv2O-sT}q+Y>f>K0Gqk19maEh>P;?I zR2dCbCe!lhbq3tr+~j{9kN5EOq&;5Op|qVE%g>-J{b@KU!J1Jhmm{K9rXGlr%witD z`O(3}H{WUh23p@?LPJw-Aqpo&$ZR$Wnf9l=a`%2Z6ugq=jWT9Uad&rjyEc31l~c}x z?kpJh*H^$k-o3pzN977jMpWf`9W>!4!g7~yzjdB9al8~}J4bv^ z^)}LnC->d4_INTkZPY*mC4Knw@mSpXvm4(+Vz(Qoi7GfgoNYpAYzKez4}OEMOYF(n z2m{nO;UaXRqsd53_4Uk46z@Vn<8;OB7LiN)_?B<{Nj;5KKiSrRi3SUgO^4shn?pze z^Xi-tU^5bc0m;b34{Wj*QBYBt0iPL^1CY+)esxf5xd6nt;MmydGOhiCgT?CL-`g49 zN5Jd>99&#DRH)+O;51pxRe}hC$L%tD<{BIlg2ikyTBg+`lg=H2^ZM=Eh=_e^O50PeAq#Tu>s(QDrC%Xk1!~yFY8?mvmw!F&s>3L2HQz`;vu#n7BAhxhN?2H1z z2bu5T1f*QR(nyDcckXhbtSQnc0YDo=q;F=>>x9FPDo~_~!sD9mht^9EL;-Q=`C>vA zWd7ZK7MALZ)l0qWs&iERQj(HD3BWD;6q+3V3Ai^Q;BLU)K;{dw?9hmann8IJL)x4z zTy`5mF0Pc2^wOAD8b$Z$;o!7Yi>7xXdTPB0a!u9Sw~>)gsuo>@v~37)osoj1V}2~_ z9_)_|oGw$@GFq1p9k&cwNt!a%l+||VD(*UvRjK7oB@N{!N$0Z7hs6^zHFjc%tE{-M65e-VNVUh9j%8m zpUo=2dA{Y;qGXKKM3KhyqAx4g;>Ao-K7fBPXy}8~nuq%DkK3#-Kh7H6|9g`Zw(jt3 zCz6$w6>wOS22{{bVug;-J)Fk1;&pEsEp{<3NiPi?3{+RZwo=p68&{~J3$Jyur#U!j z2K#jDk1-!^Y%l@W0^Y;H$w?dlfZh3EcC1rWzNu8b1|ebNVEt<;z~#2Py%JVLANBc) zuf2XR5rHV`xZ3XPxDSxH?x>f*yBZg{Rt>Ml5NJwFMuWd*ieb`nH%L|&*X5anYaChF zW3mlea?`D@;Yo%_Z-=6FN?6qKgZ7ssIq6(xsYe#eH3zKn(fyN1YaB1<=Nr$c43h-0 zZZ9aJb5MvtRl2p+&C{?3p^eUV@167nE2cQ8_OXBHW`p{naBx1=KaqrlF$or`=kPdC zbxZC|&*UT&Ob*S-?HEwMs*!3># z8LjbUQIi)|n@xrgotJ?vGJgm?PD68VW})hK`#rcZBj@tVVanY170Km#==s$V;tnyX zILOxA0fz=C^!Cjg2PY@5wLnZV>15J`0nk6>w$T$28j8?NEyy*UDP zI$mbn<6%x-n6fbwHJaL?Kb0@hg$J5j;2!Sx@iW?-cvyHyT=<_0jeA77-xE95JZf+Y z%SqJaS4)8H@Bj+tPYJoQ!m??Ta5AQh0XzamT+#NsS6y0p{RUpTsd0p=nvtdG8k4Gu zFgh=#Cz9vq%}Oyu+eKnckH^r+s*<|apf}v~MJeDQW(K}ymdj>Z>o|v$6!u-zEVtyI z7s$F^25!@>{CPYs`eC0mVXLV`O39$cspD$oOLXqNTwW#)yLxBTOr2 zjQ4NS%S^4`o!VW^J*?LzMI!0t&C79*FP36ee+xrTUDM>%@f~Ej@kdOUl@%2qR-PYM z>TNgjWzyzLROpd{&_4VdVlf6vN=hIl(bm=mv;@p8Eor4EqzWaNSW+xHGR6kUS%l>* zST#uBxw^Pq?9b2>61LCGs8GeJM}CU?@dFolT7MihJ6cyqM^+rBpRxbL)q-_=+YC$T zvp;zfpggrC!4?x0K}dM|5+b_bz9lrPAl(gNrMqeogyx0*+liZmo|_vNvXvaXns5g0 zyMZ58F6frDqm!=x4r_X6-WFXT^U3o_R+3zt>RzU!m`x{z^T{*|wr%$bA?{Abb~kUI z0|1clrgNOxTX8vbVN|%VA)^YYpNQBxv0Z%vu4c}}Sa6RHF~Ks{A`v39pyS;uj|Jae zd(5Wg(lP;NtrgvR1HguYr5h%!_~Y;;~r>9{J7dgX4`&y;~~B)$^XH5BM02 z2ZK{T7d!Q1=LTC;>bXV>jzg+2@#jDJYs*IGw)ee$h6K#tTfmN1&i;A}>-Mtlmw$Gx z#Zup`)-=JW-+z}JU;;+L#YBSRLyQtVOD*ojx#-yRlI8f>DJC*-A#TN07+j-y=S2-} zu{xd3xd%Tz-fwSht-rQ0H8sVg*T&_r`wOV2AtP2$mtNHzI5RMSbLE(-m(P?aQssf_ zCY2I6o6@q<($eyBHtYzIoajD$(CpN;X49YvDqdM%0KkHZ+KB;jk>cL^Ix&js^E4;~ zTQ4=nB`3Qb&a*V*GYSR|86kgQ$c)2ev|i@cl)a|+zC~2XUmapwslL^C?u#W~@x0c; ztpG(zS}n7tAAhrif|6e)lybB3@bEA)j#px1Uh=Rnd_mzt<5ZStI)ytE9YoH zFW9{l;cxvaj%#^FDIS+QtgU0IZjZ4XB|nkus2W~8jFFmz?FMo&~qRh0K68h`R-zU(p>W`7Wd zzCAsp+uwL|hDsDL%FmU`*}fpRwHb`!W)#5nxjoHbJXgG-p@E$ol-6TOT|t@Qe0#** z%`MC}$Myg80=$BUM<(EH)@kz+%t9ghj1usL0v#c6d6^Y~K8CbUDzT%er4%b~eAgi` z@L!Pv42irLLMYi744dEnd9{d?)F7a{Ap7+9_fJy7Po92G0u{G!Z*hQP0OX^ngzsXq zveu0rT_C4Opw~%HPsc|=@sWgpYE{jd>KjaGrKTMWQMKKsgi)~D>3TQ2L9b&3kTW#R z2P^To;UhWl1WiC}zsZ`OWUPFRDUl3>6!3+hUBN~?FTcR*W6I0qlg+xE8o)3!%8sTB z=aVmlCaPokb(6N+^($z)bYkaH6}}iSvy|~GWc{QoQnX>W;7u6Vuv4ww>H^8!`rqGe zDi7OYHsS04y@3vcf_!8JT4eWI;q^vtE7xC2eB^1JH)S%*;Id z;PAC-Zqc0`7il8%V{$$aVu3(P4+_~kqgg<;|EXHB4(bq6;^J~tap=OIYGzN?0M*Cl zoODz2#UTCo(Q>hVY-NQ&1r3nC7W-`(a4WO2(4RE6PhMUg$kIwwN&pbc3Q~UjFktZ^ zj_r#i;ENPx0~GaNL4BGaY$%C|9MrfuIXO8vu;Baoo^EnBL(TuuWv>SpAV~2Bs?scj zDs9{IqxFCY;J{coIMmT%HY7l3;PrZ_H#EUPLyJvH0*}MWvFp%qZ~)C#E1@!q=Y4*# zfB3xC-}1!$Km9_K^Td{gl@zGRwK1S&$DUJo|_$$#tHsvt?C;_>R8=XsY}G1OYN z$K@6-%h#2!M7&?oIF8UG>#M?=Y2}LlEI--GLa_SUrhqP&{@#u&V@Cd#DRvH*nNW8- z=y>g}6>yicj%lqzEyUyrs2u6-sh{gaXBUd#Tak^<5mw`+;f>n*oBCy4)$6D_?c@_? z!C=y&8QzDVtyy|bf9>g|UDPRl;V+cQ7pX{>9DR}Q+ill&&PzkYT)Z@Nm$ zW{~tnk-O1@`$IWp^q0-AG*yGH)qG8~Rf9cgQ0xo_ZQr0)g)rNDaW4Cez4 zZSenG;U{9=ZQ;u}h;@1;yk;2iWozx@)sfi3s`s|{!)Y&wu~K9T6PwXVFSJshs6iA5 zbpi&Eu%2hK$c zdxd>=+(>@HMBvB3SWncOw9XZMdewW41wJgaDzi&Z$iM{U-?jo!<$7|z(42Pk^e5tG zPAq!PEGo@YN3FN#urP9&HDR4#UWz=yB>GJFdCWnp1%GAp|KjQ^fU0W4tq+n)OE)4S z(%r3qG)PK^0@B^3fFLO#B_btV0wN))0wUer-3`+J!*}P--1+w~!}xt1IA_1_equdq zt=F-JO*sm83n7VT)phy%wsy=w<;1?Lw?7OKeopia$l_Ai)KolWbZ{d~(0nvnOd0XE!_cTOmSG6y8!+S(Y-Hy{O1RbPTRPUP0^3Z`?fLu-5!4F zpVK-JdE(@@Xt~jupZqt&uN!VAh&ypP8_NgKj3j$rUvsv#wD9^eGBaDx|9%H;`DOqT zG7go{htyQt@ObVt40L;E$7 zi7T;%?8bV53dn;9=jqcVetW}2RGp+49t_WuMB(NKv@BH! z1%p$IFbqdojP?#|e5r}M2lr(?cRh=q&rK_>q|J>vrTP0a=RQ4g`(OiJAQkt~?|m>* zOLQsY+Or8>>Q1ZUwA{pNr_m+^BLlyO^2di9{O%;wQcp8DKX;VabuIGw2u;3OItC3j zGl5q}9p$M=Li5vj%?M8X^CV8SKk-)1G6wH_Hx?)Y%_0V{ZDX#vT6(sw{ zn%34b!8-5;sE=D@9b396bc40J%WQ0a-{Q?X)}Y0`>c9n!I1%F8C%^e6T=%L zjF%@tIJgmnbp#Lej&x^fY4F)nTUW|n7)BKuV!m)ngd1(#=Q0NW-C3rt$LQfv<=C%; zIWF4>m1)u-3X77du^8?@vfnIgHvD$YiuQ#m4x!Z4O(Qv8jK&Yr9c8Y>avG8SjdEaXS8~0>hmjEIRG8z^@C8wJe zJusqZ3Tljxj|WI=M@%8=wOz?VTfjuyzH6+WPTghWJ3=LHUSi82eU{dM4GOHh_-umB zzx$b=f}|MgURLOY2Hy2MWo3DxbM3cfq(`X-*$!lLG-dd^9wuny8>x{}BT@Re`kF?X z7K1|jpB|qn{wMusDyUfk{o1%XjXsmmJ3R8G0}-iJd~3BCv!cX3?hmg5`rWmu|XT)_UnXb4$#cV~MWMbZ_ z$F!S32fi_k**tqTEgZ=Q-hD{Z&zfmzpy&RET&OtNC3iP`;uy`2d!+8yN!7*v+l5&G zG3WP;W9h**0jliXaqCiSis9;p{M_7?aP|g)mwyR^r5s`KuUBP9L`3w6@J_v9v_Eep zB~X=~UKrPa&M5Q8R6~<*o6-@vsGQ9X06mlJ=A5p zT`%NmgBp~Wlxua~m0H506k?Fx`=I{i9K2PktHw^pmxS#vc1;-9gM_TDDr?nGb{GY4 zZq!MTRYXKZiSD#$8~O4&E&d@f@+q^QX{}9TA@2Bfa{=fZK`#elb5+Le>3Y5A&+}Co zdB`J`a|bq#WU^ogGH2SPh!UZ2%UOU@ERCJ;4)BQ}qiZl7{YN=ng4OO2wQ>E z^}>vEHw)G;8?11aJ6yE1wCMpK(|hSGpZB9#VHz;UO|TZ*CB*9*bp6xxs%NlD)~X6( z;j~Y-e89x^=uR~)Q$+eEM<;?CtK#~~W7mZo4TX~U$g|Pw$h6zD`@p9s;;%)+%DGR2 zd0CU(vh6QA{J^ybfad&8^6JA7zIJY`@IXc|PEhnJy!3uNoUcOt?w@eleH28!T%!9a z`XpY-3CuG_RMkXcM6b(3PH*=OoTf!zx8T=(Dd**qm`vr|UF%?CUQ5s(42mtvnk>F1 z)Z~9ve7F8c-oP_bh)Y6I81ICdaI5`U_7Gb=#d7RH*vI!WJN$e2Yn_EJB+*>T;qm2f>#{S`I`vBTi6>fob>c2faLi;#a>df8F-6rFtdk& zc~g@FTUHsfwA!D^u(8aaFSs%cN&h^#rS!&6JTr>ahA#y=Y5~d=v0TORiHRPV`#>Gv z-~a4I_*;hCSatd097)0xwAW7t={Iz|Dd#BLO zKKH@b_7`-w=`Q!i#Hb?}XfF+3wuBKeYZa~T3?=CWf&oxnoygfsAD;_=^6BX4-cx+^ zRr}7bGj>U=Ma5DiM7k!5ed%+cfTDCz{a)Mo-~fxi_B;uGimJxH9|K`&)2H{q?u4>5 z8Ve8ev}oEwF-1d28$aaN_R#ip;gPNeRo}z5cmG1W%lE@a>?VJ4iTzyK-YePe)@Pd# zlXC7K?LLbud2UE}mkFnad2no1AYO@Z_#w!IWlhZLwl#r)K-U>So4ZtH|F~YLytpXM>hQ1v#9S2 zy`UWD@n`WV&!#+n^`g{i~n9}?>FQCREbjl&`0ymR_2y3CzJrX85I z+>O!5bTzQA`rY~(+%b?ZIi=C%5KWrDGrI7Ko`$+?W#7`u$F?k(#wxK}Kdf3SAn|Up zQrC5_R;Z?F!0V4jaqiKv{X_8<%f-O{I$hhu%E*PDhv%?QmgaK%$Brcd&lky*j~`+F z;4#~TBr7XxZ*Om8G}D(Q>+RtoAS`@vdO@-5Vr$An4)c7ejJ%SP2B#%x8MT3tkA;RT ziRZ$Og<^#*Y|;HGJw0PpCbR~%tnn6uTxRK8OL{p=At5Xof{?CSzaag8qmP@jWNpu` z{2ypDL35yYp4M%OqrZ)f${~kWOddIHJo|MFK}&pxF?O@+0mo>;WaB;Mh|-z@zRGE1 zdO0WgC!;^xsPAC@>lik#@5|d-jSjZBzEWzQ48w{)ju)tXfFi===z<(DFoI)DHOU>g z%h?xwZ5kf*(2~T=E z;f&C2ylslPg_!6U>{JP*8}rU=D3u`)Rrh!v96@WN^%f2v2P*(NF=gPo{V<# zXC)8-#S%CpGyd1U;7^0#;4bfsB1NQY74m}MV=E1Z!@&1m(FM(_36FtrPqXWmLhRyV zdmN3|>OFcNHD=@UI?SXA@^fZmvFKcG(sPa15_nI-Wd?>zh=iZ7um&k#SWth8`Gn`b zTt4aHYyT;<$9>kpE~)ortHhLI$)M>yxme{@T^8bjNTD+DO(B-<)5K$_Sc+^Er>Oj~srs8S%E@7lH z)wR6&6$LVR59{Aq7bda|v#ndr^rd-gG`Jl>KEzvP65L`EHcN}awSSSC#+VxcV2O~P5)X}YC(LuDMl$b&;f9cGto}vR= zNG%;_M;jX(!g^)@&d*^cY7Egc4{fBm`L&$^Cmt2&)7Zs>QxHG_XkMsQ3@}^PlD($p z5WHx}%C$$`gahMzCE!v-_Jd*JYl@e0#T?H&i7JmwxQq__ExCNpJ4&8I%H))qn8T{ zR(7%3qN0+(173?wS^D3H8iDNi7(ODCfj+X*A!w-4$Bxe5l|2vv)5aG^(YHKZx8BH_ z_a(2DTMzl#Ghn00MUlPR3gYDNAZ$cONMzdzsnw`tStA9!Ymob#*=IIMhnQV)HcHRL z@EoYA^bAi>o|#`?jK|w$X^egASFv_7D*M;gm+nU!Y7-BgU zAs4|72P6k701B$9H7C}1`5hoXcyHIpWkz-2)rd8pPmAQTRw2S!mI6gAs z30(|m%oG_gv9Ksby}n88Cbn*xSDb=g3kD9UGFfDcQKTr60Co-D!*#Yc@keDLx@{+t z$4p%9veiS6lG5Vjp1^X|c;qe}l%uE;dK-J0b=60{RJ&BJ zzo{!P|6Wp?k*}8DPl3e{2jACwH~Jpjecg0RLi_H?ZF+|_CXCeSbQ?`%gmi2P-5dsq zg+0HvxP2*Ja%t6%!f>6=?Pts3kS+F=iMGxz9p+j($ij)s$sWxe?1xQP>*+`$=9uu0 zj+n6CzWd#WO?K($>%_}y1=-tEnW3l+s`r^{&s+}2IXA`WIa#L=Jl@*;(ocf@=f&h^ zb1#S5#$N7p;S%pZx4if90Y%RMe}4gIf|hRXWl?M6w{5KThPekz8H#RZ;SB{Dmm9t# zwHwr?3+c^R^(Dy-k#l<xL%yP%P(wocP$_i3A z)O5PV#9L|HM1ZMZ!+uP6b2XjI`j@huWvR=+y zU%BtiOY_8MWtokbAcsB6r(7iBbZfr4Gy0sKC*}MCJA!sr-Zr(_GIMERigV#t+aJHn ztl59b2d}ear-V7z8{QGrO%{0@z5Dc!?xA1$PTq6%opK!(Rx71KUG=F^m*SEP<-X0; z-c#emwk4D^j}hh%R<D}N8j>Of0a_?RJ&po?HMLhWm%kp!INKz6reO#LBySNBC@+&HjPzLBZq@n zkFQM}PF=fnGC2SCJVtwPuu@WY96i?-=gMhEGbN`^6xW!~DQj&`rq()svIE;qFyx1l z(?rA~4m}6Q?&eqp6_=|*ek58h>;sxo<(i00r z?mMK3umyR_(>siRJ=CmkPUk0|sHCzg9)7{atT&-(UZI4_f-m4GV8fQe>f{6-G{4M+ z4Q8Af99$IT>VB+DNX}U2Z^XByZCyNCISCX&M-QWa0>uf<=N7^)-pH`O<6gu=+Ng@E z^g;hlCp~DzK z+wLwRcr|&&YRi>OPC)^a8km~u>*|hAPvb;HklD3S4UI`lqah(ljE#+rAF4Wj zkTe%@N%S>b=l6m`gsyEG^?DqAU*<4a6L@ibcT>Wm5VjuwusJzHRZWS29bxGzM4gC< z*kAuhb$)Om>lO0vG-980Zndd??nGLw2Mlgj+o+E2LKL!6Pc$g3b;vINQfKP7e|fLG z50TEj%51$sS*=ej?YerDFL$DhLH(=l>(@i4AK!ody}jLv*W|ufBailroC-cJ2k8?B zhh1QlHJmO}j3Y>2sm9A60aJxi-0xGDIW#8!&d$zY4)5))kp1knL@(};b(xNfP^xaR zosCTqXq58)yGl!CkA7?A5InsSJ6()}8q=-rIfL(3NeJ2Us1cH|gFwUQ?UfS!%EL19 zDbunGwPzm%97PUhf3{hqu`;vQJH>aI4)O2~@iAT0i6Tib-Mu_+%eOz?BoPp*6$-zs z6Y&+5{pV4A?&0N8Q@iV_kIr_IL)mLbXcb~OlQF>0sHq7|W8S0qO4lV#-XUzIE!|?> ziMhFXMG~7q-bdEtDU4zLYuF2cw}?f!!Uf~UY{YbZzSD5xp{%Vet*vqde5C&GRxkrA z2&g8kco;Wazk(sF@!LsmTf8Y<0A`Mq7zq3P`#NR=43!&g-raXCrtl39R-rT%=Lh+h3JT#sN4B=+CdFdRntUvaRi<+RWUgom{*tn?zM-L7 z`(j4VQGGRYb_IFZi_17I-*K+lK)uQ<& zpygKX>igL=TpDn#(R786?F!v*OD52qn@aP3R^o*H{0}H zNXxRrXkK?>hdIITH1A#vLaB^X5@DL@ci>7wsBM_AK4!D~^#ty4-96BQB~@9D9J`wDU{ z{**2)D$Z3_JE$Ai;IV=}dA7C(nPZbSiHfrpCtcVy$(Bs9kN6e57G&`Ws*ETBz!#YG zzrL(*Oa-aJ(ZBCHQ}P!AORLMMoknGCcgTI1nZJ=b*GWKfTPZ+W0K$oxpBn zsH%!UV3M%;Y*mgFp)nGMv4Y{$bR8KHo2<07=<%o-Oye!wzTU^6QN9t3||W-FKv7l4~3nWX@6*K?~Q_1&|0xFuV@B_~Yf5KnuceGb+*O4J5OUuC8p7kHYTo zXtIdTVS~vb7Z=y6B^V`5`y42l=NUk3Mhj?Cn>IH~-hOnP)K$V+XIyd}MT|jxye4E+>2!OO!z9 zbmo+ebS-csr35{8G)S%U@~3pR?wcCsNttvwp;*RQ0TL(JHty|%1xPlm9VqC}>>Dq& zR8<2CoX$t^vs7s3AZ`Uo&3%!J18wExl9x12X~>22()_PZr|Z4dE@i;$PKYfAEbmNvgX#K=B9h+E!W0#RH9+A2n>1iv03e=&nk|(9 z$wMkG{Vf&z5BLp0f|9`Gv`B#&9TYI&x`@!PA0JrmOGrq_%VW%bmYkFXUE}cZaBBoQ zqE{ExqZ0QxA8>JhE-x#N{P}a!Ry`t)N#RHGSz8|06{X5X)q}$&(viIkZzElaF*R+iyc}|a;fM+~2_!rm z2oZ7ZL5F3zg&$~}jCpQJ_*UFSG?{WvZ01P5mq0W-JUDb&<5A;JR_bE4#nHDL>2AfS z7~5pItBAFw(L`=5YqIt-hTyvX&?5JV4nID)a-2t{ZbrWpkld~Q^rz`{f!ohX!B54a z#IwX>BZXGF4(Lc&%Q)G^#aja^;z}wivc-%tQIyFE3CAFANQ2cH%vT3f1gpxA^m67Z z3n}_B#>RXpzzs~|G=mzmHHxakCGCC35-bn7lD+T+@M!O!b|`8tudImwn+?2KUZ4GT zK-U0_2XSBc-4bx>_{LE2CVA&W$I{byzw67B!*4KUWM*X40r?I5WFNk+sohxl($R=f zZmyJP@Ak7sts>n@dAb-vA|lSXR4{pjzs8uTXl+eTm&o$`jom$FX3WayoSmC_GsL+= zdd6AEmYbV4AFQMW7hr_}%mO6$5Ih%i5{uY#F$v#i@ zV!SteYjm}2P^r2qT6_I?ON#;V$4hxbpvH9=P z)6;wT^1*tjn!5TxfBzeiqt|Mqh$;S-bOM#b>n?Nd@RqybEx==gVgd;X3FOx0`)GXR zks!bX;`5+YCEvyan{vNPFN99D!@Xj4Bw9W`H{gwe6dP{f7qDnDxuYd6-U!6~65UFs zhY!)apiYZ$s_nd;{cH^|^ZEICSY-Dch={<+{>r~kQs#YPS7>nwR@rEX97B`dN&9#QX5B!ZMA&mIQ0K)P3%0T6Nn3K))eW_o-Eyi_1Qs9)V`f?*FT!oF?~tzy~a zMyO%Yy?MDcI5>z1sHor;W#HpGUX+{2dC!BK8StEth~YrgJ3Du z^mUE$Yi)f!w5i>TEv99v^qxDv8E***kA2YAEcJUOIkL$v^y8rFF3M6EYA0tWR4nXd@F&2IMwzai& zd3hOP)$#FhR20sO+nt-CuRAG6ZTO)2IXI<@3Ed6_b4#X}r#7{6q>-%^7CkW8`cYnf zS7~W*V^Y=4jStb8Dm=38VP&-r^(K@@etu%=2}c3(#;KfUXkK*D0)7_)h!2U0Al&8* zfq`W8=fjt#4??|ZIXU~7e$LOEYV?A)kw{8ndJ0hd^~+z#f%Y4^NKIBQs%H?KN1p5e zwW<+(?{p_m;z5=(v5s*@xLv!!ma^dODGcD}-FIJLYQoFwI#i%p->HHd3XA{9#H?{D z5nV!pMlZEYr>O2{1+GfU{L0I$p7XW(yJ+WgVIC1KB@ zF~lGBUI;lLU}tq{J=3a~_MDDV$-E*YT!Vhqr`xHxK`nQ{JvT$iydw{PyDY|JHG9m| zlfy48J>`nWqGRzi*djS~?ku3ihC4svrVj56xJyW=p|1}mq!PoxjRS^Z9b;TO5Oc}F z-t{=M4~Uu|dxdLR^2Is4K#_sKfJYGzr8wYKVCZK^TTmJa!LSi@fVba3#RMaw$z5HB z=H_N!@)=xJ!J=pRn@nyVqX5oIgb?oLG3NUk2fWgg;HGebrSXj_VM zi1}Q@Vlh>HJf{M^U1AFJ)ZLoQ94!kDmxp>v3=0vD2wqh|3-{{Ox=iA6MSs`x$y1#+ z)6=uuN!W;2^Z{~AO>G?(D0T|ra2u1F&08bLKnM5d0%@%qlun>^qK*brQ9^3!?VX*S z?QLb(1;;0`^dT^(I~&k`2C}}PA%i-PGOz+FD#CJ&&+4ECpwOx2aNuALtzy*;uiE6) z6-F>Xrv%+bqvwJ7x0bE~DR&*mUlU-6*$5&lpyL8>ZUNLna7Bw>Rd298W9c9UBa4^jVK(FcmoVi(%J5j zVu4K)76U{|$XUQBbXh`P$I9)q1c>_AdvXJ)=}X+S{CBqkvluuw@A8alfBp@%qJ_=lsbc73n*{=tF0-`#u- z&^CL4snV|yTm|}Auo>TJylx2DLykvA3;6fP@%cIK`k5hyBwkQX)_;nOu%rPp*T{`fr*gL><6jBjCTHY3-c zs)_>`qSpEVe%&gZ)&6CKf;u8?ereg%wLorczi;GubC&O=tXr*orTZ%1^{#ke^C&I> z4`TM~AMb}a(-pUG?x}Io@0ON#PcmU5{4Dz!r?6@I2e|2AqXHgG4^=(`+)gMhC@6S4 zSZWaeS9|+y*Wa^FHH6ZxP;@Q{SyhsEjiqvOaLK})0Gvkvzudeucp@!LL`Vp$!mbrP z3r;Jz2(IKJ3;wa`z%V=bxg{shYZgK;+=5V`Y(s5XKcie_-24WFo0F6J8m<9}e zktRZ?(u$}eD z$d$a=aK8N*U5%*nS^ng=R|KM(&z{{~KkK9D&Hd_iWM%#hymsvCkF<8|EkJdjpPzr| z4P=pFYDb(Xz@V~(R*o-s?V zNbWz1Vb6A1~4XU}4x%2NMx{1$crrD$Se`wMWEuw+eE{0^KoD8G+* z_dk0sff?vMM|fpzDM)Gopo320li1W4W!u=8CmgZ_UbL%4Fr{FMhvjw|KZhP)0%^eP z)~#Fb9e1Eilz8|Ssz+cOBF#dlE^+c8t{u#2puzScv$e8fqGJ8nJToKC#)ebbw7Rqv z`Xm#I{j+*(42(ZrU0|IOEp}#!tAJ}vgo04S*gtV~FV3?Dta_3zDl_k`xu$t{&yMIh zy?i1R7XG{a2kbA4^v=87Pjh=jPW~XP)BRlCyZ@zIrAOXtvmq#MMFIDdh=IeEX{uBP zH>uKc6y|=|pL7I-FCB<$%JKT^FR{$SUqum!l*Z7!`Jby4fBwS_W>Ob zpVOp{_)Li_zW4t1X!%Ai<~|(2kQmP{wn4XjLEN7?d@=KV%c?kGpz)4z><3S8FvQ8%zzpZri3fwqJmyE z1NEKdKxRnyT<1Nk6_^FU+|61$lvC*nwQVh%h z@Qn3Z7WMb0jS=&hU0llsxBKFHgC_Tj6LF)c+t}rv#RWX z*mI!n&Cf(J{Wf#8ReM5?+V}2kXBO;Ey%g9mG3rj@!lycIWUuNdv;r&LCunFWr>8Et zrqRS{{(=iLx~bhtbk9$tR~Vwt)xS10o_6f`cP$)SI-keX z`P@SMd;0^&mDV>svl<`aG+kNNHt+UeKBf{eyG|iG_}cg_NhHxjr1aGg>Bm%0Rq`|n zpoa#|4fxf-K_vMa1wbMw)hWyTv8P*n3~Ws3yx{`-5};t@4#d#E^BdwqEsGcUewN)y zxidRU8!um9Uk?TtpzO)bwYV;#=OAT3PJ#UXYN5^dcL=NTmX!XLlHh1s*(+Wq2Zcb^jM%bz4V z771diyBY(dU${xX3BjCay>~6y`v{!yz-ZG^P#>pFla88(FaS>Yy867&k+#z7+(}-{ z2ew1DA=6#YFG@+$UjCf{khw?Dp_=B{B6SB%vN|m2MEP5;BkeMdMZspqmBDC^I*}ID zH+zmM(Wl$S9KX`S!om!GxPf^9xJbaosq(I6UOL<>c2k7fz7w#A)(9ko22znKBRM%a zlsO;dv*okSDf!gD zjcd7P@96w?|HS)XIo!x^BLuq6SXxDfgT@MXx!^au0o@@uCv8g5xPHGlSv>8x_d9jH z+B{#|J7Yt`v?1;oIO^f4)}X)eIo*J9ma}zXfoAd0+BnZvCr>p&ber>R7^<@A>$nP4 ziA0_lls?TX=r{uV{+K=8E%h6BFIdd{p;5lyvceE@J$7fiiXeB`VvD}izikU0MNU*m z)R3+z^*!gY3EZH?-Qdd~-_;Bvi8#=lf6x(!-{`;M<%f<2Ar0FcwEs{7Av?$r!owAe zPV!7R0-FMujS(KSZu8UP%9_j{62#ovBvc8<#;31JZ6~zr-xE7bscv3Xw@Zonx3m_g z?OeRtuYOl&}ezGMQz(aYB!scOn7Ip`-7(d?3; zWU(+Zf!&wl!aAOF#wTn)Rb5ZE99_dn$_(NZ7=%elNsTN(*Yg-3AI;1ktqzBDZveoo z(>Z_NE!?)>#yn>p)nHa!*Z2AUYT!x-bHYnIlM0=bnbX|eT9w@l^%nc0iQn#vkq0N? zIN0PQvx5m}8|#?eMk0C)jXG-Wre$KfpQx$&pNAHyR(AWJJia%x zSATfg5J8Knz}~pGqZG+Rw88Ls_C3q6c$&QDqFqq{r@sm9dH}GD*p<$obUF*_H+Wm@ zy)9`wiT68KXx9caUYsK2R%1Is&;U9)IT;#K9~i^D3N*4ywDr9%7ju9X95ckjiAMMKAR$cb`uWhs{^PdwgHO)mh#CX-p z8+|_4N#A+OBQZ9fGi)X8BL)>vw@hhis>%6(enap8WA~ z7GjQMMbnG{bavLzdOMlEjFHmO>Y={ox%h|F?oNw+6;v#YUON@+@x`|M_x*2&kw2uU zzv_~nyc)(cv(rYCLShdy+E}1;DLMX^V8&ded|DI4mQ;Qhp|#_$JT~3icna(q3+rT2tV+9Z2cAbjCnK@P!w=vhh0!w>MPs z^>EVR5Q5s5+t6?B+z5AD(C6ZHzPlRXZG?JTNaK`HLFYrjucj4eK5q;Xl6Y>op>2XANN3LUS& zX78YhFw|EBzgjaZyaF9(`r;g87F1tzb*Y3z`BmHg$T8?x*VcQl3|dW7Rv#a}gvKOE ziTTy#1QWy4O9egvb-nPc1T=KBd7XgGw@+4R$*VjdAPh1s&oR5Vxq z;UrNm?gJaxEMfD40+fsbQK-L`EWziIxh67VV*a7!TeiOr zhzI`bD@%t$-Gd35T*_+7Hvu@QVjkamK583%Spu5hw{f`zsigf8V;=MEe|z;^M&I3C zCO=%DrZcWL=ezeM5Z=Hc%ba8g-ET@$*&gitgtr2sxu-|oG*7-QGWd~@&}drb0p`Wp zCHj(jGlqcUXGGxymOTv24M3WG_r-fsT55k8OG$??e}H0mYxEN4M215-InmLSa||wL z3JOU{y|bC z?!KBR2P_WO8>#69U(ZLrC2@O}JLIBaHSeD=IyhfB+uInZAEa#X*`Hm>Ri0F@PHFjc^7BVUQ@}$pxTiVBZ~vH#hExKjy(c0zk7f&P|GyLzJb1QKp0)-*g*)t$kwOt3pA;$?HVvl|Quhedn_HvBj>7>+|D_ft_n# zv8mZEhQ=$k-HXO6`|G_pO1^V*ZxR9&aOzxYZ%eiJqM$(=Q0N|}Mn-V=iN_LVW%Wwf<1C^)TY7nGZq@jQHfne#Lj?9G9=0c0TLQkoknX{y zx&N3Oz$-d#)%&Mq^FtFL6&Z^hxrF<)KyN*kGDgyH*lw0#0hT9^J<{kDkua zccKbCP`RrZRr6T1ic0zAnhHGg+3xbUx9YPTWl89>ba8R`H!_n}FKjL%RLD>2ce$Vu z+BwpemFthGJNR+RQ?}vqrN5FHFnt@^vH0J7$-@($aV>3h`NigvB%F-o`gp@m;-&N2 zc-}A&3%* zDlsseGvbC4Nge+QkA#M5%(`i3n1j^(inT}Q}RcB(Y+?)t5R;c!owGkNt5oO6J5b6 zU6}O|p`m};+xL!+sQS}6k|baLfe*3SDO~P2!hZa$38P+lWVj!wK%!InIYA*)R8(Yi z6t+wFj@&#vg~|riN!qF!4h`S(vxDj6yshAr6I#agCBf)UrP{WJ0aH5#G+iWI6dfcp zj>ihnLP1iNmPYjwgkcZ(gwS-}w8C83#(rCxqFy z)`j*~S9aI0Kh5Aq?vvs#i+h=_jsp8Er6Ophx428)ol$SXikwI~@o$(sds@Bzbh<`z zmpQRC_LJ~CVJ%)44MBqMJWeQXz^%<5aKuSUu&CZ8ac<-KaEBDJES~hG&uvp!(}r){ zM4J*3(DKu?0^t4c#gSa30klk3Rvm=}?ldCvi>m@oK@(5;NBX9zvt%M5s1OSX2{{Pj z=$DMya3(9E-N;yyyND~b3T-s#F|dg z2(QuPx4Vrggxo;kSlDbAEyhV$Ww*@L2Rk0M>(+~1PfEv0+Na5}631pz21^yon60iF z-|M>5n=xSUUi&k9qZESnUHi%&B~`Tu+lUP(g_1dZJg~qvSJ3koMp#YTAR*vfq}au; z=*RV$Iz`@@ZH;@KBE-CT3|*v(+U60yOsy7PxNdm7tlC#QRl$K|chLfC$QEu?PRrU)2dl(I4v{aD6OW)PDko((bTuEm*F?uh%U3o#}FDd0*L z4+U|)tjm9b9NSVWEVN&2k=C?N!o4U$`I-8mw?kf5b#bT%*nNfskTnoqa?DC&XazTd zNCv>fo7D*6W;skiPCRIhi&lxgL#w0P_rF|#htD^ad96y5PotuI{M@BcQ6%4kLoB^? zEMuR--QTm?w5lw}Mb&aU4ZB#;6D#B|v0AqyXvlC8Otu4a`%{7~$*U`$<~!l*hSgg= zs2W7jMA}&_1@(fI)Gbzj7-dH-v7;gXx`!T-{?tiLo@?fH)xoS9;%my|VAN_6YPr}g z^2nAKZ|1a&6!1_a#r%ve6r8EebqQfR2d618f|4h|72OELCl5Yb1Fa&Ry&eDSlkT9_3 z0jW$uI9)qQtOc6~|aXuDURyw3uIng%(W=8MHli%Py@fG%%<=fOx^iHN|B|wGFBd1YZ_6rTnElrTqhRQ> zEEvASISOFpwtAz*fnN(+oVPrTSmqv_n-DV;aj>t9n+GKCi^>sCL}}L0%L&~HrbI{g zRvJ~oc=Mu6>cVH_@_+_PzPAFTSj(jvl^>7;?#oKhywcDP_hh>(%YPVqg#^&Pit3!b zni{@W4Y-8s{|j$+c`3kTjMzPLFsh+t736!H$=L5lgpY!V?s0c;`8E>dixWUU#Z2v1ts1N*fC(I^_O~&+;_Cp~sB`pcPK9 z7zl0zbkzWKIth*NguLxgt}YSSqcnWlAWkRoeXmW_wTqP@uFp`j&eHyqR#sUOtDEcR zRs1)!kN!>!z3i)#HM{>4%~}&Hr)TiH{+=Vw$4z1NX*jUZN#R7NEPA9k{)2jDNf$P)LMOP&;0-s%*7mZk9==%iyl>fBeA zp5;^09Fp%*ZU3ML`ABx{>N zql-a0_tNZ3lR1+lTYDZ53Zhi4X$TyJH)ApXPe%UXW^2)7`)$V-Y{ec^5TQ92Ixs&n z4r+=?^xF9bGl%^%xS|_}2Hb%o9+%*NB#D7l`w5Ptl zz9H}=Eo;pWt2bf1YkK6lZothToyu5qs3+OC7XH$!f{cZ@q8+Q3hN#1FHimwvMC&BW zlS?udMbb&9X!U(la#`H=9o!|y5QPnFtQ?w)gU^a8eU^oRlwq(1=ZAib_&Z*R>f^s| z#scRKPiPetZxZo4On=TKKZiml;~?Y^ZeBVUt0$J4j|W~4w7|H;piWo%JqzM%l9I0i zs99L}QrHPCCk7d^_FCzZXrbcAxW$rVEI#w2HCQo?a%*AEkH8%sU(96{!`F-US+%v_ zt~BCm$*FMnk~W#Kmz{%DWE%Ij*;TM!MUZx;V%{Xa&7Z|E)2*A*|EyTMvge&+Xl>ca zE@bq~@yPULyjJPM=PX`5`t~TCEv5%Inb5YEqNoQS#bw>_uPN7F^`|nf8Ar1hx7A|6 zun6Z@&I}itb6iA16l%cV<^D=f|I2A@i*##+KG5Bj8*3HrC9=MOM!$0n*+duN4Y@mNm2<$xy+nz#B&2V#y7wn6HHdwybU zrZI8%qhB_%b&+;DAPb7~6cqlL*mi3;9)-XBE^A}9HMn`Q4|qHe{tJB2E>G9GGT$tQ z-P;LuByJP652Nqc-R7f@NjV40Zb}ri0e&c*zI*JM-bCZk#0euP=aQz?ho0de=sqjB zBg@F<WPZ$2C+;GEwvi>d;d`TR&VzpBCX8ESr2g`_l-^e75Oj5d?jeMWq#XVb@>(s_{jOCh?r2M^JaJnNH9nsd! z&wf7tQ#Aw`@pU^JG&F_j8kJ(QVt*7sYHQ>(8r{KAb?L-gn)m9xcGdm=Ta>`oxG7qb z8ow@$hGh>_RSS8Z3ZRP;9W1MJ+UsHq=r>Tf|0ZP!I=vkOhzp*PNlzepq%jQ=LZTOs zWoxJ9n z23MoCD&cT`EIEy&5)tAZR0Ijr1VZAEg=i{|Ro?wu2+JW-q;$zwmn&_Czh$d8uRZ>% z&?s(u$&Z=$u5}?)4YSD7htNNQY_@lwgy;&KId63sK|M4}$pQ1IW`K?m#sFg?s-7ZN zIldXG8;U@cf)~PDrF0?Y(eeeZdTi9=KltW!m1NO;z5k);Q4_m;AWzlTU(BLF3W6FuSvB4vw zd~2uO?_Pt{y);zBzHZmF__{OB2p4+eN!4uoz3#?TEB(u@Y?8Rk?K^R`VFHNW(M)kK zt-h2lTT4M6E07ybd=KsFhQ80-7ZKStg*B#F105NDA>~u2K|8AtOL=%xSW66D4j=|Sh)@ZWm z_g{Wr@euWTR62xmj*rWjjZ3|+_Pr4c3s!vp7($?zUA$p!q5ZN zqPCfs|cJs;hpngO(SKA*Q0MiTXHeE6x5J?GkDDQBP-e^Yy$U($I~X%#Mb% zZfVN*(mwAIpeuyl)V3Yd9UC^sIlD zNV&47^M=2_5-t^4 z>*t?yjZ56WewtqC;KNP<$}5SK3WoVq~<( zvCu=d4b zMp(;M6G`OOgJDU=UqHK<`1(+=)Vv-@)_UgU2t1SOD+f4+?pm-u9j#kvI~pfqq+vGo z)SRxd=_E4Q>XS;U7L8`FAwU&;sxp~(XJuTCt1*43|5Kn5bVr#2oefp|`}Hw!_IFo1 z>t3^;W5!6ax4AoC-w$)&EWY=nekPOU=@#F<0s1KY`qywMiCP1fSMO|pc=u#n3NG6k z24X66-ZjE?U8Kr8fkOA-jEtwJCos1#mF~*;5_9ztqYmgjeWT050x>AJ8urVBQ z3QL{JpzH=2c#ah8;kJf?m9M~l-O?Jhahq`KkzelZ+2whcu6ee&qQ3e+CI|%!rUv&P z7>6<-GS%CK#6aHtu|c5E7tWy%@;DQ+XOh=%g_%B}6Gk^$$0YYwe3GroXu%Tr4?h^< za`{&=4w>Pc1Abl8911S#qHVpJ)>IY|LUJh7G=EE^bM7}K0{fCJhtseJLacRXC-8g2 zAtiF2SKp$93=*~;y3Gm-H&U%!vV7e3g|94XYH zhG3l^;O58ce3JDKu79cIM2|Yv-M)t6UMP#67c0Es<{}%Tu*^B$$Yu$=Y(*#b^tk~>^ySVz=q06_r zXBJkx0kBUw_-IJX2$!4`PI@Q?`mDVqRVFGRH;~Ppo$`?sO)5g>D7mEMWD<*K6vR?e z)>ynG2@yGbq?m=$Ho#C?GRvBerc}We^kprhnu!)&!4F zR#MaagfOI-$u*s->OBX70t^P?`8GElJi0G3Fx(~`AI#st_kF&)VMf=HW?3Yf_Q>5W@DfsFp`v$qD>YOSjS#c*S?%lwD!Odvd}UxO5lneY#i@UY?;EV5=q_ z)SyIq;`M6Zz`$Ujv}erVh=aj(3<|zkcUd&jb556@GK8T5nfX4HSYFW~qeo;ToshmR z?yVG_W-Sv<|LZoEiYF1 zF$j|Y27p~Y#9`NJ+0GXV19DrDppXzi72rp7&>O%XuqczIMg$1N&k>+tDdOlTfWDuh z%5mz{DP#tcCzM1hK>URyKr-Od#MoHBN!qj2)SVq2*REerPENMec%#aZK+w1NmpS-q zx;gdMyq6(c?IH~g2;WCqOF``H=SP^W7L1R&sR7YG+cGx`IQ{=}56)f$U@~rJs=mKo ziG?b?8mF*h2Qpm96j%mS_j5tQGm@|Acuf-%wacO(Cz=08;r+A|hJh-&vo%#H{;MVT zWr>4eilF(aNuTnUu0m7R+a5jdyh5!NfJ=8r1^Ez|l8J8R*Y@BBVGh^nk;CHDxJnjl zgYuo{EuR_!ymkubUTL5C3xzLyRy@SJ(yq819K&8S@J(AplB*+MlxWrI%+H4M4W)$i zK5Qr!eYVmdPt;3CNch7T4hp9nIrj1QjK61Z&^VB$V-8iM*cXE@b7~7fMY(cj4J}pG z%^uP3Ok|;`{tktBQ=ll!%z)eh-}Ql{GcHk|yShAQo|BmMq(B*fs0a9o2u6u}TrUn1dBmrN1AsrCDpcJAyz_a7^m2&p!cc$cJ zf&Sey9y4GTfbV0T?p3jDgfoLz%hRuNz)4ji2rKn@vF}VnQGFBlbfJxdEDaJVa7vit zB_`#Rw6tgNle&P5=ii)Z=*jvQK@~Qf578_o24NfL>J>RoD>WL!DnfIiSk=6A5x<#G zSQ2SEj*;OHY_}FNP@5K~)=w-NaelfjJBFz}V8|%6{l6%0;ECnZIXTwLr(kk%@!KHd zbnN2~DI`xpAFSIL5EytxetZ}20F+b~*-T)VcN)2T!^SX23~BFO1hjcC`;D|J3Rw+^}(oi+|%zPDDt^ zc&#hnaX{Tx2LuJFa~3JEg95uK91}}2g+Vb{V6b1(!n@{oyK8=3e8Z<+@hTrlo%V!j zba!vh#Lnc!fLI^B98fM2dHUacb$*d%<)stgvn7^B0Nr-Z4dXdz z>CC?=A!aM@d=D$W#fp&F{lhSP}~>duTmfGtrOr(MoRQ5!`+WyR|s*~ z`FejzE3}Ql<7GAEp-5|R9UA~^N}k4Po)lrlcz~x& z+5w#d9|A?LmiYMdh$?5?4K_pj*DI9j7E$r>!^zFASTEPc3ollMnsZrexQ;hI{gLV8 zgp7KwZO?qItfD?iS5HG&kX*J}*30{I71rx_V90WJ{{?Lwl>5*(&(F<)*>2(hJ3G6s zjpJ6<`rzl&AOX$&N2ZsJYHty`r5oSp%xVOT{|F?TCuet*@j4e%RiYxpqtLa|yf6xm5V;9smO{+Kvbrf1*G} zA&8RGEJKm0=AB_PzO#m&-evx-MvHp83$XAUcA^!`y*mq^Cth_jO*QB^59TN9`xNkP ztsktcb$e%y4WKjF%lVh6P@NM3;4CDb1H!Sexe0UoeK9bkmQFjPBKCvuft3AtIhima zE~7-40Sq{Q&Jbj)$zytfIDx(yG<(d9g5~CvQAtT1HulVz&M&|D7lh6O6A|JCeRKkg zHZKOI6wWk@^>=tNe^JcoSQN~uAF#(*kNkvE`C6`VB>XeQx-Th6gRi2i_|?bZT1+Jwo4R>8ZwClXr7)YO21XV(C`6Sl^QS z^u|W9?ZkWCq8}mU4nvw6Ltoh*KBiX}tV0Qii}T3tiK!SIuim;R*uT5KZ*ON8uaNEV zsDoe5V8d<5AfR|SG;94+-`Vtl;c1+6hOH8u5Q1pg?#@nqFrG6;L< zZ9QJ*bX5HVLp3LH^4q?aTv+(R$&Wy)xk_x=Ixk`BVu=Knl-VlcWNbsyN6_lT)*{v3 z(o%kHzlH=skY_TiGfNA^i=%sF@aQN@u1Wc``3gmAQ0g=kQj^MxMG4CrReO6ry=**q zHCrJb{F@0a*95PYyKt5tZun7y(IzA9O!sT06Rk>Z;-dI}$tPujSViKVf zL1d#tYMDH->9|$|GZ7>310EUxzLX|Znwij}5DrYFucVHc4x*COG{CV1B#P~(NR-1eAZ@W)}zx^pvrc2t(5kK)H1f=M>?9u+_-}al>2xIcSckq z!G!vG>fD`b=cMnSQy$>%44LXz<;BoQ|M2oQH#dL$SZzR1`u?>5OC#oQNe21*6a9KH zAeec=xmMB8!0QLA@U1riMhQ7rYxD8}tfSwHT?bPkBgJ{ldt1F59gZz|F+e~MwXkSt z2sK6teHO`#`@X(jUCc!?=pueVbh_1|uuh%R|4L_`@k3mLz!oi%X^*(HIkrSr*4Oj2 zrrS;!F(&$$(ow`X(q2T5#PM9y>9C;v)C{fp`XlG295OdpR^14<;f_;i@0`B*ZDWE# zv!S$<$~HDGFeV_bGk9SQpuKl*!It768CS|IJSt6LCgowocN2Y#3to9(<1Jek{&mXA z&xdQw5v8Hg8lOW}rOH9dOxGrSZ>*iVG=(=Q?M#W-@PnmYYVA@uN;%&fDSo0LKxkNp zxGcCLzQn`U8#yz0Ae1{A8fG*$N({63k-k9LwJOiewgyTD0ao@wgHij**0M?`PqKZ9ke z1Co0SkKyPfNzo(5qRDV-eIoxlp4|Y9%BXzT>jZwPI($-~S@6sAwtiocI%nE)aDcJV z9V-3m$87oyQ=_8^si`!QlfXu~%fm|Ryku8Tj|}Fy7dAa9NyKU_ZCPlFh5Jo%Vj>KR zU%tUlul`iH+*<=-Tv_D3Cv$UlR@WG^dOtogg6Ul@EB~FDjUaf*@^|m3j}>~#+CJR6 zW{4g!?fvn?k@+r=;Hg>zF6e=BeO^qr+4ip^P?-5L@l(u0U~D^i8FwfDOD575N4VB_ zF_1c~VzAfO7g@Y2Njj!HQ0~i{S<0YKXU5%t3f7dCP{p3h+*UR=N>BF0N_2}Z1bS(VDAS@c8Xm#X6u=ba`tq7A3=l2U#(9E0t1Uu{-W$ zXV(KKBWOAX1)$0SE7q>=ZlPl#XeToyYI_a!=fB7-KCag0772IyDN_9X5c&!k!Mowgol@9JWJQA@uO$&E!;jtRR wO%^#B?$I|%kY7Vb8|eczAIbawKGk`GG%bq=R`Y2~!@CiA>3esJB@JKv2dfVY?EnA( literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/images/deployment-single-instance.png b/docs/zh-Hans/images/deployment-single-instance.png new file mode 100644 index 0000000000000000000000000000000000000000..8c3f8719b2432dcffb0d3eed2c5005a69ac24027 GIT binary patch literal 30663 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 literal 0 HcmV?d00001 From 533d9860650512489b55569771b6ed5f4a6c0819 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Wed, 4 May 2022 19:54:03 +0800 Subject: [PATCH 4/6] Create Distributed-Locking.md --- docs/zh-Hans/Distributed-Locking.md | 110 ++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 docs/zh-Hans/Distributed-Locking.md diff --git a/docs/zh-Hans/Distributed-Locking.md b/docs/zh-Hans/Distributed-Locking.md new file mode 100644 index 0000000000..2176230403 --- /dev/null +++ b/docs/zh-Hans/Distributed-Locking.md @@ -0,0 +1,110 @@ +# 分布式锁 +分布式锁是一种管理多个应用程序访问同一资源的技术. 主要目的是同一时间只允许多个应用程序中的一个访问资源. 否则, 从不同的应用程序访问同一对象可能会破坏资源. + +> ABP当前的分布式锁实现基于[DistributedLock](https://github.com/madelson/DistributedLock)库. + +## 安装 + +你可以打开一个命令行终端并输入以下命令来安装[Volo.Abp.DistributedLocking](https://www.nuget.org/packages/Volo.Abp.DistributedLocking)到你的项目中: + +````bash +abp add-package Volo.Abp.DistributedLocking +```` + +这个库提供了使用分布式锁系统所需的API, 但是, 在使用它之前, 你应该配置一个提供程序. + +### 配置一个提供程序 + +[DistributedLock](https://github.com/madelson/DistributedLock)库对[Redis](https://github.com/madelson/DistributedLock/blob/master/docs/DistributedLock.Redis.md)和[ZooKeeper](https://github.com/madelson/DistributedLock/blob/master/docs/DistributedLock.ZooKeeper.md)提供[多种实现](https://github.com/madelson/DistributedLock#implementations). + +例如, 如果你想使用[Redis provider](https://github.com/madelson/DistributedLock/blob/master/docs/DistributedLock.Redis.md), 你应该将[DistributedLock.Redis](https://www.nuget.org/packages/DistributedLock.Redis) NuGet包添加到项目中, 然后将以下代码添加到ABP[模块](Module-Development-Basics.md)类的`ConfigureServices`方法中: + +````csharp +using Medallion.Threading; +using Medallion.Threading.Redis; + +namespace AbpDemo +{ + [DependsOn( + typeof(AbpDistributedLockingModule) + //If you have the other dependencies, you should do here + )] + public class MyModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + + context.Services.AddSingleton(sp => + { + var connection = ConnectionMultiplexer + .Connect(configuration["Redis:Configuration"]); + return new + RedisDistributedSynchronizationProvider(connection.GetDatabase()); + }); + } + } +} +```` + +此代码从[配置](Configuration.md)获取Redis连接字符串, 因此你可以将以下行添加到`appsettings.json`文件: + +````json +"Redis": { + "Configuration": "127.0.0.1" +} +```` + +## 使用 + +有两种方法可以使用分布式锁API: ABP的`IAbpDistributedLock`抽象和[DistributedLock](https://github.com/madelson/DistributedLock)库的API. + +### 使用IAbpDistributedLock服务 + +`IAbpDistributedLock`是ABP框架提供的一个用于简单使用分布式锁的服务. + +**实例: 使用`IAbpDistributedLock.TryAcquireAsync`方法** + +````csharp +using Volo.Abp.DistributedLocking; + +namespace AbpDemo +{ + public class MyService : ITransientDependency + { + private readonly IAbpDistributedLock _distributedLock; + public MyService(IAbpDistributedLock distributedLock) + { + _distributedLock = distributedLock; + } + + public async Task MyMethodAsync() + { + await using (var handle = + await _distributedLock.TryAcquireAsync("MyLockName")) + { + if (handle != null) + { + // your code that access the shared resource + } + } + } + } +} +```` + +`TryAcquireAsync`可能无法获取锁. 如果无法获取锁, 则返回`null`. 在这种情况下, 你不应该访问资源. 如果句柄不为`null`, 则表示你已获得锁, 并且可以安全地访问资源. + +`TryAcquireAsync`方法拥有以下参数: + +* `name` (`string`, 必须): 锁的唯一名称. 不同的锁命名用于访问不同的资源. +* `timeout` (`TimeSpan`): 等待获取锁的超时值. 默认值为`TimeSpan.Zero`, 这意味着如果锁已经被另一个应用程序拥有, 它不会等待. +* `cancellationToken`: 取消令牌可在触发后取消操作. + +### 使用DistributedLock库的API + +ABP的`IAbpDistributedLock`服务非常有限, 主要用于ABP框架的内部使用. 对于你自己的应用程序, 可以使用DistributedLock库自己的API. 参见[文档](https://github.com/madelson/DistributedLock)详细信息. + +## Volo.Abp.DistributedLocking.Abstractions库 + +如果你正在构建一个可重用的库或应用程序模块, 那么对于作为单个实例运行的简单应用程序, 你可能不希望为模块带来额外的依赖关系. 在这种情况下, 你的库可以依赖于[Volo.Abp.DistributedLocking.Abstractions](https://nuget.org/packages/Volo.Abp.DistributedLocking.Abstractions)库, 它定义了`IAbpDistributedLock`服务, 并将其在进程内实现(实际上不是分布式的). 通过这种方式, 你的库可以在作为单个实例运行的应用程序中正常运行(没有分布式锁提供程序依赖项). 如果应用程序部署到[集群环境](Deployment/Clustered-Environment.md), 那么应用程序开发人员应该安装一个真正的分布式提供程序, 如*安装*部分所述. From 6ce7fc871a28c4e3a19f3ad66ad2294974988153 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Wed, 4 May 2022 19:59:56 +0800 Subject: [PATCH 5/6] Update spelling mistake --- docs/en/Deployment/Clustered-Environment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Deployment/Clustered-Environment.md b/docs/en/Deployment/Clustered-Environment.md index ac7b425377..cb8f3dfda7 100644 --- a/docs/en/Deployment/Clustered-Environment.md +++ b/docs/en/Deployment/Clustered-Environment.md @@ -63,7 +63,7 @@ The [Database BLOB provider](../Blob-Storing-Database) is the easiest way since > [ABP Commercial](https://commercial.abp.io/) startup solution templates come with the database BLOB provider as pre-installed, and stores BLOBs in the application's database. -Check the [BLOB Storing](../Blob-Storing.md) document to see all available BLOG storage providers. +Check the [BLOB Storing](../Blob-Storing.md) document to see all available BLOB storage providers. ## Configuring Background Jobs From f7cbe7a4e9748c719a499712c4d62f7bf41667b7 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 5 May 2022 08:56:00 +0800 Subject: [PATCH 6/6] Update Clustered-Environment.md --- docs/zh-Hans/Deployment/Clustered-Environment.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh-Hans/Deployment/Clustered-Environment.md b/docs/zh-Hans/Deployment/Clustered-Environment.md index d98ef86c28..34547709d1 100644 --- a/docs/zh-Hans/Deployment/Clustered-Environment.md +++ b/docs/zh-Hans/Deployment/Clustered-Environment.md @@ -2,9 +2,9 @@ 本文档介绍了在将应用程序部署到**多个应用程序实例同时运行**的集群环境中时应注意的内容, 并解释了如何在基于ABP的应用程序中处理这些内容. -> 无论你使用的是整体式应用程序还是微服务解决方案, 本文档均有效. 适用于一个流程. 应用程序可以是整体式web应用程序、微服务解决方案中的服务、控制台应用程序或其他类型的可执行过程. +> 无论你使用的是单体式应用程序还是微服务解决方案, 本文档均有效. 适用于一个流程. 应用程序可以是单体式web应用程序、微服务解决方案中的服务、控制台应用程序或其他类型的可执行进程. > -> 例如, 要将应用程序部署到Kubernetes并进行配置, 以便应用程序或服务在多个POD中运行, 那时应用程序或服务将在集群环境中运行. +> 例如, 如果你将应用程序部署到Kubernetes并把应用程序或服务在多个POD中运行, 那么应用程序或服务将在集群环境中运行. ## 了解集群环境