From 3d256d78c6ce0057bf75238cef3b74a8a6c36b97 Mon Sep 17 00:00:00 2001 From: z00919396 Date: Wed, 19 Mar 2025 15:17:40 +0800 Subject: [PATCH] add mindspore-deepseek install script --- README.md | 189 +++++-- doc/README.md | 3 + doc/deepseek/asserts/software_stack.png | Bin 0 -> 223796 bytes script/mindspore-deepseek/README.md | 27 + script/mindspore-deepseek/config.yaml | 40 ++ script/mindspore-deepseek/main.yaml | 9 + .../mindspore-deepseek/workspace/install.yml | 24 + .../roles/prepare/files/lib/ascend_prepare.sh | 43 ++ .../roles/prepare/files/lib/example_config | 19 + .../roles/prepare/files/lib/net_check.sh | 69 +++ .../files/lib/npu_net_config_simple.sh | 25 + .../roles/prepare/files/lib/ray_start.sh | 32 ++ .../roles/prepare/files/lib/set_env.sh | 57 +++ .../roles/prepare/files/lib/start_docker.sh | 67 +++ .../roles/prepare/files/lib/start_ds.sh | 53 ++ .../workspace/roles/prepare/files/prepare.sh | 65 +++ .../workspace/roles/prepare/tasks/main.yml | 34 ++ .../roles/prepare/templates/config.cfg.j2 | 19 + .../roles/start/deepseek/tasks/main.yml | 2 + .../roles/start/ray-master/tasks/main.yml | 2 + .../roles/start/ray-worker/tasks/main.yml | 2 + tool/benchmark/README.md | 91 ++++ tool/benchmark/benchmark_parallel.py | 443 +++++++++++++++++ tool/benchmark/benchmark_utils.py | 466 ++++++++++++++++++ 24 files changed, 1744 insertions(+), 37 deletions(-) create mode 100644 doc/README.md create mode 100755 doc/deepseek/asserts/software_stack.png create mode 100644 script/mindspore-deepseek/README.md create mode 100644 script/mindspore-deepseek/config.yaml create mode 100644 script/mindspore-deepseek/main.yaml create mode 100644 script/mindspore-deepseek/workspace/install.yml create mode 100644 script/mindspore-deepseek/workspace/roles/prepare/files/lib/ascend_prepare.sh create mode 100644 script/mindspore-deepseek/workspace/roles/prepare/files/lib/example_config create mode 100644 script/mindspore-deepseek/workspace/roles/prepare/files/lib/net_check.sh create mode 100644 script/mindspore-deepseek/workspace/roles/prepare/files/lib/npu_net_config_simple.sh create mode 100644 script/mindspore-deepseek/workspace/roles/prepare/files/lib/ray_start.sh create mode 100644 script/mindspore-deepseek/workspace/roles/prepare/files/lib/set_env.sh create mode 100644 script/mindspore-deepseek/workspace/roles/prepare/files/lib/start_docker.sh create mode 100644 script/mindspore-deepseek/workspace/roles/prepare/files/lib/start_ds.sh create mode 100644 script/mindspore-deepseek/workspace/roles/prepare/files/prepare.sh create mode 100644 script/mindspore-deepseek/workspace/roles/prepare/tasks/main.yml create mode 100644 script/mindspore-deepseek/workspace/roles/prepare/templates/config.cfg.j2 create mode 100644 script/mindspore-deepseek/workspace/roles/start/deepseek/tasks/main.yml create mode 100644 script/mindspore-deepseek/workspace/roles/start/ray-master/tasks/main.yml create mode 100644 script/mindspore-deepseek/workspace/roles/start/ray-worker/tasks/main.yml create mode 100644 tool/benchmark/README.md create mode 100644 tool/benchmark/benchmark_parallel.py create mode 100644 tool/benchmark/benchmark_utils.py diff --git a/README.md b/README.md index b980d04..a086c93 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,152 @@ -# llm_solution - -#### 介绍 -A solution for large model inference, such as DeepSeek, built with full-stack open-source components. - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +# llm_solution + +2025年,以DeepSeek-R1为代表的AI大模型正以惊人的速度重塑产业格局。短短7天用户破亿、多模态交互与低算力需求突破硬件限制,这些成就印证了AI技术走向规模落地的临界点已至。然而,将AI融入到具体产业,还面临着一些问题: + +**从产业上看:** + +1、**算力与模型的割裂**:厂商需为不同硬件重复适配模型,开发成本陡增; + +2、**生态孤岛化**:各厂商自建技术栈,导致跨平台协作效率低下; + +3、**长尾需求难满足**:中小开发者受限于算力与框架兼容性,难以复用头部模型能力。 + +**从技术上看:** + +1、**混合专家(MoE)架构的适配性挑战**:专家模型与硬件内存存在匹配困境,同时专家负载不均与通信开销过高; + +2、**多模型协同与训推一体的系统挑战**:多模型动态交互、训推状态切换、资源动态分配引发协同困难,训推一体化软件栈的易用性不足; + +3、**长序列推理与稀疏计算的性能挑战**:长序列KVCache存在容量瓶颈;稀疏计算引发的向量化效率下降。 + +DeepSeek引发的挑战本质上是AI规模化落地的必经之痛。解决这些难题需硬件厂商、框架开发者与行业用户深度协同,通过**全栈开放生态共建**与**分层协同性能提升**,实现从单点突破到系统级效能跃迁。 + +为了解决以上问题,**openEuler开源社区与MindSpore社区**,推出面向大模型的全栈开源方案,以**操作系统+AI框架+模型生态**的三层开放架构,替换**操作系统**和**DL框架**,秉承**代码开源+标准开放+生态共建**的理念,打造智能时代的全国产化的数字基座。 + +## 软件架构 +### 全栈开放生态共建 + +![](/doc/deepseek/asserts/software_stack.png) + + +openEuler+MindSpore社区协同提出开源推理方案,以全栈开放架构直击痛点: + +**1. 对上:兼容多元大模型生态,普惠AI** + +a、支持DeepSeek、LLaMA系列等主流模型接入,通过归一化的开源推理软件栈,保证不同模型对资源的动态调配,在生态上做到统一演进,且开箱即优,避免"重复造轮子"; + +b、集成模型微调与蒸馏能力,优化增强RAG流程搭建,结合DeepSeek群体策略优化经验,降低长尾场景定制门槛。 + +**2. 对下:异构算力无缝接入,AI基座** + +a、通过硬件抽象层兼容GPU、NPU及国产芯片,释放DeepSeek低能耗技术红利; + +b、在极致资源约束下,资源动态调度诉求强烈,通过全栈协同优化降低模型资源消耗获得竞争优势。 + + + +### 分层协同性能提升 + +通过openEuler、MindSpore与vLLM/RAY间的分层协同,为DeepSeek-R1大模型带来了吞吐性能与易用性的显著提升。核心技术点如下: + +#### openEuler: + +##### 异构融合调度:负载感知MoE冷热专家,任务细粒度调度提升推理性能 + +1. 负载感知的冷热MoE专家动态识别和并行调度,稀疏MoE计算分层细粒度拆分到不同进程部署在多样算力; + +2. 共享资源细粒度按需控制,支持MoE专家均衡调度,计算/通信细粒度并发; + +3. 针对高并发场景下推理服务、分布式计算组件Host侧资源争用的痛点,利用NUMA感知的细粒度算力与内存资源隔离,提升推理整体性能。 + +##### 异构融合内存:高效管理异构内存,减小系统内存碎片,提升系统推理性能 + +1. 针对推理服务高并发场景,通过线程特性感知的细粒度内存分配、高性能代码段大页机制,在控制内存开销的同时,提升Host侧性能与整体推理吞吐; + +2. 针对MoE架构的稀疏访存特征,通过Host/Device协同内存管理实现多粒度动态混合页与按需内存分配,减少页表访存开销同时提升显存利用效率; + +3. 针对大模型推理服务面临的显存容量挑战,基于MoE架构的稀疏计算特征,利用运行时-OS协同设计实现高效专家超分部署,提升显存利用率与整体推理吞吐。 + +##### 异构融合编译:毕昇编译优化,减少算子下发耗时,提升算子性能 + +1. **架构亲和编译优化**:通过架构亲和的原子指令优化和Malloc、Memcpy高性能库优化,降低各类锁的代价,提高内存利用效率,降低访存开销,进而降低时延,提高吞吐率;算子编译阶段使能智能感知流水优化,基于数据依赖关系深度分析和自适应同步决策机制,自动插入最优同步指令实现高效的多级流水并行;通过昇腾算子抽象层与芯片ISA的智能映射,实现指令级并行优化,极大发挥芯片理论算力; + +2. **多维融合编译优化**:针对算子下发阶段前端性能瓶颈较高的特点,通过CFGO优化技术,借助运行时信息,编译器进行精准的代码布局优化,有效提高程序IPC,降低算子下发时延;多维融合加速能够自动实现向量类算子融合、矩阵-向量类算子融合,减少数据搬运开销,并通过细粒度并行进一步提升算子性能,快速满足用户验证模型算法和提升模型开箱性能。 + +#### MindSpore: + +##### 图编译:将模型编译为计算图,通过模式匹配自动将小算子融为大算子 + +1\.**图生成**:MindSpore通过JIT编译自动将模型的python类或者函数编译成一张完整的计算图,JIT编译提供了多种方式(ast/bytecode/trace)以满足不同场景的用途,覆盖了绝大部分Python语法。 + +2\.**自动融合**:基于计算图通过自动模式匹配实现算子融合,将小算子融合成大颗粒的算子。大算子既减少Host下发的开销,同时也大大缩短了Device的计算时延。在DeepSeek V3/R1模型中实现了QKV/FFN+Split融合、Transpose+BatchMatMul+Transpose融合、Swiglu融合以及Norm类融合,大幅度减少了算子数量。 + +3\.**动态shape支持**:计算图的执行需要支持动态shape以满足推理场景输入输出序列长度以及batch +size的动态变化,相比于静态shape的整图下沉,动态shape的计算图执行需要每个iteration在Host侧重新执执行shape推导以及申请显存等操作,为了避免Host成为瓶颈,MindSpore通过Shape推导和显存申请、算子Tiling数据计算以及算子下发三级流水优化,实现Host计算和Device计算的掩盖。 + +##### 模型压缩:金箍棒工具,快速实现模型量化算法及量化推理全流程 + +金箍棒是华为昇思 MindSpore团队与华为诺亚方舟实验室联合研发的模型压缩工具,依靠 MindSpore Rewrite +模块,为算法开发者屏蔽网络差异和硬件细节,提升算法接入与调优效率,同时提供了可视化、量化损失分析以及Summary等工具。 + +我们使用金箍棒通过不同量化方式,来尝试平衡DeepSeek-R1的精度和性能: + +**8bit权重量化**:对 DeepSeek-R1 进行8bit权重量化,使权重显存占用降为1/2,小batch_size场景推理性能提升明显,但大batch_size场景推理性能变差,分析发现是权重量化矩阵乘算子随着batch_size增大性能会下降。 + +**SmoothQuant 8bit量化**:为提升大batch_size场景的性能,用SmoothQuant 8bit +全量化,测试发现随batch_size增加,吞吐量线性度良好,但网络量化精度损失仍较大。 + +**混合量化**:为降量化精度损失,对精度较敏感的FeedForward层用激活动态量化,损失部分性能提升来提升量化精度,MLA层用Outlier-Suppression+异常值抑制算法替代SmoothQuant进一步提升精度。 + + + + +## 全栈解决方案部署教程 + +### DeepSeek V3&R1部署 + +参考[部署指南](https://gitee.com/openeuler/llm_solution/blob/master/doc/deepseek/DeepSeek-V3&R1%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97.md),使用一键式部署脚本,20min完成推理服务拉起 + +### EulerCopilot部署 + +参考[EulerCopilot用户指南](https://gitee.com/openeuler/euler-copilot-framework/blob/master/docs/user-guide/README.md),搭建本地知识库并协同DeepSeek大模型完成智能调优、智能运维等应用; + + + +## 性能 + +### 精度 + +本方案使用8bit权重量化、SmoothQuant +8bit量化和混合量化等技术,最终以CEval精度损失2分的代价,实现了DeepSeek-R1w8a8的大模型部署。 + +| 模型 | CEval精度 | +| ---------------------- | --------- | +| Claude-3.5-Sonnet-1022 | 76.7 | +| GPT-4o 0513 | 76 | +| DeepSeek V3 | 86.5 | +| GPT-4o 0513 | 76 | +| OpenAI o1-mini | 68.9 | +| DeepSeek R1 | 91.8 | +| Deepseek R1 w8a8 | 89.52 | + + + +### 吞吐 + +测试环境: + +1. 两台Atlas 800I A2(8\*64G)。 +2. Ascend HDK Driver 24.1.0版本,Firmware 7.5.0.3.22版本。 +3. openEuler 22.03 LTS版本(内核 5.10)。 + +| 并发数 | 吞吐(Token/s) | +| ------ | ------------- | +| 1 | 16.7 | +| 192 | 1188 | + + + +## 参与贡献 + +欢迎通过issue方式提出您宝贵的建议,共建开箱即优、性能领先的全栈开源国产化推理解决方案 +# llm_solution diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000..5240ded --- /dev/null +++ b/doc/README.md @@ -0,0 +1,3 @@ +### 介绍 + +本目录用于放置安装部署、代码调优、特性介绍等文档 \ No newline at end of file diff --git a/doc/deepseek/asserts/software_stack.png b/doc/deepseek/asserts/software_stack.png new file mode 100755 index 0000000000000000000000000000000000000000..2fa5e20b52b8911e4ffc045b5f954f0454adacfa GIT binary patch literal 223796 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%0A4M@IlY2g!v7u=~X$lJQ6~wLUwWP zw|p4IlGPAz(JMWkP6CZ0+R}+w<653m>N}+W>XsiaE=P&{V5)KDVTC|mK^+QE^cEdvAGEfIJpH#)DSHOEaN z3I=lNZs~yhGWJD+!9@!K6&gwt7kq=W5&OMvd4#8{fM|<6G)m&#yMvN10L4`8^J6R(0t#t zSApSr?sEC|WJzF)cv@zzvqK!ns@=-D0tI^}GySrNn<-de;hPW-F zs4hUp6y&upq4?+IPUf#yK!FLE;TSf^2&J-Z-`FZaM=+3Ns|_|jh>87(qCHc*jR^2; z9`IrX7oKy3CuP|h;@Od)?1+#8ETTYpb<=l3AO~Lrpk8ps-&%vVsOtEf9(NW9pb2fb zOu1@izu!o8-U~U7h>5o)pz@c3Eg@v1dUG6@&6q&6WmSO#iuN~w-^D~>;G+tMfEg>RzJMutBxS6E7+J**E~yWi)zqybHMC%j zOYx24O;r{Q9NW1F00SWJg+Lap2=QRmI0;(9V4vo1dMLN>@LNDR9ExwigMta~uSq!) z|7$__P{Mf%5C3&Vbs)iO%ECR>B-7aeY=fe>Y$enAiHea<$%+R<+p@Bb0P(5*PQe26Nh>HIsm{fQIo*NA z{%s`GBk>V;UB1ISyt%BEV3{v}oVMeF!?duOG*T=#63?mUezV-a>)Il3uC+NFz+@Ix zeQ>N{#8Pt1v$wZ0k}nx)g&t|JD-A!l1oTEX^sjsh{VAW)N6ch}>@FA=MYB$nHgT$8 z%>vnREZn^nYp)`EP7uYmQG!{`EL2wUqcU+lTb#6ksanY)O$LgX*K4NLs{P}go`Cp_ z7&4dX=uyhT_N&MHvx@ElNP|n!N0g{&rHsDaZ|7>2R+k-|Ua!?dsTe{IBB)1^Td9K+ zc?o8n@cyKS$)FbzrdTqmsJ9ms-F+tmxL^*%`c-`(p?m(6&?Vt9m2PiWrOG1V!^0=h zi(h@ukc54;?upffegP?4m9Po84A;O>M*Vn6^@Xv$NjkX}@$CGKh&Of`(rHTFm2dDB z){kBCksx`wf>a;BC>QlZbXv#He+zo?<%Ar&@IJI9L*BV69?Up2fs-hWiDS*Cwr*itPuncW+&qx}y9t~V z_1Wt2?1cn1O&rv5a@_(hAv-Ro5cooHU~QP1DYRP{xm;D4gdYB686$Q-;V96Xe+2?sHm z5xCZDKIAOu<@0yFch6&a-ghc7^NOKSBx};JjV5wZxy>rX^L}aj!GKHS<1Q+Gh-OYy zRZ8ncAleY&sXHth4DxXIl`9a*HP%c@)xblOmz_jk9ub>;alNC!J2;{2z430016~43 zi3?Ph41s(aNcjI&P+db9m~T0_c13H?Z?=IN{d_)5{Fim$sWtPrhExP~CI2EGg|q2o zwK(f<6}#c*FN!O9JA*^aHmmv+@iQb-1R|%C^ZLi<%d57TxOq2piceWIDrif2^b*YL zjABcRzgrcbo+s2doRYfA)$BTcm|auUkShSbn=k%R#VZgjaqw%ldj@IuRzqi&Uem<# zIkpMo>wG-GCw~+4e8>fymc9v;H%~mv(0DY-e6OEnSHk-=uIWo3sewm9fv~!|9I?od zB%5RQ&{QGme1%+~lPVU;dr!xvMXcD>U(e4;f3qile^>~)I9jYtdpvGgNE}Mjv5+h8 z8y9;G-LxPlFwIZc`Veor_k;I}Jnij_WRs;NO?a=C&JQ*FMDwEJZwl-)O8qa54nMKaq zLK4IP?ui9VV(XMWhgUpX8VD!wsECNVY2uPw30~=04?Xd^Ut>;zSH;+S*~pg;j81NT zm{@-q&V`~?*O9EBU%rN@Wmc56z8j&m(^+uN6<08j&&XRM&uS^XIf1Yi@Izn8BQu9z z!N8QROFv)H6yFlxgH8_|^yO203Pj~wS0AvYS5!`)6|9$6)69}FOf9pBac~ST zC9HOg%rQ-^vbZOojRzOKM8~zr?Dv;lFK(zxIF}kZ(7$hi`jqk<`4BTpGP{o{&?xW; zA$rr&Lo4H2@KVdGEVnB<%c=20LzR|{crS&RJa27NI>Vpr!@osqEYP^do*-PxY`Cy` zg|uW32Joc~mV7}0*A&=FuB3M|$*chP8`oq|;JddTHeUR$cMQM=5~q%@39-=~W^%k; za@1mrSZgepepFXS4^#)~AQ4$kMzcuG)9I%IGKb!&r`a?0)8ry< zBu>aXTOCm2Vw?2Rw6jO^^a2OcEHYBVCn>4U;u>P|&F#1&!$z;O-K;Adb|N)9{N!=; zfgS0Y2CkAEo`~a%qEK1anyAn$(_H|`N|@+&1*9>CX&rVN^-PIXSsi|`J|uV#Un5qFJUqZm`!&VUdis#1j$LCvzW-&$Bc_(xB3*6q3Iwr?E9W^ zTJqU?=}<>bHrYTYB;ifuBgI~>;?n`$u?de4t~zhrRBLjC`SJi+#FVlPjtO%?w}{8j zxFGdi=PVb^-9#M>Tp?f&8^zu!F_!9lk+CIq9uOj0BqQJy`Ua|u)pyUsO!!Ha)v*(( z;u>hw_2OevOIobuoAX*euFWQhjXi4UVlrw<%4af`wxvJxnC&D@ONhfbM3o=JdGVW_o?7(QbjYu)B?HmMH%f~>{vf(S z=EZ)!*Mm?Pp)VbMyF5F0AtY6unL8{-xszZrYO=rk68+U2ySw7!GUu~~ta!4K`PLSb zU&V_CUfxJH@h3)%S-dc)N(BBv#_@=~Yio3D}=c)P<>v%6?Rf3Mlg#W;y2pn>%ky!iR-8Am5leAm zlqy6(#;mIZ5|mFP1Wn0c%doQbgmhsGpeSjH5dTTnR=)f-R4a8d;e%@!=S2(~lxoiz%k5(8EX6)dn+yR&_xqs~?$sRO#;X4Fq^%wD(4(1Zx_f1P+m;q4?oyhy zH##3~Ow@Nj&%||vCV}3spdib-_Y?S@9u5>e7`G%3%gnrz2&7!*ye75hjOMkQ&Sq|X zguH{q1XQ~~KWJ1iHuog^TyMo4DG`%VEFbF}cuSGuoxH1jU|#=(rWy^0{izT3kmMtv zV>1fb-0q3_u#3q|aD7%U`jXK66EcdsGkx^^Y1~yK8o$pzmMF^$F;R50+AXI!^v(gt zyxRr2Ca{IO__u;sXy4?bSd(=LNcxX(8G9cA*W6&n>jEBGAOJfjPi8X>apJ#>jZi9r z7EA~a-UkT14#j?+wLxj>5ni7ev6Q7u$OQc`35eMHk1#g*8-anSmfT-Le2`5Grb@NY z(7t?CQs8qC7=@^@Fq5fKg|vp1JnM)kL+^xW9YL$_ZC7RnLdVOb;ggOTvOoK7FZWpE zPslk}M@8O#w;cR2AruZM+$@!KiuA4c!&S1+!rdPX_+dQ;ydV5c-pE+j*Vm3SEZBXC z*#o=^Vq;6HnmQ1(F4G42A|A;pWFXIbnhf$!uw`i7iW>9`NOg$O62>r$fwgKQ*jDb? zU|@C%HquJ2g!ny7dc^q2>E53(!n@C%d>DgA;M?T0Kf2q5;b zk3!$>AK$%t{5eDBFi(Q-{^@LX1!wcYzXhZ_7=Hy?u!XZu!H049KnL9 zS6(Yy>L*)1ZqplLzRLWMX|xwv020A5aVonxd^lJNty_FqDFVoF)tx1kJ0SIipIRv( zL*()92uHkbN46xAZDxTg>o_G?a-6M%G{bVv>l`&xoFC-n=om$ zu(wp}vzzi=!btO%{y11!w>7PS&dYO{!6AGKm7zI~SF7w_b^%+ykP=ulWGSQ90!>%b z2S<1azZ!)rn;P@ru8eyu8iFL5=L6%YJKbm_?pi<{5Gp+{!GMUuPY4*Q>)l(ey`-EI zHks@kFe9IJ$*E#-<5cT|&3i517D&%It}`vH_UnegH}k1$?gDRq@0*bpkxu^MfD;0? z4F~rFPZt82{TXn+uXuCY{dBw)E)xTCr#nM9nqv!S4eM~u`S2T~dKbptRCDFawQx?U zK&NMc{9VV>t==Y4uc5+e?$}1&TGzeZl~Ono>ECtiBOES|{hMoi&L%HeOX!tJN%8!` zI8;zKXMRPuUPsUZhFf-HR}mHp`?DJQk~*?`^;1pU50UPRgUiFZ9Nge@%-CZOVHL%m zP1I(cw~Z-r!TI{F5K~WZLP>?y;j7tZq;3$NbiEBh`-f!|bMdTYY{}=s)o;AbqsTpO z`;Ihpc8ggqOibi^4i8%Rsid@V;&-~uS+gDwOHdMk3`QfdhDza4T~Rw5gzYdRffpk$ zwa|$8O+QhR%> zke|N<5S{R3-5L7PPkiO{jJP*H znHEyZz57JOU!i<=lT2M*cH!1qwtu zs5!WB+^l!c5fwj-o1>52mq4*!r6-r5S$R|7HJWaTvf2An#3Pxn&wPKTy6786VULw( zy7>@Kp>MNiQPvBU0rQ*Ofmfn`X7X;(k_Oq;IPlV1#iZB9O3DO)+hH5Fq&<~ zQ#s$c1QM(_Qk$m;@z zha1(7bE&3T^g0{SXd%-PI4IRnYz~vBX)jOVQgi7`&MLyLGti16c{;E8O`X1ye2l6$ z-^y4|%Yrw@>n<}26fG8Pw}Y1s54Gg1yXyc}CY@~6oIC(D%C(?jHr~)gQ$r_{*qi3% zIR;Q}|33iiewnSp#|?)j`&e-iK+2j)I#oBHro??oA)P_{<8;FGGDN#{mqBT6WG_vZnJKaC>g2! z$KziqZyxyDt>{-gTw~t-5Yc1)ao+i1;U+=BI}m}At<60YwC2OV2Q0QKw4B;7`>6V; zdr`LU^yaJXI||q>+@T}S81PyJzA~=Ok%W;M<9l|i3-eS*Y!kqy>T*X zJN!6V&sT;>c#@gQkBHPYJ!^u~NvnJt)Cf9`UT zJ3aBwAZe$W@0&`d6q>3vH4J$L{CPhZtS56lFwjyYa_SlyJRKsO*;xKP7hoFM&DS8W zXS`>OIed(uMfBIqWQtVbDzIT&oabqesHyo&%b|ogWC1Bcg5CrP2gj`+N$dtqM@b@t z!AF;yZot8%&(an_@lT7zakqC0Rf)(h;8Oo%ZxWl%q%zoYS zZaDS-c=yhc8=HduE3B;so$A;L+fNFrJ}&`7qS%i2Mb>VrAWH=)(K}mopgdM; zaE&%QJR+%gJM<2bhI0pmuW|GolA?vkt=Fk)+u$Tgx~)+?a`m#Y{1^ujcsx#JrS;`o z75(YAO{-IUo}pZ*76aEqNbU>PiO*vjLY9(F&8oIovB8-M0@fIVmFYj{EGAODeie2L zNG}QAMgK8~n_kvXEa6Q^j?Q=t`5MZv;|~l(4w?BRQ-qO%BvMIYIw*#ERfM@p2pm`qusO{Z2jEAZ{f-S3J-#=N04V!fCiY((z z!6@S)B%OX{rL7qW}(v+*EdY`x1v8Bo9;U;5HCCSY+ z*+tgm_rMt75Zj1VITJUm6r2*-Q)F{vlkG^+;tp4S3VhoADig&Le|JgZlgT3-x8GL~ zm*QeN?uix9N7D$XBPmyuoXh4{N7C?0!nBTdAq?ljXSuOXkC#A|V#b9k=*zJn@#v1D z6Dikwncy#ylCNtmao$4SRX)dduLp!R#t5vNhJgK@6_G-(xR!pNVk5u43WJF`}&S(1V*zU@`v`gtENk>zO(OYDE3?H^Gv}C%FxC?kHl@&P^w?AO>}<^ztME=zLfPucdH^%m;8N zg~jo+c-I-`Ps_whnUDc0=eSJ&AGgz$sqdM^Esed=3Z3ib3b z76kt=^9n}2*G(nr_)`gQU2#-1s*ZhsZ7l*z=tl;9Q&NPgg}8qro4d-}k*i1u?R!(r z(yyIZyOCkG*mH-AlcDH9JmTA)JX+~h*u-g0H{I!U8SfZz=S47(T=j0Y18KaAJwxO| z&L^q`!WP=NC*&v`r(EzA+fbHTP_9y4sZYYxp41~sHO35LN`xmMLo*TZ4bcz(kA);6 z1p+$`{9A}ke{0}xaYR8R;M@?JbwibA<8DwB^p=X>a{NmKOxoL!geS%;^OU}tk0nNG}jR`uVfp&88 z>(h*WF7rZ48{J59M^O1NI0;Wv-f1_#vpOh#u0AZknd!C-)y$?erBsor^mhB`z91+Gw6R?7l%he+4QklFiP;xMdlXL&X7IA)K zL#`^rB>}<1F%{}ry|aEG^pc5w7o#r#Y$Fk#wIjs2-8Zuvt8btarAw>ZXp9wi*q%+z zjK^(}-+8u4vru28(dWvPlB1Z?sW5*$^#8H-7C?0bO`|BmEx5ZAoZ#*f+z#&U4#6$B z1_=-#NYI13ySqEVU4py6&AtDMyE{A6)80MZHlqWlW?a!?)V$+A`C3%7 z@>o*Ms0TV4O-RB4`sA8V79S)PzDSZ%2dPleGYomD{?ue*m`nL$`=dX(-)sKLH@IXf zXQcAS{@H2^$uew~VmGD}2gY0N_jQ%g8iL3ufzq;1&ug5cRT9(~9|^|>RA80YzJT}~ zmdG3$$bL&17{GD=DzyBXvR{=RgOhobWTG3btUDs>s|HxQI8m>10)^VQb=C} zLdS_uO7~@FJG}nB_?_VIUUvcN&Gr-!41RmgR!}lq)+qo}DP5f2p{@DAN{ew?J@ zoBSzoeDk|~`CG`9iHc-Gla9tuoPhhk39mrcgwTM4^y;=ROrynK1S-by!xA*HRi>kS z?W$&sqwGI+HRRYwqiQyEYx5Jp%GP>p)K}Zu?TnR?U|&hoCS~iPCOQ;+ZWprW6P5VXA1FxiMWl*lk4(N(NUV z$MpZ7K&R5dAUXEZf;6wHr7BR>&L!@lEf?;X!& zi#g?@XD)#jtHs+PCo{RotTgBb^&co2|_UnQ2Cn~<+5#x9dJAXq; z$$g8%WL|g`x*?tGeKDLQ`GUkXUOiO4otAg=Jk=THEJONj;%9f<3^}t_m3a03B?+=K zqD21i-C=T17kC3ZiLe%QmS0Pj3qLf5C9Dy+amUkvTc5!bcCc}yT|TT|giOPj(uK_T zAGXA`C2-b*B3yHI;zY9?!tZa#jIVii;~WD+Q2SNt=!Jeo}4>e*&&$%)LcR$NqTFXPG+?h8WWl5q+kpMYVN>CoN9W zVRr$_uCj;yyO#bhM{kN!6$@J|Z5{RX5o&+DTrskEBBzHpjxdJcGugZrWhQ>!8N3Rt zlG0Yf+s(?2)Dc%(**-q?tZLAeM543Jd86s7m4gH=%5;CG%qH6f06Yb8oK6>7^4Tw1 z%&)W`om)xK1FL@YFb2~H+)pU2E+gaO(z4aW;60w45)#ly)y)igdpX3)-{gPtnZH_0 z^$>Lv`!BqQj#dx53g!u^Tp2_e0+tC6Ha6){G4g6{EEHl| zzcF??s(A3r^Xhi$qJxMXe;B}MGl8HAHQI+iVh|YEOUokA1|*Q>kx{?rFqS-F zsu3kU2-dj2gquc@SjKXv`OM60(W?bBVgE}G&qsnDK{qEQ=Wf&6BnlCbjk<}MzJA*7 zq@jlrDQ91_s8M1j9)~n+FVHv!=fIto*VPFMb~e(LHda0=cIu032_hS(%k)`hHuBA8 z;;;mo%H!3JJ7*1%2H@^~;4re*J}WQz}C=ToOM>;mj`EZNs_803mY`YH^N@m*@R+q}ks^VRL*0EDKITGuD+LW(mGY0m z@; z{EZKfG1;HZUrzjI{iIL=@URVv=%Ty=*U?ZmIG+KXF!k4hKq%i$NQ3L6+-ljh+NhK|&A#9*_Jnh2bwv*a3o6Z{87~s13+v%M)7i*)h$0zBkenOyO^DF#LbnS)9Fw%PIpRme!tG1 zn&^a>9VQ`D_K-nRC~xSIOd6`=21@%c@AohYX)Wy^!B}dt$R%P%7&UT*M4yMh6~U{N zev&A)t;zq$pUiuNkKln}A_n|wFwci;Ro$pDg6TU4T-+lRnykqOL1=PRp%^#!d^gStX} zZ?WV`f!ZWwSL+Z?7Nq?Ap&McmrlL{1C6eI7w~$9WGaC4hwNt;P1c&ybZ4h1S`zhKf zIvet*!1Qd%GK3>$w*{)EbUm$spJVUH@*%4~q9ehH-;h~H`%`s(-ZmZ<{gN)4WmuVb zVh*!nvWr!2K7?QOK`%2DOxC;0m>7P6HVWn)wKOPaY}81JzTl8pF`@%xVxFK=f=L8~ z#AYZNM5JsHkQsv@(ba$kcqDC`8m9UmX~~T;!2<1swoz=cBW--x+W}CyGrJU&aW(zb zQdUqkn4?L#oTK|S;E7KvygrAx_SIi>8B6F!7Gxy(iif~Ieva-1Mi~J>?>NHAHTlf| zFZ`iRlCGGAsf2|E07-CsXlQl>|93D)n6ondjDHU(@%xgR4)hq{YxpS}UxkswG2~*V zwLKRD4vbnMrw=6FTg2KYz=mgrK1~wAv2OsnXGWv+w?-B@C#~_$}7i)F@mconAY+)r-sQ9`CKeV)DEhRx& zuu3aMpAH+lxH3WcOcNg@AfW>o!#KZRaG<=_tYRzWeOjQPk4-r=htCAo2a+Lyin9dC z0t1qXeTxJGW0*?7U?f-E9Ck~+k;eYF5FZtTZh?pF+L98+rf_#I)SxT*VNt2Ynkn-& zH%Z?b=x{6F^Z@h&HC`-^S256_s*EhiK|siX{(}7BWR*dpTsF6e<6~tF@~)Ku@?7)} zJH@E3X5vOfHC*r0am*#}YJV-YH#NER9M6(kx}r3}%`5am%jUZxzG?67E^K63spg?i z=M>yCNciqhmBbVmBY@Yszu{jFu0)O+fG>N=jpb7i5h8h? z^NOEJ-S@Oxr;(nP80(i;kx*n&xpZSTv*?XxCYiS>yT4&nLh}r2C+P4 zQOhusQ*KQZ19V{0m#wgI;N%FH0u|LhXmIWc*XJXAEW5J6Dkz3XkNnYRV9IVrrV{iE zj>1U%zs!-NpWm&-?LTwiQ9z)Hq`;RZ>{;#R-fK?Wf2H(lo)%cuGH{5I8@$Vq?Q^F` z__;l^TWQ*UZJD3Zy#F(!v!32=cwytK14;w49f59iy{}!`fr6=f4~GNqqoJ_$7LPkGVzZ!Y7MB+aUqIt(IJ% znrs+62Stu%R9!@l&-Y#1eyBYl<_E%xl8A z{oz$^_|OC%blqdAp6DJqoNR&P0qD11C1@95?OG@gdf3oDM05%NbEWb1Glj^KK{kW} zh^Rk6`dV~Djdr0Z1<{(h9o;HZ1>L3d)IY!8VWC@F5hx*#DT;GQ1H&VEs+$m5SYXmS!ka87{@exzxY!0!gtL5rOvP5RoIb z`gH*wv#6Ir@MQ2>lu%1Anz#8z_FaXB$%0h||3*;? zDFdk?7G^4YI7Jy7IeiSUQGmz0Itl*^G?QPa-_{g_``~~`Kp?OL0Ak<&i}^HcJcuCy zLw*3h1_3-~MfzW3oO1hK=>E^me`DDFd*DCans%L+p*Ui|*#9%el+b_S#){*^=D#iY z-yZ;w=idYWX~He}?;tV#6OaEhMvfog?>@q6M57OaU%~+%uG_ficKpASyigJssl@ty zrKG)#@gG~-6&8WGV)ZSg;ArggCuOhcS7;p-{>V;KaekZW${c^JC@xGE0#fDTAu?Rb zTr~W>*l+tUYTh@U!BhhG`0#jpyi&~t$V~~mCO1;w5F)x5q;pW3g$ez<0sXObY>|OL zw~cwdL-ap<@^+!%Lu`|BRXsI|g%T=Q^^V^lyHCTMpK4>G262XKZeG7!M zsJ%1Ux+gXK9QHx_ zp0+Q#T_KUH9%Zwu&4=HkbewGc zQPwz^tz0z0IAIJ{(n5`3xHz@QLxf~;^bdMj*qpZ)|2L*cg~q%WXV>c$m8_LEs<{mU z21c4CH_NRJEz``G&)X#<{kJuYwSTLD{14DelSay)TOa2yDh9BSF(R{ru4jmEekGE*g{ZD#u{;Q(;>Z%9l2}O5$!S zv<>!pN{tg6X)j-PVCu{ri)CiDEjj+9=QGHdW0ec*-=75@xL^6CoPTK~f|IET`%q)I zJ@plT8T`^>P~fI>wa=mT$FJaO8|w^)AftD`A{uq-_D!m(YTy|pL&tL=!N0~(p!kFq zq#4~MZn}Tkvf9*=djngr1pdTIj~E}3P0{GwmYaLR#rB_A-yjZhiHRx;OB^iB-A(`X zN4;1@y+_$ywn_@E3>(_^@wbkDlT@HASSm0go%D(kLG3!5PK#R9#y{g5Q?P=tnwOR< z(jO4XTpKd557hsAAKvQ*Y(&3!$x3+1f(ppWRM83*zc1{smnI{g$fjFVxoyR@owShY z54fN!@qV*PLrY3}^sa)VfHKv$A%Zc9CUd~-rz z4Bb?@Nh`6LOo3L08@7-ym2OV=ky@L^yh0{Tw{omZ(?Sd&g>~&D&aVmx5C2#)pi)N2 z2D5#{NKT0XDwCENZ9g*78FMwpC?VTMn2lP zFv5P57|wa5qGKEZ%oOII+A&oCYdb?Rj`&+9%^I{%fL;L^8FlI%2<-crBNUSl9sCla z%I8n=7D}xz^%zZW!zyxsu^@JJCQg{0QJqVyB)AQ`?X4MUOh7KtX7mO&G$Y z;E!#}?H4V4r*SIjrKx-FV=}MzQW#`H5Fff!0pp}dBg+D9&~~=htp|ciD-{x0Llin# z2B}=JRijd#9bDsHB9KWxsg-E2`UXWY;B>es=S*l!jTV#|9axT@Ebl%MOxyF*#`uR6 zUQks+L!>OFb@!N#^=V1&na@dO6|YsbB~6v(Yv|4OvGi!8A+FBfw8*<#z-&F3|DNJ# z$o_x-w>)-a%-IVk@ccbsCV`flNU$aWqH@||`69{p4InvAYKnHY!B0x;U$$?o$-}Th zz-|hn10oHDTEv|x3kN2ye7SJC>pCrz-Xi$61S0;@H+7Z2cf1V>1!K98zPa~Y9M}Ey zHZS~5g-cC8kodPkxDFd5IrT)iX9bAT!F>2bPEP^&4a$7W#v^C*C5}S3U=4E2|0)>G znms9x{&+$O_=W(Rc^f&l|L*fmXGT=e>QPa~t!n0L)NhMAHP~ltoenh&t?>Y+*!1b3 zS*EQYK=K35Z^cfBALfU9PV+2yjK^q@3lXxdYMWJ*sQlFS=AUT3`fI|?rc4*bsx?d< ze7PWc(#?(@x8_}{XDY4QD=*;Bh5J!m_+i&WLg|@+uj0UbC3wXSEyP+i_heUlNa*`e zLqlw9l6y$VpRf2pU@__sJOeaMvoUXxN`hD?`Hzn%dMT^z#o%U^T&t~Zy^-6D zpenVQmTGm1%8#m3Hguqdsx>-F{{$OUW|8WRqRt}bo|q5yxEUq1@Oj0Vw?3s_y0s16 zefZBE`2y1Mc^UT}EPBN$>~)Ze=bMrdR_~GC7p|inud8n;r{taTXMl&W`}`oDdqt5M zR&jO%^uZxlv0m8L&f=d_aY(Sz$JljqH!(VGDcfrdgn3=mc|7QcD@6movaRQ?L+!-o zS0svn?XCc58rG*zy3VejQGip&(=j?)ytujp=_K*rnGh)HwK&SQ!kA_gIHXXi=;Og{ z@X#w1^u}R70-1Slke=IK3Y-nQ=B0@Da3UvM`u^8)dysDoZTGTM@w8@5nMgTvBzu4_ z*TbnJQPS&As0T|FjJ}#pZB9sb0SEycP^zd6_petXvC9UFJTt)?5fx5QME&~?H}UZt zL!VATQ=!BvPnrQyrP2wHO1IE?xo**&Yt_M5Rf6l)-xFtscuz1y4rQ?M{sz)Sx+J9^ zGd3}*Sg%Ba)J+~_Ku~A3j~;DVV&m@ruEvT)vvx~VF6i!3l+rF z^xiORX(Sa-<~wJ^RP z&|^^e@nbo40PK&X0L+U1+jE_-UrAKFxV)@v;NEm(>`pH2K58|-RnAAxUrbWME|u28 z_?9hC)d@JG=w&s@@wn+ng7IPp!opzN4GbfAqoSj$MNZsW!otFy4ur=nTr-O+CO~kC zFnmD`VTHYRTzN0#EG$aQsiv-7bW(ZM6ChfQNQaFMCXC3Dkr9!OZX*#)g{SyVvf6Q_ zOhvc}NE-KxGGK5gY!P0bQcjYkk`sCNoZOWaiy$$OxU;jfva+&;MWJF5J3*|Lt*(~3 zWeI!6I5svmko_+9`(l4Qqr1DixVX5B>Te`hQiEtNMx{(-1-66^4HE3}g@&UDxq_Jjxzq~7&bPzqyz1&|iUjy2Wn12>>+8h|{gczvcF)Ug zpnbbxo9E?vyASYUmp~4_I+CK@JEj~vLi;CTILpRjz{(9$2t^mZDNg;P}b=qP;?$Y!4vXYo}}=_HX)R0|u3 zb#Dc^_eE6zttln;TF*Obdx?^0m86KBH#q_TXkWh_fA+cit0eSD#n0aglL?VN{V<$B zDIJIaEZ51^Rkz7$3jm=zAF+slkWg0dmfQLI+QdW!(C-&${|$6a9Wx}OKXk8u6o)K< z0IL8{G&eWb*4CDhiIk@qotT&y8rr;m{7xeH52Et&@**N#kJks^iTN7>-rpQMU%w8< z5tI7eOs~}2;xcM&0?<4-;I^8|DOM}W<$x`(ZfMY;NT||cbZYl|zB8}Z0-zfg6~&e@ z&J+=~Y*$fHad&q&@FMi3#&R+Xl~f42ng&!mP6Y@=E0>+p(CMciU!YLQ=>gpcHWCco zKsTQHYM!pdr2~T z4Mpft2nfJUqU6qyKzqz&F477VbFKh`6%;paN7Fw(ihmXt&;?IzAvR2Ija;j&l?(ms zwFDPtPHnC9^Ed@F&A)TL27>Xhcy*|2*xSufyitBeuGg=_*VW)SJXk?h?7a_|oUYWD z((VJ;)n-sx$vz)+7`|+GcYABU^+|ZKlTs??i@ZEEWw*{0HtX@Q6^CLbU%h6ffuQ$| z2q%kv3#dSKKJA!;U_1y4ZtCR>=wL-0^63V*UYoYd}fFEtAEe{TmSAu1|bPDxJ&zM7UM{T5QWZZ-b|2BJ*5hkT^focXvL9w z<+Br-4rydgMgSV7fn}$}|JHO7%y>u@-E7x?D(u zt@D+7q}$-rzkhvweW!+?@S1mbc7kyZ7s@j-Gl8>4>uzqgd?KGW3xnMn9oD2`@Dk$V zjkq#&^=40Qw8B^tu==;V1r`&Xc|eis2RfcGs4>Ih=<2HIpl_sS;Sq!_PlB zIB3dL%s#KKp@Blkg^ZMtnYjiqyy&PXWY}O3eX=o1fht|lQ7p{}l;V-wsR_-z(NNQ?j7U?nUPaps6Z&i_O1jDY8ig`-Wu&fwSG zl)4nhWx^~{QV`i3L76eHQ{WB@bMw z)w}PN|8;CwNGbT5$0|RGszGZ|A=?DrgR%1Zz}c2VAR%lc!1f1@LB}AT=Cb4|LAVM> z3#9^5w=CG&N#&3eQcxk=7*>@3+olCt$l+r*=kS|IT^m>9fUQLU+(+9^t&BJrB0!9D zblr{Dq9wl&n0FW;q|o|_Cr*ujkdAFK`u51gOe&C)xC|a)EGiI z*o-b?qy!;kV(9;>*C{p{`kXkbe9WP%s1_-bv$i|YNj--b0#8_OBiGeG79YR?`saOH zVXEKPMKby>R~Sszj)!feGExEK9_Zk1hyhW69tj8t3KcUE2lRqW1OW!SP_A2P&|YQv z+j_GjPbCzftvGykSP77h{1ODmupL*x<6i1oi+e8ywvv*PP_`pihCAO{p7eK!SkWCO zqfN}Og+fig?gDH!^JuB5AD^Be6=$4vAS+NL*p-E#mhhjjqXGdWv8`-}#T#vQJ*d){ zUs!m1dp`Gjx)DY4I9Z78-Rc_{SXf+qetuT_ghjtkri;Rt8J99hqs53*@F2qxb?84Tacq~Nu)(l<`*V5?t-E#08Lh!P=t61SyYuQmPs z=(uVPH61_0JvZbFmafnJ*aEo8rQ6owM2_CkCXAxzU00|gp$wvj2gK=kA!LdD|@T-m_dzO!F;8<0`aYv@4m z+?>GhL=uA#+U}m7o>o>?GWk7B);5NdXoIKVe)2eQWr#`?0NjtvyKBz{pkSZd<9WGM zW*9g)!+xT-x3^Sg{d8Ve3%E#GadB};$^Nb&sOOubU~2ko|0ionNf<2$+mnTIt?L$# zbH$?BJr}REy-$rqWVy=Lyd`BsMq-^36kev&gp-mW2;uGl5pRGulxkKk8u*k09|eS9 zePg3X0})C}@A|rbSKtR8B8R0a9f#}ZV>HfSEkheyEx`W|F>k#FF zszR%+MR0YUn2gMTDL>zzzt1WOf5?Rt`jGmpDGf5fP_ah0tda^6c~g_d|ILRJK&&mE zwg{FO4S2enxU$a)WfzDowMr64JG$WS8E`0rl8{V-f9jNa{)~=o zqDFf~wX*waxhbX+sN7^>&YBN%3#&t&6{hC)ja7g25b-K%x~E1Atv2b^Hnba7RJn9< zlF6TL%<%(G=uUX9a1b9ZMvSj!o5v#TnOd}T7FHW{XfGCAM9fNk~WlZQ3`o7XiHo9GQfd>T%|r#dr0(4i9X z1S*<{Y9mt7TUlDS=h?K*+AKsgy4*}hL}ihdp@)>hBoK5+LT?eA-hikLQg7!h!y*<|?R@e!>vjqd5#$qZg@o zi##7@thah>9fgD97u+gDP6jIQNv3JkKF%m*6LCiBn1$|9gZc4PeD zdl15d3Irse81n4becF!!emwiANQ9zz5t0Ovh(%?~V{c#-^m`O^z|^`4smzoH*<+h>AM4xf z04BJ;&QW0?pTh;N@YHt@1Hea^VuF>bttviFJI zR_1kLYbuoo%buRFn(w(PHA~+Q5(FLckOBA}Wz~=|e*kB~f*rf(jb{`Tm=7rlge$Ed zBCNcIa#;p;jWAiD@xR0z*%BC@X{FOBsA_5ZR^3eOwGmok-&dvpP87^u&fy`?#X>nN z-_(3;=teSsEl~B5g&)yfDEbUTJ?$rz&m&uA-erT9tw+q_pazGv7PH~Rz0p)3PtP0! zM?i@JxRS8#LYaE0hW(!gCPBe9J1(W4tRHRz0kv`e@Q`QL<-s^kJH-^B9)Ev-J!V{8 zk};KTjATAFV)zvh2;_Uw4fpzVD~=xlh`O;fb{NPH521N^dDRWZP$)~jw$^ho{;yB3 z7rm%m3c>+zFaK;r7Q+sU@pSi-1^d+|=RXbh8QhKrHD(COvXYjid3kF96FxgVeO=IX z>>n5?0nxYbK@dUo`IeNH0%+d~Oq10A;WrozuNB99hAh=|Z!-Hl)O!y}L3!ahn#c&lXabA6fY1yWZPZw&`| zjVN}8KASt-kD93S@W5^-e0k3#%9TMWk?AN?;&a^B=PU{-A%QXP`_+E_{%5UpP#MYUvB%~V* z#+Xnqf<9CYp8pnD(l=UgnaX^=)?xh^RnNDvKi97n-D#UpHTTV-vt&TAoS|)3b2Aa_}+)wB?9pj+@jd2|T^QBxFasL<3 zy`;XPoyBSH%oeO&lUVBnKGC0C)biOlANt5*N-+CM&Ln*=Clc>d$6s8YS4@Q+$0LOe zGttYo^cSc(0V`xL-7MfED!N26nN|jd#@ke9qy)KeX#r&bA8ki7W}wST(LHj*j`S=m za9--{%}~c-l!npqJCJO0uhSrhXL#M*S@SSR;Ge&HR#0~mKm$vP9hNDNDA0!_LPdA+ zMYYTEJ7jJ)ooFvq5N(139Z>+l4dm%M2ZK~+fAi(qwmAs3iS!D{GZ3W#Ic{7SK%IW!_`Ci z>2(m|I`Kk+;3yB7Y@A%Vj|&Ate)u6=vSgR5++oQXh-Y~wt@-&(qb;y1fF0%K<@Ld^ ztv(fXKYR1?VQFaz(CPqvPB$ZArbl=H)ee z2q0$1xNew^ru+kq$`4J$NpN?9ly+Z{2wSo1~#(7op@%36H|DHu> z*Ts2tuZJgKxmUzmOeC4Lg`Rrm3a1%gZW>WpXNK=`PTOt^E@vG=FKdZL;Ej1i-9SjC z8k%|T+t9VJy>_SDmCHu=`2^wf-LGlKNs?BJi6u_gfy#7t=e^Zo$BE3Sk*MYlhW)1s zeGb>=jfaoXeh%5s+Dsw?H24oVKs?H3C}OzP=Qb9>AQ+4SMR(`ZSgt`6s) zs233M)+gF0Bo6PF66fCObv#J0^)b2+gp|h+ns6Kgb`e#sH_wupz7<~2;@VZ{oQ^(- zG32m(+2+kl9m8)oyIV4^9q8b--PQH)-NXlZ>FWSWE>Q455jqhwbn|Av z$C_<120z&LA5AEqd*Ii=gSSOF(mf)3aR%7+gX>+pt=tki({iQ@JZC6r_W}4 ztw??w+PlwN-y%twe?GiHZrmSC+L50#|9spZ8+M$$e%_3Qc@|z)PQtT@=+w)`(sO@L zJoXQ~^8bRQvig0g(`!wOZ9QX?=ZEAkA)qOPaDXA2hqMcS8_!t{$C=$FltljJLDcrd zkE@r`5TnUGMs7=^s9c8}*vtvLu}|3Iv{xVilT{0xA` zBP%CINI-xL3&oc>V#h^@9G07#Yv})I{&aJ6*bg}+^mItstXHvkVry&L-EULB0$3(p z$U)1%%S0Sj%5H9T%XV)YcZ`4rCYQqacs0uM`ucjV69+IPS}LkCy=IKqv_LOT5WV|k zmLL#)NJvPyyu1V$q43wgON9y<6Pf(Dn3%4B`9sLlEg_K zNwb8lv3lo&wpJZ~!JSUFw>s$akofE?|84G_w!D|lUc>b}DGi2@va9D(kUj6iCi0vXCaY>TLBW1F9SO8V=9B+heh`#4G;{Fb)<7KVkPtzR2 z@DZ}+nM^@gl?FS#w(A{pL*FK|1GrHg;9Pv!($m>hCTV;7PA~W5`5$eXHkD)ygs^5^ zgx__W^h)PIj5%xm(!)+e3fCNqW#}*9I(ZoSQtp>sMl|UDb@0}O_U<}|2RLnFM;|0Z z{n-jj0$f)lmd9F5g$f(Gx8hhvNPc{uO|MpA4Ly|a1@&HXb%w8S%qiph@Ddr^P8UZ) z^<2qancNqyiI6w?pn@K7M*79|$|$}Gv?w`C`-}g<^rASJoc2CEa~0S5stBysYN{B3 z>wV*@^7mXR5mHqg1%<}VgYv#m?Rnbj)#_$l-o_E7Ih(LJo4>dcw|Y@|=KcD%PWbxu z>A23;#vnw>^E$R#92Q+4HVL4nmP?tL`t*D>HC6DQUp%#qO=LJ>l6b7lmN{y0R=(uM zN4^&8aXV&vh**xUOc`Jk!5rI0j(6SXjj6&N>P#_H`D7{@3bHwT)F2>lLH5jWsnzr%DLRKa4X33`;{z$=*<@cZZm2uNt*YFjfk4I z05KzB04i1iE z^~3QoV04w1o&Y>#&xP09a(M5m-gXgk24+E(A#_7SLzM7ZAPkbXH)T_Q zsKquH7~m&CU7>?_ixK9ZMk=i#gzOt|=1B!BHpq_ON7Fr<7TaUC8B}%T$xQ%A+3Wmm z*u>0@OhG!%zjn*PQzPNsItFIIc_I}(&xN(2$;CL3j%$^)eWV1opMYv>i8kpfK^PUrlvG^ymNg~lKzpICQ7h;KY#3%k%NH%1MlYj z)oup%FgM2w9uq2lNcmp)qWJ(`jVadmiu@2_Z?r05=8MhtuHJh{RAG3YUrx71x$kcw zrQv>3O|zFM9I5{2V?eRZo*;?$U?!@^k&ZT7=}}Sx=7VtJSDQ657emx2sEp&0!o<}J zDkb`)h(UC)C);fDm)iT?7Ed;!)d&;^i6WdH@|I2F=hoTbGqb^a90dl2c5U;^>MpWp z6el1rm+Td&V$sHyi}83W%^>CC9E?AKoVrewh#9@xL)EI4fi4ARcd!tS@HKtn;j0ivI=>iiK#hWFlv8s|$zL~U^v$BpkfOn8V!S)t z5~qp9KjU|pt8=Ebh#_RN{hMPhM0pTv#*8P4wDMm3^434M+3P6pmLWJj>TzY1O&9D} z=>4d8nJ#2~I2PIaN`sOq=$x}*bvKeGUO}=>cOd-(sX`7jFZC(znyNMC(u{cJwwQiT z!^XOUZ$$~DIVn^xV@c6ofc`8aD!>1UyY~!hPNafdBV{o0iBSg zk@JaP{cWvnZwDkxQUB%$&K+~Bh=O-)UKGN*u}`d`cgFtGyOU+(w)P3E&L?!0C zdAdD;4c>Zryf#V{{L0b~7-ri}O+Z*W*j^s+!f+XN1%5UiX!{dH$;U_Vx6z6#1F*}4 z%tx?raZ_=i+NX-ifGDvM{6ZBF=R_gqGaHH*Re(zx?%Q(mV}g@aoGOKY>gssC`*U^W z;xz2t{s!B_lGLZ6q! zdC#-y{gQ5{Sx-aQF=eMEl>LGH;0E7WJu+clMn$qQSha^`AlzW}YTczx&QP zw1P-3O2~t9voB`2_X~$6(LA>FSBiL|Ll7KG+$dQ^Ep2a5sD}}TGZn>5Y`HE^9>}wi z@l<01p#D~&H}C5emc`EclRVDW#>zj>k56lV7X9k2=i_eWI@g8*O+Bm{BNQa zOq;P1XCYX)aWaniysQ3PLJ2Dpa1I5Fnl$lw0;la237jt%9nEF9>$Fizpg-^b;$Qi} z>MnbM`8H2myhX}HQtQdK=*Thaf#tK{S-HH^Za{ic?SyRkruE(U%nb)-lA0gYBTtcd z|Fh|s5t+Yf_!x<>@7s@QwYD#v=X(0%NS=up)gFH`@|F~{K+;Is6jK*iuxW~x@%l1% zMBI?krxLyQm-($u5zIunwn)Z6(FTqyG>-<_W$T?8ZF9QDQq>C1@qD=Mq$1#S&HA@j zoTLHykWleXqx`)}%8RH7S@n^6QsGx4*3{i`r%M{trN-+#AJI5&vNOVa>_a&Pk8T-{|e|)qtc;YFJ zShk=4qnoL{zvJHc=Jm@`PQ-QR$FHXGkR zwgW#S4_>zlmq($h4#Lsu@wn`E>IxY)UPXUjf14a=6nb=e3=n!WI+E2bNjJx@o*W@{K;aU{4QssNsz->vq)}S-mTIi4W@2AwE zk?O6Mgr$<~!f-q`{Wv?=>Z-riTw(VVh`!!;-caG^@w*Z?RsJ_wP(man&vS=fw)2UJ zj7b-!LC$B|g?RKl?6A3uZ#J{0`In-G_MWb2n9`IVjb?x0C=ymXEX#8fWbLyVtr6CK zi+d+}8Vthp@rc{qwurse<8+*vCKYP+eW869zGF!j&J=Sut{HOdwj<(7j1s~iDkWhTwnA1Uf$mY8{nMN5Eg0oOMI$pSfd&J)^u%=IwTLW;I&=jZ; z4Q0(g)6>pCwgnOnqgI36^5xFpxmMiN)Kpbf)zHuo>nOSdF9jpqk})eeIXNREBMl7= zJv}`i-xJ`ysZN2Sa#(HZKDfU1Zr3Qax3U7#GJu?#%FZ`F9lDmb`HQVyFM%vT5%QT2 z{)xQFYG7ah_LW_ zEu4E@>pa%F{~NzRB*Cbhfz=Z@rMbSocv0*@X{?lMH}ZQuKw0Tie@>9@-?Rm8`x{l* zF&LP*jd5cKK|!b>VWD0XXJ_YEi=OTZM&DyEfDl!--@JdX`S*9@zc#nat}XZt=R>OZ~k2k|02@e40QbPB?Q)vhr}_sIUTy_CCo_p^#hUK$M=Ca}NC62>mV> zisab>abg2lM8lMM>s!jlAyvPEYfs>3-a>SbQz&5)gbZ1J{A0RekZIPYib(v^ezm=z zmYX~Qu5GTnYD*$X*>iHab86X3=Z>@ImWYE{m0$>$V_RV%Z-%5kD=2qMm!))r99p|R zYKq`X;oUA41g5c7kP!-9^s*ChUT*gacw4MVqE4rW(O@CU@;L1X-YoaFiVbuA3;dPB zGZq|u|w?RWxydEqF*cuXV;qLJe(&VX|c|2l{eU{sr7&n!jw07#_ z)-AOUZ_i7bk2EIr_-t0rghWCsTwOTn<4(^Wj;BkLWFKvJj{yGO;C=6ZJ&Nm9)fU9K zRCN(4$ADL%&2`eZsGX7bM-f>u2S$Cmdn(#k`)fl1OLDB7C>-PVn}I~q@QnPRVz!)! z3-)%t$4cJHkEZb$sulqVZ9F+OkG0nUP3#|oOX2$sCVe=9pPL0P#wx*RTWvc#D!){q zf*$6s`hNXHmO+HsJs&P|E8tW_d%qVqr>#b}h>i9npv&RLw`lhZFI~(&KTZk-$qhY( z#k***><7ibJ3E?Yo^4%QS)TNr<00ymXh({cpAT*`$E(B7n#^86lDCIOiO@2ec;5+M z((1g@%6dNk4Gx->un*1sT$Ia)(7Or_nkm*qD}pY;yuIHS@(l2zpIuL=6Q1i)3>s;tmePd)-)c+9jVC$M7@oJc`NBwd7`;tS;W^uAFQ=3cNbC3CG7Z!1{LI7Vt_dSO7$UiD7j z+u1V3`sHb09)F89xY>E!qes<{%D}tV%bm?|lPI4Kr{1S#mBPoU6mEx}&0c{Q04A~x z-e!KbJG-j(;&t(CvmHK0R1tq1KYzY2{HQ?mz;SgvS)Js~B;BS(CmOsWoO6-%UK?M@ z?VLZi{{7S;E>HUD<)px%`=&~vyjtnJacy%>j^W`0q&PQdI)rD=oJ76 zz-sOA@K9gg6S!4fo;Yp@`sQ6Z{-Zq zsGnQI?HCGzhYUDo<0PJuh@m8ajPc$dpjx$=Id#{r zt_lHBW>Ht+6FR!8y9?k+R>FE!J(;NFm5lBv@99E%Vr&4{}9*n24M~rdsi5SEi0~=G)DL+DUpf z1$x#F2C3-v>XF6qpTe-hbG9*5U(_9+7Utt^Mv+f-C%sga@+_i9!|Td(HtfXK+8N9g z=tBqxkVZv!=FVdL`zRK%Tr`Srba`6y zxxChc0#^||1RT&QFf*!S#<|<9zk5j;r}6B!Zv7H8aiB96Heh5ipvAEdG!&)n(f3og zI&)+fXfs-UVPZHLmz2%2VeZezmK7wzhA2rQvT;+1%0B7H+2}~RYW;lOad$SFZyu#- zR5+_|K(AFA`Xbw#7~du0N2H6Rrk5>ewp1qdc;i0v3qnF?>@RGIjY|qODDKzKoctx7 z@V1S~wSg?jxUWeseR`r-To*NGrWTGSQ|xB-S=E zTx3EeI5DygLpJM>g!!n&Wpy&se3UftyUFq;mC9it>Rnx30!5P`HO;;(NvpX~Uxiv6 z^7g_)X&fN~rek~$cE$7$`cBvOhj$DD{Y9Q*OE0%NultIs$*|qTx-zn|5fjG?v$GC% zb_OFeoSd9&Sv|>%5!$M^Oeur+z`6zs2^AG}b+ss2M=gT=KgtT=19n`$z%Gyl_Y!C! z;2!y)z5zojQ92)-XRB*!W@cxNNJEyl6*S9{kdVL$bpPOB$QS9-4maEh$gWfUvugfJ zhv}f=GTqihJEkLVae;qFl;Nj{ZyXs?!kDeCt-<;aSYETuiB7L(9Gskk0|TsCGp#N* zUS7|qQ#rql);qim@GHv7fR@_p`+?;I88DUG9*j02-%i;!d01Xv2DySUgfX(iqa(JG zQTX`-0lyIv7;_eTKwu z#7hoLF9&Fg$Z4e$^=iBGNhTV*8IeR-f8_rDu&=8nIRFvU8|Iy10aa9Ux~p+~%DdACDA<&5)j+ z-%iU&qFirvEIFHd5X16fq@%!GkRUVSSPwJgqjb ziTDU5$9|A?K@@^7n8CCDZ}U&SUWj#P<0Y7ZTf_Umm7*2$5!L5fS~VCS$WH%G}$LMkp6@!c#b}ZKLSz{7y?Rt4mx3thEJfqrcIf8h!;N&ZZ$l?uidbP`8 zUHfRku@a?7ircXI;;Wg$H_+_F|yhq#h^ATYR;?DCSD`L!`#>>XU?8e}S zy@29RBUeg67!=}w##hmm3p4LMQOv*?V+(e(Bn#eze51}Ax3m3&J{ZUp{sEU}64Cxl zJ?91~wucn9n-m=bvnfbt1}6!v2i>PB+T$tvM1qs4RQC7lne@}_$j-t?WS_Zj2__%T zA%%f_xaOv|rsHAocyW5_`#x^mOpeJ|NT}>=BE5t6mMc}RC#m_<47fkck_Vci5@&Kf zIEa^CQd01Rq19c##N;<8Q$u0Ey}P!*v~|F?g-5-ud&uEBY8|<(hZ`;}jC4}UqMXv8 z#+V|<4{}SyZnE4eVkmT0r#z-rSaRK+Te&Rc%v5;ryn?upK_f$b@E3%okIAN9lfJt% zVYA*N@>EVtt#=VSE@NRZR?y;LU^U*$OMU9&-N)RIzK9oLWYKT3p12cqaR5zI@ldn| zJ-fFd=oGMQ9BP;w>_jEf}nrq1}`jPx3&EItr}Mi8S9T{PgL~OM$V2dB!;#i zF~fi$2Sw;F;Y%!$CsRN#DTh+{bHfe@*?ka)f}Oy_q(+j}L%e?SyvMid^U-`7rMI#g zSNJb=qB%?>mf!mMaq!0JhdVDXuK*Md4GoR%&p2?vJH6{(>I0{%_Yi$3BLXyh2q_Co zbzR+DPmezt0kwOe-M7C08`@r+0~6n zm1GAdeXa4hxs?^*KAGOoqYNAz9)gc8|5Cj*A(8mI(Z=VzACKq0=#dBy505RS1IQ~g zOUsBHS|N1%W}RYH9xkq?*4AFg*e^H-e4ZTr0~tUUXDbE<1`=`E>UaCYffb)Yjzn^x z{;CVG)JuQ;B8sIXxY2KG=J#c%pvcWU_&%QcsnKTLnAPjh8E}qZ+_^s9oN!jI*VWYl z-L?Y&({*6-^@gAU8XW@@bH+=C+G<5Z&#QlK;dp|k#rxLi(d)tIJy;Od2({jyJbkXz z+1ut3%g!reJ!PU<&R$cW6>k-NyP|+X#Lh9~ARDvTgmJpvswJA` zu`|@2EkaBofttZ*J_Nzz^*74uTSkqy`+jlSy04%sedjqka*u@Z!;mysq(S=p@N?;Y z$RoX(qPSo6sBu4YT7GQ%r=k@w`1_ej9sHLqw+Lk(i@{rb|GC+pNBE=-HyxVd9jiYLFgM@8Yw z%|^qVOiYIdaOb+axduF(ln@SPwj@$m(?A$T%sp1_H+h)vgWzZxyGTDk+XW(kJ0M8~ zzPpHo5cNp*C4WX2xzpKxF?^pmvq6gdWGg#28+Ju9&)rK*rRDNb6tc3o8`5$V=|m-0 zui>Mpr%3#pNkS5Xq@FTM4w=03bEaSF;S5Ph{vZZ(V=y$yzdxdueAZ zs;6EXY3>DFv;`a`F_^`4aaCpgQ>0OLvJXJuBtjNvheUnLOqjpwhWelZl zVDu&Y@mKysvxL7|JyAWgt$1?8XctTP!9wWl#*R}NR!4*IkGWad2?SpH{|5SN$;*xqDqF^~N{DRpbiYNq%zR;-n@fJ6lq@*}jE>uR!rfEKbC^ zBBRkQr?Idf{wL=eZ1G6sP)+vhu8A+N*{6o@aeDN>ZA=x6v_++sy>%LRLdRpt z`j{(d0f%$2ZB8vLIRv{)kOhSd_r)H=l8j=^^ox+cG#xXRaH#Kh>H^ysCOkj;nI+9` z?iS~f+O5FGPb&<`@?wW;_jd^=i>pWibo8CkpRPS3AAn?X?CF^l>R(xT0I4n}CZ_T6 z@l~Oqe#1zx#NX=s(a_L9@&+fE1RF`r)%7kT&OEVQ~ZwY)+1jj_^1Gr~kl=Q!XaD`Psj|E!U>(Y3Yey+_k3D7b$>DnY=tI3d%Ri+^#Ocf$O6;%>S(-0Inqw`M#g4LX@wc$Bj+OnxV_(4Owx_q3plG&R z>Nd(6)4OpZ6H2uuR_3Jz`FxQ1K$ae-AlY3;bLKW_BCsi$-i~9KaHB}DkvZc_1&`~i z`^sW}N~1KgO?*bHuJYY?DgIgOuj9>5Ot;}jZg|QHvZ(K3HepgZNxP)n3u!B|c^*B+ zgPf2}r0KAO?_l39C(jhR_^AK#_B5MI*4&oJ_>5x3r2Ib?ppD5gk5kHCGS(>HH+%+_ z!^`emO3nEDT6HKXC(@#QPoLmmVSTe4=f$a>f;K;!Faq*7N^|LLa@d%SDuiiu-k*Ye z7>f`y4NE7XlE^@1^n=(TyCYm#Dhv*(3%oHDJwApW)uJ~E$9-?K+jUN)h5`d+zhRpe zVqZo+NJ?7q7?d=8>MGAK5$ z!j!n9#wJI&Cb-JkGi+_Cs%O1zZqdIjX_nS8jS63l52L7-A!NU2GFNj@GncWtaiJpE z3nlaOr6gTqr73C7JM(fg@Q_-lE$PV#6glOP4(t^sGh$G&z5P4HVCJ!tR~@>CY$hlv zVoxSdMv8i7hri{}x{P8eHK}?PWU#jtKy~f%V}RrUd>=2 zadKgXUFv65K&ZZ@dC2EhKnIsX%l(&vWj`jpPGG>Z~+w~F!%!??Z-p5f& zFmA;Z`P~d7tix`hz{*Gz65Wx&t>`1@~lX(G$I0C@)!z9wb8hL zdiALKL>jr+5~YGqj52nu{z``&3oqw@s|RRoRNKFJtqFo)?jo6e@@D{ba7euM2{QH|M%2>qFs zsIb~dFP+}dTF+Xat6YlWvX7&2>@~li9tY6CNgOc;GctF6tvLUZ<|gpV18R#GS*(~ z542=tWYpI?d3rv9STXp-$)zJkTnk`=%i4~@XI;3AD!yQ+t$}aA>vDQ9(dZFkmo-!F z2Br;|TZTqP#6(0_*Vie%M&C$`CBPhQY-sq};%Fu(n=7;t@c^@TC9v(pFU zW0}9{aoWqs$bcDlbMkw3W(E@r3j{XKx|`X!Tfut@XDgGRfnTOV!@v?TryF)SojVB6 z*0m!7z7&uB&d{JJ&Z^S0b-KX2q66lIRo>1Um{nrcR2eK1JQ^_t6m}YJr1zNQM0$9; z5mg4r6cXd%NEx50ES=|?xZ~=r)^@7g;(Co05K`Fa9Ibbf_4Qm3Epx20rrRKy9(eK{ ziuJM6D6Fj%eXV$sdmpc(^;hHBFGrYhPByw$u|!c0*>}q zKTa}E@>aY_Am~25cDlc==ho8=6=*UryR)qxMHcy`4|b$e&`wigCP z4t;KJETNs3mL8TY_VR2@LLgHrv=pn6-8Z==b&Eb@bUv|CIm7f<&6A*lorPEi1X znTBy<)rtmG`N)J?1izsvML z^l88C_xa5D94?rznNHkEu_A;dP5K7T+>k*;B*aaY0ISK>{jO|iL-S{@qt!(GMoOIc zL<%OK*Dt+3$&cC$D$ojPIrK}bEqvaCms@iUm0{tv3fiM}IEkX{KcM)?dI)(9CB>h* zVdj5ajHaZiPsYVrVi+EnGpyB^-wcIVes<+#{OkklQ`a<4e_Iau(Tkz_Y|dQ_x$K41k?@b1+-4#kfk07{q}KIv<-5v2bVKZRvc9kK z5JTAdqmJ&`!B&dKyqS$T=5L02G@X|9J;!G~kIu)Xn@qu77q%krB)`|ItenEakQ~~y z@u;XMFoIzGvfA2oa;HTlBz#a*@gF@vPEVskr`dM1r^#*`zc;m*`M>-iI9)O8G{um` zphY+h>^0QXwAk-T3kgBX%|^r}L`O$gP!Fdq+BjC|@hGrSA0{$e=Xrz>sN_z2o~ePO zB5O7ykZVAHfk&WkqJI2f;p8;wBMOF29-;XU!dPu>3<((oP8ASQsi~>S(w9m~O0tZt zs2{+r^78Z?869o?S5aPG{`eb!4yXjId4S&Fp`MQMO4Jk$Is?%7JunjE949P`hY2#HdRao2I zFO^o6C`%c>8r?NYS@~7c){0&s+Qx6uJ6904*Cb{Z3E;mNt`-kN? zkv=4pWT@^2qc(`&QN#8fDXWHM=tkNw%6-OXTMfeuRe}wHh?1UFHAd*7YyPy$JDI3o z_*m(!lA7xq`2s_KS+J0V(^0`_NjIv=wI&f&+XpL2N(yb;Ue;HC`1t$N^7>cFyBp6L z@B-Pv>$4aBiy}H~_R})WHb>=^b6uW(a#xUWECk14;p2x#vCZM&8b>Rops>1%!5Cc@ zdhi=OnZx%~_+h^jMU~a!LO#kiG0ljP+fWoaVh7guT$4P$QcVZLNH>>-1G-i;nFa19 zN!c=nEe0xLTxp`l4qAbkx}n&?d+wJWK7p)15mJCDkzW%d-AEGo0Ca#A+vJBf<(Qo; zO2}6|%!7X?mK+1?^Zh7<=3282J^2yYZK-HUloa4G~#1mgJb+))C8Xy zSPg5+-XnLB#aiFNarBapm84+FRcm12WIfX!d#O3-{JsBVXoi~ecZ!#%$=>uy359m; zmNSHS{%1LOGv&Im(m3H;AJwVW^=^J(!*8+Zu(*!)414#-FoOyX$Rq-uEto-WM_QX; z2C;YnnQyc7f$EVEgr)NmF|Ln%ots_&jB z#~B4-Wg2P(>AOE{N+unPze1LRBR z>&qkP%kX}=-v^-8clrXCM#o1dCZLfhB%;2#W`VRPFqkeX`n$Tafafjy^rNH08?+&~ zxiy1Bs$!ljlnjM2OQZ{g1>^%1M+oGK&zy%nY^gx z{~R|?N=*Fwt9Y%=dvRHFJvr_)#i>cO)~=ztc10^$KPU2+#ta0ifgd&A*nv zxOAbgks@H?;ua_u|HnPhLL&5Mrl+&jOX1Nzlm#%qB?SD}{^q8VuI}^RHDNG%@+wQ< z8K6iH4ou&?2{`RP?(OaU_ow+1ylXI;g^5Eo?-|X+7 zJGoKgm9(GiW7MRmL!4XH@R+pG15GP4k)9%Z927I+Sr_B|u!#1O{4zZxrV7=$g|Hg? z>4$e)7wrsm-puNhWBaw5urTIwZm@xZuyFSjy5o&Zsiq8YfmMEV-D~aMhX^F_h}{@i zFnS7UcW;ggBCe;!lSz-ou%0t4>_6bp5Nmy&6^@V+W%nZ!jzy0R{34k$l8=-!G@?U| z=eMBT{ZqGeT-K~O@aoc@h}Rq;DosE6JejnT#V7>72TUOUgv* zxgRqVY3k-m-j~!8nj@2F?4h{CV4$Pn*uv;AWfmc4s^#wjg@V}b=~1`=VJ+tB#v8{lzds>Z+0qC8b+UDS{_*Ya#T$r)=q z-Gu*rs(UW|JdQ!umlp|~^j<TO>wov0oY}SE~Tg#g(?-d1o(BL)4 zW(YbmoU!%4$=e$TJ^WJOJ2s`prO@GqK$xAqRh-sF)AkEs-I8ZK$tGA5dhJ;zWsy>T zkV(iCD~E+ER$y=6c>sch$fz)@A0NHevZFnp2!5Fz6%G#N-4!7@)&19nv*%d0a;HOu z3L-0Jg@@Cpl+-`4a^B{eH_J7@?!a~Nhi$jnM7mZX>08FPhnB_IvAF!@!b+20P1>;z z`}WFSa%-10@g$WrZHoIlAC@=%mG!v=H+4}S9{5#CPbeUr;gZD!iMG(1=g?d08O%(# zv4tREM(d2vs3&kI*+0bsgJ$G><7Y2KlGMLT@|A2H2QGb{J2Lh7-XI_!eH5F8;2*um z8cwx??fp0HYz_=^he!16m5ZM(9SFN&5DE*H+pXb~%D)p%swHdc)Sc>sE=3A1ySuM& z|0@4qU7@j5yqNLcyTId6%lt8xEH-U7TdsMLv;*ruByOLLMadAOU!+%B*C}qi4Hj|Y_ z!TNduh6}Zdris zagpp`X=#b_?%jNPc$BiEMRLl&m&8LAY^nt5luBiqe|L|Mz@>T&=zS4cd!ZBDO`_Ya z{PglNeU`95j}tf8P|KQM%ewpB%{-jC@?8C#^KZBqokT;q?#79^g%#N+ji~@#OZD;S zuoRMJyXE71rET@G9~Vvy4GEi3#=@KyZdYZ9G!5l#uFn57G}uTqGJTYP;^6UWMA+8% zOCk7o)ipXJH-}CdFQ>@3RA%5E8_>PIq6*#oBjvYvIZ659ckr8F+P6q%wB&tkU8Au* zceInHQhjIpscjPdbRp`K*xf|FgA!!Plbg!0!)-mJg36FC5>nx7wBxAiy2NgLJ!)7= zYz@gvA;t9-?6^&$_gg%}=UXbjza~;Tt5Vg+XS!*|-7kM5(UWnlqT2ihc*Pmiy`Icg z?`2v9LbgA{vG(dY8PfVq38d6LVri!;>3^KrI-hUyN#_5XtzrniXL19mPTo3RFIs;y zSl0H)eZ`DC@gbBDEQ0a4O}=;&N`LOPhM7Nc9yVXcS!i6Lek%%59PP>8WwRGHlmENy z-^MYu5uA#nnJNsT^}FzdPtoIR7D_`ZWBvCy0#mTsT%x=`5aPN-i;nv4e3yLs%B=Py z4z`zuQ+fW)!zF{}36*AgzHU~Iyy^VY{B62VyP;`&fZA%Pzp?>{V@LKqn^7YQ` z8O$W<+{pG*#X^_4?~Q+ke3VpFbsahGHxd!ayba&y(@IkoPz=J0O=i}4uJv6rn3R7( zC&1X+HT{t`YYAuGWGQ_xEjL<&X49eTcw=T}+)CXl7RUMdTM_;nbl(uNn9x4juBBD~ zx@_5C)Yy~droL(aJTfmfGMj$?Awsnz+_4N=N+B41-n7{xT)D>BS+E3yf19z=RMo*+ zT3ldj=o^l*zY&8$d!Ru20Bb4PJJ94yCCbG<_VSu#SmLGi&4lccPC3YztEx+snK}rz zEDM^`;jT2CX2n8zg?>wW1WWZdUW8+PRovE%Vc%DnWf@Xr**31v%ogG#*u_Ey*ApsZc{w0E9mHlbm z@+QS9lPM?F=68zsn+Cgv!Q6EEXbgXcCMLzB@x#cV5E00qL)g`D9aVSvm{jCQSR^SS zF4#$={6<2l@p(xJSX>7(-u!wTQbZZ8?2_TZ>=9K7Yo!1Q7v1X=uVWRjAhiE zLwM>%yb46T_Tr8fZQ5bIMjoz1k|Rlu1C?li2pabdkw-tUe)%g%#l@98EH{R&WI#{( zcc}otm7q8V(FCicq~!SIgusP5J$n*mNK_p{Mg*cTK45=_r|0QsfPZA0MK$ zfl^JIFaoq1>!6N`N-qKiSdi7$UcONzfav??=59AdGXk$04H?-8>JSX9h}0{9sDmB_ zA@n&wQ@zD^Tg=tbK?d~Du6P;A>+z|Y7chyxyi}N!9fZ71bgAtknNkx*+?${qbtabXlery zqEJ`oyw2F}KCizt`b&$gTr!ws;+Q-YHQyPn*8ih-7_Es8xo@2zm61P7PuOuu?fFN4 zq35ag(ksU_EK9JPFRH2R{Yu7RD5rE0othJ}%e}6)BT(6Tl}B#TmXsgw3xz-?rVNdM zg^!K7LELC$_3$%2yf6w+WFSvJD;;Kqgtzmrj-jSfO=mQ+FeW-`S{QeOJv34^3%?9J zy@a|#T<-w-Z`1h9$>U)xT-j)zCWoW4q0oCa8V@(#ICiu*50>j~eLY{H_4$Z6q2ZqC z!a~Tk^iY){=(_~mBUMK-CDC$A6#a&c zzhi87Yi|#5xq9mSOJn(`g?kQT$_NBgVM5N2efNgKq|~s$FIO!8vf8dh8!}KATOSUm zmgZ5HO@IGg&AyZ;znG^KV(k@EDvW|}=(#X=h7Qky$-1NzD9F{dUSmFNtD#LdkPSug ztMa3;ENz#h5Rz$3J+u4EP?mv~BD7l^OdH{R&_{-v4_~Ds@C~7BAEXgYchL98NB0BY zIT3UBad-V5_X(BoZPW%=R`g?N_6I-y)0VvxLz06N)`4}e?HW3P1)NU{JEkd@Dv)QJ z*Q6&{`p&}oyKtkU5sR{~?Jcba&q8|e^x*7=`6KZBj`h>0`ctjsC|T+N0}!4Af4b}p z3^Lh@T@XfWr1G*dP)z`OH-UW)-j0{f2lb&~X~*yB3MeI@rEJ#PxIu^p{LR-c9|L@W zC4t=I_H=y8KOx~iEBwC^aC4%a9^Z|C3feSDe34Wn>|bA=JHPOPsaD(G-dzH(j*v!IRapG6p5)mTT8i=$9VpDJ6!?|*=c9ikdvc26$ zAr*>3FdDUuD&;=iCjF2{Sx*(m0xM3&VofdxR4{@;0f!ij zdTFaXg{|-Tx9dZE?mttC+Yej*7&=7nUGFZhrDZV4V2-WCn4^@j4Th;=(qk{|Suby$ zKk&}om;UK3r!wI!iLIl%Ke8`?U(!}0QbC##FOH4z7nco!%#QUZD~F~1KxZM#f^@{d z265>HJB)3-%)YVoVdVY&HEm5f{k(?bpPid=R<0_7omr@bjQv|FS5|*9@&SCxn3$;y zIb`o9-McJys@FbTJvkJ~g+#c9)I%lnBQ9>8Z(JJF zIQb8X3yS2*y(rKBs>}Ce>>_ca8peDHlnM-$MHm)aDNTvMl$7d7QOwG#AD2Z)MKVA{ zG)thubgGRrt3l&Xr*t%p6-m1 z>}t<)xMzyR+Os|*E1kv10&T6+%4!<;G0LAu(Tq`JwcXY@FO6>C6T0D)BuS$f8#N+X z1G-@^pApQKlBou+YchpcQ)~qfy>MVIQ&^BN5>l?v!tuGc!rzI`qKOmfcNcV@&p$qE zKa0HPf!7}wHXH#C2o~=P7&D;Dmn{L->84`Bor9J2;`SDtjy!aAbw}5k<#dtRB!M{v zvVEY*5T#d#d2wmUbtX?r&*#|*py$91b8v6~M>6mTmTkb$mXSf;e!K$e2l(CcX&jOL zhU1w6uV7m!Te1cH<}F0R(89vwe5?O-ns{|`7Zf$D1{|i84N6229d?Yvd+A~fWNwLg zOWXaYvH-KN*&D)EIN9cnjy2gO4$w{@??w?sBk&TVzP2zxB1YyKZS?l;S|2U052kxT zb8cSVf6x>t3Z9kw#D*F-UFx&gQ&L8RR0(OicEHwT9rY z5A&Qtumsu^wx=~zRA!f!ii)>NasI~w5bo&B-T#A0Fm^J|rM?uC+nZfE-mJ*O{`c;} zozzwj`&hyEEqPxbHhiEibHA}Yj6@{j5;_(NDOqB?Fyb#^AsrMbLw*GW7;=PoGGA^o z+DQezvt>`@Kc@E)Q{QJr`Zl023^D)itGm1$SIb?>*(D;d2ti}T7zqkflPBkr3b7Qt zo9Yv)z~8|nvReMc(xdy?Ni~4FQ7O(tf1Vw~IKsEgEl!xPJdeGPcyC*1^N*mw+_Y%AL1~4AkTB%f0|BgtoQ10NNgBpsbkEP zO826j)w;wfGj~aQ7d}R;G<&X`?y5L{%&f6k-q9VU{`VuJ#b)kZb>pPEuuT*3H?l+PJZagSF^X?K8kL-88q zC3z>vA!!#^viAc>_++FXq7d~X&~o@-;30w0S)M4nGga02tT6x_H)rg-r`0DHzDLM> z6M!C-MG32~6Y$w$kH3iV*ZYlK+CVhxu=Crwg2o;U=d0tXN(TGF5Y$F=a`u5l8B!F3 zpE230`m{JzefXJ!A3_aDLw!kueGyEVsp8PA-L!sA=NC1FqQ?nwY!zdPuh82Ovgy#} z?g)D-FBKie4NQ@auCH3p{~6A0KVFsl`Dga==`(RM5fq_1b4#o@`SV#Ku%ggL9JET< zv`SU9&Dkc8wTunKr-g~&zOYe8tYEU)xE$wrWr7ARFw$7VUXSNciWx(@wF1x_2jg1XaO`9j)l6Z^i_BG|TjW3sSyC}01ZfJTB z@{5()wm0@rjEn@O z*(II2%B{Ew(g~@l@A2^9{YkOZCPnkOxVh80?8vF8sDM7pR|d6{#i}I{5fPw<4m{@N z<;BOxgLNZlVzyeT8}9GV2iooNU#E+s<9`LiU`!HVtxrsx_5>lnk`{sFPAiZ>VD7yv ziLxSLZlCwZU}7Bs?x1(m)^Vrn7rzMHYN0S*WUrzhs;c7$LzHSqk`RKxY`ncnkh6h< zg9G{PQ-0R%`vtHI;0Ke}AH;E(|Ga|rB0oRBEYADA`O(qR>gx0HBTit&;RipH7d??l zwexci7 z-pqPQMf46)JPfdgg6r!3TtlJR@*`Q@s0QArfCP@Zc5;aQS%46cYHJG>v*~YjN%5Y& z`6E56Ky(WA#`PeJd{tvWV|^f0QgEkgqIGEdfp;QL5c_qh-XX<-?poloREssS8y5Oy|16! zXqUV>`Fb^;koVR}-9hcGirl@J*w*#kQlx{wv_sTtafjrl4#FN5zRAfi7J>Le zj$#$P1@qy3z&$uQ&>)c+iRvG08{ghPs7bYQ(pYMzRawn16OV4W0D2O`!F9Dps6ZJL zN(!njE;Pz2l)KeQZL4Db{C6Vdzc0@G%neF$!`Owd*YP>;x?kNMVd-CK*q%w;&+Z9j zV+1B8UT75$%cd}0<9M#!UWRV9(QcelN znbV3z7(j=2K_g)(;`i;p!57CskVaf;RUdQH@-kc8Dpv8-wFp-Z<{GjKL>4ORXOr;J zERp`xJ`t=xitz@{YD+)ZT}wqsJ`CbgN+%RR6ZJtl3no8-$~OxVmLe^N7~;%VK2}jV zOh~dpFTRXxPs!D_s@jLOO>GDh*i;5((}>vZryO{+Z|vpiVk!Qo;@AivNyErzj+FP* z_C#R_?|HbV#*v7t421f|Wqt^#Q+{R$f2}4zTqhH9#m+y|mA0DT; zL`9yYD1!Mk@c2rH;C-|d_X_MO$lY9d1LB0Raj+=emXyZcb(SPCtASRe!2lDspMoV-Gd1Q1XzF4q|xuF3N$640@ugq z6=bJDf;u!blmOg%;1{>ULYXGW?SM+pA4y3`r;fnU@83QLEEWl$Yn9{Sj2;TSVeofW z#@3b=R({KW>zyCz=m3m=j7sn4=LddRpx1c49@xWjc+9tKxq$1&8}WRUwJSiN%I``$ z560D@VS>1vaR4=^v-HM=T`z9P{RGMf9*(YAc{))+5o}gr!QLzbYn1`m2^10*?j;)f zJ{S9{%G@A2IVl8LOL_EJiRfQ=tmfX58(USI)0^JwI`a3Yf0uKoH`jGO6SI91e0%k? ztBj>rr=u;_v6JijepoT#en{q>rSsFnGWX-64p+y$d(RsE{7(i%4|z)+ehSCBdR1}Z zn46bI!-w#&F$s;h8&QcLK`>bJxn4&zdkV88KaGxO%7wba%RFT%6!9 z8oCqLr4)-qn39C4H8ct0qm!{xF6=BD_SE@xl}GQgy;Tg`C@}mF@4!$i!?CEEu`!pm zGMBzIpQp5#XaBp?OH$Ae?0pPk$7@6X`UWwvCPnM$`Fqu+cqMZCv@SRGF_8}aQ&+GS!Le>l#bGd>qy7JlhEhZZ3hfhmk8{^S(@uZ^XnIkVDg zY6p*aO&Py&dsL?6XU2l?dvb)+uzRD9Qe`iX^S&Fpj*#5J^cAkpM}m$9e@yaC8qAb$ zGzv*dm?Xcl`3$rbt3c5E^~ZF`rFfcvPe~qOMHXDPTh-MRqMjSvjIb{1AJAbPWej_; zZ}>DU9fU1r)L@)b`^b-c>(Z~ogtxOa5c%P}S?y!wK!1J#~*jLqk8$FJ3ttccZ#V|Woe!bPAVQ-~u zdY)?TuF)TP`p{!S5bG~7dRspy)e58JGPxG!bPy=`;(MLYWhN{&Uuz!REyN5Y+)j^b zjwde0ZblTsMr>M{{~KrbPZCb}L7V>pm^SNC;o%Gn43B?HE0Z@Y(}z!i83fLgK)tZ; z^5fh2y3H?-gRG9>R)bTfVNS18HPP6mcRCtQttP13OAb2(9K39sG`J1S8~PSI0KFq2 zBfnxOPVZtA(2g8ZgabJi9v+^Qq;X3g0Y(WBR~?|0Q*IWl7uVL-z=#303|KVsI^c^{ z=(fsd@TJ7Y<|r3~=%9M#S2?BlC}mLZZeU@dt)=w(EYBE z0ZQY=0^re%i3UKKDDbyH;P?g%OJMU85E35AUk0G66xji`EM0dLcykW+fC>M0MPR%F z>gQ92;y{`kOx_NFg7}DCJ;4jC`{*eij*RC!?M+_{Ok!fOS+r>W>fBhngf4Pympkmi zQIk=-S^b6OQoH?cmrA`KUiM@Z8Ql_rz8Hz0fY5&D8n)vYHUbqVgtBPynOn{Wj-8 zTI?Jiz?L+Oy&ahD#WWvgEfBA9O2p-?9Zv4?KJ91D>pWFlYz_1y6OG3g3F?dc76Q(& zXypFXzNbS?h3?lop|Yy%iEU5aI&d#OMS8Kli41hUKciaW%1?f7Ca9||vG@J`btPj) z$OCBb+~U|`ZY{hFvmUlKCJYR#L0T@!bA2CI%B84OjJ z(v9Vux?(!skQr-?KTP9I?K){#ekvY##o1g|f8=JoD(~n{KKgf-&byDcx5e@Q&F&@~p(taWU}JC<8``w01@9#TQpGGoTZb);6})AtLN{N7({ zr!ds%V|V9p1G;QEI5L<*;};k`Wcag-!hzPj$S5LZyU<%;vQB$@g%s`k+`e zl7pRnyL_c<6sMt$Sk<2)!Km2$-PZt9L&A8mT=e~oX0Grz-=2w%KuBaa+KgAsxsexd z;6(2fdAkR5RhHb;+q7}*6llA1*rz}OH8d=egSR4&Z+HGIsxMR&?6)V^o_cnEJ;|j= z_|-gs=dS;GMZ?8uCh&-g`v+c-ojazg{_=5fF`OaJI7oP{tEce-&!6C#?yqB|U9Dg1 zG{`7)(q@&dG`m~*eg0Bv7!*;v?pbzRg8L25y#4#bO*hIt9SxN2_3+`AQmk2kv&wl+2n?(9#n$#F40 zDL(V`@@nSD{tIj^Fj62H)`SnLkToEsPe=Oq=;Y*t00SjsBm-0>K~7#*Pw({fln?_2 zS&C6P)rcT7VNOt3K(E>q@0gx)gU@$YYbr7qntEnX(Zh#l%8PA)?7RTwSe}VPn0?kM-SOaXakkXo za?|9@X&a$ijG1CHELOypipQsohAE#Y(WQBOE;}_4-g0qLdT|nYadI}TVDD7s<~p8Z zTVR@x@+vdHWb#95#;Kqd9%+dNCm)Fl>-fUX33%09mTU70ak*JsS)MXfBnlayZ2h_5 z5yFzD``Cy3+vaZh=45a)uh=wWs6*9M(x{Tt&00gXsa36Glhn&gB(ESXnVcUHg8YmQ z4V_eAa>}7F&M7o%5 zGXGEwe(L&$YpB=Yz?AdSmG9JD^G1lJrIg8C4_!)HRNLRg=tGSAT3Kgs@#HuDIbm7Z z-~ioYM5n<#z zC!5hL?l@Q8Km&MwOHI-9+q65+|Qcb8;*;7VF~iYf5GE z1%|42Da)lTS6vh_R7k}wmnu)+gcVJ!HLzC`oes&TGmp0ao}GS4pLD*F#L3F5%c>5b z^?EF7dbSwpT7OrXV~K=k)ufM@2DvPT3lCXin*%#)xgCdg_Ifww&=+#Flras&?awSv zdwK>b$kq=z5>(^S1O>Q{-qrn5x@)<%@STVXXiDj~{`C4N#9=B`_7-YQr%HoLEDj9>2A1Tq${q*CqL19Kv*^m$-s{a8y>^bJ?Tk!g58G@A zH<&c5UmSj1JxLm9v;+(Qtb%!55Zq^2@tp|2__L_(CvnjdBQGdCKTPysq8G68#5!!I z`nUVvyzE;h@a7I3c^{URMWY-d9Hke)=wd`DtUfmfaeD zKRUDe2^_FHKx4epzOuYr zK0yxv_eQq13-^=Y-k|o`mD&j^fmX>D{heorD=XdIAlU}8SgJW=@c_*@qpD~zX+FB3upFpxM z{auiAfks+pHVrOrRe=9En|~mcT5g{GiV~xX{G88%n$$cc8gp&@lHD%`>Xl2k*k02b zbaXmu>Nw|-^yZq=gTdR@Z%MZ)A{&TC??I{%Pn4$ zK327^X}EEcv=wYr%q-GIYWUOWR73%nsDWkda-vxIN||%-Q&Oog-K#epGbOqCXWx(P zsn_m)A$`adPp?Jbh*Lg0${qVaz!CvV6Sr9RW4xBr_kKtUZEw3zRC2c9S^Rvs92@tQ zkB=!vik6$iLCUAa+q>oa+wulRuf0BM(eM(%sqT#VpBeK(+tUdf55YJ?QxQ_qm+0o) z-v*Ohv?wfTS;lFU7OREU#H{H!g8s-lU(%iZ#%;>kWW-AoLT1G7_!YMvcpxitFnsrR-KI>(2i=f4iGR&=Qtc2oFC&G3`b~cr0 z?n3jt`NY@9y%y2C#9Oa+)|3u+N3y+KOk>mL_+}6vYJci|m4JZ`U7k3=hOCL_cRN4g z!AC3{Az=4zg`gt~PqtPApLMz3rn2Cr1f_zZN-XC@kR(kLUZ^Ox>5U%JbDQ<(ae7Tz z?N2m=#b~VRa+xv%N(ykhx3Xp$3Z)oHC|?pMa&IE7Y#ow?F2`%!GDd?ORnYh(R1vF8 zxW3ihIoVk!uS?l{816QG;`d;-^Tq%H6tY%VUz*;05pBCQ`g=a{Mb@UsfSyf5c5BLe zZKEqx!f$I|_BgxQv$2iT&uCXBuT)g5r*!=r^OZ$jB>^R2zxj9Hc01qc zxuYjG$1?VVUU4DSePVLhN7xcaw(EZ+g3m8cEhg?-zTbP^I58iH^UaJ&8K?&X5>ePC zUqS3E(c~vhDwzu@irJXaL)mfY@z2wI^;?g!42CKk%9Os*#QygTW&oAH-LKnItmNYj|pjB@qC17~|eJtg${m3DDll1nz;$46W! zJ-Qp^_4&f1nn^+A({;5bXXd4`8gn8Qc7+Iaba#fk+kr4Y_eCXTHhHne+un_!7J1XV zq@Q9%KCOwO$tjdS*LI`xcPC7v?XS$JYEn3_v9PbBvV7)BBvKx>Q?s0VZg37|NS345 zc3=JG(jOBeL|1-0;}GDYrb09qA#27x%3FbY`GmT{+j7eVCruPqk0k9fx?Ds$gNfech0)(=vIyy;XR&317%xr8e|ICtzJ3#vz z*Xgno4S*slAhMq|&6Ekj{%5-i3M?%w7`Q%wY6)pn@YLob&cR}xt(Lj@1}KL@AP`AU z07?@R6}3V7Og)#XuuH=djlokDx1Hg)Lo9G+rH)LbkxPi)K=a4K^}7^)(l^p%nj0Ux z%o?0L+JrNPh*!_%Ml3I*2QcB>TTSnx3Poi!y~P*fS@;W0+I$^TDW~Ql4uq{MH_uPM z$mLD;sCCKZX;X}^5~+C&BB z?00Y_^4_^;sll_08Cc$8%-cJMmIv73F|=xT8L*j9VmER|Plw3tjksDiyHb07cYYy? zop#Z2h8|q1?wRl%POOof^g)Z_a=6k!oGn=}qRMDI)LRywqVda%l;!s5GOfq5y)2#Z%=KQQlLnR=M{~W_Yc9$V(D4VG zQW!=pZUo1I_ZATf`{|>jLL~W|!4cd`&@~I)7x!*bj#hOo=8diC$@_DPFQ6)w& zSqpfUb909GmdbuTh2lK~)*UF%rjXLXXB`$*n0Nv-yH&i`l5$vwUctE@2`dSLbm1P% z)46d3^P&B*LP$trY2GAehAgI3y{8M;H8pgP&*G(972akOWk0%*9#gnq$Nl#?z>Y(FpFEypBH+vFs%Ne1c;n>@m^wQ0t-_u=-s!2>VPM z8X!w@&PDI`7|rVS9!;^DmvpQSibV8lDP)z$%j|IC){m#)*K6E1ao&TUbEbEqzi4ld zJ1-s~p%`g<$`_J?R2I0Ykj8ac-k#wUF1nb5$vCCG-B;)rv?^P&&-d2^8YSF^KmKWb zK_{WxFkB+mrM*2y5_5HK9bVW)Ip}ud^3vr_%yVEmqlPNEE ze`UV^8}xs%0Ol9#JVyoQ^0DX?)6W*TnEmM6 zLiIf0`Y_vU@1VjaBQQ=$7n;Xz(KWwA#$BRu~Uf-+5nw;f_eU+61taM10^>%U3b_dbp9$7YSS zqtC-|VpXe9>nw-V1Dql6NzjgTL1PsY$6K{;Sg$R=6?V(fLCk~Rfk^NA$wz3y-!mdI zt7ZXJ5|F{~HbE2@)8;`G2bkJ_bP#stXn&bZ%@8WSH#Hrsv;&mc!Vk{go^x&pLh+1t z_DQOGJ6Cr0%q~Eg0eC-#v;C= zDPaui0OY%9njxrdI7(m2&hZE_1Jxonb#hK}M=(MaatWm_tN5*GoYg6O;9*mW9yx+kfa`9&B$-NjlQtPYNo5(9dUR`gM;L@)XpmKFg`YpECB0>3B z7bFyYKDI_9%sIh|ezturVL4Z~?uII2=aPi><8m7r=n+@u8->290j*or_X`-~Bf}(u zF5{t@N%*K7sU)KIE~B-^tQ(S`ogz;`R3eSeu@|?U!cxhDo|HFlFNO| z)0gKaKF7nO@kcARp$dw9sj5DWxd;r#c7}&h14MUK7q6*A{Ir`+L-PE}^)6IUVUFUXZ54U}$qic)HM}Wu=63sD%4m>T!PQ#EWbi zHU)G}%}~Yd_d>*sbSShEi2P*R{N{}^xRHE9P)38iYI>iZ`Fe$})W>)NWU+Ye*ZM8km+iR58cIrN&!yVUi`2PL(xZyf$D!vK@G!r%EXTr@RgpWe(F!Q z8ZtfgeAm51aEr)j3Qu{%3J&Gq{R(=34mF1o2D|K=a){iM18Wl$FTp6vWp}5e%vVU> zeAPcaT_dSA-ry@&K?#)`EU*9Jblr7wy(V{-&6zI1_i*(YAL{3G zHQdKcd*jRHBmFLBWLX6E1&2uBt zXfCx1|Ayz=5GjPH|J#n)mjx~C6YAS4G%=6$5#r(5y6coBiHhZ#_b9XJR~3})SI$e} zX|`I3*GA)gzKWOW>w=cp=<*Tb-i9O^rML+!*F<%r$qcL`;zcUaGnRA)?NkO0W`Fg> zenl`|O#FJ}(8PG2Dq*K8o2=G}MNBie^PM+KWHSOSzvE%sh_s#sRVheO>~IkV}xPEDZvn60+-hg0eB`2 zE4~pP4HUvI&tAOCTnYy6jt=07I6FS>xcJlkIqpf$!|Wn^%gVnb+DNL9I>)z_7LOWK z^0Q|z6)TF1SvWYJ^I73q)B_Lb{3U!ZQ~_v3H@WST5)jl@er}Hzzd^f$5N#SUPEZQF zSgrScF)~;Ha=#a#vSH#1sPgsd?K)VB-Z1Uu|HEkj$1PyA7r;G`AdtQKQ^@2$#afy# zeP%pBHGJ#pcnuULK;6U1-M#mM=%*?68PF8>xjXI!WYowI#9SlSg-Tl!abxxHsWQ;HH!^gz6t?M11~q1; z;VY&SkdRDuv9s;U=cE2OFex~%J3 zbLYtPdPhjJwcN%~w^;aPMgB_Aa|GuVw0%XKOgEXxYt3b=Zlbq5P2BB%a4Z$`i#uT~ zOWi}OUH{mbL=Qg@D?Lj2ZFJWt(dcKwh>r9HaMXtsrGwgh)$^1H2zxlym8>|18< zg?b|s7l+nZ!$34F-A1{q-t>yiL+$gn^=QY6UdrOZ$QqlC>w;*ePT#2e-H`8Mwt$wi z6z?vHP%|c!Wm|3pfo6 zq^vo*@NA;ZRFUV69y*=r=k&!}YI)?gML*j9pypL_$;Nnz-`)Hg9XNjJkdD#nPK}qg z`{{Y8!>vlyPJbbCOm%ueHu9FX_MQ8Da+U zY@-F4yo>$ttz=g&+cPPiN2y{e31%Mpvu~J>4s4nj3Q*%DB0Iy+ohI;C2dQFifBG1% zhxt40S+m{!DxilPFvhbUg1nP4+$vqSzrSy~kaokzP0KTI9#3~KaUAaUCcg{`a(-OW zKntH7H;F2R6Pu6ACDn5G)Xt9AYWsMWQnPY1hE;so6Z8478|F8?()z4i3nu=;Z}wO{ zIAS|PS>Fhjhm!X4_g|Bz$WLpv;x!V6&V_B1C5CrPz?M#oEAaRht|me z+JgRxZ7>sH9F09n5R6utz65XyaK)+;P(O|8U1NXy{RkwnZ0blO(2Xvafc&w<5tLx( z;NW4#&@aGs-z_7P;4a)ds3QghZg_ao3~?*or%G?80GA&jZW++t0lnfN$7R9J_g`^oI)2bgt%BuI6&Jq(lg>lDY_}Cdokv_OyPe9c2{y)IEEL z7oi(DP90x}_BvrI<2R#>&AO@T2^Ld8k%dTJ=xpH^vPnD_WH=NZ*^GX%@# zEJM_@(AIVn=LvS%lD^GI?ZgD2&EFogXfq=I^0pK{L7nxfKQu}`rg6K<;( z7C4Z_BYq3I=N&b_Ec%iOGkU`Nnb0y~9Zf1u;{$gsozP+oskLSpORXB!hRv%a1v|~` zHSxm2;$8pxo+2m?2l>x=WIf(b*j(EhR%8%g*~U0!oAFRegQqB1DAS)wrmO}`$3q8P zc`$`D`UT44Np+IR5w#VBXzE$)&lH)FGq(x9bQeK0sin1^7mp1{1%a!_5;YWFv<-m- zT5%IWh(k#tsj*UAK&q##nX1AERfVf1=aS=hHs_@z|KgtH;}Mj#&{{^98N$NfW~ zz7CS3UCqNl`;seV2&6F{8xhzoI-J`}cEtWg4JSyp#)zNN^qcKY^XwxpaK_m**XHJc@Vq*vB2*5ki{uT zWAsLnAPuMVI*=@OvR1V4_}*Os3FJq=wliq44;cRuqP^4ceJ?Dk%nEjLEag}C&V0Y(dxBOkC{ZW z$BWb%QG>Xh|0-g93S?vfkn(|%kqXSHzlx5ouh=UpFA&hDvXGw_V%qq-h3&UQvI z&?+b25Y%2)kKy1ZaTksmU>zYxDC?#_H&==?Zl#!ZpWd!6ktIwT^M8&ofJ)!Kqefn- z9*^gs6o+W@(Fc;PX0!VcF*f9=6Iqci6nK>zX z9}bHV?Bnbk<^6hWSjuZ$7bfHlGJ$XiTVjIrnF~Xzc1&`NveFns)ORNOyN*w$L}|4& z`1?==4R0ho)xaYqVRWlB;6C6ZMB(+&RQ`Duzf2`P>XMU!KktUgr1knu5jD%!;#l(R z3xPL*QL#q$17J}P>b^49jFe@p%m3vMOoNWg7IOpG8{pP2_#w@>G5DqT$Qso?*$ag5 zORMCaBdD;Y1}p1CAA&K`60Rm+{^a>0SqgTTg7Xbr$+1}jpYZpgX1rD^C<8Dt6@q$% zTL~Ljj=1FHsb9WuJ1oB7_=cH?epD8KuSkanR=w9oe?n)c^z-N^pI;&$oUe9A0Q;Jj zo-S@X%~mN*;oRJzb`BKVj75$hzcb*0503MKqsi_2cx^XMMcfR!6^nsSdAkal&>@r=?s;;ii%rqMK%8q~=LxSuLhW7jL z@E>E)>Kx`WY3Lhc$$$zFHSa7o@+KN?Zf_?gB%lZ&BW0z}!%+5cf|DRBHe=bcR}-eB z5LNsQ>sA;_l-F!Mo`BKXhDvpO52ySOERt!Lkjw>C3V~7E%elH+r;t{jEvQs&S8>_$ zZcTZr_6%B!-)Ke>pB1dLP)bBPLfPic38MWE;o@K>S>`_sQCAPwISD%4M)EjMIg;yQ zPtFQgC(-QeaB}dq9We+ZlregkOM+PHjb&rzGGW9+yM$ZEY?)Lcu)KNxDsJwU_iy}4 z-=6s<+}&njLSyO{ju3ssen_<6V?O zkeF*TnvB=&&1$GZQLJGC36h-5j*Z9jR1u7;NDbER(3ksiIJa65C}D)|+XRxJx{p+T zMX@;9qf{>dPu>k7l(cR&d~mD3G%@^)=?x8OTD?*;WF7f2j4*t>Y~UE2U@&+wNAJSw zPY777rIEE3auO}iZjMZt1bkIfNx=(|$21muzLvUvoY?F1Zd*6cd8PN@a#MZ)3C$=4`ePv+!BD!xrjjUZ{2jF7SaO z5+HH9Hek@=9e3;F7&+p*vk29nice z7e$J4fLW4WQerDFFYo474^&Qp9+?zBScAv}N9ZOnNgQl!fh0x34MI1*OdyI%Ljxga z#KHBtKcBJYn+KJ@5R zoNejnLw~Yt!D(OpYg>0&EEPln+s$4p1S7Oey>4vGnt^C;#L;%hwCXMX8;ViAwL_F> zLQP6jU^|d z!gMS{YfAjzrUWG6EUc`cYZN`z+K!Eqobw7qt-&8Zf(io=lyn=-luE>31Tzed&kXP* zrlx9ZXl%q3u5WGzMY$g?H8Xx2=rHKX3IsNvNh_bs4^@G zM8w2oQF0O8)z%aFz>o#hm{fW_!9bk^K;#bn$$UgmHf2e$=?aA!)hB{QU}BOzXZQ7& z87N;oMKuNC^gp&FzzhlW=*r(P0qX@^S9LhN)_GGI2M0&A0;$`6sp%Z#^T7Hr$|p&@ zaRukOkn>*z2WvrgtfL+vD~F7N67bVt(1O=3HG<-5=%Nk_m#{YOXB>VDFxzDwgI8_% zA7PRTbwMX)4?7t)c*ib~3c>Kg-@K+v^=bJ2`7??QKeWEr69?)bQ1D(%WsT1clc^{l z3EMouOUQRxTu4cClYw&?sLni6w0R(U{GfLeMZ66sK|aRv&Oy{g4cSL(L+t3J(57i~ z(3Wxwm&snO{Dc^m_&x;VK{|5ZXkwhant+SsDP98VezBIJ7le31Fr`HMo3UMuE@Z?Y3iU3gn`|T zFGs)e_i(1OWS$78eWqv$ZHHz8Y4yMjF-qSn>WFRydHEl1WB|2^G;jloQa?T$U-7OD z^!Ec5t<}A~$WQe^mf>HC>GZEssRPL9&eF;&D_>k*R_Lo#R?|~aA-wCH_n#?u=FP3; z$W}|rFupo$ks=P__*Iy6gA#_(w)xX#6w%a>ySx0b>$`&fX?hiA#}#FIhLNy1PTN|q z2+`Gzzwqyh&Rg=S?U=&JnYB(2O?#q%3n{qGPkhPRb1SNhqGpd-RqeIYqRx(mwYF5kJLR7Wr*Kev+NLatKI>G2$$?Wl` z$|m;=Ll(S!Z!|Rpz}A?t^8*f`k?}uWRLA!FULpcj5LjZ$U*ZHntk1c0l_z*bv5w=w@ClsvV0irSkwW+7t4ERQw$C9i!1v zhTp?ny*-&EQi%tnW;X$9AEd{D+gaf6?+sK4AQo1AFu0;r0-R{Ke># z%YR4>&i1<#ut2C(WH7oF9EDNv2wjLc+k)&uKOf$uzwC9lj+&Bctg9&A2I5&={{F+& z<#!)26PmI zcLSp~K63IGH);6jFxnnIR)H`7PDZ&fFCB~0CYg8;eG&WyOyJ`qH48XC9?xeCaVW)8 z)6$|Y=XV=)G&So%N~@^8efv-`gU7rdOu^A-*ZXfl|B9jDM-c@*Rdawb7W5eau6)~> z@_S$K+?ce`M^?@#2Xn6RI--l!KfIS(DQkky!gm+%c>8_*LE!xOCjz!58 z4!|v`5rPkye8(zP?KmKNdW7T_Kp`D{uN!UB@R|H-t`2{<%Ksj&YJh0LXH51GNKsz- z)D1)6{+CT%pzSV>`mFxLWQCE9rhN|zwsMDpUvXN2MWGVQ4`Gs^4*vqCL<(=;me1x0 zDu}n}8Ozn+SonM?Yu%;{acuO}YOY$Et=Xt3!M^eoPkFFAxBj5xI@R*vM6K!(o`Lmi z)|mz&ES&aa<>+zu>o4@MaQ@3`p~GbQL-2+trhbLzN2tQUO|)Ac;^T8~f$2w7*1!9A z+W`D=m87atCTFi~!u2e*|TEm=a|UR^|)BSLKRJFbA7^{?p&=o zVE|4yJt~%~`n=X{uI%w#2mKndAXwfUbuh|r=ns6tmd_&-)t)I~g_9P{M6mH`k;JA{ zJ8w_@OYLuK%d>Y^)kmK9Zb$3L6>Alc=_BS3t^AXec!YL|2rNp$;IU!~YaNh*6RE?w z>+w1Ww&4N&I3tLGC@R#k8^tr8n*@BD67_c7pq%IeCM69@(WH)D*SX#})|SuhL=|hh zPs0@AJT{fc;;km8!CjUdgxmP7GMXqZS zt6X;5L#dVEuMlQyqM$Ys5meO8jw&mhJ0FO3Z zal-m1D9!{ZP^~-rHw|jmmn+woyF$aSJ)NwZ7IUGxxL@|CJU^@S4rS)#qx*!&&Xzp5 zp!}_%T=<4WNw4s$AFh^j!>!7_X(&LHX)+uF+vvVBKL3V6%W}Sk(oQQsG%)?+ zjB(jup*c#WWA_J@I7)5y6+sL3X~Prm(So=6cnhHl_50)r1Ap)AOr-?qSjwgsz!IGj zC)KX{3M?X&(AgmPk4>z&*m7n<3ZF@iZthHG;B)0etK}N|olbmmREed5LZV6b&sf52 zdDi&HfShxhr}n}H*{-IsGLKm<0lB?2Pgm>JsLN5Df{9`T$14fduPKP&FzVEC>_m_y z<1?2HVwoBAm?;kHuY>!@)vD6+7n@nEU!$abx#H{ib}~5_%V>*oIwSWxuX7@sh^+P` zd{NQ)!ThyvJ-x)l+ZgNNk$NQr+X*Sc7w0ABcXHYouuNH~l|C$wts%Ma8NV8tD)iYT zO^_~klf2FU#R9zD13UOUZWXxmK8uFk=R65>Bt*aj)_sU#fnl>eS+ zf=;zmfaVB_J=Bgti=!FL4dp6rMJKU`IA1Ff%H zcxR!Dncl1CKik8xrZTL)OX_WYw=WeyJCz7Pz-ArA7Cp8V`Job51aTp(~_`f(O|S3YfBCM%IM_lc6uLJWcfIUQWl}Q!giLrfN0H+t=AT%M-)jbPGq&zMJdU=8omR6t)v!8o zHr!ueDc{>Lk3hd7L9L|zJ&M#zN=!$x(+cfFGx*Y&#*(VW29<`8yli<3x1K8|&zE*aXYi zQ~+;A%*%#a4WT*0Ye7~Fr_$@0g;rv0Bn1`OA9C=~ZN4pB*Qt9ljq5p$ExlZi_&AFp zAKx)u=M0uBwe)12TeC8whk3LX(GQx7W1578B`3A!?vBq+9dw->;fsx$NkQPSW8d=R z&t`h2YK^STwL1_hX-mW6F{5y}!ZzG&(SKW!{re;*aIgO^^5l-qwu9dGLF4tq`Mk+c zyA9*lz!EINm#DVHW9!V*ce{yvjqj~0jnVE#VjtU^oRSX=_?PZSoGxSQs0NZllrLEZ z8f}`K2V6G4(qEF&vET+2Q2PTXHo!^TQ&d*ABO!couXw>)!y{?q`WqX{BY)Ilt64`b zwLsONJDKK_#CBi!0-HGaztRScX+6@{53cGD?D2)`i-m(y+u%9MCVGJlaup}mE+LZ1 zB!njHY!rC>AnqFON3m2Db0xsH@JHi&hPaTg=-QZKWGyv>Zp9y=w$qx+q0ZIXO5S@!kj*c!jR zv&fMBuW)A|6@)!R5}@Yxr^>AHeGp3NUUt6XZUvxG}{pXR`sS$2;?h5D+d6ehJTeXYDkb!+0bp40|Yyx(GfHd3*pk2_- zc=)kg^!DIJY1IEc6~OZVUi?&0(7#FFoeGT==A+>p#DIQ4|91ePthhk%0*~XuQ^_P* zoE;E~`u_W*Mhe7i|1HD)CglH4ndGg^k5u;|1G^f+!Rv3_9iQGD{UPAv8$(5rgBwUQ z5-#Jx{vE})U#l3x)!uKCG9(Di_`?^aeueqS*x4pizSNyJ+(bU4_|LC+H9VH+H^i`2 zYm<`sHZM4@R#thnau|RzGKgr7@MuN>D$v}P!=PN-xk5C_Y3{4ql6-)`Orl@6@+dtA zKaw>6KF_qI%zrQDf4@7Y1mt@ATCdJ)^)c%C|7?~2xx2+8TSYQ% zKVf{#Vx#I8zZ%g);m@g}Rk*e6qp|aL7dSH5nI7h7oamdJ6M7&D$#SQh#Yv!09LbpH(T@EQ@d!Tqj<`F33q%aj%t-p`LUr zVRy_}Je#jQ^M=?(SVk|0HKwrTqcTeieW+v!HH(MUdhS{A{5zB}Lj~qv${fFxr!Dm- zEi+~;Go}oMbv(C`4W8-%z$mhhMXES&IUVgZ!|{y^(|_%e|61gSXz^xUrfTuf=(xB~ zBt@ULlZzKq2ph_^mfAF3$@DLDQu4s&Q6Pr_PnOjKw~~|-BY^l7yqM8^N^!NgZ-~!O zouo!B+-38CHVh{|3@7HJw7E1jo_--7anY5e0&bfD{bb2U)VjV*q9i_(I61p%g+X0a z5`zEOgIX`-L0u>VLmFC~n*OBB)UPLf*Ts6@o-YlSH~FB*n=9)*&6@4@HiB))dc;<~ z4VC1j83i!AW%J74V0xQ(l&5oSS=4VD@#xx+!=_m61N&4hvj2W7e#1=zO-v*(PD~^; z{?IX=A=R-^^x6-#W|rP{uB*T_>Hk0ffatc@32F4p8z#Iot6F`Q7G zI*{N#`YG)@eVQA2rjqw3SRP55tQ9HEQ8w;}Dj16G?dZi=vR5Mu=R%@S7L3py{)#QM zFEDg4bg(e?*%VEVE<#r+-XswwO(p)@=U;TDULeZO9P8-g4z~r}%=)5y626)$FXlHK zyDb}|c&kwYTzKDjDsfy&@0!u+$M&PkK)>p9L5HiL&G4u~BQYm34JuU+)pR;GVw%xNv|7CEK!FG*)n6k5 z2Eqkeuh^~PNUddQ?B8x|!@5iH;P_4H8f?$!bVod2d z0%ggpD+02aPQ4$yqrO;B*S%*_-c;iIYmWnnK!NCDNa}WC@#4>8MH%r2j7-uwvhSvob#xE5y zuuQ)Nwk00t;>_uf$xVSNvUAHMIB!5?Uw+!-zQbt;t8Ao@vU=?Pd?kIi+xu9RgC5q8 zKS?Z?OExJk;p+!xN+?wj+~V^l+Tm)_KbyRvD&@AF=So2bg_!oS26{!U9|blD1(c}c!WB=fS;_hltD4D$GR zPG^iTOi#yhacn7Sa=wPMGV--^6a2o}Q36)@{f?H|5o%6jNZWr%6EwF{jWq&cC_xaG zeSAcD_+GQYce%XzYkwFTUe>ozG${beW0G()Glp%L)9Het5y^J2Zj~DfWUGCN1Kv!^ zyIYV7z>h}PtiA>*MHKL>Sfq;{G=g9g{DqJl!tcalJvjR@xShwD&Y-$SEWtd_S8d_ zh28@3Y&8!?GQ0$VKMhjZ;|$O7OU+LId5L=_zB*yjWF)zCI~np9Zr_D?A($sGg6!?@O%;!F(JE%xI$m;i zrBu^ESk=($ykZ&S8vn9T44@j zvJljihE-FF&*@{Pz1WoZKXxr#&6Hx+!yfya_C@Nqsj?w~qTjzOm>v@U4M7tP`?2O; z@i&jqNWC3k!;(^q83Zwbr!9klRnHDgkVogjhw6k7iPk|hV7Y^oB7YxYAd9K?X3C+w z_|8yAus;b9Z3=cNr$Nd|m1MaUyPw{#BhO$l9Q7S%d>4A|HbFu5T6Z*g_F$kecGd>d zo4A(8&7gUo3&Z6P>|AAbsF?1V=2U1AodwLK1U<3k>}r~Px?Z?|Wjs5)wB8V_ZZPxf zpKatH6JKd~X?a`@CQO;0d+A>#ua!g%uvHJGRFg>I%;6?!Kyq}AO8m}cy83x&@k-Q? z8BFG?HE2x-{D+3|CPme2NfD-YR0usWsd(Q#vG2-9#a}R$<%QFtvY@s>o{qWi9k2c9 zc<9;}?aAulQ4By6MG5GAQDm#ovg4vu@ zCrM7tiF+^*tzV zFV69>aF^^5>p+?``RHm)okq1cMNc_jWAPTqiH>)JS0dpm&l4KHw`g9u_&RDh$+0-P zP^sf?GtT++;Viop)eASXIjw2De%za#jI6wu4Yv{ zcbcmb0@t?}VeObBceaYyHHC--CUL0U1>|3J;Z6|>2A@L*G&;v~N1f94vH~l#UW&C) zF{!`Yj_brK`XYywT%bT*s&+IKUI`{lU2d`!-ci>Tbg2$1MMs_Oa&*!ae~F9oaG*{}R8D~6y`s3 z@BJ)c_X!*;KFkgh%GmnhNKRL3i+^5My{uU)-cZ{cdo;l@j1qF$?aDeid&Wz{to2$U zj+O;pT@Bw}>dJ9f`SdpfV?>O?cT@3dzb30;_|vkmdnvY*UuzuOcPHVqd5;bm`$#Ev zo|1o^y*0w)g+%MALTqzwo)eZ60=^d)D=VCRBCg-xva_nc0?@sYSK+t^H*PaH5trrn zbbAd`S|h>BGqPfnub$_Jh1Y=;qJYby5b zO4v_#Wy&_Zb3JCK#Y9q_aCu6rY?a`LwzX!JdY|(S$CAw@^;h9_cu2yRzXYljt`iGq z-?{}r%ift$;~A6^CRJzCiAYcT@mVZo1If{-g`+=-v@3(nUMDgC;E-5?)(EOnjS3`q z`oWp7JUppi>9UONzB_$?qB0J3YF=zy4L>37j8Ok5tKbo)W{^I}sS@_#-5+hWt*?C) zhK`s?mus=x1<{W-ZSiliiIREDdLo&8ECR)OhjZf+!EOm>M@Z6sIfCb1y_kwN^jN_bleLCQDpY$~A(sn|2A*jg%*`{ayR?HF>s zcyj&X_?g9=|3lVS2DRNj(e`a=(c%tGiff@raY6|McW9B~PD^q37ALqADDLj1I1~xN zodU&!TY%seZvJ=Xe!4TyOv0Bi=_w4RD!PHa)fId>;6>EkRrU(7XOUDBeWepW7qMXY&BkvL-kk1exi;jsx!8~KX`Xk z?_B^t(Od12!#nDFm&i|#4!9f|5Q;CBa*cn=@fyoxX%ZqT>h3;vN!1B24u(%!_1hlP z*%0a)sd7U?U}86Rr^wTSr}Kg~CWPKWL`E6x%{8jB=^1!M>|1!6MXEy-^)4Tl0yW`* zFZFM4+8R33#2=vE)1L>Ei;h)q{VsRatqD?&jC4aHF7`_$RC{vhWZKiz==(D|I(!VZ zqmD}yqudkZj`$kHW`w?Q4Mopehn7KJ2%b>rS5in!C>53bdNt{LKB7NHdYrT|L#wgi1F; z)_|Y+5r)BXtDBL@Z^3>8bU%37v&bvdQ^;BH%^!^)F?UtU@BESo*zxd?U$)BQvy%a7 z=rk7GIe@r!>I?3K6WQFKtVcV7e%@W=-*D}W8%sLg*5!O$QNcJH(v@p&+q0bn(leg; zVL}8Zc$I;j)t>)5XWpj80pCgT5xgY6x1>JE; z^c-|XBbBY= zb8CoTFwD|p;F4+My=?+(o-7OR2b8i7iUPmbX;96uK8bDgIeRR~sM%6yo}7vj76WnK zNX+t6a8v^#e0Avp)ma3J;4~O6-@wC9TfwBYfoO6Ny1T6ihIvHd<9D3Y)pFSC+eeWp zY$j%TA#1AA#4m4e1{g7D{iePgJe*(w8{Jg3!>_jV~c!l9!c_$MxR>Kt9EJkKz7 z3CJ3PWgR+SN*>(E=Tnud$K_R;v^1(B!7C}^ZmFKEJYlHkM#LICkk=MNHxMiSi|-gL ztM8KudGpS$??u)`E=5KHdj;cAd2%w7mVbHaYe=j6R(N)wu-`nEWBIhY@=DD8)?M!> z4bfJs*}Sh6g!kx&zBRO9A{`WBQD+-`cZGI1qEG&Q2yY6d|M&YA^G;X&-a;)Y z8+5WU(oL^!E-ch-7esV+RU`FAR>Pppd*QA_pU1dRSaPt`iDUU&EywPcHHZs}vDHZt zU`Se5L$x@)6{B7fJrXNQ5Q%61CIcH2*#2cIZ|C;Jmx?@j&f3U^^$$n0`_0=b<57EM zyX^js1tUwnqrcyth~?qDs?t@)bT}4pNdgLmF&n?EqZdbO|E>CWI?aX6c2ybIe;G~e z>U!jMbB(yJQMCvsD2yMlr~InX^(RNTnucy^Jp7>hwMS8_n{`{qWcc>^Wb=Qpe`G$g z4hk{tsmyvUrcrDyZI~lGTgJB7o3XzM*;|)!eG&O56$V-$XXA`fc@R951PfJSa1!C> zNkWXX^5jS{028RbSZ)iJy~!sn*ToeejSXmZBK)>HW=YIOcwCT#Q7@6k=e=81YLTE|anaJz#`;sAVHUVWKsX0Gyt>EbSb4)eZY-s$l>&p+Ukx?dv~da>VT zwcSkMf(V)n5D3-1ZB@Sxse-#My43v-J?2)H#^qkC+aEyoq^Z(4rY+mWIh;yRF6nF5 ztx1>7G)%5qyq1x2uO+MZla)g;mAqK-*rp!_In3s7%^~UyRXs$)UY}Bv1E6Zo$4JFM z*M9a#vhb!9Tg1z9_70_c4GR521RaG-aw)qdWl^O9hm^lPJbAsNV|Q%jmvA_C{A_(N zFnUk8FLfCXT^@!`PKR%gvv@af&=W#oTeZ#fgyCDG#aOjV;dk2M*TnMY=4yxIlK!?9 zxIJCu4W6@^Ywv|3*S{r>kaWz$o2uKBn3sQlt`ly-c>KI%?Tr~`jF(s`)b{c6O-xI6 z;4UYFBKmWQ_sBW3z*`do*~}%7r0}vn-*Z~b7(x z(Mieo8DF3NSBsK1)fkSNb*5npS=j^-(0&_w%{PbyxoJH~B7g6?huH-jaes6hI+0oY z8v~GtP|Fi2732j}c;@mZt;-c%nrgOTzcuvHY<)vLt&7<*CH-1y%raXdyQEBt86sT_ zM5_UuckSs-XfM^tA5F;vyRsreAFK5m>c`{1G5-{Y?w=z=zTNEMLelGYm8e5Z3L|f9 z4m>fBEoHYq*9(gXM~^@7AEIR%^iz0QjdDEe64pMLGn#|?ctXrL7_7u_V(XAI4)8xP zFXU5okiDiba7zia`}kdq!M=M*Uq@_oF-hF4?{$jc`8Sl#3anX%Zq6y9n)y3d2E<}Y z(|r42&{|u;5HC`m)hl7SgTsOTdlK8M#gjOl5QVdG0M%pT-uTNe0gra0HBy0J*t#Bn zS>N4KvaCD=j~22eccTlmSusbcIS!MzB9e33^$lkQ5|~wG;O! zB;G7V`!AnN4{20PbU|?U)g3V@_1EuyWx&k8Swbvp`|ordMg4hjqe% z1bEUeK|{|I40G`e=ndb#zraqa$rQtjR63w;u_deeSip&4*IY&9tG2Z;&5_Z9APR53 z{~>9q2hchoo!Co7CrS`^FVY+UOBu-}P7@>yhZV=`G0!j^!x&%0w~f=xI?fdzhY`K% z*+fy>zeqpqE^KivtCom5dksXTPKRYLHLc`A+j6+MXY-hDF&hBS74x_7i-Q*o>3_<1 z8L#xdz>1}&7jX+(jp&w?Cpc|N%9DBeaC_-tp`|FO%eohX+1TWo=%Xl6R2IBvg!K70 z-q*bO;-&IkIBt8Gp&Gq=G@_lSZ-bR?1My&+6LtK5vj8r8Dw~gEp{vtJ zw%a-duI*S}1qw3I>pH31SR`Wcy6lIT4y&VXzs~6+R;?vYdod-<;Q(7`1e`K zhu+&ef+L_Q8|GD&04Z*jCPmsJEWYjZq)1?R;{$IZ*&3LDFciFpgn67=xL*~u15oQB zpA>tvLMJkZgxNzwIrsdHMgpmxcRgM!I;wl}Ql`Umy(bm?y?+(CvX{W;6VzpPeQayPvHP0^Yt8!6_s-7`2!-6cvnn4PZe384u;m z<6|mkexrt-8=nrts<*3Nq3=mHTe0c&ApfF%czc_K?o{D{ZjLhFHbfrCfCklK+sZ%* z^mOPOHhixY!x!PB=9BFUg`R8#I)hg!yM@1vunwt8sb_Z+s4x?H|2M+%_Sby=r-k9b z3?%Xzg~Bm0Z-T+q7RGv~l+{pBOsox2ywS{Ni`& zTat*-EiHkMAOfDGZpO(0wE+98x(EM{V>y0^)m4E4LMw&GPLEr?I-Y;=tX$F>{2KAh zw=U}z`Cuk7XIlV9zeC3JKO`t=>Lm_zDF%X+D-t71PevlE1z8uumHj+>)_hw-rrcWe zxi~+ZLft0=A8)Iu;s&e}nss*SzRkpoGU>iaYj)|j6xVMwH6O@KsGw5&$>)HRs+dPQ z31P|^p+D<7>p|!Ql<_0-z#^Fsa_UM%gp(=CC2#k1_+v)a`J3HH%Vw zAeLUtcB;9lSe0Jfc_z0>p2+L2Dwo6YBEVP05ilL2=4w%=C>>DPR%RAj26rgL5w14w zD-d_ybr9IvV~J z)lATG&``i9x$*z7G`JDS9T@1sTg??d6Qk&MYOZnX#SiilzaH{lkXat|#k-k&Qz3te zFKZz$NCZe-8}-l^bWQdeSARZa+rinL3vLqS`3V1dZC=g093#zifp>EAWw;6Zcfgy6 zt5iN2FSpOagwyUf`J#3S}6vHAm$3({6Uo-PKu1gM!LWjF#Bcm9ll;(c_JA;-6e7bfL{1-Q3NPGa}Z! zK_}bVpg>_J8`7i}9?I<(uI#?0WhA+WB$Fr1e8+M9Kto13mi_iIi|=feCT8%vT>+H} zo#b(ra}sOx>DgJqbUFc^^WVPp8@tG&y-6#B1pPr_+pW7m{f%ChDQcunc?G6SNu9`& zaWW@0(qq=89Hihj+tFImCwFV5N>^b{9F*lxhnZ_eI#`4g8Qx4*J{+WGNud{0LJF9g zd87@asDgV6NL$?S(v>_Xp{Z!X6$KAH#BQV?ZKRUfaqkAS)D(fvu2uwIKEWGYsrCY6}) zN)--O^tiNWEs8>`LU&x#kj&WNUI(dF=e9Yk>Ni|}L1Ow!FS>MOIE%@r}@v)L;h?#pQ; z&-_~i#Rem{S5oAU_$1<+5WzIg>%M5^AIq8%7KHW$o6TB^%c9vMYnr_Q==B4>XTEn+ zxGHf-m3$~sILJq1;@*x7lmiaaq9p?ZsE-V%ax5Y9ND5a%&Ap(a9BWHviuogpw2NUeG>~XUXRc8w=wPDZ|6(6+urM|z3p^oTmz2Q%-$;e<9R131 z63%N3fm|Z5k&l3Q6!GI&vaT=dCymL5FRO`X{h;Q2yn{=Ap$a{|XXUY~k6SDow2iw8eyK}^Nku!xQUrr0t@<2-%?)1uZ@0HeY3XD8Z#Vu`mW3&yD{w;>T8wo^+UlERsP8bAOZMlUO(gMBQhbi~i*F#AaA z;dHpwDrXERFwYymu+c!%d+jUK{%#-x6B5)9P%FDZexZH2KlF&d8M7?6-v>Y8iBxmG zG|!cV)WouXI6dYl8V32KDwgo?=?EpQA8#y+|0(edit7@Fk3*NIp}|qY6(zzIsZ^Zk zYV9}SCY~eXwY&{QWJ2;XX!t{wh{iqJ2BJG zwpylrP;3&(<@}f}f}Zk88$e5sDGua;l@L)V#wFtD|UxhBhGtkTVSFsMC#4YRt z2~RK9(K8gsu`L;#GQzkDgdN_ffgU@;h@pQezozjq)tb=yY=^7 zklH!3&k4JZSR}Y4_pR0d08=nQ<>W%uuzEIfE2H1L6-_GA3uP&?X>(xVEsQ3~Uu^jt z{=42%=h|`A$KnqLn+ePtOYj7DvywcBa#BWMc99?_KSNbI>R4ms8rvbpbLKx@lmsnP%Q9a#eb$7ut_^?&-^&jla+ zu-D_a89ekX#=`d1im>l_tn&n{Y3h7kz4Fbu^8WCCs%d=ea20)btKphuGUoc|llvWn}t zXqTBa@-f@hI@6ngif1}~)I)l~QkXxq-_$4KnoN!;zy@^^xB9Bh<0dodlkN}pUT()? z?7XR%8px~sg7>8oInCw%S9stefA8m~du3_S96I66}?n={@G36~XZ^;(9x<&}h~N8*uUv#8!gU zC_+QBR1FvntW=XKN|L9uG*6PyD~ZRlH$V=%y6$K!XZpm_2%Y@-`_fa(9BCBUoI~m^ z#j-E``8;@LH_)msu4r|&*er%@ zfVWl)gIbdM4diuDJj%aN5pYy9u=6%v(cQA4R3|E_Vwj7dl`aJl!f2Twj-MwA)tDPb zFb!Q3vo42%U5y*vx{sx}sqi%FGoGd1Mxo5xOM<%P4XL`s(f!_ojeTod4Ve0ZrLFD! zB)=_^+LACPWQxO$GgOXYlAT#BrN>h5R}`fBwT`YQNXcbyuuu%zOaOuo<+n^2`l2*a z7qr8Q<&aU5_0mD6UuE}{^sNT@%~-PmuQO4yYawrSl{u2;O{Q+jO{hJJeCSSRR(E)8>#c|4#Y9; z)cSl!!^^Th=-Vw`$o!^Q--jTvQ$0e%ANWxdWz3wxa*)z$g3pc&@RaerhttY+Pjw*U z*mZrene20%UolT`DBAD`Y3<(Pq{!vI|LDp11YATHzV`}6mo0fJIM|~)^^+v!&uSoQ zLqpM09=l0*zLZPI0-K=#Cw-Kep_;c-a>)YDJKRrjWmB)fJ`L$Bh^Ah9*V+Yd4nSJm zwYjoOk|^=&B7 zNS}X=KgG!s86J3M(c)C52Br*#CSu<}!!9UP0F$2kyZ@1ed8q;>=gb4N!z_fHn~x7_ zZleJRaX+V3&+^$fL z_EHbv>9X2?RTBG)r#)Tx>tVP6Jn(!hq(y*LB|~Dnqimxnfo+PckG(fV*5e*MeRI%x zlL-fxT2eUzE{4jSh(Ja`t=!q7>uUA$@d-|n_B-%i$uNz_t7+kIdc(H+EX@b(lf7&L zs^NBS8-`^?1y7d}QB%1KJirZ9Bt?PB9@a1e$-^w>rWj0umZr|DwRMw{HlR$GH2lKxQtIeQf0?m>k@ z;^F&gRA!y0pN)JW7%$+MuaRTScY2 zb_u_=^5(DmkV#DT6<_OUPbDPVgWx}6P9uh&&+?`yVj0i#UShp3{d3fQM_Nk3S!duq zHS-@pqRE*2r+{)$RoS1FLp9g6iC3ZLy2UZbHs7PEkR)-8U&YAwgk(nxK^T69Vox^0 zitoqPe~o^v!{0dyRCG7o?bzyh>09Yhi%55qsz>x$BbU?-a@rezHA~PJF(4dv8++J$ zFzkE^dDRi0?Y|JKKe*ncP4?ZR3Ml-36K3Y+ns6)?aJ3$K@*UcZQSp@1_wx1$;n0rm z=swxsYYM+Hs}U+`t0NW`+8@dnLG7s-mOtygVWDhEoz-x0q#OrK%Gl~Qt7jh*q_qp`+POMgZAoEXc{tPUq}R1~ zheCS`>v~uHs%ohAV1xeY2-RUEE7V4{Pfo`vPs`_>Viv0?u-$(v-)@*{^!oFpcyraY zVzHp)xz zzx{gK{^qtp1nLWJ>&(QAOjk(tqr_c%p+dmzWs8#)c;aGnx6*ZzW^i(EC!c>DVwnvc z5TpCyE_8S+I#>l=*DndKSIcVm*xu~mBDt!TH6%Z7rvJ^POKXr#@mV9=j~id=9^TaJ zxA)Y5mnd1t?r?X;)#k;mmuo3`^5#%}Gm0dUEn^=p@7FSeX6y^z;|6EmW4W2|%+k4E zSS8(i4^)8v{^s4Wk)>Zazxe)KfbINho6pV?OFHcQAj9>@<+IKo%rjpathugBSRi9V z-hb_FNgI%9LuZP*-_HzM7z2gRYgYdP{$1Q9#;th!Z$2^c41tQp(k&m`k0cH4V^`|Rr?cr?gy@e$9ecn^dqbY&SC9*{Iy@%Z6>W|cYv4QC; zG6;_;yHsZfaO3kPV3%34ZJmbq6Ox{k@-_@e-umLp!~#2AB@1d&<9lD9X^O=uT4~n0 zpZSNdBhC|XoLy{0eBNg1ZyFnxCkaDiTg4^~Gi6m!{k+?l?qXTtseT=tweue~S&R;9 z;F~|7m}OIGgD3I|`~FhqZ&}27-|nxF-C^9xgSkrcJaXaIih+#B>GGn%({HFVGa4!; z3LDrd+g0ClB$|yytt$Fg6q)(cYRC7vUoo-p|H~kYB%iJRUe?KF$x?n#8H-PmBxt~< ztn%`o@X|A1&HmjyOqxvZYCApWnW(;7-CrSKK898KXturyl*;HpO)t;|8er7VE-tJnm z!e&kS0Ej`FZ8-3V_h0+|@Ljs@cOr*_gE8{A%OP&zv-qojE&IP{gGcoFUf87>vkI*$ zvTKG}m4xhAWwwzA_#GdAp=y_EjH80Xla9F%F|?akE6H_GYt{a*-G@!^7#c~-0bFRzN}>Pey1 zA%~9_t}_=>em}V4RAH)rU_Y+BaMHkl-Yl6N&CHN7UggWLTltpqC4i@471&A9@mYLX z?>$kQ&5>T@B>U~Q{b}NZW}N!bYBajsF`cwzZ~q1J^<)TZ{Gr}DzWG^W8bK6@Ikmzy zV}2qs{>@Ccs4%YyY^ZIpB#AQZLWhHQcMLv6mrOMfz8bN5HritcE+&Kiqsu$b=CkTq zISQngtX&KaZ*?W+0h>)5g|gqoBs?otr{)A_-ky{Ruo0w-nkfX5OwDDzI~bkAzPULO zJp^U9S5;7Mm4wh(P7;m37zGF`1c?Zg#WG=gqg@%mSpl3Jre~F!{;cQgac5+)ClrL2 zBsWoBYGZ`+i=Q>hQ^gy*g#BxYT+g3$f60y}$sT!^Gtx=xsZ;SJZ>nV{z%%^<4-7+s z>*Z((z(pkN@v~VtK^ouaEQOhZ-sINQ@k4&0qng2hFUkFstWcuL%*Vx^rg7vWB!#q6 zNit7KQa_&dmi+^2=L)|)KHGi@D$!@QTt5ETNu9waRiLcS`Jq3x7`{JMpfptgP3C(( zqzyx11*;eqeOfQDVA=Wn8!=n;O8P3SnO6Vt{%G0ZhleH-cl5i6#U#U-& z1w#?T>Pef0VOty)Q;4UxEz<)$9c2WZ@&hFriuPi5|K{`B0&jeVo1jGY%WKDP%=u{S zLxe73%o3!1dD%jN%U!cjc^j=)={hzjLj2G z088T**Th|s8z!IbCo7+yS*ry2U!N;lytr<59f-|l=Q!*GC9e<3a;UtB95%~!ixS5+ zOZ4F%OmtFD>IuS1;p30Nf zyOR%)uw14(F54t|;eA~-@9)}AL^|~B%=}4N4ft85!YuL{)ASmelBIZi&;Z4%x zq*ObR=MjBzMgN`6S9MezA}oN^5G%J1ZI?*zL<2FQ|ie>E~0I8N{F zcDdWz@Xa#`hB@9l>YHpi&0dz%dj+5Re1%>dt&+NU`D*;h*6e-JpedH6c5y}d(21JX zz7t{tUJGo^S8p;cj=ezMd*6f`Kcz~Z3YI^9z>J(lvi;5?TKPfR`Y=^DdZi9*1GGtr znrh#Fi>V9$jpeXP?Ble^yBfHTalDbU(IVL%$a_#bM61?&%3QCwBm6VIUpn3#Zd^S` zGy}L3v8#3x?RtAX(8LWpY=gg3NZJB$R*Jinz*GX$0!3)pY6T=^BZ)BdnB66r_y5;Aao7T5tnHfzxQi!1opZxD({ zzH3xo!A5{ya(OQp+Y2#W zJuetOCx7AVx`Y{*i=F?4*a+m2B_F^vybIjZC#MEF=9h#(snP{5dhBQ&a~`Fgd^Z68 zdL1z+BeJ6;aVBHj?c7onMN{)yg)<9=Q6c?XWAKv;$}t+HTN26zz9Kx`tg{mY#PA?$ z^&;qE4*%>-EZyKxv266qEdTXuG@a`|zVmgtJK4+lII?=#TLPj_?81?3J!n$j8Q*qE zvv2(pgGu=uV90cV0OGh6I@9ANwxWJ(MF9wnN^zzp_ z_S+ioWwMF>6DQ@oFyS}V2>E?9$J+ePKX%$nyr) zHvx}T>N_g>D0CmovAVH@4NCsFN zim}L9OpySbCrdP7uq`RIUHoS0w2S8jGL5ft{9N-HYsa>LRpI02~42{@TwuY{3+*dfO)|Dj@M&wXr4OTnZuiM76aN$lMuxpDKnEU}BihWtzF)6YOpLiYtkoOP$DbYE`NZgmNm z@GSFjF7;+ApQa|D;rc6ZvRCH+%>n=c!AJxqSI2s__y$zxJ9jLViMwQ!n4&_?IZsFZ zT!Ik)6{vZY%5@d(GuB7p%7z)iv)gJP z_kahI!moUNN8X1Z2EYSk@-OM9bY%;g4disTO_@0H21lDE8{jW7r87zFMiBaNk&3Y> z@gX(;GUU*hqRmtFusWyL^VL+7;aBcXPIt}|OQIkK`ugN*TchH5Xx}TXbGLk|Rik(UY zG2EQ0dcN4no`YZO;)?rfrew=_sv-((*g;KbtaA8jhrU%{p-4EjcN3*Sx{y9vxRw;y zytxAMqfJ7t$sR+%M$POg%H5e>^@9>VjwELkBn9xWV=3dtb0d-q7SIjk@J+~%qE~)G zWOO#BZ|B*Uq4J(KBB;_D439YvCEU{qL9ojXVtxq*XXFh<-E1nqsPPsg8$T@Bap1yt zIz>%U!~vU=QlLyx;~)_i_KuRceb2k|)5-x!CP}+zp@JsG4ZInf!>%%lysZsJ&Ml1O zxnNL+8k2K6PLj0r!X|F7e*_p7EdTSJf6qM0gRR574i6y$!O~}}iTXRw2j*PJP}F1& zeY{ylEK6}mOPy@wtd5ary%H6)Z+t)=(P29Hou=C%8-e#a7|#`QP5?Jv>Zp0aK+jc) zi7H-eme;15)}O4xpth2@6-oc|90535)Rmh})$i(XUA*M#`0;{_XL^BC$Bm}$Lw)>b z{rFogjqB=|)i-F<ulT}I*Zhg+?{P{{`NkVZ`=KTfw3C*XBh<|^1MBnFtGK4+tySf6< z=ku2z658fuk@upO@P8JIbAc_k0H~524NlIe!3lEak5L9DQ*yJsvp)UywfoZ?>!I

