From 9b59acd544b39376fc0547ccd6b324ba29577a1d Mon Sep 17 00:00:00 2001 From: lgf <1332145262@qq.com> Date: Sun, 13 Jun 2021 21:47:19 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20chap-36-program-profil?= =?UTF-8?q?ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chap-36-program-profiling/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 chap-36-program-profiling/.keep diff --git a/chap-36-program-profiling/.keep b/chap-36-program-profiling/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 67b6359f5cf1e87bf0794c2ff91e3c92a715279d Mon Sep 17 00:00:00 2001 From: lgf <1332145262@qq.com> Date: Sun, 13 Jun 2021 21:48:01 +0800 Subject: [PATCH 2/2] update --- .../Chapter-36-Program-Profiling.md | 1941 +++++++++++++++++ .../imgs/cpu_syscall_impact.64ac15d0.png | Bin 0 -> 38578 bytes .../imgs/cpu_time_graph.dfb0de60.png | Bin 0 -> 36018 bytes .../imgs/pprof_command_line.d74d9a2f.png | Bin 0 -> 44177 bytes .../imgs/pprof_svg_explanation.0e848ada.png | Bin 0 -> 139005 bytes .../pprof_svg_getting_started.69b0e2e8.png | Bin 0 -> 117820 bytes .../imgs/pprof_web_memory.a9267bb8.png | Bin 0 -> 98730 bytes .../imgs/profile_web_1.61127a06.png | Bin 0 -> 90213 bytes .../imgs/profile_web_2.7d689401.png | Bin 0 -> 131512 bytes .../profile_web_2_disasembling.db7ae075.png | Bin 0 -> 172547 bytes .../imgs/profiling.d0e9aaa8.jpg | Bin 0 -> 30874 bytes .../stop_and_collect_profiling.e8d28a4f.png | Bin 0 -> 27563 bytes .../imgs/top_explanation.e3addfe1.png | Bin 0 -> 341135 bytes .../imgs/what_is_a_profile.f3235947.png | Bin 0 -> 40667 bytes .../imgs/zoom_node_explanation.045c7eb8.png | Bin 0 -> 48519 bytes 15 files changed, 1941 insertions(+) create mode 100644 chap-36-program-profiling/Chapter-36-Program-Profiling.md create mode 100644 chap-36-program-profiling/imgs/cpu_syscall_impact.64ac15d0.png create mode 100644 chap-36-program-profiling/imgs/cpu_time_graph.dfb0de60.png create mode 100644 chap-36-program-profiling/imgs/pprof_command_line.d74d9a2f.png create mode 100644 chap-36-program-profiling/imgs/pprof_svg_explanation.0e848ada.png create mode 100644 chap-36-program-profiling/imgs/pprof_svg_getting_started.69b0e2e8.png create mode 100644 chap-36-program-profiling/imgs/pprof_web_memory.a9267bb8.png create mode 100644 chap-36-program-profiling/imgs/profile_web_1.61127a06.png create mode 100644 chap-36-program-profiling/imgs/profile_web_2.7d689401.png create mode 100644 chap-36-program-profiling/imgs/profile_web_2_disasembling.db7ae075.png create mode 100644 chap-36-program-profiling/imgs/profiling.d0e9aaa8.jpg create mode 100644 chap-36-program-profiling/imgs/stop_and_collect_profiling.e8d28a4f.png create mode 100644 chap-36-program-profiling/imgs/top_explanation.e3addfe1.png create mode 100644 chap-36-program-profiling/imgs/what_is_a_profile.f3235947.png create mode 100644 chap-36-program-profiling/imgs/zoom_node_explanation.045c7eb8.png diff --git a/chap-36-program-profiling/Chapter-36-Program-Profiling.md b/chap-36-program-profiling/Chapter-36-Program-Profiling.md new file mode 100644 index 0000000..b47773c --- /dev/null +++ b/chap-36-program-profiling/Chapter-36-Program-Profiling.md @@ -0,0 +1,1941 @@ +==前面还是没啥问题的,主要是刚刚收尾的时候有点坐不住了-_-,不过应该还好,有些不好翻的原话去掉了或者自己换了个好理解的说法。搞得不好尽管骂(´・ω・`)== + +# 第 36 章:Program Profiling + + + +## 1、通过本章你能学到什么? + +- 什么是 `profiling` +- 怎样给你的程序创建一个 `CPU profile` +- 怎样给你的程序创建一个 `Heap profile` +- 怎样使用 `pprof` 工具分析一个 profile +- 一些常见的 CPU 使用率优化技术 + +## 2、涉及到的概念 + +- Profile +- pprof +- Protocol Buffers +- protoc +- CPU +- Heap profile + +## 3、什么是 profiling? + +Profiling (分析)是一种程序优化技术。『 分析程序 』表示收集程序运行时的详细统计信息。这些统计数据可以是 CPU 使用率、内存分配情况、程序执行花费的时间、函数调用的信息等等。 + +但这和基准测试( `Benchmark` )有什么区别?基准测试收集指定函数的运行时信息。分析( Profiling )是对整个程序的统计数据的收集。 + +## 4、为什么需要 profiling? + +Profiling 经常用在我们观察到程序的性能下降时。该工具用来了解程序性能不佳的原因。 + +代码库的静态分析可能不足以检测出程序表现变糟的原因。基准测试针对的是单独的一个函数的性能表现;这不足以让我们了解整个程序的运行情况。 + +Profiling 也可以成为改进程序设计的工具。Go 是一种性能相对较高的语言,但设计不当的程序也会遇到性能问题。在 profiling 的帮助下,这些问题可以很容易地理解和纠正。 + +## 5、开始了解 profiling + +为了分析程序,我们可以使用 `runtime/pprof` 包,它公开了必要的 API 来启动和停止 profiling。 + +在本节中,我们将分析一个对整数求和的程序。该程序仅包含一个 main 包,其中包含一个名为 doSum 的函数。此函数将对从 0 到 787766776 的整数求和: + +```go +package main + +import ( + "fmt" +) + +func main() { + result := doSum() + fmt.Println(result) +} + +func doSum()int{ + sum := 0 + for i := 0; i < 787766777; i++ { + sum += i + } + return sum +} +``` + +下一步是在我们的 main 函数中添加对 pprof API 的调用: + +```go +// profiling/getting-started/main.go + +f, err := os.Create("profile.pb.gz") +if err != nil { + log.Fatal(err) +} +defer f.Close() + +err = pprof.StartCPUProfile(f) +if err != nil { + log.Fatal(err) +} +defer pprof.StopCPUProfile() +``` + +这段代码必须放在 main 函数中。它将创建一个名为『 profile.pb.gz 』的文件。之后它将开始 CPU profiling 并将分析结果写入刚刚打开的文件中。在 main 函数的末尾,我们将调用 `pprof.StopCPUProfile()`。为了可读性,我们使用了 defer 延迟执行。 + +然后我们必须构建程序(后面我们会用到二进制文件 `gettingstarted`): + +```shell +$ go build -o gettingstarted main.go +``` + +这将会在当前目录下创建一个二进制文件。为了产生数据,我们需要运行程序: + +```shell +$ ./gettingstarted +``` + +执行后,你可以看到 `profile.pb.gz` 已经创建在当前目录下了。你可以试着直接打开文件来查看结果,但这是一个不明智的做法。这个文件是二进制格式而且是压缩过的。我们需要一个工具来帮助我们查看分析结果。 + +这个工具就是 `pprof`,由 Google 开发,用来 『 查看和分析 profiling 后的数据 』。`pprof` 可以读取 profile 文件并生成易读的报告。我们只需要使用 `pprof` 的命令行接口就可以查看我们 profiling 后的统计信息了(在本章的后续部分,你也会了解到其他的可视化技术): + +```shell +$ go tool pprof gettingstarted cpu.profile +``` + +此命令将启动交互模式。你必须键入命令才能显示统计信息: + +```shell +$ go tool pprof gettingstarted profile.pb.gz +File: gettingstarted +Type: cpu +Time: Jan 1, 2021 at 9:27pm (CET) +Duration: 413.54ms, Total samples = 220ms (53.20%) +Entering interactive mode (type "help" for commands, "o" for options) +(pprof) +``` + +在标准输出中,你可以看到 pprof 显示: + +- 二进制文件的名称( 这里是 `gettingstarted` ) +- profile 文件的类型( 这里是 `cpu` ) +- profile 文件的生成日期 +- 程序执行的总持续时间( 413ms ) +- 总『 样本( sample ) 』(我们稍后会谈到样本是什么,因为它可能会造成困惑) + +## 6、读取 profile 文件 + +为了能够读取 profile 文件,我们需要安装 Google 提供的 `protoc` 工具。为啥呢?因为 profile 文件有特定的格式,它是 `protobuf` 格式的文件。 + +### 6.1、简述 Protocol Buffers( protobuf ) + +`Protocol Buffers` 由 Google 内部开发并开源。它可以将结构化数据转换为 **轻量级** 的可以用来 **存储** 和进行 **网络传输** 的格式。将结构化数据转换为特定格式的过程称为 **序列化**。使用这种方法序列化(或编码)的数据非常轻量。返回的格式称为 『 **binary wire**(二进制线) 』。 + +与 XML 或 JSON 不同,字段的名称不会转换为数据的序列化版本。因此,消息可以更轻量。你需要某种 **规范** 来读取序列化消息。序列化规范是一个『 proto file(原型文件) 』。Proto 文件具有 .proto 扩展名。 + +Google 团队开发了多种语言(C++、C#、Dart、Go、Java、Python、Ruby、Objective-C 等等)的工具来轻松序列化和反序列化数据。 + +在下一节中,我们将使用其中一个工具来反序列化 profile 文件。 + +### 6.2、安装 protocol buffer 编译器( protoc ) + +#### 6.2.1、下载最新版本 + +首先,你必须下载最新版本的编译器。在撰写本文时,最新版本为 3.15.2。我将在以下几行中为你提供下载此特定版本的命令。请始终下载最新版本!要获取最新版本号,请查看 GitHub 页面:https://github.com/protocolbuffers/protobuf/releases。 + +我们将下载已编译的软件版本。当然,如果你的计算机上安装了 C++ 编译器,你可以自己构建它,但有点多此一举了。 + +你可以通过链接下载压缩文件:https://github.com/protocolbuffers/protobuf/releases + +你也可以使用下面的终端命令: + +- Linux (64 位)用户 + +```shell +$ curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.15.2/protoc-3.15.2-linux-x86_64.zip +``` + +- Mac 用户 + +```shell +$ curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.15.2/protoc-3.15.2-osx-x86_64.zip +``` + +对于 Mac 和 Linux,我们使用 `curl`,一种 CLI(命令行) 工具来发送 HTTP 请求。我们传递两个标志(-OL)给命令: + +-O:将下载的内容写入文件(与服务器上的文件命名方式相同) + +-L:跟随重定向(继续访问返回的重定向链接),因为 GitHub 将发布存储在 Amazon AWS S3 存储桶(一种云存储服务)上 + +对于 Windows 用户,下载地址是: + +```shell +https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protoc-3.6.1-win32.zip +``` + +#### 6.2.2、解压文件 + +Linux 和 Mac 用户可以直接使用 unzip 进行解压: + +```shell +$ cd where/you/downloaded/the/zip/file +$ unzip protoc-3.15.2-osx-x86_64.zip -d protoc-3.15.2 +``` + +`-d` 标志将解压后的文件放到指定的目录下(目录不存在会被创建) + +对于 Windows 用户,建议直接使用图形接口来解压文件 + +#### 6.2.3、添加到环境变量 + +对于 Linux 和 Mac 用户,有一个方便的路径可以放置二进制文件:`/usr/local/bin`。`/usr/local` 用于在本地安装软件。此目录下的 `bin` 文件夹用于保存本地二进制文件。如果你对 UNIX 文件系统层次结构感到好奇,可以查看规范:http://refspecs.linuxfoundation.org/FHS_2.3/fhs-2.3.html + +```shell +$ sudo mv protoc-3.15.2/bin/protoc /usr/local/bin +``` + +你可能需要 `sudo` 才能将可执行文件移动到目标文件夹中。 + +对于 Windows 用户,你需要将二进制文件移动到环境变量 PATH 中的某一路径下或添加一个路径到 PATH。 + +### 6.3、profile 文件的解码 + +要解码 profile 文件,第一步是获取 `.proto 文件`。编码的 protocol buffer **不包含字段名称** 以减少大小。 + +我们可以在 pprof 的 GitHub 存储库中找到 `.proto 文件`:https://github.com/google/pprof/blob/master/proto/profile.proto。Go 附带了 pprof 的 vender 版本,你可以在 go 源文件夹( src/cmd/vendor/GitHub.com/google/pprof/ )内的 vender 目录中找到该版本。然而,在撰写本文时,profile.proto 似乎并未包含在 vender 中。 + +一种解决方案是在 src 文件夹中克隆 pprof + +```shell +$ cd /path/to/your/dev/directory +$ git clone https://github.com/google/pprof.git +``` + +然后我们就可以使用下载的 proto 文件了。返回的 profile 文件是 gzip 压缩的。我们必须先解压缩它。为此,我们将使用 gunzip 命令(适用于 Linux 和 Mac 用户): + +```shell +$ gunzip profile.pb.gz +``` + +这将删除 profile.pb.gz 文件并创建一个名为 profile.pb 的新文件(这是 profile.pb.gz 的解压缩版本)。对于 Windows 用户,你可以使用 GUI 工具来实现此目的。 + +然后就可以解码 protocol buffer 文件了 + +```shell +$ protoc --decode perftools.profiles.Profile /path/to/your/dev/directory/pprof/proto/profile.proto --proto_path /path/to/your/dev/directory/pprof/proto < profile.pb +``` + +在我的电脑上: + +```shell +$ protoc --decode perftools.profiles.Profile /Users/maximilienandile/Documents/DEV/pprof/proto/profile.proto --proto_path /Users/maximilienandile/Documents/DEV/pprof/proto < profile.pb +``` + +#### 6.3.1、protoc 命令的详细信息 + +下面我们对上述命令的各个参数进行说明: + +- `--decode`:要解码的消息类型。Profile 文件是 protocol buffer 术语中的一条消息。每条消息都有特定的类型。在我们的例子中,我们的 profile 消息的类型是 `perftools.profiles.Profile`。这个类型不是内置的。如果查看 profile.proto 的第一行,你可能就会明白: + +```protobuf +// github.com/google/pprof/blob/master/proto/profile.proto +//... +syntax = "proto3"; + +package perftools.profiles; + +option java_package = "com.google.perftools.profiles"; +option java_outer_classname = "ProfileProto"; + +message Profile { +//... +``` + +这是包的名称,然后是消息的名称: `perftools.profiles.Profile` + +- protoc 命令的下一个参数是 **proto 文件的路径** +- `--proto_path` :向 protoc 指明 `.proto 文件` 的路径。这个路径必须包含我们的 .proto 文件。否则,protoc 将无法完成工作。 + +然后我们将编码的消息通过 `< profile.pb` 传递给 protoc。profile.pb 文件中的数据将作为标准输入传递给 protoc 程序。 + +这是此命令的输出: + +```protobuf +sample_type { + type: 1 + unit: 2 +} +sample_type { + type: 3 + unit: 4 +} +sample { + location_id: 1 + location_id: 2 + location_id: 3 + value: 14 + value: 140000000 +} +sample { + location_id: 4 + location_id: 2 + location_id: 3 + value: 7 + value: 70000000 +} +sample { + location_id: 5 + location_id: 2 + location_id: 3 + value: 1 + value: 10000000 +} +mapping { + id: 1 + has_functions: true +} +location { + id: 1 + mapping_id: 1 + address: 17482189 + line { + function_id: 1 + line: 24 + } +} +location { + id: 2 + mapping_id: 1 + address: 17482037 + line { + function_id: 2 + line: 18 + } +} +location { + id: 3 + mapping_id: 1 + address: 16946166 + line { + function_id: 3 + line: 201 + } +} +location { + id: 4 + mapping_id: 1 + address: 17482182 + line { + function_id: 1 + line: 24 + } +} +location { + id: 5 + mapping_id: 1 + address: 17482186 + line { + function_id: 1 + line: 25 + } +} +function { + id: 1 + name: 5 + system_name: 5 + filename: 6 +} +function { + id: 2 + name: 7 + system_name: 7 + filename: 6 +} +function { + id: 3 + name: 8 + system_name: 8 + filename: 9 +} +string_table: "" +string_table: "samples" +string_table: "count" +string_table: "cpu" +string_table: "nanoseconds" +string_table: "main.doSum" +string_table: "/Users/maximilienandile/go/src/go_book/profiling/gettingstarted/main.go" +string_table: "main.main" +string_table: "runtime.main" +string_table: "/usr/local/go/src/runtime/proc.go" +time_nanos: 1546864261276935000 +duration_nanos: 417027943 +period_type { + type: 3 + unit: 4 +} +period: 10000000 +``` + +我们可以看到这个文件的定义: + +- Sample types(样本类型) +- Samples(样本) +- Mappings(映射) +- Locations(地点) +- Functions(职能) +- A 『 string table(字符串表)』 +- 属性:time_nanos、period_type 和 period + +在接下来的部分中,你将了解这些属性的用法。 + +## 7、什么是调用堆栈? + +### 7.1、什么是调用堆栈 + +堆栈 就是一堆对象。在现实生活中,你可以用木头、香槟酒或任何可以叠放的东西来模拟一个堆栈。 + +在计算机科学中,我们叠放的是函数调用。当程序执行时,它从一个函数开始。main 函数是第一个执行的。然后我们将调用其他的函数,在其内部又会调用其他的函数。。。 + +当你的程序运行时,调用堆栈是会增长的。你可以使用 `debug` 包来获取调用堆栈。 + +程序的调用堆栈是当前正在运行的函数的有序列表。 + +### 7.2、调用堆栈示例:如何打印堆栈 + +举个例子:下面,你可以看到一个示例应用程序,它定义了一个 main 函数,两个其他函数 `firstFunctionToBeCalled` 和 `secondFunctionToBeCalled`。main 函数调用 `firstFunctionToBeCalled` ,这个函数又调用 `secondFunctionToBeCalled`。在最后一个函数中,我们将打印堆栈。 + +```go +// profiling/stack/main.go +package main + +import "runtime/debug" + +func main() { + firstFunctionToBeCalled() +} + +func firstFunctionToBeCalled(){ + secondFunctionToBeCalled() +} + +func secondFunctionToBeCalled(){ + debug.PrintStack() +} +``` + +程序输出: + +```shell +$ go run main.go +goroutine 1 [running]: +runtime/debug.Stack(0xc00000e1b0, 0x1, 0x1) + /usr/local/go/src/runtime/debug/stack.go:24 +0xa7 +runtime/debug.PrintStack() + /usr/local/go/src/runtime/debug/stack.go:16 +0x22 +main.secondFunctionToBeCalled() + /Users/maximilienandile/go/src/go_book/profiling/stack/main.go:14 +0x20 +main.firstFunctionToBeCalled() + /Users/maximilienandile/go/src/go_book/profiling/stack/main.go:10 +0x20 +main.main() + /Users/maximilienandile/go/src/go_book/profiling/stack/main.go:6 +0x20 +``` + +我们可以自下而上(从 `main.main` 到 `runtime/debug.Stack` )的读取堆栈。一切从 main 函数开始。然后堆栈开始增长。 + +我们通过调用堆栈的解析来理解 profiler 所做的工作。 + +## 8、CPU时间 + +在本节中,我将尝试向你解释什么是 CPU 时间。如果没有清楚地理解这个概念,接下来的部分将很难理解。 + +CPU 时间表示中央处理单元(CPU)执行程序中定义的指令集的时间。由微处理器处理这些指令。你的程序越复杂且计算量越大,你需要的 CPU 时间就越多。 + +我们可以将 CPU 时间分为两个子类别: + +- CPU 用户时间 +- CPU 系统时间 + +让我们举个例子来更好地理解这些概念。 + +```go +// profiling/understanding-CPU-profile/main.go +package main + +import ( + "fmt" + "log" + "os" + "runtime/pprof" +) + +func main() { + // set CPU profiling (1) + f, err := os.Create("profile.pb.gz") + if err != nil { + log.Fatal(err) + } + defer f.Close() + + err = pprof.StartCPUProfile(f) + if err != nil { + log.Fatal(err) + } + + defer pprof.StopCPUProfile() + + // CPU intensive operation (2) + test := 0 + for i := 0; i < 1000000000; i++ { + test = i + } + fmt.Println(test) +} +``` + +上面的例子中,我们使用标准的做法对我们的程序进行 CPU profiling。之后是一个 for 循环,从 0 迭代到 1000000000。在 for 循环中,我们将变量 test 的值更改为 i 的值(即计数器变量)。 + +编译我们的程序,然后运行: + +```shell +$ go build main.go +$ ./main +999999999 +``` + +这段程序运行需要多长时间?我们可以使用 time 工具重新运行它(适用于 Mac 和 Linux 用户)。该命令将执行程序并显示统计的时间信息: + +```shell +$ time ./main +real 0m0.629s +user 0m0.518s +sys 0m0.005s +``` + +这些输出是什么意思? + +- real 0m0.629s:总时间,即程序调入和终止之间经过的时间 +- user 0m0.518s:用户的 CPU 时间。该时间表示 CPU 忙于执行用户态指令的时间。 +- sys 0m0.005s:系统的 CPU 时间。这个时间表示 CPU 在内核空间中执行指令所花费的时间,例如系统调用(打开文件等等的操作) + +下图中,你可以看到用户和系统 CPU 时间的配额情况。 + + + +
4u zdu-JUOQ|pYtdYP!5C{X&|BPAxuMbeO(WkRB_pl4}_FYMex!@W(l$Aj@J?rg8KtM1% zJ6qaJ%mVv!BM$=S$^Q(QFI`|yg8W}Y=Kq;C|Nr(urra9r6#6Py z2qR#J$8;;+%W5nA;ZC(k(8nk&U*>q5ujiPL2Dy>eHm5ZOVVL^FB&IUiHGKQJ)Xrp> z;RK#+HwoyW7!jOZFE=+{BKE+J$eS4jF%*~WI~K~&9S#5Eh@NgBHDO|=II`6CU?q2? zJ-e>xqkHA@txNU8myG1BK9sw`M+Oa%=9gESa2@6wtBj39?Q>8q{{;E6lTbU)u|c1{ zV^1l*ECY{+s@cF+ILLoE2$l$+#=rVLx@jD_qDM(z);g8;9M#TJaS-QsE~5+6tsrLy z+6UUkD+qH7=e8tEqJ_uA3NL=eBRRwHE8u(N`&6de@*uz5a_x`fHf;G9d-dv5T6AJ- z0nG^kim+I0bV{%3YZS@j#xDf55QxPKU?Z(Oh6n-mh8iw2oVSCek!B0lZyQN-Xw&rv z5fB3i1F0+xV%y52vCxc6K6NDD9|>}pn9v4$W1`>y!*spB!9-sdGm^oA@<-cZT4LH5yhgTG_g zfh7dOD}z3wDF!C7z9@ gMj*-!7Z*4PJdru$ZZNwPU;du6_X@{PlDm_J0 z`2r77qkz#VN}o(}IvHqf? !XhZdvYcqdIkskm~A%z|6g^4SF|9joq z0_p8-C2?`|maHOF yd>EFzf z{C0HQPau%NoNsx3TTZ;T_``vDQUh<*HXUJNXpVyHIy$aQDGlNZbwb>yorJCUD2^z6 zI}=VC(H{(0moHPL96HxrsZk-m|JX2zvX$~7ymReVjP|M_2et~LCJj=C8)NR`EjpTs zHyygqK6*|T8B-rOoOIrc<}YZ a z%ovO5yDdeKyRhSgD5>+VS*WM_PgmQtLdvE1m_QLYNE!*ut l?sXm?=3{LOgFO)q_C!JQFzDH(WQ5aL zrMr_sx&*dzG}$s4R(}vD6JH#ynD)*+6C<-SckPhlug+imnz&fB5Iu+Y(GbX0Di ~vT$)-TAlV=Hq;8o<3)LkzHmOF=XqCiu =dK2@JR-O#^Y2dcX0%*%`Q2QB73Ii3)G)^2V7G`r@U1jsI z$xw&VvPu0|QC5f?M<1qF^hu6vm=s^o(9c(>>hP?ciBAfHLxrdzN)<8;0GyI qJdV5xbwL9o)E6ydHl4 z0s%_7u k_99-XWog7Noi+^A@u#G@MdsYZT {21BhDZ!bs3_+d~5(#WNA zyPwe#&API6{2QWQo}VA{>FVfs1GbMSQy7S-L |`8cLt5(F`pnme+ez %oOr*NYBk$bYhsB>*ll+$x}rKUEqC_vVZgg zu9AP7o}BgY?O{t+axynJH;j%~GY7D1ZAC?W{B8iU0s5AxA|H?p0LK9mxjv9Yg4qMW z5KIyt0MQMGG0l{Ms()Z`aK6HL;P13(G{iR|SVF0`lJTmHXMU=PmqesnL#FKI^Zp=Q zIi=7J@l1?u |3(Mnu)YCSr{5983U=-My zn~X2R`;3%u^Qx;8bLTUgJjTYyN3sNcb|&aR)qdKzbU4is@f7_ZFM>OA+({b?p@RjG z8`msB7XV;w0M^kZiNS>M{<5}XXaxS*L4VUi@N|fVxti{l%yl69d#~6 !sleyYmMm#QPoF*o-QVEgAP0JY)mtIt zI-f^xSy>GF+;7B_PGC~M#c4#B$4va?3kXQQ=R-%eA4YcWU95|q+>5o!D<^#L_jQtH z=T?or>FD;&nBV?AoJb`HvDAV3kg1P4J%2sw2*?zm6|S$ZZ*CSS81J)7A6O?OCG`fQ z?Tf>uk>U4r%F3MXs$l?Mkun41(zO`3OQ_mWJ@a`z1Y$6Pe3iG+-MU}8mTBFwnOF33 z_az(@eQ0@Jh!B}508?q9Fr$QpjET#z0;e^<{j||3m| 5taZmg({0_sLJl+wcsNFt3t41V`8$4c7SQ$dHc}f8Yuc UCh~3o+?N+ z>6G^D0~NFCnCpK4@l{R!M^P}Z1`u@coQ7jTz?(NU=|XD0PMc|cayPyUv;!}g_ud{d zbEL?A!GREEfdLN`+UWDxJiUA0LH1w^W~1}-TB0hcnyFwA4jP{n8PKHeErb435w{dn zqKh7ffZQmdjR0VK9ZF8l$=!1S@4FfEDivjA6d1+E1$e6LIE?-VFoYzt6{!{@h_A8` zN=(C_CzCaK`C?w~g!F7}`8fpX>_>cZ=sXg}e%{_$brq0D|0kBV06qZFW ^ zm&+xeM|q!{k1SY?4x4h?+9V^V_G%Zd{Fd~)Nfy~xHjfuJ^!G(@5S8Tlx&5ZIw}*M* zD;uWu1EQQ54k-qCZ%Znet#qN9<&p$}Xnl_JA9%VWP@-bYamH|T%M#HbP+h)}o~|yd zrDkocKoI`*Sn!b%{M)|en*rRO%=4%XaCv4tX#j6XON$sa2sE~{`q>H+Sb;b+a*g*F z0I@&j8!5=kd-380K#IV=oxehR0V4Rg>vLZUM*Tuq!6wwNsWZ9V{5O+0_WGEMIfx+3 zoF8d=0;0$e$yACvI;a`+E$WgRH13Yi_glU=(R1 Tq;VdMAis2d~$W z6CW&0(Xw=SdX3(}@^3f_b_*tKqYeCJT^YjJ3M}~4h%2s4ZeosRRr>hWHN05JpHs!? zULa6-f!QM$ONS8~AVx5kTfq{f7=d@ogxc=yj&xq>G%_Ohz41<~UKfP~lq9G1mD=_G zZ2K(g>9LXnYN8YT%y0CCZ^Y|vfX^f j}i+Ug1vt{qzD G5k41FBF!ROMa7FERT!(?eO;hhM)u~V8W&O1*ukdJv;n*SczQJIw~`q zVSeHy$(uhhZ=4}MS;zX;?y2MmwVOlDwNVNkJ4z4^q^usSM1Jw(r}PlU;y~7bHVHM> zw^ULPZW>?r f4?Qun7GvBI40`gf30<#a4LuBSO<&)uj3h-QB}(lTq4 ztZjPA9jtu&t*4$M2H*Oc8d=!b_!Ue(iqyF1lY-~kEpINJ4ViE( A{MdMbJoDKCU}$z_MYendQ@U~O;pI4SKi; jhI1G*Bi%rlFsKLf@6yL%@mZZS!XnPY@W>~zi zHapR|=9^zMaBZS3LS*3{%{C5(M+r6PZ7;?SeTFZI>Xy G+ zzvgkNU@KyQS!xa~-v~2D5f*AtBHKn8_nk64q%`!P42g6eW4<959aBkkg9Q_grQ=(^ zZwx*gwreKV8wG3SM5{@ZO_b3;-U|l>HV0h8d(}pIpW*c|$OFN<0uK)ldMvIdYki%a zPsOR6w0+LD6ahanZ3sYqVNp?89_V=-SjeD)8QeU5E}VIJE}IWnO ;N>Uke zre0qENapG#Q-IB~w!vi6w2cfxyemmNiPa+W0~4npyQhxaTZ08+->P65;*nA1rE8(l zx@NPE0~(Um?vN0M1pHLUm*-Qfhlhutj*2#ZM~sQ)uZNHJaQhiwOjUInP(^?4z6=*t zo~#q{SK7I}EiNv;_ip*=!@EI-jL@iam@;na>X&4E4LGMdrPG#Nr+kO!?pb_pCt&U} zW632|*t5FA&BV{|6 aa*Qav=?fR6*nhamS2nRtMDfIG6m
OJ7C~{ >Ta%tQ#b5g}#HPmi4*>#_5bLevaH2xS{vfeuf% zS4kJP3l8@y(;3*+hk({xNz^dTvOk2_J2(uPoC0zPrI0@s8|VyJSpk~v?p{B)ud^l5 zuc(3-lboC!AK!W54+dC(YaC~sqI7fj#bzpD!!7e9e$(xuYU%KBd;2-U%J1wC;8dZ^ zur6LDlZW+XtpoejQ6>nW%9bh^WzKzs)9>_a{iU)NTy08?ExL=Q%^;8-JCn*fD0I-g z3Oj(CI8rncJ){HBLWA`IVhhFqQxg-7M{9oXeX%H!;qxYT&-*I|?b5ppKvH31ik#GR zadiBW1Nh5*4vmxM#_Q7{aRaKjw9gAzLTUe=FE+C2lQ1{;RS%M;`~>Qi+9vDX7xB_+ zP*i}==$+cvX1La(RkzF`@>Bw9HQV1h)91hns+GpU=nF4v0fali6t%IjA;+o(#3(S% zg!g;z;lWGMX~ed^xp~T$m5@*c=EETAB__Vi+ Ny>*tLKu-e#O|FwCPmB6JIAk1t!{Y(~f#^%3SM#v<5{#3@nepXfR{}dKJO~LoYz# zLPA2qdj}F6n6A`nG1biR1Ac{l9eM|Hkgz}b-cpMosNNDBL3`k7 >GD?}$^;OEc+oJ1Ok4{>0$jr}2vqyCKUxvL zyb@I;BqDOs2J9^GvJh^djVUP;$CvC~cNTo3^I7ov#W|?BF+*}Ia$+L_0U92^&p`i2 zrPDbDP-xH*0{|`zYB@mqs$kG8nfm+JAa1*h6%J+#?`w01PA}y 4aYCJCQwG>KV;5FH5_85toVHiACr$zX1e7yzx!sj0b)c)KV8h=q+Y zS7`7M9hAv4kd8qX1u%(YemWXtinHG?w!i8tzPDuNna1M0m0V;G2aWG^n9`1Y-OcSS zU0z@`h_j$U5W<4@gACw lZmFbp;AbMQ)qaCY>_CJ_O_ zyRt{f+)}FkQ+z WF&C6ksd{8t5F_1293S zplCB ;^b6kNPN5KO2y9)T2`(JEHW}(1%+>B8k(AEfWW4?ENXxPCh2w}ii*!Y z0+k4n5di(?UO@1^`|rL8h^OlmO0*z`T@DOL=`t&q%@VhE7i?)=et#aFKu7kjrYAP$ zODu}7^793|w?p8~n6zr#*?@MF%ICt=lBt=Q;3c!L96+%o;dOR&aRKu_zzXDg`?k{Z zn^|g~QCQ?F%cHi#%StaOMh9rjfYeHhi-Gw7uI2_e6DOzBv70O`j`97O_ ea^jdhmM2M|@=J;dJhID?uY+g9 pIv~7udwYO3%9eZ2z7E*#&s~sU0Hx4F-y@OZ5#X7t z+;uerr`Jp0gLyhOI|xhDrY8SJmD)UtLN(!7acovD@KU^8XDVv2E-B$u;Ma{rFK+KG zdE#n&&)VLJ@6>w(RxIcpVeHI@qmaG23I-&2KRuSu_=pspCY9g~A!-^LX6KC*nZFs? zMMYf(k{QSC pv5j<)fc{(t2{F zHUD*;w6Fd_uHYk9AmF)++Qaj{=I76N@$O5`RXc%Hj9>WLnh^-+e+#K#uOaIAN@OqR z-ZnEc4>a-9hCv{rt2{jsWks&k?$z_eHbQ*}?=7)}0qa;=y7 #!w`NfC7d0B~mN7+=xp@f%LLVMM(Rh2%@H(!~q_XQf z226G2#$`(&^nGxWSHy*bRBi>PosAXCrc%B4@tn{|4rPEls!th$y-0x11*^+9XfB-_ z9#6yzn-e9l!zdwoOv3L EcwPYP_F?czD_?ttRc4Dfw)u~O6 W zJj5dPyM5LDjZEV5h2f=z?+}8|GMrwutwr2zX_my$$Y-@kCryYRNi^qAw;2UT(W$Lt zC5Cl`GIj7CYpWnKsO9hO$AP~kB&gLqg-l_HZUWKBJ1LLWvNy!Mf^a RUC72YW479^r+JZwLaULd&c&Q4gii;QKchxgO%9zX$ z->#8oO%}&WjT}}{cT-41ERA4SrtgllTxvH!d5P2YJ7HHwZU+)wM$?aQNUk@#w8kd- zGQgGTgVBVg^8|}l%VX8y0DbWEfFkr16;j$yKL0Cf{ g`Fz%4rX5Q9G>uI{!20hJ5q+s7Q?yCD?h$5m0=G!UJDTlRftM+^4RHhk?RXfZ!W*97O<~k&s9W&$AUuKcSzJ_Mmy_{$@UOa2?5e57u(OjKmIQA)-1t^ zs2f~^09#2UEz{oTq@nfR99sk&VVW`amA6XJJ2?muTz@8n3vFRLS@O9{3?+nIMJ@5_ z6vwGk)L`Ky#8nw4DgOhzhGx=m !M!eXFRA0kII@a!dTpJXMG(Sb@;$9z+gT z7V}&^bC&rp;;~^1GDJ-iUjL>{^R`jwJn%D2Ld;-X3~+?hjhofSD;v*HAYKcsb?#D; zLnkxU)c9{-!E<1*T3gD*V@;F!thRVh9^D#(1NdGm_SeCm$u&4Pi7Go9q4+w1`H!BV z{r$>xvqcg{7V{Ja97GL08<>dqWYL1zG`9%2<|(-5iT&d~&f|G;FdiK|WC||8cGcRx zO0sD>@1GRVfn10p4hIInDo!=L|5kaEVfz8ozEII?ECg)F8nzu;KO~nXRc5n~al~z4 z&ua1<0lOJ&0yYY1!RIgsf{n8DR--c~J(zv+F){4xpYK+K8C6=5L&j?N=DGPL^#k@3 zH6)mfk?RTu9JX!jRcVx2Ss{=qdiB**v9p$GIw~e`tSU^f5S0Q=H(%Bx=lq0-@vA8- zIEd>j{e)t&--5-e8E}^F7-jiD6;O}hrOg&QS#u~&EH3P6P~UIuz+y^kKI^|&*MV5z z`6IO6h+$A2En6?I@H1SXLWn|XM2dN $WUp@BDcBL`@pDp)A;zr!c(CQ>khN z!9>iTSLD$7bCkP+D@Iu`&=r(@ _FnKhW)9CjzzI#8iP;q)A0Ie(hX)J{R4 zwkOY^V0i$8*%doFegeDuHQuMKae;fGw_&d!2G79$y^uMlu5Ffn7ZfPyVL;Ld^3oUN zt*gw=185T=Us! i4OaZ&tHpAikRn_30e*GGtz&-xYupmAU=<4+mWR^o9Zy7CvI5ch*yYS-tSfLqU4M zLj0xyCu#5En45=?a_i@ 3lp z2*DIni;Yac(vdW?zQK4e1^;OH5idt*VnzS3N;-d#VfSKedQr@G2o3ya2UEmDtoscY zLG$AgutyD6xEfgM1gQUr!Uz5W@tL^5*|XPaW6MaPH(S48PqNtk$uv?R(S~RMS;`P0Zvs; zbLog!WV4IOE6!RB?hEG-aFns&=T^^PpS_V9PuZaSl$Lt3RA mhO-;!9_$DcRqyUTDJNtyJvPk|xLx}XRsY>Yf`Hp* z;s|&1Ofjf&zdC&Yl*ABjojFM{xw_&S4E~B6l6dHp1oSzw#Cg>*?*NW`rcNHHU|_T1 z^6%)+ZVo;3WaVs&FXZVUt$$*Mk&1sM-p5VO#_iMdWtcGq{K(CH(41xr5=|@-E%spa zl|{LgfOMiOCbR~a*EPhwF^46>vYiv|%iD)iImZV&o9}j$A3M>DXjgtlf_inLl_?8C z|BMP7!ir;U242%c&l3EXm$Z)?>%-Br9F_5&307YbmpW*pbZnvtcoD1Wn9X@CpKHJP zH?IGJVP!t%vRcH((Murq?^$7NSIa0RW{)CHQ=gE?T=#3_96yi{pDi_7&uSP+N&76Q zBF+3}sX`&=@~?_oA9j92Uv7;IX?^pjy>9W+OMUV|a`^K{bfr#o?8Nr{lCjF0WGxcC zCmml9-lGTd{_%fyNI)tNB?5=iuxzYPL(i~Pu_5xdJbq_b_YGm)v4LN~i}$BdNZt?b zU<|k!*aTbW?ZWDXkCW{7ejZ`iBSg=zfB6Z`r0Ffqfw7#^N!yI7zvB6$>7iiDYW)G< z(&HY^8`bP+Dj|pnC4OsqoJiQOiaqB&=bDaR`v=>)k0vH1*H3P)`3OhqcYkv7TO52% zn&bDfs>vr2SJH&X7XklKg-BQmLg;(ST+|<0PQ!KKkXMQv)YwLF4eht wq zGUfO07kCqD-Cvy?#Eb Z<|`9S|NjsyYnGC;djh8VqNVR3pj zi=aHNuEK9T9aCJ6)TKnDV}di95f?>IGB4y%1hXZMlt3l%WC9xuTyEvOmlJ>9=Pf z3a`e~H|G_zDn3{!IV%JqPYX1do-;)1IQ+GcIyW3&e3; %4I#qK_t_xy6>G> z3?$J%L1vhEUvi Z(CfFYAqrYR#tR?HErDi=pJgxf)9GXS`{uKQIgS zINp=O9!6oeEqu3U#*Q5Wdsr(owgq%IP23~tS?1vVzKqY{SCPM)ax`34$Bs798Bco+ zfoMll#>d&4Yzhz&amQmbo TO6wRaR-A-WV0Y zoxA|zb38sZT_wxdMC5^7{~wmFJD$q-@86`*AhQTbhzJ?k5gFOCx01cru~&&mA!Q56 z-g}Qo_KHaMUdP`1`JC_X>D52Zea >gziM>>t}E? z@olf0=ZoSKk<>-S$YC%Y7HeMTz(D6zd4H2jr5}N){*`wJ+S~u;`^JC$P;sZRF?EkN zPG1{MSaKWrQ}>)OvR&cAECbv33*;InDTE|L`NKiq(X`0MY}V5Q!;@A=-m}8F!H2>^ zcLWtse}i17+fxq$O<&={_*jS==s25_TdM=PW{irU>`n5Uw78AN`_VwZ`%1w*q323c zJzZmpE(g>a3-?p9v{96_=LImlZwJj++AK9zpNgTbBd){@banj#=gS-H)p_+(F*omL zkU#8DV2l{b`_=7DD~J~sr5TQpzvt(ocH5UWu~Kb2&i#o5E0^M}exNqs=~a2;CL1Ja z+@i%A6BN{1*tGU%>|>QX?68nH{7m-bw^UGeR4!i!5waDM7yV!_!Aqq!x16xL>8{ML z&k1Hk! yjs<=D|1xO0ZGN(c#jw2YsE3c!4}vt?W;TbfPMY%uC8&ES8Xe{Y-7j z937$37ttadS58T$hFNfbm{IW0xzJBh?An_ZuyO?m&r1v2*)g>X!l}t;*yG(h*Fk2- zt0+W#x?Sh_VQ8LW;Yd+Wa5LS#kEv1tWbfzjki#Fzue8yE9%=5{w$%24Qo*Z?XPrNv z?)-eX9?+%zObJC!YpX=>i hgbF2%YVaQQb)7c35UB~l zHLYs>T~}iey9*N7twpoD*+K7b ggGdh_QO zSy)-&l}GK}*t597IALm$WWu}SXosiv*6f$UTx2AiRE|=1n`(DmL{!t?+Y9zLu?h+c z5PO~bd;HOUakHo&ar33adZmI{{u6k+j7|^_@eJ2Cc9_@+&l_3CNe?9LjyjGe`|wMo zDy+i3YiyW7@Jbji6S3$c3B~$EN=l_pvAP<3QGLfCr#PMh$E}Uv5h>kdqP+3*tNk() z)WKeMpXjiJ2-HwWlHK=9M@FU!TK)YPIX!8A`pR~B;QbpB1GjAhJ(ZGoZqZy^g^s45 zPRlWpjj#}l4*u+pm)V^t>!$$2Wk}=P{ Pz_qb3&cbJ>sI7*{qNl8p@DF;Z-ZE zPt+G%opYp-;c%L|Tf)0vDK57WU?YT%?+3Jxf3eKe|Fb*g{m~a!@{ZjkK)kPi-Sk%r zbmKq`EB*2BVKJCU)cpsT*-IXdqSE}%U5qDg$E)0hPOt>OD2&yS)w@1HU8fx?EX8kq z-8t(DQsL bNeUF9c{@9F-Kel(3IDfb>z-092%FAXFP)E>wx52y!uvdDd_>< y z2Hcj>G7J#w>reL-+*>630{U3_ZpOeb{Zoa*Lmm#pbpBm3->0ZI!bf6@UDO)h`hu uX~>oV(K2u1ZrHRc9Hu~n7~}!*{h1~ zWS*E`ZJYzU-O3N6Z%eh=XUNkpe2Mu<%5yo}P@e)+M!LmG?7M>N;a=+C!B9MID{0xq zvY@sLusru}2>P&b31n$Tf_(`77!97(s-k=wl`rBHcr6m%rsy{^0`Y^%-ZqlNb`^_h z3;J8xKhKR@azWGLarj>=eNW?^-L;ka{SRYl60G+vO$5BptlXWRf>bPkNfk;4ZOruZ z7HpoFKq6JY;Ms;IXbTRg@Yw5Nyr0Se+KG{e59DAxBP$YS@c@KX@n_NWLeE2!Ylh63 z!GB&&c)eIYx2oRj$V%QWdB z#D%#r?h%9uAM^Fi_cuC&@SEqcwUGB2+Wsg>g&YcWX7sYkH|1gbr06N7lM}7;ucrP} z7|)Fl4&g=Tk{x`O7m5_PIyGArt*^xhjCvmz@Hz$B=TN<1Aa2v~T1tK*rScxlDyjhb zb|s?5{=>>$g!L;ikxpD)k@@V#)>OZ?nHY*nsG*1}f@Cv0ikY~9Y7M5$=)H*zu8I8F zhiCzg{%v%rkJXZh @d7`Y7Y3l-5|mFoMt`l!E{J2kt-0yC zHNQKsK`o{C2F>dG3Y5m4!B)Q~ *qvzQ8g7WzPk*!@?%^V0Zp8_@vjyV z4K`(Zr0fw^D2x3}EJaLs0=DR#3^hhV|MP dX(RzSwiw&$p4CcEWT|alT2d_$CH$>P4sal#CwhV-q`K9Ew zy%@F+yQoh8sm8lGxJ9*G3PmnT2@+|x)E7RmIzqlqi>+DVK%|w(SO20S-FxS*vjDvy zK~a-}>F>LDmjvH*ldXbj`wf;vN>;Z%HYR@Z=nis4EkC5k+Vpb3(U(^;D5_Tx6hZVh z<4Mv<(aM 2H=1hfb_M!^cKl4a+2VG z4wLmMCT F;fZ5LZ`Sr&3fQyIr1~S z?1xJN#=9BzX@z4J&~()u7LXqn@GkwajdouKniO%+ON}1CDN=o=V7vO4fhZ=D8dvs5 zuq5mYOIoH`EC>}22-SPg*R1nMvd|6!Y}$05zeXNSfz?MI7gR1>)|k9;jU`5okl=fZ zWJs*Quoi+39o%?!ZO4@H9$Ca21FX&-mQSk~YcKUL@S|WF#E?IJ7op|M?z^opN? wlff7Ktx5X_c_Om+bz4N+&T(P`@f;k=Na(0@gW?9 z9x=jIyiVUOlZHh28-CbGbOcMP@aB&!m2g~zm@E|%kH=9Iu`-0${ b2Pb~R~U_;K`?>dF`1b= zi|-Pqg eQLjH^6Q&jnOE4yPZxH1eb#TS zq)SY0kFpT+=CvtcvGRcBJ1nHbBCWI_`X{ihzi+7cXW-h~#7hTa>a3A9W2UB@Vhe4T zCHzI!8idfQoX)1LGCv`6r1eXSmY*Nfo4U(_OW<+u5?LHq(k32?(MUnggz?vhWlGFO zfZLf5r=fl*ey91>tqV#{GEZ|@+?@N(Y&$m0G3gG$RsdOO>ZN05Vy64B2sDrh=G?qM zEZUc;oK_Z~=tQ`ysxYQHo%8G^R?gpAx~Z`W3DkANCD0K!dWtY47}5>-`QE(V@b0sw z@wPj#sy;cctirwQf)@+EgDeV}+{@JpM}j4keyTID+fpuB)9|Ofy=UC=M8AkQXkbhb zb)SKX07l9H=>m;Ox16b@RAn#$6LD$#Y}rOosrb68+#Yifq`<8@X~qHKOPdd+^lH&e z4aCXP2%#(?L3B7pw>j43ui|aoapHnvfr7`Ou8ixgAK%oNHqR{m@D9ca#sx2}X;Coo zvXz+0DV45Dz}~!HdVMRr_}|WFG#?Yr-e}Ek vXJHou{yi7rb#0gbHNnSJgze- zNcYTAd`1r=_A8h!B;6ilVg#jpu~hByVDH(5i|v`OV!QmPRip%PKUUmZZ~yq_^-G3` zrSKPmF{BFVXx4`3;4KqhFigj^*$XCoqQ(*3`x3Mmd+_$d-P#T*NE*b8W|AhOBl)Qn zLO%#lMz(##X1xejlOksGAq%A%D`T#om`ZxcI$mwHNk+L ay06D;z#3GdPa*Olm% z=wXdbzXz`W!@orD`+AyqX?~~SV`fvr8!5erCTKZKE9jNGzlaeNISiWXcauvlAMEZF z(~a=b!tGm{8Hnd_@wL4>A9zs#@!5yM+Xo z1S`|m^y-{#H9WyM64(c-?oK}y7>(1B4f^}dJ5`IryDlELez6C)hQR*oqd0&3|Mx!g z^Snr}NW0uBa&2%iZz&}k*IkD37~=-0NO=fs#5OT|*)AuiNs3RK@A}k1VtKG^vnjzP z^gqjrMJo8EGbHqWWNJnhZ2UBMhTFyH&Vla 7&;5s_x^wDBbVR(LJq6Ez6w7r4 zKkd>~-99vy!Xm#RfnCuPERkcT`tSjG3ZY2j!PdNu@IM!7{o1^nxs6+}9vi2tnD9Lf z7ySYCnSEoE{Og|*up3eiG2@sY#Ee7XX7a;fd*8s}r4owE%)1?s3;owFJJ-YR?>u40 zS)Y3YV)|Fs_XZSniNFQ%H3+Sd1#NsrlQw+&uT937l1mP;N@(NxjkS$%wF|Xp(D(F~ z^emHLLbtzIkqYwuBOTT#Z*?hnj#;L9=@Ld;D+<9;`+ecNLTrKr8xkg_^qS$KQ<&Dk zpvSA_%2`K0E(H(QHLFGhFZ^E+YCNUDPwIt-$8sP&9;(gSCgTw16 (`xm zD`pr+p-!)~0X;MZ wRTuz zas_KK%=6%vBPh;H$OEZF{UGxE()S(;hjCIpSr|*>+x#mteidLp|bPtd!}}ys4K^a@6|#t^>k6tbzmu^sFNa>7*m- z{$bP?HCbWM%AAatVjZ)FiMj;473GrN !B{ zjW04n-UrZOF u??Y2FRTP!zqhOrN zP&_e|giPWxLygJ&Xj=GJ YolFoT|mqThFkfw%=(u _iv1m`uPnW^9NAilY&J?CZBOfH&r)E4PC7viAI|`(sB@veAU~$beUWN z4i`8cGxU8%k36z>olBVcxKV-TLomTE;(IYeU2LSO o`v~$7)XbCZ{6?*`~v=w!&LtNPv37$Vwmsz zR{|xK7$SWV1%GKG!8l173hCdrY7wOM(RixZlbI=eCI2R7Oqb~AYEY6BN8Y~+yeCRT z5ctgkqz}3LKI?Lz3JTAV2)16r7-kb@EvBXh%TGzD=u3Ci2sN&aB0xm%D636@fP`Vb zMI?5UU_KWM(V|zC=cB@y#dr7aiN=hL%^JFpAheeL*Q?l^^iTwbM4PiXOt*VM5=IU93yB7(%ZBzaa*%(dl@o#@1l)}jq{Psp*btA11olNR>`cWh#5Tz)0B}Ei z$4PwqB80dY|Dm*IYyBKES~Q4LGt@Jg93{m1_|M3o@vAy17%%L>P1rPu_~yin{R0Q( zhq0V^yqHf|VbvV$i+L{7U^;XbP>YgPKKzIvLJuxM^x|rTZGxYCQTFYN)@~S>M`N$r zM=LQRup#?Pb7YN6VF@sSeg79`sZYSnN?<%fe@D9-M0ChTiGNdOlm_H@n1I19QD6NI zW{=YusR&YPp2KweFfL|i>+;m3|23qc|9L`=bP^K`6+UxNhbby5@ `0JF zbG$%tqu-Rxeh}x#u(K@O2SM&vq9&-V(S=bkV?varFJGueaS&I^;wb3?I=^q2pBt+V zWwAv;7U(O)7_U$Z4)1>-4-978l>hf}nm~f2b1C@d|3b*$FmE5xzJoegJ0kghYzB8o zn+Ob 3$T0Yx$A>JR_i zVI48C_T#1>(HN!1hy9g+xYsj4S*PWPJlKGgDm_UsJk75$AL{F6yVnMXC0szlTvU_Y zJtY~W9wlqSoO*gaALo|H-3);2&R6K}RdM!wC1IN3C;toN=QFZN&^FizYuK{GEoWy? z5LwV AaqPo_h%6p|B@qMeTXOmL)1QrdGUj$O@cBqC1 zx>+I(uQO;ul@-H9i7+vLzidazZ%&DR$bgVpLcRXisqW@6XsU+a@NnCX)lyYB PQR(=T)itW8to1=T>67(NQ3O|}a*YIGLH#E(C z6m2O+1g3b~2qw7^4XMxYkpDMK3bvp*2!#klh+t~-CMf*$f1hR8_P%~1G2;PmtiM%F zKJ>&K>G1oe{t_qV5c#v>%*~CF4_MuJMk hzgI>^Pfj~U6BLep8fGQiK`M_qjtz4JP^f_+L5s>K*b;DN=SlQH ziBpjAhcyf%F!OPuqeR@dE$+8;&9}WKiQ+rrhR1M_1EbiU1q<^p&<*%lq1W&oay&5g zV1O0+cxu1>?i-*J#HGCk&J3reNHQf4plu*^Lmb}0hU<*%{^o?>85~T*-3*)1YNIdn z+yANVo!Fjri vL^|aXc3!s{=psLuDpud@6qWp}c{Kd! zd6mt;04FV0C#cXBL)D=w!D{Y&4Oj$UoY;wV{ZdJGmMChR{}qaLS*iy<`GSNY_$8tZ zwV%A?8@w e#ULrc?>U@O%DRVtGs3|p3v5LrOm{8sPi*KF1|+E>!_U`a zRUp^@F0bz~JbYcLo;S@-j4-i@^}R{8>9)kC0rN=SiCMf{vH&)aO2Z&LkRx6@Lh21# zOnF 1sdgt zSBF@UNv-;4MzfU2< =GR#9bTf^piIM!{6MYJV+VF|n <=_w-^vv^3giW)NVHsPf1&=*m<$z4BDY?D_7)me z0QnrA(kk!E$X4N&$1FpCpDGAWwf%co-n{>wTIo;e7c2a4d4 _m#qQJgZ;%tFlIm?c1m@>22%bUQcUq0sXZ<*I; zwa3)XyTR?>aFE%n$%|jUoYnRSP)2op#GYk=;VueU4pwU9s|o94He??ZczAs2zhWe9 zC}@*JdevCn*fCW{Bs1lNJrZ_7^-o^`tKDRhzWyD-%V909Iarae;Y7aY=tFD|tScg_ z?4`e7^+DJ8nh*mtPwJm`ShnuK{pfxbqu>>UlvmI35zp~H8lu8s<^SEId6%8iQEgoP z-zFo$u{2kY;0G>wP|<7k00X$>T5jd?h=;ifW3Wh>U)=1DR9}bNDsPat5HPb+n{Hp8 z=&p5li-8qT`t1KrL*qD+e^PUhN$|1~9<0HqEt}yri n;s9Tyqjd zfz&WSw1`7cJ85R6s# U^+| z9_nBrg*8J+h3 +1R)ScHC?l+;!Km4Eq*iQz{wkCd1Sly^=&DH*qdV&w#d9yJgQ4f`LRX$`VE% zxvbgeufcsLCQ(S2DPP>I(>so5(T=IQ ecb}soE!ZnVU5XF_VW+I(32ro$aK!Hhi49(jddjvH~@Dr{nARDAk zU41ol8>8Ep@RaGll&G?CtW;nFja6GELu6%#?R$@ov^Hn7exIU;lI @3EbQMb)x<~PuOH$nzY#zrY bn_< z__EW(3_8mfC}8}NH}4Hz;BT*XmV#P)d~By&2um578wtx+Egu=HeO$2a+pE=lF_IMS zoqQyYouAmw@z|xDa%uyM!7p<&AiFqwXD;9FIZ43|bhO54VIix3R+L?vu#$&mNE176 zW^vzbiD#%?4TP~7PGM%bdt#ma#My5;I|sMBupmOBcwmOlJFzBEd5IThC;M<(ozGT1 zYII!8yz4=y!o*cWM~c0T4A;GXB$N8m!*&j3J~o(axTA3|{Reh~mtzXik0||qmTZ`O zFvh7}fDr44M*XstwT9EU>jkA9?ykPy#GZ#8c^|*PAS6EEE6|F#@>)L&C5Y>v+DW+6 zJk6(xG|S+n6mf2#pGe+Cmf-HiR)Eit{(7W!R?j`K4ALp?wO{3RPCULU`@`Wo6AFf5 zYv%XqlQ?^oM&3(JY*Bk+f~K+3`v=q65T>J95m*fU80yFak^lyT^bX(=mVKOzs-M^G z!x*Z!6!^5~Fa-I~j~uL6Nfl;UeZAK`r;OKsJ%ABbgp$GI&TFz}S7o6cvA)+&Cf2;b zPQH@D+JLku%x6A;K^OCkAgg0;N#9^=G)gr}2P7*I)Xi<_tl+6mAjjV%yreMvCc9i+ zGSA&?N%;gA)MH2iW?9zLa(`&lS^cN);aH?hUVCem8uioql`<$&gmC8YLaULV=~vLu zZ^~-98S&`^Ns}3k8F|e72Q{|GHp9wDC#IS5PwcgeBejaV$KYptbBM*RT=J^k14|S| zeX-#LrthtyxAq&_)vH&oh=&te(ZLM;P?wdx$qs`-85!6u4iT8k{!aUHk?mP!x<{=Y zA4Yyzud}6_p8hJzKh0ED0~Pn}fhz4~zv9%=o$LvxT-`PRz1d2z6A)VAjXYm+p}O_~ z+CHEYazrjR_SeFh@z;=+2wqzz3KbL;+~8|`Q8DBc<+a_D!1528-@t=&`L|8=mIfQm z8dT1^RCrftZ{zE^IOnh)A0;~cWeL0C`VYA*)3%-eS?Ih-S*zKv0B+}{2~ggW)%Wg# zAPCKb&_Hy_#GUH1^`T*#eaYB3I7t?1B@ydmxql&0|0-ILR`9ZK3ue?xhvjEbDe(I*G> zCe3NTeIh^E@Z`@7=Jx30sAYTHuY#(FDfM5ViPzvm8yTK9*B@G*a~;1OVE_lvDZX2A z+VfcB@Qn`(glFW)6$s`o$1FRkd9F*HjU6u%BMu*yQOEnM`6nGdEK~|`{4505Pn0H0 zM4vUgoc%8Min80(;PKVHGs-qG?)Amza44$ S+&=|DDpi!f9oaW-kLGeNR_m z;$s5Y#A!0d*I)5XhxH0>t!0Dta4%nj1=VzKoZGP(Q9etk=g!J9HpL3NScL|FyU!_g z$ DZ|ltHHwZ|kihrl9bLAGJ!tIMPg&(2G=_#0Si%&gH;o(o5-t$JNDFXG7U)oF z-skx{?e}5EuOJg;lKglS5WIe7hthk^hGl4vU*1t~X$y 0Rr$=eD%7x{y^!PW2$#;w#D6H{1! zUQZ|Go};NdWs2>a4ke1S3xQeQJLQcS6JMYS6|=R%Z+)9S2R HCv3t3S<#VD%H0Y}TQ)ZKW3N@+T$sS< zE9MyK;B$gZfcO5&hONHhwQGG02x~|lzr~7-zIX0UX+9iqVv1sjX8@ciO&rKC8hFQ0 zQmM*ewCwQ7&8n2jRFLZ{Xc2l?e@vxngJYy9ZQ{gw(dV3Vcq0E5Csd_dt;L7}n*I!H z9qo$jS`Xh5y!PKwH%EO;)4JU0mJdU|L3zJ9EZ^*XwG5kbkJYLoThEcPQn;Rr$XX}| z`wLs{%?5ZBogE>Ok~^K5nLbD6C(}}JYO(S4f^VQ%mcI7 <@3w$2M$(n-MWbha$fo^BGH;@R5@@q&szGWV5@i z9fD~$`|*6(9FY#|q6?R%w*lfSz;`CNcFk+62;hhTB0#SimD>}Qu(BD^_DYCGL+uZ| zh&+nL>bJ8o)@ysdFSjljQ~2;#KGx{%TpKOrqkkHw#{_s#V!`#L(qbVlvp%09^f|y_ z(RUO9rbWjbvDo+LnbPzxNA~utM-qL`+@b`pM9n4&I0M>JdP&Jn&)H5-(bj8(rY%^q z$;b8XNwq=h&H78h@lYwBT1MYL{*?&1(U*ivzH;tm`b^={RQwJE02QVGyB%wXRn}DytNE~Fy!MDE% z09kb5t-!Y=kWgk_4e#q;$Ky-ruFMDI-w2shZg~|o9@5LHrnlc<`}t0+^Inyr=j7VQ zk2Jn$!k?h9CyzzA2^rzhX~g+TI^4fQzxou8k8#NQ>T4sV_YT@MsNg&{9gEgrF!(3c z9sj1yn95~fECcu*At89>+uhwAK>l8g?D?F8o)-dV+}blQGqc6|v!U}?nbf-7T-#hg z@TVfE-yPHeSZp4V@nAh|?IQrM2gm>#kNv+Rw)Mgq5-$t?`W&*KOZ1nVZ`?i;2M`Fx zh)RdKb_^d0Kx0(?xzxl_x0A|lJzCK>v-danw8P+R3;2Nmo(j~&(9m$L`R#R}JOUb) zvsGIkL2m9>T7#pwgj9S5fUXtV5;5k(FN(F{WZQe<*PDOF@4n?~Vi7!&@Aop<5{zI& zls>E5n%e^p9Q$2NkCgLE#2>Zp|wYeGe>zDCzi~sd(_1u3|&Xz#OWj%6( zO_xKy7~Z>1PJUsdJPnBE86F=wHP zTEBuJ#38*bK^JbuO}T+PN&`0-egOxCVuAo!XbS)gjz-C*_hYDB^Ya1y-Sy;yrsyUV zHAh)AGHGm0JUfFsnaK69nd};S^>VF^Cr(fsvh3MxX(U*qQKfW5csMrWHT-~BNf4;; zRfvM%?X|!={spWZOHPyl$ypY(*Imy~_all2^9}ONW6fjh54&u^ELdBw0(q2FizI;J z$oFG_49n|JSAnAO61LwhUYqZx)B;Xsz~Ks$2T%>?>M@_=avy-gu>q0}f *Ds9J$-d}k_r-m+O6_vzCuY=uY*9avpZRat(e%9K{NVQalE`WLkb%!Bpvnh5 z6;mdK?0tARGi$k_p (#h!j;~yq%QiT*FfvLpj|Iey{JNv8{w2B8=WpJ;8EjdP29Ubi zo!_!H XbX{<2r|L>i2B^vSOq;qKg8*eB|_W-RB(WX@D~BHU-7A)aRS7CqRV(GRz0q zr`-vH2?`7IU2zyPPMK6TgSr}^&H$LyXo`N0ki9*Wni_Dq&3`>RpSpea0?_pV P%AI_9QKI5rfbNn9ZW>lSg>24G~IPy2mlD=!A7r7@<@ zoXM44|CW_yVQ5JE{#@G^d)~@A|KKc?sv{2ErI&?WSi}pz*LSXtnQ5v!Y{;IO5-c0f zVSJ~A7Ij$}nFLcpF>%n(t~g#Gy%P`;q6&J7VKM`@S}^bcJ_Nw~Apl*)?`Q(U1f~zp z2gPn~j?bP2T?cB+mw-$Gh>#(YDXR47uPvXh!?oX48p<@9Sr32&4hoW&ey<8ufE#nvZt3&*Am1W`)$xIpa}; zhMAdSd ;r44j(Po9455wN2Hc~YS!Yq+#-!Y+nL z1sMCb^|!)gQs-^r0Rzgz?#GKYO0+0#!;`#*m)q7OsZnZjwP)LZm-f4s%+nZsJu!zU zm9`@vKSk*~J}PZhxImk3oG$&h?6lbDKx-nmZjdZ@;&j~QcDyn;Mr$CH0kTREayi+) zFU~7N)co%B;nFo{M=QX{F=ba$R@N=NB4xr)^-)9LO#+W7=qXr^;r{*zX?g&IEpy*p zRt)}mZ%h=g57428h8FDj&ZgPV=roB>Ub)>#P=GhOogV0vyIeTH&fDv5uRmE?5-E{8 zU%6%Fh`kl6 M-g6MhNLKs&t9iJ z_s_ZvDyysfJKC_=MaL_AjCYUPZ=cC;ywxx#LTIE=!T#4@?k@j uF!fsTBn z49FPwCKtuHDQh8uX>FBej2N!4H{!TSDt5B0Q7_ TwKWia zFW}Jo*0(4w-UEXA{rjtq$Op?Up`^eo?+swFoG~FCO8^{u`2CL6XvHS5kU%JvZi;_r zKHxThv4M4-C-4AjNK7jbmh^b 2y7{ZU6?cCD?g1-6kyR_u(dD!1) AS z$1Sg>wxG^6n5U csOr)`bx0WN=UC!V5 z^?3HqIb3}619Wj%zM&t&j!9XAN6SDRxs<*sdt>#LSfM5kjzdt|@{i{|X%C jOhKtckv48MupMVBe7{-oaY-!5CLI=#h|Ct)f1;SQc^9qMT&INct~Q}UU3Gz zI5<5M@qQ~!&$*usv~)iV625*Vhd`P+e`v)?KuZ((E_;o@|GdW*5~|-uDKaKs??z*> zmL5C)>5#44`Q)?ijR||M`__E^<3az} pV0Ln+2_!>C_nT)Bhsd-w(CBcJrsG?#w%nw z)B!do^npzHfzXoE(e98zz1IrLRe;t1FVJO<{=MMa$Qa+ 3!7lY3J +n4^CY%PiL8PSXufU{?2l#q}}Qghl@dJ)6()H z)9Jr*@S|V}ldiM2hx}Z4D8GHMIg_lE0gRkrUJ1v H07;vF_0& z!zXAt#;vo>-W3tWy|EIm7_^)`-oxKz4i!df?W>2gMqj*!DA~LhW4?Abu3R{jR#A%@ z`7=)AxoSBsuLCzt2yl|@UYW{ILZBJ+l#Ye{Vv=k0$UZ~%txp%qS6zj!urD~pUhBxk z)ds%w@U1NW3AlRjkXVfGs+89opYtd1;!Mc0_OKs98jB_kGUIj!V)vd}QA(sv)cFnE zd=oHE|GlSja?`#l-nbi=EiLAYy?}f|xuLQrw> l+*bG7vPHBY&tkR#ill;N&;7HT`m@#B2VwX|kX!5VM-2pd@9k9izyCcbd zL>X*bk7c?qh&-T1zK(yps?#&};DL$pF3 aaywuAOVAr7n%CW6hGVkbkH-*FPA_$Gi(fjNh!gp>WS* z5BKVg-^om7SwKq~t0SZD+Fb4&h&dR-6D{mLTU$S4)5&*U`ke|m&S}pxE6Fa%_y1nn zfryTe%ErnnUPrWmbp^6j!1%@ktgVCSEI9kG2D&FNL&xH8OifKq7+TZL&XBwnV7=zJ zI#M>X=?Z-B01P*=4n8}#d>pulo%r>B{5BLwpaIs_>J0_8KM)(8`2jt6PXd`J4OB;l z2hdvOPgoxCq%-Dfsur>u-^mqavT}Gzr1aKKAmKyDn|$xo6P*coe_IJoxndB~@El?N zxHPx5QT~pit4)7ljbvpz4h{|g5HzK45$KiqsMuIoNW|!ggItAdMo?opisTe>{gAkM zE`GD@D1!VoyzLdYJdm?t*ggT;d0fPKX8wa5qa&~}0o1dT0Cmt)|Lah9RMOW!`+<8K zIKJ!+4U $n6)4-v%wwBe z0--8!o2q^dSfR|!4yMh~uB?xT;DnLK=3j}qjoOQrZt7$^Goa3LcNd6g>&!L088Eed z=zpDuhX;b6ug9xkD1l`+Hto;AfKW*6y*f(my}e(^bvrtOMDbDJHB!8X z)wX;$cXIR$wx(IW@~phV#a5~*Qm23H_I%$}XnIEY;txaM+3x4ovl-GgjRt5sR$08M zU3Zntfzj&wRe3$fNw*b$UTeB8#$C=Wa)1vtBIvj{^=W764K5=_Vtl=!yW#JwN3ya& zy0}ccUvb7j$lmE3ZFL%ft?9m|W~oQ5w@KLJKXIZ5FCBA{#?}(*pjZuq%(IqJf;uCw z*=y&=O4KlSe6W=UFay)FUR+ qjUQGx@TSQk6(^=dxjiRZClidKF^fV%QgGOs^67y zRrx6v57tx4(&XV-{ce7*ZmvIGHM$Nd<0Vh3&Cf*S)2q>w5xfnFrrYk %xnO7S!G&N#gaxN js7s zJ}NR20QW^WI40K$2f0636N| ^faMY?qI0s3=DeEI7;3{n{Q`# z&-IQI^Fv~mO! &> z3+%1nPBxn>vN9F)4GboxngWN}u|B7wp9}Fgc&*0ebBPGIvZG$IJSw}B%#@XOR0G4Y ze$m19Jq~EmB~!%S0S#kPS(!TC)TZmdy>fuT1kOeYWvE)Js+G!hjCt1{-el+~nqOFe zlCrfmfTh+ye$mF=1uVdT` @swjh=LVkco=VZ-gH7#s2 z5C>_pq9z-#5{FuZ)kF`KFFY|g_6v6Tc)V98!!<)c^o2G3=gZ^k!M)C<-x_@~j36Jc z-0L|f7y6yAZpTF8`>D)W JTJVV_kfp+i{yQ?sv0#VB_P&DJcn{53d4iA2OO2)DOB&1 zU4Dzhfc2R HNjQxQl%OjbO_x;!UEG)3S0$F-IZ!YrZ z)EU~dBcIbATnU2k;$vv2PUJ3-G$ufG9l&WL+H@-&7$Vy6?u^bDcs(`%UH2RZpQET4 zI>X0nGpebr{ptB5Zf>(!li2wvIQx)e1YX7A@$tt30s_Lqt9&1O7FJePbhNaFYcf;l zqL1gw+5xJTD@KlwYTVQQCvb}}Mub1l%g?v{dIw8s&wuEK&>m{CwXpN&Sm`=js-(@U z8#lh2Gau@(`n`PqcEfcCj;7B1Hev`*sK=%+a;+jt?PaX=%gf7qz%#kncejZHSSi0} zWqB-=q?u3IRivl4Bz(R}MO9-rB_@zi7q@U$E`|qXRGL2)bI+JnGCzOb0xei;d3bdO zI5N&Rq5#*`>tHI7CR9rKGbleuBcPwVY~3La0@K*p-Ce~JE7yPZt=N|-8Ex#p%KllG zsyr@?)&ANUI3kQ1%J;UFOgW67w7XYhe^@)vIJ3#k^Y&xn)kN=!A@8KWM%ca@ ^fFu>lP7|K$zd?_HKeM2whLxK6%jk%Og~hnnzTW;?C16j>MzIZ- zo%Y=p`8QT`oSk2%t*7VJM|(HC6*y+~ov!!8ssiW6nCyKZyIJZ_AJd!EIXJ&!=u!Am z@l(?fNmTtq@3UuV{hXG?Uf8y;@B62{7i}0S6LDI0GBa%LAAOE~h}E!O+I(lK-D_oC zT7n6To5aLidcS!S2T(cFUeCZ&x3Y4+2`s6%Z{HB}1e(*hed~J4j-pW#BcJm?Y^6u> zKea8;>eE~0OM*sw?UzUHZBS-r!H)gY^Q%iqj!1tq=4Ek~Zh|OX(wCL4;cT&ge15Y1 zigS2$^yKV#-ErZ9?~v3#)cp9<=`G&Osg*%7Ig?^tlfVaeNhSK 0(I+|u%cV{=8jh64-i}|b` zd2QHLf==XO@`|=`YJD+_(-z^6rj{MO(q Xq` GT4yDWe1fDLB0w3vviHxz-9d=o^MRM+PwjWl zI`p=FrppM0!um2-t(jY0rtzqrUj5OK%*I2-wpV~m%G1lZQEf`v+FzV3JEg)qCv@ z-Xw3ul||d~f2wh-Ez;DMJ?b5aS_%Bx#QFlep#M5_qZl1(qQZO5?rcf#c>cAvOhy^4 zYa?P-rLMLlGC)CfGl%c@y150WgCssYKvT`_T-3GLY0*`dQ m2eOmV4 zMO AiE3-cj=FTn!1>U}qlbu6y@7JXAzF~oGnzS;g=@XLSiaMk)ztCyWn z7u^Yu1wG#3BCZ$x0sj <0%-~yurKNr!6?~*z zlCoQ>U2bn8NIfph#x|Dw+IF9n`-y`4w1SC4RHP7PQ>lq=lJz!-0cUz=;8)O*V8kes-H6jH$US3c4^Yy zZE5P)=YDP3yf1J4dh4CfUtcnL`fS&Y4L_IO`J=z_g-QX0~Uvdab__xY*Pg0hcc_oS!H^ Jrt3_hPcj?*ex=^yP+U4KUN!2d{|Ne{7eX?nx(sw@whnc{1 z4g?}Ty5B%FLykQ#RRTAIH35qlAmDNXUZBXppdkVD2m`}{gh3}+wUHg@yx58VH~o8A zz3BhLO66omhACoc5MT970J%QE02o*d3=Rjs+}{M;YPI3A$ga (zh^17O(;^472V zuK#-9Bp4V}U)<-eGLQFVNLUWsx(U|QGG)_^WQRiF<#HAiJ%AUdS eLTQ`y&FBbH(#N7l=`T*M%z*FNv(;~;4g0}411?;h326owx9XpoP&$_-t zk`rhu11m5W0D%b1fqQQ-GcZii`(_V3rO^d=E5Q02$w2;`W_EtDFaLnIFz?^Ck%7TW z&=|Pi TqgWbYFWP6Y|n7k#F>QkDl-NpN1o&l2W`9Md>5Uf z$$n-TL;5_s0z6UN7jE`AA_5Mi{RycbUe|w64{Cdj>%{=Uk&&=HJfyDoM*AWghg8{a zoZs|n8M67~>%w8pg@t{n#sC7?1O$>BTRDaN-z!KeMZo`F<&yqC_#!QChit1^TvSw4 zNT|p%#gs6c(QdxpcDmdUBgCwzB`Kc>H7LR3%>*wQM#v&`^OCONInt9jjmT9}j1bnr zL5keEs%%F7)QHVQ--Q{TFu5F?n*zLtOKEB8ySuxvY*KM=_hcPJeqkj`W8 <-aOeFmYx4u z6JRCSbQvSWz+U;&at) zplNQt{xh6lVto7=GV+qwp;-OILHPmfW^zf))(e+EEI2rrM8IxnWaLED?_{l?z{s77 zhsP=CLQCsxJnuCoxhQ4ej7`1q{Yj$N`JSFQAtHF5QdOqs &7(iKSiN*htA2;^FBgUJAt0(vrBpH0$P6$rMkI7Sj&Uu x>*>-?>xpZ${#b(oRp-bM(6GEo*tw=2aC}R zF_#@psi MLoy4uQ#8W 0(hjqU+ #*h`J$oE3KknM4Q7g{BX-rmSCG`8)O@& zveVT?3RX2|?U5+V@8Q0 s+jnqPZUmBSkT3> zVJYyPwjWw!nl>rN5Jt@*>T5tSjK^xvdTrF_M~)<^d-|3Z SQtU z!06syIcwcNB=)T dUW@c6{sWCcV94wk}eoWZ_6*9bmKw{5F z*VtHspTF0$dC&FcGa~W`_-uN5+mK{%_X@b}^K;jR`C->$MkNP_ f!W-}VKx~os0RaJ2rPFp~stwtOzI@Z?KlvrxG zKkXVQ#JvRt7!p@EDT;G)XmC;0rAn-e-S%d(EcK WsOG}U?S#da0;#X_mx3?`zkR)(Xf5JEr5fOFD-zBG{aHDk-zrzic zAtoW2pPMuC+|GN+pwdHeG&J zP0ermqX`Q(t!#P=yFD2UIvWVYQl9AT?Y%!Ue&8dHs6Kb@qDkUvuv>I&de;|8_FA_$ z7u*- !1-Gyv#Wff+>Zg9beMnj0^d(?>>H@>s8bGg?Eb+xmyLJg7%6 {3=yG1R4m5+x9;e(C1okb|}3H*dsQ8ml+;-oe!QlZQL$DvKU|gUbVh!<=|I z_Y8}Rytp}=`ao5YywkZlYt|HYZ`VCKTYLM=j0_N^4WJ^G^>jsk7PIm5d-(lZt?RwW zR9|UJ%lyix*3 CI6re|6D<)=YEJk0_NGdA!SNNW>xa#5lv CbA NU*YP3joy6?H>v$RvDQb8~5lBmTDg% bs+GI!1`}v x(uc+L3&y!@3G7AYG&Jv|JW-Y4ht_TUJrM0zihqX{EdtE;Qe z50_v*H?I6cHg >|i1E}qyf1q&1w>N1Bg z &R zVLJbZB^607c75DO0WhGt5-7-PYim1ih#tXG>Wn8vLG7EoOK{(Zz850aIBX%^G4b){ z!yL6jt;fA2EpCU 3XJU$pKfJivNVV73!l&t`0Y!i1v4+jtw;5_{_vX9D z()Qamz(B>2k0P%#ijIuL&`vT%$A7 EgIh$I%RN6hYOl}Gspy~xa`;aJ>$OEYII+jrLX z_6^N9s4rd^`N+SM4;aq?%%F{z{>evG6;s3{aurNPhH7fjmBu064j>cwB|e)H zudc2FETbSOW~{55v@)R3m_w@wkiyRXzB#tDmDRxR*~aE(4UvuC^+aa%j%&e0)2GVl zVd&t{5QyM5wby08)OB ruRr=jlg3KM9g> zJ|Us)GtbwrU%%`UP1Rs!U|_iax#Hmq+8KZu08o}(wSu!Td1-LinFDg7u8wa-Nt=LV zDWg1m7VG79`9e0sAHAs0tb?WEjk&o!E1y^wg3ruo-vQ7}O#D8=MiPseg@qs;@}szT z2Nd2?GT0v+y4QN%->{PH>Ev_N>zBaL&eps%Ffai6R}I(e@B` flh-x2mo+ zN&LB&Jom?sj^c4>6j6kn-qI6;So V_|OB5Jz=9Q0=5!?1ONfbPR9Y3c49`6ykE ur*`TLpwBe;a3#~ z@?@@xx3nMAl(7FO%?h32if`r)ueUemtJ~Td05d6kPO%NH=7k9p2jdeGdZB)fEsLd@ zA6Bd9_XlrTu#il5y>kKOWg_+(TH>=glD^~(M{ikJT=W60bG`3tRAi*@*`!W2t9;HF zs05liIvfjs?HX$M-{VB_eC9hI MFs3i_V}8{6>QG9Xt#do4XM|8jD3m(sj; zeB&*yZTQHpRMy85iOvY)>^b`R!SXE!-Q;T<8YJA0{P|F4Pt*H_V=sT4^ssXA@R&vH zFflWG7N4E)vxC4gG`zc`c6*KWKDK2EKxJK?O?qqC*vCKmBXklHnaXsc{QMhdp0lY2 zy1JJmB8Qbi>7|A>*C(64D%O J8nD#lY%(dv=^6vfWhGvib0IOVf}`Ke%R7sL!^^a0fwwPX!5#mMMyDj?tHBq z=QLttg+J)2%y1a|qSm|NQ?7x*mh{JdrgT`@*bJqJxPu^i`t+#{f92&(`G@CME{r@p z6Wh+!o7@0^u^DCfYY20TcH#4{c!;yG> Tfzf~r7$9B;u;U!v6V;o}Jp;@I7WP +@#Z+#z*jy_e7#MRtY6C_|c0>lNNg86xi=GadSF`aJdZct}f#pZ0!FMagf^qhNj zwX`gJYD&qOnAXKc;gqUc-?A8$JUxYX)it&18XDZj5}m!hy{$aM#3WOP6H-%KK850e zefv+wta)5VQApUOYoI^-@^JBRZ){Dp?asr)L*ae&S VVV8m8T|z>_M!*;Gnc0JfJuQ&91E09LT#fP(U+O|8`leWD zffCX^-QM~bA5mbc1)XQF26rhAFhVMqj4An7{S2AkA|tEaBmhS$MfF{D8rR6K;U@V7 zbN1Lr@20U6_Y4rACceJnH^-ogf`R{e3r3I>;2{ag$jl`Uz Db58ze0 zgx@_#fzs-()#KZ!hhqu$ca5KpmL>W3{_dXfFW5J_Js5Ek);5b6Nj!LtZ+81!ttWzU zQMW};Yx0o{B@=Z&8cOD|8MaZLxF$dIaX5QXuky5IaC@S_$qJ z$=v>LtB|<({hW0LK&b$YSn7Lu-2f!NU?)Je2CzSv(L}s2kKj?GfJP}SEIhiovswHG z;IQhOH?7w@B>;Zfz(BTw=Sj-Q;8(5z9D; kxEMwV{#q~KwwL4Uzqu_U*0O-YG0*kGxS)k zJV(=nzNe=T!$nhN8ey=^v$I*-b3jA1wzd}dxIUhEf9%?Z_$V9z9T0SY1UEx8l*; @Q4!^4xBn>Yk @omyD%RgA1`mu`TX>>05^Bnlu4)zbxOWoINBpuU!*k& zfM%IN1E7dDorRh5VhDGYMZGUSfu=jTz`@SW&dhw`*=FPT7fjC=f4!n2y13EIR=%~3 z@)r=Xq?rujK6~;RQ~c7OtV86mwFYon>ov%u@Sva|m4fdPR@QcQ2YY+CNLjVDr?*#d zSy|b^1s&X<1jgPDuF(1lSd<1p1Auo(Nl6)>m~b(SlFONz`zkt`>9b-ZEBlk4Tn+^s z?5^?2^l>!pb`XKluaS}a S?bt-888`}V7RJ{b$!JWuf@aN4kk8`#59HztLs`;Xmb%M`#q;+ggxHrM8YY`w9> zLEg+QD0tWqfHgU9Yq+@y?An9lvT;_s^##+$lE-FxS65fw`Jl>C4fgwEx6+~_4?x<0 zvQ=g+qwWnR3JVL1kdP3?H(e&Vml{|~+gn>70Y5kqSqG5SJecoJPk9Z<()I&3ukg+@ z|NQym?BX&!JY2<2aE=`zm&1xnCzBJ1JTy4iatRMl $Ke*FUVYAA+AzEpTQu*D!^WV4?( zmNq^y@uA`2e2JKt*zRwuCHg`2k*Kk{y2JV2ESZR_AZa9Rek21vQTX`9=peM_r@c)? z74}crovfD%v8O$j$v7Cnn^&M{8sGjS0CW`qy?`lD`53&hww5OD(+n7Opk~n3y#6WC zKC%67hrP7t) m2$92B2(hAG`k}uvqhG2LZV^TVrl+{ydYb{+`}zCNDVfr_L{% zq98tiWhiAY|D<1j=$6pbN(TgFYU+3MSzcvX^%FQ8U^+mxY7`{Q7LvHm+BHb{)ispw z78j2U4}&RKdE&nrhdq&nhDJJ6Q7Q3-NYJR!=v8;ZnmM)PZErPeU&9NU7!;BHVfbzK zzPpm8ASu*AC6< Dx@75QB8PNWZCOnI zM%Q|4@g9Y04^Ttjzb7QrU-qRs#%!%dB~zk=Lor=7S(mH)=zo!e*gg`~AQWXiW~eWF zTUPXUTPjXt_m8;s9=)4oD|(oQRZ9L@Wa(T>_g{?NzP$5PEYZI{7mJ`2UtPqgX^*#^ zsK)W-GRsm(?INDrWU?pZfLZwK8H)7{COTN#M4gGqD&8bLuJ%L}rV{zV(A4^>tlu~D zYCp+-Lc$07#%08N1ak(?fs=V^zVRs9#-a@4g8x7u3PMPj|Nj@d)Bj%luDX8Y6gztB zh->r_M0u1afZ#WC9Sjf-0A8aKZQPH4S1OK#se4$uoy2AR^1n|9E&opxW(tA#J$?WZ z?TGUD{Qp u{?W;ZUc7L7F{4ANB*ly_C$y8k zaC0<~{t}&+IImffX}y#q($M{u;$rcFWAJZV6`Xq1Vd3_Hv<0i>*YWMDST&1zj2rX2 z=5*DX<86NNVetpC#gV+(AZL=6p@P{B0X14*He*VlI^ij*JOzMiXR-wF@%fgHqzouh zKs9^8(OT(sVTZ8U4(2bp$sz#-hRt7Vq{%5X2avOnO&&Rgyk^DcD<}~+DGxC?1GWqw z<_lXs{)oz 7jjl(;Crc=u_sxCftNOcqidoOV^6%|#1+sI3jnMt)~KIE7A;CSpo zB&8y3pNOphbjYX=&!T`_#L<39jfJw+Y-b2YOnL?eAOg98DyEK`>Bj+zETE_Q2L_ry ztpp51z3!2bATzpX->zOCf2Lf?$U%wk3C{NWV(K4fo#Gm;Cp4EVkNL{=?2M>7qR zn(38Lq()@YiwYImBj*|E8BR9EWm$*&0BT2edDiI0z*{u&Q99hlz n>F17o~*uGZyjb- zgL+Ov?*+3(eaS`pl&?Q7@p`1mA*tYO!nn!29qM({XmBk?{qW3R5V^`=L;TSxEj!J? z9J2{mSK 1+(&|b`f74J&QIK|GM7u( z?7B-+U~?kKPA&ZteQ3N1t#sf(j0=`1zO2wlZkna8gc!e=Jn|wfzLdM(8gA&Iqc{c? zYXmOzxh4POj$Igl!WgHKu?gCKS)obI?4t&fm?*%-g^e22e)%taWJD!$^?uOriUVkh zdy(W(n-{Q$wtP!_z~%u7jxi53SbIxL(=mV)78Vv>5U|^TqZjWzyhzO_3YEE^ez-P{ zrM+8~xHofk bS;U`*q;F9><;!9|9-yzGh#pQam))*W;TXLn?&>)P;qmgGD!v(1?zsnIuB- zpr3-d9t;J9Vsn$KqDMl769XkHOG4FD_%>jryxe>i=gP^BtYHe&7Kv9~Z`vJG8(Y*$ zS#e*y3-Bid!G%HFWUI{7=CZ2|faRi{Un`>G^;v~qnPtkvwl|>1K|3-f^zrclfUVRl z3jlFX&pBRYo#61*Mu0jGfgrf@X~uI16jQ&uX}`ODdp{BsBp@sfqQ#9TClg6x%|rpE z7(hW|@a79l)+%o>0ob>lX#>HP5(RWB@~DtSS%3~YIgHy&fxW>HFv&UqHGz8xEysi? zVB1Gyyh&|)3q8yg;(r}5rrZ0K4xPq>j967h$hXclUJ6=D@GFd3RGwk8@xbA2jJxbV z$MK-BC#DzmS6CXcY%_SdSP=iZnA&A^ef^a5^!+nWpk7@{JZwII0m=jnYQDbhlqen^ z9<0v+zK~Ba@8$$*TX9LrQ^_B3uFlR$`N;saCuVNCw&?B5!2BLqDq7#y%mQ>$VGI)& z5%B`kvW}6*`q4@^m@R;uS~F_{0|&A1>IFzIUg9?A?b!MK4UhXpx1~iOB>`+{{BS)D z(iYJ0z^9O(mp3+(>Cnvy upBK5R?etzh~c z^>_ol2@Gx3tU5Y6nL 3k%Dv _MG08us(4$DXxYRL*foW@1NNGFo zb)rg!XcK_UfCPKI{zv z8W?yl0MK5`;t2c}z;N)so@~g(HXsU }>=-d@a$c|ot!6(