From 91f78e23ef78bc575ceeb88d18f717e625d3ee34 Mon Sep 17 00:00:00 2001 From: Jacob He Date: Fri, 22 Dec 2017 11:51:30 +0800 Subject: [PATCH] 1. Merge master branch as of commit:425d2ce 2. Change the default.xml to dev branch --- LICENSE.txt | 21 +++ README.md | 261 ++++++++++++++++++++++++++++++++++++- default.xml | 17 +++ json/Redhat/amd_icd32.json | 8 ++ json/Redhat/amd_icd64.json | 8 ++ json/Ubuntu/amd_icd32.json | 8 ++ json/Ubuntu/amd_icd64.json | 8 ++ topLevelArch.png | Bin 0 -> 17407 bytes 8 files changed, 329 insertions(+), 2 deletions(-) create mode 100644 LICENSE.txt create mode 100644 default.xml create mode 100644 json/Redhat/amd_icd32.json create mode 100644 json/Redhat/amd_icd64.json create mode 100644 json/Ubuntu/amd_icd32.json create mode 100644 json/Ubuntu/amd_icd64.json create mode 100644 topLevelArch.png diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..23d4ca1 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Advanced Micro Devices, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index b85ec74..60ece46 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,259 @@ -# vulkan -AMD Vulkan Open Source Driver + +# AMD Open Source Driver for Vulkan® +The AMD Open Source Driver for Vulkan® is an open-source Vulkan driver for Radeon™ graphics adapters on Linux®. It is built on top of AMD's Platform Abstraction Library (PAL), a shared component that is designed to encapsulate certain hardware and OS-specific programming details for many of AMD's 3D and compute drivers. Leveraging PAL can help provide a consistent experience across platforms, including support for recently released GPUs and compatibility with AMD developer tools. + +Shaders that compose a particular `VkPipeline` object are compiled as a single entity using the LLVM-Based Pipeline Compiler (LLPC) library. LLPC builds on LLVM's existing shader compilation infrastructure for AMD GPUs to generate code objects compatible with PAL's pipeline ABI. + +![High-Level Architecture Diagram](topLevelArch.png) + +### Product Support +The AMD Open Source Driver for Vulkan is designed to support the following AMD GPUs: + +* Radeon™ HD 7000 Series +* Radeon™ HD 8000M Series +* Radeon™ R5/R7/R9 200/300 Series +* Radeon™ RX 400/500 Series +* Radeon™ M200/M300/M400 Series +* Radeon™ RX Vega Series +* AMD FirePro™ Workstation Wx000/Wx100/Wx300 Series +* Radeon™ Pro WX x100 Series +* Radeon™ Pro 400/500 Series + +> **Note:** Pipeline compiler support for geometry and tessellation shaders is not fully implemented for the Radeon™ RX Vega Series. APU support is limited. These issues will be addressed in upcoming releases. + +### Operating System Support +The AMD Open Source Driver for Vulkan is designed to support following distros on both the upstream driver stack and the [AMDGPU Pro driver stack](http://support.amd.com/en-us/kb-articles/Pages/AMDGPU-PRO-Driver-for-Linux-Release-Notes.aspx): +* Ubuntu 16.04.3 (64-bit version) +* RedHat 7.4 (64-bit version) + +### Feature Support and Performance +The AMD Open Source Driver for Vulkan is designed to support the following features: + +* Vulkan 1.0 +* More than 30 extensions +* [Radeon™ GPUProfiler](https://github.com/GPUOpen-Tools/Radeon-GPUProfiler) tracing +* Built-in debug and profiling tools +* Mid-command buffer preemption and SR-IOV virtualization + +The following features and improvements are planned in future releases: +* Upcoming versions of the Vulkan API +* Hardware performance counter collection through [RenderDoc](https://renderdoc.org/) +* LLPC optimizations to improve GPU-limited performance and compile time +* Optimizations to improve CPU-limited performance + +> **Note:** The CPU overhead of command submission may be reduced by leveraging the kernel driver's developmental VM-always-valid feature. This feature is temporarily disabled by default. For the time being, you may try it as described in [Runtime Settings](#Runtime-Settings). + +### Known Issues +* Dawn of War III may crash during gameplay on Radeon™ RX Vega Series due to geometry shader is not yet supported +* CTS may hang in VK.synchronization.internally_synchronized_objects.pipeline_cache_compute with Linux kernel versions lower than 4.13 + +### How to Contribute +You are welcome to submit contributions of code to the AMD Open Source Driver for Vulkan. + +The driver is built from source code in three repositories: [LLVM](https://github.com/GPUOpen-Drivers/llvm), [XGL](https://github.com/GPUOpen-Drivers/xgl) (including both Vulkan API translation and LLPC) and [PAL](https://github.com/GPUOpen-Drivers/pal). + +For changes to LLVM, you should submit contribution to the [LLVM trunk](http://llvm.org/svn/llvm-project/llvm/trunk/). Commits there will be evaluated to merge into the amd-vulkan-master branch periodically. + +For changes to XGL or PAL, please [create a pull request](https://help.github.com/articles/creating-a-pull-request/) against the dev branch. After your change is reviewed and if it is accepted, it will be evaluated to merge into the master branch in a subsequent regular promotion. + +**IMPORTANT**: By creating a pull request, you agree to allow your contribution to be licensed by the project owners under the terms of the [MIT License](LICENSE.txt). + +When contributing to XGL and PAL, your code should: +* Match the style of nearby existing code. Your code may be edited to comply with our coding standards when it is merged into the master branch. +* Avoid adding new dependencies, including dependencies on STL. + +Please make each contribution reasonably small. If you would like to make a big contribution, like a new feature or extension, please raise an issue first to allow planning to evaluate and review your work. + +> **Note:** Since PAL is a shared component that must support other APIs, other operating systems, and pre-production hardware, you might be asked to revise your PAL change for reasons that may not be obvious from a pure Linux Vulkan driver perspective. + +## Build Instructions + +### System Requirements +Your build system must have at least 16GB of RAM. + +### Install Dev and Tools Packages +#### Ubuntu +``` +sudo apt-get install build-essential python3 cmake curl g++-multilib gcc-multilib + +sudo apt-get install libx11-dev libxcb1-dev x11proto-dri2-dev libxcb-dri3-dev libxcb-dri2-0-dev libxcb-present-dev libxshmfence-dev libx11-dev:i386 libxcb1-dev:i386 x11proto-dri2-dev:i386 libxcb-dri3-dev:i386 libxcb-dri2-0-dev:i386 libxcb-present-dev:i386 libxshmfence-dev:i386 +``` +#### RedHat +``` +wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm + +sudo yum localinstall epel-release-latest-7.noarch.rpm + +sudo yum update + +sudo yum -y install gcc-c++ cmake3 python34 curl glibc-devel glibc-devel.i686 libstdc++-devel libstdc++-devel.i686 libxcb-devel libxcb-devel.i686 libX11-devel libX11-devel.i686 libxshmfence-devel libxshmfence-devel.i686 +``` + +### Get Repo Tools + +``` +mkdir ~/bin +curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo +chmod a+x ~/bin/repo +``` + +### Get Source Code + +``` +mkdir vulkandriver +cd vulkandriver +~/bin/repo init -u https://github.com/GPUOpen-Drivers/AMDVLK.git -b master{dev} +~/bin/repo sync +``` + +### 64-bit Build +#### Ubuntu +``` +cd /drivers/xgl + +cmake -H. -Bbuilds/Release64{Debug64} -DCMAKE_BUILD_TYPE=Release{Debug} -DCMAKE_MODULE_PATH=$PWD/../pal/cmake/Modules -DXGL_PAL_PATH:PATH=$PWD/../pal -DCMAKE_C_FLAGS="-DLINUX -D__x86_64__ -D__AMD64__" -DCMAKE_CXX_FLAGS="-DLINUX -D__x86_64__ -D__AMD64__" -DXGL_LLVM_SRC_PATH=$PWD/../llvm + +cd builds/Release64{Debug64} + +make -j$(nproc) +``` + +#### RedHat +``` +cd /drivers/xgl + +cmake3 -H. -Bbuilds/Release64{Debug64} -DCMAKE_BUILD_TYPE=Release{Debug} -DCMAKE_MODULE_PATH=$PWD/../pal/cmake/Modules -DXGL_PAL_PATH:PATH=$PWD/../pal -DCMAKE_C_FLAGS="-DLINUX -D__x86_64__ -D__AMD64__" -DCMAKE_CXX_FLAGS="-DLINUX -D__x86_64__ -D__AMD64__" -DXGL_LLVM_SRC_PATH=$PWD/../llvm + +cd builds/Release64{Debug64} + +make -j$(nproc) +``` + +### 32-bit Build +#### Ubuntu +``` +cd /drivers/xgl + +cmake -H. -Bbuilds/Release{Debug} -DCMAKE_BUILD_TYPE=Release{Debug} -DCMAKE_MODULE_PATH=$PWD/../pal/cmake/Modules -DXGL_PAL_PATH:PATH=$PWD/../pal -DCMAKE_C_FLAGS="-m32 -DLINUX -march=i686 -D__i386__" -DCMAKE_CXX_FLAGS="-m32 -DLINUX -march=i686 -D__i386__" -DXGL_LLVM_SRC_PATH=$PWD/../llvm + +cd builds/Release{Debug} + +make -j$(nproc) +``` +#### RedHat +``` +cd /drivers/xgl + +cmake3 -H. -Bbuilds/Release{Debug} -DCMAKE_BUILD_TYPE=Release{Debug} -DCMAKE_MODULE_PATH=$PWD/../pal/cmake/Modules -DXGL_PAL_PATH:PATH=$PWD/../pal -DCMAKE_C_FLAGS="-m32 -DLINUX -march=i686 -D__i386__" -DCMAKE_CXX_FLAGS="-m32 -DLINUX -march=i686 -D__i386__" -DXGL_LLVM_SRC_PATH=$PWD/../llvm + +cd builds/Release{Debug} + +make -j$(nproc) +``` +> **Note:** If the build runs into errors like "collect2: fatal error: ld terminated with signal 9 [Killed]" due to out of memory, you could try with reducing the number of threads in "make" command. + +## Installation Instructions +### Install Vulkan SDK +Refer to installation instructions [here](http://support.amd.com/en-us/kb-articles/Pages/Install-LunarG-Vulkan-SDK.aspx). + +### Remove Previous Installed JSON Files +``` +sudo rm /etc/vulkan/icd.d/* +sudo rm /usr/share/vulkan/icd.d/* +``` + +### Copy Driver and JSON Files +#### Ubuntu +``` +sudo cp /drivers/xgl/builds/Release64/icd/amdvlk64.so /usr/lib/x86_64-linux-gnu/ +sudo cp /drivers/xgl/builds/Release/icd/amdvlk32.so /usr/lib/i386-linux-gnu/ +sudo cp /drivers/AMDVLK/json/ubuntu/* /etc/vulkan/icd.d/ +``` +#### RedHat +``` +sudo cp /drivers/xgl/builds/Release64/icd/amdvlk64.so /usr/lib64/ +sudo cp /drivers/xgl/builds/Release/icd/amdvlk32.so /usr/lib/ +sudo cp /drivers/AMDVLK/json/redhat/* /etc/vulkan/icd.d/ +``` + +> **Note:** The remaining steps are only required when running the AMDGPU upstream driver stack. + +### Turn on DRI3 +In /usr/share/X11/xorg.conf.d/10-amdgpu.conf: +``` +Section "Device" + +Identifier "AMDgpu" + +Option "DRI" "3" + +EndSection +``` + +### Required Settings +On the AMDGPU upstream driver stack, the max number of command streams per submission **MUST** be limited to 4 (the default setting in AMD Open Source driver for Vulkan is 16). This can be accomplished via the [Runtime Settings](#Runtime-Settings) mechanism by adding the following line to /etc/amd/amdPalSettings.cfg: +``` +MaxNumCmdStreamsPerSubmit,4 +``` + +## Runtime Settings +The driver exposes many settings that can customize the driver's behavior and facilitate debugging. Add/edit settings in /etc/amd/amdPalSettings.cfg, formatted with one `name,value` pair per line. Some example settings are listed below: + +| Setting Name | Valid Values | Comment | +| ------------------------ | ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| `ShaderCacheMode` | 0: disable cache
1: runtime cache
2: cache to disk | Runtime cache is the default mode. | +| `IFH` | 0: default
1: drop all submits
| Infinitely Fast Hardware. Submit calls are dropped before being sent to hardware. Useful for measuring CPU-limited performance. | +| `EnableVmAlwaysValid` | 0: disable
1: enable
| 0 is the default setting. Can be enabled to reduce command buffer submission overhead related to virtual memory management. | +| `IdleAfterSubmitGpuMask` | Bitmask of GPUs (i.e., bit 0 is GPU0, etc.) | Forces the CPU to immediately wait for each GPU submission to complete on the specified set of GPUs. | + +*All* available settings can be determined by examining the .cfg source files that define them. + +* .../xgl/icd/settings/settings.cfg (API layer settings) +* .../pal/src/core/settings.cfg (PAL hardware-independent settings) +* .../pal/src/core/hw/gfxip/gfx6/gfx6PalSettings.cfg (PAL GFX6-8 settings) +* .../pal/src/core/hw/gfxip/gfx9/gfx9PalSettings.cfg (PAL GFX9+ settings) + +Runtime settings are only read at device initialization, and cannot be changed without restarting the application. If running on a system with multiple GPUs, the same settings will apply to all of them. Lines in the settings file that start with `;` will be treated as comments. + + +## PAL GpuProfiler Layer +The GpuProfiler is an optional layer that is designed to intercept the PAL interface to provide basic GPU profiling support. Currently, this layer is controlled exclusively through runtime settings and outputs its results to file. + +You can use the following [runtime settings](#Runtime-Settings) to generate a .csv file with GPU timings of work performed during the designated frames: + +| Setting Name | Value | Comment | +| -------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `GpuProfilerMode` | 0: disable
1: enable with sqtt off
2: enable with sqtt for thread trace
3: enable with sqtt for RGP | Enables and sets the SQTT mode for the GPU performance profiler layer. Actual capture of performance data must be specified via frame number with GpuProfilerStartFrame or by holding shift-F11. | +| `GpuProfilerLogDirectory` | <directory-path> | Must be a directory that your application has write permissions for. | +| `GpuProfilerGranularity` | 0: per-draw
1: per-cmdbuf | Defines what is measured/profiled. *Per-draw* times individual commands (such as draw, dispatch, etc.) inside command buffers, while *per-cmdbuf* only profiles entire command buffers in aggregate. | +| `GpuProfilerStartFrame` | Positive integer | First frame to capture data for. If StartFrame and FrameCount are not set, all frames will be profiled. | +| `GpuProfilerFrameCount` | Positive integer | Number of frames to capture data for. | +| `GpuProfilerRecordPipelineStats` | 0, 1 | Gathers pipeline statistic query data per entry if enabled. | + +## PAL Debug Overlay +PAL's debug overlay can be enabled to display real time statistics and information on top of a running application. This includes a rolling FPS average, CPU and GPU frame times, and a ledger tracking how much video memory has been allocated from each available heap. Benchmarking (i.e., "Benchmark (F11)") is currently unsupported. + +| Setting Name | Value | Comment | +| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| `DebugOverlayEnabled` | 0, 1 | Enables the debug overlay. | +| `DebugOverlayLocation` | 0: top-left
1: top-right
2: bottom-left
3: bottom-right | Determines where the overlay text should be displayed. Can be used to avoid collision with important rendering by the application. | +| `PrintFrameNumber` | 0, 1 | Reports the current frame number. Useful when determining a good frame range for profiling with the GpuProfiler layer. | +| `TimeGraphEnable` | 0, 1 | Enables rendering of a graph of recent CPU and GPU frame times. | + + +## Third Party Software +The AMD Open Source Driver for Vulkan contains code written by third parties. +* LLVM is distributed under the terms of the University of Illinois/NCSA Open Source License. See LICENSE.TXT file in the top directory of the LLVM repository. +* Please see the README.md file in the [PAL](https://github.com/GPUOpen-Drivers/pal) and [XGL](https://github.com/GPUOpen-Drivers/xgl) repositories for information on third party software used by those libraries. + + +#### DISCLAIMER +The information contained herein is for informational purposes only, and is subject to change without notice. This document may contain technical inaccuracies, omissions and typographical errors, and AMD is under no obligation to update or otherwise correct this information. Advanced Micro Devices, Inc. makes no representations or warranties with respect to the accuracy or completeness of the contents of this document, and assumes no liability of any kind, including the implied warranties of noninfringement, merchantability or fitness for particular purposes, with respect to the operation or use of AMD hardware, software or other products described herein. No license, including implied or arising by estoppel, to any intellectual property rights is granted by this document. Terms and limitations applicable to the purchase or use of AMD's products are as set forth in a signed agreement between the parties or in AMD's Standard Terms and Conditions of Sale. + +AMD, the AMD Arrow logo, Radeon, FirePro, and combinations thereof are trademarks of Advanced Micro Devices, Inc. Other product names used in this publication are for identification purposes only and may be trademarks of their respective companies. + +Vega is a codename for AMD architecture, and is not a product name. + +Linux is the registered trademark of Linus Torvalds in the U.S. and other countries. + +Vulkan and the Vulkan logo are registered trademarks of the Khronos Group, Inc. diff --git a/default.xml b/default.xml new file mode 100644 index 0000000..e49fe83 --- /dev/null +++ b/default.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + diff --git a/json/Redhat/amd_icd32.json b/json/Redhat/amd_icd32.json new file mode 100644 index 0000000..6604fc9 --- /dev/null +++ b/json/Redhat/amd_icd32.json @@ -0,0 +1,8 @@ +{ + "file_format_version": "1.0.0", + "ICD": { + "library_path": "/usr/lib/amdvlk32.so", + "abi_versions": "0.9.0" + } +} + diff --git a/json/Redhat/amd_icd64.json b/json/Redhat/amd_icd64.json new file mode 100644 index 0000000..c2fcf41 --- /dev/null +++ b/json/Redhat/amd_icd64.json @@ -0,0 +1,8 @@ +{ + "file_format_version": "1.0.0", + "ICD": { + "library_path": "/usr/lib64/amdvlk64.so", + "abi_versions": "0.9.0" + } +} + diff --git a/json/Ubuntu/amd_icd32.json b/json/Ubuntu/amd_icd32.json new file mode 100644 index 0000000..978b327 --- /dev/null +++ b/json/Ubuntu/amd_icd32.json @@ -0,0 +1,8 @@ +{ + "file_format_version": "1.0.0", + "ICD": { + "library_path": "/usr/lib/i386-linux-gnu/amdvlk32.so", + "abi_versions": "0.9.0" + } +} + diff --git a/json/Ubuntu/amd_icd64.json b/json/Ubuntu/amd_icd64.json new file mode 100644 index 0000000..40a08eb --- /dev/null +++ b/json/Ubuntu/amd_icd64.json @@ -0,0 +1,8 @@ +{ + "file_format_version": "1.0.0", + "ICD": { + "library_path": "/usr/lib/x86_64-linux-gnu/amdvlk64.so", + "abi_versions": "0.9.0" + } +} + diff --git a/topLevelArch.png b/topLevelArch.png new file mode 100644 index 0000000000000000000000000000000000000000..74ce4e05e2202b497afadabbfdb7d5b1598e5489 GIT binary patch literal 17407 zcmd742T)U8_b(hpK@_B^fK)|5C4vHibQJ+56a|5R6e*!f4G?M&QF?g<3DOk=L_iF^ zN2G}XBHc)n8VH>LA)(}+@I3E(@BjP0dGEb5-<`S6sKYsXud~Bz=iI5UmNqOCk7U+H2ToyOWjS6fIufB z!y0$GlUxR=TZ>0P^XXca(1H(QgBtuxZCsF{LOz14iODEU5d?}$mqtXGl{u@RkAZ~Q zfPcP*L63s|+yNf}tqG$*AU}2p2&5b-3IYkXa)Ll?Hq4;sO#ckaTQZChPgYd(zo%Q- zUZ9s@L>TnE*>axGwa@pjYF!y>t)%cB@QuWr$V{Uc?#=`&^n9e^hc}9{XnmxzZH=vh zZOGc_i(xpDc4vK^$_|MYw~6YViFz-e&)dR}4RcOHmL%=_Ne0IbmQ9~k)4C0h6xDp( zd#5p-;efqEI#zp)e@cp7?iyEqAuGDo?;?uF^wIa1ekU9HETv4gZ=wEr?y_DSS{1^^-X*Q4i-Kv3%jRZ_U)7&B_v}ky5zinmG)Yg z>?u?hAkvV-xA&qRW{QMP?ecefq3_b zGDUxUEGG| zeibb8C%5aC*JT6uC!sxLXHpKks>9+LCBv2YC)VCjT>u>B{C*|Nvmv=1JgE24^9BEcD^vh~agWKiXCG0dgaI^a`7Mk|%f zi^q?(a*9X>w1)v_BpMm=~Y zxtWvmlZF=K^Kf%A+HNTZ=r?mQouzTm9HmxHTVYkdh|w@um&)@FA#n%Cl{<=w3ZM?_ z__PGsO^poZMSVWB$Pf=6pJMQi+hxKoIvzrpiJ+5d^N%DhU+Gj$3!+7aS~=)l}Qda1@k!>%==` zE2pEBC;RRFNYS5`Q^L=w9FTX7t#?3MBBz9RI_2ONclfOfGAnxlG%5s3%(HiBrtwf-rkKXWy}-DXme8bHt^ld_~g@R`cml4 zTJQFkRAPw)v)Dr!fC0qP)A7AMC2Jmw`f;_h;$QYKi1;jy6dy8nl~em28^F?-Oml;C zk7VWYpUzu|En5GPM*9`PyUd%R02lJQOi2%q?gI?YTNpN9dUKmb=lv1lI_gskA+77Lrt5Wa%w-V zi3HxKaMR}t0SgVOp-=JvWV)FkKz}Gsf0#-ic`GWc@vSsGxz6Xn8FY5vZpDST3$Ob0 zWUiD$i0QA@4z`BAdG5DUPo=V;WqK-`Q}#Dq*Uy1K=j9j4T+W@Jww7aN<49Eq$ty=d zKR;Z7Bj`Rl`ad}8|LV`*xo;P?C2417E9c}#3u)#5+i|<-Z7Xad_HQe(L*BUqdSVPH zGM_@cqz%B34f7_T)4!vkM}w!sAH+Lw76A_Wq+o(T+AnTZRa?vfG!kDnJ?Wi}(h$P- zYhY!uSGlo%=Uu>Nz86iiDq}rTH(Wr!!-46Bq9{d4hrub0bwB=Z*X8uiu*%18wHlm; zT@Cm~dSIz8oy`l+mjB5Jd_3J5ea4nYj}KQ(d$(1?*Bn51m}j$9%y8mn;b#L~>K;3W zqJ&YmCmu(^v+V<;FK$zUwhn97i9c<~Kn#J#~6iTRJjkHv{Zz zZ|#+O<7Kl7xCVI8ttS90m>A%I$Ov}xY2XfMcGPjHmiB}^)CCoSUo6z-C15S?qd)IY z-gxhcnc(ig#iboUYmSZhkFpvEX_`r*sM9;Uujkgg_J*W^D8)nno;EnlQ|Wo1{@3=` zqZMlL`MmlnZm+H#K&1+Tzzo~^Q)zx?%`rVs`)yk}a}VWm0Ts{{{Y31|d%uG}=*?8i zi_E3@(`UO4ub?u~I|{dO5Ge^3vBS0g=dk==cl-Ypy|pB4Dc?^m4!|YkK50N66{K^! zvQC^SHx@7e49X}fOAA+&a^V^u==ahBjBl_U`{W$D{lYsks>d|_Ku0EhJk<&Ii zfRgg?d$PAgK#zX?6B)*%3M3VbTKuhR7f_(EXrN6|Y~Wb6F-ir=u-=tWZ`Wpf*LV^47h~>xI+Kn#$Q{?uLL%hWn$;rF|VSBo%Du z)8M(TGA{hQ0z0IFl`gL07*z?Dp3QTj4(5j9U7`>!NhK6@sZT)0!Gp>oEy#8EY*xv_ zjm54~84KdGhd76XR3EBsss+Y)?f9Mhm>xR?`~6l<*F&+noUt-nK2|Kk2icXjmopFT zAu~?>}Rab_de3u zcCU-K)Z=Mt!E$f!^&$@reF9zNt?^HIL>G6FKCOMV$Ik27#^vRTWr!-K+>Wv3RhAD7 z?t?Ek=r+$(U(Vx(a)%(84X>qTT*ngO+`g)l^5^3YrGaTfST4O|*Q^`VUNXCMe6IDnxG3y{AAa(vV}Vi_Sxd z7R_i00mIJ7Y}1v;)oS$+m4l6!)cPk@;T@tFQz5r%OPj(&KN;TLhfW_ARCYM24i@IQBhcAz3!;qXG@!f z-0ZN;QP8`IMCb}j;3MxVzAtSHtz;+4D=hpvw0&v`>A%bj(F2P^xH|!EAkC5Cb0Iu} z65~(mB}u=wT=b78WEjK<>Lj=zmRTJjG$m?PohnkL^@&9SfPxE2PD z=T&-J-RO5ac>C4C2wV4FKXz#G=ikJ zkZxDa4bSsve)atmK*sYY@f*+aO?96XhdSlP_KkG5dlO}RyHMon+UQzFRKR zK$3JjYd*2aV3AwgA%RL;cKYyqu8`0rt(MsSy~7}+&0|tPqBTx-C5=w<;fzbQo5|u< z^VEEV^Zuj#iA~s0&$MXI)k;en|3P=-mk82>YIV79Xj$J+r`*I*{zMk~tZ;?gHy0fw zn}4gF7-0UmUmCt@x)F#v-2;vpjefik=lNHE*TuSG#n;WQM74!DYJ8jJ8)zP{GAq zP=Xav95!A4vrBEVNA0s7Sm=J*>y`U}A5J*~@b>iaOLDk{4p_alOx}(Dfk#tvB9vQk z&~Mn&`I?uH#GYJX<->Taus&hq(z&Yu?bSc6N$VoJepp@nHPPQY!PY0_P=KYqKOy5f z7kHn#t1jBaeXK&G?^N{#CxG#ZMr+J^j0SO+rYaz6P9jC9_t}2$TfMfRGJH+`F=9C` z#H5=!ozfdX@>E1U5Y82f{f;s9*-_{2(Z5K9j$HVR6~&l?-PGTinCu0G?qv1X$UoCw zZ?qO_q?Qi!n;g^zP>H3WE#`4UYNKc)p)MI=ES`D%_akf^jAw8Us;QQftt_ZJF_tjD zySKd?Qj%4-ftzt<-u#1@*yCDPDaZ@)x%9Qsnq*u1=LhCtddOOV^N3Ffd?*cZa)7nMmPfAD%**3LbA%ip5UZq$}hlsUX3r|DPx)v`6BSq7uVnoT|*Zkd~ zHc?`-ypWbwtO|qo0|%77pw(U?q_QpLS)c~E_l=hW%66YYmBS|Lj^jm?Vn8M&$5^;N zDo+rB5lM&tw&G3JRFZs3YN*^atsy9!-TIFU7r1$Xgx%(#olO9X${tUC-L2 z9MUu$BULG-q)Pj?b2oUqcA2!c`#QXKG%e$SrbCig;_Gtfjn)F9+8hS;n=R@eCejUp z4uw@Ain_xMSI6sKN_uE7QkZ!lEA2m3L0xEBRNB3OzGoP1lX@`t8bn|6e5rK;41d4w zy^fZFV!F2o@2kFh21-6uo%!!GSGE$^ido6(Hc|QP5IUb=M#s0d3kh~-el*<)mSrc z@#6Pa9&P>du>y4LUabrkeQ+fE1iDq2#SmP-+hix7V%|TI(iLaN|6^KQKjJjMYW}$c zQeG=(+-0~uK$>Bc?_Ah*FdEF&DTa~a)sQ}!7c~=gE3rdA!+2Fl<@4wIkZUQ{y>B-r z%K1m2no=1u5SDN64%e-%l;~sbm3%SP+)MYOKX|QITzmkdTy|mfP=r@eqbqKsw*F|v zpj)^61d$JyE8EGEcp?6WCLbAwc!)PYLVv%Gy^9|ui$W~C;xJN9lC{M9f=Zs+0!m2j z{bzSJ>QP(m2FQuw77O2`#q-C*CM-43Gvi<0Z?{QD|3dogoTIF}Rx5w(ImXl~1Cc}t z;r^O<+ro)u7DICT3*>r?8V!i>FoR} zpzjV@j>xlBSR=RoVLK35Ul$HhVhL+@FU^5EyUFwkJYdIKE0%Az{^aXtp~NZhqcc8< zZMmqJubF>i$R!1IH_R09Tz-xgO zYy;t6wX!o}FY^9;JpgEXCZ4URt&g1L*yqtOkrNCp?2K4mpRZ-Ly6)P-O*bISn(r82 z)qLDQce+lN!(|&@!9Onu>>;6ljV~-am09uMbNDbvA%_qoT3QVPaB)fUY{8>ZGc)T+ z&XdI8DQ}fF>A#TrvQ8()-8FW*elF6sB@p(hLJw?bZ1GirEkCSoFup9;qkuTF(XaZG z<6z2}H-~EPorh!0SW`G8<;|?dz03T9CsUvA(|WuWnA+zl>FWopK`?gg_a?G8SpSoL zeCA^*H>6gE=Hg9M6Zu{q*`+4lE^RZgpT1d%M$~V&YaY7@J^2P(AP{vN^3e$lV*(6& zBSkIc*K%;4Yjq_AvpGLQy0b{{16I`TuDl+XsCs{Z3pm(|zbTZr-V>`rlsWP)P`cid zB`gUNwhNW7yiUh13|o95v9hCM8$8z>d441-jT>@Lpmj1di^yHlyIJ?gONScPck9*~ zvnUq_Eqr_Hly}1s7MzqF;j8P^M4o&y&9N)MZ3WKyW+eY$8HO{dxYoLr{O}BRvo!t~ z5J~ER1&y!Yq_Cng^@`3x{CPhwoj!l9CAk0hVpT`~(pH46KU0(klXhv#(shc`w1+T? zLjYUiE-1;8Hv|D=8^pV0x0@|bP0%tIrYIXdj!RCX{?dyZ%Y3jQ(JR#nv)8Q3t;%a? z4lfF31sJs5`d=&?`968OMX?GzkKSx6>jr%Px)Dk&qGvqygS`Dle$1KWx0>7C;MIYR zbXDB|z4iEcW&Lu2zR|G1_RcfKK{but)ILhqyVUNyEinTZVZ>+1MZ5`w1hNeIPxk4G z`lYhP=mMEt%|f3C+U?S-r+z-)PiwP{+!@Uv2wkq!g*+=Q8@bpxx)DS-t&%4BXVjva z26>n}+Wh_L2-?~45B942{Lg$^r5(iMEn~_>{Mh)@fDe~wgSSkFD=`)#szbi8yMi0D!rgQZxcl)Jw%OSu&M?0Yh|aQE-wt4;8()@tqx>&kyeymyu4a8|aH&3ujz4)`7f zmFN3%`gdsKxI^-s^EnV@WlGwBS$`@vN{M$)%WWmlYLMlPht;5>~A-P7V4Ig7bQ2%iFlNJ-#9t5B)y2 zZsYcADj`Wmb|LP{QrCJ9cQ;q*@b4=*0#{XxSDyb_Tbk*WF6q!xMp08pK9{#jjcX7U zyz=`|c}Srrq?4;1U4cJ!QUbr=o}`3Ktd&Y+y>3~OB@-i+#Ua7@WH&3&$!>6I^PXFtnG9=Ynb$7Pi8|B&}R@j>87QrYNP9# zGAOE!fmYw%w*vtjJGRL@+-H1bLAZ5_0jWi7oRzG9YLV$*yf7M^>tP|d(r|?9$DUK) z$Y(N?O8=^lUzJ8hQ-CcHJ=B*IM1L1uM$r)C?RuBGOa4T{I-$M~PV)rxqFl|+(6jr0 zg8lObC{gW!&&)K}Bx{?`r7hO>?(X&$%ukMqNb_>{ho9Y{Zf=%tZuV~UKfa&cgWM)g zSWNJYH9e{eX7IUIhYs*g+L|d%`apAzYPu6hEZPrmkS3h7!As|I{_QZcdnWP@mV14s zG=a)SnsA!|?e#QSO;IpgS2H9km#g!()N60`)Ob6^H(r-8-WUB<&z9$NV7GZoWUzbp z&x;6QtH$`wU^r4oSY37I&Iv zt^<*l9U|LCj}9Zmz?Ph49dHQsXMm6Q#$)ls>Am32i*)J;dxasjKU^13Jjb{o`+~b< zO8P)Yhh9qbhd?ZWMeKky> z`Xm4GJe$ttmEW9@-TVdr@Y$4*C>XB+xKhh_V z#^JS9vc}?V{>lujw$CS(6wOA{lOA=~=sb~ej@EQ#HuIEFzIB1VWNyeZTlz%zJ+H~M z>Vbg{ISoPm(Z@eri243bv?1wJ$biZ3?S1hgO>>{6Bo=3jfWis zjKSKzl_KHaB+TW!sx>IX(mYL2OCTF}-XCXcc}T<-BUH4&TGA;0UYE$p+KuP#=ne1iJ8K??L$ghSI_l$CHf}`e2*1fjApR6lIz1R1ZA*h zxHopb-OYFfZ6{GtCM%UJ@lvSYvxw4%fo!^**smXf1EBuNW==8_Bqc#SG!_%-Ek&E- z*hW8k^mpw27T9vG!Bdz0N9LV8#9K#81QT3}t5&GqtB29>rGU|B?HG*tef%q?BQBY< zme@aUqVn>?{O6|)i7N!(=!ArrM{%$fyhX|laDZ~~vyU}WttRkr>xsfAkHGyHMb1Ct zUvkf3Uu0eu703o?cla=z4aumVt_e*#(FcRqlk)}q^2UO zugL%c4uci^>gR%lL8&(Qxxf}*0qiC3E6FyzQB4=+mi#lm;%&DTD2WN{A_#5zb#rTSZ@&^>sfMCb&N49ut$Qwu;Ql9q!00QqpL@1=v6p z5O7%$FF&Edkx*{*QY0eBP8FeYuod2#Ig*Od!GQy}a(AtaPMKid3qGmUS6SqQ zVwJWi=8P{oo&;aS{2pNn`AQEgGLcqgu7(qL(=tsph!?`X%DH+ZD-G9B1cXI>3!b)aB3fG~9 zU*~-an$CAKn-Oej0qPo$y6;`z|4r(MoL$y;eMDBp=mr(X3UyiLj#F-jFeWSd5})~1 zDMUVvcLu|AQSz3<(>Kbc>N+@8+*V^K9m(4gG!-m54z~HNgCPA(__P7fr|09m-!k*G z!Akw2*emf4U&}2$YbR~Ll~wF)iImXS_V@y{0OK^isg zHj5KCQ{j^(n>yF?oYG~>&}T6BS?tE?pL`S0U^n^_R*MrKwHn*^xc4Snw7Py;lgJZ` z%rup>q~)hke=)A3r9YqQ0Z%AN7wTp2>jn8oaVRKvi59xO-rbVEdiOMx_g(2R9r{E zy9S?{n{StXI1Bb*58tP3eY}iH8;SMS;%rTX<{WX2ntfG`;XinaONA4@-A5|>n+I=p z-q_N3h_fx2mg!R6d$V-ELt3?-zelEek}{-Wc$ikLpK_mFHO<)qoTBbT!FH%<{Xj%^ z1`BO-n0r0@ppUkx-#K3CS9HrN6Y!=yAArn=@>*6?6;;w84>l{+MGr`_^az%Qcx0xP z@3B^Tbf*)0lLH4uBz%itPbLhp)lIogp2J?AO?5zk$U9^??-e;*W3loYs{MFqjGNW@ zcEfb(z_Bj%_5*d5(p+2P)*P( z%J>(@M(cQh?`y0$;bk-i6KuNE2np1wUkNoCEN|t!Hb*a5xRM&Jdjo*h3L%^+Us=b& z)@xScoOsnsdBrasQKG*;kEYH-Y0vdvLT%W?ub@&!(K;3~@XET4aihsq-SKk2qJU=< zx2?vfOHVMSyn4B|6w<5omQ};wBu+?$MXC%v!aL3$eu5LSAErRXd5rCT)7x4r8zVB6 z8y8tg{?4)dwT7zO#k)GYv3I+K)N2NlvXZTp$0+pA|BvMi;IO+Fa!Ri7Rq4{{oNBp- z1!@;}b;Rq8YOe$;lD&ghYUyG5!CHWy>9!gHMg!eM-y2D$tD*>sC)PSDuj&2QeW_&@ z8m+9}_+u@^%B0+C^nE@}wa%1U*_=8zErBS?R;@7B4fYOpwgg%Xmj4cBt(;*p^H59L zQ;+;xAxTt1E#E*=vn;u>#!#igJEd-`v-{3%@qtgvtDi=)(jLMskrw+?h|)r#ZluxJ zCUA>5eQ;sZM zA_ScvIZ?9W?-sb@A~HNi`$WYbm29!uJS-?obN8&8+ORVUU@>eL{W~)|uMt0|9YoiG zPiIjCupBPLFO8hYG5q?*OZ+ z&w+Zm|2nh68gt-c2#x`6QY`)*23k4yHNZs|P>v^oV-DcAY@SELZURcSPX7VbAip$i zvd^})nH=&ttBERcJNO0p4buI=YOP|NHrOF#HKeHE^PY_VlcOqr8_~3jO@xY>F0bN{ zui{fNvuD+;-Zjxy`zQT~d6mwqBdf_d1<9xzD~Hv(L8r$ylsGFeXZ2)FJ-nx%h@a(y z_|F&SO-Z+pRU@}Q0tLjbR6v7ScUD+W;mejI2K@81d;7Jqw@I3!sK2_OkWe+a2fq9} z_skhL@-PkxRp?mDn$<2&X&e0M{YaSF!H$ewYnf>#)T>^}27k>)VQ+IH%e(<;#g2`e zn)az#Ik-uDrR)AGr14$=fA>XH_tf~83pV&uz(8*>cL~1eVD|NripAna7~W+-rWr5c zfC{_ezLh?uDt-Yq=J|KVau=wkS|#mTzE^j+AZLjt;ZZSyv}#%{JN*?>bfw>Doagj1tDpJ z&-}pcrrrm*o2I}P`t<2t8LLMLrN2tDprrh?#u*>r+{HD?J6T%qv1`ahtd?r{e6FcX zie*-RuK4V5)WLQ1p7gKY(fuA^f2YU4TxlbRzlw!c#i+IngtTmA&$&HRJAD+PzD67S zNg`rGDM=ASg+&FWoWrjU{P&XO2f3|~ro^R0sBy}_%4kL$kf&>cY&~nb;Na#j@;#a%JKT2j+Sz2)Zq**8c;Rrhu>rHcy{})pd}e(f9Y?fR6H+f-l<43dm-j}FnT=| zIT_A2fQM(BI;2=Z9a0vat_08?D_c=!wc7ou_xesDsNcVb;G{WSpL^Is$wy>`BKljW z!!`EzRYVAxT(3jx?0Y$Vu~y{6 z;_nwGgs}?hImE>+Y!2eU{Uj|-#O`+?8I}HFrN;Q#)beatk7SY@`&Rf+<$W^ls$QPx3IYCdg(zCZzNBGw^524JHw%RRx}c-T1Gt{oZ6rXQ5=_7+oJzE?a&kU7_Ha$QXAPuM48-(Y*@cicFA zeq(V(bQfcJ7u)WVT7c&MAGGkBZyUXU`n`_N+Z_D#5_)tit$O7zxUaulY@WA*aYtVh ze~}dCoK=7ZP*%SO_))8pxeKV<`}tBT?8iv4e!viEW_vH++T}kFduZTIdLSFj9(LGM<0;lw?``wl5U*H({IcF2=p?NKy{aH*rw_LJDTLx*jF^vpB?}LSI1TpwQ2kvO{HS^?xX3!`vHv9kn3D z{~a*8ISaLrQbmu}y>Xbgum8kG*i;43-}UlxR31g;^B!=S@J=mXxlU_Y!TYX&nvd~5 zk-XdH^b_bq02rrSsh{xzqwmSskFK#13$ZjFQRUrCTE6kY(&Ciu_q32LtLW9*PXPZ| zgciCY1gx?OaF$~NFWt9tZh52jXyo&*%sXSnw|#-1ui7v_I)j}-)I=kHMF3+C6PVVr zM~bNJRgbfo7MzgHXy6_M$m8UkDJuyw=&n;@=zFDy=k6$2E@~C1*`$ z?aSt7J~%}sY}5-sO>2USeM(UWOI$#)FF?~Usp3pB6l*|qmK?zKM&1r{io^13>kXaExRVK7STA6~ z5Cjn_7GgJaP_(pypZ%c%$n*m00IJy!T~D$}G1HUFxAy4nXf5Lec2W)n2wj34bWxJw zatss|nFqg8MQYRvJnx{efUW4=%e=*j)jp(&9H7K3;mfg?-_o@n*!MCW@G=BFL>63j zlEywbni?g6E`ABUyXkcmML5|bi8=9a2}q)Py*o>T?U0JbP`xw1_KC54CN`$bfbvGq znocfB?-pG;+;>r1C&{+((QI$l``9RkbY5{3P>P8J%HSdA+xl4Z1A$o7TeKdT7nLFE zBNO_f<63X3&DX|bMNz$Hk#VCsy+sKC2bbRPQig$r67PFpXJNZFo{L>T}O^ zl>GYl&fKHQg_2xiWwoj?lbYgty<=$auq&Asf(l4YS2aK7is?U5KT! z0pJaX$Fm-r9DkjRVgThnhh7}!;v2{9eMt!Pt@S260>< z!-}5}8s6ngJq@L1pW(Mu3cOWV9SO~tq0n>fHwOmQF_NcCxqTre+lTfXZ!aA zxg{H)oi7H5P9-`4F^OUto6QS7OYo z4(f&R_>ugR32{sSrF!yO^ew2j zDMb$)q!{lY!K3jpVfSEBYzBZ@SvbzTg2Tw!3l>D-88D@VL zv7?}`nvod}9eOtfcd`P*FD8@f`ggP2$Vf0+pan)IeQIW>8%Lmml8N_q>1i*pQc9Rj zXQ*)2cmViJP~K9HZF{$L{{%L+hUsNbXkVIfX+50X17$r|J!~O4u)cUAJA0qDu#m`r z@V?z;6;W@osZ1HUTKSAnnFgB+ISrm9{7Q2h3468JwHuUjF#3{2sd|;WCY&9t3aj?- z-6px#H~8mLHtUj{)HO;ktfCEev#l{q%e3nJE2Hro{`l!ox^!lj%oiB$Za>Wv(ibrQ zHhYT+*B~ITx>Lg>Ud}S%m78gyhS@Aj3bXPOE@z9(gx$v(ajNOdSd8D%3{p)UzQ{ki zDLXgqK~2QQC)4;pbZiDqb|@^qQJt_?m{pVSBz%p{%L1Hhts|ab=$1}!$4HMzB1TU2 zJ5L67kK3ahO=lVS8r?G&unj_|s%^mpN&*9Yzr~l#=Y(G?{3P(7xVUbzGuX=FkBR*E4LJQd zlEoH$TC$(?yKK7V)r4<%?oz;|8I9?3`#7V)BmaZtdmj?xJUyB{(=uo&=pF z;WQgWGNk;#8fJRFe37eKIMNBqIJZbFeRq=awXFg-1tH5bp@Km1@w^u*3Bg`;6Q#iP z#!+CwM+?^x@@FWA!s?Qh;cDdlbsKp)x~dShTZ>SgNLG_~jm&cxIoreMF)mblBlc{E z^s3L3A5B77u#|)8^z%ddzfH%&jJE%X3bK<>*OrTqD|z45kzXkrc+c{KBqT z*`J$8H!Ix7DRVcnm^zHXP=r9M*z5GoHF0+EIW0NWgHri5BU!(+cY|EC(GUg=MtfV9 z642iWB9bEZ?%BXb27Z;SWG$bFfOPJU)|cK03GB>HN47~T1s9UFJIPinRR|#~gUwNq z4PWLnO>QE)RJf2td4osV3yITzi_fRB+@9^*qmO;I8+WdRC@a4EfSB4tFTp=wLuG|U z?Phd!6cT16)k88Ae<_Sqc%hZUXihfMz$GX#$ULOr}kL5 zCA+4OGb;QP%!qJ_?}5RuN|nSKB%csT4{iJphHus#YEEjV(Jg2ygR9@W6Y~sieqTLL zM|R%n4giyd1tQs4qL$#;5&U9wUJZY`|ML3YB&m0#9WS=he68}DECD3pTGTLno;U}8 zXPN+6Jfk*Ywt&;EMpvW=oXS?$14G>5*1O5Sd}~Q&Ib?0*cg3kK*f>da8>7A2@okw$ zS4a}KKN?T(c{#%JT;5JV!Rq;@g|{3S`CgHc?zev;@Yvc{+8G*hZai5nAP&HZzr+17 z&)1FVkz_&`n@oA_M2h@Refob40z+r8$4zK?0dvICj}A@y+@R+i>R^}X*~)&@VHk~l zxwsOfy}!0X2-wI~%08FETJajG59v7g)UFCd4xqRC>9Mgde^`A;q}9h8I830S`8kjc zbL{>13~kt5G_{{O(6j2%am7%E2kOE$W@;Lv;RU9MAQ zN-Ox=I-!gJK;u(Cy6+BYK@_E$()0GARilq+^D$>J01gr_(3PGYBF>WQGQ3+bbqqx# z_w>q4m8~Et7XM&J0>$2%bmQ}?1eAFRpASM5-wk(-sb3CNWd{%*`3pcJ;5!U}K52Bh z3iR>Ks{vpS72;{2zmQQK;3~TgXd?^-8rzQy6b;iMAYbU%n?*S~m_!*ED)WgBHfg!T zf9z*Q867vW22hp79)d}@f%l{h`us@|V4-aC^htUE0_6Z5Mt^t-cqj#Q`Oy(3U$|37 zYY%(%Z);3sRX(s#2)wvMGm%a>a@iL@){P9ka(a7eoqM>DVEpWH4C*N8XG1}X>tl=+ zy2%0^WYekWGu^P93DE|DWSxGD3OIKHM>f!H00HvfQGfpvcmV(oT$w01r+?K4xe=Lm z70I8f=xLm3(lN;5Qk(%`Mhu8QTU95~p4V4Og@BapXlt2uE9WwRKFYXN7YVBdI*ftF z*?&L$kz$=2Mx#K*j$-2xf=Z=5pW0%|(DPuIUJjq{raiIy%^d+_L$<&3VZ9BL(>=;Y zzeo`5y#KzaC1y^QOS}vm zoT1;>(*<#ak&x?KHO%2>APdhW8E>C>6?NA>IN2_xcb|%FLSC_7xIwF`QWZnZGuSXc zj?N2wDmP6@;mZp{NGGUR++(@TpW&_SHTC#`FYj0>W@#}cACf?+_Sw9FzJ~!|IG>@C z*sMF6WlXEhZPHodP-ATYbXUfm^Z4P_&n;tuzT2-MipWoqHcX&M-+TKaJ?OZ{gzXsbS=VtanM($F2-pZEQsdVN1u> z++6|{DYcxCfhg$FIbo}-sOFkrb_9~zuhSo;9rS0&mLUNa)Sk?mD?2m>FnG`tAh6;K z{ylU-K2~9oApmeISJ4BuLq`IV+P@KwqZ?EnoS|a3KNt%FfP_h zVAz=L!BZ^yps}vaYr`bb}vtPLu5f$nO6NeBJ*R!f#k8cxxz`$cGsdT#0O~c{X%< zs~Stq>#beS1UuV4!CS zr$K&pd5bF9M84^H@M)8vVb%n3M>ri^-6YUl5TCDAs_v_zP>)`XXK(JBn>8&i$}E~% z;cXo(I*6Fs<+H0)qOvba$rxjRL(BZqge43%*%maGd}B4}XudB&V(ec`np@UPm4BP1 znO4mQQ=JSbK+TnChv+p0q|>+#5I0NoF;{*xG)p!VWWAl2uc!zbo}lGth1IKme1Js^ zo=t){=-3Sn+kvsj_4k+)Npq#zRGZrdBUJ668}BACKK##a?rS6g!mzXwu=?l>OUU#Q zDB9x2_bEQ}5mcgW`-Ws}!4rWmy5}k;4B9_=C9`lmWO>*nz`)*?r*5E6`qO1n^6TE! ztp(Q$*K(t!v!CV0ZzVIAzeijIB>mVl8(FT6{g~6meNp0i246rgmU zWb$b4w#xvzN!scRA2nDMn16L~k%op>Bn-CrE>&a)+S`M={{;S@LU{HdaOMJambQiN zKP9h?eDs%N>t;UU9ATpK z=VTGpeWW>Qs?05bSn~LC(cVq&LjrZSOr*5hzyT#KTx)F+ZDIj#gX)FTM;-MJ zahZn*P9u7M{UL&r^npGf0BeG%Er(doBw$j=(!U>KkI`fH0{~NB-1axp{_!TUj@5av zXu}p1ea*b=bFY+i8-NMpP@V)3_p9axM?vo%7|yLcgcz5I11Z}K;OPD%!v4Q{v!})U zkJH~6M2KxOCmf;Ibi4+U+lyf3O#!5 zhAqZ`5a!40*7~hOJmF(uO#DanApqV9BXBd+Ecp?Db4{^X!~OWYU1b)Pv4N=aUU;Os ziyF$Jo&GxjM0%z>xUp-r2;n#9(Z|egcZi;See0RnOZ&9TdJkSMeeuaZJJ%g++FUuj zs3{q1%VWH2tD-AykFu!9IDzJu*FeWMW!F9#vr(~s>5#roW*u`nx40UjS`I0R5|WuX zHAn&@#hN}WD%+pAmI6ImawfZWS?w1u7sI8OSCv*(EB&M!iy!iL*;&%#FBkT4B*P^9 z6z*0@Le%Up0ArxnRdL;MNO@AaxEyym9RFSOf(~jStCEU>fJ2RcFzT^9!~XxbyM)*u?znoCsq`7 zTcS1elue?67FfpNFHJei6~!4W(CI!q(;>Y>yZ%(~uPOA5fz!8_Uv{DAq=3b%OU0-A z@WQV9}Ca)n=^3$mt#-XF0!iW zb@a|=-8nxAFSn7>Gz!Y(fsI4c5_AWSDjKXPSADkORkN%x2ky=q=VK-KG@Xjmp=o}m z{cWU$8%ma$TZ&yl_6mhhwbgJw%5ODVQYkRwuCKLFB