C$;4g}(~H(xrk=pVzmNVJ@AM=OJc}E~ieQASy+Z?=Ham zgRD6wAZWd!aT68`9?5Ov+jUTB#m9G+A;H`ooTMRHI|6dwhNvfbK1>8AFQ)0tS_`;6 zDSN}Ww!>S!>vyxcZ@XhE#x7E|EDOz#wJZtTAw#mbSBN`>-HI z>y~p;0|1Xo!MP<~8IK!w$bJ+)1z?nfinEg*{?26l!DEoX67QPezseY3&Jt~Q#rB8!b|(~a^b*$1%N zEb)({i)YjK=i2f+v}hwvK)Ocb^@dKhFze{<~#;J0xYBE%$4WrF<;z;(*7u zR%Kp~t$p#5-`a%7sHL3F->U-|Ql;4%L}wxk?n+bYSjrGb6_j{(ypbXfGT1)1K5uC@ zvk6?({ZxlBOd;Xb6_wWDvk-fT)^*3swQnkO3##_0LJB1_D8YHz{_PE&Zd-%VL$kw| z)Da$?Y>s63ns(Qw=3R$~pitCX+Zo3n0r%tHk#Yd5foQG-$Zj%Uv)z;h-c};mDvgzk z|73j2uvlP7`UK;@;G+^MIL}S=(FAWuGqcTSeFhfsCyfl7=xF)&>?cKU_?1OoH6sbX zX%IHPyH!CoBTsN>Jcl6d5I97I>OaItZj#-664Yo}pPW3;=Oq5ks$VpI3Z3&^aqKG< zn|Kn+&|ZeCb?xxGdO0El5%3RCbi#N3Nf*Pz{fqMp3K!ApF*O3(tYPb$$dF)+{oLKn z<>>{@;jyqrA1x1~{QZSwrDk2l?kbWu4THvV=^E+&4g8M*-j_#1hZ$Q7O~Vb287_y* z4nJKS=v?C5z`M0srfFJ={$cH1NHL{M%c*HDkf76g>pyMeg1+Z!s-mc zpxL;s-Eo$Sb?v*8GPGa4)aq!CI+E%2U1VB7wmm4El{{DCzhHQ=PebX$LUgzNt*KB4 zFm)wP9?;`T)8k6_r-W#2y5Op^%a@1ybhkR>k3Wh0Z^)}v7Toz8fT75`mmJV??>~fiGS<5Pkbx;$zl|MgyMFPL_ zyV^3hKN8=gAfmKe`E|N3@7b3*@6PG=$Z^`O&GtB?hC3Q{zp) zD5KF-RzuVmIur|}#I@tiO9uS!0!I)F^(IIo?YxEC7wHO&kGM8Z2OPjruD2~|ZBx@k z0*UAZIS1p$iL8CZAo!YlKQbuGueg90egRE)T#|fcAWO^{p{(w=ch3fF_Z86pUe%zk z&Ymon%D&;ur4|>+9XB|pFfbm0D^>d~rqv)+X^bLLk+n=K?4iYL=u@!2{M8v9V(_3> z-Vee}7#`ixtQ~TG%=Yv4ub!Xm*3L2L(P|dY^FO%EpWB-Q$d^=J(t0}yN`JWH7i)Fj zXOL3+)`K{x4W%+u%-*{0#$}hN_1j2kX+1&03?76=s0tgyZB)boqvdon&dVb06Zb~~ z+7u-ZrnZ)oG&i9baLLrt^QWLFueXCwcOG$9>ghw24%Ey_XKA0-I|WOShA3576pz*5 zfQ!!3djVggFpVM%SVuoG*%ZeZo5=woRn zckl0gk0HUw^3MCdJASU2<)XC8ju}eI=1_y`mdI5Uu5*?Z%2F05LbisF z*p-%EHsk5H`(ON`pGTuuKu@uXl6D12P5wNfrbC6t;9JGaKNQBdjiPlql3Y`4)DQKK zH;{-iXYx9q8a;`#YzaQ$2RAbx^GNv!4XLgPxwZ8AC4UQQ3?cV?n~#v?|GCq;B) zA&nJ){pg*PrW9{Lpkp4J63xCe@K_ahv7MkeppkXW;eqtb!2?!-jTaK78fyB+mH;P( z^8I&4qx2^@DM8|6U0 zj7K$Kck6J_{bXG%u*s|cA({GUR^WLmi=34kMDEwVi$)~(q1;r$bwS1o?e-qbD^xu| z|GhUv*3+=j_G2ew=bDR?erq9^#^49fq-Fo{GU_Zhz}T-fiE7GqquvvmthptOP!@Q5 z@!`VLuz9;3pbKY&yfDU+OKn>9I<_`8zV1mP(r+|B;) zF79e5*Qbjp15c2bF<<0}F0U*n^~rbEgYWX)5;MLyiuJ0pzfX5i^J}HcK<=~j0kjUs zoaomF@fOj_2@-M@5q}He1589Hc0vi(EX4wT4rUY=FJ9>wK!raJv8m?iZX?nrka-iq zl_X7y2~}D|7{FnNjv?x)2~saAeyp^S8~eN)bb5y#_*dlD1n_Ik;0;Ien&azN1HdoR z5q(=z)@rZXHpWf7?CT@s7q5>JH^c+?c=PX^mw!LjZVvQQtc5h%Lm-MpuGpXD-@;Y5OF3k;^h&N*|e{kks0G1 z-rPK7>x{p0evGBUUko9FYqFptN~AV0KpTy3?upA=?*Gkoc>fQ`KgnW)VJorJznZde zgEaobOncxC^t_yUd*8^(3c+%)!gCH~EL9=VD#!R)z^#T6=zFvP$#VMEzhL>>uEyc* zCG|-5MEMlXUQTl9S=5I0g0rhZgy@?}aF{pyhcL-jC(GG(U2JFHw?@7VWhz3UoP~+c z$7)pekNv%tub!9T7XO-$`lXO0IQ2Si#s)@iDT{S{-%51X^$=o7RNmVJR2x@>>T)4o zq6S>b3JobS_5ul>EMCi0j$Ql8C{mF+nvOcp4((S|?I1mp`r+hs+jvOErl#KAmgfGs zws^p&jXjv>PNL}MDpA-?i*6JJ0qGxI6 zgS}yfP%&dxC>Q1rQ-3L-z$94TET2l2I+n)lEFF(rArNvM07ur9YP0se2TlI~70N%Ki(ZBfp*H#6H{_RM$ zszSis=Fxg@@Ld{EmLyNbg}@lW(J!MKsKA$&3<31FjyWBvz6^yJ`1{ULr4O*f*101IqeCk)f|^fCFj%uOWXrS+^KdGE0N*LcWnelu z9A>jqwfx>`43dYFML`90J49D5maUiD)9KkN#cVLEm0bqSPji$;k<|+7l}aybl#-H_ zSzd$|>H!S>-f?fAG}U-toI`wYjePA5F3l3|e|;qRk_`E%Aj4JIEoV0%73q74u3!5A zwBa>&tRH@CZeTxSjcxTiCo)p20@|1bQw2vceUbd5vm3C0;yR+o;vy7x+K85t= z#vLkkVk2_4Y)qO@i1T0-GEKK7*6fo?Et|bBN&XgG(Gz0Uht(9~|{E#L%x{n$VAXWMLSix1M~= zy6@GE{Hi~iB56cS=kX>RRXuOJQ_{NH4*?Uoa7*G-k-RgdB$JW66LP7Rs)7 z9{qQLN+vw2f3{+%#Y80enEkGN7)D{wioWXAFDR8t) zq#BKOp@K+zKvCP`Z~#4L)79glk*K;qhe9gtXD!*8cK7p04T=yY;Z91)Q>i>A(IAbw zqqIu10}R_~`BZcnlWwNOwzIhX>%jJyv3~k86b~bJ@*29_X1$<5w2i~tPYwLHP2mbK zCY&^m;rI|WOfLN)YQtJTS5(zr?PW!x83z5C+VudLBn=lCq6N2kW4(|}7RQ*y%ZnbB z!GPJK+QhSND?76fcBF=-)LV(9-U_jTZ~06wmQImLFI-j+;j8FT1lX=p4FK&()S@)t z!LJ^}nN^CjDxpt0Gz3{Bn?_4LgcltflOBI4g3zW+%31vq`hbbyJ*ovN3KFdci=hpv zqdpclho^|q;dfIJQPI0o$w{;IuN$~)l_6~JzQ+wzcvzSctaH`u{qa9UxlG{1n^~Jw(_Ha;d(*teik?x>L8su<=Jka)Fuu7`t(LOtFaTw&l zdsT3;f||vC?xNUvE}Mra+%A_5e5aBHFkr?XQ4}pBSnaU7>A?-Yb9mUxFt^fLifyd9 za?hENr#`>))UW$bKG1|=<<#QidBUNxCe^b?gSXxTuRU+y0xvha0TrN3KPI$7BzI35 zpe#W?Q>=ZfVb8+Cqh`8@&5Z0(3ueV3z3rx$&M3=Eq&Wx+jf(gq_3_f;3S}Yc)%vir z`A>Z&^}7z0`VS5!>C%~4rf!O6R}4niH4zhqM0LF4vvm|F`(GPVI8q2c?c{m<`sv3! zbFGjRjy?=(mp%1;Q7v>f)8WcccPDI2utL&soSISctX>=ZQrF_;o*Ao^Lg>>^1zK+? zbd`HKxxuhx5={?DR;hPyMNNN~B^0ScfrSIz$ zO`gdCFy55fw!$;s=Z>w!zmB53u2ym3ZhMhp-oG>{9eP5B2Kg8GWDJ7TDD~35x2TG> zU!r00j4Z$73v@`Vl;X-dVLfR0jA?bVcSUro;>tJm16L}?MZTi%!1|wM^?%O4COfb)|5{$SW`5Fm zl7%<;d!$*?E+KFb;mL)#S_b)obN&x|Zy6S6vuuHe2@ou}LkKQ|JHg$Z!QI_0xI^&Z z?(XhRLI@BDF2UV{yWN-XoW0LJ=l;6?FV8$AGtG2Ybyu%iU0rW?T5dbKMf^K;Q%NM2 zvz{R;tc~UKwJa3*EJ)E0Y`vIv46nKBaEa7vbgU;ZW(FbfRJCA-b!$L%?O~ zdbvglTD}r&nMq&huU4bGGUvhTM=zQ@NZKtEKe6LY=tuz1Ne;hKdYZ*gX*$XGjH9x2 zapG7qWK)4J(p$UzbtFGU=q=vknzRDcAAKWqQ#Zxow>FkD&dygw`#G)?O|| z%}|cnHyva@?*+gmj+BniPX96>rvSM+#YW$U%&A2QyIQU{w z|F#^UxbN`2_U$62frKzj29?V1Y$q{T)i=;uvblMR%ryNDRryk}DkX!!GhC;qT3KjC zzav-*!;-)QloT9NmBMNT%27^IWh}C^IM$d((WJ5f-v;Lc_p@+Am$lN-L$^3-mcp~j zmhNGqS1ISq4-&Dc#S`h~0~g?&X|2PCe5XcX9}0@D7hFQBC(dFMCHt0Xy@kdt#?{H^Pr@!2%jjwS$U=q6-mV^nHqeU zrrE3=GM}?E}1LIJz$0QV7lL@Bp~2RT52&JQkqCiPWTQ=WtasCQ5&_req2( zC#h|%TJNQy&1ek&K*IGXXNLkWoou{CN|0t~&QieANRv!mY~r+X*@3+M{1k6Qw=2x=s!fU6^A6rd>fhkZfZHN*2RXv7&KM-6*grg@M=;p zi%yXYMVUr8A_+}wxRjLQ`Ug=oZ~q4CuXdJ$AzI*^d8&)`K}_OtFevz4*fgB63^H%_ zd~-qlebw7Mv_-fMSu4;hfo`e3 z<1~Wp*J&fgU;9ToG8U@BI<>S!lA?W*6(_b_03Fc4#- z;b1VSLk*&X_Pgp(ig6tzPcW#ehbwm~D=JGiC(!s4J33q;Sz*aUDNvZIS#FSn9Zvc~ zAlkJ9b(5M&RnxgsnC(0lm`CBtI{8T7f{RFHX=|)KrpUn24fQD(aDOaCfPQre|BM_g zox&A09zF}eHpmbPwHFQ*wB4?HbxX+fh=D;b-T(V#7%r$@yxIWX#=|Go6bU*5Aw(go z9R84=EI{qb2#cvn+mXTm{)QejpB_6n%N+uZ;#QZlKGjbruob3BAx9<*Ll72+TV!Ny z6HP%Ei$LsFA{#KO-N3s_2dv?O;osV5z!H4zgB8SV3PQPMDi%YV;XooVC`)?p3g3Bh zD<9s+H;Zf2EJdcKU^L@B(3pd(LX!%!ZU)I@0|zqiD$53;RjOr54v0t2L|`ye%70Ot zBGV~d(<+kpT~q#^ZzxxI$ z>VCM!bC?Z^B$NHh-q@x@%5f zZx-C^@Li2U5CeR_Orjx01Y8##=p!?ecp$zOy8=r-HO5vp8punk za2y0o$B1=Z9gzSeTojUM&F;%bZCxKRh~hl9Hr2j zi!zidTl37T`I#8BnKB8T@EPCPESRSDYVpKbA|r1|xm{&tGbvm=x685DQSai^KUBs7 z`9G)(s7038AMLZ2P4wXS=kHNPRZ#7!`D;X{f_?Z$9Qd4T0X7902j=K2m&$%B$6Qk1 zl2K(ij?|<1%ars*Z53%DR-!4YRH!4ozuD^ae={y8{wf^-(lx0T!&Ay=@3z#qFaiY4 zQJH>zV;>F%Han8;Zh*}Wb+c8v-`%>|K8uOQCvH=T&Wowe>NyX&(%L4~)YiKW`=8q0 z=ACEuezUU;0cihNE3+V%(E~I->}A!+{;%u}^ddu^a9fMk8E%H@`QqI&k?cQ2Mm;tH z%c+Dgd7!z)F>=Aj7c)6y6=q_e*`@6a1ICbY zg-Ts0kIk2H;F8QKV7C`D{9m)ni6KXHg>UnW%-24$B#mxO=>b2UM(_gmqn5a8_kl>kWCJ+QRS z``p)dj8RLUr<~-a`*PzE%?tATJyDYw_^(`m57$hJBV<9@s8rw0zXd5mfsRFU!%OSR zEYQyb1ZiKB><^)B`KF4b6K|~8CCC)MVfbTHd@~KkQ8gL&Ig-kG!=jkhn2z4JKh>Y zWuPrw^mwLPp~wsljE*p%V*|ox@*_<6D?`NZ;9OV&ipdck9ma>=f!yY{;dv7j_tAsE zr$k9Hv3Q0kg1J-h^ZAMsg%Ws}d4QUaKA7C|?_X^q^xcQ{N1fN4uS@@O5jQw8@P|OG z%s(hl1nA)6%#7ke&30`ZAeT0!1OEsU&IJVQ7-zk~bAy7eeP;&#!rEQA|D(hgxb1y3 z)E3CaxgHn%#vSG#4WA@2*Vw{X#+vUkoQ{T-C7iEf5UD&|1RTDe8}`|+-@FmS`HN+$ zm2e@HCGq$tX#DJk?}SDKUuc!_i^KobGopF6)={ z0z*c@Tow5FYDH!PL`Wd8o!$8)h>TjR4-(a!WRg2l7jYE+MUouMhWZBd9-ddV6tW`# zOuR)^$gr)AviO*-@tCg9-ypDUTw8vnN>CZ{B3@Lf3$B)f%|~b(nbJg4{g#+gVCsC{ z3?L*nIDy6o@`{n`-2bVZ4&IXZ4KzNwMV=zfKXbW-_n|rqr36?j#pYsY!9!;!`H#Y5 zU1iA(q&ZUT#~oZcRI%t(MXAvmyPj(V(Y5F8Z%uHEk=wy~6bk7j{BUlJkhDEkvu3u= zFFPNF)Xj!K15#H}`sa8?`=a}7>@sG?ic)@s1<_OGsv6xWE=}*RvlmA}XpL3(OK3l? zR{!iUkD~_M7rVp3^f@r=%32N0nM&^y*W6#l?(oQK95uUt5LOX)v1|3n!xFy~l-=|q-)Zb`%iHe`^2?-( zV`6^q%^jw|`XUw{7L;mtV8ZtF^nD0s0;ROBIjrLF|Y;lKc*`=@e{$@t; zQO9=MOKSbeY?=?FVgMS}A|g|sm|!j++{0_z>|=(Qd&!J_eDCB?B#mU$=kt$jApsYkbW`X8@^!J>(Tvk43; zFBN|6_|+}nb?+9P4S$7;mq?o=1vS-c47IcbRp15apX#;v)oU&_NHa@1piKW5P02MF z1y^Ywu6%7O25vrCu}(6vI0QkdkvHv!n9R&3!LiYf1SdXw{son(GT+Q)VvVSPTv4B& zipi<>nsJYJI=7qLRp~^+#N%FgLKjUA{gAy?&-cgVTg!5!2?dq?;)7=L9-5s0kDvTF z(5v|6+du4FZHR&GWRL4?zZuHNH;9EusbwHKKxxd03g+<8$W_Xc=!Ff5Fy$(mKue+; z7{UmmPnK&6qQCtrb0|AZnYI5`84eYDqhAorT6rM9%9iY9tx^9f zTWFJ3w#elaqOy++0HC()PhE(KJ^Gn-WM zr_D!Mtu@7yYdth9pZQPgKJh2R!)*sE9713!qya?o$WtS@h6W!0IL) zX*Vf)o@R{1x7<E|tO!}(`#rG*?JL z?+}I{_`CsK!MV`nO#+wZ)G?gFipXM&81#tEAm<9GSm4|`%%UTf z74AWK%8ZRcHG;W^sI^pi$~=>Sy4qD!Ry?F<-|vO{MU?RWj(qjHNvq5Y+i}hwYIF55 zx!@1i?h}X;|HgJ|`7=26qS8AZtZ=!&^nTa)u$7&BAu*@;oWRq9zl26WZkzL@YJIl& zku7O;T;$@D+?^%3$HV@83&(az*<&bC`ftm%-DW6lP6f83&=8b7)DVQ~mkb=O>sl;v zNV~iZ0v{Ae4dg}zp%ch-sa3RmHZxfMvsOJ$I$>1xJPmzoPlR?_C&4fGp=sw~GQLXA z!;Zg)BKwSG^uf}K_SQZEDI3L`J03+Te{G*TFHphr`_{YbW(gZmA)jR24gtLI0RA5# z5S+^gP%|;)OA66Oqn44c^L{#s>&Q3k@D{$uFbyN*!hkmbXbQf8b3p{j$;vnT2~9$H z0j_%Zy?7jh*x;468k@(tMlKq@4TtN3ef`Tf0lTufK!l+k9VUf=7*d({f!tqkj$|AN z#j5w*a$FsvZM}s8klz2bW-h?*=~8ioWWRx;eNCDQfA>!nujNNs057q&cn42B?g}@b zu2^@2NYVHa?#*i%@ZCM{S6=b2ULuBYzZfBSL4#fefCB#FPs)FM8}K-*h!mgS{=1Yr z2VjBK7#YF}{{Bg?gs>;IpXgtzz6rPn^!j)25JUdl2*a=ZBkn)yjZyvY4!B?}u9f(g zLV~$Iuar2{?duzmZWvJYb(dlw=l_&mypjX%I+{ypI1PA6Mk7U0TP(Q#qZ)s^`rWOa z2Zx&@Gsouw`s}wgYX74Qa33QYuwruz52iWM!Rm+86dLSR@ zRck=VTC)G_7gfsWVm7KdQV04qt9GIe1kWGKe>D4_UXO}znqknH_0qAjd$QcZV=ANL2iMvh<{ zk$4;*G-KwhYMLf*`*W0I+a!bN#d_G+K#3+*joEay3QvoKI=MJly5JjQR?Y(CLMwZ< zoug$*AkilK&FMRSQPB1COW(?(0x$N5xMp|$>y_siu42)gtiD0?(zUt>lACJ&lWLBW zZ0;AKHof=4MeK$o(@>z_X@X4)I<_1c6;_q)!#b*(s^y%?m{!go4-ttD5ufSlKN}4D zDaJkIP8wmgY2Y_>dSQ9ofGMU>)wMH7)sdg*Kg9k321U4Pk@I)GG(Ny7l!OdU#**28i$w zKUzk9OitwOmrc^On@k_YO8$a~=z`z0OBmbq`37JhMi9kXL{wsgqywDI=`(F+aw{0cqs-RM)#}`mPvN@ojR)S2#B40yWRBdX9P>sB2pT+U=GB+U@OK^H#jPemG}-Wq-1rgHWg!V18sT z)KvV_s2riHd|I)P6?;DloTa3yX~~vBORq!#m&AbDDU8$p0czxnv}#dX`J|4np027{ zH4`M|uwtZX2O+CXI7qWCZ)_OJtU?ucR3Wub$B;>VRx7DbM>V6_Y$Ke?YKFUvEuGeS zDjK^q<*su3P&KUPUl`yoh(n@iR!z;S4p~#vRaH~9PPQa78zGGU5vEdJTSjqx_KpmE z?Unh=^=>a^;W2hnhmQhH3$viA3;UC%%4I*Rd{;h-_9{e}TFbux z^02!=n+xV%z)kBSIj{%%q>s>>m2+g2k8UUJ3`;w++o|ydN}+Fj^mQfPTJwd+Q=mK> z4Yrn+^AJXE4*p?PMH@S3HB!<9MK9ZEs;}5W5`b;gf^EH*XT7Vzv(g{jHDzJQSv6o& z)iWE~#AIlFe6n}lh#J|X0Sv0??&{q=g(Sxx!(`9`rlh0|5*#F zt>PH@`y7IX)xl#jzSfLU`YENZ=rWZUctVnj*6XH_{bH)Mx=Ljn`-iKHL%Hn9F7_o* zv2L&c*4B<9;LnKAa-y705hRtCUQN&NM-@5&ZygwgH$c5P^dXpX&2(gR=NvYvlHbZb zI(kHlHAAYgh_}w}aB`Hba;13oE=+3_qx4-{TFvOgez|rAl(N0b9I;}J%BXkK=rhOE znrDVh10Y$sCu;iLp9y-)tQRwU9eb6-$3?HIe?E)hqxd!2yX%i8jO`@@$kjpydu;nQ z;7>)bO0aZM8~PLm7IuRk)-V`Udnn=nY9|+09nY?nL_aA{F4j zjN!A7;@>zLyj55<<;irjqJoi4&Q3C(7{;0qA;lG6ps8)CrEIlXiV_f9l zuJ0emY~T)^ty#);?m(=4#3uVxKTrU&1^rvfe|#)GIZzo86vO?u!f&AeDaeul>fEgh z<%5Fy-<6IF11?Vs4k6OTd3)0w?GeZ^`a&FWP^YS2k?`xc{S48Sk8UlhZC>OYq3$ z3+zyjodXIc8#R={Dg^QWHhX|!*#l#A#H|2DYyZ1{4^G{`jn*#T656}f##5#9{w#Q@A>e%BRO3y6OGH)UrNeiJ;5 z;Yj2S1#$!OZ=}g^+N!g~bf^|)9uS`XtCIr$ise>T0y&Qht`-Q~;tI{zc${7T;d@TMdnwJH_@qg7ne=|UU15Q@xQnO{(=~|lzFADPP61Rp_ z(5jY8CrM|d)PSk!nsI?AjxPV8^HHj=0lgN$Ad;KS->2YwNR@e_yCWzfaR3lvWt=S` z1h{z~K(;Fehvp~Mni+JtNO<&L5YMXNTzVFZ$SC|Ip&*}`gJ}v+*E+SLiT&t%C!c^n zI)&xW53@Z|=93#34TTYzVX?AB;#JrQ)B~`;h#l&V3s9=wg6Js(6RFiql^KQTrj&aW zk>TdwzK+SE7tt}Fq*vbx&l^A?TL7#Eh^pIXInY%RvS+PatlkS%poT~b31ur)Fdq*8 zvMRXC84Qs!ufP8L>1H>%lGWV#FCUvlqm^p7YH9D6h$I&B*FGhV`09E8{XR+K$I1gD zP_O7K4B+AkyAm6`ZabmY*m2}kGeX$7eWa?^H%V@f7^~!M$1N%#u+D~McR%=?h0mW{ zwa4f*Tn;i!Uqr)pmRqY;%0{9oRh8mg4^r5z>OA1a1p(X967BU=wsx8CrFk}nW}Zs7 zi{qh&hCT`gR!amCEO|77xzVq~H57tlZ?-91q@i!c>=RCufn+vbIxG|M3r1|`5M^{X z@rLslE{BEhF`8!BzGs45Jj0nttyBhyTeob*pRu@w7BsE_G?ty_ullw3a?IT99oErT z01G+9Llr;3&7;2Btt%R!P@`6txVDy-B?BG3SLGbAk zFSP7N0!jv~;_MEyoG~a)$C>{}!5Nq~=DhqVoYKa0Wn)WC%O-hM*OOw+s&_kt(5SBlQ!P z0s<3qj~*>$&a{sN{M%kzO3av}Q7k1<3k5e%0_bcTg_OsQT1x^9uFWB7l)ym65C=Qy zYbR(`RZo_VzAUlk$d4_yZVx9~3ei0~ve2d;`uQG6l)nkTGYn`GwTD>Ggurmih5yN= zpx}yk48pZ4+7+}@Dd}w7wt3~`HM!(9g6a^X zNrN=lte8^Owab>PO~hksWQ0~+tso~o_#GV{d5Ta@wT7s(D3;w>yBUKaJ}js%0;7=k7=7! z$=up+GT6LH8VO7{5HxqV|CJE_?UhhTe|D*oT0Tcbgv`m(P@BVS_N2!eJ37tajd=LoWhpjzT)ZL_vyFqy8Kpcb_|KU-4L1h_DgpWi<}(;9rF$j z7Vq$EqQy+IK(u(lq@h~=j0GEe!t~jK{^y_PQS_l3fI;!vgSd}OYsA^jZe2xc7??4! ztPvu>=NF?W&trTZxBY`3!^5JZd~Ah>GY32*M8Gx6<&ZK%%x#a4pXU9-fXz-L5hY4C z;P|UJ!0eIRWSa-}6SQEwEDN@6qXqzKsw5QN{Jl_Jwe0+tdrgMQn7REbWd{3h<%7S8 zxtdPHT4ALfgF6lL zy7sM7WVV>b?~<-iv5Y*YRRuSce}6nR^j%vYxiA;I^`txx+5My^#a~nGbKdm#(xYL! z4gYuBcC8ojI217D8<|;x4+MKdU$-p$BTWuN@)qy#8mwwN$+^CiB%MNk*~EP5r#06n&C0)E{GD2c!f)8^QN{b9 z)JJv%$X-)gT3T2rs{0TYT{!*R)Lo^B0l1e%62%K##w5K87OM!Ckl4|3;fo+Y8PbC7 z3!Lw_cd!Xk;j(Jz{gGQ967rd9#4&6*Wi};uax9*p#pc(Mi5=K3mp+-5$V4ZS)i(E|iNL{Cp!%9B9|8kSlz}Wfqv_CQ)$5YSY z=EZAe@Xwlo^H>2`RY*x_rAoVnh~Il2xH4C*(BP%HYjh0?5LKJlU+#Vqn}A(x`v7DN zTu$)!+j+x~WsbK;`^$I(T^|kiG2Jll$X4df$9N`3t-f$nXOin~_1m`~-Pr$)ejM)6 zvjozzN#&E^=;rC%3AKuudAf^!UT3pn&%tb-3+(JGBHUxy*gN~05ytD``&FVc#>bmW z+CtXn8gS2ZIq6;0T_2x{d@~25z(Zfp3;*ZTj0|l>MMVvb(&{I&a!g=iyIOkSU@uVWamr zKX(xeow(AauKnQ|2BiD?WX^wjhdbXP|`q3dt&ZcdiQ zM*1KT(nZR1&oe4C05~4+iFo<s;q+l>R&jL=oU$g=!&MYQQMOQr=|N^yhJ} zj*^3aGZKsWDNHP{-z0gBu)qDMfsT=4H4}9T8hPA+6d@n@WgNibW+%bC561vki+C@V zHV)+Yh`-W+2ZX!A9{jxg=1v%x1X@v*iWx0iIr-xXrAE~OD`&U7yZhz%&GNYiJ;7VVpGv{+ zP#M1HK(+mJ(nKL9gn<&`5{w+jZs)X=(JpOlG_kbEDAdf*tZ#125=c=0LD;M!8dq?^ zcTt$I&&j&lnQ*uB;Byjso8)rNDEzq%?uK_G1rIx8w#t3rsO|fiy_A@1!;t?WU3rG9 zdd=$N`p&49Ty(RLZG&cA$F{F7g3aCT4$CSoJQMooS&B7+R>E&g2SUv%**0zsacsED z3m!8sPx}I%S3Q`Ee2g5-5~M@%qT7=B2;^u^N}_e5E;N)olc(!Dj3}+_O~3DpSdNX! zPaDX4{f9APkkXd%;CV&R4FtE%U4u|ohB$wo#D0?U1z{n%D#|1zXjL-&GHO|H$iQkc zvg;RF;n0?|Blx3ZZ^7^!z~vy!>SwwVSyK#4QRv*hL%QxEsYnu;pSU6Kd)L_uG5kC` zB7#++Rd& z*LlAuSjkW>P^USXS~X-f=onVDyd=4`4XM&fc+UC8I9P%yx#>i%w7?v!sP z<<{sgOxY;@l?#9zhS9PR?Kx?5t@9-0bGnBTDKPYrty%F8X9g9GV86`Qugc`D(C}Z$ z`gw!>(AJB?#IfIhn7F;$rLVUE674L@fz#yJ!E$n{(fL}AGCmbbi}NOS=cA`T{Uc6n zjb`!SA3LOb<@>@HqSKaAXG|LwGMJ`~B&u4!?bPo%di0^>JpI1$^Stu*js-~t@@geg zh5w8b-;&Hf@5E0McKn`%J7j99^LKoGw&$3P;QdRrlfj=+$+fuG@q?EL{q;8rI-3NZ zDfj&6-@j+i9s;GGTOLz!V3Z5i+}@c;kicy;4~QGdPg+pY+HrOB`5bOG!F;3AN#ytI zR?)ylr;`XAng5+c7Ets>G3FEzRY_vQZ%=DuXjTpu?I2rDeXfrlyft#uy1W6IkSP&m3<)G&eWoTOU0wtOKtrJ4qx zotgFQ4zNaUDkhYDItlI+5-3y2U35`uk=r(#XBfTSkm_)(njSI2yNFKL0<136rgHYC zIr~}2G-UaWuCz!NwhN7bY4(eH;bfnTaXB-(0r@GN2-VxUhwF3mfLu z`jnq^?|Ozm@KH1j`bXWaq)mk1ZHT5(H%pQyhYxrd!M_Ka*44cMC-Xf>HQ+660rrXg zmu@OlUlD{<%Deva>q1ssFDp3|EX22O?95luaU+<(y@l&1cIKtQXjSmwjEQpr_M|D< zRm&087>D`5LVk8y=P99`B6f{4c23UkZJat7b<{qr!V4_lQ`2T9*1fiw`e*e8jf`PFuCr?=0<}thErHf?O(p}>Y03MY0VPPk(wo^om0S8v;Xg~-oZSK zy$g(Z+r*=!KrkVWPG1N^!QLWi>ZMy11oEGgb*!9l_Cf=X3KQbJ#5#E z$w0cpYfpO(6Gi~QLk{(h{n+2gt#jyaIHWAumraD$6qTJs~z|7#kKTt==GETMpF2R1E9w52AE$ZAyM zE%*N8#iLk|M=t!jppP~KzjKM|-zQXwvI=M(cYjz}U&ZFm4 z9plhFIAzqvy8qJk{grf+cwT#%^0Q*aZJt`5;>@fyew1edW07L(WWYJ19=|iSI4BC* zR|sB^`r-j)&#j#o+H=v&N@bOa=-F#MYQJPtrTYXw0VhG3T8;+0B=L)KL_xwfsa0Hf z!ZSrFSC;&b`$OMPtlG~$6o8XpWg9k0@0VPIe|__NFY@H0;JCJhT3%E)Q$8NWpL82L zIr_5p1#f2E7DMN=)S)y-zTamejLvUmxZmO2!6PhWouf5ZVzhjbsgs7!U^I3g+YR1w zK@gbwq;)YCc#TmaSv6?|sW?1rq^yv)hN#bhts(3PSpE@O&WO`AT+*g0wZ?8gB(}|$ z)XZ?iLBA8B_w=^yDhQ#4JX+)IVma%KeJ%zN2kg6i_CuccH|A-VJ$HVPZ^Y!n)y zHGQVp27H7fx(@~anX-=ZEZ_)xj;*aNYPG7O#J8(Ir}gxFd_~M)G7&R(p!%<`Cb`s& z*McD@Z!&}^Dc)-8< zQ|BqKn*$LKQ%3?*NrFCFhF{30`t(puDiz(aXxrFGuI+u(Hh}2{H;0A?g>~W=M@wKI=%>xhAR3*xI1z$$-6rf?2xm+ zA8S}u@4T6~+kLk!?THLS>tS`VY!JyoKv8UBk66Rpv2-W@r z8?9VcSzcZ&Bvw@@+mpx+Zi+w8dpC#4bRVcdweEsGHrT~h%ufadm}v~Oze28kT?bst z;=U7Vwzg|_qilroJ#q)`Vu#>Tmqwx>Nrb2l^>ttbb+I7krWj^~GBtmA_*irv8#o00 zEa}!R?Mw=f43^WktwDG7jSkd0l;3p-PnLXa3jhEBE;i$)eee@{of$~cENR66_Y{78 z)0$PlSi0sG=q7C`&OB*F7QM66ztR4|3xQJMx8Jis!_&YgfCTase!Win0s(8@ z2detETxE|*pG%s{;hiGFTX3wGc^WVWvT5MQa|0KdV+nd}TmBGC+okEWxyXsH=9T6D zt-rtLizSh=wH`WVZJ} zhxsyUrs5GfYE~e$ofc0%l`4?_3IP3aBn=N3Qn^)C$BsAlz>l@HwY|OH(uWtgD?9)n zhzMJ}lBo2s5bUUqa951nm&K0@hs4!Zre9XOm*&heWq_63E<=h3NeCg>*cfj^KLR?D z7-~R(K1&8wh=!Cp?+XPn;@R)_iQXRDFr=te@O?gAi^5}7tJa}O7(#-5%eBXo6(xRybE^x1K)lZeaB{rQhs<+) znyu#;_7X@+FBu&!S5HWA74LwPd~znNZMv2brq|Ct6IF!Ys0=@86CL{ZWDFyfK1Ow? zn_&$H5)RmHj&WePbyU_L)yS~w5uL{}S;7i*e*GY7YGZOHgSMh7s_|D0^AkF8!BICz z`s>&n>dWEMSEHC0)4~fpJIPtZx9_cA!sr-DGa8XavfAq87jq|oezs0Rh(^y;v5;1( zU?Ys0*Gs@)4 zC*^iO#JAv{4CaHL)sV)frl!V57oD=n9s1)Hr{6Oyxge0C;Px~BUwykX7_48R>Ot zwIZKy1sE=$Vv%0fyoD6Sc28ME6+_{q=O0PG*Fd8U$BlVN?&_!kFF`1DMQQr13p73a zim3qxT~=5mV&uORBZyL2{ias6R)^6o_%6eL?la2UGs?9A+EN6BZ~*$%GA#gB{X0>_ z`$f5Q2@Zu0_;lN8|LXqf;il*Dd;~q*q}LxxB9`c?%OPXb?do7=rb6BQWQC7}#Bi-Q zAcMo!%EIEb>S9pS93thH>GgD3gQ>H7!c+5>N~d*s-N~S^s_x2aV)T8EEzPLz zTOEW@n=U49RV?u_HT5yIRY!`>U%H!|Ljf~^F`Pa^>ZjbEW8Mkvg33zuLSqpPd)2ly zo+V3jzS+Ck;DW@WS)bkGaoCo{<;lr>wTc$o#pKk~FT`IIsl7L&Ik%kJ7LVQ9bb4aH z)Ah7bEY9iseZayRI7?2^_gye+FvOkp>}V3<+(*#~hf4Ai@BB5VF9Yfp1nB^_HEq>2 zVR3Xz!;Dl>U7b8+GQb}~F0~ru{%FzDlMWdF$k?LyKQ4&aDOe@YVFZmI222+~h=yGs4D+Q|h6b|&lQ>I;+Wg)h@o`sq0A4^g zBj)3hgj!1T;z0&}lIt)*bh>9%dv$klbG4SPpNd$KJ47jxv2+|;A6J?;SeXa`oJ&7p z)wI}R9~%{AQl~*0x3|_8)SX|uVAJ7te6ZNU7&(BB5Ta5dFDE0znkL)rx_2dkBu(T_ zerY{dvbc1XwCY_uc~;EA{_=t1lu3~UE-a&0s$U#zk9&PGLdf%1$0mZ85=b%9rb8Q| zKu?1xql(b8NJYt_Z(a$b?aCCk#m^&7Y#eP7sl#?Fvt2i3ygcD$r%PEKNEYPHm{~h= z*>IU%P-@>VY=A11+I0B6u8+pY6_LY&h$W?^hyN~jFe5!Im+F0dIufumzhW)yvS01~ z`SYj0{~Ktb`^$Y}Cfp@E&Isi!eib5;*EN@4(2Rs`+~6h&Tp+pBxXjXp$M0;^g411} zc=COxwoG|*ZEXS#H(&yNC0|%tLeg1x;dcMK^vUgL9*b6ukl&k&jI5x$n+X36dzO5O zy_di3`NhS<%}LJJuj5@_H(OgKJ_yiDt%GzKhXL9mk!|A#t*x7PupK=;n1+_cv4&t=nUZ*9EH!lqDvpv zE*32{3zcUI=l0}W#e>we^-Gk>XjUO1%0-IhNqVLTMT$z+oki8vVZHfiw@Dagnm2K%$& zA~}%WFI(1W=rG_!Ho&WnhZ18=35O2wEWln1s1$etKqzWKe>M9l4-8!m^lw4pe#us{QX$V$pXeekpRFpNv|v zQ;HltjHJ4Q5jbT-?&80gDofRAD1*_HM8$^la}s385Gf}1jU2^maHRG98lDrHVou~S z28x2EH|sQ(IHseO7P7NDHR!MlCT_3h^l$d3-t9bmB9s>t?ClRh1pI{qA;1|5-bV8p z4Ojw%8Pt#`XBIhRQm;YhqHw+y?R|-M2}2W7v*m`FB3W*8C1Ip7MJOTJ|kQxMpXbZ~Jo*mp~{V`RU>${oev6Rx@{K=zZ1u zmW9Cbm7}qR#q~V3t!+PjNnwcDtZLELwr|P)oJDE&}6Q`%Ay-Y+GUD}rI;>mw!^AQjdMiIk>eKV}n zfD8OGV3aTf-LvThTp*^UtX%K7`D1$|#qaTKaKtyH-ef2~iB{bgc&Al0d()}lkp+d- zZrx!%ur5b`QfFkBFlt-Rv6!yqFumOiM}?3pyv9H!&!t3WS#2%wJab3HH|ESef+~cT zv4Pb6+dz@&?*|XsXMQ^S*;2} zlO$~~E&;CD)ICYe5fm$#3V?dUXXOW-zdZ_mQd@1?c1m0r6U zqNdibK}c7q%b?!S@@C#&s(sncy<^$d7RZ#0=1?AVBs>zVR2wEHs$A4%!0Aj{k8+S* z)wLix{eU-r>=rvX<=KISAHK=eIdRhFc#4JpmdeV~^6WD&8{EW|57gUENZ$K#gN|in z+WBSSSal|(h6Nkyh)LT}CFD{0SViUub8|IZ_}jqYSj`V*OBaxP4^BHWW?D`4#mmvU zr6CnYH!psP%&%l|Tau!m;!Brs!Hm**qB?XjZKUyu5-OEW%&iv`jwzW$G@nHDm3)B5 zfw!URTT`c}+v%}CfA$j!;K>@RP_JRos3j&R4~E4;4r2xQ+DZ2VvY1lI)EyjufZqZ$ zp#(EeD9^E5%G+!bDx~jz$5f?7MFSi3<6&!DG544iE#sX+0=M1EXmAPH9(_zm4F1_M zd7pLzjNG})Xkp6hH0VZ0M*&}M!6v*Lo?kj(RHs!1uoFek7bmi}Uw`VvCL1v5%SjACj~}9G@gBx<;j2 znfonURBA|hiXeH)W%IIy_3d^O_0tAY*i`;I7@lH3&@dgiu^hOEG<}`OYoi#4Q6&)` zVqI*OC9qZFU^^EA)0*zJ544Ju%c_;8)o39I6r*5wXI^Ec9yV83{2FeUA4|EUpNS)Q zJvYAz0$l`HPqcW0@nB41A|?=h#=^S#+i{Ydk`k01z)wca2Ed4&9qca$ugGP)7Og6v zgU5v(N?|Gk5l-zW;Xps`udc4Ju&_M4h)7}Xy8rA;$!S2rGNsAF2IbY)*LQcX*l-B^ z!hE0Di^|?qUM^iTmmy1O5qfeQTBi8L9sn8Hi*WgpifimF`F9r`^UE7NCUpxoW(^Al zOw^bN0M<|K3wD6|p}-e>9~#Ca*GSNF^Sz!@BZmUkkqHc2n)Ah#3+(Q9=97AUaj#aL zP*^I*a4~3u+X%_p2{Dq$!tiIpLy2Bc$~0xg`JE1<9yauUW#-<+A(gdqOTnYRvn<2vO3z%P9o{e0*8TsUB!7 zZo#~{{AA_JH#y@Mm?&IljCJts5?qmkn|+Q;R!s*k?d|Q{dx2}@E=OkV`t2Vfxs+@K zkk-qflSOsj(}+KR{=fx}@4JALz&tz;OKr|2@>$Yya-+X~RaR6ucPv8-0T_B=#|6;l z_0n_8oc6pt!|75b;k>WEcLkz^KJyYq?GzLg(q& zrrP4*pwUx03v@CdG4+$|`Qeqz^&2o176a#W@~9D`28V{m;Io6-*|Cl~)&?|{lxiX%f_mf33tKJu* z3Ib1TJUojQY-VO=)f#n1kGE$D`Wd{A8{g$JIFeFQ4zD~tsr@%^f#uE0P4e4!$fb~S zz)J!2OE#0s@o2tob1?P=FccYSX(I0jxQ(r$gh(7lB383sw`ZGFa_N_6gC9$Zi_0P4 zcK%SqqN1V)B3^3jlr!ruNIr%lTg(FBTfiV{ejy-y8jomMB)X^R8;2Q zLf^BRj{z-h{EQI_j?ls06ZJeB7OmNh^R}Q{9Oz~`pDl2l=?he1ElcfwXc3>Kh3D? z(_kXNLM$BlW`S@{&-M5j9(T8RfydR1x+Yz6Pme$#u?Q+k1mn8} z4-XHJycP|*?d@&nonP>Xh$5)uG&K9;c_L~RN&Lt{s2(03LGMri*d`$%Iq7+MzB-(< zyown$<8eKJygWZ?(y3`^%%`(k1L=p$cAOcbgRvh@7F%j^a`c^?&d0KN`s4)2$)WGD ziDKP%1G0GB{{lR*4?2?g%f`mW{!~d=SQx-ph%3n+r8JC^O;Yq4SVW+S{goSxsmA~7h(IUy50FOdKPA8Obm=RHoT7)lm;HgeMuZf zON3f4NHb=$8cIn?8F;Pb0exZQ9yziWyfzB!kBOCa|HPXv zc4cLSl>~N%8bYJ1gn1#f8CTsCOnzC1B z35SQT5)!K>UjP9b>6Dz4Lw36^sAB9u=RqrHl*2jIlN36?vzis-jX6m?QVLyN-2@ip zz_4;9ons}g19BO4zC@bf(Up^#vwvGMX*NgP;eC>Kf&#L&pT4{(B4u3}@N}2BN^WFk zQj}RZ{$1DE*-0nn^(=*Zelb@3dv7m#-!nZ)$yz+J?7Pt{TwL~W%Zjy15MTx>EuF2k zpT(y4E_2(QfKoRxp|`rc+KdwjQ~2iQra;=jE8YiW5sO_hgXxbeVV~W)bqm%&KtO<` zq$GUo>FFtL+UpIY_w|5VczWs;$Y8n8O+qO&Haa?*A?oS$E$U7X7Gb<%p2_uuFD)(o z7PatE>`e=_sZ5`Lx|*8gg@Nr61nlaP>d$p`>&*u~v7}Z}A(Up`L#NosdHo>czj! zNx6OE5cC55u%9BOuoNN6TI#LALKk&~3jWA7*MHM<^9HuJRTed~!Y zi9s(S;Y`L)1{y!NF>Q9Im7_56vvz!5#e}By_hzBhRp+6Cr;Iu?R4)JL1!%?J*dtc& z7krmvztDJP+MS7S-d}RD(HjxY*Fx%|EQgNYM7MwB9}zXJyG0pCONDsTGF#Hh$=vs) zx@f~L4Hm?>T4}Beiy(Q#hr2h(kDIWOZP6_)EtlnNA-(_Y#Vz0?)Ya92Y+z!d5qHzi z(*QpeCnsmj;7TNFfve?Ms(5txj{!IBF;mvpmHnquQm04T^t80JR8&+XBn)JD^F4?A z`}jCGIu);QOAhMzm{0yq+TXk(VaA!fvAs=CMuvfB;OFND)v%{jnUjkv%n^>g(`rkb zn=|4}en^6Io0JsbF>EO)kCCW|h=_?M&&nZ7jJiF{L|C3}AszMS7Z>yQ;8y3##d30R zU`}$E-Jh*pjPn}6}lO1>S2T+Zu$_i=?Bl5e`t zx%C?h&dOFZ{l{FP5hA27&gs2*0em#7$ z^knwm9fmVM{2{)g+Ku%Ow#uI-Wg1>`P;Iq43eFE)MUbkbJCOb}|2qCmNUUx;WWkL( zH21e@K*YFB&EzIvWR`^2M_bceO*`mKsM9OC)~m^e&1ziIB5i6w*moY=e{W>oW4w#h zCn}g+%b~GP=M)KDFP;Fld2q}GzFHg|`ZhzRb*L5t5>mENYzty zLHc9+ciC#70;ltvp zs)L_J&+S_;1jMj++p+0I4+>D{i?I*TM962)XF_=2J;8D%L)>m88yfxXCy7 zNh~W%dPZKkzF@bD3}H%VQk)Vnt&Lu_y+2`|bG|iU~wbo<& zkoS)TW9fg4XX-U2ByvAQklAbQ$#znlRw~DmA3Pa|ib&NhB)grG;^!1hD{=O}Qv4bsZf`-c$)Z+}{uCZqKA|`gRrPpCQwh{j^3JL&7V_f+)n2VQ z(9!iCy9?p)Qp{&6O-D0t=I7@R5_(qlyP~Px&wuX%gR|8SD^K-flc9{#RXi^rU!%(! z`dQ!;$s#0}RLURCk>=c(rpHTVQfQq17#}aS@ht29o9*VKC|T1NFVfnLJV2V;RzI_u zsKQ-S+wxSqwxlmZ=@nSOJ$TD&3+m->~uqrI`x?>{mxn`cb3$Z z;L&r|C0QN3vA72fUBn_PPz7(|KZ zZ|0HRyZreTuXhE*Y%fR!JNSxwKKjp1!*}b{bO~4}0<6k*wc=*iT&w<1DO zGC*;W5D&@!-u_>#Ot#w3(b0gkH*)>W-Wxw$90wz~3jKLBU%gs_K@93HA(#Bb?WmYY z8Txr#$&ju^s4XS>^?MW5)<2?ha&lm(!^Xm@(D@7)4Diy|?zNcFPQX_;TyDVtVM_G2 zdi2MSGSB@#pFT0s#dgg*%y_QQf^DE&2gvTOSbAdnqX*CP^_#uO18K)M|6NZ&C`v<+ zfY8v;Kq|4fw6p}iMh%{_Y2`Q+`Zf<)2H$w1QozT`%F4)y&SFNvsqZn!6>)Nko$TL{7KuB|GgP-g zJ0QXqjcvzV68&nRy4SV%a<{h)U+m2*6w1TYJKRZzF;yNx8tKfGV^g#$C4HP%7kut} zl`3W)XgtY@s7ltf;QN)ULT%TjZ}~h8^-RD@!IoB6Tgl3*XW^mkiPKmf&4QG9N9|SF z$JW1ymi79ge>z3Mv1-Cj);E6I3QYDSuo`-;F;j^hZBDvh&HhV`&hL+0yMM*c$i$5! zNurKC=v{v3Es5H6nf}LbD&Vp~`67OSv~H&9p_+5|!=NkcKa=<~Y2vmMRR+yo0lW!a ziy>iQt^40aV2o^e8d+^U_HTQZp1rx{Lv5EFl{9_!)mHKK;E1GNx_*@+t4$-U)1SPvN~DL7eQ=N&ptcGpLXmz^FD zAP$zF-dtE*l#8J``Srqn0NOH4|EAxf0`&K?jBeqDKtX>*ML-t|FH7z1?bR&Sl97|^ zhziZjoP}9d(B^mChYwzd>za8Qx&{Wmpd`7^`e-8(1HCAslwc0OiJ(16l%j+@r1ykgowhaSQjhlSS0DoPhSU>+74`cc&L_JrHTsjEN9anlGF z1J2%ek!>3wSXRDgz|t#_#Ec=KqN*D$_zOH2Q2rure}z1D7z!=h(rtj!ulhwEa}E~- ze2c;U18w?BsCuC>Wd!Je!i^;I7Mll0J}cZokhlp-q84{als|n5U~kEPdFFS=M=qT* zl;R9C**UYZ*Xs)bF8kBK-ji%zHwmJzC39iZ2a$-UQePZ$Irkbru^iM1yVLp3pZ#li z!TCH$!BFXOU$NhTygDLLP*c!Yy@*XFLROMv?lbx)jpxtzNehn+{II8xmJM|lC`u$u zd+_*!4e%>_yu=;Q0fG9=Yyd5CR%_-w7kYxKXpVO|pe(>fT18XU*Pnv1HVeD3q{Qdy z;;226i=F-Nauc&$gZ&&Fyd$xX9&9@ zYy-m?Z+>C)Mq0X443}hbVgd-bC2OZphHkj% zFNUo%Gc#Me9{jG}#FO**bikb7J*j8C;8iA`` zv{XqJtxHP)`Aib1Nb~Iu3E3;ylylaRUd|oaY#-jeLz4@_5*^5V=={Y3iB617{`2+I3?!3Df8qTB zEREcT6I4>=Q@KwpuHy6$zDLJAh-2zT;c7R0GYnT@BSWnyF7V|rTgb$Z^oW(V9<|&* zL@yd8WeFlIKo9X`#~QZ0Z@u1MFlczPU7dW%yZ`mA`ij?)f~rDKtSVcQq8X2RMM|M) z`Kq_R)VD&OhMU+uvNy$qw%#6qu?uDL*yohrmhuP3JxA!S(;8#Kn{Em1b@tmcTj2`q z7`L2G#2WK##?M2>E%)lCl+E$I4IUsaOH=K`FtEyRbsDnK@OXPnj5}*3jBmOa3sfDt z6)WbQ9xuk`=H#?d+d@x;-VoGT%A0BfZSV5(5SL3Ej0G*;y zBnsME)$0*>UcmMNrUe--Eh#B9$I`%H=7oJT=3OL31T>0qbT6bd;g}3z6@-=KTH9ZniP8i;A8f ztc|cmAjl$WXML%oTI%$-VDCCPJGbM8wcH{h>$K$8($tis#QtUjb~CiZm~+K!BA}5i zc`16CIXU@gb?D~%dY79pOPiMKFtqkUp$FPE<|%#B9})@5*-|xZc$sY&DH)l| zTpL#lS+ z8q|k0huik|HU?h(S)MSXw>YA9Vqp-Dq-B&tUw%7>$H-=JlE@Hvn~6z~;m@oD22zA={D~9&+8kR zlf!6e;ng@jb1NDzZ2*`B!%FjLm4f}~QyE>ax6;%CHXsYe(GzxXXQ;Tx$}R_F#V00W zMlf_2m{;p1a~Tr-=1NqIr4!Qwn$KpOcY;NlfkawX_S?5_F!F$SWn>>vlq4C1)wArR zRtZi&tY@fiF|@_N$8u7>O7PB-MXkAP{Vu-`4Ay}8Q+Kpm!K*l*py}qgwt~^RNUUV= zAbcwj&$x>wcp!X|COEq6`CAj$7s_-G*ZJQ(bA6?(xj!3g7M<>*nC_(eL4zt&gKVq> zJacyw)z}r|!V~bAdg{v`P{wPh9Bmjjcw>4!NT{NEnSy%tvwBYX)406WFA{7OqKO8hiCU+s`*gz(&UbFr{yUH6S37;mM*A*% z+~(KDA+?}g)Z4eKodB$Y&re2&KsSljdzmmk{HlhmZz+NGnKvglTbnA$t=p%+4(@12 zM7$)jh@4z>Yxu!3c^DCKw8Di$oEM1aW>Wd)XubN<@5%F@KkH~z(nj&}&Fbsx;m7OO z+D-Q+J_K&+VRBzuS{esMA4q5o?%PD|9$x?c*87}+7#x&S*tLiz<*(%bIHRel379|= zpv>vPTd|Vq_c1xyf}4tnM(77PIdRXlEkm3ameZ+k}! zgM8)_ANcC5v5mn@abk50A)4N-=1S32qW~Ran-&4?2v_w5TD(X|$0Y5_20W~;COh((r!7mOCD$pL6 zV+6W(Xh_IVc7Oyuul?U2PCgN}nau z082&P?}`ok@m!XCS!VA+{GP2PLw}qvWg$Qy;pN2RVKrOL)W?3Vll;KbZzQl<4c$(| zc|ZTZQ%6Zm(Y`hJ->Oo_Arh#ugN^+`@oPowvudE~R#!#XDo z{v7Y~-;VNbxF>7v2az#YHQ;f{w4E@(bm~X}=)P4m zIb$0G=6wA_5>7hRdd)zdz*-EDAh~_}+LhGXtJpZb<<@vFiSi&W>y~T1{u~-Uh2f7$ z&{o)W%5I?F2n`KY$$SEH*9L`s0Df@6ZySN9S=?&=O}pQyp;?mjn-1m3SXG~%pX|ev zpLY`XCH5%WAV_(8Dr5*p*d$caoKgShDgZ7_y>E<>UF&1^@@6OZnqD>;RA|9<_>R z;^X7zF z>ioI2-#s-@IKlc2YREMO$FzIr&K-cZ7<{_`XlcZ}$XFf#Hf}RKhj{_Ehq19SAdVK_ zi-u9F(Tzh4$&_dLK$j9yaf9|T`k&^(KaeZF@-NZmZNPqH2p0)%AKEyi9V!G1=8Zy$ z950|^jM~vt%ATpHfN9hQq;P2YK&jU0+j)2#!wAsZ*SGBC>E`C9prGLE>-(;DX?Ypi zp1iTHj?OWR%Yhfa0i3|ooS&Nu%me|n9EE}24lANP;$lQqJj5;=hE!}~I*b+HHu69Q zKruIO-mKT>j6|J+Y~a_R+do0Ch5jTfP=rkeZ+UO4>{0FS7y2H>_^i}+w`S=Qns<|{ zf}iNd8`KYPVa7wEL8FLGol~VdGNLb1C7$&_j55P%EAJkPzI5k3MeQo#d$+O0Z13gB zC2|oTRsJ5oMIJ%f)x*rgTO`jyzAP>0N1vG@ zW+ycw*k!5a**Wm~_3HpfZ!o2X8iT8|W$`e8LEb@vp_Ej+`zVqicJ(#|9r>LH5fL#F zQQn+vLP892o6*l{=oHF_I zMTw3(>niQJ;cSK3eqP@lmITS-k}k)eoB6zyiHV5-6>q)IgkHBW-w_5q%)Zix^?CXe zOqzLag6BoZO7j6cTwGw)HfEa7K(MaXv-R{m0Y8oSQPR^eqS3Ljw1Gb`FkDM$hArMe zfPgy$tX|+K7+e94ZUa10K$3cAyVG-qEpm}vnyn)frPkaU9LRD{t*}+NPGtf8S_6i9 zoT1~+TW>p6SDv454t;kH+XHwQ_(#RO;iKEDu0K{LdGue*mc8!yR@g01^mT#Z86CNv z)Rk8VTH>q&@}x?YP_VJEa5YA(aQm$|H#e}*EpUajpuWIRheb^1y)!3C(BbU^c3O2~ z<7`;NR@HzG+PF!61Pz!cCnoBaXcfTAx;}nPNs*5|1l`Y@Yj0=11LV%EkR97LAa4ss ztpGgu_$;H*wfT<@4s!i|;m>m;Vou2Wi6H|CP$H5s1wVfLXlrYO+E=dQeY|5F&x9Lj zX>C1O@61YwXcMO)Vr5`p0Gj*f3#lf|@3(&j+@_%+V5w9S1g@KnO`hp?0CwxPruYCb z(R9C8B)^)^;^-lV`RxN&SXh58Rb{(HlG-vUyS`d}glceIxpF@4N!eNxJ1zRd!L%Im zNq5YqGE1PT-T#->0N%Be=zi~g2^n~-iHIz+?pWE%UhzkVl<4GT9~I^0k54yB+qGU4 zjMz>$JQ5a$;DVftO!L`RBT%>8PuJWUot>TU9sbwadX*y+3G&5jYHKo?){B3Wl!o57 zB+Qn36M<{F@h2b)eQron4b9Z<=L;AJ9zJ|npqfeKrUilvNbI0ff~pS8d&mz1N>2S7 zGu&wd7?R-M?SC<4hrpy;eFprlT=ZSc2|Wk>dc$1w?C7ixAbVimjEc#>JsA=lY%|+J zo3CywK>a&v`MQ#T1doNhTw6H}yKtf})Ol$zMwS-d$)jN{G3aZ!^T)7d`|{lEb%bb( zdjOLzr((nH45nDvz!BN;g`G^9iTV0;Pip>+MAs_4dX-R~>QHNJr&0VU^OAF;)%+v< zLGK*}4Lh4yZ(PjBm}GfOUdbMK+S0p60gAPM9TSAn5hUM<0(FEkzJtrJcE$_8?IY17 z=C)alwixhBZDwE7@SyTW!#1R=9O>}>gw=UZWxn6kl{)6{D>Q>^&1IIN7#pW=90Uy5dGg4iFj5_%1XY*1HM3uoj@mVPNI z;77Puv$Z@V{#jT!x{j?8LECXvRMbjR*!k@nBhGDV>Nl|Qxx1v)kq{j^`IFYhJ>BR& z3nD+5vNsOh8k_6tJb(_E!xiv3bpgxho5vX{%?7Qm8(L+NZ{NPvsdr))`tQTD{4+@u zU}ssBCBK_=ZhUewHU%vhPpqox9y`7IktG?2I>~UKDf;{w{QiyZ+bW8R=y|=swSx(s z+rE5qGj4~j%Mr@+KZ?fb%euSdJ4{TwIne6`0 zQh5O%0elc_?ZFC-(@E-ERsnAgIJ#hv8v>6~#_zx1eFILAFw?t2xWXDEE$G+^37B+yqO{?wf3LkrnfHGdUEJ(oL%4UZ-Q5692*aj!)$tru zWPrHd%B=u@fWOiHtg|~LM?dgUY?9ImATOvD$>6PbSsMnp@860SC+pzA?Gpm-GXS?) ziT8{aFv~+{{jPjUwB9Ur-%6QABlZ>g3Kj#)-wXNLR%Yq6s$n~d&6UAX`i8dyxqDz z<0-zb`IjuGDvPXGEvAg~MM9sIyFfJw#jyFkL$8W2*)NM-AMyW=_VV$0nV6HWnAcE* zEJps9wu@TSV+Tx#pc6;Q=7QH!Svf<<(FAToSjQSpp}#pOt-bJQlG$}{ zQ&NH=0Zf}EbtOnQPh&6z(k>PvxxgY!^OYpX@x%BFMMXt+3PfD-nlv-@fr?AsYx?;3vOvzkHtM2Q;2N0<@I!E)U|m1NT=r^D)HeH z;WMeDZPSKV(qR;x3S0`Lyq|iKU#s0JSc-VQCo>IJiZYw-7(bvPr<%^g6E;<_Cf&N|Fz|&x0ad_DKjwfnV^}_w=3+I!oAHvUk=f9z6vc#xZZ`ws3G;AP1NWhu2(MvZTV+mOLZ3V~$ds&@iWO zA}AuwK-+R*H~mek(FRE(d25LRi|nV-l2Jo7jUh}uq^v6b4Oj<{*(sDDt#^3(@1L6? zdp+w1Yo*#9r79xgSNZv}?e z)`61dH(FRo;h6wohp*w!y~wHD=4S5U6zUcd;3^l6Oa!M5D6`~_zS6R`vTl0r|KvNo zf=E$P*G;VO$EcOHbvt+XzyCgI3(x$NYi+&9)i`Pe+>%I?XncHp%lV$tskBgxHUEb^ zrQ|>!3z)lLd;-kIL(rHjaqVamt=!$+g?%s!b2B_V*dV;1g6`}%WUF;AJB3KiFQ6hJ zlzor$7YNd4hZ|uG^3YTPrC@O~-avo>48(%CW_5N77;#Bt)N3bwSR?!3dpf>;g*i_{ zV;B-B63@NBLjm^jP82HO-6-I5US3|`y7L;l3d_I39r;;(z9Fu<1z90`rAA_JZ3=PMsg*K+v;5tVItn0uvQW0&XDs zK$;+NzD<7LeW$6}SZN^0ijGXPp371q6Gxh+dP&?&1tr{^hm=dSMW^2aXTl(9%I5 zo}`b!W89x1BAb?#31yA8oQoV?c?Z@?mmmI_4DRQAIaxT)S@lR|dm=}Ze1|&o7OA`L z-Gn=79-QS}dFqQ+;#Y7LxP5I#<_uCG$5zTu0nG{T=DdPq^9So4>ZQvzv46h0KjJ&)ydYoxs$ z^{JqM_zo`y3tmuQ;Ed1Fbb5L^AW{%m_l7IzzZevs&z}-&mnOb^(479R-m?8G%uIgS zWu$2t!yG5wV`1$?&kIII0So>5WySvi{HcgPiL{jhsT=G3GBOolj_~_8-eBAj=5LK1 zJNAJ4hhOjeu?Qs?$Mfu4_q7HMrWY3%S)ZjiKn^o^2*+T1?w)K|^^K>G92~Hp+66L9 z*&Wd;gW0Fjn4969d=lqNu>NZzAS^V)d@T=xl@EX{7z@O~Rt+tkh)%Q)#x;>&AF+vO ze%HF&pN2#p)~@q%<+mP489qs-T&3q;qF1vj%|B&i`driEE9zN~JLaZ_}h! z{Pf#J`&FNR@ASQy?E@~cSN5-8_w@EgynTCPe zWKhLHfZG=$`*H4jmw&`e@M(#o-SRCe$ANKa-Q0eQme{rNqdjhM{>)#nX4J~o(o(Gm zY4pW`Qc4&DaX0!KC6)IWz3;@;>`ZE#jHB6E>$@@{98sCuS!uMl?#|WR*Tm;8ZKL}F#82`_Sn;02F1fFB3=)Td9M8V^{25D#YBP7|JE zm!kKIAFMxyYCVVJWqX%qx5T+mYZbOQzr>(p&-z|my+QTn=jZ?V^XK#D&qsg~ArSVm z#rp&TFVLuQW>$nVv^bNksNh7z{Jaa(-uL1jX9up%?vCEQ^C6V+!+gVtho$}LkEXX@ z8_LPay_2tkPW|71h#kU_HJ9^t!uN?omf(K{ByDMBg~y zOz1KCMm!iA1xU&idxb`aPF9`l$S5SoRZnYhop)G;Ad-IJ{C&cTy{Lxy;FsbefmQaQ z4NVT|Jj+L|I;XB9N9H5>#CgM+0KA{Ltg3Z?C8MJ9I9OHJLF=nvH!NJ$%~0vSKC3gn^GK$SV*86)`$#?N3Ds3+exefn6MyGVtwXKO0BF9hRU0 zR#sLT`Ydaft;el20`T#vlftwL74Vl~e((U7*V7%Z^zV)}wWtN=M~2b=x0t`>^i?8 zJKO=atkw6z+s9|@v+f9_p~r*)Y(eDZrM^CR=mcyhARsW0Tc}q81I}cPE$n3iHWhZv!kP<12PTfbU0o@RZ;O2Fg4`7aM)5bKIP?s`%7F@bZTUT zG?4Hs8(M%eDJkjE_AIf%B`}7NQU%-u1n&zcCns0eN9<&1VP_!88Fz#}hRfZa^#i(j zE)u;Q4Sdqq@l}&2PA)D7`}-h7=v7(1Yitzp?ouz@5m!-_PyKwx_=hYy6#pxll+2g+ zu0MKf{1P?oF6Vwb@21|mXOS!QJp?NeBa{L=csZQ$JC@8jL&W(#kGY~9$razD;c7y9 zs=<{Hd4%S&Jz|w(s|U#9k5;2RUN>{+DKdKRLK9PPyJ&Wpi0Uu!QrZgoE-1N^{cJ1!7da^fq{g;&u%pUUNSyqsdKdQC?MdH z2n_agbbxq;4>q%bB_VP5}bxy{5%gh_#o264!m@GAZBM4TK&?D@7X5g4%u}pUV&2qY(6CSe}h@HudmNW zKwDE2=841<>tnqToWyI?dAKyRKRWyIeE0@9e!z9(m)WaVPy;f|bc5P&$fm@^ z5ansW;X)CSk>Y26DD^>;JB@LOT}|=*$v+iXU(veBE;w3I1xFjYMi~^0Qr*!MVdm?zuS!mo z7r$Dcs(WA&%+rcMe#gX`O;8)Mguu8f7&fW+ElJMJ!G2~B9&LhFmV|IVNuAGxSQ!Qd zW`x4c8Z4z>{yRNLP{ksQa&mWc_3eFdIbIhlep#2Fk7ZM!qM`yCGAuDbCdHqda@2Z- zg!De-)XCo=Ctr5H+IQ6!%c*|A6!Uhqn zYCS?v>Yih`fhXe@nS^(EnHU)6)(SFJZWk83$#bejR$*H2Ywzi<4AR*y7j99Fh z-Wq_lr=~s+S%N7qcnZ*@Q@uXpJFr;V!YB=KhAC$Ddwod76QyVy=A{sZ{Q_%iIjUUX=B5-5dj<2+maxmB#$?5AZG}L>^;uPKvq1E@lRIK(%vo@^=F8y-KLc|MG?848Vfvx6b(gNTQ)TO+tDz-CTFiY6S+l!&HxnSV9K0*L^Z?5O| z_S^5@zXui%qUf=A_`X3HZD?p{a#Dnc#}UBb;PQ$9zkaf!-$So0P9B4g86t*YLh^)7y|Vv(RBKGWb0KqmT?s!z;QZubCyT`H z@CChGZ9#hG!d@Xx{6{~7(@Kn_-`Q&Q`|^QOc`K|5VqPesK65x}MfU#gr!WP9^KB-i zk;IynI=JzHp9314Gdc6IGgcHIgFN6b&X)~L)zUwDySs7l@q-i@(3*xUUs0KZz*k1P zK=kfr79nJt++M$4gG@UlRuj|HMWF|S+kOzT&5&v--LHYabSQG*s6MNxp3;wnU<@x9 zOX0~qP9nr3nV|Y*!eP)v_3LB16j6Xg8QiFU|Neodp9h+-xjCJwp7Rxgd=B__bB*r)BOXmWYnGNY0PD$`z0{kEPul=GamqJ zwHu_kj#7#~RWh`)oF7rLdB_iUnss|pN=F4Ze`h3!Zk+8{IAdXuV>?OZNig-} zRWOO(Ng;*f$1x;gSO3S^O`bOQ7tfT_LyiGnmoV9p zA@RNv*>)!?K1wD;CmytmWSP8jY2@b#%&5qxocR}opf7M=@f&-?CM`wX8 zDpb!k3J6M09)r0AN{Op5t#{g75%!cmTP1t3Rx#iq?GinisUC=-!wiW@p;uu!H9b8& zd$rb+;MeMXQt`-o=Ed=!^A*3e)yU%gz2$GmtfAZOM_xg2;P8PadLSuDc>@W?=z29~dJtBlm2^LBISK0yfW0d0A)_i@ORjO#4pEY<55{bBpanRS@f zQ{jeTp7gzyzme*gEQLuF%FecPBZxhhaaJ{cCRm5M4PJ*nIOfOvBxhaWNbpv>nH<*{2Mv%tXuN zH8h-pP>R-!7W0=RIku2Yjs4XO!OXl@vjI!O=5(VV6H_Pjit%w>HnJ}U%`iDJ3JSWz zGz>{=l9;dAv27QEU+Czzo?Ok3)|Q5$f*m%(gc*7NZq{DCcjuJL(-^LrsGz83h64m( zu+GvnGCkrkS6 zLD}1zoWy4^WVcbqa3M{wWJK_2n#9g7S2pa=k%p62KPw3aepn^VyWBtDrG&?_KH&ThNB$NRWZ2#+S6hBo{;-m3!K17iQ5sX%S;?bY8>ju!mM@gGHf z;Emc0d)e3;vXI`OXZW^@`X%@ zIUqVCEIctZv}FE*)G7MH=CO}JoGI4F_0heq9%H%R!$5#rc@U?8u`qF2W9;-)p zmD4IvQ#+M^CA_xiuUwqwDw%WMK9n3Zz>DG}3!%gb5=y*%+%J9+v=?$~HmnP#9W%{! z@&0)83@Mn35AVvB{#t)9&{~a`9E%x@S8QId*2SLpTu~EG)?UCp1?9RoZRmToP-ohn zUH|n*;Ef^T_DgXL>_7PRd4?eYwMo8aawy90-cK`qhd&>?TAV`Y2_%`PIQD{qwdJN= zN$=l-FuNy;?&8bZh$lTCBq|ffH`LW-G5kq^RV5wBx89x}-5MKR8=JqNivSsuk&#&; zk1wY>IP1@m=XZ7WHZt;M{rYr8g+{%8FRIPtQ51768T${NTDzAfCJSJ=+gx78Tt~lr zDxpG8PoJ#@=H)4n6yU6kP-BKynTmP5sn5W%2@NsR@A3r9x{UYlLq%_DZl0c+>Nb5Y zkA$>+>+$h1EE33L7Zimn=_n-m%IHdwdDS(xCh->3oXUw6=Zzv1N2QQ>eGa&Of;KwD zj!BY*{xUM9V;yZ8YHHU9bO0}Oa(e1y*P!~iUg)ui`0^5)!;P^Mi7S6ct|(8l^}c{h zkb~xcRcKYFVZIevT@|V^t@r6P*t=jWH;oP1uln7bH`RzIC^nXOiTf4~2CVt8r6yw+lGyif&0<(8+Ln?i3Qg0GY9{@pkb$$J`hcz=@ z)HD7wO;9Ds9$pY`fLiG=u>DIE{ZUXIdXHr9QjQt}myfr%fIXZMmIgAuf%mS=Dy=kQ zC{=!zAKmE{yodo-D`e%D1r`I+%?-ldTt2K_i zrq3u?GgOugYc~#Pi9$^qS|$&tRJz)f_UNPJ??&h6E9;0qH-D%Av^Bs$QuD7?)L3&f*uqqgvk^1HX7bn-JnInp@p9`ijG%IPH^vK zlVLR-^qdskYo-(OMlEP#LLHo zuvo83@_ExQJ_R(;k-o^4(pY zA6g{B?P#Hl_#PVWBqcM|!0Xp%!tJMSAhFX^c$_ZYlHDWvTI;ewZTz~r;*y$}n84D4 zX!a4fAYKA0; zb(q!>2&>Mw^SHS84L%B(jr(yZh`9lC%WD>yzF%oUwV)-ZE4l@6iI11}*O!-#M(u&P zq%3V~JUl#5IY?Qa>A(RC&?EbLdqD>&@u^Px@BwnHpt<$|+DWTV0iV|5!U9~Wsi|o~ zd^{YzR}U5qfX2YJ!=MNUC?=U{BFHEq=r}5 zN?H8Qhw>{ezI(f`?tG#&RP?$$fxQ7fTeMcWy`r|jN9b%wy2GF4l%w|CQ~(alAvb5z ziDNB=**>xJ;u$<$b2E9Mg4yM<;q-#-|-`>{y zb0xn&ySyDXs!PxT`E*;LL=WI(EZJy1An(k~n4gigVJ?^Bkf&I|L6g4VClJgCg1ajY zl6Fc;%FfOX1Zx1dC_`EUrYPWjNPa}k%CU<-z@Tc@vM~RD+WYQ*s{i+Yn{$x86H4JA zA~G_vviIKM*efd`TUJ&@S!F~<_8uWBTQ(u1$et-g&gb%aecs(ZpFiRIy?wg%!?`8r zJkRrSJ+H@g-LL!o{xI_7F1ewCUi;=i_l!s4XrsJ+=Uqey+hy!q83G8BuO6@Q-1*qd z-G_R+_cDWS7$m3bNjV9j)bs4UXiM4~^4-76b;w7A_CMZDASUYjfLHq-dt^ibH*cbw zvr2hH|Flen#YJ-8)arLzfglB&(WjdaBw4Gwq^kEBv{nUketg2SGYLoj`D2DihALRX z{}-r@Zop-V`|em88Ks(DT^4uUC8YI;?Y_|n_R=7W1!(RkIQ0OaZvfg_T@(#6LK~(% zdBA{!l&`3!2L5+#FmUz3Y?pRKwn{vEX<}w}`H9l#8g0s$;VEke+wG8g;NTR&paJLt zkjyuy>)<^nK-vw2!Zz4efTPXC#B`^Pop;qZv3H5p0NB4kH}nGs3}Cs*l7ih7*k!S5 zS-LR2VU8f=oMRSiUSH2VKG-^57;b@+FEB6!cKZB%b|Qj{x?tMi=(q+AUGBs>_yxiac5ApT z$UXn1n73myIu?qRgaqI_xO;hdsj8}OY?9{q1Sd$2l08fU0oR#26nx!)@mH4+7Z)3= zqN+Mm=k^juHZm`C?p|Q;(GvnE^yw}t84M=@RE9Ag z1WsRHA7I!)5d3E%PLNtFC@6rFmW~dUAy;(P*NI?s(`BqeO9tiKA$m1tg1DAHc1Hep zlvYi81tO(hULolY6f5UX)ZwBnq164#(vHq0i|UHI;IVe_WKp~>wfJiKQk;Ua>)p%= zM|;=%$=`iy*nN1P4dU8vGwN%s|E!*s{_@+J9a*L9q8}r)?0MSY<>1p^P@S0gBoG__ zbO9ZhO?M&(e?NQ*f59xWc*3$=IcGN)Cy$?VJ2*DekO$nk$90hv1v{OAdY6A0)u{kgRka2)t4yTrd5iAhWW zPRb1-AtiRo2$`YrDFQ@Nlm=s~Qf5y%ilh<2tjj4vmI%ZhO8(#snb2%*YNT&CUIM%8 zwIk@7Ink8Sh8GtY3AmS{N)V`U{uRxKZR~J4?HmFm;4=b~N_j1$inL6sYQBE4QOX#| zBWk_`reCPHhO}BEwqo|PuBI0F7OI(IH2QYlX20=!7RiDRWdS8tRVC>jUfI~lc>EYg zWfO?AWYNsGZ2K}qsV)E~`#Wq~V5(=>B%cx(QYgjm{H5)d(GrsHWENoP@V1OZ#L_`C1A;7MX+#$Zf)p1U;_RO9G=546t zqLLcuzg?j2A#YngClm3;(7!F>4y$g~1aor3)QWMB6A_%|VCOu|b{ZN!3C1CJ0RZps}h@DXZR#u2{;6t8C zcFt>27Qe$ws1MRr)ux3`T9v$3)_?R+Ki!8;jykO$epk3@GS6c4oz8D}HS3rhwUZY{ zPDj!~ANR2|b-w$67#9DegNpEw`LzS%cyx$Tc)mkHWTmrvj_FmjQQW(%uy7PAc`wDZ zqPd?AWW5z^&6&$m8nI`OmgWsC~lR-v)F+ZOBeaOo0NNbAI%lRHf4qNFUx) zuo!bwMjtNkdEFwsu9Q0jQmtSwQY$Q9Kff#N?2nkmeV~~D_M57*G9!R<82S}~#aXDa z1oqM3A)1Iykj6`m1fCE-jLffDe{6m~4FxeM(0j=+V>Oo&?8%VH>bNtxfl7e|U1f!G z7oo0w111xY*=n8P%mf=HLvSK^MO2@_v2TO3OHLdhd0@WJjS2|}-MQccG2M-O*R;sq>F+Ln#z3w8G_T)UBa$rD^ECiFj zp{lw2;!)OMJF8ZbqV7fNyXR0LNp^Bt4r~<--}1Xoe_uAyo-DE#(Du;eGJV6}>%kZ6 z5Rp@3+P_Gq{i-Tu$wIEQ{Ao&Fbq0Hui5JQt^6SIG#uE#R6W;ZMvWyspR61(2uPi=n z{EHTBNy{%01JMt*B8@z&U#ml6%bONQZxVY)e!7XFKJ`TIUA~BaN~099=wqR!-XhcDp}lQZ*_&0o;R_-aBYEA9W9r8XmodgC0)K z&_l6AzJQ$35)%_^>*=oKK}_{_CV}HhYf#XR_5D{e@^0O~AghS_?c2A&kt9AZBp>+6 z%7%S*7N#e0DRBWtCTKC2S#X!Y&KqX-OyDE*`OU~GZ059J&g23#K7hJ_lQpvbbI{`3 zX1}v=nEBU(M!O#9<$Z0o_qp-!6wW6F$jah&C8wn^=IDWrlaY}TnvT7zH!Z|}MqsRe zmG_*e%s6G9cy8zS*?HgSG!g%3EMCIw<{||H5CQaOOR@}NgKB-UtvW%RnUm+)^(2o7 z@-rW&mOeE*4-2!}X7<(x_Q}@OcU!|w#E#}Jo!%gd zUwA3sq9YfVc+X$DAQ(H`G-(cBdu!hnYK}W(g|Bo%M(;<;yw=&tQ^>uQJuFDoHS0ms zqKSQj2Ed3L|ENQ96#k`sgNhg}@EKTk(Zu3X^mGN(goKe$(t<|#d5lT;%nd z^-m2oS7#RLHe2StTCAIMFTC`>ftD<85}lp8Ha_LB>FacSv{|A5&~qVXeC^$zU$><{ zIg!MQXa{WkI?F6P<9;U z>VK3|vmrBPA-oiKA)SgMm5MPySY*X?f1ax2Wz%8Mcxu^cu^IY_OhkaM*n_eo+}xV7 z<+3e~k`2;}AAm0KA@XnrG=9@_~I*9vlr_o{?B6^_&`N%DRz#Ab^}vaW*IigTa8I z2{IpW?MrG(rgex0{mp*o>7w9a?shAeW+g%(074^VM)T9dh!D8ULmZk!NTjlcMr3^3 zm{H0fkT`_ltfry=dWs8wz6O#95a?UwnMCGUKCn=Y^*`yzX`-^eVXVtk~&9)G3L|en)dqLoHe1g)s70C5l4+QtHo8C3)M(N16N|2tAwwX5->{EBH20l zT%ZzRsQsYWJ)NFDMXYlAbE`TUN8#;JCI3ow>=ZP*@0+nGT z^G%u6HMQ>sE>HpKnF~B2R|d1?jHT}^b|nF@8^O;CQjoL5Nr?Cd)j_ZfZsIdwTBDp7 zYI%h`s1^pYz}5vG^8U}C_)D_%4OPNXCYwcqeTD$oaCzw~c$9@1Xha2WX%SDi1Poi}#V zv&Y2*v7C=XOVc9PVAeuYUQgxYzQTbKJ$j|h#F(b{`qMem)~EDk`s_01lRSLFoaFgshu6mYttH zR<|l2ZS2u^Vy9-{;&=!u9s!NsQ&8${aWOZ-;`{tOKQwh=?=&qeFw0Vy`@j(gbcfY4 zD(Q?H4n5#U5GVsY*9ZgHGZ*oHr;~7PLBL@A{cDrBlj_eUav~gDTqRBHm99)R*>SPM z;A5?VnRTMWf`rHdkuQ!wo549E7nfiT7*%Wky{(EB(UW;J`K?K=zsjr8& zBQ2+ugFKkW~ENtZv55(P>9Xt@s;5L#X5UD^r0_zf(lC$>ET4e0>@;4Al z`IoEIgK>XT)A7+!v|J9Lk5H*CE-zC_`NI)oy1MXk8M?@o6(WUbFez2a8*aMgpjMDL zX?0Ry0URE%_ZifIeT4r!D8VhERfj+Y&dZO3gYCxWq`$u|F5(S{$}LEj9Tj&e&fQ_o zOi1_yUK~P<{onRp5egNI7~%YqdP9M;e%}&@q(hS$-#D+LB56_&e3;HDB&+)*6SlDG z2jeBSNl?s(Bm3Pk7+zgt>b}o8+ZYkP2bQ`moRD5jZH}s*>x6y^fB3rd+|hD+(Bq(> z(Kjd2ciy8)LSvWm8j{0LYk8OE22hF1yIbkr(2P>!YYHG{{^}=cyK|+T2Ne!J7*Cs_Za+)W|#T7 z2sKDrL{@7_M5z{db3)IbKM$b;oPfFJ!OdYlN~`BVHU?V*!;1!W&{JiS-L6?}-a&8w&?VbAjonW8G7)m30T90u<2^bVv65$9OmLeYdsV|m^M z;uf@-ASH!Kn%K>o=R+-$lmcGk(4Pm}C{IZ`AW|>1ju3m)3_I>Ba?(S6pK45A_Ex!qZbf7^I zsL42A%4{55y*$KAzE3h6kqNg=x}&4R`p5VF_Z^XQrx!SLHCH37ucpdMpYnkj0BtPb zSLul2f$OY8-VQY-(Vd_^kWF-|VdD zw1?Q8v=2y9B{9?Ay@I;x*|$v{d9G$ck73LzPQM8Klu==m3aYMi^@YN^=1;WfBq++}y+-`7+$^ z7&So-l}g&J`lY{Ljg$J!x3;LL$5|N8VaU@4Qi%}A?~)W3zkS1HpzPMYpbmI__+lB} zEqDsyJ^_1Iu^-BQ;1!kcuNzb~ut)|>c65XVm1=S}r|v;pjI*YaI|Ro_DBQjclRcoM zP#VLW+8nGgfaR=BLtzF4-d7}Iq{F@S4Gs5wefKw~CwhB}A$J1q0FJldfBj=;hgAXU z(K;}90QpEgvV;HCHwhj1YR4Z9NiD*Idt-p(-@63y&1xLsrn?$p)^>#ryXnfHQ2~E- z`}?9kWu?wM6}mYS&y%{=X{zgozKc73&$Zy}5&fGF&eeFtl!bOCF_@VWKJnigISK=y0`$vLpAb@#H18Qt*DWw>i;JV6 zMh61Ayqp}cK3`Q(^8-_i(UFlS8Jy%qP=ML9)swdpfJW5#gN*>hqc~XGy^p3EbXwWY zb|Ztm3{ceHhlfNF?T}Pq%%ugm^aY9E`LkzFJP51yX8pIpj?)47Goar+h4W`X;|#YJ zupB2RrzMXgs0^k4?2mwzp$O2Pp-c?WjdEN&YKoW1qdPa88IEjz#i@Md2}KD=!MpCf zEhnC2XSbZd6UiRVS$c%B)XKJRc$c+hsr&t9df%AP#Jw%i){{@7m?QPm^x~q^WzQ>{ zua4FdY~lLyr*xkx^`q0=?nG;1>t^Dm%}VDY7_}3Vxml> z%OL{*?#x~p1k3r8NnuWad<>k5C166rlmezJ zXNI|F&^_=+fL3Big|hiWQ!OkgNcHt@QVTbAj2TerzBK*>*aEy$0Lcg78*OxPfr!># zl)`L&)A~9i^h>bofR5qJffRDbnwQw)6N-KF*DX?O&!8V&;8&qmd>v|Ba>ZDlhn6Z= znQsF}7=f4+3YnIXCtg+Mj7eE1t^Qo#l1F1}?BZH~r$yTiRX?NUF=qOpgGVnl871+7 zd1gH4n$g~~YQsLRlst>zH7x{9bbQJR)U&nhO_69zk_dqhrBc}%KFgW~H`fZS`HEVL z`?IG%Qsm-w@DqfE^bH&lKC#})Za8T{Xsb&A{^GUq9)(;uHA;&bKU!^` zZJ#;CzfywB-g@px7l>K@zy5|`Ee(wv;>@s2y}W51c> zSB>w~`DYQhFS$9n2>$W76v*|(ykK2j(GpWEy3zFFkn@*x5E}v3b0_FY#w$t>YKa$- zlO}#{+!biWwo-)QUWOs1}4B=DL2^ib`4bR>ePSOUv zLz^|?4$*)Pe~prf-!>j&{*_pDh%a(F;KOvfOYZonKGVx@eYYiC$a0W?sO+SEDoiG? z^Wi|GKN~fQ>>0=SL%a*&P!1DjM=oCsiBy4m_AO0&s?XcMZRFckzIPKc!eM20OffP` z3-JktOq9|%8m!n(`qZbVTRf-?hluTG?R;T^h{mTkLs&RA_HfUVUKN#6voReGt5oC0 zmMtMN*){9LgAP98Jo&B{JCsXU7Kw)3xti}jAt+ZEV7M13I@Dnxp$;D{D+l?*?xR{W z5^<6P=U6C^3{!U(T-hzd;N|33&POf^IPm{ivEd3DF9*wfAh64wv|+c5fG_VF zDLNAk*99N??^{u$^lby`nGln#*wm<65u|l`(trPuHN+JXOvSs;oWcwUL%5K<={x7{ zT|9f&e}2DK5i24lnSo_X0Y~`kC2xHDr0suxsF-B}U)R}PI7UqYM;}&k)#rIf=6|j# zF_;(bo)!9IWK&Ww>DkNJT>e^ye=ix{d?f`7NyC&8XZ0j0mqj$G?{h-^%j; z)vs*t)+qIOvd=Z7znYpU2JZrC2n2Mdx?SugivMu~q;byB<@?vE6yDGvZk~f% zAV%tbNcr~$m7C$f0Vs8(DCPuftDpR3(X`2tN>uBW@;J=Q!Wf}i`Hlav6!Ti-(8~r< zk4dJ8X%*b0-S8bUm&1xs=4)h_r2e~L^Y4fzN8S?vA?X3_j`QDt{wIzGoz7NJs1AoI z^l$9ILO>t{OHfM3#z@TSZBYGPpMT<`{O;NMpAcC6_#01ue<9l{;U3L#`2T(@=Zv#8 zZw;9Y_}`yxnQ#`>-^@Npvi%Lcf8vMl$h?Z1!5KY{$~EPDU%EBv#d|F;VNo!!o|l2?~2m9Y%{FTEL^0{{R3 literal 0 HcmV?d00001 diff --git a/script/mindspore-deepseek/README.md b/script/mindspore-deepseek/README.md new file mode 100644 index 0000000..5353edf --- /dev/null +++ b/script/mindspore-deepseek/README.md @@ -0,0 +1,27 @@ +# MindSpore-DeepSeek部署脚本 + +本部署脚本用于自动化部署 vllm+mindspore部署DeepSeek R1&V3。脚本采用Python语言编写,涵盖了从镜像拉取、依赖安装、容器部署、服务拉起的完整流程,旨在简化部署过程,提高部署效率和准确性。 + +### 1. 环境要求 +1. **操作系统**:OpenEuler22.03 LTS SP4及以上要求 +2. **软件依赖**: + - `docker`:镜像下载,容器管理; + - `Python3`:用于脚本执行; + - `oedp`:应用快速安装部署平台; + +### 2. 脚本执行 +参考该项目下的DeepSeekV3&R1部署指南-第四章节配置config.yaml后执行以下命令 + +```bash +oedp run install +``` + +### 3. FAQ + +1.下载的权重是CKPT格式的,脚本中默认是safetensor格式,如何修改? + +```shell +# 修改config.yaml 模型权重类型 +model_type: ckpt +``` + diff --git a/script/mindspore-deepseek/config.yaml b/script/mindspore-deepseek/config.yaml new file mode 100644 index 0000000..35db0fb --- /dev/null +++ b/script/mindspore-deepseek/config.yaml @@ -0,0 +1,40 @@ +all: + children: + masters: + hosts: + master1: + ansible_host: 1.2.3.4 + ansible_port: 22 + ansible_user: root + ansible_password: "" + + workers: + hosts: + worker1: + ansible_host: 2.3.4.5 + ansible_port: 22 + ansible_user: root + ansible_password: "" + + vars: + # 容器镜像 + image_name: hub.oepkgs.net/oedeploy/openeuler/aarch64/deepseek_hyperinfer + image_tag: openeuler22.03-py3.11 + # 推理服务所在容器的名称 + container_name: openeuler_ds + # 模型路径 + model_path: /path/to/model + # ray 开放的端口 + ray_port: 6379 + # 节点个数 + node_num: 2 + # 拉起服务前是否停止其他容器 + is_stop_other_container: 0 + # 推理服务端口 + llm_port: 8000 + # ray集群使用的网卡 + ray_device: enp67s0f0np0 + # 模型权重类型 + model_type: safetensors + # 跳过 ssh 校验(如需禁用此功能,请注释以下配置项) + ansible_ssh_common_args: '-o StrictHostKeyChecking=no' diff --git a/script/mindspore-deepseek/main.yaml b/script/mindspore-deepseek/main.yaml new file mode 100644 index 0000000..dac8b1d --- /dev/null +++ b/script/mindspore-deepseek/main.yaml @@ -0,0 +1,9 @@ +name: mindspore-deepseek +description: auto deploy DeepSeek with mindspore +action: + install: + description: auto deployment + tasks: + - name: install + playbook: install.yml + scope: all diff --git a/script/mindspore-deepseek/workspace/install.yml b/script/mindspore-deepseek/workspace/install.yml new file mode 100644 index 0000000..2d1fec9 --- /dev/null +++ b/script/mindspore-deepseek/workspace/install.yml @@ -0,0 +1,24 @@ +- hosts: + - masters + - workers + roles: + - prepare + any_errors_fatal: true + +- hosts: + - masters + roles: + - start/ray-master + any_errors_fatal: true + +- hosts: + - workers + roles: + - start/ray-worker + any_errors_fatal: true + +- hosts: + - masters + roles: + - start/deepseek + any_errors_fatal: true diff --git a/script/mindspore-deepseek/workspace/roles/prepare/files/lib/ascend_prepare.sh b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/ascend_prepare.sh new file mode 100644 index 0000000..235ccbb --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/ascend_prepare.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# 各个节点均执行 + +# 下载依赖 +PKG_LIST="unzip which initscripts coreutils findutils gawk e2fsprogs util-linux net-tools pciutils gcc make automake autoconf libtool git patch kernel-devel-$(uname -r) kernel-headers-$(uname -r) dkms" + +for pkg in $PKG_LIST; do + if ! rpm -q "$pkg" > /dev/null 2>&1; then + echo "安装 $pkg..." + if ! yum -y install "$pkg"; then + echo "安装 $pkg 失败" + fi + else + echo "$pkg 已安装,跳过" + fi +done + +# 下载驱动 +rm -rf npu-driver +mkdir -p npu-driver/hdk-install +wget -O npu-driver/driver.zip https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Ascend%20HDK/Ascend%20HDK%2024.1.RC3/Ascend-hdk-910b-npu_24.1.rc3_linux-aarch64.zip + +if [ $? -ne 0 ]; then + echo "下载失败" + exit 1 +fi + +# 解压驱动 +cd npu-driver +unzip driver.zip +nested_zip=$(find . -name "*.zip" -not -path "./driver.zip" | head -n 1) +unzip -o "$nested_zip" -d "./hdk-install" + +# 安装驱动 +cd hdk-install +bash install.sh install all +if [ $? -ne 0 ]; then + echo "hdk驱动&固件安装失败" + exit 1 +fi + +echo "hdk驱动&固件安装成功!请重启机器生效" diff --git a/script/mindspore-deepseek/workspace/roles/prepare/files/lib/example_config b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/example_config new file mode 100644 index 0000000..d96c038 --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/example_config @@ -0,0 +1,19 @@ +#[容器镜像] +IMAGE_NAME=hub.oepkgs.net/oedeploy/openeuler/aarch64/mindspore +IMAGE_TAG=latest +#[推理服务所在容器的名称] +CONTAINER_NAME=openeuler_ds +#[模型路径] +MODEL_PATH=/workspace/deepseekv3 +#[ray开放的端口] +RAY_PORT=6399 +#[节点个数] +NODE_NUM=2 +#[拉起服务前是否停止其他容器] +IS_STOP_OTHER_CONTAINER=0 +#[推理服务端口] +LLM_PORT=8000 +#[ray集群使用的网卡] +RAY_DEVICE=enp67s0f0np0 +#[模型权重类型] +MODEL_TYPE=safetensors \ No newline at end of file diff --git a/script/mindspore-deepseek/workspace/roles/prepare/files/lib/net_check.sh b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/net_check.sh new file mode 100644 index 0000000..cca835c --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/net_check.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +# 设置TLS +for i in {0..7}; do + hccn_tool -i $i -tls -s enable 0 +done + +# 检查TLS状态 +for i in {0..7}; do + hccn_tool -i $i -tls -g | grep switch +done + +# 检查链路状态 +for i in {0..7}; do + hccn_tool -i $i -link -g | grep -i 'link status: UP' + if [ $? -ne 0 ]; then + echo "节点npu设备 $i 检测link status不为UP" + exit 1 + fi +done + +# 检查网络健康状态 +for i in {0..7}; do + hccn_tool -i $i -net_health -g | grep -i 'Success' + if [ $? -ne 0 ]; then + echo "节点npu设备 $i 检测net_health不为Success" + fi +done + +# 检查IP信息 +for i in {0..7}; do + hccn_tool -i $i -ip -g +done + +# 添加机器卡间互联检查 +check_inter_device_connection() { + echo -e "${BLUE}请输入目标NPU卡的IP地址 (输入q退出检查):${NC}" + while true; do + read -p "IP地址: " target_ip + if [ "$target_ip" = "q" ]; then + break + fi + + if [[ ! $target_ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo -e "${RED}无效的IP地址格式,请重新输入${NC}" + continue + fi + + echo -e "\n${BLUE}正在检查与 $target_ip 的连接...${NC}" + for i in {0..7}; do + echo -e "\n本机设备 $i ping $target_ip:" + hccn_tool -i $i -ping -g address $target_ip + done + + echo -e "\n${BLUE}是否继续检查其他IP?(输入q退出,输入其他继续)${NC}" + read -p "选择: " choice + if [ "$choice" = "q" ]; then + break + fi + done +} + +main() { + if [ "$1" = "--check-connection" ]; then + check_inter_device_connection + fi +} + +main "$@" diff --git a/script/mindspore-deepseek/workspace/roles/prepare/files/lib/npu_net_config_simple.sh b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/npu_net_config_simple.sh new file mode 100644 index 0000000..d8acac3 --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/npu_net_config_simple.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# 简易辅助脚本,仅配置npu的ip +# sh npu_set_config_simple.sh 1 + +net_config() { + if [ "$1" ]; then + for i in {0..7}; do + hccn_tool -i $i -ip -s address 10.10.0.$1$i netmask 255.255.0.0 + done + else + echo "请输入节点id,从1开始,会使用节点id设置对应的ip地址" + echo "npu会设置ip为10.10.0.{节点}{npu卡id},例如:" + echo "sh npu_set_config_simple.sh 1" + echo "该样例中节点id为1, 卡id为0-7" + echo "设置ip为10.10.0.10 ~ 10.10.0.17" + exit 1 + fi + # 检查IP信息 + for i in {0..7}; do + hccn_tool -i $i -ip -g + done + echo "npu卡ip配置完成" +} + +net_config "$@" diff --git a/script/mindspore-deepseek/workspace/roles/prepare/files/lib/ray_start.sh b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/ray_start.sh new file mode 100644 index 0000000..826eb12 --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/ray_start.sh @@ -0,0 +1,32 @@ +#!/bin/bash +current_path=$( + cd $(dirname $0/) + pwd +) +ENV_FILE=/root/.bashrc +source $current_path/config.cfg +source $ENV_FILE +ray_start() { + ps -ef | grep "python" | grep -v grep | awk '{print $2}' | xargs kill + ray stop + + if [ "$1" ]; then + # 从节点 + nohup ray start --address=$1:$RAY_PORT & + else + # 主节点 + nohup ray start --head --include-dashboard=False --port=$RAY_PORT & + sleep 5 + for i in {1..10}; do + ray status | grep '8.0 NPU' + if [ $? -eq 0 ]; then + echo "主节点ray已启动" + break + fi + sleep 3 + done + fi + echo "ray 已在后台运行" +} + +ray_start "$@" diff --git a/script/mindspore-deepseek/workspace/roles/prepare/files/lib/set_env.sh b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/set_env.sh new file mode 100644 index 0000000..e43b877 --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/set_env.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# 各个节点的容器内均执行 +current_path=$( + cd $(dirname $0/) + pwd +) +source $current_path/config.cfg + +ENV_ARG=' +# openeuler_deepseek_env_config +export ASCEND_CUSTOM_PATH=$ASCEND_HOME_PATH/../ +export MS_ENABLE_LCCL=off +export HCCL_OP_EXPANSION_MODE=AIV +export vLLM_MODEL_BACKEND=MindFormers +export vLLM_MODEL_MEMORY_USE_GB=53 +export MS_DEV_RUNTIME_CONF="parallel_dispatch_kernel:True" +export MS_ALLOC_CONF="enable_vmm:True" +export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 +export ASCEND_TOTAL_MEMORY_GB=64 +export HCCL_CONNECT_TIMEOUT=7200 +export MS_COMPILER_CACHE_ENABLE=1 +' + +NET_ENV=" +export GLOO_SOCKET_IFNAME=$RAY_DEVICE +export TP_SOCKET_IFNAME=$RAY_DEVICE +export HCCL_SOCKET_IFNAME=$RAY_DEVICE +" + +if [ $NODE_NUM -eq 2 ]; then + YAML_FILE='/root/Python-3.11/lib/python3.11/site-packages/research/deepseek3/deepseek_r1_671b/predict_deepseek_r1_671b_w8a8.yaml' +elif [ $NODE_NUM -eq 4 ]; then + YAML_FILE='/root/Python-3.11/lib/python3.11/site-packages/research/deepseek3/deepseek_r1_671b/predict_deepseek_r1_671b.yaml' +fi + + +# 修改权重类型 +sed -e 's/^load_ckpt_format.*/load_ckpt_format: "'$MODEL_TYPE'"/' -i $YAML_FILE +if [ "$MODEL_TYPE" = "ckpt" ]; then + sed -e 's/^auto_trans_ckpt.*/auto_trans_ckpt: False/' -i $YAML_FILE +fi + +YAML_ENV="export MINDFORMERS_MODEL_CONFIG=$YAML_FILE" + +ENV_FILE=/root/.bashrc + +if grep -q "openeuler_deepseek_env_config" /root/.bashrc; then + echo "存在已配置的环境变量,详见容器内/root/.bashrc" + exit 0 +fi + +echo "$ENV_ARG" >> $ENV_FILE +echo "$NET_ENV" >> $ENV_FILE +echo "$YAML_ENV" >> $ENV_FILE +source $ENV_FILE + diff --git a/script/mindspore-deepseek/workspace/roles/prepare/files/lib/start_docker.sh b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/start_docker.sh new file mode 100644 index 0000000..5e97f7f --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/start_docker.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +# 各个节点均执行 +current_path=$( + cd $(dirname $0/) + pwd +) +source $current_path/config.cfg +# 安装docker +yum install docker -y + +# 检测镜像是否已被拉取 +docker images | grep $IMAGE_NAME | grep $IMAGE_TAG +if [ $? -ne 0 ]; then + docker pull $IMAGE_NAME:$IMAGE_TAG + if [ $? -ne 0 ]; then + echo "docker镜像拉取失败,请手动下载并加载" + exit 1 + fi +fi + +# 停止所有现存容器实例 +if [ $IS_STOP_OTHER_CONTAINER -ne 0 ]; then + docker stop $(docker ps -aq) +fi + +# 如果存在名称相同的容器,则直接使用 +docker ps -a | grep $IMAGE_NAME:$IMAGE_TAG | grep $CONTAINER_NAME +if [ $? -eq 0 ]; then + echo "发现容器 $CONTAINER_NAME 已存在,直接使用" + docker start $CONTAINER_NAME + exit 0 +fi + +# 如果存在名称相同,但镜像不同容器,则报错 +docker ps -a | grep $CONTAINER_NAME +if [ $? -eq 0 ]; then + echo "发现容器名称 $CONTAINER_NAME 已被使用,请排查" + exit 1 +fi + +# 拉起容器实例 +docker run -itd --privileged --hostname $(hostname) --name=$CONTAINER_NAME --net=host \ + --shm-size 500g \ + --device=/dev/davinci0 \ + --device=/dev/davinci1 \ + --device=/dev/davinci2 \ + --device=/dev/davinci3 \ + --device=/dev/davinci4 \ + --device=/dev/davinci5 \ + --device=/dev/davinci6 \ + --device=/dev/davinci7 \ + --device=/dev/davinci_manager \ + --device=/dev/hisi_hdc \ + --device /dev/devmm_svm \ + -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ + -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \ + -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ + -v /usr/local/sbin:/usr/local/sbin \ + -v /usr/sbin:/usr/sbin \ + -v /etc/hccn.conf:/etc/hccn.conf \ + -v /usr/bin/netstat:/usr/bin/netstat \ + -v /usr/bin/lscpu:/usr/bin/lscpu \ + -v $MODEL_PATH:$MODEL_PATH \ + --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \ + $IMAGE_NAME:$IMAGE_TAG \ + bash diff --git a/script/mindspore-deepseek/workspace/roles/prepare/files/lib/start_ds.sh b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/start_ds.sh new file mode 100644 index 0000000..0a637ae --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/prepare/files/lib/start_ds.sh @@ -0,0 +1,53 @@ +#!/bin/bash +current_path=$( + cd $(dirname $0/) + pwd +) +ENV_FILE=/root/.bashrc +source $current_path/config.cfg +source $ENV_FILE +# 仅主节点运行 + +if [ $NODE_NUM -eq 2 ]; then + NPU_NUM=16.0 + PARALLEL=16 +elif [ $NODE_NUM -eq 4 ]; then + NPU_NUM=32.0 + PARALLEL=32 +fi + +ray_status=0 +for i in {1..10}; do + ray status | grep "$NPU_NUM NPU" + if [ $? -eq 0 ]; then + echo "ray集群已全部拉起" + ray_status=1 + break + fi + sleep 3 +done + +if [ $ray_status -eq 0 ]; then + echo "ray集群超时" + exit 1 +fi + +#拉起服务 +rm -rf ds.log +nohup python3 -m vllm_mindspore.entrypoints vllm.entrypoints.openai.api_server --model "$MODEL_PATH" --port=$LLM_PORT --trust_remote_code --tensor_parallel_size=$PARALLEL --max-num-seqs=192 --max_model_len=32768 --max-num-batched-tokens=16384 --block-size=32 --gpu-memory-utilization=0.93 --num-scheduler-steps=8 --distributed-executor-backend=ray &> ds.log & +#检测推理服务是否拉起 +llm_status=0 +for i in {1..7200}; do + netstat -ntlp | grep $LLM_PORT + if [ $? -eq 0 ]; then + echo "推理服务已拉起,端口$LLM_PORT已打开" + llm_status=1 + break + fi + sleep 1 +done + +if [ $llm_status -eq 0 ]; then + echo "推理服务拉起超时,请手动确认" + exit 1 +fi \ No newline at end of file diff --git a/script/mindspore-deepseek/workspace/roles/prepare/files/prepare.sh b/script/mindspore-deepseek/workspace/roles/prepare/files/prepare.sh new file mode 100644 index 0000000..c000112 --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/prepare/files/prepare.sh @@ -0,0 +1,65 @@ +#!/bin/bash +current_path=$( + cd $(dirname $0/) + pwd +) +source $current_path/lib/config.cfg + +cp_into_container() { + docker cp $current_path/lib $CONTAINER_NAME:/workspace +} + +main() { + set -e + chmod -R +x $current_path/lib + + systemctl stop firewalld + systemctl stop iptables + + # 检查防火墙是否启动,如果启动则检查端口是否在防火墙白名单中,如果不存在则添加到白名单中 + status=$(systemctl status firewalld | grep -E "Active" | awk -F":" '{print $2}' | awk -F" " '{print $1}') + if [[ "${status}" == "active" ]]; then + # ray 端口防火墙检查 + port_ray=$(firewall-cmd --query-port=$RAY_PORT/tcp) + if [[ "${port_ray}" == "no" ]]; then + port_ray=$(firewall-cmd --zone=public --add-port=$RAY_PORT/tcp --permanent) + firewall-cmd --reload + fi + port_ray=$(firewall-cmd --query-port=$RAY_PORT/tcp) + if [[ "${port_ray}" != "yes" ]]; then + echo -e "防火墙开启 $RAY_PORT端口失败" + exit 1 + fi + port_llm=$(firewall-cmd --query-port=$LLM_PORT/tcp) + if [[ "${port_llm}" == "no" ]]; then + port_llm=$(firewall-cmd --zone=public --add-port=$LLM_PORT/tcp --permanent) + firewall-cmd --reload + fi + port_llm=$(firewall-cmd --query-port=$LLM_PORT/tcp) + if [[ "${port_llm}" != "yes" ]]; then + echo -e "防火墙开启 $LLM_PORT端口失败" + exit 1 + fi + fi + + # 检测需要部署的节点ip数量 + if [ [ $NODE_NUM -ne 2 ] && [ $NODE_NUM -ne 4 ] ]; then + echo "当前仅支持两/四节点部署,当前数量是$NODE_NUM" + exit 1 + fi + + # 1. 启动Docker容器并复制文件 + $current_path/lib/start_docker.sh + cp_into_container + + # 2. 执行组网检查 + $current_path/lib/net_check.sh + + #进入容器执行 + # 3. 设置容器内环境变量 + docker exec -it $CONTAINER_NAME /workspace/lib/set_env.sh + +} + +# 执行主函数 +main "$@" diff --git a/script/mindspore-deepseek/workspace/roles/prepare/tasks/main.yml b/script/mindspore-deepseek/workspace/roles/prepare/tasks/main.yml new file mode 100644 index 0000000..f31adb3 --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/prepare/tasks/main.yml @@ -0,0 +1,34 @@ +- name: Set hostname + hostname: + name: "{{ inventory_hostname }}" + +- name: Set dir_path as a fact + set_fact: + dir_path: "/home/mindspore-deepseek" + +- name: Create directory + file: + path: "{{ dir_path }}" + state: directory + mode: '0644' + +- name: Copy prepare.sh to hosts + copy: + src: prepare.sh + dest: "{{ dir_path }}" + mode: '0755' + +- name: Copy lib to hosts + copy: + src: lib + dest: "{{ dir_path }}" + mode: '0644' + +- name: Copy config.cfg to hosts + template: + src: config.cfg.j2 + dest: "{{ dir_path }}/lib/config.cfg" + mode: '0644' + +- name: Execute prepare.sh + shell: sh {{ dir_path }}/prepare.sh diff --git a/script/mindspore-deepseek/workspace/roles/prepare/templates/config.cfg.j2 b/script/mindspore-deepseek/workspace/roles/prepare/templates/config.cfg.j2 new file mode 100644 index 0000000..de9cb18 --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/prepare/templates/config.cfg.j2 @@ -0,0 +1,19 @@ +#[容器镜像] +IMAGE_NAME={{ image_name }} +IMAGE_TAG={{ image_tag }} +#[推理服务所在容器的名称] +CONTAINER_NAME={{ container_name }} +#[模型路径] +MODEL_PATH={{ model_path }} +#[ray开放的端口] +RAY_PORT={{ ray_port }} +#[节点个数] +NODE_NUM={{ node_num }} +#[拉起服务前是否停止其他容器] +IS_STOP_OTHER_CONTAINER={{ is_stop_other_container }} +#[推理服务端口] +LLM_PORT={{ llm_port }} +#[ray集群使用的网卡] +RAY_DEVICE={{ ray_device }} +#[模型权重类型] +MODEL_TYPE={{ model_type }} \ No newline at end of file diff --git a/script/mindspore-deepseek/workspace/roles/start/deepseek/tasks/main.yml b/script/mindspore-deepseek/workspace/roles/start/deepseek/tasks/main.yml new file mode 100644 index 0000000..c1a5fee --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/start/deepseek/tasks/main.yml @@ -0,0 +1,2 @@ +- name: Start DeepSeek on master + shell: docker exec {{ container_name }} /workspace/lib/start_ds.sh diff --git a/script/mindspore-deepseek/workspace/roles/start/ray-master/tasks/main.yml b/script/mindspore-deepseek/workspace/roles/start/ray-master/tasks/main.yml new file mode 100644 index 0000000..9fbb45f --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/start/ray-master/tasks/main.yml @@ -0,0 +1,2 @@ +- name: Start Ray on master + shell: docker exec {{ container_name }} /workspace/lib/ray_start.sh diff --git a/script/mindspore-deepseek/workspace/roles/start/ray-worker/tasks/main.yml b/script/mindspore-deepseek/workspace/roles/start/ray-worker/tasks/main.yml new file mode 100644 index 0000000..a002379 --- /dev/null +++ b/script/mindspore-deepseek/workspace/roles/start/ray-worker/tasks/main.yml @@ -0,0 +1,2 @@ +- name: Start Ray on worker + shell: docker exec {{ container_name }} /workspace/lib/ray_start.sh {{ hostvars[groups['masters'][0]].ansible_host }} diff --git a/tool/benchmark/README.md b/tool/benchmark/README.md new file mode 100644 index 0000000..d294d2b --- /dev/null +++ b/tool/benchmark/README.md @@ -0,0 +1,91 @@ +# benchmark性能测试脚本 + +本测试脚本旨在对在线推理服务进行性能评估。 + +### 测试参数 + +可以通过以下命令查看benchmark测试参数 + +```shell +# python benchmark_parallel.py -h +None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used. +usage: benchmark_parallel.py [-h] [--backend {vllm,mindspore,base,tgi,openai,trt,embedding,openai-chat}] [--host HOST] + [--port PORT] [--url URL] [--app-code APP_CODE] --tokenizer TOKENIZER [--best-of BEST_OF] + [--use-beam-search] [--request-rate REQUEST_RATE] [--epochs EPOCHS] + [--parallel-num PARALLEL_NUM [PARALLEL_NUM ...]] + [--output-tokens OUTPUT_TOKENS [OUTPUT_TOKENS ...]] + [--prompt-tokens PROMPT_TOKENS [PROMPT_TOKENS ...]] [--benchmark-csv BENCHMARK_CSV] + [--seed SEED] [--served-model-name SERVED_MODEL_NAME] + [--num-scheduler-steps NUM_SCHEDULER_STEPS] [--enable-prefix-caching ENABLE_PREFIX_CACHING] + [--prefix-caching-num PREFIX_CACHING_NUM] [--use-spec-decode] + [--num-speculative-tokens NUM_SPECULATIVE_TOKENS] [--dataset-type {random,sharegpt,human-eval}] + [--dataset-path DATASET_PATH] [--use-real-dataset-output-tokens] + [--use-pd-separate USE_PD_SEPARATE] + +Benchmark the serving prefill performance. + +options: + -h, --help show this help message and exit + --backend {vllm,mindspore,base,tgi,openai,trt,embedding,openai-chat} + --host HOST + --port PORT + --url URL + --app-code APP_CODE + --tokenizer TOKENIZER + Name or path of the tokenizer. + --best-of BEST_OF Generates `best_of` sequences per prompt and returns the best one. + --use-beam-search + --request-rate REQUEST_RATE + Number of requests per second. If this is inf, then all the requests are sent at time 0. Otherwise, + we use Poisson process to synthesize the request arrival times. + --epochs EPOCHS Number of epochs. + --parallel-num PARALLEL_NUM [PARALLEL_NUM ...] + Number of parallel request number. + --output-tokens OUTPUT_TOKENS [OUTPUT_TOKENS ...] + Max tokens to process. + --prompt-tokens PROMPT_TOKENS [PROMPT_TOKENS ...] + Max tokens to process. + --benchmark-csv BENCHMARK_CSV + Path to the csv. + --seed SEED + --served-model-name SERVED_MODEL_NAME + --num-scheduler-steps NUM_SCHEDULER_STEPS + --enable-prefix-caching ENABLE_PREFIX_CACHING + --prefix-caching-num PREFIX_CACHING_NUM + --use-spec-decode + --num-speculative-tokens NUM_SPECULATIVE_TOKENS + the step if spec decode, default -1 for disable accept rate statistic. + --dataset-type {random,sharegpt,human-eval} + --dataset-path DATASET_PATH + --use-real-dataset-output-tokens + --use-pd-separate USE_PD_SEPARATE + +``` + +### 多batch测试 + +可以参考以下命令进行192-batch多并发测试 + +```bash +python benchmark_parallel.py --backend openai --host [主服务IP] --port [推理接口] --tokenizer [权重路径] --num-scheduler-steps=8 --epochs 1 --parallel-num 192 --prompt-tokens 256 --output-tokens 256 +``` + +最终输出如下: + +```shell +2025-03-19 08:25:32,725 - benchmark_utils - INFO - 所有请求耗时: 13.5293 s +2025-03-19 08:25:32,726 - benchmark_utils - INFO - 请求吞吐: 14.1914 requests/s +2025-03-19 08:25:32,726 - benchmark_utils - INFO - 输出tokens总吞吐: 3633.0039 tokens/s +2025-03-19 08:25:32,728 - benchmark_utils - INFO - 首tokens时延TP90: 7958.1101 ms +2025-03-19 08:25:32,729 - benchmark_utils - INFO - 首tokens时延TP99: 7964.8968 ms +2025-03-19 08:25:32,729 - benchmark_utils - INFO - 最大首tokens时延: 7966.0322 ms +2025-03-19 08:25:32,729 - benchmark_utils - INFO - 平均首tokens时延: 5049.2075 ms +2025-03-19 08:25:32,740 - benchmark_utils - INFO - 增量时延TP90: 159.5743 ms +2025-03-19 08:25:32,744 - benchmark_utils - INFO - 增量时延TP99: 175.7760 ms +2025-03-19 08:25:32,746 - benchmark_utils - INFO - 最大增量时延: 207.5 ms +2025-03-19 08:25:32,749 - benchmark_utils - INFO - 平均增量时延: 20.8 ms +2025-03-19 08:25:42,751 - benchmark_utils - INFO - ['输入长度', '输出长度', '并发数', '输出tokens总吞吐', '首tokens时延TP90(ms)', '首tokens时延TP99(ms)', '最大首tokens时延(ms)', '平均首tokens时延(ms)', '增量时延TP90(ms)', '增量时延TP99(ms)', '最大增量时延(ms)', '平均增量时延(ms)'] +2025-03-19 08:25:42,753 - benchmark_utils - INFO - [256.0, 256.0, 192, 3633.0039, 7958.1101, 7964.8968, 7966.0322, 5049.2075, 159.5743, 175.776, 207.5029, 20.7627] +2025-03-19 08:25:42,753 - __main__ - INFO - Benchmark parallel finished +``` + diff --git a/tool/benchmark/benchmark_parallel.py b/tool/benchmark/benchmark_parallel.py new file mode 100644 index 0000000..7eea809 --- /dev/null +++ b/tool/benchmark/benchmark_parallel.py @@ -0,0 +1,443 @@ +import argparse +import asyncio +import json +import os +import random +import logging +from typing import AsyncGenerator, List, Tuple, Optional + +import numpy as np +from tqdm import tqdm +from transformers import PreTrainedTokenizerBase + +from benchmark_utils import (generate_str, get_tokenizer, get_api_url, + get_request_data, do_request, + save_to_csv, statistics_and_print_performance_data, + generate_hello_str, check_multi_step) + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + +CACHE_DATASET = None + + +def sample_random_requests( + tokenizer: PreTrainedTokenizerBase, + prompt_tokens: int, + output_tokens: int, + enable_prefix_caching: bool = False, + prefix_caching_num: int = 0 +) -> List[Tuple[str, int, int]]: + prompt = generate_str(tokenizer, prompt_tokens) + requests_list=[(prompt, prompt_tokens, output_tokens)] + if enable_prefix_caching and prefix_caching_num: + # construct prompt with the same prefix. + caching_prompt = generate_hello_str(tokenizer, prefix_caching_num) + generate_str(tokenizer, + prompt_tokens - prefix_caching_num) + requests_list.append((caching_prompt, prompt_tokens, output_tokens)) + return requests_list + + +# just copy from vllm. +def sample_sharegpt_requests( + dataset_path, + requests_num, + tokenizer: PreTrainedTokenizerBase, + modified_output_len: Optional[int] = None, +) -> List[Tuple[str, int, int]]: + if modified_output_len is not None and modified_output_len < 4: + raise ValueError("output_len too small") + # Load the dataset. + global CACHE_DATASET + if CACHE_DATASET is None: + with open(dataset_path) as f: + dataset = json.load(f) + # Filter out the conversations with less than 2 turns. + # Only keep the first two turns of each conversation. + dataset = [subset for subset in dataset if len(subset["conversations"]) >= 2] + dataset = [(subset["conversations"][0]["value"], + subset["conversations"][1]["value"]) for subset in dataset] + + # Shuffle the dataset. + random.shuffle(dataset) + + CACHE_DATASET = dataset + else: + dataset = CACHE_DATASET + + # Filter out sequences that are too long or too short + filtered_dataset: List[Tuple[str, int, int]] = [] + for i in range(len(dataset)): + if len(filtered_dataset) == requests_num: + break + + # Tokenize the prompts and completions. + prompt = dataset[i][0] + prompt_token_ids = tokenizer(prompt).input_ids + output = dataset[i][1] + output_token_ids = tokenizer(output).input_ids + prompt_len = len(prompt_token_ids) + output_len = len(output_token_ids + ) if modified_output_len is None else modified_output_len + if prompt_len < 4 or output_len < 4: + # Filter sequences that are too short. + continue + if prompt_len > 1024 or prompt_len + output_len > 2048: + # Filter sequences that are too long. + continue + filtered_dataset.append((prompt, prompt_len, output_len)) + + return filtered_dataset + + +def sample_human_eval_requests( + dataset_path: str, + requests_num: int, + tokenizer: PreTrainedTokenizerBase, + modified_output_len: Optional[int] = None, +): + # Load the dataset. + global CACHE_DATASET + if CACHE_DATASET is None: + with open(dataset_path, encoding='utf-8') as f: + dataset = [json.loads(line) for line in f] + # Filter out the conversations with less than 2 turns. + dataset = [(data["prompt"], data["canonical_solution"]) for data in dataset] + + # Shuffle the dataset. + + random.shuffle(dataset) + CACHE_DATASET = dataset + else: + dataset = CACHE_DATASET + + # Filter out sequences that are too long or too short + filtered_dataset: List[Tuple[str, int, int]] = [] + for i in range(len(dataset)): + if len(filtered_dataset) == requests_num: + break + + # Tokenize the prompts and completions. + prompt = dataset[i][0] + prompt_token_ids = tokenizer(prompt).input_ids + output = dataset[i][1] + output_token_ids = tokenizer(output).input_ids + prompt_len = len(prompt_token_ids) + output_len = len(output_token_ids + ) if modified_output_len is None else modified_output_len + if prompt_len == 0 or output_len == 0: + continue + + filtered_dataset.append((prompt, prompt_len, output_len)) + + return filtered_dataset + + +async def get_request( + input_requests, + req_rate +) -> AsyncGenerator[Tuple[str, int, int], None]: + input_requests = iter(input_requests) + for req in input_requests: + yield req + + if req_rate == float("inf"): + # If the request rate is infinite, then we don't need to wait. + continue + # Sample the request interval from the exponential distribution. + interval = np.random.exponential(1.0 / req_rate) + # The next request will be sent after the interval. + await asyncio.sleep(interval) + + +async def send_request( + request_latency_record: List, + backend: str, + api_url: str, + prompt: str, + prompt_len: int, + output_len: int, + best_of: int, + use_beam_search: bool, + app_code: str = None, + model: str = None, + served_model_name: str = None, + num_scheduler_steps: int = 1, + use_spec_decode: bool = False +) -> None: + headers, pload, confirm_error_output = get_request_data(backend, + prompt, + prompt_len, + output_len, + best_of, + use_beam_search, + app_code, + model, + served_model_name, + use_spec_decode) + + time_record, chunk_record = await do_request(api_url, headers, pload, confirm_error_output, + output_len, num_scheduler_steps, use_spec_decode) + + output_tokens = len(time_record) - 1 + + # output_tokens will smaller than output_len when use spec decode, fix it in update_spec_output_tokens function. + if not use_spec_decode and output_tokens < output_len: + logger.error(f"output_tokens: %d < output_len: %d", output_tokens, output_len) + + request_latency_record.append((prompt_len, output_len, time_record, chunk_record)) + + +async def benchmark( + request_latency_record: List, + backend: str, + api_url: str, + input_requests: List[Tuple[str, int, int]], + best_of: int, + use_beam_search: bool, + request_rate: float, + parallel_num: int, + epochs: int, + app_code: str = None, + model: str = None, + served_model_name: str = None, + num_scheduler_steps: int = 1, + use_spec_decode: bool = False +) -> None: + input_index = 0 + for ep in tqdm(range(epochs), desc="epoch"): + input_parallel = [] + for id in range(parallel_num): + input_parallel.append(input_requests[input_index]) + input_index += 1 + if input_index >= len(input_requests): + input_index = 0 + + tasks: List[asyncio.Task] = [] + async for request in get_request(input_parallel, request_rate): + prompt, prompt_len, output_len = request + task = asyncio.create_task(send_request(request_latency_record, + backend, api_url, prompt, + prompt_len, output_len, + best_of, use_beam_search, + app_code, + model, + served_model_name, + num_scheduler_steps, + use_spec_decode)) + tasks.append(task) + await asyncio.gather(*tasks) + + +def group_get_output_tokens_per_step(output_list, tokenizer): + token_list = tokenizer.batch_encode_plus(output_list, add_special_tokens=False, return_attention_mask=False)[ + "input_ids"] + token_len_list = [0] + [len(token) for token in token_list] + # use max(end - start, 1) to ensure at lest 1 output token (when the model output eos token, the client will + # receive empty str). + return [max(end - start, 1) for (end, start) in zip(token_len_list[1:], token_len_list[:-1])] + + +def update_spec_output_tokens(request_latency_record, tokenizer, backend): + def decode_openai_output(chunk_list): + output_list = [] + cur_output = "" + for chunk in chunk_list: + if chunk.startswith(b'data:'): + output = chunk[5:].strip().decode("utf-8") + else: + output = chunk.strip().strip().decode("utf-8").rstrip("\0") + + if output != '[DONE]': + output = json.loads(output) + output = output["choices"][0]["text"] + cur_output += output + output_list.append(cur_output) + + return output_list + + def decode_vllm_output(chunk_list): + output_list = [] + for chunk in chunk_list: + output = chunk.strip().strip().decode("utf-8").rstrip("\0") + output = json.loads(output)["text"][0] + output_list.append(output) + + return output_list + + if backend == "openai": + request_output_list = [decode_openai_output(chunk_list) for _, _, _, chunk_list in request_latency_record] + elif backend == "vllm": + request_output_list = [decode_vllm_output(chunk_list) for _, _, _, chunk_list in request_latency_record] + else: + logger.warning( + f"Backend {backend} is not supported in spec decode benchmark, it might return the incorrect results.") + return + + request_output_lens_list = [group_get_output_tokens_per_step(output_list, tokenizer) for output_list in + request_output_list] + + for req_index in range(len(request_latency_record)): + (prompt_len, output_len, time_record, chunk_record) = request_latency_record[req_index] + output_lens_per_step = request_output_lens_list[req_index] + new_time_record = [time_record[0]] + for o_len, timestamp in zip(output_lens_per_step, time_record[1:]): + new_time_record.extend([timestamp] * o_len) + + output_tokens = len(new_time_record) - 1 + if len(new_time_record) - 1 < output_len: + logger.warning(f"output_tokens: %d < output_len: %d, maybe caused by the difference between the number of " + f"tokens re-encoded by the tokenizer and the number of original tokens.", output_tokens, output_len) + + # replace chunk_record to output_step for acceptance rate of speculative decode. + request_latency_record[req_index] = (prompt_len, output_len, new_time_record, len(output_lens_per_step)) + + +def get_dataset_requests(args, tokenizer, prompt_tokens, output_tokens, parallel_num): + if args.dataset_type == "random": + logger.info( + f"Benchmark running with parallel_num: %d, " + f"prompt_tokens: %d, output_tokens: %d", + parallel_num, prompt_tokens, output_tokens + ) + return sample_random_requests(tokenizer, prompt_tokens, output_tokens, + args.enable_prefix_caching, args.prefix_caching_num) + else: + if not os.path.exists(args.dataset_path): + raise ValueError(f"Dataset path {args.dataset_path} is not existed.") + + logger.info( + f"Benchmark running with parallel_num: %d, " + f"dataset: %s, output_tokens: %s", + parallel_num, + args.dataset_type, "real" if args.use_real_dataset_output_tokens else str(output_tokens) + ) + + if args.dataset_type == "sharegpt": + return sample_sharegpt_requests(args.dataset_path, parallel_num * args.epochs, tokenizer, + None if args.use_real_dataset_output_tokens else output_tokens) + elif args.dataset_type == "human-eval": + return sample_human_eval_requests(args.dataset_path, parallel_num * args.epochs, + tokenizer, + None if args.use_real_dataset_output_tokens else output_tokens) + else: + raise ValueError("Unsupport dataset.") + + +def main(args: argparse.Namespace): + logger.info(args) + random.seed(args.seed) + np.random.seed(args.seed) + + if args.enable_prefix_caching and not args.prefix_caching_num: + logger.error("The prefix_caching_num parameter must be seted for prefix_caching.") + return + + api_url = get_api_url(args.backend, args.host, args.port, args.url) + tokenizer = get_tokenizer(args.tokenizer) + + # if not args.use_spec_decode: + # is_multi_step = check_multi_step(args, api_url, tokenizer, args.prompt_tokens[0], args.output_tokens[0]) + # if not is_multi_step: + # logger.error("The service does not use multi_step or num-scheduler-steps is different from the service.") + # return + # + # logger.info(f"Warmup ...") + # input_requests = sample_random_requests(tokenizer, args.prompt_tokens[0], args.output_tokens[0]) + # asyncio.run( + # benchmark([], args.backend, api_url, input_requests, args.best_of, + # args.use_beam_search, args.request_rate, 4, 1, args.app_code, args.tokenizer, + # args.served_model_name, args.num_scheduler_steps, args.use_spec_decode) + # ) + + if args.dataset_type != "random": + logging.info("When use sharegpt or human-eval dataset, the number of the --input-tokens will be ignored.") + if args.use_real_dataset_output_tokens: + logging.info("When use --use-real-dataset-output-tokens, the number of the --output-tokens will be ignored.") + if args.use_spec_decode and args.num_speculative_tokens >= 0: + logging.info("When enable --use-spec-decode and --num-speculative-tokens >= 0, the acceptance rate of " + "speculative inference will be collected. Ensure that --num-speculative-tokens in the benchmark is " + "equal to --num-speculative-tokens in the vllm service.") + + all_latency_record = [] + for parallel_num in args.parallel_num: + for i, prompt_tokens in enumerate(args.prompt_tokens): + output_tokens = args.output_tokens[i] + + input_requests = get_dataset_requests(args, tokenizer, prompt_tokens, output_tokens, parallel_num) + + request_latency_record: List[Tuple[int, int, List]] = [] + asyncio.run(benchmark(request_latency_record, args.backend, api_url, input_requests, args.best_of, + args.use_beam_search, args.request_rate, parallel_num, + args.epochs, args.app_code, args.tokenizer, + args.served_model_name, args.num_scheduler_steps, args.use_spec_decode)) + if args.use_spec_decode: + update_spec_output_tokens(request_latency_record, tokenizer, args.backend) + + statistics_and_print_performance_data(args, prompt_tokens, output_tokens, parallel_num, + request_latency_record, all_latency_record) + + if args.dataset_type == "random": + all_latency_record.sort() + else: + # the mean input tokens and output tokens of real dataset will be a little diffferent in defferent batch_size, + # so just sort by batch_size + all_latency_record.sort(key=lambda x: x[2]) + + + benchmark_head = ["输入长度", "输出长度", "并发数", + "输出tokens总吞吐", + "首tokens时延TP90(ms)", "首tokens时延TP99(ms)", "最大首tokens时延(ms)", "平均首tokens时延(ms)", + "增量时延TP90(ms)", "增量时延TP99(ms)", "最大增量时延(ms)", "平均增量时延(ms)"] + + if args.use_spec_decode and args.num_speculative_tokens >= 0 and len(all_latency_record[-1]) != len(benchmark_head): + accept_head = ["投机接受率TP90", "投机接受率TP99", "投机最大接受率", "投机最小接受率", "投机平均接受率"] + benchmark_head = benchmark_head + accept_head + + save_to_csv(benchmark_head, all_latency_record, args.benchmark_csv) + + logger.info("Benchmark parallel finished") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Benchmark the serving prefill performance.") + parser.add_argument("--backend", type=str, default="mindspore", + choices=["vllm", "mindspore", "base", "tgi", "openai", "trt"]) + parser.add_argument("--host", type=str, default="localhost") + parser.add_argument("--port", type=int, default=9288) + parser.add_argument("--url", type=str, default="") + parser.add_argument("--app-code", type=str, default=None) + parser.add_argument("--tokenizer", type=str, required=True, + help="Name or path of the tokenizer.") + parser.add_argument("--best-of", type=int, default=1, + help="Generates `best_of` sequences per prompt and " + "returns the best one.") + parser.add_argument("--use-beam-search", action="store_true") + parser.add_argument("--request-rate", type=float, default=float("inf"), + help="Number of requests per second. If this is inf, " + "then all the requests are sent at time 0. " + "Otherwise, we use Poisson process to synthesize " + "the request arrival times.") + parser.add_argument("--epochs", type=int, default=10, + help="Number of epochs.") + parser.add_argument("--parallel-num", nargs='+', type=int, default=[1, 4, 8], + help="Number of parallel request number.") + parser.add_argument("--output-tokens", nargs='+', type=int, default=[256, 256, 256], + help="Max tokens to process.") + parser.add_argument("--prompt-tokens", nargs='+', type=int, default=[512, 1024, 2048], + help="Max tokens to process.") + parser.add_argument("--benchmark-csv", type=str, default="benchmark_parallel.csv", + help="Path to the csv.") + parser.add_argument("--seed", type=int, default=0) + parser.add_argument("--served-model-name", type=str, default=None) + parser.add_argument("--num-scheduler-steps", type=int, default=1) + parser.add_argument("--enable-prefix-caching", type=bool, default=False) + parser.add_argument("--prefix-caching-num", type=int, default=0) + parser.add_argument("--use-spec-decode", action="store_true") + parser.add_argument("--num-speculative-tokens", type=int, default=-1, help="the step if spec decode, default -1 for disable accept rate statistic.") + parser.add_argument("--dataset-type", default="random", choices=["random", "sharegpt", "human-eval"]) + parser.add_argument("--dataset-path", default="") + parser.add_argument("--use-real-dataset-output-tokens", action="store_true") + args_global = parser.parse_args() + main(args_global) diff --git a/tool/benchmark/benchmark_utils.py b/tool/benchmark/benchmark_utils.py new file mode 100644 index 0000000..982314e --- /dev/null +++ b/tool/benchmark/benchmark_utils.py @@ -0,0 +1,466 @@ +import asyncio +import csv +import json +import logging +import os +import stat +import time +from typing import Union + +import aiohttp +import numpy as np +import requests +from tqdm import tqdm +from transformers import (AutoTokenizer, PreTrainedTokenizer, + PreTrainedTokenizerFast) + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) +IS_DEBUG = int(os.environ.get("BENCKMARK_DEBUG", 0)) +EPOCH_NUM = 10 +# The size of the data block returned in each iteration is not greater than 8192. Therefore, chunk_size is 8192. +CHUNK_SIZE = 8192 +TIMEOUT = 3 * 3600 + +if IS_DEBUG: + import matplotlib.lines as mlines + import matplotlib.pyplot as plt + + +def get_tokenizer( + transformer_tokenizer_path: str, +) -> Union[PreTrainedTokenizer, PreTrainedTokenizerFast]: + """Gets a tokenizer for the given model name via Huggingface.""" + tokenizer = AutoTokenizer.from_pretrained(transformer_tokenizer_path, trust_remote_code=True) + + return tokenizer + + +def generate_hello_str(tokenizer, length, hello_token="Hello"): + text = hello_token * (length - 1) + completion_token_ids = tokenizer([text]).input_ids + while len(completion_token_ids[0]) < length: + text += hello_token + completion_token_ids = tokenizer([text]).input_ids + + return text + + +def generate_str(tokenizer, length): + vocab_size = tokenizer.vocab_size + ids = np.random.randint(vocab_size / 4, vocab_size / 3, length) + text = tokenizer.decode(ids) + + completion_token_ids = tokenizer([text]).input_ids + if IS_DEBUG: + logger.info("len(completion_token_ids[0]) %d, length %d ", len(completion_token_ids[0]), length) + + epoch = EPOCH_NUM + while len(completion_token_ids[0]) != length and epoch > 0: + while len(completion_token_ids[0]) > length: + diff = len(completion_token_ids[0]) - length + now_length = ids.shape[0] - diff + ids = ids[:now_length] + text = tokenizer.decode(ids) + completion_token_ids = tokenizer([text]).input_ids + if IS_DEBUG: + logger.info("len(completion_token_ids[0]) %d, %d ", len(completion_token_ids[0]), length) + + while len(completion_token_ids[0]) < length: + diff = length - len(completion_token_ids[0]) + diff_ids = np.random.randint(vocab_size / 4, vocab_size / 3, diff) + ids = np.append(ids, diff_ids) + text = tokenizer.decode(ids) + completion_token_ids = tokenizer([text]).input_ids + if IS_DEBUG: + logger.info("len(completion_token_ids[0]) %d, %d ", len(completion_token_ids[0]), length) + + epoch -= 1 + + if len(completion_token_ids[0]) != length: + text = generate_hello_str(tokenizer, length) + + if IS_DEBUG: + logger.info(text) + return text + + +def get_api_url(backend, host, port, url): + if url is not None and len(url) > 0: + return url + + if backend == "mindspore": + api_url = f"http://{host}:{port}/models/llama2/generate" + elif backend == "base": + api_url = f"http://{host}:{port}/v1/generate" + elif backend == "tgi": + api_url = f"https://{host}:{port}/generate_stream" + elif backend == "openai": + api_url = f"http://{host}:{port}/v1/completions" + elif backend == "trt": + api_url = f"http://{host}:{port}/v2/models/ensemble/generate_stream" + else: + api_url = f"http://{host}:{port}/generate" + return api_url + + +def get_request_data( + backend: str, + prompt: str, + prompt_len: int, + output_len: int, + best_of: int, + use_beam_search: bool, + app_code: str = None, + model: str = None, + served_model_name: str = None, + use_spec_decode: bool = False +): + confirm_error_output = False + + if app_code is not None and len(app_code) > 0: + headers = {"User-Agent": "Benchmark Client", + 'Content-Type': 'application/json', + 'X-Apig-AppCode': app_code} + else: + headers = {"User-Agent": "Benchmark Client"} + + if backend == "vllm": + pload = { + "prompt": prompt, + "temperature": 0.0, + "top_p": 0.8, + "top_k": 5, + "max_tokens": output_len, + "ignore_eos": True, + "stream": True, + } + if use_spec_decode: + pload["skip_special_tokens"] = False + confirm_error_output = True + elif backend == "openai": + if served_model_name is None: + served_name = model + else: + served_name = served_model_name + pload = { + "prompt": prompt, + "temperature": 0, + "top_p": 0.8, + "top_k": 5, + "max_tokens": output_len, + "ignore_eos": True, + "model": served_name, + "stream": True, + } + if use_spec_decode: + pload["skip_special_tokens"] = False + confirm_error_output = True + elif backend == "mindspore": + params = { + "max_new_tokens": output_len, + "do_sample": False, + "ignore_eos": True, + "return_full_text": False + } + pload = { + "inputs": prompt, + "parameters": params, + "stream": True + } + elif backend == "base": + pload = { + "prompt": prompt, + "max_tokens": (prompt_len + output_len), + "model_name": "llama2", + "do_sample": False, + "stream": True, + "debug": 2 + } + elif backend == "tgi": + params = { + "best_of": best_of, + "max_new_tokens": output_len, + "do_sample": False, + "ignore_eos_token": True, + "decoder_input_details": False + } + pload = { + "inputs": prompt, + "parameters": params, + } + confirm_error_output = True + elif backend == "trt": + headers = {"Content-Type": "text/event-stream; charset=utf-8"} + params = { + "max_tokens": output_len, + "min_length": output_len, + "bad_words": "", + "stop_words": "", + "ignore_eos": True, + "stream": True + } + pload = { + "text_input": prompt, + "parameters": params, + } + confirm_error_output = True + else: + raise ValueError(f"Unknown backend: {backend}") + + return headers, pload, confirm_error_output + + +async def do_request(api_url, headers, pload, confirm_error_output, output_len, num_scheduler_steps, + use_spec_decode=False): + timeout = aiohttp.ClientTimeout(total=TIMEOUT) + first_token = True + async with aiohttp.ClientSession(timeout=timeout, connector=aiohttp.TCPConnector(ssl=False)) as session: + while True: + last_chunk = None + prefill_start_time = time.perf_counter() + time_record = [prefill_start_time] + chunk_record = [] + async with session.post(api_url, headers=headers, json=pload) as response: + async for chunk, _ in response.content.iter_chunks(): + if len(chunk.strip()) > 0: + last_chunk = chunk + return_token_num = 1 if first_token else min(num_scheduler_steps, output_len) + time_record.extend([time.perf_counter()] * return_token_num) + first_token = False + output_len -= return_token_num + # for maximum block depth + if len(chunk.strip()) > 0 and use_spec_decode: + chunk_record.append(last_chunk) + + if confirm_error_output: + if last_chunk.startswith(b'data:'): + output = last_chunk[5:].strip().decode("utf-8") + else: + output = last_chunk.strip().strip().decode("utf-8").rstrip("\0") + + if IS_DEBUG: + logger.info(output) + if output == '[DONE]': + break + try: + output = json.loads(output) + except Exception: + logger.error("Exception") + break + + # Re-send the request if it failed. + if "error" not in output: + break + else: + logger.error("request failed, %s, retry", output) + await asyncio.sleep(0.1) + else: + break + return time_record, chunk_record + + +def check_multi_step(args, api_url, tokenizer, prompt_len, output_len): + prompt = generate_str(tokenizer, prompt_len) + headers, pload, confirm_error_output = get_request_data(args.backend, + prompt, + prompt_len, + output_len, + args.best_of, + args.use_beam_search, + args.app_code, + args.tokenizer, + args.served_model_name) + return_num = 0 + response = requests.post(api_url, headers=headers, json=pload, stream=True, timeout=TIMEOUT) + response.raise_for_status() + for chunk in response.iter_content(chunk_size=CHUNK_SIZE): + return_num += 1 + + # openai流式最后返回[done],其余接口没有 + end_chunk_num = 1 if args.backend == 'openai' else 0 + # 首token + 是否有返回[done] + chunk_num + theory_return_num = 1 + end_chunk_num + (output_len - 1) // args.num_scheduler_steps + # (output_len - 1) % num_scheduler_steps 非整除情况下最后返回包含剩余token的chunk + theory_return_num += 1 if (output_len - 1) % args.num_scheduler_steps else 0 + if theory_return_num == return_num: + return True + return False + + +def statistics_and_print_performance_data(args, prompt_tokens, output_tokens, parallel_num, + request_latency_record, all_latency_record): + benchmark_start_time = np.min([time_record[0] for _, _, time_record, _ in request_latency_record]) + benchmark_end_time = np.max([time_record[-1] for _, _, time_record, _ in request_latency_record]) + benchmark_time = benchmark_end_time - benchmark_start_time + logger.info("所有请求耗时: %.4f s", benchmark_time) + + benchmark_requests = args.epochs * parallel_num / benchmark_time + logger.info("请求吞吐: %.4f requests/s", benchmark_requests) + + total_output_tokens = np.sum([ + output_len + for _, output_len, _, _ in request_latency_record + ]) + total_output_token_throughput = total_output_tokens / benchmark_time + logger.info("输出tokens总吞吐: %.4f tokens/s", total_output_token_throughput) + + prefill_latency_list = [ + time_record[1] - time_record[0] + for _, _, time_record, _ in request_latency_record + ] + + p90_prefill_latency = np.percentile(prefill_latency_list, 90) * 1000 + logger.info("首tokens时延TP90: %.4f ms", p90_prefill_latency) + + p99_prefill_latency = np.percentile(prefill_latency_list, 99) * 1000 + logger.info("首tokens时延TP99: %.4f ms", p99_prefill_latency) + + max_prefill_latency = np.max(prefill_latency_list) * 1000 + logger.info("最大首tokens时延: %.4f ms", max_prefill_latency) + + avg_prefill_latency = np.mean(prefill_latency_list) * 1000 + logger.info("平均首tokens时延: %.4f ms", avg_prefill_latency) + + prefill_ranges = [ + (time_record[0], time_record[1]) + for _, _, time_record, _ in request_latency_record + ] + + def in_ranges(ranges, start, end): + for time_range in ranges: + if start <= time_range[1] and end >= time_range[0]: + return True + return False + + decode_latency_list = [ + end - start + for _, _, time_record, _ in request_latency_record + for start, end in zip(time_record[1:-1], time_record[2:]) + if not in_ranges(prefill_ranges, start, end) + ] + + # 去掉开始的0(multi-step场景) + start_index = 0 + for latency_index, latency in enumerate(decode_latency_list): + if latency > 0: + start_index = latency_index + break + decode_latency_list = decode_latency_list[start_index:] + + p90_decode_latency = np.percentile(decode_latency_list, 90) * 1000 + logger.info("增量时延TP90: %.4f ms", p90_decode_latency) + + p99_decode_latency = np.percentile(decode_latency_list, 99) * 1000 + logger.info("增量时延TP99: %.4f ms", p99_decode_latency) + + max_decode_latency = np.max(decode_latency_list) * 1000 + logger.info("最大增量时延: %.1f ms", max_decode_latency) + + avg_decode_latency = np.mean(decode_latency_list) * 1000 + logger.info("平均增量时延: %.1f ms", avg_decode_latency) + + if IS_DEBUG: + plot_time_record(benchmark_start_time, benchmark_time, request_latency_record, + f"{parallel_num}_{prompt_tokens}_{output_tokens}.jpg") + + avg_prompt_token = np.mean([prompt_len for prompt_len, _, _, _ in request_latency_record]) + avg_output_token = np.mean([output_len for _, output_len, _, _ in request_latency_record]) + + if getattr(args, "height", None) is None: + latency_record = (avg_prompt_token, avg_output_token, parallel_num, + total_output_token_throughput, + p90_prefill_latency, p99_prefill_latency, max_prefill_latency, avg_prefill_latency, + p90_decode_latency, p99_decode_latency, max_decode_latency, avg_decode_latency) + else: + image_shape = str(args.height) + ',' + str(args.width) + latency_record = (avg_prompt_token, avg_output_token, parallel_num, image_shape, + total_output_token_throughput, + p90_prefill_latency, p99_prefill_latency, max_prefill_latency, avg_prefill_latency, + p90_decode_latency, p99_decode_latency, max_decode_latency, avg_decode_latency) + + # If the benchmark backend supports speculative inference, request_latency_record is replaced with output_step, + # which is an int value. Otherwise, the original chunk_list is retained as a list. + is_spec_support_backend = isinstance(request_latency_record[0][-1], int) + if getattr(args, "use_spec_decode", False) and getattr(args, "num_speculative_tokens", -1) >= 0 \ + and is_spec_support_backend: + accept_rate_list = [(output_len - 1) / ((output_step - 1) * (args.num_speculative_tokens + 1)) for + _, output_len, _, output_step in request_latency_record] + + p90_accept_rate = np.percentile(accept_rate_list, 90) + logger.info("投机接受率TP90: %.4f", p90_accept_rate) + + p99_accept_rate = np.percentile(accept_rate_list, 99) + logger.info("投机接受率TP99: %.4f", p99_accept_rate) + + max_accept_rate = np.max(accept_rate_list) + logger.info("投机最大接受率: %.2f", max_accept_rate) + + min_accept_rate = np.min(accept_rate_list) + logger.info("投机最小接受率: %.2f", min_accept_rate) + + avg_accept_rate = np.mean(accept_rate_list) + logger.info("投机平均接受率: %.2f", avg_accept_rate) + + accept_rate_record = (p90_accept_rate, p99_accept_rate, max_accept_rate, min_accept_rate, avg_accept_rate) + + latency_record = latency_record + accept_rate_record + + time.sleep(10) + + all_latency_record.append(latency_record) + + +def plot_time_record(benchmark_start_time, benchmark_time, request_latency_record, name="parallel.jpg"): + def newline(ax, p1, p2, color='skyblue'): + line = mlines.Line2D([p1[0], p2[0]], [p1[1], p2[1]], color=color, linewidth=20, markersize=100, marker=".", + markerfacecolor=color) + ax.add_line(line) + + fig_size_x = 256 + fig_size_y = 128 + fig, ax = plt.subplots(1, 1, figsize=(fig_size_x, fig_size_y), facecolor='#f7f7f7', dpi=80) + time_records = [time_record for _, _, time_record in request_latency_record] + time_records = (time_records - benchmark_start_time) * 1000 + for idx, time_record in enumerate(tqdm(time_records, desc="plot_time_record")): + idx = idx * 1 + newline(ax, [time_record[0], idx], [time_record[1], idx], color='red') + for start, end in zip(time_record[1:-1], time_record[2:]): + newline(ax, [start, idx], [end, idx]) + + ax.set_facecolor('#f7f7f7') + ax.set(xlim=(0, (benchmark_time * 1000) + 10), ylim=(-1, len(time_records) * 1), ylabel='request') + font_size = round(fig_size_x / 3) + plt.xticks(fontsize=font_size) + plt.yticks(fontsize=font_size) + plt.xlabel('time', fontsize=fig_size_x) + plt.ylabel('request', fontsize=fig_size_x) + logger.info(f"save fig ...") + plt.savefig(name) + + +def save_to_csv(benchmark_head, records, csv_path): + logger.info(benchmark_head) + sprtr_idx = csv_path.rfind('/') + if sprtr_idx > 0: + csv_dir = csv_path[0:sprtr_idx] + if len(csv_dir) > 1: + os.makedirs(csv_dir, exist_ok=True) + + # 设置文件打开的标志 + flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL + # 设置文件权限,仅授予文件所有者读写权限 + mode = stat.S_IWUSR | stat.S_IRUSR + # 使用 os.open 打开文件描述符 + fd = os.open(csv_path, flags, mode) + with os.fdopen(fd, 'w', encoding='utf-8-sig', newline='') as csv_file: + writer = csv.writer(csv_file) + writer.writerow(benchmark_head) + for items in records: + to_csv = [] + for item in items: + if isinstance(item, float): + item = round(item, 4) + to_csv.append(item) + logger.info(to_csv) + writer.writerow(to_csv) -- Gitee