From c0f5b325abe5287bf05d2e9dcec83ce86352b2fd Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Tue, 5 Apr 2022 00:56:59 +0200 Subject: [PATCH 01/10] Intro --- content/blog/2022-v0.7-released.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 content/blog/2022-v0.7-released.md diff --git a/content/blog/2022-v0.7-released.md b/content/blog/2022-v0.7-released.md new file mode 100644 index 0000000..8c34703 --- /dev/null +++ b/content/blog/2022-v0.7-released.md @@ -0,0 +1,27 @@ ++++ +title="Garage v0.7: a tour of the new features" +date=2022-04-04 ++++ + +*We just published Garage v0.7, our second public beta release. In this post, we do a quick tour of its 2 new features: Kubernetes integration and OpenTelemetry support.* + + + +--- + +Two months ago, we were impressed by the success of our open beta launch at the FOSDEM and on Hacker News: [our intial post](https://garagehq.deuxfleurs.fr/blog/2022-introducing-garage/) lead to more than 40k views in 10 days, going up to 100 views/minute. +Since this event, we continued improving Garage, and 2 months after the initial release, we are happy to announce a new version: v0.7.0. +We would like to thank all the contributors that made this new release possible: Alex, Jill, Max Audron, Maximilien, Quentin, Rune Henrisken, Steam, and trinity-1686a. +This is also for the first time for Garage that we have contributions from outside of our organization: we are very proud and we want to renew our commitment to foster an open community around Garage. + +If you want to test this new version, you have 2 solutions: using our binaries or the ones from your OS. +We ship [statically compiled binaries](https://garagehq.deuxfleurs.fr/download/) for Linux (amd64, i386, aarch64 and armv6) and their associated [Docker containers](https://hub.docker.com/u/dxflrs). +Garage is also packaged by some OS/distributions, we are currently aware of [FreeBSD](https://cgit.freebsd.org/ports/tree/www/garage/Makefile) and [AUR for Arch Linux](https://aur.archlinux.org/packages/garage). +Feel free to [reach us](mailto:garagehq@deuxfleurs.fr) if you are packaging or planning to package Garage, we are willing to adapt our software to make packaging easier and we plan to reference your work in our documentation. +Obviously, this new version includes many bug fixes that are listed in our [changelogs](https://git.deuxfleurs.fr/Deuxfleurs/garage/releases), but also 2 new features: Kubernetes integration and OpenTelemetry support, we review them in the following. + +## Kubernetes integration + +## OpenTelemetry support + +T From 187e4dcbefeb1718433bdac15e19a48f94730680 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Tue, 5 Apr 2022 16:11:22 +0200 Subject: [PATCH 02/10] Add Kubernetes part --- content/blog/2022-v0.7-released.md | 185 ++++++++++++++++++++++++++++- 1 file changed, 180 insertions(+), 5 deletions(-) diff --git a/content/blog/2022-v0.7-released.md b/content/blog/2022-v0.7-released.md index 8c34703..be2939a 100644 --- a/content/blog/2022-v0.7-released.md +++ b/content/blog/2022-v0.7-released.md @@ -1,5 +1,5 @@ +++ -title="Garage v0.7: a tour of the new features" +title="Garage v0.7: Kubernetes and OpenTelemetry" date=2022-04-04 +++ @@ -11,17 +11,192 @@ date=2022-04-04 Two months ago, we were impressed by the success of our open beta launch at the FOSDEM and on Hacker News: [our intial post](https://garagehq.deuxfleurs.fr/blog/2022-introducing-garage/) lead to more than 40k views in 10 days, going up to 100 views/minute. Since this event, we continued improving Garage, and 2 months after the initial release, we are happy to announce a new version: v0.7.0. -We would like to thank all the contributors that made this new release possible: Alex, Jill, Max Audron, Maximilien, Quentin, Rune Henrisken, Steam, and trinity-1686a. -This is also for the first time for Garage that we have contributions from outside of our organization: we are very proud and we want to renew our commitment to foster an open community around Garage. +Before all, we would like to thank all the contributors that made this new release possible: Alex, Jill, Max Audron, Maximilien, Quentin, Rune Henrisken, Steam, and trinity-1686a. +This is also the first time for Garage that we have contributions from the outside: we are very happy as we want to build a community-driven project. If you want to test this new version, you have 2 solutions: using our binaries or the ones from your OS. We ship [statically compiled binaries](https://garagehq.deuxfleurs.fr/download/) for Linux (amd64, i386, aarch64 and armv6) and their associated [Docker containers](https://hub.docker.com/u/dxflrs). Garage is also packaged by some OS/distributions, we are currently aware of [FreeBSD](https://cgit.freebsd.org/ports/tree/www/garage/Makefile) and [AUR for Arch Linux](https://aur.archlinux.org/packages/garage). Feel free to [reach us](mailto:garagehq@deuxfleurs.fr) if you are packaging or planning to package Garage, we are willing to adapt our software to make packaging easier and we plan to reference your work in our documentation. -Obviously, this new version includes many bug fixes that are listed in our [changelogs](https://git.deuxfleurs.fr/Deuxfleurs/garage/releases), but also 2 new features: Kubernetes integration and OpenTelemetry support, we review them in the following. + +Speaking about the changes of this new version, it obviously includes many bug fixes. +We listed them in our [changelogs](https://git.deuxfleurs.fr/Deuxfleurs/garage/releases), take a look, we might have fixed something that annoyed you! +In this blog post, we want to introduce you to another aspect of this new release, its 2 new features: a better Kubernetes integration and support for OpenTelemetry. ## Kubernetes integration +Before Garage v0.7.0, you had to deploy a Consul cluster or spawn a coordinating pod to deploy Garage on Kubernetes. +In this new version, Garage integrates a method to discover other peers by using Kubernetes [Custom Resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) to ease your deployments. +Garage is even able to automatically create the [Custom Resource Definition](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) (CRD) before using it to discover other peers. + +Let's see practically how it works with a minimalistic example (not secured nor suitable for production). +You can run it on [minikube](https://minikube.sigs.k8s.io) if you a more interactive reading. + +Start by creating a [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) containg Garage's configuration (let's name it `config.yaml`): + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: garage-config + namespace: default +data: + garage.toml: |- + metadata_dir = "/mnt/fast" + data_dir = "/mnt/slow" + + replication_mode = "3" + + rpc_bind_addr = "[::]:3901" + rpc_secret = "" + + bootstrap_peers = [] + + kubernetes_namespace = "default" + kubernetes_service_name = "garage-daemon" + kubernetes_skip_crd = false + + [s3_api] + s3_region = "garage" + api_bind_addr = "[::]:3900" + root_domain = ".s3.garage.tld" + + [s3_web] + bind_addr = "[::]:3902" + root_domain = ".web.garage.tld" + index = "index.html" +``` + +The 3 important parameters are `kubernetes_namespace`, `kubernetes_service_name`, and `kubernetes_skip_crd`. +Configure them according to your planned deployment. +The last one controls wether you want to create the CRD manually or allow Garage to create it automatically on boot. +In this example, we keep it to `false`, which means we allow Garage to automatically create the CRD. + +Apply this configuration on your cluster: + +```bash +kubectl apply -f config.yaml +``` + +Allowing Garage to create the CRD is not enough, the process must have enough permissions. +A quick unsecure way to add the permission is to create a [ClusterRoleBinding](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding) to give admin rights to our local user, effectively breaking Kubernetes' security model (we name this file `admin.yml`): + +```yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: garage-admin +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- apiGroup: rbac.authorization.k8s.io + kind: User + name: system:serviceaccount:default:default +``` + +Apply it: + +```bash +kubectl apply -f admin.yaml +``` + +Finally, we create a [StatefulSet](https://kubernetes.io/fr/docs/concepts/workloads/controllers/statefulset/) to run our service (`service.yaml`): + +```yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: garage +spec: + selector: + matchLabels: + app: garage + serviceName: "garage" + replicas: 3 + template: + metadata: + labels: + app: garage + spec: + terminationGracePeriodSeconds: 10 + containers: + - name: garage + image: dxflrs/amd64_garage:v0.7.0 + ports: + - containerPort: 3900 + name: s3-api + - containerPort: 3902 + name: web-api + volumeMounts: + - name: fast + mountPath: /mnt/fast + - name: slow + mountPath: /mnt/slow + - name: etc + mountPath: /etc/garage.toml + subPath: garage.toml + volumes: + - name: etc + configMap: + name: garage-config + volumeClaimTemplates: + - metadata: + name: fast + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 100Mi + - metadata: + name: slow + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 100Mi +``` + +Garage is a stateful program, so it needs a stable place to store its data and metadata. +This feature is provided by Kubernetes' [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) that can be used only from a [StatefulSet](https://kubernetes.io/fr/docs/concepts/workloads/controllers/statefulset/), hence the choice of this K8S object to deploy our service. + +Kubernetes has many "drivers" for Persistent Volumes, for production uses we recommend **only** the `local` driver. +Using other drivers may lead to huge performance issues or data corruption, probably both in practice. + +In the example, we are claiming 2 volumes of 100MB. +We use 2 volumes instead of 1 because Garage separates its metadata from its data. +By having 2 volumes, you can reserve a smaller capacity on a SSD for the metadata and a larger capacity on a regular HDD for the data. +Do not forget to change the reserved capacity, 100MB is only suitable for testing. + +*Note how we are mounting our ConfigMap: we need to set the `subpath` property to mount only the `garage.toml` file and not the whole `/etc` folder that would prevent K8S from writing its own files +in `/etc` and fail the pod.* + +You can apply this file with: + +```bash +kubectl apply -f service.yaml +``` + +Now, you are ready to interact with your cluster, each instance must have discovered the other ones: + +```bash +kubectl exec -it garage-0 --container garage -- /garage status +# ==== HEALTHY NODES ==== +# ID Hostname Address Tags Zone Capacity +# e6284331c321a23c garage-0 172.17.0.5:3901 NO ROLE ASSIGNED +# 570ff9b0ed3648a7 garage-2 [::ffff:172.17.0.7]:3901 NO ROLE ASSIGNED +# e1990a2069429428 garage-1 [::ffff:172.17.0.6]:3901 NO ROLE ASSIGNED +``` + +Of course, to have a full deployment, you will probably want to deploy a [Service](https://kubernetes.io/docs/concepts/services-networking/service/) in front of your cluster and/or a reverse proxy. + +If Kubernetes is not your thing, know that we are running Garage on a Nomad+Consul cluster. +We have not documented it yet but you can get a look at [our Nomad service](https://git.deuxfleurs.fr/Deuxfleurs/infrastructure/src/commit/1e5e4af35c073d04698bb10dd4ad1330d6c62a0d/app/garage/deploy/garage.hcl). + ## OpenTelemetry support -T +## And next? + +roadmap: k2v, allocation simulator, s3 compatibility, community feedback, whitepaper + From 6df348b2a3e5d2377a8167aa15ff79a7fbec0206 Mon Sep 17 00:00:00 2001 From: Maximilien Date: Wed, 6 Apr 2022 10:28:13 +0200 Subject: [PATCH 03/10] Reword top half --- content/blog/2022-v0.7-released.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/content/blog/2022-v0.7-released.md b/content/blog/2022-v0.7-released.md index be2939a..e1795d9 100644 --- a/content/blog/2022-v0.7-released.md +++ b/content/blog/2022-v0.7-released.md @@ -9,25 +9,26 @@ date=2022-04-04 --- -Two months ago, we were impressed by the success of our open beta launch at the FOSDEM and on Hacker News: [our intial post](https://garagehq.deuxfleurs.fr/blog/2022-introducing-garage/) lead to more than 40k views in 10 days, going up to 100 views/minute. -Since this event, we continued improving Garage, and 2 months after the initial release, we are happy to announce a new version: v0.7.0. -Before all, we would like to thank all the contributors that made this new release possible: Alex, Jill, Max Audron, Maximilien, Quentin, Rune Henrisken, Steam, and trinity-1686a. -This is also the first time for Garage that we have contributions from the outside: we are very happy as we want to build a community-driven project. +Two months ago, we were impressed by the success of our open beta launch at FOSDEM and on Hacker News: [our intial post](https://garagehq.deuxfleurs.fr/blog/2022-introducing-garage/) lead to more than 40k views in 10 days, going up to 100 views/minute. +Since this event, we continued to improve Garage, and - 2 months after the initial release - we are happy to announce version 0.7.0. -If you want to test this new version, you have 2 solutions: using our binaries or the ones from your OS. -We ship [statically compiled binaries](https://garagehq.deuxfleurs.fr/download/) for Linux (amd64, i386, aarch64 and armv6) and their associated [Docker containers](https://hub.docker.com/u/dxflrs). -Garage is also packaged by some OS/distributions, we are currently aware of [FreeBSD](https://cgit.freebsd.org/ports/tree/www/garage/Makefile) and [AUR for Arch Linux](https://aur.archlinux.org/packages/garage). -Feel free to [reach us](mailto:garagehq@deuxfleurs.fr) if you are packaging or planning to package Garage, we are willing to adapt our software to make packaging easier and we plan to reference your work in our documentation. +But first, we would like to thank the contributors that made this new release possible: Alex, Jill, Max Audron, Maximilien, Quentin, Rune Henrisken, Steam, and trinity-1686a. +This is also our first time welcoming contributors external to the core team, and as we wish for Garage to be a community-driven project, we encourage it. + +As a noverlty as well, you can get this release using our binaries or the package provided by your distribution. +We ship [statically compiled binaries](https://garagehq.deuxfleurs.fr/download/) for most Linux architectures (amd64, i386, aarch64 and armv6) and associated [Docker containers](https://hub.docker.com/u/dxflrs). +Garage now is also packaged by third parties on some OS/distributions. We are currently aware of [FreeBSD](https://cgit.freebsd.org/ports/tree/www/garage/Makefile) and [AUR for Arch Linux](https://aur.archlinux.org/packages/garage). +Feel free to [reach us](mailto:garagehq@deuxfleurs.fr) if you are packaging (or planning to package) Garage, we welcome maintainers and will upstream specific patches if that can help. If you already did package garage, tell us and we'll add it to the documentation. Speaking about the changes of this new version, it obviously includes many bug fixes. We listed them in our [changelogs](https://git.deuxfleurs.fr/Deuxfleurs/garage/releases), take a look, we might have fixed something that annoyed you! -In this blog post, we want to introduce you to another aspect of this new release, its 2 new features: a better Kubernetes integration and support for OpenTelemetry. +Besides bugfixes, there is two new features: a better Kubernetes integration and support for OpenTelemetry. ## Kubernetes integration -Before Garage v0.7.0, you had to deploy a Consul cluster or spawn a coordinating pod to deploy Garage on Kubernetes. -In this new version, Garage integrates a method to discover other peers by using Kubernetes [Custom Resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) to ease your deployments. -Garage is even able to automatically create the [Custom Resource Definition](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) (CRD) before using it to discover other peers. +Before Garage v0.7.0, you had to deploy a Consul cluster or spawn a "coordinating" pod to deploy Garage on Kubernetes. +In this new version, Garage integrates a method to discover other peers by using Kubernetes [Custom Resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) to simplify cluster discovery. +Garage can self-apply the [Custom Resource Definition](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) (CRD) to your cluster, or you can manage it manually. Let's see practically how it works with a minimalistic example (not secured nor suitable for production). You can run it on [minikube](https://minikube.sigs.k8s.io) if you a more interactive reading. @@ -69,7 +70,7 @@ data: The 3 important parameters are `kubernetes_namespace`, `kubernetes_service_name`, and `kubernetes_skip_crd`. Configure them according to your planned deployment. -The last one controls wether you want to create the CRD manually or allow Garage to create it automatically on boot. +The last one controls wether you want to create the CRD manually or allow Garage to create it automatically on startup. In this example, we keep it to `false`, which means we allow Garage to automatically create the CRD. Apply this configuration on your cluster: From 3eb41b73e4297161de89fecdcc43d6c33c1836ee Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Wed, 6 Apr 2022 16:23:13 +0200 Subject: [PATCH 04/10] OpenTelemetry part --- content/blog/2022-v0.7-released.md | 69 +++++++++++++++++++++++++++-- static/images/blog/api_rate.png | Bin 0 -> 29088 bytes static/images/blog/apm.png | Bin 0 -> 119992 bytes static/images/blog/writes.png | Bin 0 -> 17930 bytes 4 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 static/images/blog/api_rate.png create mode 100644 static/images/blog/apm.png create mode 100644 static/images/blog/writes.png diff --git a/content/blog/2022-v0.7-released.md b/content/blog/2022-v0.7-released.md index e1795d9..5fe3010 100644 --- a/content/blog/2022-v0.7-released.md +++ b/content/blog/2022-v0.7-released.md @@ -13,9 +13,9 @@ Two months ago, we were impressed by the success of our open beta launch at FOSD Since this event, we continued to improve Garage, and - 2 months after the initial release - we are happy to announce version 0.7.0. But first, we would like to thank the contributors that made this new release possible: Alex, Jill, Max Audron, Maximilien, Quentin, Rune Henrisken, Steam, and trinity-1686a. -This is also our first time welcoming contributors external to the core team, and as we wish for Garage to be a community-driven project, we encourage it. +This is also our first time welcoming contributors external to the core team, and as we wish for Garage to be a community-driven project, we encourage it! -As a noverlty as well, you can get this release using our binaries or the package provided by your distribution. +You can get this release using our binaries or the package provided by your distribution. We ship [statically compiled binaries](https://garagehq.deuxfleurs.fr/download/) for most Linux architectures (amd64, i386, aarch64 and armv6) and associated [Docker containers](https://hub.docker.com/u/dxflrs). Garage now is also packaged by third parties on some OS/distributions. We are currently aware of [FreeBSD](https://cgit.freebsd.org/ports/tree/www/garage/Makefile) and [AUR for Arch Linux](https://aur.archlinux.org/packages/garage). Feel free to [reach us](mailto:garagehq@deuxfleurs.fr) if you are packaging (or planning to package) Garage, we welcome maintainers and will upstream specific patches if that can help. If you already did package garage, tell us and we'll add it to the documentation. @@ -31,9 +31,9 @@ In this new version, Garage integrates a method to discover other peers by using Garage can self-apply the [Custom Resource Definition](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) (CRD) to your cluster, or you can manage it manually. Let's see practically how it works with a minimalistic example (not secured nor suitable for production). -You can run it on [minikube](https://minikube.sigs.k8s.io) if you a more interactive reading. +You can run it on [minikube](https://minikube.sigs.k8s.io) if you want a more interactive reading. -Start by creating a [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) containg Garage's configuration (let's name it `config.yaml`): +Start by creating a [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) containing Garage's configuration (let's name it `config.yaml`): ```yaml apiVersion: v1 @@ -197,6 +197,67 @@ We have not documented it yet but you can get a look at [our Nomad service](http ## OpenTelemetry support +[OpenTelemetry](https://opentelemetry.io/) standardizes how software generate and collect system telemetry, namely metrics, logs and traces. +By implementing this standard in Garage, we hope that it will help you to better monitor, manage and tune your cluster. +Note that to fully leverage this feature, you must be already familiar with monitoring stacks like [Prometheus](https://prometheus.io/)+[Grafana](https://grafana.com/) or [ElasticSearch](https://www.elastic.co/elasticsearch/)+[Kibana](https://www.elastic.co/kibana/). + +To activate OpenTelemetry on Garage, you must add to your configuration file the following entries (supposing that your collector is also on localhost): + +```toml +[admin] +api_bind_addr = "127.0.0.1:3903" +trace_sink = "http://localhost:4317" +``` + +We provide [some files](https://git.deuxfleurs.fr/Deuxfleurs/garage/src/branch/main/script/telemetry) to help you quickly bootstrap a testing monitoring stack. +It includes a docker-compose file and a pre-configured Grafana dashboard. +You can use them if you want to reproduce the following examples. + +Now that your telemetry data is collected and stored, you can visualize it. + +Grafana is particularly adapted to understand how your cluster is performing from a "bird's eye view". +For example, the following graph shows S3 API calls sent to your node per time-unit, +you can use it to better understand how your users are interacting with your cluster. + +![A screenshot of a plot made by Grafana depicting the number of requests per time units grouped by endpoints](/images/blog/api_rate.png) + +Thanks to this graph, we know that starting at 14:55, an important upload has been started. +This upload is made of many small files, as we see many PutObject calls that are often used for small files. +It also has some large objects, as we observe some Multipart Uploads requests. +Conversely, at this time, no read are done as the corresponding read enpoints (ListBuckets, ListObjectsv2, etc.) receive 0 request per time unit. + + +Garage also collects metrics from lower level parts of the system. +You can use them to better understand how Garage is interacting with your OS and your hardware. + +![A screenshot of a plot made by Grafana depicting the write speed (in MB/s) during time.](/images/blog/writes.png) + +This plot has been captured at the same moment than the previous one. +We do not see a correlation between the writes and the API requests for the full upload but only for its beginning. +However, it maps well to Multipart Uploads requests: this is expected because small files will be throttled by other parts of the system, while large files will be able to saturate the writes of your disk. + +This simple example, done on a test cluster, covers only 2 metrics over the 20+ ones that we already defined but we were still able to precisely describe our cluster usage and identifies where bottlenecks could be. +We are confident that cleverly using these metrics on a production cluster will give you many more valuable insights on your cluster. + +While metrics are good to have a large, general overview of your system, they are however not adapted to dig and pinpoint a specific performance problem on a specific code path. +Thankfully, we also have a solution for this problem: traces. + +Using [Application Performance Monitoring](https://www.elastic.co/observability/application-performance-monitoring) (APM) in conjunction with Kibana, +we get the following visualization: + +![A screenshot of APM depicting the trace of a PutObject call](/images/blog/apm.png) + +On the top of the screenshot, we see the latency distribution of all PutObject requests. +We learn that the selected request took ~1ms to execute, while 95% of all requests took less than 80ms to run. +Having some dispersion between requests is expected as Garage does not run on a strong real-time system, but in this case, you must also consider that +a request duration is impacted by the size of the object that is sent (a 10B object will be quicker to process than a 10MB one). + +Below, you can select the request you want to inspect, and then see its stacktrace. +You can break down these lines in 4 parts: fetching the API key to check authentication (`key get`), fetching the bucket identifier from its name (`bucket_alias get`), fetching the bucket configuration to check authorizations (`bucket_v2 get`), and finally inserting the object in the storage (`object insert`). + +With this example, we demonstrated that we can inspect Garage internals to find slow requests, then see which codepath has been taken by a request, to finally identify which part of the code took time. + + ## And next? roadmap: k2v, allocation simulator, s3 compatibility, community feedback, whitepaper diff --git a/static/images/blog/api_rate.png b/static/images/blog/api_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1534d12380d6b009351d479bbd146272618d66 GIT binary patch literal 29088 zcmdSBWmFwO+bu{83GP7xIaqKA8k|6I3-0dj?%@!E2X~i)ySux)6WrZ>8uESb$X&D6 zowBrq4@n`!_qgw&pr8;%gulx`LA{BFf_kM4`x-c6Cj40& z_<+_C6Z#JI^!zWi5fT9f^$AMk`!_kK#QjA_URlLunB#~Al0Wp|w|W8aDEQ<`pG_9+ zIinN`)#unL=M(}9$L#u|Srt%8q^L6%&Fy~Fw<*n(gQek2HFuu*c;&ZTA;^89} z0HZMUUY%h#{#uWTOmMS3JW6c0+HgeydH@Br*UIGh>gBg!A6WS3UlgEGv7SE*5QwOs zKb3I4D?NXfF#Ilg{?yV}noGgQ|9DV)30wJc0LLizy9y~9*Awz2>Qw7!Sf@eYZr!`* zue_9J=50UXe@u}oozyM5RCCRh(>cw1{su}zm@;a{_8^64$n6m3G7gk zQ;sq!CT94O(3AV*YV^qSddiLT4U|_h{d;(*L2n_kVI=QX1n3OUC-2Hfij$=z_vXj@ z`PRnH&Q8l_ww=Z5&k1SVNrh@Bla_a(+gJ6L60uI_R%Z28kH2W(pjuvo+FtY8jx;~< zR;oO#8+$x?_?SG%>gcpJJ=9-%Q;9+%}jqT$@xXc`y~$R_R^@-_Z3tu8ZI1E zD%*z<&k-NL-08KVCLZH>2xNL3B9+{XC^3F@xM)0HR|tW`1Z3|uq;S>iCUXwPh?0Ed zaKK^J#t7{Wyw_4l;eODQ*_kwraS*hO=+{Sp);)C{7iwTop^PHnwlV5k?|Jj(&SSRR z_9Pv1vE8MK+v6>WB!|Ddc-nlfY0a-)21BN?tadyGR;9jh!yB*s&3&bwmUZhGyDYI^$;&OF-aM6-V>crc*fPtd_ z;+6mdmA|!iFke*oRJj*ZtllgRi!;)E$y*Q|7)S-mY)EfNc7;dUU0>gKW4|N;tv5ea zb2eB$wfpJPs&R6dtjAuFNsxjOa5&u-W>{@)%0db5Y>)r00Au=ix|B$N@*pz4YN-}@ z^H7cC{q0G;Cb3luY`4R5w>B&zE6d{EoZP8Hr+!bmEPs4)E3Z5o#}K#QKPhHQxG_KmTvag@#$tDizC+UmR9#UPkTF?)6>(m*a69p_2)a|bj&naWo2!n zqdNju(J3icHx09*Q4B53{L@9+_370gIjq4bt1ByPdLvXk2Qv(A+c}ihlVcn3nKH&| z_mhMyM+Fd;fOHK!Mq2L2xe#?#IFL=P*=ETor$?Xn?^DK1Dq~`#P9HKAe+8Rt?8V$&hiz(V z;xRr}epzGYG1S+0tJgMvxFVyblg*0+|8X#%N9W5H4@qQTlesHaqa7aar=p_br;I}5 z!w}VfxSA@B#7#+;LL zUax$v4g;s|-A=}8sTAq*jO4$yjwdEk-@a2X8J0z72CZ*#afFAXSHf)A;7E*{RH{th zPMGlZMCD^6KiLbrQnOx3>+5&=5lVezvN8&daS`%3KDjQnbU)n*>g#*2e#p>p%8z+tNs&j>ScO#=^ed(caNfkt~^wt*uJa`Q-LeV68jghg@Ew`GY%ktiR&d zsts+NFu}mTPZ7-;Qz%qfZcZss$j3qW<$2fA*B5|VeBV9aZ)kWvmC^l(&uKJcX!}@f zD!jcxg*^eL$1^E9z(o^PJ7EV1;S)dzB^D2N$kf!- zUmfmCE`=eI>RtDSX5%qJ5)xvyu2+}8S28Hb0F>o0o9PJ;Uwxvzxu3{gOBq(LaGTwo zueL1@fksMVy=tzl4gG~cP{bxYZZ~k$Ea_%=8q+_$Sc5suRbc4X^7krR zT&sLmS2Lw$!v_6m5og2`MPi(dO&R=WYz&PyhV`a#$1{cd5g7Xk0EKs1g*VFo5ZlygXs(q>gH?^O=#m zI@O6Uio{aunKj+55AWlSn;w>(?;aphDQ1r=s(d}ZVur~03)4mBcZ!>y00f)$X|aWRyI|1uaEg!)EQo+08T_YT zk#<3>ZhkFm>GAQ^KWNdaIpu-{y}pVj3X|jlh&nZEHs`Y1$JKLIcDe2?@HeZF&{lYQ zn+nVqfZu?h|DE3f!U29-Y|?-j06+0>{;x#;-{ktK?OC;WMSTPRzhvkCKQyq<$Vo7~ zKnkTqmBVSflwg@KC+I5c2#=yxT0cwXv=@9F)jx+qM5xs3Z)#Qh%ygq!FDM{vB4D0u%fP zwK(Y1bkgN^K;*UeT^;i>>5^DazbpPttKaNwT)!eUfF8>YwShdbU!=2SaPE`=`RDcR z{IDR?m<;qi%it1GI=&v?%LI`X&B?{-BZtRVMn?54ndD}tsqSte+l44Pr^p0ZX;489 zih_SWEJ!kjzZi_>`NX`&mNw&5eVk`1sTIP`tkW z{+puLX(e)J#rj!UZm&}MH>_(p(@OSdzcqcL;uwdO0#+#$g5{wLgk`BOwQ5(DV!tzC zQ~)YE9d*2RuEK)VM6P4$VHAuKkghYF%#Kp-coQJNN$Y5^{uzwI;>SO3G8imh5k9zC zGKGkc`#vG?30sSlCbX#AzVUA1 z;v$wHLRIw7UwC_XBXtU(mbdCGPZG2WCqd{|Oa3ErWjy@{XeSkym9ux7E=EwMe&aB_ zmRKIQ*LD4*rvVk+OG)#Py4w1!5?I71ki*{G zL)IY|hvP28b%YJ7Zrne~|qpYZ;ytoi({<$RecS%kpR zQgTv+2<&XB?H)w>?CQ}5(2!aebNZB+Q)|GWmEbP=L{%S_!-9Hu3M3DrewS#0J`}kD z1Jlx&B`l|Xs53AyxHuTz4D&{b;TfvRkH@!)gY{F29VPqImOheRSZ1j-O|~vzdJkIL z+0jx^7TBZU4FCwvyNF+7vK(!vf+PSdGL*_**_|aX=+RgDQCYS zZu^anwXS=o4N*mQ%d;g)URJqaDs+OILzv4HUydiXFo*gBNp{P zbexc=$M+UQbAfBodBJ_&k3Z)r%1_C2?`Na=d*kFFRYoLGfzL7w3d$Z9US>&Bf0{Eq zv2`~{TB!u#Uw8aQv;^87Jk9k!MKIc=$UJ&{`2FsT|D{LlVEZ3SlKG9;ilStbr5~Yn zTJK-LH?=Cdh{-R*LydQm-Gk0&@*N(&*SmiYG1vAp#oXkFtPM20tDQILe-1`gA59+; zeFA6dm9P`F{rvB<`Fx__a_zq>l}1Yc5U;%W7VwVo->p5<$j53MR}X#Iap7P=R}8td z2c_h%VsT!=aW7`{hX_=8crQ941{MA4C5e8_8rrC+2p?BYx(C?T;MdDDKb@v;z%t1& zr=$ZIGl{0{3AS3 z`QE<1VoMo-M?j#Yrk*)n`xSZD+vUy&%)Hc?kx!j*UqcS7r9>g@)rv_?77YPV8aXS{ z|HV}%2h*AjjK*df8ixZo<#3?Fhq;EcsZ7%T&Ee}~F3%?<{$CAzusA1u@Aq9W;IM#M>*sMqICJ374usqZWFwx3o1MW%>zZgS2B0QvJ-vPu)q#YH= zQuby}+T-GOD5FmAJIlGbxxs%*N(ih^rq50Z0j!iv;(nC50<>Sr2*GEmkJy2owY6;3 z7Tu1>h1^c-+ee~Nr>j|K;sHC;d6lIpXuv&~qGJ*QP);*zP>Cga<6=kO8H`(j8-YA8 z*?lxVh2x#0sA!!Kz`O6k8~X7+`ubUJO{ur3B^9??#uS<@TQ<&Wv{K~Mt`2|b=+9+= z_Pny+!&|5kQ-dRdwM|8bT6Rmc2He~dhFPmNL&6$PY{0b&7*Zx5gF?WBfC-T9iwlcEve-(mtfQ2uu@WAw@j^;41ZZNbNoXH;mm#61$V&}4S5pZQ_xCC> z7}&^o?57JiwqKCqs0LphNKFJ46bz_b(P1TQ z#ZBkdk22ovjOUlHUb;sU=&MPkZZ&^qaedJ8!3`-{taI?pbsZi`sta;=|GC+- zTiI{9*i?GAmGW4vSDBQw2xN7V$(*9F{#>qk=BiKTst)~nW!sDM<+coPAPxtM2PTup zB~2tuOw0m}dhu}^V3eSuiK&&WIkHC8--7?NF_3{Wv#1JhUbX1`k3@vHO#JHH=Y=V) zZp}1RO1EMkd{uA7YnQ4rb(Z1o&RD;w;{|n&j@D-8luUhdGXzkr#6Im?AGm9HV@z1o z(EhTURDquP1xgY&k06xP+6rVBzSo6~>2;kBUKMzqqGbfpzaF4nOFy(G*5f zD+rlcL1q7Zxlv#p43#C05!>tFOgn|o)QIr^b=-EJZMTX$?=J3FPzjq9xp(=TzaNge z*86|G?)G}d{qWA+86*IhG5!TAHqwuI5Ace^UeMn@vGRkFQ=OCjHpB@cA)qpro1XURU)vUOm3X}dxh`={@>Sdh~b|X zwm$3(JwKB7OV?F{DgbF=1D%gfME!yAzfV&j`(P*Q6Mv{*QunFt=gGgJMe&9|Fe)B$ z7RA|llw~MoqK^G3so4hbg~tkAGlSXskPN`H%av2DvY5DUFz=2A%xxkt`MOO&-cW})be2pW#(Opp zI6XH0QjshoS7x;jKqN1m0revc+)TTY&ycl!EK3Kbr8ij{KMvfCS+W#z=riDh1cqVv z{#TQmfy=F-E%DHyFO(3H8>5+ut1Imt*iF7;C%SKa@cI zcZ#!%qpi=dGti?PdS*koq1R0C1$46Xk*_BhZ~7N9q5I9Q0Jr8yqiZO@eM~Uj4eW=I zB-OUN%g-i)3JM2;N~JTL!wr(10-c+*uUb@|U5o@{$&|2_Q*_0z+0F$V#vO`3Y(PUx zZ$sZzi44Q4l2I?#I6nZ(LQPFg7BIvuG^G9~xg(3ull3{4L9j7N4LXML-J(OOZ9k9w zkp(-R3r>7*4`~F_fy`0Yz~a#2gW&5C$Or1^{( zsGxVxaF}|-ctTDMB4P7cgv)RLIr;)bOt#s>#o#}wRRQm0Ndy;rvCQI7S+{@|pv1Ip zX@4?HrysVyk2h#y6X%0fuIT;ELE&ZI1~~Unyo`po(lbj*QA~p*;GBtpCeZfpckM4Q zZ8S76CSXMsmHvSV1lAdo46$1-G75P2=D)raUl!nnjjLbUsUBar=QDX)USQp16AD3p zDk&NBkxHmRFzOnC2he{cF&H66sL+<-VQp&PGpV7Xb7ZM3_M(kvXwLHte)znT_smBc zaQD0n`l;35+Oyj(7Cm7!De+kx(Yc%d8Cclxn*4XiDxf<*LJ4)9-elLFA5ezgsC+>4 zGS*1tc_t6wY8yfA%I`Xx_lS~IRqV7$AQe`~SePHQ^2m$)<~`H%zLBRo0h!)!(JCI< z&>o@;;nT4=vT3=$0Dk;uu{|QErIfAxwx!Lpn)R`wv9!j~Pw>Gn+1v=H@+rBQ#PWR` z9?!J?{wL@2fK!L2J|M1V^S(22Si61#&jrJHkZEr*?z^mkPz8>QgS@ZT_5$!Qm=cW3 z_}QO;vosJgp6iT*e>NOZIgfVL9rQ`jImUm|{_6l}57&1xua@y(qrOG~f$oJmM;4Tf zJxHIH;vCxO#gBhtw_V`@&$`)#TMt`N@lYJd%EA3r4ebMn-jYiz?zzeb1zd4NZbsvc z`V+=aY(V{;64Af#WX-NCB4#S(0Q3Tkdb!Rd5No~w->nx)VWJu|!%zUSBa;^&)QCG? z-(!+Dz&HM1&q6n+1%9B*P#gU_nQ+kQ58AZpg{&I4|51Sk*{y|Z_g~2_CnO+byk-W^x18$Q!O+fd+}{H-p_po95W-;Cl!y6}v*}p4 z{+XfMb#k+(ABbNA1P*f2kJQYc8aI?wsnS_-jmW;azDDCC;<={h;5b|K*G2ByPhxfa zA|T!6$^bOa(w}{r4=qzbGfvUw@zr#cT>zYV}&Zp8_GL&ADTisPoB~Gg;@k>ExX7FkpPOM9)fMf0Ga{Wf6nG zs%mIx?7=R}f1;)vzgJUG=-YzNLw+xoj~pF+`p%6urhDTQ+*W1?bMv|#FgZXDdCwzN`Z&J;DlfBKQbJsFak=auPf(=UM2%Ry~s7nA_ zH;a0H{m$>uDV;eF%{K%$Ix`*?vVOj~sidW#C19~zuRVjn{ZDyfag~Rn)GWh{#j@7Y zrL|&EB?@2Nq0Xl|#)ZZOwEDOH7DOe=m)E-UN5&k@^=|Cm92pEQ|J6H8Z>c#CDgma1 zn47d+0}Bg_ zW;aySyt01*c2gafN&%MjYvPfCGr9w}s4trG11f8F7qs&WmAtb5;S|efi&SBtYnsR@ zY@oZKr1~aot%I>!RkWPw1J;YQ#N@~R#zjVF-nte}h@}u;k3!G+BEhMCNzdH6pTQqp z*(QqBi*j98)SABHf3aUm6ncv5zS=HY+^fX^@SWDEzghGS;l)j9QArEr6#`)IQTAFF zrk5uHJT+tR`bE2|Xk%1KbE_PXME}{w+}NajivaavYD6G4CEsxtfc*QCALnzQ_Kbqn|0%genTt(&IGKXznBuxT71NiCCa2pG!FQdKOr6Oipd$WqbOecLK=na9t;nmXeqN37;+zqIr-l6|1I%KTDxT$w$mKF>p>oik*~3JmR?CpvAXPj=v{|3KG(j3gI7z&nr@QRP-q<( zg7EoZz~!2i%NZHJz;!|I!i6LkJJk#ZG0PHCOjLs8_*0!pw9)+!;{hDkaqLuMC&Yu) z8RuBM51^c_=u+!MP~-aV65MUycTi5Cf=*bhp2@f>-7xN>TB2s$kxQO^NHZ;S>zhe8 z#oXCrb}d|1Cvf-!#WpG1YP1p#|~H#?3=w^TN&)gTy$oWq9T;SF?jRCnKi zF47J~XfW%l1uFBhyx>(#QgbiR%3NxY8kRs9%TnIHTc4AF3VaY?7)~HY7_=}5G*EN6 zy+WNju6k;H_-pSkO_;t}FY5anr*cT->ORk!C7G)Rvha0M`FU%P7kdyw%$d48h7TF| zhxqNOx?1_`z>y)v-tx~PJJ&u;4f9vCfcvCHtdZLsC2G7ZPrEP$$+{5dG$bdY2E7F) zYHBnv@-S0Tp|CNCDLc2oFe<-e+=83Zc`Jtc<%h?018T9|d`-&ZUrE+Y-u-ON+6{R* z4^ZWkWs%1bC2Pd2x4GO9Qbnt2Ir}v(4AhUo@nDUwm3{reQw|X0TTMcI+AogAP?JQ^ zeM`#QW`~sVg)>e=_g9_f?vcvQf^foO#Q6rr_H{N85wZ7)!G_3(xz}fjg{%=;7+6qV zD12BFh3q8?PNxBj;2Rnfdq`4E8xBqgm7|sioxRLDHp5vUeN^}FplYVpzsWYWiK89& zqOfe}-8ggbN5a6&*E%B$4deW(7OpvfPao{LD*7?TNJ^s=50#eDT^p)Wizo)JBe9fl zPV8`1@0#jDEL+jNbTMt`%9drx!V0;87*GRVh%-D;zqIMp`y!-v~t`FI2m%0JYkF=i2(hW{T%4X~u?T<4aofCx?D@3;fY(-T!qF ztuFajSP#J#d+gr)$%n%|5#$Q@)$9Ut6fiA_rv*5tEFoN(kisMDXHCZPt)4gpg7>g^ z-zPBMk?(MvKE=k>jOv^uJ}%}p*pf<6j2QmpjAV)$+jGf(361|-ojt>(Q^99Lkx$qx zaq&-b)sonAJA)|(Lik6~d8~dSkB?~uLu{%SjIHEmgG6CEX;?)`b(%T%=k|8bt?<;0 zcjJ<^L03xudP|O+SjF1YXp8|DCnXvSdd1SX@g6`{CQoL^4hkyBZesc5CtZk=88q|- zy&Se#O3$C)mN1vMsbb?tdCuqx48tAPUC7M59IfFyt8`T-@g6*t9bMMHW-bX}fRP!w zpIkr{I&!ZHS`^dzLzGs_(4+F!orr%95$MX+4f5#$*GGz~SJ2Aprg}9EHHp^5v&SDl z8Lk~bUzP1>yna|F1*$Y-&C9%l!@U$D@K}PSO8aqP<+taDpCfva2c(fFP2s zY8{Q)2PIvB_2DtT`M}d^tMT&`N1F%JH@CkP?$&XoMNZvaw!hBh_8=MK zEAFi!OXH(MoQ>)J{2j;npv9(PGBEhvUb$NoV`%bion5;|yJM?KQt%c+)rvjbd1%Q$ zJ7d0aui6(ry3%O$CrXD93HOp~QqbW7)QO=JjV`zIZPUvD`TS8K{3-3dldC_3%zyAj+>&>*F(8NU$ z;3{_}bJ>3~I6B1)bW%GU=#hd2nIZXQ=W7aK7V4F=nX&kx$UOV&t?>>}gM9#PMadY1 z{QB6Lp?vm}oX`C06Z*NBOOUInmlSA3h}*~NDCVa)Uk2KL8nxz>qh z&6U}&9e@+!lyT-A%;4bnzQIcOY+%T{`~AmfS)ctzCYx1J6Uqu@6rgz9L%X>8-EGO^ z#Gw1t_%+^^yu+TBvTN6eyg=S|;l{Va*v`B0NgsuRxk%D>`i-SnHMaY+X5~UMgmUwwXJySLPI$HL$DcemzSW3nF^|2uf8BrM z5^i0by3^wi*~OHp+J{tG9R8|p$3yOMJR5Jaa%3D>MCH>^Tc37S&xkQ-ysfQ%MF>y* zgDZu*kwY1)ad+Vo&)kHjEm!^N@*?A|h28CVeI-w>`NB>8 z`cro1lifsCx+r9VDP5{FLdT+Mr2mH{$3;zqNO3}h#?zCUF1n(Br%ve(q2e$sRfGso z>T*epxg-C4ckvqz*o}w6XR%Pj;=uSj=#^Yd`g6+dVe!uEA@(wgUB0d1+8N1Cy$ zjKOpu45Ymr6s}lIuhJ7tdVbHOE;R#UF^A8qO0sJYGIifcNctW0$v|6 z4$+o60IVXe*Jp^=`x+O!2V&0efqY1d7QT4Ds z+5Eg&wv-Sb7W~Pez4NbzUgkJ_w6w$xSa~Gij%2QjW9_*rn)(Ke$<>qX zyz9DJu~i($r%O^FYL&vnZC-o!+iDi?*UU_|e;0C8SK^oTrjQQU#n?_r7$e zDuf+a0yAXu+BpA1O&$?2F6wM;vqIgd_BrCDG^}n55=mXIe+Lv%t;Gupd+CT|UI#nV zAb1QTBgMQG{E&T-(@Jy)CO2pTd3gG-q`Xu5jqQFLghP&pLiu#B`kCu+ytiHZ?|sZ; zyz954Jf_0Z43ULr(hA*U9{*NNhwaY#MD=fNwMQ6$`s=d$d49!Bz+~wd+(* z)QUuJ@%nOmDL|$~O&@3W-XttVINT8~?C9btshjqm=h0OqxVXkZItRvV47wdy9Ha06 z8FC0^fYb z#aT^fkz(lX(gc_%?me?{(-CR~lv{-#_1;Y(hn!E}ni?VV76F+5gg|o*&u*6Fdq?a! zYFj9sH8y@1!@Cs@>c4(8%pO(5{gD^=bYvJkqKEg0b^*5$&20S`kgJp zz<`c1QRl8%wf3dj$=OGkE1$Z{glEO)8&(}rxE%L&Xhfr`lJ?cJMpN-YuidpzD2%TuLd+D9 zyS!^}tL3Y#4E!NVIi-r}#m$h8n> zU862i(OH}2cbOZhd;2U~VQKJpTDdkn6V1n<3~z~dC2>vffA~9!O(wLHKueX9Z4-?c z^^q4W2@up8Z5{Gm!Ih>VQ>u>V_^U0cFFv@qs4piQO@x~S%!f^w<`qJe4#wWDEMnk? z+?q8Am>s&X3|Uyw;i<$tTL`#m{`@5>pjS*1jBp@I=5ov5Aj4VPg9#tkzEE`r0Wj%p z_6!+TtyB404599)s@XApHkv_=HxFBON9<|swZ#^(+4RBZwxQSND#!D4=ML6i4EKql zdjVV6Lgj}sh`$83dQ!f!y^>cdO%_=)|4AqLY55sFa;P^e{7WP z+{LC6kv$>&u64O8Uvr4MRr(P6DdE;M*z+B+RcpUL*E;Ls>D6wh1vpA4pvo<_iX3kb zm{^ge5TW3|Tu2qNe~`r$ntQ;W#se0(zHdM5&_J`mbG#VuqT~RSb?v z=i^@oQD~n`y?8tOldfzfe#}~<^0hoE>J7^`2tQ3BhlFH2_J!W4E@CsLEnQpoI7jR< z=t;qb^Fw1Qz+AvG0Upf>J^6fuM=n{jW1xrmKH*|re`vHHv3$eZcxo&!tF-a$FUr$4 znh^1!4@=!929`>5iVX0XYuRNCVGUo^$tlrzzNXmf3WdYH&yS!P-W$^pntNh(JTVZm zjX4vyctsi=hEyoON!x)zy`BFCYC`UeZ?eZqz%88m1Qc~MW42Y0MrOk$rPQldI=GTh z8?2jjxJ{s!F_op7m#yKh5PiSnowH(hbj%kcoT<$N5%g%JkOmW4aCr@0i5-^U& zxwRe~(s}wd+%=1MNFmm5{1-VF2Y5~5!v|;;gse^9yb655<)TwUtN@_I5v(EoI7@Oe zvc!Pgv~&AuzFNkmemn*(sM2a+RLnsJNB4e&Y%t)%qNW2&leaUyV7e=vw{~Dbj?SZ% z*PW+q9)gXfpnhqiPi5@Mu3vS1Up=WiV{MZJKfbC>eaMm3h93u6ex66{w7xgMD=cG3 zfznF!BviOYrEWt=yYO%h2Ms&@jt3RkdHBwD!d{dlyk8vtxXlJp^7S;r?05Ldt@1mp z@{5ubJ<6CIYiIWAX4VHWzRj-$W`b`@U(td#55<(N!*mU(EXhw|Q6M#KhxDs;*2-_o zVLILFDJpY|zo zJB+S5a=oo+PB|?b?egD)=+b$I1pri|z1;WSKgc-RbQuvBhxQ4W9uw@4NA1%lP@igU zqBouLAquL*09Ivp19eJeRnwC@o#zynMK_mmt$w46HAlqKBIA41sq~JndBh#ky9-Ok zBWF`HV4I_GwM?!8!TZ7b=6Wx2e452GHCP{L30xXdFlUNpisFwx>KY5jO_vMLsx$dt zZ*zWKVBuW`cC3F1-zLs>q8jMaJz%qF)~nkNJP01rUh@-0j&lRJIbP%EEsRdE+tJlc7hOifDYViQj@z4g!G$*m)Ob9EppAib?uz z<1iaO5ZJMXhLdYZ-Z&n6*|yNvT@5dx5PryXR=4U9Z?1zg0f>a;uPSr<#Ab|ydeG>u z_FifnBIVQHryaQa0Ebu;Pmh@~o2J!^{>JO@l&*Rwf{%f){E^ep@e*2W{<|y3Ae2~< zr2n5ohRJugnjy2U_2c|5yQO1!{wz`MsOnRs^fF=5&KJ6RHTSJ6;Sq}a=~I)*Susi7 zxBGbA%hT|KGD=C&f&oO`{xIUUH)n}S2DR0-dr3>0t8S;R=$Oh+*=5Ne-z6u#bwuW- zm-rIw`%p(c=&PD|Tx1gsQe3F|4g{b6MU%oZ9X$f|vVe{O%z6CoVf&qVd5=@qm60Xb zGDOpZEERlZW_Mp(*~83D6FRzgRQC_@6?J`kK3RrqY#T)5jf!qHeK+&NR0nJ(i=J7I z*qv*9n`^Iao3vTKX7oD=OeNmLgq#1GH5&$v!@6O9Lq;4^!X$Hzlayk7YZ$5+E@{bH=B8XWjWELF3a0MPy~! z0zKIcWX@{58}ZDBN;P<{{VtO0tPdUl0E~LhrUY;8v$rjt=?mD9T~vG@j&V1S+}=xZ z?nIP;|I2pVq2qJlh#S+P!77w__b6|>gqc!f5)*B{IYjQsgXu#*X1nK+8?3mVYwD0} zVS+7Wb045ig(4$UNu|H3r{WZ*!KmyDp z24|5#Q-Ay7H$Q&#xvBBGpOkJ7+jiBV0H)LVaxN)DmP@~Pon~nmRr_#ZJw;(j0oIHP z313{QIebx|doCMGgYVX?^~9UDNW;~5k<1mVeUjBVvEol{Xs5%RE- z&2g1nvRuP^UJ-kOXI1Q z+{9dVI?|jSTKi>dfQ-;5Mu)IDIvNJBoCU`-s)q-;48!{E*tGI9 z3TO~xmza2Sg*k`j#^WUB6@d&;caRs^#j6{lN&Sx2wG~0qO^eqgJO~Np5?cHzG<~x( zzUMPkd-CqaUjW+E$fsY79REiDx^bBhsNQ@6|GDSeJVnm0`e;ISP+~8r#Ds>TlbfVh zsWhh{p@O)nSlHoL&?}~D#?hh5&VSzC*5}Y<;F?Qw+_}(HvD$Br#3mKQ;KZWs5ePth z@Z4MZc0KgkRSZ~vc|`vyHDpQgfjss;U3)6 ze?v`4sv0z7vT}2DxO=iSb|;Qib1wM6qy%p9x6Ux<;&5r^*QVlZje1f6AI7B zx-G>*pdPfw<9PFczvbtfZf{E|QOn(|Fo=D&ak%OEg;~rp~ zy!@LFOiIX&O3zw2Dq%g7NpU^T@GQVfbiqt|6Gaz0wl{~(yVfW6yY%V69>*!BLBg{- z>b^Lqp^+}B;7Xz@0&T+(?Ct_=kEWL$5AwA5=wVgUk^ZxwIi=4VGS)QC z#xVxuTl-V31G8eG_j&f4b&J14)r*!kIts99gE81njUvqVCad$?W_M=0p(Ap+n?$}k z2X*)x{-T$_Ee9*03l!S!Vr3?B3QqIvUv&#RBpAag@KYMP-BylA3tVK)K=EJ>Cri2+ z{R-T)&$Cs3U5fW&2pSYkS@hj)Iobv2;#VtZ3Mo9EAyP9m&EQ&H?Hd@n0kvwx~Y0 zX&D)qiN|iWeF~CVif;HKZcvnq2c+sMxw8f8ezk?1J1Nc7M`)>5>!=x3#IDCX#hbrf z{Capa4)nTnJ-#ff&k)hZE!LOoEGFgwFBZt_{377WaKS?%BV_!+a)gI|VVxYj74$yF zac{&blp;aKQiCM^CacJl_(K)80u@#0dw7|O%XDVHVfL&o8N97P zlR-TO#ju^)iFTn0AYH6SxRw7t?w7%)%JD8o!^O|?PjxCV^Zyc@wy@-Z<=UHngmAjd zhXd+yJ&PuO?6)VQ?;<2W-86O8AmCA8>TD;2Sx$BtMvj8Mra(@v;sMfh<5Fv> zyD5#lgMP|i!%X);V!dBYDyil&De328!T4bBABg@iIef90oy{&q$bWO^x-uXiqU>y+ zIg@ZF3M1v1n^Ts`x(z6lkLGSHmSgY#N-;sR&QyQ49W}XK5c*$Csy}B_H;OzIs=|gCwU0 zxTv4nZjT=F0;IO{M+!W-{V$t(FPjKhSl@G0R8w!}2dpXXV|gAa?YW91wF__JhF#cY zG$$zTY-PDvmfE_F!TXVqLlJlZnEn3)Y!54&>tO*BFe~tNZ zo_qrQ?TayV1Yien(HQJDBFWJJg{lKpb!)D$ixZQr+xq1(+gxJoeMz;-y$OwrW}I}7 zwD-QJzNRG1Nomm|CI#0d4tEN9tiO79cWf8$J)_`R*!{EW9%*olF@OqLa-*UC#+l|A zP)%by=^-?v(V>k|D71$g(8v@Xm^r69y3Q^GGbx}C=K>XcpuXtFWlZZgl~~waJcCoE zdb@x)G%-!$V0QWmB9b3EiBE}Sl(EkmXW6oGPrI-RNLTB>;S*idVcBbtP)jATqoPCB z^aw=xLcvr+t71vw?~6-6zAzX2sB~E3O);n2R$GJAAJNB*zsDf)bKG4aTg>PCSh9K+ zhnTC}y4F|OIGW7<+&k@yr8}EzqSm*idi!ccOQfOj>ZnNfbU&S zM?7O6$`93yP&Sq2#6DSRo_jteu<2g*zk%Lb*Tce0FxN*BB4}K(m9|oyPE%n|*+Lu_0%Q^0BvcAq^B%mV*SmQ;+3uW)SV!g|v2o-B9Q&S>;WNnDQq3zVq zB(1Qs`y5PTm2DUlGg13`BL9sZHP%h}m)!mwR0R?P;BxRcM+X1lJkaJs#Buv zl`e49nLX-4HF(&+&pFcYozEv=d#leV-wo+aqaLmveXKMzExeTQ`D#CCaY$kv1s;vW zHs2_qbVUMzbKv-?v(uj#j)ksw_8d|gXu>G`X>Hr=p3X}xTXC3*yZuQO<2BN%1EoS! zL0olGusb~CuG_DdTfT+hyCV7It=6KZlYvhMnLX&|8clG{rnL|Ksqo)m8E4+# z5=j_GSgnr&b9e40Pr=OIO&TvNB+==-CanyvUC#}BZcspATs+|0lSBM`s&)GD^i^sTUl_jOc3DS6QOigjB&Me8c=Q0-*1D4+im*tl3xMZufxB2G9 zw2TEjSeqF@QCWAh7-*@9fOf5j(HXYBYwX^as7*Wrcnt5#7LP*%kiFbQYAg(DkD0MM zdqr}&aTpOE9@&v;-;2qY9eyi%dh%s(yAw6xe5farl$$xOsM;#t=a{eF9;@=JmQsvX zgot|cfI4zX)Ne@Gc#aMm3-B<gB(|*k8Jse~P9X=o@0{debNj=+Zj2^bVK; zOhj|`<(%Qa0K4!w3k_)HAfg$;f+RU_`<3NG)Gj=m9hrpt7-9!#svJho5{m=5F zA$VN&L3%b|rrVN-A!0Rkjl{UM&akyisw%d7=b=AhVVb~nbu6@aRS-@eW4S@forzmX z8``xhEG{ashfp4%XR`*-fXcV+3v7O^kHE@(T zpYXbpe>wWYg@t;(y@UvQCa?)WSt~65LTB#?Oa^XX5oWQj0Hc&`eV8uU3On@Bq*JTw z{6f*VA}gMtCZ)DwgckfF`Uk5X(2T zrj$?qY=87=wGLL4LGImE;2D~1x#c?i*}0pjJ)$7Z}&}I%Cj#~aoq)# zqYgg6UXB3|v9fDdp$7%|g6^y&eS+6@I|A`k%~MRyL3$=&5>RmCUdclsnIrN6jVepV zZfN=CEls>^^Mx&yrmJ!u&U9^9o5wl$J=~AV^>KgX+zvm$0h$1OAZWi_vf${d%m1yh zw+xD->!LP1gFA#UKyVB0?(TyJcMA-`-Q5P~cAodE`u^Oy zb^8xf%+z$Bo-J#yz0Yb@zrT|*sSK`%*`K+}tp6Mx$nmA&Yml`M-nGWI(xlM-cC#(g z=Tf*@uwVhlsEZ(d(B?OXat(}NTPhQdFgsnmm$Qti9XG2MyuE78E5MPFo9L~9k!*6G zqe#!pzPz4G(N{X%g8c@DXXoy@%N_t>fDe+Z- z!2nb8tje4+jfug0Os4Z;_sqQ?)C1CVI3xTm8=^UJfiG--hm5BKJ;~4X)xV+NSPU>s ziO;Nk)23myE#zl`X~1e)7P`P^-?l>#w2Yy-qdio>SnwHeA3W>=wcK9{xG14&lv)h= z@t1Ft z>h|rthk?w+wxTgef4u1%BB)X^5-4&y{rG@Iet0EfYrhq(gWmnD$#B@{TfAukOn@mb zExp7*YXYhHCJzm2z`%ra7O(E?ct~YjT!g-onyHy^A-hwF?vS+J?$G6o_E;$-z3b#z zxo5`fik@9KMU#GErkAQH%1a#>gOZ8mfBt%fWq*Zr0z}YUtFIR-Y2e1eHv?2j(psT3 zqvy^BE-gzXG8w=W8J^b3tl&~=1-TVE|HWPmoF>rCJEFL&CDa7Rcw@{jd@6g&%&w?w zAL!j@axo|w_Fy$va-W{h^4WHAl-aLoegiDa=|E9rK??)WYwK{L|nXS{I#7HPOK=qndiG759{H_U$_1X*Aq>^Jee)2)%7J z2UXy(vTa#Uq=;y%$==LxCZe-(4RVD-b}(0IWI4eglz?qcd)bkPLFq#Hq3y|YdpyhK zsgup_J{q>{W#jj8E$-qr)YH}*KW*ge<@~?DGBqu>Z-tY#d%imBkg$aJnK&OYthT{U z1vFl?cyz~7>NNFf6Mo6{6{yLjXk6BbtGSbJHl4oMtE8JoT<}e8y80_!J%DgTmMSz3 z#uGjZG}NW*81A#>s=De5t4I8f@-@lVe||Y$_7v36BY`{P2siF$H(8CF6qmP*Pt=x8 ztGC2EXqZ&i%~yITRJvA+rBW;Tg%4t+v8$(0i!)5isEGh^Ts}8Ll7O^pRpVi4>H)e^OSOT*Ijnff;5 zr!UIMojkW~XlOxY@5f2w!zPnM8|Xok3GrUFnc3t6tK<CFi zq8#_#Fv6C$m1LHvu=kpY(u_IG40c3@f1Si+OzHVXfh?AX8rViT?3B-|sg^E}-K2}6 z8816a?Zg%PY0O;P=Rr$VU0q8@XPlAMI1yKc?M&@idJ`M-6;}8V4H+E?^^pB(1giY% z77*}Y&@*p7`vW8yg73dKwQcetx1&_Vq<;k+%3LGae3P;qg$nB~(HgEV?-Q`ms1%(@S8EKZ?b+6p>N16@Z9ThQv< ztCX4Z(z*GHjc!lv-MLZAxu0z{%%~?3W%Ig`dwB3(G-}177n<-vC_nTOR4d~sw3U99 zQ4DEel_XH>;)QY-gP9+m^mgD`HsrbAuA?z{mP^an#vL(+f*YpPX(In(;+2Q(JV+5K zGBHz&BGFI_){-A%zTaA1b)wk7uC2Z89MM#rGL@+`idB`>?9u)9^1F30iaCaDLk-#` ziKoDvEA_mb@d{hYR-YL>$=>uGe)|~>v`el(2%JWrk~o7@!yLyPO3PTMgj+j>wI0D^ z+$*hJxSRgnqSO`38+QrzZso~0x-|K7?2Lfkw~gw>T-f9q!&mLeXRqG=etyy6vTl1k z;#qjBOk8)#PO?~5t*q)QB;N$;ubqSh$g+vy%}6;^PWy3RLdj-M(}0=r#_k#-(i*wi zGOAzoT|D@@YIUnYnx^z1N295}Y8yYl6OoXc4rLXaDE)6t%joR|uE%PzjmNS*_?IB} z>xo~-3pIkS7NT#cxLLIFM(*Ac{GY3qEFR_71r`P7SOH@Z8>A>$+*vTZC;U}#hsaH_ zK}aBhQvzePc~>Ye=>L@P6GT|HUAM@y*~Tf8llp0c^88QrRLz3CTW8vwj_hP`{it^7 ztJ@D^uvghr*$;3OnUf4h4p$+4dIkt(p4v`uXKw>f-iYS?dmrly%7cV6t2E*o2IBJD z@6!L?_|OFmn*KZLKe7SyzyA)qcZ&b%(!q%mU+$_HGvHd4Q8o%Ro^Tx-k2j61*gqyH zG%-*;?;Km7qP6;Be64bIajDXWM80qwPt|#%qII3-U@g;e-U_a$rx%S$A~7(P*)LRI zDti2R)%m?rx*w$B0;j7N??T>u4@V(i_hJ>O<-Rdr@~2)y31kQMyLZM9dslG2NgEb6 zJJY6ufpe*n_0qS($iP_8DYw|{3A$>CNIXGYh z#~dDck_)%3Ry!sXY=7TYfR4I3fAxRS`0hjxDr#>GShus~y z+2Xs4IH$dn8yb%g;B>Uj4W>DEAU5CV_}ycf$VW zEX~pqrmCh97f1DQ%twOz?cj93k{UZjzCg8vleX?Xs*b)!et!NEd(hi#*C#KS*thFf zqV*#FlmQg%p@LAmnpHm|7T7?)zlgapD<@ZddGI`o;l{#P^V<$sPYBErA~H@1MXS7*FEdvqP7+G^<*V7N3G-}JaKntTkvORH0H*)194z*j{&P};??aY zSN(&2c+`*o)<|AdZ8D&!=pTQ>{UJlX0Qtn#*#Ot;0DcuiNyI<)_ECyTd~b8W|KX~U zjf*Qp4E|9h^i=pSpHVd8V_>^5xo7`UIc$0UJs2}ovNy34J5sVQ;xN)$I zQl_;7S1&i;wv?Eduy`>9k}68^a|G_YNK*1iAm+hJ#oIK4v>SdrN(}=8DT-`B>r4wl zK}zS^=7s?XP~^w5w_N^@61dS}g#wc39$wh@?u8G%~?@Z3Trghb+IOD(Nsq((fXv$tUsg zX&@%LU0$<$-K=d}Zj0WtDMyU2SmMaY(MK`@@Q8P?CX%1c;PP@9KfC7@bLxxeiZD8^nZ@F{Gnv*vw8*^%Ll= z-C}Lg)D$2!C;g6m8N6+!_gmt_VuQ`k(8g*MfsDe-WtE!;#u^*-N=do4o~vD_W~EM1bW7*YP^5*n z)5N}Ht`iaYumCnNyF#4s>sQ~_hX0v|fF0?O!fYH@wR3A$*rcL&vI&Td@j|OBHXf~% zY6y+oyr^Qfl20x16SQ*K?SZTf)A6|2fACWpR-|%B6*0;}%kt^`6x-{7?+%o)vN_$m zjkZ^IpEfqU1E|mV9TL`?5IAS~?BLG>-`v}!zH(6Wx8@K$%6FX_)Jf$DF>4gGyvimZ{EJkTxZ|4T=hhl-jocstmvwiE| z0Nc4ltg9jFU;joe7X#y`F{iI=(vYp~zoEnO^v<3Nb~vgkH}YR)@-cGqHSh^ko12~0 z>vXfZPviX1Qz_Ng*9xh#S_5^e0+Z!C1l2pI4=*O ztVonEJ$|o3R8nvD?jEIHi(4ii4|XEz&d$w|0a9tt>%QQarlg5rrLt9vc9Tg$vJ<9= zNF`uw7?KD|S!=pv%;W$q zn1k!sipRPfW~~CA1f+1H)b;6cH2n&c4##g6op|8>J07c2Z&H=vE3sfScftR;ybx-CkH2T;=s98eCdh z3NqO6Wk0$Fq($$B)jxlxcorRZ=R8)9uY!4~GY*riwBtf-{>VOrL~nexUlm0%Gi_^e zx%2TK5euEj^zyy~Jm7=G=4AC|lf4mvEuN1=Bm_e1z%x2JT3ti7BWOn(E8FIEJiT9+ z^Vv;qh&6a2LRPtiY4lUtx}4lZjY@I`zuWrZ0$Ju|^%pNM#I{hIVwp>R>wT7w{%70g4p=v#P%6T25-JbhKxZ+6jA!O9n%AO~(qR&1Q_ z;;|=C2hp{UFH>$NtcLs{4yV(9zg-pAgoVjND~*H+iNKg@8X8VU^`rCi)O2(YmR(}y zMn6kgz>^Q7D$n44IY4_IFj;Bvu+k0!0tc4(;hb%hH>SYfDdF?K z>O4?LM^4_1-%GcF-&-H|(`7dh|ADT{uiL-G;<9mfWn101C_{8iOwNsEIO3L#W$NbU z!I_z2a>zJoom606lJP^H62Ltn(c2Qmnu9gqE;ygTsGR<~nwJ1)fwq8QU>Mo%^|#^F*9i)Ii^S8#Dm$7rH!VK}kL z7XG!EQI*MXnW>0!U*@(rmnJbA|Pj%41Dawcyi&tIUfa^>6;bZ*=v>padR zGjwvgaN#%E4s(4qfX>Gs$wWVxCFFe4uvfh7-DKuF*ei`zWaaOFf8ltc@$mCsv^UaZ)9R z{!Y1J(~|FyKHy|Rila50n`BGJ0G5)@GftT6=@oqTj>imSbzCv{5tuKv`uss=e!_^; zW_^QC!Y2l+q;nQv<|34QPF_Bjt-xo8Dm1D+t|(- z2VF*y3U&M-4oTs~bvC{YB2lU?u=^;PZ!s3&htt{cLhTWmweCj$Mj?krOVRYnu$k%e znBWi;=^XM@WNz-1m*(yW9y_T1^KDsn{{-q}DWj2zERmHKZ*@&6C2eht)yjfd``HCE z!xb`#iVzs*X(Xm@hs$*mYgQ4T0DK61xlRL+RFF{_3L#%lpFS(F{qedz7U1a}f^_HxDJML_jW#z*%50Zyt?JOibB1s(x8x z@flmhcCUi&mvC4J0Axsks?{}_m9wP@D)R8i@bokw)xaW|$yKoODH{$B>*K#?1h8`^ z77T5)dZobbF1DSQ0_Op#$r%fY*;!7&#hJ<&lUR(BQ&P^47n>|5GQW;Qf|wE01<1!u z@r#OzXo}jp)T>GPU+Zl(ndP14$vEX$6W4zwI+Tq*k zLsM%qFkZ{~*Y62&rOg#2@SvchQ}VL@gn;0w`8Nhwof^Sz_> z7Ut&tb-T#GIZ;JOV%=7vF-c^rPDr3N&5*1rh;r^bK z0Ccw0W@jK~ER3zyjs{YRkB^OIU}eRD9NOC|0thf|44=7iGA9_i*3JE~$-(FOv8K40 zZD-uorx8$Lh*LLwM`RgJp-1Rk1UhMA)%g`QHPf68ER?iYUtl`e=yj6;0-2M z&QtGqf4VK9lYQnJ3Pwft zqe%jm8HR$N(cRU=_CCz>u4Uc^Jw*Lea#d;W{rTow->0Z>e3pdRoN2th5-SE*%1bAN znKn-*FCZKF5HqO#;ws|?m^PrfI0WrNmLH-}XpRx}fdi~Rx{q;JPpcqX6d24i>i8lh z736XseXpUWMvEQVJutDRhl`hhyS4AI+Sb3)G2*kB{dLQfMy@#~TWn|}nPzlMZ%!#= zqs=AMeJSwsqYiOlZE0N3Iz9cQPPvn9_>b4^xj*`nWK~ruGtOr&-ObDr5}4*3oAm(+ zT}eMoe-&L_NO3Xd1n16;YloyV7`~ZzY@unf6EHAdYRt5&v+Ye-(EjviF(KwAZp--Pi$y*2?xbBs>=2 z7@z{%K@*r+?eIINQe`7WK!8l@64?us0+f$z@xvMOXTa<+vVMiJBNJf%TmUjY z9sZEz;qH1}JEHbT8=Hk1vqhno&x{TCvXg+8 zl@(ScrseYrsG!mepv%0r=&^$@_4Ua*qXM>!Ol9xiyZr7zk`jgYslUU@?n`?WuQQs> zL;evxN@@#RWx5*Rli64iP|f)cUd%=BydxY#fKKw|lR^ zlYzGn;rJezNXTnx5%_p`)>hU`?6?XF3TJZ0hK5n4VX3#}1^M{^vQbD@o}SJU z@qfI(M%5{`D*W6xx-p)CraGe}3$Nafe2mLA%T;GF289CEznp@?ht~lB=?Qq6p7iuZ zsvpYYBwpnYc?E@Hb`6vu;Mo(vzUrBMA08|$aiCEl9S<^oZqD2$*wWFR^Hrw84h0~~ zD0X3h7#)zy03~=9X6E-Mr(fm^n8b^ln`M6|Tu4$m22R|77Uuwyn1dcRJ3ie=lmEKK ztL)58G*F-pZB2U?W{Ov~u(Yx=u|fVRnQIJemN{M7KrPHI9~KayXJITaDRFcm8UVC_ zs*6R>AF2oeZDKXE;w)kRU)AYoy6X!_@AyCPuzGKo(p+4i0MHaj{wAnUHWGBYOW$C* zCbD^P8gPsw)c)2oTwO~QWQ>1l&%nrdA+VR0nHlV`@4zQpqp~bPLr7R^_||vD;ujL7 z9VlZhJ|IBs+4n)WQoqK&bcPo_q-WddRHWI)>f_|}*Dj!-KI=MmbrBM3c88>WpytGygsH^MDZ<9Z;{&UubsjnIK(Qd9X)vE*cxl%9%=>ze6l?zR`M zA3JZmak5p%M1Sl~Q7IIcjx#ezBXN0hbgB0PMo?Bfr*!@24;Mf!SX-A4ET~|PHsy?o zKB8zNqY?3f6{*Mth=LtH?%OB+dQ9hu2m@4skU2Ujj10vB#AEwUg33y)@(X91hQmcg zk(MJu$*ei_Q>lC}wK&Cpem^izX=pey;t#bxpiwlJprbA@D`-nl)Xu&%D2=H$XRTLf zPCh-~IkxG1(?Np%_5rLl%AA;x@F9M%;YiDaB=Uij02|N~Z=dkuF}WuJz#5*}td)A< z<{<(e?jFAHgNcawIloXspEJSnUAQEu!Y%O$5diQZ=jzF$8?e*Wk9+TqMgouPT@lep zel+9^sB8fI(Fefb8B2d?6B**7NNH&S!ymxXBS}8$TH=(KRs!CVbmombM#;*mEta`b zqE29DhW9vd+~Hfc{*5;^RacTK7Dy7Fhp7O3G%ygtGt&e*6J@1khP1QSdH}~_W?Bqf z+2Mhktn%}@Xo${lpS0K$pgc}dw1-wc2{!e?zory^UIFUjg99Q?BD;NThoc&YGANw1 zO6O+dn776+P2e#lfcmQz*-EX!Pr<_@&Y972f{gL^<^sdHr{DL8lWLj)^!)A}KLhbx(a+Lqb2-DyQ(`Y7_3c!^E+09odkc@T*aNh%5iz5qozlJ|8$c3GK)`2x;1ki@R z2Wn1TpC8_JD#`xgYbPe=FsrRgPj7>y_FJ|(y3-gAnQ(c~2Z`4l@qAKHNQ0q%V>J@y zVB0e_p30J>N=dtRd(T7ov=m4*^{%$AlZcRrV=n?Is2}vuH<&_;&A%))cmoBWnN=b zsa$RT%9U>q3b@A9laea9;fKu4^<+{DGJ-&I%6{uW^}wF8)YDrY68cvnpkPScM)+pM z&iQghT6%ed{P{|h0l>Q|m%=F{S@sfW=6(6#qRl zkBv?CcOhbL`me06?gCJalRw{q*GxfRR0bV#9bD_~U5RxkWX|3dq->Vi+z5p>-j36e)&p;O-C@B5Z+_v_m zOJ!mPuvczdeJ;n}f6mkiyi;K-^{%7<+<&Gz?;Ejrej5mo&V~iF0J#UAY`I)-XlS5| z$}nv4F|fCfO8yGem88O6UEbSXo$Vp0sHlMPnVOp3{_Yj}$;HljW4Jz(k2eX&tmSz& z)TMOjezf2S=kGFNUYA#8w9>E%cN4K@*(G9SRRxe1+x~maVYS1MYs1_2*=g(@)t4_# ze5mfHi-tFsPCy5+vC(0b@@Ok4Qh3p*sK}{h35c?>1Rok5{u1MUW8BtMyNYBg?z8DK zIY&7vk^}mtc0AV19Z!AXy$VSar;Faa%v(No$4$i}1h>QZFp3*V*)^Z0zJWJAb|F!p zJEw?69!jjLo-#9TtsSg+@(nvu66qp0#cVs4^{6~X0*R5a`RWTbuhTUQKj}iv})yuVN{q=OU8;9IR zL`*`$rUBOPY*G331)lh`b9G~F-{Iuq;XtT~W;Kw>T0PdMe{yKw>%8M7`WACKi7Eas zmslU62`}b4=yzv=5lKb9ig@{St;cIH0@7{94d8XB7QYAIir{&-!#Rm+FD!9jw87Oa z6CmfrEIm^J{k)UL3}RZPZ|^YLoBzx_n9e&MX)}8uRCinH>3&565g+KvzZ^d zTy9Od5PH=N0P>tq_Ny&Jt*VyL{_|_c^fe04{R>YbrJLTG8KB4(^vuF!Tf8C04Wy$wa7U69PbCBg2z(0{9!A0ZDj}m^a7SB;2L+CqOQs^ z&S69=Bq0LJmgWrXwNRN}EkqzeyS_TZek^AyCEVKHW-+Yh-23eDv5tO2pEoX>@QjA0 zln|*fLcu@Yjf(oqaq1X=vo$oTe<+h+B{+=mys@irBXtp2ihMd}*w(!=Qy2*Vpcqn4 z6XCudH!w9YcDhqxX>0Z;vwe|^tKqk@VKNWYceirv#|RmCPB2_EGv*ecyW0;AvJ%;i zAU=jVIy76oI*U0U5XcR}Ai=etw_DxF&Xzkw?(esg1&@+~N0RPgQ9Uf88D}axinVns%oq}53gXdTV$ys>!M(>r%z|V8tF9YlonhqS( zHJ)s6c2bvUacqwp05zIa@&G~o^I2eR+%VS5 z+HD9773D&&mAS$SIv$A2FkIzt0_Y?HYMl8X5cR(oaBwd?)iM8j^@#lCe~%P`TX>)R z-y?$HzH=iM{!{M+6j&nz7yuDX;IK6LzaR5K8L=8u`|say6zMTm*2}n!rM2?X!3(to z|FuQoL;Tq)G2JgjhgCdX3bG^cFe+LWqL& zUPA}zp@otVTF4u(&+{LA-&*fl-xpXblXLdjGiT4@B`qhQe-MB(fb5~m*gkygo{q)t3?u71zMQ;d% zhw9GPllzO9qr|SfIb735*j|$i2dR~FV@{~2Mwr6%*XMnH(Bie<r6I~?aK06B(C7sCE0da!(XzWpigkvsSYcriTCl( z#V(2=NMAKFlhB1;IIPiL{N!U#%g16Ovl5TT=B~k12e$Sa7i^gdO+8OYr?s?XL!oDn zSl&Jz9ke+kKUzmVJ%YO|S~-xj*O!J5BWRF!d(T!zLk8Kc=yq#!bk2@1dD&<{lG$LP zqDfh{!Mue!SI*VfEg8~Y2TPt^w7AplxF1BTUe^RpQQWfSR7cbH%%&x|{m?r{;FqYO zjh7%f$5*!IbA#oL+3BVn1pumu>O^QZ&|6*t7wR&GF#BgATzaXfbT1<7B24Zmk&naE z^lZ;l)1fEkMVa5$d^50UVPMV(hpfrcP-{?CP*mU`-)%6~lC2AsDLUd>1Po0U`nb=P z`Ho3nl{1k7Ek>Z+o0nv@Yr@g6{q$ec?;Ge~5v>j~5(;R|xCKzjX|W8_j`0!S1I*X9h8 zoqOhITe&?ur&f**B$ObF#vk22tVLLy(t;m3{aOH5U>^bx<{p#KeQ`q9IbEydmuK(u z4}`Te=nENesD&w$-EukOSm=qw40g$tI6hy-#B$j%$;Lg;%e3~mHPR^nN~+FHcfG!L zj=}k-d&@2E+nFe5ySH#%xNZ5WCqDC>+m>AMYqeF6g**ZJEL0fNOAz~y&6@X-4rt}C zIYF)^5WNmqTxPt&Sdi&X_Klx5m)^ZDQ{G+5@6yzJmk$m##v{^1BG;nm&nnG1cpjDsRWemQ(&pkYwRwy8Gkj`oJ(aL(DKSgRPG5f zaAlOk+S*t?W+6nzwX1|jd3S#CsAZ&&g=SO&`e?9Hg2-%b--+p=zcwbIIf zSa@-J`9M&@v@(pw1dORmajK~1kBcwevFNZ%=)%0f8M3CkaaC;P7J7B60d{`QbC$CD$Hq~jc-ZXUt+ssn0(q!3l?R{ zjC$+MVjEV7A6gr!jyf!!gAOBvzJjaB@eA5z%)SIK0btqb8(?IcKiPe5HM~zKY{#Os8N52VsIQ5+P+P}VKU=qg-TCaIFKHt$llL+6=i(r;`k@I`t}+6r z`JUGHJdYRAwl1x4Ak<*x+$!_f>f_1MEP;6rcv}$EIBO)Ky9kmjzO31w1?KeS#na)M zHwR0Ra?s^~d4=&@42NGfWTQ&$V_jApZ}_dV#>n<#o_iLhDw@4AXzP&nSqqTG0Xdy59`+#&fr{<$li|=q%rTN?B zrNV8_wM%aRIaSmiD>L8e`2=Q}uX7ZVa~PXli{3l4_%|bEu_%nu)K}yAI$VlHM!>0Z zc;0FR(YJI>opUAyZq=^+m&YloOf2jelH}y9Gjw8msVxy1x|I*&XQsPfebH+D5#Lwa zy7k0mts11s4|_HFc;hmAs&*Cz^{4Y^h3eDnrsiFG*W8+M?TS+#7jPqGm;^UZYQ@dS z){)-amxuqD4T6etd$5~5DPD=6{c4{}1Dq`COSl&4A!Jo%BwXIq09t<|y67H!!UNQl zRdAhac*t7BeHxP=b7Vo-o}>AiP=<=QTkre&{13?9&Bw=Z{jwBbcTN*YK6d6{bDB#> zL3%IxyDxE3LTt7;c%mhdpM3wkBSFeG$*$u%BfD{u-c%6A#T*gT>Qs1`Z*x`)>UvzJ z8=lErX>=%Kt9)V6X<#uk^)c^O+1P?fgqfrH7u#y8vp=I5N$cP(9u+{;LF zpU>6sKJEQr6GCfFShBKQa$56h@^yoS1)Id{MD0ktG#-sCsvvvrx>Y`s9%MfIv$-{xrFC}~To+>d zZ9Ze}$)MQk9n6S7`*hUSD(6}fC zc3pxY;e8z$ekbKw(-rd&{I1NoIUJ^U<3BHy6?ihJ8Ea)rPFxcMZyV?qvyKOn^1x9K zP^dJ2;-=}pqeY#&6eC;m*pQBwN3+uknW8BF1s}l?x8QO+NOUVp6g+TQ`gJm9>k5f6_Pr3Rg?S+S-E$yz-;TxB1dboW3c$s-%JkLo4IsDRM+>hN2DZu7D4 z;9j=V$&EnMh0O$W8U8Q6PvtduBKfRAhu47a@^&vvAm~HcDW3R}VRl6hZ_({Q zC)uJyJXfwpbxoCzZ`N3+yTfAAwmC8muZKFHwyUWzLyoL;^^-PW!DD1g>6WzW;e{h* zf8E0^{LvS=hMT$FrcV2H*mebuv!%!e=KX7oy;X zf_1+pUpb%OBbI5(+VtuGzsM&BlrC=u9!BsA=@v$KTC@roRQhend6JLok;gAwGt`Np za)lw6Oud#%r}$5jwcq0N<-@@4?pHdkAzO~nA@0=yOtz zBNK?HuFw}5`*!lW*Tla4MOk+*8yDtRx_QOKEIc1@g(vj)yE1B6ux5xze(APvICIpXb1f zXqoR@^$yw?axjoht624hkS5XBMUcKkwIzZiu-GqyIZYGGY2A9KFjscwwPowoAjk0cp2`v6n)(0|>9GOiV&B@NGw)@T%>`Ctvbz0XA`BEi7;bLD)?F zp%&mF&H2RP+1mK&Qs3K>ubQ2wcZp@&#bGnaZE$lirw~>HHZ!Z$Y-)D6YPW`(B@$9$ z($I2LX$rLk5m)$Fu`qJ3HH=VbLbV&+o|t-ky!K56Wp9$JV=SaWW#@@zq4WI{XN3-Z zW}&=t53W=o%)3NM#I|*iNl^!tUh*0K<553N%lRN=d+?QdMhklXbkk z{fgd{v~P2Q{!4l0A<~EUshDeg9NZ!dpIniVApe-_d!Szpw`c72H4$E}azUwb z$65s*=}34sva{33WVQS7`~Z1`I^%-`P|!3P^G7IfrxPj%K6zn z@2)6&8;=L%PP~qg-dvuL1nL(%Ugf0W3il^rFHMV_ax8QR*az^{p!kxA?qd^ZMDV(& zOPuZ4Ci@Bw*vixNJ`>8nD6j z{)z)>`>T046UWjsQp;?{9EmyGwMu0dmFiIj1-)nWTY7!(p(VdO%_B?Pz61ECz>({# z8PqK_FmR}+)A-ZuBs`&ufS*rIOm`P|{JaT+)o}Mwc7M(YX?V69Cj^rcZk1MVm=wIw zw3t%5#@V!@)0Pf;+~=V#MvT9-(~HU}3G|gS+3Tq(PmM?jFHg4ltaDUz*e{$#PhV%| z#dkJ5|3gBCGpG63YoUo-{W_yaQD}8CLY=c3o0(?g87moBHa%5oJzx-ADEcIEH(Uys z7Lo9xlrBr=%SH0OhOK^n0^l!)ER}U$5Z_R8#4SMBPZsKkXDBrX{xg`Y_o`*Oh0_?% zY@v2eaKyrjYLpM1kQOZTpXd#Xhj)htokM+u9Cq>qC+yDX>yH%fhuGcFEjV6Hp2RXc z*15~9)WBaho%xp`N_OfzIzMDiL-&`Rl}NL`Qi||@L*%42D;J^>O%+zP?c}+R=s)C5 zIHnsM=TB9;!r;eS?@`wse#X@vJAnlua517?jc_=(4M~5j`7X$ZQ?Pvgi07}HiEAmo ztp?LUKB|6*G`ySinM#uTK{IVx{XStz)_WqNoYq&-Lq4*P!6K}FHBNt|l(2nPFJ|M_ zQ?3Xkrw3(kSt}H{!JVWLA!+P30Y8d36&3+pii?ZM^0Gx`2@a8%)|w^(0i=ZS-Ls3z z*f>}6bSQo&f(CjFKUk~}*d0+u3_7PN2dZDC=>LuGfV?H}^fQ~E$eBU&s#%X6#1vr@ zT0x_f(^Jsv^wW-e6+cBVl?vgy^UkB0R`%-|p#kk?(y7DMgXLmju%X{>-gBI}F=A24 zH#b;wQ$U*M)pFF-`ROjxu^_u->8i{rFWBYc64aa(M=+P<($8G6=fXop)oq{=qn-VV zeJ}WOyGs;E1-`_~maJFXE6r=$K7lvnjrBgI>^IsSkik1XrhBJW=Nwz(sSvaJm%YVr zMHFLl(%rbJxkjZ}fK;kaaj&kW)U1c4^cK0qvP=k0ec+shyd>98L0ewvu35It0=W2L zGp%BpVk*nk)e~8kpT@I-OoYPQTA!|nt2JAkUtVmeB&8q%@|@Zp+ZvSTmuYUoar6F) z##Hm~dD%6eFdghQOT+*5_LMIeww^*NTZ)Ar54KWvrhqk*ub+E_bSLu7sF_oTm8r%; zjLS^&)Ofp2-jL4eEMvNxOZ5V`hZkIXZk`_-P7ZR&w5YFL%#;VezP zc}$qN*G5~P<;wL;)rPAN9#rq`?KK_ASecBo$${o`^18xGoCWKMx+myEwuSLNF(QqT z&Vu!N5*zU!QO_n8sZwL&=kcJ1MI3St&_MXWfIz)HMk!Iy+BTGD($vV-}m& zeDDWWPOltlKQNdKk^RlcGjWwU57XNlui4BYHsET;U$+;ti&I*7iMRB=AlEBrK}#hnh2PwapmYdO^%Vbx5;S}l=3*+ z`+V|1KU2#rLn%h7l9}%~xD<#wy{GgHbc!1!OggUn3u5+ao8|8seU#r=r)Bk>Rl*Ms zj_FF!ss3?8zQ9i=bOJN5cbrwTUj_#Ydb0Sst(nqR8Xrlw`nD-Q8EH7+RE)Luc@%Aq zYGz(k+#UV!mR5}90AmX!yj`dpchc4>4Zn3WGK9A8GIZ<5&lNx-?x-_0hq^0#6a|KL z_FZ>Zl0l^|dITolfO_(2on|7AYNcyVze4J@AJB2$Tc|sgW8Nja`63x%6&ZuOqN;3k9CB z*Ip9|2++KJ_X)8~4RL)Cwjkc;d`7?meTG(Pwy#Ulimu!W#O}Cf&lG6kn6Bl!EqqK5 zX4A4-+QO36GTf&yRY~qs)rKVi<3`Q3tPHeN@1L^Pdv3rp!k$U!P>hhojEtgHhjHNU zNe|LFLVkd(G-#QZzru(D#lxYz;KmzCKdF zt;xxQpbfP9wcyP4*lZXu;>>)w`O7!Sz)6t^Gb zqo;a$#@m3XI;v+R0+Jc}MdT#~TT9>(iMJ+m;GkCFnbwcucoTe1WLsC!W+#WLpkvgb z(QzDWtB;F~%56WXR~>}97I**zf4BuT?L9TCe7b8C6kxp49f@U;I9ew}SCrbG&GmL? z^$M9!`+~HP8BAEvkcwNBQHt1hU6XnuqP5&WC#uDNrIQc?`+|)3QzC_t;nh&!=1&6a z5YX?W)he+_3&AEI!#+Jz^hNya_*9EaLlY`Sww9~57~sZY=y#QwEvn2Bi_jO&`uhcT z_B%%dZ4P;}CIZ3{*RS)>oYh@~?S1`&SG-0x;@NzsLkths-G(sj($9*BqOboZ3zQWS z%5d(CoT0og)(mQA$Jdl)dibdwMh1PMI+wi|)$qTvXe5qHF_87c9_^zIz7C@)smumP z7xWoNuY4CVhpP7BnB&eUaNeqht~v$X5s&sSSxN|SKFT2dbhrVrTG2Qw5}vl3OZbq} z&>Z>Q=}(*@!(aDP*{WWiP7Rek$)A4$=ACKwi{|n*jfK0MCS~wseoz+6m_dE8Tb|b5 z4zQj?N^g-jdPh71feryi1->nF(-H!tUCKMo7!7g;hLOMbm8fnLva5aEw6!#P7x5da zcIIgfhAQ(RFU=wS-F%bNbJRogfFa#~B+8`h4bbK~pO#Rr4fB3m=h_V0rdFM7oddlE zM`FtL_#Re}3kj`0woQ9pda_~@*i+LPU$zdJt#P}olYh%)e%`yQE|NK2U3^$jkNU27 zob*8RlvUSSab^3uwc~B(p}DkdF!}_%)-S5lbV@sf6|{FwI!a9~XC>|XcJ;>bc?Wu0 zHr`K^q9=**rkk*}t`7Y{m?xM9me2d~EmW_YCPQ^R(!@;de#Hz|VBA<`#leka#<1n2 zu^BV{{*|!!cc%-dV|e8-pNr$SVJMl-we!%+>Yn6R~T_v$uuZNc67%_sp&7=7H*)c4dDhy1lc z{1q<&sRPgFWYX+`VSxp|TV3H4&ym0Wn{HQ?`@e@OIP*lRcJOramiCyH0rH>F37K%VgYexZFP-l9U~PuiMV z7{+SEV*?=@*F}s@*E^gVY2zW??>0f|;!N_*j6Fni5Ng4<>+7pKv9T#CcE4|)46oK! zKaw_3>)>gfw6284b@1h{*GoextbX5rLym8mT(71ssjTnYF0gaPvgAnp9>O>D$>~x0 z=FRK%0l_H07#X8qh!ABWJUebaouD-R{rtD0aKGO(NsX~^Un!YgeEpC32|0pC9OLU+NnJ7Iv*;dmNzYvQ|8(#s zekM{r@CE1+!7?cN9~PJgUaW7)NHnd_7@Rzf#*|y0tUW8GKSjnG+A^!-aL4)RV9(0q zwnu{5rQ`T+*Ofif3GLGl;Emq23VC^dEHKw+_hzbV;MS<`c7qi;KJP!xEAe1F|MHw~ zaHU+MP-vX_n+qF)PpQ*2(ROso@Eyy}~K?CYTSuyTM1C7SeuLJ;9V%ST|?AtfSR>QBZGzVlt z6lYZ}e8$uMs3?SmA^YJ27cO{@=>iP-wD&836}o6o z-{ANE&3PpkyDnX~nf&ilBkk-vyKFnVopBrsurunF9Vg#y7}{J3slcIY%gXkBXPim0bGgzuf-4p}{JM!N3V z5Y}QyX_&IRa7(=76Vi^~gT+rX3zZ4)TC!D4B;87yX-* z1C^~Shxyelr_uOGy7|k-&wOi@V=blWJatfd_E<_&AAEH?vt*6EB|Ny@iO&>^t7IL< zb~$w6e&px#FC4+n2ddVHK8-+0XrVt=DQqBWiAM{Olp`%56EDg+o7?sEWwyQbx02UN z3>s7#&bAxN%UO#%2Xl{PJ%&~}nQnyhZTMZ?!olw;dF7Djf8bL-&vrp$H=lTcH_JRG z-69XBt=na2U1t54(fqg{LKWqAy%F(biRvS#c7&5g6d};`Z;nSBOS_Fm+M4!DdjhD) z@^0*pTC=8*Y}B*wj@qm@xk88}X(g_wX=`!WAj&Voj-#z@wZrzHX~2J`<)qjOecR31 zR=*DsG8tPRT4rHxW?%b5e0Od%;&yCj{AuY2*FQ2t2OU_#$c9CsUG$bgEb-XAog5_h zKN?JcO*?J;?)m?3;nb@BqIxw#&agOk`Kv?%Np^Dt; zN2s_)>0>+}xs4><1}nMFlg?z*T|Y1UlW#tBS)&vpHvto za$QH6BRf%}Ti>G9L;iB8XR+?}9OROcR|h#`uI262T+ zyDiq?%w^u>Bg~PE_HLT2Hg1joP_zZ(Cwyx1vDH4dG>pW|u22n$C!bZKCTfl^ z8z8#*YtDz;aI}(G`CY)zVUP8}t6I$<0e@5GiyDO|R%@dH3yEV+x-hx=t+G36GqYud z!pPGg@#HKv=h*gEg(zF%!qCGRnSp;l?O4bpBLvw=jO__>`V|&r2?}mhNz!xG( zmHn{5NBX@M2%s^IhK@35)vQHWApO%JPc|nb zz#RlEf{D>Wp z|Hl^pZFn3E(R1P(d0c@$5BN9o*gYvJNxT8Sbo!$;hPpOi7=r`Y&aXzv$qm?L^P{$?dzm2 z7;={-?cC8c?)ZMxHQrDv8Pt=u$g%-lrqj-@ny%@4=WY=&xNF~RJ2##;6t2>v&h(;5 zKWuac5(sD47q!Plc>(h+vq&qYDQRerg`=TG8z7F2h^a3BZruPYw9Ha`6>PcU%}VsJ zoD{>sVe8p-&X4^Aie9OjzgT<%d6_QUUKFp?90F_TIiW?$xZg9qXd8DZ8vRjQhxyZg z*QsLR)KFy1lD_`9vox``-Id&M_-!zKo^T`3UU&<18r8yzlVX>soWcz?^)Ztt2hV0M zMYhw*6&Xty06Mxa`aKdW_7;9VlaZ>iPg7^8@|zJu>!gGJnVhmrs>kSF`=Q*bYNS*l zmxeIbOj~fzNYSItjgS2_`3YZpBfb+GQTiI`DHme#FeO+BBH=#?gS^NY?lkUB(%vnU z65*9S9sh19z%8}(ElLF_UN-a9<8Ap^IX-t|@B=nHA3o>qMFQ|?`VJkFW|5B2SJb)P zu1-$E)ZiVs4VqmRj7^jG0F$%OuMVb|BCN${lDr8y%98#=cCTJ}WVj;)cW~e;19f`C{S$^wIKfIjez-znWO05Yq59NMR&t;BwF>uD4z2* zK>AXA>vhRv1|?saU`P6%uWblO?6!HEg2=jlQdEJsq@>+ha;ZwTqeo$q{W`D=a5;?p z88ROWj$Bi-30?Pq>zPBb+92%11{pevnvmO<8I8RQx!W5$t~+{MrsAKx)e&T{DNwfBBf+*4;Y83}aRV zZ61yZNKJ=jgxL-$Wtv>gY&I7(J}twi9}%HS(|;x2kLBxJ)d~f9=`K$BAg+)DmXYDG-4{;0d=f zZh*)c^_%;O(~}D$d>VOy-OumvJjjbtd2Ud8x7i3a+@E(`Mpb-)#H{jDL81 z(W0Zx~%)6NrS6L(aZGFYrC`&O65( zdDkioBj*A^Ij~IP=ajBV%7_E=H?|(+^(oo}woPZnKS-aM%Fy7pild56hTd~kwqA=^Pk7!XT#^Va<+MQ0G#Yh zX@cPi!WF`dfWe1GMI-jt{Yy$pnyiw_sv7D|K0X24n>Cu;HKpKI?SKaaz(Y5;@`4@l zUQ6FVUs|dsWcxF-F+N%m5s{owmRnv6^8*Ch=Kp+g=wAwob9e4A&~wO{_aT~5sQF2E zBz%#Ij)q3}`3pSW3k0totuNPYvqAnji-dMtT9%*@-rb+~>3q*l6fj1%$%|(r*% z9gNvGJda2yKQ!Z8`1qplIi)&^JJ05@SH5Rvk`JpHR3lu@!?n6Py#E*LkOI(7F2em( z=UHE1(iq3}3j#?@A`2Q{U0)3!hIHU)5AAy-R*U;DU(}pS&M%rU-adXVw!;XZ(hjwM zH##Z3{lx+6go}~A?SE-K+MJ;I`p+=uTJen;U*++n)cTIR$dUAC6~TA!mx*OOE5Xf> zJsk=}MFcKO!g*q)_x4ElPzi2=4cki=b0dP6KdOa*8@&$paG%g1Gs|WZ{uI?xW1-SJ z%{MHV-T&5L0OZeG%dFNi#byL#dhapf_@o3aYBN#+ub)loScNK?lm!R*odsUKLCc}! zxZFPZWL!pc5CT0gcdmm_kW4aCnn#OHDG*uV}K?g{&)o z@2TMnU5qIxlC05_OA)av(p#;r*Vh2(5EiTU)ROovXELtI=LBc2`?jC_or>_R|5GzJ zep=BJTh9a3X{o{Eth_^V{fhM^W+P#1)?aq% z6j&$2DJVGziD7HZw395r7aKmCX*yZ_!h;e$o;#!+QhupryJ1l@Jkn7n_G1el^>o{m zJ!)`06E*W(#C1&49LNgx*gbpW#}#gG+!{wrWz-r}cU`Ny5efA`5&+amQR(_8yYdHE zxt_0pm76lq!6SNI=vce%Mg4_isv2XCj_mC-r0WO2EU$-v2PNA5F~*t&n&N_1l_r~K z)8{xo?AoflJY-A4+i7*Iw}v#{UF4CyNn0DRpp{sk$iI%qHthqNZ}IV|c@sSqUyRsi z-==so-fXqJR01_d`U1qW=isack2GIfGgYkxPd6moMJZj5Zqarn`v?$Nev*O^~kz*EOh!&3VwHHgiFRmMePizcRU3jitUDh(IUtlG2drVaX=59lxF#*03? zMtB@u9g6@Sa43Q$FuWP29@b(o05bz)h2hj$eX;E+fV1>){(PcFzdPeg!F(C0F%_+6u9~ z2g8onnUgtLr%P5FA24L33R=$;_2jQm*UVI7<4J<|qGd*_!I{Iu`}|^se^WK?ul|gN z3|V9)Bz!)Q)A}#ID;gLbebt*!y{qgg(pMwgNBLHC7!5Bki>}eT>!P$3Zyh0eAyuw@ zBx<8Qm1FL?%BlFtfk-l{@qFxORA7M)bY8>w{K)xpUcJsc^p4lVoh{NniWp@>p5sjA z?}vKhzOjCB3RkP4e1?c=E z{fWF!C3<&@C+cl4T12h*vqR4Gf_j=w7AwmUc-P(8DqR0VL`|@bbcGP{nY&TVteB0t z+r_#snv%bD5u6OrTQ%E4@}c9jWB@j0DB(VznZd9eQM$Onq01o2OxCYs{Fau|jj(H5{1E$S55n)@ zt4@wJV}{>-C!H70Y!asYaOre9@8mYWyE2 z6Tz;?&Ss@>V^1S_4S)5S)?M!aFOLJK1d}ue?WvLJ_wr|H0{Y`UV|g!7((fJjs5QWI z+WlDc4XF~Nn%DZ3K8rZ*@rZu+wS#=v-@kL{*=aem;)T!FUge1Ly42rq-Fo#-skVM^ zMaeB);%Igk0~vqc3F7=a7%cRg z{+s>(t|MswBh~+V2jieyVCG*;me4`_OW$)8K^zJ}FC87%u~=ZGwPL-wNVr*(kAt4x zaI#~^Cq`EceEwXB;mRBO-{Z7@pz-2`WwT$2b)^`v#vTA@!;Tdh8W@-(JVe5uYif!= zek@?!5~QXD0-Y1hDd*2P;*+ERSgS^*-wl@twX*P@!G!`o>GFNH}Ubw$%Z8c1$&EVWv9WcSXPqKd4^%aRnkM>c<^jE$`hBy6!G{32rP^!o# z%1m`%ybv}j9*$#|55GluH^J0W!y+BsneY!Eu3x*>(beU2G11wnMrG^jDir?w#fwl* z}-Fzd5T0vf~oJ{KlAg$Z%veuNF<4jg8Y0c zF7X8if$)zpF?Rv>!tHfcRYAJ-lzwbaRo3I?>7x(n8(G*{Z4hd*(68xYYt*z5zbW!p z>&if1QKRY@=q+vmS^uG*Z&p{0ELh8$rFu(^G`W6se6xUF_0&o-DzSVF}1uF}SbBn7{ zc^_JSLHg##!6vF}B$0Q6EU0e75<=HzvKt0MGi8cHF7S*MCd4ouida{IwAtnS_V@Rx zXlNJ!Cue78r>E3hMuNr|xK(y`cBN(0;nMf_H4c3ZE)!clqQ<30P2lqY0|SGIn~c4b zVwVNY8x%nLFsh%uw&oE7;G?i-e%z-xiN_|h<`y@(6fD_1=V^sLFY>KgtHgfdjksm) zp-RUlZ&R2*n|=OsP<3bACDpt_Fk$HIX^@dV1y#rXg5BR>UOGEZ=RS*MMr;gZB78Rn zr}qr1UVgtMougNpDTheAL%DsstW#35Ts$0;4xDIw$MRQ=VomtN^~#I^R5TLF`K#ky z1L7O$7N64{-TtR?;q3`UrKl`nCsO<^fIX3)%Za2#mz11bduf~-D))x3Q%(0WDr7!jEM;=K6W;CO@m? z8J8JHX$ahx=<6TQzLRVyp2=GvH?si=M);(C)Giy-2+^o8aKs1~%}-wrBI0GM*D{mp zwT-vv^En!7N$&1LH31i~4d`vTUz}@6c8izIUyRfMm2QA9_b8|a#xR}6TDsA6i zC+BkhubjSU(gWU}N?!ouJz-rPNAD?3t-Z{*qSbyHaPT=jnB2#5}*txKr| z-{0?#*xt>+B=P*T=x`$DO2}m|%r_-i{b9kS(jjgQqPvlWWXl?wECpzbaj9@<9WCeR zxJq*xJvW#*?C|CMT^Ms^iD5q~-;N?QvaaNOt`iV&DpyyY?H?V{ zYWj>yMQ9O$^5~MtnI53{V@AloRX=trkBI zY$gvRr9%9}@ejG&aS`WDJ0?X?ne3Llp80Y~8bklQnh0N6A@`XyE&3IMd`rnRhv}v_ z6EfObtEH3^`By@(D5dzhwTUGU{gnlEI2{5)GBYxMbad#Z%lQuOIOC9_SFR)ov1BVL z@bN-p2|gZBV@lFSvRQG1bG2|ScDQl)GY|BgNt1IZ*Q)+o1wO{P!;M1kpcg*pTX4tD z%1h3o&p+^18+&Voy1%&nL*cg5*3pLo1%U7mA& z7@YrPQ07Bui$2cV>Y>3IJW(=wKo3p9+H}iAEcu?6<2TC zK~zjg9k?rJeSigJ3p8=n(kIZ+TZ_qWxwZ1Fv->+qZ3)B?ZLuY#u(wY=p%WobH9XV2r%i1vd}X0 z-!+K1<4dA~xccT<5=GYb6t4rQs=t$Ud@`itfqU|l+4;zlBARsQ=09D4;{$4HD>;O& zwzfN_Vd71g;$oGqCy~40lPu?xfXkk=!y#?Q99W2jaI8qc`s&h^CLkG`B;abK1Uo;H$T2K1|tw#9^-=u2%A(TwCxZ3wG z#mxEOo@sQw(AEw)J^`dTP__W!_Y{g3Gl|YNk31~_29qLOL~a)&VS(^{A0eNmsZ(*@ z`Mo*%K+#u4CS~I;#&1I>>D%%?$uWf`0a%5@xZG5)5qn>2iAb%s|K%3gK#H=bRuSJEv;8ve!lWE-xw)KkT}RihlRc z@d9#Vz9cXwCnQU`V-Gk~J2ySFz{>p(d*Xt{bHH=JpIFq6V_!cme&X{3uJnJC=Br@D zXy(d+Kv??e;NFfz?P7MY8dWZ4JN(ukOorh1R#f_nFX^j3E7JZc?5KO|%A2vzJzv-t z#d>Ff6cMkqwwadN(Tjx&^2>-xOUr#@88+^F9dL9q$w943Fyr{u;)TA-`iM)JMrEP5 zWn;wcUWzwYK1$u1s&4z5E>WmNT5Y#NPz?d?bc(bpF%uKB^P3u+?85nxmRV4*IH)Tu;%os+Pt_vy9n4kjmCpv%|#`r#ebMq5?H7lT^H3 z^8Wz4qdtOo7cMNFhv*VdoS8T?Ze7ezT5^RqOuGwZ!g3ey2KIfjelQ<=d}RpMS_KYK zTo}0=!^|-7>tsFgUbc=Q>Lq>kTM91$10$ZD1@u_4bApzqdwWZr$OpyaC3)Q@m`O1U zR6RB)wQLd>^NEUG{GZ_V1`=PM?dovrL_Hze)U9Qk&T#@3BsW2tS{Mn_X%fD7xOavt}?g+Y#2K7RW(m7_ES`>@pKO54Sqy1 zC=(jvH(!%_O$XV9M1&R_+`BH0Dye8m?paI3MG~>3-*-C0y`v!YSgq^aru?2n%iltZSOi?u>TWIMOR0+2fM%qx=JQVdgGS@Jk3f*E{?C3Z#*iPh+R^# zxPIUfebjo3UuUjz*%RJ91<5xU(2pvANPYW{)-+{rT&FHRrE*Q<*SJ!oB9emW*Mugj zX<4NyL2R@ZQE&=&AgWz zAUw!ET>yQt<^DQ=){3>iGa&5dueEaVsnV!xveIg6_wJP|n~$Itr!Iy%-l^K!E2Y;X z+p%s!BZFs??s* z(kStCf90H)_tEtTKG%+@l3&9$tjlGW4npcO`~qPzlG5WoF4Poh{bVWK{~zAoIx4FD zZy3enQ7iTG5P4OA33j%(3A$1?=-b~#?hR8EQPt(CAB{3z>%+x_P5@?{pfzRSDTX))G64& z*>aek0J(zW6137F#z%hv+?xbku$uNf=*er3g~iT> zbpO5Zx|qN4P74`wU7yMpBdSY^-0MvniVtph(TA$l*~oUl@k0Pxq~tJoV=o?82{;SjI5aBK8npe!rGXN8Kx^A|E()sXvG(+RNLECvC|!jE(~>Wma| zh1t6EO4AtBw}+kqxK4txt5Oizj#;-r?+gWQRI96-yvc{xHX<7=yzTPgz<8chZUDjq zDc&F*o%OnT>^pUJ3TkTCjrz_5Ik>dn!9CClEGzH}9uK<8j9XeMdoUdJK zt)15B{u@72ZDs(tJ~2ht6DG&P2>zz`fr*^1?9P##{FbA+kOpjYmu(cm`R@ zcqyCP7;X+h9|#THT8?Rf0%oN^sRvH+^Dm=Xo&FU5l7fN)HrDd>i8^SZO z=rKIJIrjX5;~93(z{e6}*EAirNj-&N0k(!G(Bj!9v|8ahGboNj*;m1n&lWy;i(jpT zY86k2;_AcTpto|ovBrw z+I#VrwldT57z^=dB8_|{-ILKTYY-3AG9mKt`Yy75LhlZ-wG1E0w8(4q!W++J68Z$S zCxmI*tis-|vGOZim){0l-w4(_(6qlFny(CH3`!Ix#1<#eS>5@pZz26p9v>q5VM(`~Rq$FdMVCSG!O+6R?G$SFt941vG_UI2(C1dvif zO+{5k+B>4P!ud)J@@P2dYg7xvT6mZ^>hBwPZ?yLSU9HToU$r}&Z{L6}%lrK^m}b{V z49{U&jU!_$wf7 za536dcc3KG5vd|2pdZ4x;+7(45c2bmDV_>v2t5T9?H)jLyXA{6MY41K*uyy%`A?J! zcX;vwze&jk$bgX;|}GnwzqkwZGHbmFX7+guHn)+&dM*aq#P*3WkJ&9MV5Apm>hAcUrB$QM-diiO&Io1$q z_UwlK?E8}V?tpjnqR6t@%cJAY0*!S-XgyQEmi;^ea!khqk+n4v3lvL>{7d4{b z6SP-r?8Hx#ZsT1}nQsxAlY(x6RRrGI8@o!PqV6dtu>}c$KIl2@?S6fx#cz27uYLYh z!FBu7!Jy{>5TR_ih-mfon)lg)+SLg^7aRtF(O!6d_8!1LZ>*hksVKW38?OukL4?z7 zHdG_&P#(f-j})BSZ$BM+dpDEW>PImhYlEStoJTCtQVRlXx8n%}Ansm2VO*~)G$P`` z{rkS_9c`_rcOS*b6~Ot1X7@zP@qLAde0us5y~;*E2Cv%}vyR*50k z8dt?Yt0lX2IJeT#x~N-SlhHaDK+f@HX!+l_ zZYx9|VwX&B-afQ0us?-wVbrN_27rFa{yn>Qew&w_lR~*AzQM2he%bY1RS66Rk|wb?Lks8yAN`R$&H(?Y0hcw*?(M z3}x(W4LV&D(oA1py;eC+JM6p|ab}dK;J12jWn`1jNfLmGVdQ$oq1j2)0vKUQv~E;q z8*id|Gd3rv6BJu9KNso7X`IbdCgO9o5&TwKR7x*GhOBuA4a6!bEC0ePSOKh@t@0+P z$)OJ3ni>rz)q;`|uk+r|+~!Ifhq;F#cU6@`uwK1z<*4N8FIaqM&Lr`HMHk-|6JMk9 z7tn~&KhgVJX4!WBe!sX4F>0grjhT*`=>=sfg~V|aJbBN93FRMXjh@271pa z0`x$i24vy{6A!1eUN-e<>tx5-2|B;|4o1jBNO_N^7?veV(dHvV>*uHWl2)sC@z(hO zC~1)7wq`EAJ6=3Ie4xt6z;JLpKR4E(`0dVpF^*`xcd^k=vM06>QO6x{b9wU z#!;7*x3@F9ul)3v#_ht!dMO0e4ZPMqfEeInC*|GOtXOR|$ONPfHVM)lfz!1(KsJ$>qUVatE}wj0J_Lg647jaylE5lW$Hn&Y6W z=9u7Q&gW@ktYVRy)pJZ3I@J^dJjFCa5Wl~Tx=$ivZW|dfZANZ!SYOY0H$0DcskIgY zI48_I)_W1h>8;~eQhTceK_|x(5PyF}j|P2dT|dQ8=9$Np_Gl|Bq;Az`#Ul*xXZ)UE zG68NRqo5En-9J5B>)%*K>6Yd-elfJ;(9pJzj10GF@&(qYF&M-n6j*XuDS2-U>!wYu zmz}-AwYL*FL;Y}X>+V78cS68VqUO*ZHLe;Ts#@+=3Avc|dIUJ5_2s{Wr~S`$FUTCh zYTFNkiQ1rizx<|}_R2iwk`HQ@xd5N)LbW+Knk4t;#BU7jCDlls;?CyjhPk2d?(kaO ztc$IMg`9>%-^yKsijtEy9mn3w!ZdHtwf_pKIE!}9;}c4qXTzTDAD9(zdQMYPhtT)u z(Ks_xi|-9}OP@q08IL=fHMMy!g&K6K|6I~C6a~b$rP)L`q8EERI7s#`9a0bKIxlTG z+yTX*QSa2kI}5Ecs%hOxrT$LRjOg>Hu(ojVt=<{Jz-dbI_Byh)z@N3Mf|(1hwbAuB~0S0EUkZ@r^8mB7PKjL?xN}>XKix(7*1ZQ92T0) zN5?KOBvkLepFdwZEH~0M9H<&tbpx<@0(L5JawvT3s<7Ky!9!l9ZZ_h575R2-UFz)AFP^Y%+E6 zEt3jplPH`~nc@i=&4!1E>jcQ#{c;gR7c{yNYr6C0j|9XEuv-F%GAyj*f}D-*g}}JT z4&vA!NlK@~`qzVf&UzA{x#VEToLm6Sx# zbOoHBijAYRqS(e~a9yfYMtyYOLb|h7GFRejCB?-O`pm1abdPf+x-%yGFU?iF$PtQ* zFM+=R%QO7^TqeJ-n<;R7$Dt1JmjNNkCBIn<805Q@btNUU&iz)JuDjwQ&qY|G8FJHP zwSZPJwCUfNVAWAx227Q6nTa@!2-=rrT5$g+ zX0e}EeCrejJ6T1yp#mRV`!}K!(Ea{LwY^qmp-i}QKmQCcxrLf*3@95iTCj5r# zTMorV5u_j<9-+Ae6{CzdfTl3JO3aazM(`3uxakR{?(fgt;+%h7NLeYdmMkRTrsrn) z!897Z)(y6z=?b8Eh)M%-pG;nw74dxPIOh8(j;C8vxswRev9EnEY2BE7f{i zexAnHky?dNPQTm<%iGLfj_y@?a0S~2_c5wa-NegSrvDW7=xx!%_RZ}wV8aGb!p2W3 ztc4=|WD+LiZVPxccq-o43T>g;8R>J;;=R+FZJ&ID~{=v#}j!;^WSL ziW?%VYWz>J?0^jjiI1l$i{jy^E4qKkL>P9rhT$QDUPoc-c*2_^AL<|? zp;D3(yCCmtp3S)$DjVDpf)Z};vgR_#Hqe0r`%(sP24Hr-Z6*>Kt?Yi7_iZ~wUR-f< zaMZG#<_p`O7%9B#H5rn=okDZr6P(;#NiUOAbRJd2JndP3SxSn3Bov<9&D63(=#1}} z{tP&%hSF`@a);1qNnx-O?c*6g;X@M{C?D6)BBvOKhB!+}F9Q*}hETvLR9OW;S>AdE zxl>_=K3{!XWGwm#!a6|ti=8BhXh{w{_dVxTT-`n0>LWQ*1BPplWwUEJ^~?QRcVp{_uRSy1(DQqKt~MQkkx*gW zHa_|67Fz1h=XeY5&4$zm#D+E^&2ENKecctA@jv?jQ_hsGEOpjSI>T2)_qr2kGH zZ8TeB zveAfjX}5}BN4S?QbZ)BQKjP6Bnj;KFL9!Ue_#W$ZYl27Mn*S{I^-W_)O^?5xmJQxpr)TgE zwwL2nYv?$MB-|jiLT~;P$`OSE!5#rp3i&W}@o|4s`e>*@viYKb`D2Y1ea4oC|E&>N*#z`Gp$A z;TnA!%8{nQX;Vg9ZrZjPX)>c+iX%t^?2M6qb{k~E@LZ1{$9l{z<$ueB{ze|Axw4E>^@N^s_P z6-(K$oVJp}UBX&712HsUuAPmh6Kao7PXmAAkRNg7KGzLv+<}iyEWzAp1~`iBF0e=6 z83(|f#OFP?&NQz?S&@=z)LT!ohbIpwH=OQg4sYps66g`!qjM3m@2;U3aAYWfzEEv} z&`iHAKG0}hivhbil8iMGl;83maJ{t(2jGJBZoT0Q4yimjJ-uK*q7O7@bw6= z-nZNpuDZU}J=TsL{O0bOc6~_X=<=WRfT-gVGBjTbUokpw_<86*2Yu9$H&)R8aG)(5 z!^uo8?odsiond9+q(kY+_p2%bVI!#Ncl^Q{cIM)mraW@L=;4a?1NjHm4DdXU?%~av zi~Dezq#>;5x#lb&HgIP{C5wBuZEZAKM-iO-W;pcHqt+Pz$k3B_`G~&Mzopg0PMvaL zXrMlEO>S7wJc5wmp+&au!Db>oRS5lqQd^?Z+nB|7&tdpEYHq@Jz<&ff{igg=-+O#EinBb}r)B?svX<*YnJMgF)8P;ws_h_%+K% zm`s)8IKjKoj0VnoZ1(2=N(78W3nSsb^n3IFDFgj41;*yTe0WKItv#;SDJQg!czsIW zuC8S`GcT8oRV4wo=;G?CVCw*@gyo8Tm_j*u^Do9Mdlo*Qn(@Tjl#9-J5mHx$HxxJw zrM_%~6|A{5l1QtaaXB`b=5Jy&47xU4dW(qTO{KBq z?W2jX(mQm8KEwKU;CNCgN@M01q3F2#|eEjgG)h)^ip+$jwid!GH{T-Hd^O z0W}%fxW+0c%*oW$)WhSHWiY?7aoUED@&WVIMr?e%jEsz%OHpH^P`He7h0E5*`uUfv ztoI2CPf+%W%$b#yuV20Tk?p-+w(1~Y!>8xq;NZ>?+q$*FB;L?k+}a9>W;`$3c{`7= zU2hu8zfQZhEUMlwfPAwAgptgLZ?Ewb+3|)8tGhJ_VSHA6?ux&uK+GGgM{=i)9Y@& z@eQKg6g<3T_S&4q-!$9|&pP!AJ07X3HvE_&15$**5_+^2ks0Hg(6VOO1fnf1R=686 zWWl58d?Mc9S=a}2kK@DH=w)x8i#T7X-U3r60X`A1PKCRvCCw`vQu#Uk4IeLk>s@2M z{iT8QY;QpEIG!4NQQr{qj%L2u#BcM5HGX)x>!khVUQ6a9M;yN&a(>)D#=yW!8poAx zYUl5=)L@UkXgEu+e21K>qpQmk`AOyAiQ^*n&h=86pm-Yh#IClC^>;|+-&n`f!?A_0 zFtWDAr%Gc52w#WeaAg)?=iZh(S4A>q zx2#WMD=KB%V1j_6O~5>T0M+a_6l4{Q-jWn%7wW`}<`I5dM_D=?wL4nxbHmWC+>g%< z`7J)_MWqZc9NxRr>eN1&CrJB((?{Ibxn6K#^W*X+G+fo* zU^RBGID+a@#Mv9O@cXQ=^YzQn^!bXcLTm^Feor?eeN3X5sg}aiAQ(@^&sjoOc zua1ugCJ0if7N0@ubc{`O&p6ZdiLb!UY|q{NX*8(vw7KEMTAYEk${FgPIzNL5$DW}i zD=I!Zsi3nuz5BsW*y*~DF*}Z!^(pzcA9}D2Y$tD8M)xkNEdhwZ<<|XYLI@{FOd!G* z%|!H*7FSz|Q_)0ihG%LJ<bV91+CrBVQI(YC)9$1WvUIOe$HxxXrQ3>FNuemBxJmr`~$m7 zehhF03LZMXqn(;``0DWljO~J^}!{V zLS0EFcxaQ43MN)}@}oY02&@K~Y&Fuh?D*tpzQwD%x7Djpdi>>h6=?MM zz*J1M1Q5sw{qkobw}h&>sOA+MwM=>UhxC-!D@8Yq?{5{)Pqlsc6&0wlbnX}5(2`NR z-`h)m`0!h^`CNi0FKSc!Ra@P_kt2h*0?*?Xg3E=eO2r@CriRJ4Z*`wb0K^OG`24lrT)>aS>fb@hGASzAVE@DKD%rh7 zY--$fdlf9Sw6l#o?rn;0YvZv1!W!&`f~Lmbmh#nZhU?15fWepY-LjI#%=!q$ej0 z;Q)dTtvu<{3H0k%)FwgIfVJH$R{tPA-V9s+NJ zD3m+_*xjyrK!wHyG=dx3D0}j1br#v_mO$o{(jq)gaad=ln(&Y7)T*RTl8XhkZLU*u zeH`r$-q369MY`e=1+%k=TmE$$1TrJW%LUy3%dh%xGbwxDJ=hoDxo%siU}7VPDErG1 z^%$r8oeE~`ZtEeHd~|m>MPl+3)}R9WADo7DEtwrOWE4EseR9x2>ugZzOf_?PhSVK8 z)=C(vbt9z8S8!1j{~-qUyR_80erKdgNv3lTUL>a%AID4SPD-Zzgy5VzFYEzepEkr6 z-;QXpTA19?NvE+!z=b18;}oMwXeqf&XJ3WO?7PW8pD_sgU!<`~tMxN=#yWP=clxf2 z<%H0;f*T>xIR|S>`)(Z2PCNIKsrsgz67~GiG+tX5sYKQ0X@c5rtu1%H$!&?R!Y{^ND%E8p z;@QA8rpS`Ly^2Q?UyY?vTYTs!(*{+A*~v$umBg&<<&Y-Fx&fpG&pMF3Fo@O#7w*gx zlErD3%vY+$n?hCieT{T=np2a!Id5i##h ztbSVsd`Xv!$c+qo2sVKW@l29S1qFvujJr>^k5%q(E{*h^PW}d+1VVak=ki29ek6+-CL$-M3)+qP zZzN5bo(=K^#H>0r{*(-44yT@Fer|_2hkkQZGmFVY9gi;~x8e;zFuzGwR+LlIgzYrt zd)||fhlKa4@6eI4&+~Y9Ck}UB*iU)BVq<*KZgu<_-sEKmzH*!TQn(zfOe4(5A~t<6 zBM*z)yuvPwAoQ5SpNja6J(GWo|N7vZv8N_k5~kTC#FYxPOt&q~a$$b6zfh158{TsD zYTV2A~h|+l#G`{7iK7oU!c6bK+}en=iib_oRvU)>P1O)jJg)sMS3N{M)(% zunF5bej!sZ4R^D@lZ2A?N>ZFNkL^2qTGje+VkONyXo}&AU?!&^ofo=$?z*rKhssvd zGN`jVNOOiKzX+Oaz`fy5BIGqdgevo)Gusi{v)RVMgp<__*!ui&+v)6Ki#}HC%`MwerabCCL0uj7M`VvZ z#;b=VzNXjhh=VklpT2rnc_}WQdSCZhvn%4@?mfl@yYb99))n3K!lM~ zqkftkWiS!svblJ|Dgkw$6#+0l!1DR@03o=rnZ?jCPU-?xnt;qg1=QxZOq9BS+0Pei zwTnU{Jl(c?DFCj(4n2aWo01}!vc=dK-`yGJ z|IXr6ysp7D+bcw`xHNnwQpuk&;sfS?eB7Kqk1ymK$PA`A`NSi2*|&X zqUqB~IXbCGx%%gEmJ|GwDXoXP?0H@(qEhqY-@0bp%ppF5nt_lBTh@`l`Z*`JoncGj zk%&-j#2A#zbmefUT3Xz0Ha*JyDz!HkrIq4FCBSc%71@>sP<$<>H`>$_S>o6uis)8A z3ny}0>9pmXT7ct)9gN>2`0QrH-A?f~{!S>L-VR?INb@ME_vtNSKY*vcvXz)7WaX!2 z~lG=nR!!P$gv#l1_L0I z=G#4aGs!bet|^!Zc@B^TKoHGG5W~WFgLqDxo9k={-Xq{=_z@kmPzKr&;|hqadcXR) zxXnZ3w7$*8ec%;S47Yi-dXmja-}92kfof;IolQI1yDGP+o4XrMB>3ns| zVt2d!95zog#Y<+h5LVR`1Gk)+>yjml3;8C9BfS?>e9moVMrAN7lf@h&%YFCF09GxT z`k{A+F4>hbWQ|bTlFZUj%ELj$Z*dihAF9Zzmu5c9@(@L%tQ>|lJuFE3?!YRPR-0Ab z##f>Cfpy$g+~b8IXn1lSP@2Mmba`j0LNpy8Z!BiMmH4{*BjXhED4G$dOtspw`MG8Y ze~XPSYw#G4b(E|_4~py*@_}A5y|jT11~#3TPatM$puTql%zxx077(X(VxGn^(6dci z49Q9ddC*LZ^Ck|+)XlWGEvL<1(wExn*G)=+Vn_BjJFw9lP;rAhrW03^J-lBrq(Ch5 zffp2Ew0~KG2D1$RN*P*g{&@esX@wQJiFWzUZc1R2AvT zXEVqDVJw4K^a6H&9=SF*5#enLW?|zHcit>GfTyL#IUnk%c^;VSDd%_}2YNrGN)z<# zLXZzoynbbhUG+t;4p|k6?$wjGep^1;dC&LMRkxH;Uh;NMY&LaGT-ROpz;Yo4lEJbeGE?))6E|CX*1GLlb2p&($LgZd#7{0 zsLh&CiUjFGT3n9Cmnl3R$1rZx-6WC!U73Zj;7I1@6{I@{WL|D@or@hP|F;zvxW7BG z;FbJimTwiNq`W=67P{o}(SDw&=e^D*Q@JTa9g=5--?${c{@#5b&WONbv^uYG%o4Fx zIgKPg%sA1F&S_=Y3qH6fZGF+POyMmCjy{~ZcTfIz$m}<7baZ7A+WWQmr4_2oH~5&g zf3D%=-Tz?Ms5mRYCiux0pt0r#Q`EKxlp!w{hr*@T_{bi9wdg_1RXRtpwD|0mg6k$% zWY&vZ6e3jH?rOIQ$^^{_N=`gKK`>+Jn`Dc2HV&51E@8WXBM z!ute|B^ZCnu2Hc#2^qK^)sF1Hgx{%=-y429bxY!F*!E>?*D~iRCrhz9$%iUoAo6bl zF0}u#b=2rrxYvn)!cknXbD3(rW$PxpUCx|;>i2UXPJ7&gWBy%|o0Ei#ncGJqdj7T- zB0TH$v;##&TT~D8OJ2x^Du@QEBF6ZnWWPi_Mb29cdE4E;Mb}k^or*)ajxy2sE1Nd? zoE@hBZw}k#!fY@E-j`$h9 zNbhnzH!%CfVhp4(MtC)fapN3j=G|B_nYf!2BisE8urY4~sSQ*dZ)J%IHHV!1DGG6X z4#)kFk;@;g#l@uVr^N7lVdRF{w6fEuq@m`QS29AtLGp?Eu zH>~F4;;@~aKG-ws9~Ods1vN}{oyhIYMP58p>4sux0{bW zO|RWP3gi4f$vQF`DXA7aAUvWh(-~}728523zfp=?W%OD4o*nfMvg%h_g%YX14>;>5 zn~|Y>U3uUfL1M*2QT&U?%L7*i`ysg<9)Ys1^BxSaUM{*}pY+;qz351I&Q6ex$Kkwd zag%v_MA>5Y_s3%X?Y@4F?>r;bcP-nnNF>et?CphNs|3VxYX(8<0mL2|1pyl{%d0DC zt^=y&*WKelD?k>yZhVmO4klt=5pD{*R3xNVU7OQ*!!J7J0fjQ~!MM=K0{i8O`>M?Cc{} z85Gb^1+4#@{N{iA;s2ek_&>~lvF0fq7=2t&VJe%07s+=MI%X0=zCvKA08Q7~Y z*Ut(lhl!;gbn9Wz(|@w883%s?NxO74HLmw*d|bLq&VWkw>V=M;qGD?|G_nc!Er_VR z`FJ&b$M4OZ3VZ+aBYy0Mk+CUq11I!8sdW%hcz6WxP^9b0O;xd@%N0v=LqAkFKB1YH z*=c7q>iTP4ELG*r=kc~P?)T_c2ijcrtE-?Y`9w=loS%T%Wj|2L)~&Y%q&F8_|71*k zev7AJ*CJus>B9ayvAx88`mLLW<;}=q?d{Yl^E-4*Dpc;s24~inFERC7<+pCh+BaWq zE-Yl+A{6s_Cfdo3uC*0bfb}seQziHcob2VNkxSShE76&sRfT{|6h~7*PW2(&AN&ps z=Cz&9>F)0Ky%_yWG*gQvkx)wKoASP%C9z=o?^dw>*im;wf1jhc1f|qhpgWGI4tAO* zUBI@2h!{q`3?_=1qKbf8<0E&Z za%!>VZD6(_oztP4?w5PxKxKmWcoH|T*L+ndThL^!FOWx>Z84u;czZL8o}sy}8^9YR z@8HkO*wXx8YRx-)>&9@A^GWVBxesa;Yi}(qzB0;7 zd~FX1$jUMT$15r*d?u3rc30x7r3SNdije%BMYpD#H*eP3&kI^f=^AGT5(8=Kfb{I^ z^!oy9s>+(={d5I+6|c2{1a>l5KR4X=sw7_>CeHvcRCzkr z*9%%M9 z-Fh%u*v*q>-nGY;B3x5LuL)=hNFTSiu_C6Rcp0Q~h>Zq%UbxMae2;4C#4eU7^GB1C zTrCir=~q4zXmSG&NHMoKX10M9RCd-DoSrD?yczwRm4Z5=Y3CIB=Yfg|rI$;^_AxQU zG0~43{n&w2qYwG=b>V@>=rMIun_hL-0T8K}bH}9XtE^SQv8?R2UlCSE)lYeWIlRt; z9GvAk6;{d~9+PcXXD(7wr!yG8ALf{klx0nu`!Ein;r^aTO6*YJ$y4QS&eltg*DsgO z%xMV;2p&lQeLCashk$k$Go|IO>mn8mWA3l_WVVwDS^_!tHWQ{m;4Wat5gXnHbet|U z*|!OK4B^?Y0U~86={kb&=fwlKXn=YV6UbTrh4+{-6NT%t0(~$rhXm-3*q*BUupIB_ z>n(o#d;U+1FW|({^xv$H3N4TXa{M!w0l4IUCPM!YB@1vDpcLc(Ls9j=cSDuB&B>eh zfmznen3SuMqM|h3i_2BQWZ}f98lZ^CZlF9VIe9u#{A}bvfRoez>MUW##?AhDVA=5= zvtb0(p}YQDl?cwReuI$N%5ww7zdc)1hhRUJq5(P%?OXMH^mjWW#mh@eh0nrN2R3=d zP0eWbMf?u;%&#u4dXRm8vK#@m8_m!+dPqo81^QhfqkQ&-6!KM-VH0|5i}Dz)%KudP z?3OI?((<&e|0@RPlQQ4YeC3@m6XBA^ywzpZ)_Q;?f`}?AhJj8pzN)E}I3)+CkOVR9 zgtM6MIqiNLS!VNdb{EcT>DZIDxly~S`FTH$bR>&i-37_$1yD<8u9E)v$rFc=13|%J z5RS)g`?nwV{0`lqxP4mP$TcwWG7MVvs4v}SDWHIe#UMQC|YIhfyf zI=0~V*IY&IS*HV6TYgBZ(NQSQXJEs{cCy;E_at2$C<={cthJk)DmTRR(41WqA-1lt z=fb(UriCoMgrXjXMn;!?TGrYn`mFLJWpm!y^b9oKhnPLb7U0Dc=y`i=y-|4QV*SFU zvt7%X5SCr>$ZdTo9S)`%uf_ghUj zA531fJR4yxPe{;yK>d2RYzccF3sS zm~P7O?&Vb{|{x*3$jaE)9di?mN`} z^+%t{4GnMoyOBJ_2o~?rGw;Cxog$g*2hl$U*UVy92*e(_ofr_c1$trW) z7S3<4LiWn8YHHpWvkd62Ca+&vU~?t^4HV9UY3hd~YyePyomueiu%~Bz#rF5;#!C#^ zeAjkV#l0?I@T-)xG&Ozwk}4m;9hV$8e}b7XU(8ko=B~70S7F0yYB0Z3 zr>@;hWiV=GRdoMUJk4Xf1Hnp0Kr6P5yrA9hg27;&of2&q=h^r>7Y7WHV(dW$1tsS_ z+&G_&U-=1Fre2T!Qw!jOlXh_#t3?ZIwKWQ8{eq=gzYO=}iKpTKA4|xt9V~|+yjtw` z+|&Jz_k`!!bw^xSjGR^Sw^aSlW*QFQkQSq1K%+aKwA|l5mI>~3JQ2Om(RBE!rr0mh zcl9Ztc|`4sPLQ7LA|jV9?vSRPWL98`K(49pMNXN{vGTlFA+xRp(C)-c+k)-zF84p* z&<2h!@fDxeZ)w_^!*CzFmH_eTxHfcNEZVmkH1FgS&^F_`Pv(7-q0oc9e8Vf$j`(0I z*HKy%?sS$rk{7;N=-&*aX%g7aHlh56ez;E6aa?mRF>WKDfV1WF(0$%V-@pJnccKUo zdE1$tlG518yx%@>sc)Udx2zY`zP5h~Zr=6E!l`Gx3aU*VW->?k%F5YTS<4Fx_w;*7 z$;rJJ-h5djp*%8!i!m@V>fHIjmxA8(vBWGn*NwieLZO-Ab zt40^p@gAtW<`nR%R>h2wr+NPzEkRWS3Rq+HIX_6@JS}2lq8brZq>IVdO;%nE$o4~Ig*O5>u@6`_~Fw@x1VI8zqs+~y1tQl z0oEli1PfGam3@$q(+nSEP{Ql}d*QKEH^1L}(Qu%D1+}t9Fe!hQ2LK>&3 zshO9@Bo4Ga+Lr%Q#+Uz7w%9mp**xU3-sh+ztOT&Dy{^I{BeyJE`!o1GXnt2-?ibsa z=+|)2i?Gqt>&Kg_HgAkbw?Nih1U?hRFo%mf28Dj7zl6MRR9J<_(-Idb}+$8!+1gJy77Lm zoR4QiMf`=JgGEJF2`~gJUu~hXl9JL)==hfZMNYa!rrBtDN}USEMF=QcV%OgVj?|A^ z*#CI*e9mpDGBxnB=yV>ISUVK;Lw7SsfR^h(F`Zv1{syi5*MD^EzLq_9u3 z1l6PRtPOq9rPgIQ109Rs0Jm}*pU2i}6J1L?ARm;CsHnhZ0d3tjG+gUE#uqX*T)iWv ztgV;ZqVQ*i1Ox;L5Xa?oOe1zBzSVJbd_b?(e}7TWtZJkEV;D~FREjdZym@JfwYQ|%=!xqeDJn|3vMi}wtqjuOQqKm(RJ6D zS>=hI;r#9-F}(F`+}j=Zjr(__{Civ>!aIR4(!!-X;A&JzDBWM=0uHz(9)sK5K}7zI z7au`0Qc^*YPs9#U32Bxzv(2U#!^UmCZz8B!l@uvwzuiBQQwqcNXxujiU#-V*(&(O! z1!G!}o7GW|76CH^uy%up2>4R6hZhC$4+JtZJC2Ty00-s94G>*d6vHi`H45gr*2b`e z-=$+CQv?hG;N>~fkdR+Cg9F0qhVw)FEYfNw;IhI(Earl?jw={2irp3&RGaiUtOF45 zc|24wR)Xm5Dl@+}k13=tK43T;l%7CN*R0cWwKYL;v9Wy66sDj=?u#%?tD(~?2F3U| zpu7B)2-}!5ySZXgQgB(rPVMF=I}NadF=UoL1pJbo3` zq~)4Z3vD}Gy2a%VTcmOs_c?PmFF6Q>hAJZc)&leH^XYlL?_eS zx(?@6gR%EjypgI;#NGPWACc?39Pv)z?AC|g+V+3gnXTFm4+k7~7r26*mOor{US z$DjFUFMEp18*P9lEoR;G(mMSUEFo-A;Gh|3Cu+tZn?3~ws*L@41zUgyqwBhv!$sx2 z;KOj+wttJO7YG1{>TKuFxIBPA-e~{vm9IJFf0nBM@A*gVxGMLF4{9s^RPEy2O|X%< z=LGkjyk`z!U!6)bPjhtZ!H67e3ml0wH8ss>sFA$u$ZC2^5kCh#!+v~ro9P*{)i4q+ zS}%M6#q_g@!CNs0XF%on3y%Lx-2yy<`tSc1*#nYrN#Z}n^>}z8_y03V^8cR;7EjWy zK?SUKe<`C{9(L_CX4EN0GzNG3i=1@VX3@Q{F=>>`og^iWHGwoBtx=^A_~Gk^CpTdC zK7R@kr2jKP5x6?Q{(02i2g_)EmXj9d{qD20aE2OR9$cG;|C_me8AQrGV1ynZNe zhUz@%IuPmUMN#E5K7OqPMxGE#{AWU0dz}OisLUx>Une=orbmhgbmmB9_$*GV{o{W@ z%O|GGh9#?FKb{r!xGL9_H(7~EmgiV)%OlW?N;KfYHz>x4UgsF^nb9;6$%{Gi!B z@LyowRo;Im0HW*L6*7KwMJsn}mhHbVGynHn#a}Nvx56B@@zrne|G&e=e*+iqO>RtT z^3}p{=&VRDbDgHvqlv-|lZzObm_x=2I!kj%*E{MLwbb~b^ z%!u(8qC%0@a9(!a8<+}mz1}sftjdcqQ!vo8vme1(xB?aK*BFb}9`>i=M+RC6%=nQlixTWxMF>Bj7R~zH zFruyOIXQGACU0=M-Y+gYa88@xpDpfMCS9G(r1b*d`>WNX=cn6~;(TJ?oa}!L zNb0?d!oLD4rH+uY(VSYOd-;mpIlU+4qN+pX)5y6unwRwHq#mQJRv%y6_Rx&A&8tj59bK3$^ruO2r4`U03kxW^q~g4jORBaDgF z3qHnjF{s*N$Gi*=IOS!_Yo&O6R{s9m+3C zZav=nz;A!tl6ky_+w^#8<*NMj|KjegquScOcHzotDNw^5iaQi{XiI=ntVnQaai>Ud zDW$j-4H}AT2=3D2PLU8i#U((1KybMH&N+R*asRpF-tYbE-aRrHWQ^>+*IIk-Ip>=5 zna?~@if|ix@_EXIkL(9D_HY1@^inRGX9~3(-^Q(nT>1a{(Y~!|XiuP1Y%$|eK==APM ziFNh((_uM>?R9I*rC+A~$EBS9$7O4#sQH%OvWbskV`SjV?X7j&mC5f{4MwrmUOCH) z{Ut%zGn%xiT*ulHtdPM;sw+PmI!GsM^s!{!Z^X!Psl=Qp+-BBqJdIQR0p0w*1Cl(N zAWo3p&x9Hdwc5qOcL{#%~S!K>w*LHy_+^G0f{~V zh(#+7C`)<9c&;n>8Uub@9OvgV7xzJo;GmeSJ}d0yUe$;GFyl<|Sp8Flc8>7EI+LiC zHkVnN)>+lGm$s*UxV%Ac+FbrYZhw9kt}cA)@G9ZVaT{4mn7}asS5wQXE;-AVic6CY^Vl) zz0#;XQ$#%jlk~i}X)#+iZ%GML6O*VN?OVakc-1*H`-YP2`uC|x5M7UhMEx(#^nRa9 z52SR!nZ?0lP7OlKZpo(8(XSVQV!ha-dcse*ti31XKH|nBVYN?c*ZS39_NiXItk=Kd z4r<>$%pd;@yuyL`8~-Sx6l>bH3YBbcwTcP&cC?fI)7^e6bc$;}RY^?B!_6>0k^LJn zU~xgruL$O~im}#av^7Xxb>(FcGiXur;?x%&(_z4&}erHI``#L`>+~^Up*)fYn z1N0hWr;c{3dt}l9+vn#TVsX;FVCf_Oy7Ot7%xIZIUPQfu8Gz~6FThQk)rsk_79}FpmQdz9IDidpUN%&4vQ-Ffz zzEOy1Y7_zK4f^rc1kN*lA<9~4VfS-_%5_=?BN1-QK{Unsd*++|Rs{_VEd-8_E{pd| zPo8S7m)RfQvBZjnUOw0Q_P5LV>cJA`8M>k6-HccE>*ZOT;)50!=qyjQ0VUNy0_imf z9RbXokW!uu3j=4&x}J^d2+t|#l(LMrx$SOYd)d_q15@+$ZiIoYQNfQ1zzJ0s^VN*6 zDf(Tq8qTlO5+BVd=73m)65DT zVW6mC!_1+hL^g?`n{lO&P}1@#(`8pP$N5LYf+bV8>L1{HJ{XGVfN$58SsD}XuYQ$j zIu#6J#5-ssDY4xf8MReRYw}&jO|P0REWFZO1!OPQchr^{2-p1% zx+<41YMRzG|5P$LnGcOjW@2V}$tF!N%RpALnXWhWNpSM{^CU@pjd5XqSEyw<>;G!LIhWRwp47^_pW(#ar(V0n@rJL}(hF}voY(5ppsP?b{M+ky#?lxnaJ z3LwRWHeLH+oHrv4sG1EPH5^HxJY*8puQNgTBRzvjM)EuDSEqp|2?jSuWgY7e?Twrn zD$TD_BzM-6p5u;gU)JmmBxx2pW*Lklt8E;jiwbe6*OL7=5e;rO!`(O1xQ7b@U9aEz z8h;=yseC(Xh7=PxsvsD<_%Y&yivc zpC)qcry8z0INMI>&b_iA8frmGqV;ZrvRl18)6q^bJz;OH3og>3n|6ol{TP*mjZ8EB zt4f=>#U$B`&bp{{5B4}Sw-!>v8L=O)^T*~R$;x@{F1*A@vXajuawiAzAJ!jP&lSmK zedL76zq@_t5s`x*RG?guX;l>5_)6T;(!#2$hNkuzS|4mIw6#12()7|IR&mD;ObjID z0dgef356r)$*=$M8KgtGxXevr#y0o%R!Z>hIbOg#^?yVj>5H*%eC@d)eNJ%Tr6|JS z$!R5^An$TDxge&tdYq2XA8$>=A!@e<-{f;aPQP##(p?f|Pv*N`1)OVvh9BLm=mG?b zJy6CcWUkuQw#~k8J3neW`Js5jo}{_GTx~3w+2ny=P~=0~(vHLr2ush*NmuRdu>B8@BhwP)3@il%f|BcJ2>FtGHJnD3ZgOW*qv4R~=~E^Pv_`-ZwN zkID87@L^J}yRtRhb@}%>OR%280`iuDAT^5+yWCwnQMuG6-S5KC_Clih^XPutdirQW z#T4&~xE{NJ`MBeGNkE#sqOO^lF?MHt7a&%dMyV%K$J3|?IFuCP>)beBe3ppi;}~Jk zlQJ{oBTC8icOLtSyie7LC=+wpB~^-6qi(Wxl5ccxuCsiTJTEmbSoffnP#a@yLvKoc zVR<|ZmU*=9>guADkz|k+cns2I*gX&OnVN0QbQ{*586RN7PrpW#o~O`z?&p0N+geoYpT5SyC>@p~504xTib(RB}~lT7C?@>`_68?Da2J27rBC5v;TjkHE?N8wlibhkyXL76eLkjR7P;l%i_ zDHXn%X-{^bU4T5hBEwGy{=Qnt#nnwQ*)Cf4wxm{NsmW>mw_W$FESanhl(UVldwzvp^XWWX!{rf`sR=9?=3SY)Y%6F1|&TW$zY0M@CCnNmV zHJo4&euoukA9W0?d|tNk1fWHXTHy}A4=m;?{ciL#Rz zdr|3hbqxI!0vDMKkW%xz@0T3burpK^4_7f zG?hlAEMX2KP}s21!9i9F3qAryZEeej%a(gNi2ApXELLUrW}wRNg%vKsDDEnu^II@UYyd`91|kzL&8^O58pV~Is6<72kV z@$M4#iJ;G5*5&G)370RXuA=fASMe{Uc^TOu&8q8H+js#WV@+O8K4+uLWkXn^5?-4MDKUMNgN&+V&BqaAI zNcR$CWyUeyw%Q;jfwEKSHc>n$$kN!Jp{MatTZCGeT{p#XRqP3(W7VOy(>8{5d(vA~ zU&F%SQ}B-z3|?;x85DrJ3_N4#A!vo~RE=?AlfL*Ymqmq8fw7oa$DWy-4g+cgf21ah zn)Y;aEP?f8ltz4$W~0?>cKp1a6jw>=NGGmWuD8Em{uNVfbog3W7!WbZcBV#Bnx8w& z-(`JW1NTuW<@K~JsVkU0!SC~AU?|9tZsx!~UEevIT(uv6DFk13Q~)UTD~I3O;joB- z56VNz54tE*Zw>CpxJnlnwjJx3@USGjC~oDpHq8c6%FdksfE{ir6c!%2>1%6>T?*2_ zRCDLlazyrZMKDvSN#;)FD`Xl!>^A8lk4r20ri=1^@)W4pa?LO!!|&J`_?;UoRELF{ zs&6BNAS+?I+V5)uzi+0~fJr3mT9HO1o!Ih+kf*@e5S$S#uf-$NQsMF&1(0)ivF{#u zrsK2yc-sZws8i1DX!jY6csqsaky*UPco}ec+>560WR@d5j8$XYqf|%kWVqfyUNM-N z!RWrjYh~|4P8Md9g*PUetV+ZgX%L2fw)bN~=c@Q>9@a+A9FuBiXKuq`jXY= zi&+oVZ+<7!j4szu&iRXnkz<`iAxd=t;+H0tZfEI@^wQUQFklVG6fs-Az4qJ~VEid| zc)2MM$r=L@1sz7%g-2EBuXuZN^+RYDT%^?HyR2ju4(HT%=R9cIIBQn*P0s4U?lyDT zAh3+1o$$8!hn+9MG7|XVr}H&BXIuGn=cRp+9X(fm{wy#cQ@>i~{X3?bl3nbS?0X7m zQ?yYMxio4!rghZy)@}P_^V$ify4%d#bTBr{$AQ;JEA=EYOz}Kf&tEJsHM91#JC{{1 z_V;Q$1W`@W}#qAu^!Qb`F4$mXCe z4**@y32uy~e{vXXYVj#PAnHWXhPsZiE@*xN0t$~_I(7*XKrmOdyJZ&@V@HPOH zprJUi(^~hAL0(o<<;CEzg;uTLWR2jYpsu2~_TAp+1mSL=qm;6gZK;4I>;3npRUb!GL%9*4m$d8rOGE%mn};BZXcK{gXK0l~3)$q<5v z;hxGlIm!;bfcg;nd4Jhx?C0w3_kzG3#h0x-=yB7og%>dAiJaL!4}CI(1c(cIS*-@i zuSl=b4ZvkgL?smC)U!sMf!d{R*E+jt5Ls8{p4P&6t+3D@G}Szg10CAni&6&hH>gzbMzf zMwHJL@EBMN_bQy&-wP*2B?b>`CwleZfmeo(j+CJucBL&L7lslSgW`J#5!f%_Jmy z^MFFT`>nU!`UM%hn`VU>Bm`~Os!f?-1RahMJ<2LWFNzn~{Op!HoM_{atcNZS6zZvho;O@N+PG zO$Fj|vfeqcyqvN%>ez>)3cjw9voanojlq{>B;`yH}DtiID10PqC&;u#P5>XLchEwPk}CPKSYXJ=s&`R*0q-k>q+nN#L;u{#NT z{_E-EY{lWHxx&ev`W0~jL5myUU`tfw!gfn zJRlERtX&_{S^d38%}GC`3mD3s1&1_?o*;hu^*Z_6N|_(iL8ICZbGtS@l?_D-6D)Ru zYa?}>nny**Yd^v7_%JgtWc%HC4Td)Nx1N-rUzmS$ETsrganRIyTc(dfw38mWd4v2W zOy)*dbg>!L=B9qpux5kX45eYEn{>`U93@4>y4-43APA!sndSrn-zd_+!{+6j(b?Iq zg61T2t5HVrDuaXA4h|W(C=5P z2Hff;+CUxmYJR1sMxTD5vtGjKX&(mLiQy0JY}5)_8vms_v)e2tU#jL1y?g{feuKFKHWoWEEH~A!FOPn`H2k3}%s@?|(iA~HQXjpQe+;gk(DL*b8HhEcMrxQyH($Nv zGVUKLZ}_NDw5yMpQ7nCNxD^>XnqYB0^~8>{l%Gzj86C|IeX|#IFKESRhlGph8c&b) zAw11fF=x_uW?`Wf#HkSX;%{%_P9hm{dQ?BPjlXXcTs4r>!HUSg@UEBPrjy84M>}ym zDSp3aX+hMpwieLTy5AKnF-$f2Yy8~p?47(kHZwF3+4PbkQB_WFYl13iKmQD9fhzll z0^!bQm$c66Y5X^3j8J&;Xmt#6n(TMzDSG82kHB8p-#x2H3wvnl14FqCUf6yGcO zYwfSClx5R`i?$nv_UYDTtADw>NM23+^!k`y7=ZKO^&K+LXOzOy)ppc-wN;l<22vCN(x%)?gRA@MCwne z3+Mkim!$UlMIlg5X#SyxUAa%WH7GgYI(ls-gJINMbJ6zPV4(9%)wc3Z;yLCV68;C6l zs~sZ&@20$Cpubo3F2;g_Ij-W~Q!RpjxwP(_IuYTgmV^w1&y3d?dO;Fb+E0A1smK{f z2ue#i*g8upMS=vPbQPHrZu5V=7|B>4ZJU>m`5rTVn87Qe}bMD+BCi|0(yv=nPzWp<%|K$mlXqK0v z*FI|hb@8$P=Eck6mtEhCmS@7-l{Q#ZT4!(g?RMdPm-R@0FI&C#WNxa*V$ZviJf&pL z2bykO<#ZFJb_tf5O;NgD45IbcWO|d0axxxUTX4Gp%NvBiMm$XU z!sZh4X$CwLt>#l<=8Mcq6Q--WPQ6SYJyKGng;5Aw8(25WC;TITciyx3r?^F_*V|5) z$jMRx*C*!M)V%$YbzspyN$3)MGh2K@-5+iq>DFAHTtm}E?8aPoIs$rTC1-tqu*Qb1 z(kme7`fchyY|O^hCMp?68)iwNX!WBF1Ol|c1-Gcn)3Xz~1S&-*>h=U})dO7!GF#J& zmd3W|dH=E#jGWJ9&o3@@BwdX-%iro?RpoVz?9`rqds$Z7Ne2>fw$TbHxk(Pk_j`Ok ze2Y@sa*Cn1V}-Tpkr%JYOt(o_UNv3e^pa;R`iccIE}IzL_$ava@<~C1O zg*&c@I2irvRo|a7sOlYTKGNO9$mz|237fI@Fc;s^TDRanmw%zgyU;X@u>JjlX}S6m{k2(TrqxA}j2hdi}h^%)Piv{@z+s$To zR={;k*8l*G8|F-J-h(6p#qyye%9ewHy_+WvD`N$E8)E^GNUj$Q%Ly^cw!-J;>M!V< z>x+EA?f1+LSFwRK1;!&!=A>KvSCH-i7eE*Dh2zateGK=UkLMH0#?vFrGdDVy{%6>0 z=^e1}@SNZ=C7&NEXgNbR`IE;&-cN_LdWS`a!zKeT8Hl!_uEHaB)X&R%xX5@RO&GN) zWW7g<&VzBQnbsV+{iUbARNP&??D{1r$DCq}PfwCBZGBxFjTGU*%Dsm~=VB8wG3T{* zbKjjqu|YTUD_PehTaU?{J!kV;KMG52lbTGeRG#LCv9e;h>7ZVi zr|D$$9)@La4! z(oe8A@@(ky3P%2NXKSonuD%iz)56yDLJlT^{#9_1qUS?fNa8rU4KJ~{+=<~W`J==+ z8V}WaS3fpe@wBlxig=(FCz@Fhkw_uC!Idv3B7eV|}t`B*iIPg35 zb|-M2mn`U49XO8o1cg8vzb!hB#NjK{J?3j^w_h8Z9+!PI^F1z!s2;D2_pek|0k zTgCKbRva{@vO9ub=ZLI#N%6TX507+enegvp&PWx&XsISRr^irB))dtqo#wPVnjZj| zyxN=(JM3&TujkwRHs-Zced>{(Gzt6t;N&O+vTafOu|>at(E~!`Q@{0|JN-IF{PNY# zy~0g_R94XTQ%OE4sjV}(!$dMNDNHdw%VgVYV1iK7qOzBCxT&v>QYK({ypje4fo6%C zp)kA<*%3_dXfgKlK_(^QQ^{gO?+%HQKYA_i((x`O8C`nWM_a>&b#l(Oj^DcuiFyl9dLVs8AqduXXGhdo;ia z`@wA%*0O&N4S4nx#>2!Ae`eHBjPMx#>4&dxcbGr#!Lz;^)sLfrie0SmK!xBs;?7;y zZ@xQ6A*?cz>(d&%kWL)bLO7bQH{;S@tQ^P=k3A=_D+N47t+#8t5zqWt%C&% z1h|GobM?YjlW9j3i_?bTZ*yhQbr-DCUh2Pk%W4)SLP*$g^%w%*auHSm8c$+q%mQX# zR;rLBhebV9L+?)9EbqF-s){=izL;uQIqam3sw?0p*zy9oAREPB>M!Q#|7=}htu`1+ zAIq=9BS=-Iq*xYMmnI+}16kh4Mg|(l`=nI>NM%&gD8)T{?xIZ$r3Bk9)A-VkS$XJq zvznc;zZqR11Y6BVX_7tO$A@n%oVNzc6%UyYzj8IpcwEEsX=MS&+Y-f(=_>tD(OJp0 zV^{I;*-7fm-P2a84RoBlogtz&!ZC^RSf(OLkXNn1woGIDhp&GdAdkU+VycgglQRLp zuoTWjNC=iB(Jo_%UsdvCFjbN4b;MFD0nYBG_I<0mBo(7qiMOX>B00VD}hGe>z>wf55Gu9jy>EG>=2ud|^z!Ae z!KZ4;&%^&gIo!F!0lj_UZzGbP-q#t($gsZY>0e~8AIOi;715Xp)|l|>F@JavRpp|N z$bA3GCG~P4f?eJ~X9Kj?QB+cTNT_&MEvu3L7B5enc6~VYW9lNpIBsJjeM)udZQ&{& z@Noi_`)&)e`gc*$bkX+>v5t`k07JvKU%M)GKuHKHcCkj$aKErHJcchhPZn$`NQ39S_4w7_=T1x}JVY`~7a7z+yr{cZ8~td^3upMFz(V4L?AAGj(a1#UB0XLG=B z_GXZjwl4iy>!YOqJgv_mwOh5msh>JWFq|y*qvmcjly!9C=Np!m=*RTW@hEHp%O>@O z<;%*LR1*4-zCBFwz8Zv)6bzLqOlO1;L1VR~gjL0)8sxicyf5zMEo-8-&`!***-aC5 z|Fl~wzuyOy==k(LM%hlS%!^r)Xx^FRFc${M!|c?498|JN{o##7(h zBF{ShF!Sx~WJn)ms{zX`Y;^95$z~nANRbO&KYL~&A~}kAwQtn0Ny(^z@Zs#@ z@T^-wIBx*;Yn=27Evok{i$hsqob%w7w=dY#kF^eYEl9ugF`#J=lHq%^lOr9fg`cEj zvn1E-11dSC)(FWB(ke49p}j7LT?wB_d_Nht7;3v1G?oGIzyJ8II;scqK8)8{Qrn|7 zZvVKhWr->eRCO|<4}`Q?TE0sws~LT6XKmRf6Q;Vl2}=DgDa@j6ZC}t^VQ$J06&sV3 z;J;LE=&NUGKvFQy%)CgQM2P#6uZ-I0Buw z)C5OSOhV;|JS5gGhYo!rvf_0CGcz;60ZRg=E125~VNeVG%j#;4h$!W8VPQVL|9rFu zqt%k}76&|6<2)P{;OC&VsJl{gLgku3on&CcZ!$Z>Zsq61r#VHZDwKzkZ##$x*!9G8 zna*Y2afnMOen#U@^-Nus;`Qo!O{aoN>*l$zL3%HeeKWZK#amguzUbx)Hf zy_PTf{=a6FvIj}*6YTYO-9p+@+=h>0QaD}qUmzil6b{0W|*u+Hz zPcp9_Xg}3H46E22cVx}g99-Z(L^jJ&5lc3E$#mu?m!`ZmgvPk`WE#AN!Ez+e*W1;n z_TZ6J25WJ>;LJ%H@q$!Z=I(+N@mcoL+1WIfUe-2}tGJ2?C}>Z!eL1PsJgzOa+J2|h z_dH&JE}{u9_VVY&i0$00ZRptpb7E*$)=t2|WG7P$ysmaE=81}ykpGq5cw7O~+v$$j zcu8h4;KGkr1hiHEaAn@vXXHF_Q~qFX8&CD=?67+CYr}?!JC_W#w&P%;KpL<#H8gX< zbJ@n;_jExjfX-hpWB#T1xqf(CeTzv~{@~l%*Y!NxI%J~~F1%dy(mP8KF9Fs|kkk@1 zF%&K!K-$&qAKxk+43ktR)3kyvrh2c+?!LcG^Ul3btkL(T>q74 z!%aUh0P?%_TnJ%x8?Dv8n%(aO^GcsF30}^0!NU;81 z-z|)@K}%J9uesnUTZE=V(FKjozHgRSg3vpuB6bNUoCLBR+Y3#47mlZ9s7!EWIKg!x znQAI_Bm5Klt!<^DrmuIcfqq-G`1@VEB{sEPyI#nw-8{UgIh9KW;d*$ zGq|f;w-7)_!{;=S2SFX%xt-UlC48oVAqlk60wtJvP_@GO(PG23PN*%T_K3D#v)R%< zH#`56Qg7o(Qf!S^>2lbZgMhp0>41nXF zm11$PDBC2p8X{k#ic9f@Z)%;-m;Oo(0qvG!$ey}g&34es7oHuhVML&FEue#N>Nsb3 zPpE+6F{(T%b7{t0%4b0fb`XsA>qz0UnTcsz|S7>J{4PhMpKKmA6nQn)V5 zf)&MF%pf)vZI?^RRP3IWXEt!_e0SI$cbiTl$Q)W6%+O_w<*7Y^G^9>LLl1E7v&+L~ zqSo|EwH+yZE=lZG=l##Ka_!oUKbk;CDo7@Tc^CNYUNIDIOxjOIASF#?L_e#EHam(S zSI{v%Tm-n87cphxe)34oC`FW_t39$9&rFa~Sy$2(a}E^<;T-^07QtQCOEju~5Mt_f z#Op>^m`fEF9om-nQ#hPrb!Yv^w6^Lz#o8?wwwLBK*2L>n0w6Mt`A=n;D$Z@T@Z5LL zqjOJ~){9e`YBO70zLuthH3$aWoR$pF*N*AlmRA4gc;CoJXPjP29QgBq2g|Z1l1_Jz z7mT_06D7&Ev7M-jvm@e2j$Oib$DYNIX>M0ntt564u#$R=ofYiMQ?^)5XGHNC$Tt@I zdYc7zFlSH-48c~)XB-G(|J{jemGMR!{yI6fI4!$~3~}t+7WPglgnFw^W-eUNZ6dau z&VZ$nSEm5%m9P`%@AlQel!(`apH7t>!8VZpPvcAFnVE!)6FhuS*lixcOLMrJ#~_bk~G`7oEuuj zNnr5Q^WFLFm(5roN_SI!Ku*>QEsc&&4Tk!)U*R&Zv|lz0Y|o_YP3ulVKnnWU-eGC! z`JRrRk`u_+s$uH(V6G3&_&C)ZdkKz-ow)zTT<`d1oU3RgU7;&o zaSunQD}RqSY_F3(HNN@kH!@`+zb;Xq-I@x-G(NMikQV-T(yy3V%ld-E1WV3~2nf^< zuUGaKhRoX+$uOs#K5m_j1#$^q(17tqGGCew4^Ok-xgr|+% z_`T>Iu!~1$h5Iqhj-3!i1J+SLd}lYP`Rz@nej%d3TCAT@1O%#~166)zlUW_Qe7(C+ zBCansX*273J{1aUYn(a8e6o2~H@Y*^QXZ69t+Ya$i&zZvGaBwGJhP`AYkR$TaXxrot?2~#_n6U$Y=h+~DHx(iAAC?ijpO24rD8)mCOOQ=?TllFEW8B~lPBdfRm^iZ1>%E{xOvnKbtk>cRRI>@}1#Rb)g2^6J{^ zlqO{0IUlNQZoJpLPCNAlfyS_t6<}#wv8H(q`b4qYC2?Spm~9c1FNd9Ry^4`5y=BA;`Se{_L!V!62#>^tV6aeG4pFtoEG06h zp(4?UJctrXHC@8jRWu`PgZ#Phb+}Ey=|@*IA_qP{3$iT&``-M@xSQ}S`JkFmy6DA+ z-QR81&pcU+#6-$0QqDHJs+L+e7KWF@BgF(A_v0r5`=bK$-6tX8oM@6v;+yRqy8G9n zp1g|fim}EHCFU197iK@u;PJRWD*lI6Y1bC{!SO7@_hrFUcd{)5L~TN_RkHH@3b)SK zblJuAa^mz$SVQ+~{_Mu?ErOVIZ(!^E!jEr*3+@u!E4e`~8u=eP=h3ks%vKq6V84={ zf_L=+4y?QV8|U%Pl6O`8)!x#Gz);F0*jZv_P|{+|ai+FWm@WXjnMtj;8J>Inpu^Uv zS(G%`?C|&1O-6)O**Q$Q#`&NM)O>wC6TduaFM%2Gn;wq?C57vjjTQg50dkQq%KW3a?i7je^ znYEFw%O&j(b;$bMq~D2tMMY`CkV%q0gbXVdOA5I)e4>gGb+30IHtZ>r9z11&&sW$=AkM$*P3hZg#wgCZ3Gu znml~ChH8uY7WZSZ8XAd5Kv8S6!PDdx%*a4E?Nw8;Kz?{Qo_M~8DrszL60%-s)^x}n zpg#N8l)qxu44z>v# z85gVv-8bx)*_%wFw*k8B&0{Oz_an<};Usa*m`t~sfTNO=+#jrqg>(y|ttXSyD}}v4 zGT`mI{EzYYt#EQ5Jd=`ALQ$=?|Bj>Tm*dv=g|{j$yLz){o)j1P$Hry0+-Av3_zd|2 z!_+kfv!w&36C;v?cwm2T1aF~Xy^;jJc6`cygpSjZra>oR0>r>1$HzLU#0dSfS{bhp2=+{hoI z*2QcrjppPYN_n@iHaxAtuEzAN*=tRX$8OxGdnsUDg-##&O8d1##2Y)X?KW2y%5@3p z24UmqyMk%%?&{^YNr zLXbtbdi8=}^zPq{s&13RqsR9VG3+xbs&y)qbksl$8s?zQO<$BD#7w;0kDsx@9vt`*Jw&%wz5wjmu2XmD;jY0?`kp!Ygw2PJ} zUDX=}btuoOWaH(axlzp|)bN>H0zJR50O|XEOtkE5aP&ge{NiL-{-c}W3Cqy*u7#HU z?`%&9MXx3c7n8+2AlD0>n2_9eZ?y1wiF=&xb!xcNn?6yAexR(?am`1Q>u=OH+4VNu zE7{Y%n^^tH^#ObkcP&BiKySm!^Q^ROL4*!cRi&l>hkzkuSd|B_3b z%FR;dlVA>+DjV1gET^JGP4~I-NDV4aOj5uHK?dCUFi~a)g}K3?lA}7}uHbwl z)f`Hpk_>WNz50xJ*^jk6nbd$XN0j5RAd<(`ELx&myy38Z>gkuTW}TK5xE&~~+HTA4MAhQRN1WV*U%BqLetE6=gz>fhY3^sXB-I;(@%ETvrr(o4?Qk85dIis>85~Vw z!4_SAwLix5rXW7zXA>2bPG@CCj2WB^ZNYzN5gz@vNpl|_Nf6n)$<2N!`{sfkb#pd6 zVJv`ZRQo(+Hu9C_9iZzapv()I2T|!ODvz2CU$8@5He-YV+{S8gJnQC=6Z|jw?>}+**m*tNh}T-Kmm|X~;^O#0 zyfhNN2Vz!8?^P2YZFhcv=q-KO-v{z(=6~&G_K^qqXC$_NQau05JpF%X57KcceMjH` zc_5+W)_!mlF9rfHL&SKV8Sqwx zTzQ;x*)yHrhT#_$8h!!&b&vsmU(&5)HRmESl~NCIRgD9dW-ef{_6E@M*4N#mIR9St z_r>}6Wl4)&FS+bVOeVA!V2_N8g_@N|(1x@C7=6x0ITn_wS81xpL}iJDo0{MFV`t1AoRO zd+ZcsNJ;b)Vd&`j8khMJEqfD~GeOdH)0|uX^~)BCH|mml7*%-XD@!n&+@J z|J^{rLy4rI#>V6*_N-6Q=qQ$AXX|v2T~S(;xfmUjk5FlbtF$@qDOPF0r{TE{u?5Mt zkDZ+nq)u;7HjB@Ge^t{>el=Q9pd+Fta=+WQ?~nSrsX$k8$mF8O#*GwdZ_Q^C>&%3Y zbZQ>5C8?Q^AZ};uXHfs~`LVOkQ?d3BM^y$hUCfX)NzcW~w+SP;A+-pvI?#OBTHBe4 z_uE^M$I0)p`f9TxPX4$CPeguZUhtofz|c{B@6k^q#Q02To5xwUt_c zYdT-%uBH7{)Qqe9$I%YJ&ynJ45+b>GQl7sn?1yv42n(uPo#Fkb1=fz|z+?0t<~Rg%ENlS_z7R zX}InC5eBa$rSt>W(5I9F9&Vac%##5dGkN=&c2~LFsF+K?H#h!7>qn(*j*iow@;5P7 zQ7Z2|duw~<6x634%9v_933LMF0b4ZD=b?k&dp zCG(|{lp-2j{O2-ehJ-qXs^!ppNWtRYmYIy9W(OSInY3T${Yuzkc^*LcN@ofb^Y3A? zst;`I%J9m1+hkEQMhQio#ELZ zQTndYHO0pDmR+Szeeri^A$s7=qinXB0l^Z@`NjF6jyAwb4-goDW9)nWGy(pP@9NvZ zZylB~kZ*iNxT2aVeePjBRQV!TWg>)xJDBV1^OAW-FTppD23x#nfG(fh%6Ry>G}IwG zTPDJ4H&#A&ogIY4A2Zj(I<=$FY&L|KCdOvznH?%8UE~ z&3ebm@QE0-0h!mxw`$cZj+w8Xw_S@47pUsvzm|4)Qi*g#mtDl8!EB&Af267PVj!2;lLsf z!-s*&$)_cfmv-HBc8rHwJR3{9OPPb0*jbsqNA$#cam%*bKmyF)Wwv0<7phXZ8pDsoofdbZtdJ+15AjFY`d z(^|pBH>d$#E8$g3vf9shm}0LlUb3%OoOu!_*lRlTA{<`E%}oE5(1%yh*!i}16xu{8 zORG#Xwm?qk&7-rQt%4yG+h|Cusqt>QF!#LHn@48*wY?F~-xSf%P(!Z$P=PyZWw%e# zPxn&;7al&n7PiqfHPiPw7^*?wO8@meA%i0z&8l7zlS7$2f=P2L`?w|Pq!<7E%_HV> z?1FAL+?enU+d=&vU}oJ}Rdwrew#eQl2a|$((>K(~S662V@qegiK9|v(t8EU(B5>gSfl1Kd$BO~eXoaN1I`B!ExUYnyu<+{gHAo>hUajP| zhFlF#+Hc+1+XU3KuIdn2JpkGNP1et5YJSAc!(mJ3~&Mm4)EuH*CBc)(q12eF{soZ|BH zCUte4W_u?+4SvvSu~0K?AvWeoBYA_bhwjg9iv`G)8#&M3jPt6yo16K5+!Oy^c)lHp z+J%qcKkqw#($Tg=L9yuG>9O;Tejb)>B~ue5Rcv~dCd}SJTI-tYoPHjq)|hXuSvMCo zyl`!X3v_92UaP<~gRbpYTc`8>GH@*&Z=Ams3uSJ~+a->+J6<%QM4UpiYJgTt+gEx) z@dO5LZyqI?b;p==l`l3fZya~jeV8c#;?18*)LsG0qs8H|$O=q7BQ9m{n_4?CsF{x8 z>vIk4xP!RVOqJh63(-NmN}TwU?X`tZ!d_$o^_C{JLP*LA+o{D+c_k~Di&T>~$jjlg z-p|f4c-#D5H9grEvt`JpeU**UYPFrNxEjaUwB5T~G3#&BSg1O{u~d7iR^`HBTxd2o zP#6FFRvb0IJKs-tE!}`cYtE2y!Hcb=)G+mD|FC4;;lHb>zW9-{I18>b zSVRDfd(Ani;m1t%D0pkG-gYDk^(|kf)ot7n3=0u<^Jb4skiFkC>ig^H)=d(yf6Vi@ zPWmC?iMZqllGmmze^@@}Cn#tY3`tNBsk{;l-P#H|QBA9`-N+A{?v2g;!fU?>Qan8B zyFkjkTw4lX6JUW#xe9C_&Vv)h)nTZDi|h^E#tSaiDPXmwd`&o9(l^Ec5X$$p<#%bz+~E5*=dAp$?8G z97c0fppgdL-~af8%DNAu|De&OzbNxp{hRPP{p$~3(GRz{KTVhakN-0#h{#cfNQ#-X z`A$tuMN1oM*00{}IS3*tW59UdN@T!sI^+j|E!xqbh_ z=jgGEfCz{*sY;hFT~R=~^co_)gY-@;2uPLQ1f-Wxq=u3ZdWX<^2)*|fAduWgJ>PfU zcjo@yd*{xbACo^GCYxll*4}GJcC-mZ;1EZr= zDygEpyubvAxw*MQE$9xqetd9nzpcHT6L)%=n3O~-;%v6R&~}G{Gf~{jxqURv_&-)k z`4zqRJmnN2kDZxn`)O|f&Ezf!gMJ3bHW2r~Rt`l*BD^Y-h<=fz?t*Jz##d3#F9-4J7Fjo-%SsiY?`7dR9b zRu$?f&2o-@IUN!AJ@V`dA#&O$?(3@piB-G1JCjHU1j=w?(MQY-P5u4326lXBCbK35A>v^B^ZD zb)O(<_dt=~MauK0W^?OE(vyRT>3I&(5BDF7*2ihVcnrjrok=QTNn=e+Pq15Ju@|Cj z@;VdHw~_r|W>!`%0O#%c*NpWRT~hXm&m7*NLn%q;4VPjnnNDZ@7_yynLWT1UKsTF+ z1eF0c4GsfN`e z5Z<~sZUhlg3yl_K7LHv_mc$*?0+)D zBBQo5dxuucN&BFAUt`6n)*YCOz|^5iXz0|LPwHc)d)=m#TD!MC{8~os$~_u`T8oP4 zcEnS-bS^kRc~6o;*?kJmO{MX_cNUOqGACmGA6DYyIi^riL3YKV3b~af z@ao2RNv<}Oi?i2O8~V*xSOaw0oN2yUaviPYk01=(LW2I54hHTTjglKx99!nZ>`zcSWgSG`)S;Ub?(h0 zUSzrb_3oG2-rz)e=bx}kd_5fn#Y#wKYll>C5>x$~EJO}zKc~s!0(M(!tWYM4Qqjtp zzjUI;(>4Witnj7^q3kvv3TkG`%_(2n*FP5*~++J2Z4GvIR_(qahcuwa5!m4-7tQ z-J6${)5jgkoT?IUjxchJ4WBHxB>TngL905~^#df~a<@I4S~S(+;&lJ-zyFra;w|1@ zTv+fwTTW&Q!+GAvidNY}-4@(&I7Hc06LH!B~#^v;r+nwmg|+S*6rtIN73D{Oy#)?fUrMs=wc&5r&p|w9OU%KKIAd?vT+Gq}Aj^^UOt?bn;9u2dfZX<$dSG*NO*v4paFm zwR|k<_Kq5$wT17Sf^xYCWr*4!Z!OLC*k$eF!m_QqyAZe}`_-kWRw~VQZAPx$#z+CW-UEAd^gvn@s%?L|HxF>e+P+8|Dj^|3$)(RMuRd9B z4orL|;4cCBi;rI|)CH8yZE|r52|r)oM*>y@nKGfoE=21)8uGv_4KBrrj<`-6vhbX2 zz|dHp++5``D*b8609*p%Op_4u{rB$9zK8eT@PxcopLs3wMqU377}YcEw_X^Yqd;-Y zt;XzC&YYbx3<1O6@9R4!GQK`wI!7tWN6#)MxuMcM2u+JC`u4^=SOszg$i%1pN5CyA z(kuQ1nTs-q;xE9F_X=jk9?dJwH_peX)Y6Dc+!pseJ^f8`s9k}{&b0%I&V(m?>=ykO z%O~za(%D0^xwX&iD`D%q>%*;~38mPrp_Ne7BQTssz;q`X7@IgaYvG<@OlnL@>>caC zlvV{L6sZRsY`ygD=ooIA)dp0`B%X0_;18Mo>WmxJgR}Q{GUqCOis}s=RbqPen>)?`WGk z)*KsFI>~$1tgXlpQQAENwNOAyb&;RU%Gu6e$pX!pz$zC(B>hA`ch#A4oqm z*Bh9%2moLJpzim$)m}$u-*1C6%L6#!jZey?J%)Co#=ma~6Vg|uuNOr|mL6Ua8WvVv zQRNlcG2A@k+dAh652dX2KkPpRud=SYuDkN)ZUZ+;5UK@?`JOD-(*k5|bB-+_r?dgZ z4qS%m$;svZ)aiH6PS4NJPfxR}oB&9u^8NY#!Ztv58d_R#czXcJ%a<>CjKKBoTxV^I z9g(F*2z`Y2vD0FEs)!4#sOS_1LudghoCD*El+N)3VwXMnqEbJGSVB`JeHesxGBTgm zV`&TD_TzGhxWV-W!|Pv2AnC|xxLJ=oB#Tq0RJ}p_I7HatMxIC88-p{xS^UQ!BH6{^ z*4EE*Dy*13P0C!?on~@|fI%y`=UFl^-+j1LzrIZnrqSXp2ng|d%KPznN|R)V8$m^w z$}H7Vo(id5@r8x&J@1~eqSRfFT9Yok4s{b#kRAL!8@*??S?4cyCM+>EeUvcWCa)Gd-2_Z{O@V!K z6Ggc7(*QV5-%9tj=WET$p*Aol+ahR2YVIe=g1_$TJp}FxVg|FgfA$YwzdPfzgof1dJNonG!xD<^q#{vTGIk9`*_2PPWA$cwYb%A1rkp zChtaVjY7wh_$|+mH$Bb{mZb<6hnuCy9SjmuXz)w%k0V3)+Sh7O#Y-zGA1dk&C&C(VC_1 zTH`bQ)?7;R>hehZNl>=B$kg;LhDv>Y1A|Sc7z+b^{UvuNc5trQb;Gan`jvL}CMH88 zNq3?#_qK3x#mfEMv{K-m`t`0D9Oow>TJ-oY`PVNspPaZ?qZ=-y;p6-%s6My#?r<^p z8#cWHsnd|OG)nVw@jK-C1{DX{>xbkrPCsFrQw3FT7H0=K^p$;53eL9A^A>ga(%aqQi>IFZ9zAez*-qG&8qObGK+~%}k;4rP1OwgR6H`)j zO7)uto46%-y3MK_Cap&6xTNsnpqulc%r~Rm=GTNr0>Y{IWp54w^7HicG*>yrVHSQS z_{zj(xtsjq!{_hk8WrN$CnqMt9`Y^((fhw~>-qcY^}BT9&!0ZcmycluL}zehB&9U) zw_!9Q2hh@n+js7`cz9rskGYKCo`v<0g>2aOJC7&ZHjUdP3?+NNBBhR0)+eSNzsu8# zI@1KX%!m^o!v3{c5ScMf_G+sGmur7<5py_ey#iAj|K_;IuhT9 z0Fb&BX-UyS)Moqq`E$F8pBdW4`c$CKX>Y*zX2M07htnDVv2i=$d_}v!469#1l72`3 zR_K0M4+#nBUb`<@au?U%tz+LnVlQ@)zrB~0!t>hF_1}8GXSdQ7M5_Vg&Qg&Z_H=$A zGoS@{;*p?=8YKVYk9oX_0~7_f1l6Fu@_;JQL4-rB>dh$37<@Vz7{fk(TZIbr=+9S| zm#Z?;ZX(ZCqTSPY%6|@qA1uQv){tkc|7oi%$=*=$ulcRlQNN;--VOiLW8$wD=S=_4 zt{ML?KMnbAk@bS-v1R`j8hAdX3M(MbmPZUMzuVcfN;;6^q%p_YCwOXTbl-Q*s#hUxc-vwra8oe?CrWoCF4(6zS_f{&OmnfF4QzzW3kpq|=^l z+NWQQS%GmBS505I3))UfN^Jf)Pamwi6J70&@)N_au`&PTzCzGi8`aR%FYgR6SxdE+;G&Nb?~LuaV1cP9(tI{pXFxu$zh^p36>ea zDlFdn14(9*DpM5Wqr(Hvqbblb&S1sCf6D}_oFF|M<(Nfh@yJb9=OZx_Z`Y5}Lapf7 z!7p=H-#&=SA2vu%F?VG+eRfw?FP^-Z>K9-0`K<(P;zCY@Lf^a@G5CchNM*C^zLC2C zJY|%39LZ;{N-ls_{7+bXfFX`KGt(7i#nXPf#W2hLh|IY)4KrrocA5KaH#!o`_-F6s zm0?O9t%o1%2IkbHgJECW1MXKio;(7j+#;fJKh2f<_-9#XH{Wx>TkPpYF;(q#JZ%qc zrPr%@T-cSp!o9Ic4`ctcD)CdVfR&+_uLXWajOeh4X!n+yT-&8?zoC1>6DW=aXG&${l!z&u<$ zTzEjshx8QRL!vON&1thI=~%z%K=TlCE={-sI)aIkrmob-XdB!_4&EJZ|9!`yi)`Q%UVQ%~DMxntyu&nfqY?&FGhf;L?Ij&hRtj^7nNmUf6Pu7qry zzWz+t))DIEiaR}LLr+Bzh3N#mW%RgfdpUX}MF<(F@m}JO#7{f+6Q&4D^eOsz>@8o= zKCi;1ZyMj6U4$&>^vcJf+ggTu&@2Wfry@uyiH7gaeDhUW@{cyf>5S6OT#}?}eQXvJ z`w6g1Ql487sk;d|zVA{Ra` zmH76}S#xuyUaLX{k=!u;-7Rp~w9vC=rBq_2bexhifcxO|yiMvJ!D}wjOYsEleOhF< zEWh`aCB}aT+mY0PieHnC1g2P?B>2B#jRd=&u8?_G{$}zw<8oJctO#(O8+>y_y9lCg zJLGh9yjFYp9-^OU%3S7GNDy@|R^x(Dsp9VQr{z0oHZ5r7o{Pl?A|@T>v>CFY3QU(O z|JdDm4nLn}v@uz(_LJl!o@+-X^I9%9 z(Z{2qClbCOJ@trovWqJx+qlivWJkrs&<;yV9;pH!^u5v%vP##rkr=1uYG)wm%5wu< zTWQ&(Gdme~X%nitm@XmLw+)9~|= z{SQkJjs(K|)|P>#68tpdj|aF+CuWnGv>!RVlY%G zq4021 zjaBx80%7Lvd33HGY52FS5~I*qH?an`w2r=E%N?#PAOZ~R~UEX zcU_*;m02Su;>Mgr`p6pJ#V_*nL^`_XC9P5Irq;gG%JTYhMWmAA-j@_1&Ij%r&S8w2 z_m+K*Z8cyY;*Q`AigJz=Rzp83vudYiN;E@(4vM0LO_5k8cO@K}=SXk%2?ovY&_4f0 z?`fpNDOaMP??`rr6pubc5|3!l`JF@bAt5TluMQAW4+T6&V!IZBn+v*AH<&T3<5-&| z>X=h_CJ>E3=+!YD_R9Q$+~OX?QrPpdzG7B#tL?)VFUtsG^FfrV-O{=ye7<+LVEY%~EO=IrBr# zbz?ej*U_~I%=z`6h*=``ddrxA*gk}JOs+X-$lv0D%p3OgGirvgK{aBtE>TB+OPBTZ z;-yY8<7#)+dwr<_>p0TkT!#iW5#2n)^y`a61bfQwDUmc{W-~f0>1l}jvf{tbd1KHE z(UbK@{O&`cR=*UL)aCOfd+bO&Rpon|$ZqbHuUJ)k13v5b*mJE7Y$AkpnNp~G-m=<$ z(rwKf-agA!>c>7Gw%?w$<4l9yag@@^Zb%fq=x~-inM|`kyC8p2q1-`4?afV**za{A@$!v86@lg71_q7F#MCYtO_zu>>bWD)Sb$4d| z@&1oauVmk^d=+zS@G52Lv66vf_wwAWG96g>j)d#th@?kvwcYw+lu5hyqA~$7 ze%xGSb)4*_X_Mm}?#thgf!FwetxD4zP(t!k(=e;1hOSbUD$`UvMicg+G)YP^0(6)& zo^0vJ%nw6d_u$ASb>yeu_lmR=DVLY-+%F?GpFf3bvH%&rq|rih_j)XErB7u!NDvp3 zG#9+g8nURrnl{rwZd`P{@GNjTfmz0NvpoI4Jf>ly| z5V{LnTb1^Q8{=CCrx)p=C$ll)$w$`Ox%&y`k32TCH&aBxj-isyYawN69mizjnXz_f z3O=h@wYL$zJ?j8 zp$9l98&v>Wc(Cbjh8m^X))auLndKk(U`@PS3PI=}cUB$FBG&-OzdINbM$WR(f!ouMxj z%omMmeT=;9|8~q~mXYa}G4Rtud}a;^mV#LahUOhY6P`|rOhQf6W3%$Jb@&88>O+SO z??wF%gq;<%OGXX+^bm3TgQ+c{6gXNGrnasx<%ZcGX*q7{I+o|qy#x$5QUTQ0zDXf| zT+USbrt-*F8Geh4^Tq7t1o|%Nho+zVG4gK%%z$2bu_+B05Bu?k!^Y*8x1^s&mR_f+ zcYF{XR~&90lHKO%h}lt;%_w*00q5vfu>%0RKwAiWFD_GT5y`V~=Bs0|j07L9R&!Ac zl_U%9Kp#1*IM&@~leX?H39@~n?V)319uu-`u^q7XY75m#l>l{4&pSQmptVR_i!|Wc<76`VAnPDjy zErxm+z;4j=sh_RR-1>l$>$|f0!fwZOLa`CTM$qvv<;E2(E#mmiqFQFYHecW_W`CSX z=IP)xk{i@n^$zOQFTNm06kRwh?5n>3!*5zwG|3~ic2|1oJH<$Oj%q#HEALWp-18qU7 z6mk|Oe;?wxS3hml!tE3_HHz<-t7$U>Vq`u`tfnB~O~fd3=(lD2jq4Nw#3B$06gW)9Zxka~j~g9nLxkqwC*EkA>sR^zbige|Z4ynoBotz6BXJxU zx5oh_(Wav)QSq5-r}L$!2(8&6Hy^<+!ht(GuDL%0%DVmaL2Y*ehZW@2O*Wr`^SIIy zkf^V1bS%0yOf~ej$oikm=*Al_MB{HU-!L<6S5Zj&y4BaKcu%*Mar|hK1N*%e|JbM- zX#VJ%wR06$&7Dsn?Rk7*ia72qQ1nQxp`)`*gL+=drs5#e4Q3%KD$WzL=+)y8QE-dw zEKhEA`O{Sm%%F!?YZv-PR-s>GXbep_W8AAG=AA z?l`9-ZaDTBkf{AyW!@#JSnb7`RQ2uL?xQN zN%FFWPb(e!t7W-O?gJktz*cZf zS#n4CI`exTXk`3xzpRFml;8ZU7H=+NE9;XY!@O}$kq&wamT20PED5iZ|SZGu{!CJULlwTs!}VARy#vh%lY`-mKn5&!-d)J@D- z%0-t4w-1HWrzmZwye5c8x%lgnVLzO04lW6Nb$`00C|z5BST3skHRErcKnvGDIqP%7 ztUkKwXP?l}rp)o~bg-tW=fyRSMC3fJ^YN5XSp%-ij^_`=X)Gfar#Hr3K(?dY#$-V>Dlj{g+RQ zLCw+pB|x5s;pH#2d#xQSLYNV1Sd$uH)%_=vXWHJzZK1#+nU(FRS3f}|EW^@ zZ+SYl&iOArQ7^_$fOi4UQL75;c`Uc~RQ<(e*dy%4h6 zd&fo^ zSIN7J$2r@!k&}6-HPPQ|8|zP9EterW(XT2*!~nk;`HMil?qPgCWhK_4G+B@1(Xe|2B_p-KPt4E%hq<-o7OR_jHo z${!czi}TFghwn^c^Ad!(4Bxkx|E!OTg};uNfjO&cc2%3U6VncMpG}D(H6kAv!(o17 z2Y%-lUud(#iYb5X?n7jV>)q46rM;_2S37K9A+_okl5^b0Ls{3o{Q@IOuuQr4h*e3ZCsj&(YVnEH}F|%z4wJP?#UC&ySQVMrk$A8 zQV?IRExt$NdY@F%J=oXUb&sp zWe_xe3zA6loJ|dvdsp|NUc;^#X0)QiH{O(xNKXmoe^afTyM10&RpA$E?H@FD!ksiW zq0q$`S+7_f8JDVeS+*`2+?B5ns9|gCD`i!GJb_Gp3TS<$> znNZ*m7P{Xh`DRzLO&f!<#o>D$#4-KxbbMuU`!vySP41oVxNJ*Q`yet)xV>%*pH}a# zPF+r`KKZ(}{76$t6i$d%xycYje-o}%V-!9^@TVb*aGW}*=_hW{kMG%yhP`h22-d0M zdnygAvIF~-&3rHh6;e36xpR!d9g%hW^&TMpoAOzs`Cr~z12M8=Tv(96>wijS(>1dk zCbxD4lht$X-*PfmyCr)lPE=o6WYzIa=@;Q&uzqv1SiZrRw%8`Qj1u)(c=)JN8Br(!Q(Bxq4j24^Xsd_g1wze|JrPUrp zRh)m5@{Y%^s>M`}xwA7Ab&nQWB$9fTB@9=+f++~(FQ2Nba>zuPXQ&KbQ#!r~XAD>x zGTCb7L2Cr4#tTgm)N7;PyFqt_{Ei)`yq0~T+~B(GY|E=p$W!r?7uM?Ts3|T9TaNRZ z6az~8nWY(IJ?sp^_FKAqaD6d;Z?1)x18Yu5%kn=MJX1;ZV>BX_jzPZrm@U?H>mE0E z|F4&d#eT+qxjt6_3B~L&v@7V!$?i1$76@5**^?C8Es_ouU0cvXS76Vnbv{L3WwURP zb{G`iQB>*baCIW#oxdf0xb;``+gYy$9yIzxRRe>J7(}gEmUoTl`XY7Y$ccX@ zrxcM`4M82w81RjWn41=Pu3n_3Zrj&4!anLlwDVhzK2H5b#rRl+E7l2Zk5xXmx2)lu z9N&0LSf45z7EVV{Q+WFk=#fXX4M$dn&ZlNZg+}D&sNEjNIJ>u_=W)#P-D*|lrq<)7 z8Xlk;N-AfOcPsG5wI#tq-@d6hMEz+3RekBq9VEnf{5!)XYY}`;lTay{@cH{w z_4i6c20BHp>C=^)DkFV<8nO}F*p>-@sjzgHEoJcYf^wcMnmQXGt0@L1SNEVYA%KLv z!`ZF-$#%N<_g3%o?BhEb ziPp1@?N7|a0imAieGNNvr~%?*o-V#Hx+vEI) zo2Jk8IE#_b5NNFb7dgB0TJ6F`s+dn#EmZZY4}EKzN=_-SZUhkE+~ba+NRC1Z1?hnk znF{S~Df)xgi<&h%378|>ohapB>G7625ot%O>#b87<5(`o6DMx1h>87a)>;rx`b_Tq zQjU-}BkNp!QbRXFjx3&amls*}Svgh&zfOG#RfB3C>GUz)zkjSv0l=An!Kc(_ZQp@x z!Z$BY)AR8=Gv8k>M@_zjQt7zRD=cHRu+P{a{Uvc_#aFSixx84-?hj>Xx$Lt7vE zZ%c~l=T-H9b7vzp>ffVpZ@y#!*8SlEZ6NOc;|?y3url9liy}& z)IIq9_J^+kl>NQGzy4owz;QYHUvPB7r|9<{{(9lf2kT{!?5fGF3F?uPz{_nbLO%Q_ z7eKXR_V^075ixFJ{Ni6APlS1s_&-Ib6~7{=flW_)$}9-Om?HkR_g#`c`)THP*eXOy zb47ai{|0)@0kGMJqO9qnt5l#*Z2AYFzA)}TVU4c<{r?asH}pR}t^Zq|I9&egKgDB-`ooSr-v1&?pFW+Yc4aegnPZd>9rvoCQy!X~R~F-hoBJN} zMwe_GZ9_B&)p@>;p4GVT%D{{+UtsWIyGjwyt4>fAYUTSI7dvt6zrXgZ`N~Q%ur&<8rPLQ`mjR^4<4KNK|y?qudVqi-MHB9!{NpQF6>(q6)t+g9n@0~54rW_ z;7uYQ+1(VZ+}n@45L$zFkw}?t@<^WI6mgsRK5?1vBMgp`y)BzJ#_dF%SQH%N>aDWI zlna-60Yw&==prUuDtY?TH+@%ssqZ!Fml6IUGNQrsh3Mdl>w70B_pa2A3g1J9%Z*1D z9yF?+=2~AUUg5?CPaUPw9tRA7^(9R|&-iY@n^HI9*!19<=#$SY$~MuJJJ@iK3M)bx zq1|({SH!KW+)HZNV!LZn0|xIVSG||aeE41E7YgA%yREY!P$bv3ho0`Y{OF(-sCWal zdTFr|%^>(4!<(W>*WPglYjYg(z_n^L*Uoe)`#5s` zrEVDKQG)wvhvxQFlbDPYFEko__dM6zp@oBK_5NoM721iymoYX(b@vSY&r!ybXuntH z3;_pg&F5?cTdYj+qi||>8X^A2nmhp{3QK_>1#fUpU)X}vrvMBSt`l%EH&Pgd5EU*$ z{|rPC0=Y$x=k%-|iHxo#rY zR77Y5uCciLU_`Hu1lWh{!6+Shp2r(AzRnu}Qw99oKWlh|bb+vx37)B5TXwF!~W1ln#mlsnYO9s*{UJKyiL0^?6*Hpl;tB_ zG@9=oDw(AX4ukmrbJn!Z!h{n5>R-LHxG_qH$hfBgZ|UgL&h-`@6Ruz4@}%W!Dk~vb z)f!l-ZyH+@OX<*Ovx%58>vSow??ZVx|Fg{biL6^}5gB58irW#Pr4kYXneJ%)U;86b zXs)v7M_S{&!jt=a>%#RsIS=Ae%(QbbOAJJZdT`djp)Xr0{F$F4RjWk7mGsXcj_;#M z6t>1PM#VTAPLB3Er`!tfO;9Bqn2tTzIotd>CgTk6gOtVAbOzg{#oeAxEa(Gud)7aZ z4PbpLt?OO2HHb7XGqfm;Ws%!TJgEn-RYbmQsJEO6Yl$i+X`iS_iI2cr4}GJz?49!3 z-0y+W{t`c9K;s~@zeLVoR(3k1GR0jqJ|v}M)0@^)bROxW-ak_$N8wAuH6zINVbE3l z?x08aV%Bhws$@dm^oZ2h1go;4I86W+J12892>H*KLJJN`{Dw?EzyraXD zIM!q{J(FtOMfK@mX(`MYX~a3(V!_mOy*{F@pcc-Au1nHtWKd z0?vzvny89~@lvg+|mKr@`Ajrhasn zaomWUCOO#kRidx7+6(wB#O41TIpCpRT5jBfOs|nz8U3-;Rb~(IIZ1_?wES?^UmR^~ zS-D2OUh!@?P%2M|EageR$o|n}9|DgRfkvAfYS?-n^OBZLeHZBiN>{%*mKeB~j5Lnc z3p*wb0Ci*|!OF(Y&b(4#`!O4Yns;TpmE6~O`tkl_>;Et$>4`1(ZEoz94p!HtPErI4wdci;^2Lp{IlER#EQPJB&uZ<>?!h4%hqVRNzu#IZt7dQ>V(Is z`Rr6qmY7H?mDIbF`Jm>p)m21KG^&bYZ(Nq3LV|hU8LN5kOk#<;qqKE>Is51E>L*(C z9rG9<72@qj*zIwnH}Dz{v>(=pDNu=Ku$%wjB1d=OSDTKBPr5r3yYWZ^xyNXB@` zBy4FjtSYW2MnCX!INPmH*F3FOzbF5iMVxf9!V+@$;u*_%<0D9@kPGsVt%#HnMJZK@ z9I%-21L#<^c~?(IHhs8V;eK=3%VC>PSx}9!)p8MFavcg@R@>%$>iYQ6rGjnKR$fR1 zusu&C`+B%joc7boB39dg^w7BNss zm0W(>5KUjFr!8&a5Luyzd0IFIP}t3GK&Xm1|^k(IiOaV^*ZW;Hf|Imud( zongdc#p01xvW|`>QvgZ1WeOg|E|wqAiS~Qb`=!M8!lC*cJWH9U^c=sMUZ{O|UBH!Z zjjIn-Pi*gT(1Q+Iv=M||j{B*N$V?NT!r=&@a$KHRI;+AZQySE_2Yq z81!8P+gcA@<#-wSoy6O9|KNohz9ZT~dM)5>Y-T#vao+mLEwvHLPMs$PT+{x=GAQ2; zA&1~neur7hWv(wI+?VYZD9Eh18ihNHXkTLbfoC92?1?{8$u)(y@+)+uP3r>h*W%00 z5HK7H-7C=GCltO4%1o(pj=fKi^wb0`=kZYx3YBtrg*6nVa|Ugy9x*JvLykgf-9V@I zAj&urhvMt^8YcZFl1)<;N4odV(+6YIwT_xbeR`3J!{d3uvNz|?FNqmIxU-$Ja)nJp zg6O!<@JcZVNe*VjRXt8~iwckvhzxpM2^pSCGK)|j;_b)1X1A(S%^nr*}GFHyPE%bPjG6-JwKfdHa*gDAqpNY9M3Msr2)YKK(&W%0L+? zFmrx!m3Je}0v0L|La6Y-IEhq2Xd02LGagtFTh2fx7sr?G-lx%OjN(F(2#?o7k)+-6 zT9ZD9x{*;5WaQD=19W`)*ypQQxmRlQmgB3J-bQIU=+*C=KB*e3C930Yv{&QJjIp0a zxqNKMy-GstqjW)s09Z{i6XfJ{(-HTIQa)RMNJ)+7-0oWbJEGn*?O|Z>lAd1OSQm}f z>C**uwH}nH%rOY0g`T+)C~P+|Fjc76BU|Ns|A{2m(`WtgSA7@cRm{Q&niOwRQq-Yz zU!C7-m|c_)i8idxdUlR2*Ec-bdp|PG()qS3Q$-`g7s{D;0gG{9|pXt{&+7q1bbS!Pd%)lN-c9iWnP7q?0_1 zI2B@0s@T*O2mikK@a0FdkLE6r@YT!{RoaDw$%(dxm$uXih2<{8l+5H>-8fO+e)HlX)@9!ADws{1Orh9eGM&ij7UCkThn{;aQuVSkE-#8P=bnVD$M zGQ!y1L>7vp?U6z;$h3oJ`c|Op1mJ57v0R5 zy|SIGsYXFk02DwQxlJDDB~=r}DcY$;r>6QidwmrUeqo{6yCs@5xj$5C+2Kn}H%2El zP`j`V$4s`nU`J{6vO@6z8u_8P=WY_4Zn@-Z@UFRQ#rG)5-5 z1bVoYSCkEy&LX)Ej1vylY<0jR)C&^D1n{<gUdNOw(c_2d(T^8Q1${?0cQ zFGzA7Op53ZIbZ4-h~=Sg4=tVAX}@`G=sbW}5*@SnGG^LiU!F}NPe(};9Sx)N>Aw8o zX>WRYg*5mDYUJ$$+SKfl;^N|*tgK=XHxsu!`_nVj?Q$$H>8+wDH=NNci(-A@(eu$k zjmYfR(Lq@0s*N$8z24Wd1(_LTQD4jSaPxkfhzZzZpup z;0xZ+oIHNcUwV>QFV`=AzBG8RNG%B8g3gUBrGuNzW~>eoBi?ADBpk1KH?2)n3HbOf z&zva=$J)`_kdK$aN7T)%v;`T~{7vxEc!rP0MP>4FrBp{O0?&B6Jw12zW^M50YmGN{ z!=O~Y2_H>ght;XHZ3SU>+AN*mTlOQV)N1VBQwyj7Cqw;rFWxFqbeOk;?s=XDK4IkE zKZyTQPu~#FeK`z{Vv;LQFpJYKid`Vj}sGj z8Yxd*{VYv4i~Koln~l5m#i6Bsjq<$TylM+yu8gko96tM5b4tk|2d@VA=sii*8XeY% zXmCGiuQ;vA$K6Oczm`ooNdhg%IbD$nd(&`?uVOY%ij9Dm&T(Ug?T}Sb?47S1?wlO zgM%MBO-;t709|L=WUucS{+zFK=qNe9y#kWHqob46cwFIID)Ci5__k=n`*PeTCREOA zU+>P;PMa}`vsYP(x5-EEU*W;r3{{Sa8(}P4$Y587l}(0CD&3qH1euenK= zND;qR_J4OVU48Y%ZF7UtZP>huR?e-|*Y@yax|T9nEm(4A-DA<(&hRv@*u^hhA3xeq z_aTBa6&P;=b5lthi(i5V|6r8{N~;mopgtlNA#k( zwbrzl=b_G@c4-jS-lBg_*L71Pm_+Gm=65M4%$zTyh0HWJ!$GU|K-+&pp@?MZ@-j4e znh5)7tjxPMQnu_FxxO;!)O~qF%QS+SUqAf(?xuaioH%Ke$zs&754RCNWT528Igkq{ z3iGL9sLFR2py}xM+Cg-iuGtiLD|h&#^#it;85yJWN^=g)(l%GH2B`%mV-~%QV?5dx zOPXV5(W||Eo0k^hhRL#zER@f=sFn?nlEJTw{8!5)=sinloY4KY1l<&qDPaC}bjwqn z$&!LsbPc4`6Rw6pt*ZWfkjw46^_=@AIyk$B2qp#%d6>U}@b0`@>+8vkml;|c;b(h^ zuQFs%YTPd4{d7+C9oN$t+F);r@ZhXu#MHAKTt(4AZa9vMdRPzko~N}c&tl1)Y6(;crNEnWKIYy$hOY8tcj=|)nijd^)?Mz$pZ0E7El5C(CkD*N;M{ebl#~yT z+A|%iOm=FUZO}JhV!S@vbWfl!wZ1+?M_i?eu8!O$Pg0w$(ZgJe5nKQHnz=;8b&~T- zoPWiQVpUW2WU;WlN2WPS7t_M~sH{w~;X9+vRsu-^)8?J0GDZ}(mJ=%{Ci6f0y2^b)D7)tyWW!G+vH)R&0jHOeB|;T0viIT(mNWkP@1nM?XqHxwYZvhc=>8CCTZ-t-JE8;-&tTlO;BV`m62<N3NlmSMA{|b?{jW5? zDn74Wcs6dDALEd;4k?IXiTWCFCBAKIT%D0gv9Rd$Ge&sMGO9;}sw0$q@6ettiYxAp zp6ugBF$=bjID6}6C-`etor_#K95ha!+3hvx0xHsK2n)J3_AuJoH* zpFWB)y)C|I!8q4WH2&ZW&5(MccrIoB0;0s19vA2^-y|5c}ct5>GCjp+XC^Q`2`zjOpWV`R>A4{;DdnEBMYU;A6|$8TXXA zFpX)|lqwA#8v2|6AHcWxIUtmYdV1X#TS;+yOn$gth122($$GaSlD$Qo=Ff)n1e$ug z)vxn&C{oQhDw6dUU5tzeD%SiD-o68>sjk~rMN~vYx`2R&-lca?sZynPklsOh2NCH_ zdI#wx^xlKC&_fM1L3$^2LVr=e@4x?l-@W(UJH{Pv3`SstoSd_FcJ^6ot~uAN{Zmdr zMXxjeWC7Y=M$xvXu`%9|S@CyI^*dgel`#z036+CUdj8u%1x5=%v^*cwWC*DBe}q+z z-QSLkXV-8oiTlxHl=lSsgI=y;PlMjy87%$#d?f;>yPvH7Zr}g83iEFf+nqacx_=Xu z?%eslgSz?t9un%o6-tp9{l@DWmzmowK5VmYTuFpHGRDex=kVkHT|ijq1pp? zPXD80=zsARe@pgIW)3d@W?cHedX@j&(BiUQo44QZAbV?}!^Ua@@eB!;%D}Dh?M{OG&eWPO6dy^Q zoe*W39WInIxsS=+o?i>_aoNli4J2_DN!U$}(y7kDr2BSd!w!}(e@m?&G}9BToXov|o- zj9Eco=7Bc5Nydn)CboCoh>T{DftgpLd`7{~`jQ}F86D~N4tow;OP4Fpodqr~W45zM z+Y=Jpw4LfIZLWZhhlxTO&=ZOfux-=>eV_7Pp9-I?ngIz>T2HPrfNzUyznE%3|pvWO?MI2%E@fo1031fBtkCY-~VO-ai}Z zx;<0Vl=ZgM#pr^^({t0hFkI?%-=X5BQ1xbSs1`j_WbhK$>}pbzDbQIPo%}W;U&u7l z_Ud9OZ~tB=xFIRlDk?;Wf9m|%#sR`M9dlws(C`z-c=3bU7m^X52z5p9G~VHYL6}Xa zEjKGR!v3U%-og)KL_qfRqn0a!@Kfg}$H2L#q?<3>JZ@~))-RQuYP(}-Xxk=7c%b8> z(7yBXnBw4IDME*}tL-&^TE1jbH7?uZsjsh2vWIm%4sM@N3`FwQoIF@4fwZ727r2hQ zSDmfE&IF@Z`a)o|a45-ZoBl6~E-BbiI}Immml3pob}yti>NfUsRb3hx)|fA%NLS41Xi&Bqpz;|9`-pjxSB z!+c%4T@_>pLdIpEl6hWbQ9K!-qkH7o-2Nz_1H09o)WNuW7FF44A+#jn+2C}0$0~!B zpy=qNP5rFmF!&wyL9&8^jb7u4p;WdGY^3V?yCPbuB~EmE&D0ttx?I)1x_OcY1pgrrBXd6f{yfd7s7;ECiwF-QhCpFq5R_3oQLlc0 zWWSXL6radL^F!^7eyg=J=3cLgIl|k+LfuA=2!W@5`n394jNrw$<~ev=PmZ^XwVp_0 zU#bwt{F#_<6^Vu)cQsy_9o$|nr`E{k6%NMN%y8o6al7)gI?f5VpD|dT*XuVnNb}^m zz&TI9^tY-_GZRTx=%xFA%Yw4$`6a&8G*5P@vUtcTzBZrM4Vs@H}V!=gl zsa5CZ^dO6@pxS0mn-Lf1Y-^*&0=)VZk7xJr#NLixNYJzA2g;R&;E^z&y4T^k2_84? zY`AWf)mchox+>b*@S!i@(wx#lx_4M^-I#f9nrh#F#x}JGQ>mXqYsp_{$ ztv*n&pvPx(gEgdwIYlwe-t2k4T@7>n+85j~@zq#(^UK+tDS4O3)}TR=7l#Ru-Hf_u zgYNll8ejK|Pv0dv1233xhar0ceeJH%Tt{x|?gH74m*fIR%7~>#NQ56#>&wVXHhx<5KBTFjx z-v*;gnSehCO1_n<+kYHZWMB zwFRX%s&Gfso*El3Qpy?Hs4UC=?2A?%0&%<4BX4mZz1x_cI#oqYxs|t*A#5>MJ)hrz za&?PRUcb9rD?*anrD84Q)gq3JX-iMxble54sV;~3rxde^RgL%u;m*mX!1LNFBkL+7 zfZz{dv;{1!Ozannde_YY6CNEkH*#_(H9+VtuZs?lrvQQ<49-Y1*`R&dp^f%88XxGDBWfCVL6fYn>NRLR=i+Zj1G8zPNYk6VA!n zZC>Y^7?G#mn(r)=MQ?T{O6W1y_rgoYpitT9;8H`)BiO1hqE$B0lsbS+;D}e0<#y+7 zaIi)K``A(p$I22zGRB=W zUEv;%1k7OeqRE0@p?pW1XH>VX!|F{0;E>mSV!Xf(f$ofG0F+}{ded!?N{v0~nv z9J&UsDV%85S*oOm?+1TXf3+70KHQ3vVOQnET{Yg{qQRmkKg0H7e~2 zOSr4Q?VBzGvflo}-EiD6Pa5CQa;HQztQ^U#*(5sY2v^#}(e6H{ zp*-v;@{G!8bHh0TT-i5`$Yizc<)#v+>x*w*dlRQzp4F2;o*GBz!c%Gm-ala)()%SD8nTm~E2YM^ zBK}_9!VG6$VoGiCxxpmuYELW_yHf3=MpjjRooQp5llX`3L5)ugyi9YIK7M`ihl%P> z^$e^%@iTNZA3^X4G!k|=?iXvRs@4{hsPo`~cB(fVz-YOs7z1to6n-%`pXT=V1Rh4jt9msepr%>fOK|88kN}&&m)dA3>Q)IRF`35l zb^6-B$N2eaGS_xxjGyXlTfx+lgM*iaRXUIO%))ZJ)n&YH)Tlq!T27QD;l{o!n0I2L zoUj}I;%Tbv^#D3BP(~G1_k`G0y06XKDizAygxU#QwY8Vn&g(0q#`}{uff&Sop&2HO z1KZk}G>(&;%D9bMx`CYA-Om(Hb0{iC#2cg}Dw9(K zzfkfx(ptOz^qD%5!_GJ<;obbqsYrqHZgFFMSz9KFlBSRlkCoPMEf0wg?GO*e3yD+J zm}>BdE*G*xfDr0+u<$)}9LCuGuyDVxfjts4ilf8?jugX%dHXb{ShUZcDZ@LIM9$xL zZC}-ObQ%p<_OSwphY1qy3=ic@jOKGtuIq{dhy`ga=nQz|(B6-w# zWRuS9RBoswCEil~%pIGLGBL=)J|d4wCh)k$0orAQ6F!uVw0F@hD}FGB#|@Pf$^@|n z6&&e|1&AA|r40%Ad1*PVSYf5lbDgf*7bMEVz{h%=d9AiL1o4vk%@^75X9$byTT4{i zGiA|J7U0TAgo3Y!*HKor!Z=mhj<>AT8!0t{>&H*}^mXP}9R-;*0T5{qH>8T}E=_(Y z#cp37`h)x3#`Zd<^Q)hO?A!oLxU6=X4VQ~ne3Z{Z2<|g6whv1G{vshee}x?uuU=nS z88_#kZrM93zHUQ+An{ct3qf+eK&g{}68UG!B!pOmdlI{S+lTho zzQ~63&+(TrZZUpqZx}e#Ej?PpIz+H|M75ajaZSz0Mwy^v?ONHM=(lKkx~0yh=#2UM zPQ8$>CZ2nfj)U@lBEixW8Bn)(5>U2ZvH^8(Q*i0FI9jIzdUz`z3=5TdEs%(#*Sik*n~i)N@`Qvv}EJQ&xR8(3el< zGL*tw#}`9CxGrQ1si~G0(9h*hTgq?G!q-9%Ab^lyjn&WxvkWO7vmJPeQ4dpUC!)o5 zr`IUxC<|iRlr+fZ{B*0&C}uY@(z=T`p|#tiFr5&CLZ8I4_m?-i>_#A2@u?;o9I;-d*5}HciX&B2>!kDW}IUQFoCYxS!{n&kwbXF4R7vG7DK--BBk*mPKzY9`~h8HqT>sn--C9?{V9?ELc7k%l)2j^*y0p zd@7cC(kv`=hOTK@HBUub_$S?MKZ*=$8A3MHSeoS2!9I74~q%v1rNl7jqYR zU4|VIs^p^TGLu&Pr`u3~u^EPXX0X(UzU(2XFm8%7o$kWj_E8&|dBuMR_Cjj@&~f)K z4ck7#QnBA<_9Uy1pW9DfWysyWP$HJ>VtgbLN%9jrKAssb&7ow zd#>whdK3Bsm?)oJ9f)AOdHM@Gj9jK>Z_M5h2>1O5?s}CEsxQZi{uhJ~6>;79iCLkw zOZ)V8QvCPgyW{2i-vY2sI;Y4my-ChU$^VkJ-MRA^m$7Kfju_-MiAHyeEh0$9Scay5 z`DsW=;Wy0vD#J}z+Sp`33~+bgHK^$s@~K-!6_pY-+pp()S6+Y*0O+V|4`B+CrNXaZ z+N;kKlSoj}#6gYp-M=5{#|y=O0+{i=gTB(f=1p7gn;qMk!#*+lQTkhx@oPZ+EdK?% z_GiTZZG7`9s0nohQuskh+c8k)a||-d;s7Y~`%OLrP+R!_@a_Inxb%PTihatR1{;+j z%e3-DXIlq&1?d7OSIH-TU+0_6Q_nmjN7E)xW_@krH!fFQ7Uio}>w`|W=c@kzoh?pK zuTfKT=0P&ua=si0>ET8))mIg3uS8a@c;48y+K>_IM&HE!MS4f!!z#~Eu&A&aY|zOc za%ezF^DMerS)1WmgengQvjfrI`Qm}{u!^mn5lPCqvK9IrWcr_JL~{JK27Z*Y{6SZI zFhRQf5&>xJ00ur1l$~HIme%ACrNzM{?<|obvA+jFN8kf?3O~HZUQf>vvcZA!DFSLY zljCGwRfqlq%N|?ekpl-8HYIN!P&WHI6a0Pbhm>nQ;NjmdyK^P`U%}j;mE=)StariW znel>8?v5ilnTJheobP3{G!53_&U7co2Z?!Lt5H)EOLOW$j`r^{d}iM{(~ZBiVk1bO z%5b=uR7FAKWc~skh%4c5HAmhla0Ny zA#Gmg=dXPSU@Ch#%Ll~R_2G7NFvgc5luHYNFEV&q6d0SIM(TnG=MP@SQ{J3_jCN^v zA{6)p>*PeIoUucbr|3f(o1orbW#&%hv`bBmMaGK$r?ogVsTq(3b4WMZ8j zB6MM4K{K^!NO_qP#mIUSC*9!>IMJ%L`3_`KDzjc5%eK@Q>6FcYJOZ7oOjU|v$)VS! z`A`y(Ztk{Ee=$=y{g^qIFfzYHzny@HDaAGs^D>=q)@NlsOU@W?#fC{CpB{bu{Vn;4 z`Kus7ca7vpL}fMkQwr3Go_xlcN^nkppBjwzI3-%Wx$Rx6^R{O0R%ZctN7eB-H6Z*xm&3 zIt(DmFhE)F$<+4JmS@U!{lLZ+Yq@S{{_1=1C&q$@MCwiFt;HN2j<=P&Ku;h#la3El z2JMovLis-Lu#?_~=V20LB}Jiyh{E?=F(&ca&3~=~bCsWE|7?MOYH?ToRtAB*vX!4s zGv{#WD}!0Bxu{_!2@D`Y!s&I~-xq|e69=B}S29r_a6zbPsMHD#zb75J`$hV>c<3n6 z=nuX+w10m$XfK#7h&e^XJtmzF=_AXw{%0#`6G4^JQM2UMm~iy<$EgHUv~BrjXJ=D6 zzgM~XP++(95XzZ$JK?5%C`ZepT1?fmfq9|ummP(nb*{ z0o*1NJFv6K!~}J9(_n_$&5zpx98~Y1;@bQCuM~^N>nv=TofE9VCA=&|VVJit+U2#y z9K`Or+_rHk>TIzRV)G=9VZp(kCy2cd+ZZ?3sSJ40df>`s@)LcJi@x@)+JMZ`v|uS? zQv)|-hws^wS&hP$M%UvlyhtDutzJwzGxXVdfN6<_B30io4TJiXp96pI>#>@zxttuL z5gzi?CJw(hr~TGHYf7V*WKGpUlu{y3O*b~2L$OGw^Rc)cv-izPfSS;Nw7WnYkE_!w z0DuqY_Tpme00(m1W4CF@1OO~8e3hhXd2H`0m_YQXk2;xwB*cOJV< zNI-^n#KfeNt=jyRO*uxr{*2u1`1l;C&YCF{Ibh2`4S@D$Dd$iEFHajsYZSe=d+J=& zRJ#IPmJBJgtAMWcANsE~R61J%k=!`Zoa{{OCx<(GiHBpH@-clgGy|aH(rCqM2V&&f zG<;H~{(!);-g;ha+pn0tvsXNOXU94t_!VHOs+tN=iF5>`h#1}wZerS7ZSrsV-_?P& z)uKj12Z?Eagh@!3U;DDONXB~O7Ycly(J07e{j?3TW{N~!{_3u8=B>3EpPFg#dI*sU zqSeh$xf|Q4PQyeFJsVP*-VJK5b{e@#^>|8_%H?FMDlT9-@H3~|W1ARPC`C?0 zR$c=8Q1oe}TZU>zkp8t;3zY!tQ+x~UhNm^3R@segUuf2^2QGe1Xwvx8A>e00dldZ6 zoji)$HN{U(dlOPOx>6s-_$Vpm5;Q6`l5SXpcpeUfN4XE-;DkIGDyD%qXZEh{?jz?z zfTMhxL{<}7x1Z`amw^vilU+9&%{)rSoN64+CbJzjODzSY>x{=?KWnS4Zga z>%ATx2D=HLY3+;;!;z#xWi8cJ?1ay9tf9S}YlEPuSn9)LBA!S%&a8&_3&*}p7$514 zTF-zIg?=juH7%gurwQyhu$ibS$cP_yzvOfG+;9B8UBRCMbQiTyB+^`5R`VSV>?@=F z1cAqt>#91(*JyChdyWZPW+&+$8m;^KEqjJ;vO34<*YI&c z)}BY0CGFi?PRB{p0H|G0{>T$tt%fEN^s>xV&)xU3?^H$(0%BoAFWgzE0cx$;9v;1U zKab$z?|HyjoWlj*D7_xA@YCrkYhUBaoFNTWA)(a`D>FO6u&A&m-%myQZ#;%E z$AacepExXd9atDDStGk+>z5}_uqGZyP8h1Bx>$nK^tPP&S4@_Gl0<6fIa8bt1eovQu=P9Z zHgmiA+HVe`bJPc_?@doG#h;nxjWZlAVHs? zW^e2RCIa$%GZMixRl9d5&PSFyNU^L+S2;+~i;}xyvthd0j0+uLSd$Kxb+2+8T6wEI zQOx($-saNW*>ZR-a*vUkRK3h~fi$ty@Zo5;>Y77h-mw=)~?>;yT>~ zw@RQlcQ`!yTT!kys5JF#pWhH*cp?zBd*1Gd61lnPU4m!nymSb(Ysa6QHHecIobInM zYP&q2ZQQ#)>OOf>dCz9@r1-|KBShNh&5P?LDNT8;iZLFh+$_zW!u$wIJypBQ zEq^bRZ@)PsS8kyM#Uv_7YG#gNs3=YC;i)G7C%I6uTmucz$uafy)>VqVk(k)K0Z@YG zO%?P{45j>Qi~sI~r(!u`rsywxPBDPW2)(xxZ0%x^gHbfI=bD1` z@06t-LZzmZx4>R@Ui|RG4TX;z|7k55ayG~|f#gpLe(=0j3BagLgNvcDW+oVe?ZcT- zz!akLKAcuB5tnZ}G6eqAx1 z!ry$}l+3%2%2YAH2e`>PipONQ8SOtmWzbs5RNIM6WTMyq4y%97&HpB~w^9IG#>1Ai zWVL7rv)M+&XKe4@yae_t>-4}cPcq=1k`?EOZ)4WM{29L zTC(EnwFPOvvv&|>z(r@>u(@K!BDGyM3RPca)7)F;sYrOYm^hYw?@HZWb`5%oRg(AS zs`(NqAurOyi4gH{(Y4{GUzx9~jg{zT(h_Nr=UY=hTW6GF9d^>xH#sjen7l7imlZB> z=~b?6vnB4;zerzZMvBngF1}8^HjyTGHyB^6k8P@_1}N2~@9|V+-RrAX?t~zjli3wE znoELi?9>j3V*ZV3bc;|B2=^FTJGEihqW4iI8w=wQ@P!d+s~v~r9VIR>sLLp9GJ=4{ zXRf6}EH>5C_3>E=wm$}F!kU{L0?#bmxvn2)Hm2z81O({aMZc%(rmu*rSf~@T^BvrLHZsd;!s5R9LA->e!r9^ok#Z;& zB8pE>;2qnKSi)l$Nq0C|q~7d|z0KpkZca4uvp4J~gw0EEjmLYl!%(Fgw|2*mv}SV& zWvylu%}qvznDy0&;NXT_0RgioyX)rb)AJTcl?4I5YV=iw`eVy8NF7?(g^T%u<*@U6 zwp5&Grkjh|_h@9hv$Ks&rL9*BfJBhGNDLm%FHTGuISf`CkRCShS(CJk245&S%Cpku z6PW(iMC=0F%2>cbhErYVJs%ZBVd%2i>WFZ7*grJGqL&)|0`h!wzR6pr;4UR0h40l~ zCw-jcebgG!P+#0D-+;k6UQ?P!IL6Mq+r%URtzeQ3H8u-1s^xEwo<0Drf@H!PcYVCr z={XLMm!iG3x$MSEU_a@#$-R;^!5|RDbKTBaoy~E)?!Wm-%BOtT1%5v2*n`At(^aME z1HH-3q6;fzuga5LhGtJGRH}&y8_<1j@vFnb0-vy z$Hvo_QLGf&lg^7vdTJ@u#xY*A{{BaSCl)4CZSmVle9fYIjwswg@$eivRx>#L#faA^|>JdD(%w23#Ce&4OJqJ(u zCZ2r&HrU`1JAc*^|AbvQS*D1$S(~rorQF8 zeIr-+9Jk{UTA!z~}%2e1#scU$8jw|_{51+d8jYoG|*_o{A&Ih@Yt5uejt93cA zbHv23t4^wD0swn6ZKc>-^0VG+y?)}m#t%*9MP7hc@j2Z0FnSE2G$390b%f}YtPWYy z+pb{74Puqj?5re5jhmsoA+VT`5YOI`Gon51B&lk-@_77Im^01GXQp8iXEKOow$W;+ zgnLXBW%L_NKP}o!77>ZEP4DLa3(WWL!qs=)<&`KQ0~`9SGuNdUynY?emY` zEyRMoXr{cDT9L?sFNtB32+-!IAFSN{J}sj*@b{>ZNPyDe{+5!q8;I)(3)Rq~JPH%-89SzSNcuu2@?ksyx%ZE%&zn?(gwb<5{Pn*uI zYR(hS0nu-PEZnN-Vq#Zw>k3M>$Be!|4jOVli@J72b`lO{3iiq4dx@+8p&x!l8c2)R zzszES2ZCGo>URM%gH<11G90J!ClY%)UqkOymYV6JheD)i2?*j@pZj#Q@>cSU{6q{< z?xNT-4A(SN_fND@#;YZDM^)F%#3zTSV1ILB)N;FjB+=ng>j@5P;iTgiU<8e*Sgz8s zX-sNRR9k%}Pibr|F3zSb368zzAT#Pyo&+_EmeL~6?22W@JjlS2o)f;Co3v=ashgG3 zNCN_~cL`G8U#dN;5>t_V{|*2c-YGx0CRH~MaeCNP5O~$P-c`-gDR&eVZ+|rMs&3#S zB=P|hjs;fQ?6S)Ohx)jdOG*2)TN=98`E^FjI5?Cao?&Pj-hZ5(MicR{WNt<-S540^ zc%r!$Sb1cwA*il?ORCNEeWY(tK2(n03|diEnU8DHbX8qY`avdFp`0l;nvbGws={`ey6vvyg$0{-h7FTPiaV<1-Q=!A?Cx z%4|;v&Fpha;GgDG0x2SCrW`U}Ps4+$$9B2A-89ZrgAgahGv7jc{v%NIqVuPi=3r4b zUj5kTc;&fmj1c3f$QSReIZWJ%9C2_q8$6zPkGLc95_LUDg1_DaG=88`qBDJ#@ck=r zA4g&c?yc`_;qGh_Sg4fxw62Xq6kx1dgI6SeMWk)Dpboga0c- zF-cs>Pc%|y1uVJi6>8Qa(xRFB*Kc|l8*5uc!wAHv68i{%vrqMTOS0Gxr2AJlP~KmH z-Y%`LEL4!derM*Rz{Cm?XQtvu6zg8?uZg3HlBT> zLk-ixg*#g?=EJqSp_WNg&lYF^F%p5|`Fa_!Yb8DIAMe@u=8VsYS|(J68xpE2F>mCUxo`Z%1rSm=RCgG|G4$2Ys5pEjsD*4+G0`cSx0uZkzqzafJ}|0 zOj~RByT@s=ir(t#syt_YizrjtnmS8pm160<^IBt~-w)idw>0j}hnws3T4}Vu#$Ph- zRS2$VGR(F{9Dmi;^n}v3+yu+39p2}M zN@S-!X`^bT-($cRKioQnqeW#1`<`sAR)g(lb67Nl+8*8X_~6CaC_XQWqZU2+aiK^~xMZ%I zuF(8(uoMX)ezwI-xsswI;Q~yP-~2{SC@6A>gulKxo2=Gke-trdSoxo-w7WoUM9=Nu zMQcITxfAANO+VBg$N89zQ|Vhmi%os%XcLJF#aLqT*t(7~hc}oWLymNQV293y{U^Y< zyWWS^sciJ&cwrqkHBDu|4aYE@csBy!j{gY=UMpW2`_vr(Sev_-ou+(bBuaAw^JjEb zA(f*$mP^NRv7WNGs8$pzPGl{1)&umdz4v>yL_On9pCdKb;ru;-F_GADxwlD(=Lv1i zM0YVc>Vw?B{GotK*G-6WR7OXBQP)bY_uEeNcC5c40=w+f%nS`<=;v`ZLJPMH_cjied(uQnwhMa$+>C4b*P8&50T~E4Ob~;odOHd7W zSjg&L>Vt#Ds465-?#o!owU#iIZFNZnp%`36kA2u9WzvCre5Al^BWq)n(0$a|98rA6 za|s*P|IEzI%W3D%B)sXf&uBv_O6`|X6wSNy_7fandiY1MZH(c)v>^C6ayXr&4}^&k zPG@GE+lR|Yh&jHHw_f*+nBph}^$jOZQI%_P6=5r{b&Z0gH;|;qI#)`NU0}PW3b%Re z$G8V&$b@J(8yVFm_1-txoySx9T^)EVl6JTRk;YJ8q}1t8|NOeshhzN-V$0afC=1*I zfh9oXeaKJrIy;8l_j6}_;J!sV0`AmBg*1-ay?jPzN08@<&tD*=>r>u`pbZOm6sIN? zO2RSwJYV0tJ@xtUHKo#`8$p!Rx6F#(HC0z$aK890hKT5N&qEccU(dhQBFhllC$gD$ zHIrVwXlK&GbaF5WRCEAj?-Y0n)~ER-cUQlwlxlyhaW(&o3JIdUibDn7U6uloTYBfv zwcYx08Tf}EEepKrd;49A11=fZkKNsFJ8a9N_h|8(un^h$NG$P>TN8O}Mhhm|Ws*JJ zk_+%^2T7^nk3?$93fjn(!-IB|pgWq!g$2b(bNH%YpUPG&Cs1o7&w9d7cF2A(nS%-R zV##0GGx#~*xfQVRCEko26dr}a*9!HX&n9~%F8GCGotJ>2nEJk68xCPA4Pzyh+6!mn zyxZE|=_FLYWp`U2t>$LOEcEO+(qIO&D|L($#zFgv`}!&70_h zvuDg>kCp1G=X_TY|2Sb~{cy2ws5!%II1>`wfohoFjB_P?xEgPBMZK|E`_3*V#>9vGCZT7Y9<4o+9)RPGgR-IB(c-rK2@*W93{=)Jl zd-xrBNoZS}1G09U=Uq0Sll+CwqAS}rt@xqw<&FW1Hp_i*SDUZp`G<=BIB* zhLo#4u%;qCjmnkY^r>hZNI7zFf!uPkI?TS(6ax?H@ac7Hz57jF>JJ3K-)<)zbef@v zD03EH&^x-^fB#n9j)BwM=CoGfRp$QweqTkyH%CS@)+A1wAGsDXP+0F}iJV_$^caD! z`jo1b9YZQ92CC&nxOP4Bt<&6A5r?{m9zo3}`~xY4APNTmF4obDqL#iyO%`I2EE1wy zKh*}W=oe=K7fvKMz&m?=!G2svUc!AUjG7uzdR)bh@$Bwsg!zW`nvBX*9xUk_sV}*$ zxy+M9kG~L!b(z)2dCD=HNfvKk9A9A(?b{wN^~2Cia-S_o!JG- zAR5+FvofWu>u@f1eMD*Xr6d(*EwC=5!d$7kgGLGux+PFHaOLa>p5Ln;H50?3u6)qi z!xc5n+v+NnQf#s8$4KimZd4_C2Nx&$-N`7qV|+_J3vn&Ae6iug2;BQUtI^$qObQql zhn?oORp!gQ9<=-#jV5^a<{B@k7S=rM65_PLnFC>O`(gr)hFOa6p5-v(CX$enlhcGi ze$p!_P^p1!p)DJ$!bfE4w3Q?hSj~f)Bf3%4Gr;zj-Tb?Zgt!`XQ@cFH2LUGAx7$0D z8Ns95f?eD$U@`CrzUuNC8ll2=@c?f0yV_{R_28DPwWo8>Am*CWk(yjt8SFTTr}RrF zr0;dqSOxQ2c6lFe?h#XFP|-cta@K1qDMvBLpQp>?<%2YuTxKguElqbNcx!yOuGt(9 zTv+soQ(L$jcEV&?t;{FAqpcLKbXTaQ^WW#j;yav4c_J5x(~EP} z>szbA8!3-b5t&o!^w}bNIonjJI$4r=JgcA~BY_X$p^~+ri`qh-717hVbe*2U$|UV76>K}>H9DS9Ca8wjK;!0DoMRG@)#H|mM! z%S53dEt4DlbAGadiB06V^zSs2D+!U#{xvw5{Gp^)(sdWH{;ez?b*xxF&Vk4xvGND@ z+&r0X!@HOMu>)`V+K=KAUMVUeEyy@l0%d9N9#!pGR+*6oM!5?hSC$gobNrW`|56Ys~9@mTNZ>mE$O?Z(SkT&MNi#{)A0OcZ>{ zi7JgI;wrKP=1F`VHS{ku)gOu&A;>zzrofwLQUl*Y1MVd-Z}~7bR_8Y#fhZh&R&ccV zcXgpT_x8p_f{qt&h|hq{*mcMQQWNPEu|FI|n&sRVo^yAg+&>Z@o&H0DELL`9STm?bKV}vU2Aq@C64@Rh3kVpv)wvQqyL(Mr^w2ijC-#y z4<$CsSqcEeU|@+qN+kNnNO>=ZPp4T53dBqckaCi}PM`sHsa zHz=^Z@Cb>6v(2MG#=p){o~@pD{<%ArKjHSEB3Q9V#L&_TJCi_k%BT04)$>Uk4ztOh zS^>0zhR(X8CpzU)CNIDQISa?P;^ur7ml^u=J=lhvJ1z3l*P9GJMBNVYPX?|x0n!{< zCgt%7zQ27uKHm~as3qV(M`__d8k<;riH^^cHRY%2k;)uf@{~~P(7#XVEsYocOB7#K z754)*gFkxvuR=*#7NP%8o*({`JiWJEUl=jH{IhqV;vZzxt4HY61PsxYgXJ0i+ld86 zB32Kjuf2?ue#zfkjPfwn$QVstBT({pca;2n&|f*_BfL`S!4XO!k1F`lB)RT@|Fe^^ z{#zaGCFtKOVV|%5Nf-YwSNAUmeD(dsA*Blmbkn~Wr^b)E{fe5Dztp6RS${jo-nrBJ zFGu~4PxJrx0Nk5RRN(cU>M(QUP~opa?_yv3=(WOw@;? z_NI4>x`VuwZ^Ywohb3%RT@nY)1iZnT4Z0Xb02!WEh&S?9=Qn( z68;7G6=+4%0J7xt>B*nf>hlvIgrpX1EDKG@N?9y|)tQc4RP&qKaF595&Yflk`UI*X zVwKl!Tu5uQ%T6t?2FjmVGTz| z@4_x#kTRBXI~*~2mJX(y;7?3G2P_%hYHw^Mjt)6rb6(dZN=}ufZxz)UnNm(7cvIX{ zr5+17Zme{hRTcq;wo3W=wMY{Tf`e~gc)24MwINGX{T`EZXBAdzido3H-+Ku1)o+uW z?yg4z<`&yqTN_*IWkx)+c|jK^M(Re5^LDD7WmY^c60Wt|lI2|vV)JuoKo^Pnq*{x< z_Q(h(OQ^+|(P0&rsEUH;t|!y^!51Y&I;b3KROOiHq51@C+l5r5!W5YtX21?$xj2od zN?n~xz%DF9?hXcEimbTKS+~r&&29DcaP874I5XYuPYgl$JVEHTu!9o4L~bp8?jCWS z#^a8XdPjr@O?>#4OUCOu@ukLUNa!rBCNf@II?{@pY1evx7pZV@)uC!}**EN+s>a4% z0ypURzLv?F?sGMCV;Z2UO}8g%o%a1pWpY_rS>*4ZxVZ5N0c!@y!yvK>ncp_O0u}Rk}rrk zm|g~qWKL!N?$q{E;P>8j^(ZU)y*NK9!H{Brmz^qiY20~&+VuJD7a%W-d0I|pQg7~d zQjzuj*q&IrOI4P6-;LlCRFA71lHEdn+o{{Tqvluvp-=&$!8ois#IQn%&m81hWPq;8DIBwChB?N{!*>;&-aZg`BSqT z4oCEAwQ8H2+UOb!cepAHPa0?4BGX29Kw0l6YO3GQu(C6C28(r+INt|EzpS<2w~zJ_$j`yn?jJt8>`QdtPaP`M31jP8ce*05^^!(UaRx^*nC; zre0gE^13*j6&F9Tx3{O5tl>QJru#UlJvcq~Jx%XajX2OvnB&o^vgqx}OwHvO$_?ZB zu2%gm$Ctmk08oG0s6AsXwdMq&!`-S+X|j2ldb`Je#LnWc%4RzT z^h6u460iB)r+**o_g6*aOH|l-JFu{raR2gam=DE3;y4{x$x^CUAf2SPe_guvc`XS_ zO<(rGVOgt_!O$DDgt1H;2fcj?BLTD61(qlSu6OmaTA%ovf*b1^ z;wl_dU4^+eKN``!1gO32ow5%Nv=@}_?dO9S)?49>L zog?VjV!Y0bf;LmxfY0Oo0foHXW27}tiFRI^ZkxvSS}E`$1>B7d5FgtGTc|!MmY%Dd z6cg*BT{ul?T&g@6StUI?hfr7_JLMhq%+ZTcJzGO?(7103z^-FF62;qYnuR2wsNNqY zo83{3>w?SUIpuaU?s7SD%_K9g2+#I{5fRck2?*Hk;yiMEcoP#1P=zh`V-lC>03y5I zN0jIgjsqpfeDVj_L~VZPB=ltPp{g`0AzKAup*ZBp7h6V*ePbA~&ep1k;zA|3iaDXvTP($))bN&)Nhsptuf@y2I^DlYU8lCL{$rk?BYZ@6;j2=Jvd6WAS1Q?O3#J;LhQ5-yip3V_R#m)9dYs zbZYs(%8v7Ft`{ukGfW8p2=z7cLEC+1_nVi^u=zVU1nE^tE6k;s(E&>$dT?)f--+QY z8%|=t7?}v$3N+joO_IyJ>>DUQE;ZW=(kCvdb~H4BgKN^N$4-Eb4^j3N9+V}mx@7rtt zd!2pGS!bQBtdgwEH1o_%W}f@HFX{dnkxa>jvnzMbm!>WOVv-RXBGD!w#_-JOOfACk zh|E*CS-OPC;StsB&gEo(4gO^F*;dDQhcmCGz0To9Rs~ljBI?rB^UYEFZ^EPjqx>G3e`IZPWAcITmef#RgMzBh$80 zG_^8Aj;vIORM+832gvJ!KgSBd>hTJQiU(Uwz$4!=N%70~n9f{SBw>D?4bVScSQbn_ zJKxr>{F?h+;h8Va&0(c=^V(cUC=+FEi9~p~^Wz6JQj5QqY&C_%DT;TCu|%9#GdMnK zUrrmEuG}XYF2201nlhoADKYRKw1kGFzP2$d*;f51ba4@13O>s(_9$^G84P&*)UVa8 z&24LHPDWapnkz@dNmbZDZ4r@3e!|LvY1b@(z|qo9(ZAu1>_-6|_$~{{L{>e1&swYe zZrs_MF}CaWfOZdT>^lj-r)nE|h^cU3lUap#5dZM$3}A<&G@a#kbG18mocpz2%61s`$1>XmujAcW#(GlOp6VlPtwJfEH-wZvz4jPcrLjp}E zTB?4{)blqrVU|#sXhw&sKYo!{vMtfqDJHV3q{w6-w`G0Y?&s@y4XBTAt{dWNV8_b{ zb{wi!qpEC*j7B{x8;h7G4WS`h=@P0VkdE*z5B<+z^S&4soYs6*lzD9MtYgZ?8(C(c zxk3gtdx;qZ{K$t%avm@YKZ09;G7FTz2M$=Ym*7dFb)LM~moj4A-C>WgUXn_Zou{d$ zZb{WP4&<-6v?B9OJFN&GyF{#dWZ=yZ9SY?1&Da@+7nW=$PCsIpk5{c>B+y{fa9@Dj zjQS(XUWkc_=|;9hZ#9&lwF|#dXC8U2a9z(Koo9s`e+5#i6g15@)}6c(=YX0z8?evF z^H`_qE*9~vB?PG*EM|QGde+6qkukY>YEIJRos@r6<{ENQBap~78_jO)o8vG%v90CE zXp7Nwwoq2mdY@}IUn8CuKjW{G%B4E&(T}qFaHj|i&W#B#sZhw&>hQF9VJ&>K2Kp%A z3Yf}RSi)ENt#|x+`+|(-{=Lj3{H&DL=nw}}6`=51GhN2X9D-_XPp7ykKKwZ&f%^Cr zb_5odwT-bk+&d9c3M(HAKfe$WW{hgx#PCisQ4gRTpRky4Zu7WBW{ZPMORI9v*oUUT2ssu1A$)xWz( zx8C};A$Vbiv{MRouLEN6aLB}g`0AZ6`VysxDc{gP!${Hj9mAH%`x`z%+M_4<2i6IK zej$R>6a+ z5^LX0sn{=;rb5nfWWvp#+ZLuGcge~Rvea|72)2fk9(l%3LCW+F%id+#Gp?~qktcfd z2(#}C7FxBptp;#4y8;ERCWs9-PDo^NjO-B1OUE@k<9e^H8RBfWw=0~kvp44DeF&|n z!H{OVnF1O+TZRg;p#r-(5gM;wURuZ8v`2ASq-!a=!H=>NO3yE^N{=-T>}~U7u&^53 zhCDtDXt{KCTGTn#EbTS@RGDdX`*?7UC+U+wtWI3-UFA&t0~wt9LWPdDMdBWL{wiP~l)9O~rz!HI3d6)z>K zme+{t9?jr$4X7%L)l!vgEPrPAp13|>SX)qE{WwzQAfoI#o*+;4j#J5xZ^k&ee^%IK zQuy(qfk(j6GFUd9Jf>Bo^)s?8E}`0sh~_&;o`M3q2o=WnW=EBY%xiC5jcBUaR77~b z{!*3GTz4{_f^(OBa&vU$V^~yALD;0+ZXM~;n4%a}RRs}&-{~^$NIDw(;|OW>OCNs1 zO|(~951po-A~Tw?#UvuElNh^SMQ1Ae4{u6dGC3*y2;q_?I^Q=_{Ji~Jczv9Xj}!>h z^giL`9seZ@ol#R^Pelq*DMtq5;T%(Oz!>xXz>7_zcG~m?Y`03dL-8Ej;-3PrJq`B~zN$cft&Zbd6muQ&+gKcVrd;7| z7?pVq8Ms|rCJPh!NF-sHu+`UlUXiupTxw~8f8|3v9bDDUM5Yz7U0fE-Abv-!;RA}} z-1dj>oJGk7i2d>N>Jy>q(W}mm`mfodRcR3C$H##~lB^ejweCvlOzn8vM zJ3E869f()Ca0P#@%@aA|=`k^Sd!6x~44+LJz9T1VDk_SYF7RTb$3W!*YxYC{Vc^C5 zC4tD`Je`xXnM7wJGtsrY;IlB=7iTme+DNAwRfMwY{G5mFjK(ooWSZTHgUzkZ!(Pad zgX%ZZ?%SerOEdp~VpUjh7Ua9PV$Dja5}=)bA%IE5RajI*V)ZnAUdup zMb(Gbo!h8ZCCDpAyJl?<~Gue>UJ}1~(Y;I!sC}vr%aOD99fNq6B;U5l$ zDZ4T4ix_EQgq9Y)Ix~*bFmp_55hV+3wUKYHuEsV7+zg(}ztX7Lofz4M7n{32Rd=3& zH}VM04SckgSH zyloo!;8V{!7E+s04)qE9-6wa#iCp6=)H=WZr7~Z~L&e;o$bK0*F>^504%@d8%W{bwdS84@!zAU|KGx! z3|c#y1!X=_BqCa~%{`HT{mI&+qmut3^-I^s#77P}IcaS)mi_#?KYJ1j6r4f5zqH36zxm&*QzNdKD_D^`Ez}^#AR_d5_l7 zwNEnPu(%R+9c33Bg_bn$cr8-7I8sg|(2x-MecUP>6dX+# zzq@T=s~LFJ{#%KgImsaO+X(j>Z9G$DOSm>ka0)CM(pwla5$qM&%mQ*Ku{kH=FRX4V z&1bTqc!RE)kQH9x4^&_vq~q`&FTJ@B%aq* z!}5d4+@;Q(6OV2eM?Da!7s$@STz9wyrMT#4+M7m!=&a}O*h=2hy+Qj< zk@fa!Y^Vn(MOyB+!s6ag+@M!)rnTuaZ$4BqYn&*=dzaT!Y$_N z#Q6e~s`%q0YTi`s`g)!IHZpwTA#B+D3v)Q>L?LBpk{PvKybNSIeiYWcChc868X5=s zO8p1pQ-(!cR?qjlA;O=>>$g~aiYJ=#2|sqmaTS}E74*JhmGQmZ?w9$_Kw|}At5Ck& z9jtttK3t90z(lOXc!8|`)QMt5-n(~tpAzNNa!>lLzT(JOp7}wQST2v*Fe39q5Q|vt zp?=nnJQX|Q=btLHwkL+9QS?$;W;*NhPvp!3i&9=L7VU!^O|k0o*7@z&CuFQg!UZB$ zTcg}5&rt{t0N>HNyX{*JAtzqgcP2Je%mUTm?F9jFt}3Ey{;PF)5PoV!RU%%wUolUn zR>mm(Mc4F|4x~P5N1t-!>2u4`m5!_n2~zyo3gVBsBHr3Ckgr#8D1*d@4^*FnaYDOR z?ftY@ULP8O3c&8gN|ECK33@E2roN>}FdY}}>ZaNyveJ1$d@f{tH{AD@sLX9tKj{%R zp-vK``3;Xwk@}0;hlVTc3{)g*;HN?PYCG1^LJdlql^>v?Vx2v&9F)wr)mu4JKaL83+LqC?D2NOU#wFlJML71niB$kJ#j{1!3wx-!nIY?f!}nc+x>sxcR)N zp}}bYZ@+hYpD)j$QBbHBhO+TH=^nB&39_`w)8^uY=HY6|UfGl8l;<9?>Iau@jB;o+ z|JwbyxOJ)E?zQo={lXkBYh8dS4Uql3SZAL4ddtl#LykeEuUO6tF`trc^yc?<%#ZPR z?~q!l%%h4olGVcG?Z{apvhA&|Zj2#dx({*fZ8wz+{uJM*tNnM$?Th{yRdPepY`-bl zPu69Ol*!mX;cWHf%R(kem^!_QKb^G)uX=4x_ykV(-MW9uSTpUc;?w?&e<`!`{mt3U z8sTd)Jy6bgZy%MwKumYrOQ|W&88uV<=#&p(n>6Ml0bTV|Q-ex)tWqP(!H>i`&2!D= z*1PHUc#ecKJ>0a6X4MSZ)_5YGaE}Q5d~G?5!0aNEryZrwGNiFzvUmjl?q$ zp$B6z(kVI`8Eq2jt~cWoU`4-&)KvXC3yM;%R!;ymd#z7SL=j^}k7n=9M$3l<7N%>j zJFtgRQe;ItY@AmdzhTzXBe{G2DP4ceRfp0uSQ)FP%uk0jI`0fNT8BiG62)De1~Q$l zhY}!?eGexN&e3qRG5ARL8@bF+*?!rO~k6zTkTlL(x z*cFZAf_KBF>pE^ksq-=)83iajNFZ&vkMWY$+4GTFDNCY=Tr7q<@G)xffn@5N;2=IbJG>}_4rD?5jv$q7C|Pl~sB?@+F{cuCn$jMvZp zlwbv%*ROfh_&?ZkJ-6j(SoJXe$Tj>7}}vaEM`Xy zS#CCXT8}*u`X00s#p9mGj|$}T`=4W-03Nt8Y2tnn(9VQpB4C~)i}LD_-I;QBnX2st zq`q&EeNY#NHg4Tbft-bXac9pXUTDiK#b>$1Q>GI@87pxstZ`_3$k;j|S}bj$s{N?b zzrua|o&C7iDzBsrS3)oq)@`Y76H+#*{f{6$j#`fXbC z2q-1miQJ)szDIq*dcEnfbWXXgK^+p(Y_BqqQlCEhv0;wUba!k=PF#%O`loEK-Ei+b~JsvUZlVKoe#X8GyAj8{;XFQl38imABLfGoyty%c$to8Bjl0m z^TK5Z@f1;~YqmR57#c->_nT3Cuxxx+(X4mSCGxzZyFII;EgPH2n|Z>jK-*TxnboAv zoXQ65;Z(l*cw3d;(&fmDt-9rCS z8=y+4s#AwA>$fL=!ZuK!U(2IQGpJImr5Fi)J-t01n5bMmeD6Tkq-FKzTwD#A$rICV zQf0!e7$i$^AoOL(D5!ZJ67wJfPwUg zT$0rzV^=5T7M71>`B#L)e_sXupVK{70H{!fd-tlIpR}GA$iR%RX=|=0e#a1eO%sLu zSEj;$mR|qIwc7t{E6hNmBVBgqp{VlcJIHGv)+eurKn{D}4dL#Q=?oJXuk^5ELDfz; z_&-Pld>!Mrno#fC+8F*UftvF#+>q>Of;?+^;O?84z3e%a5yBZ4yHhM*#4Q(v{I-0D zY?jJD`O0Mdv%;|k7K)kDs)6G)fm$-Bn-@!o7I7IzNeDEu(_Us+-0O%f02F^VH-+-h3fQasr| zo4c&>d$#-M?SGu$f6fkS!2VTt7E0@_$yHTpwU}QiSB~VU(+i8i#&Tfu>Zz%=GBKX& z&HrG$ut^dqd(KamfOL@)W`n^}<{mb=T7s)odcKvBN*Z`?A}95)wPO}YUG+dmQfFT_4U!n)yWJF@|YuA_KR!hJ*C#HD@;1F*Y9dKV17n^?OB`INBaWKB9V;O zF)+68WZkQF+sLY6pM=NAfSAw(IDD`;#NSrOrQ(p^7x}FKa0RF}6h66Pt8XPC;w$mf zEJ^QuCQ@hNZN6}6YnE{nSD$oVF`@s^cA+N4O=!(L{th=0>45P3&()q%c2iE>kX=## zF#+02VttuII?dS$k+$A@u?N-nWi)uVt6DhOD83~26ie+CH|I~W4!i=uJ`c@mNhag^ zcaM~oc62{UUuw16ZE!mzl9*xYxZb&;fAa5)nA!tDfvT05>0)qOd6&`JTG`>5*Jxwx zLnXt+fNg~t*lo11?wqkw;9f>wZD=Jnij-%(+w? z9n>*FBF_V^AO5f<(1y1eo3U?jSVx^}#AW+IjBOXy;ItM{H&7vIS}f2Kx4lRcG5t5j z&3L^ZEO+F3>GFx033H*%Mni7YRieUy_qD$qFj8!ih`k(Wh}JBeV6Z3g4;KJ+Dk9bM zMD7qMIuiWHYPNbLsAi=`{q5j-CTVJ<5TPdMC04Yinv8}<5cT*Jkk{Dp6K1`ieIyW) zAHLq_T7Ivr8k!$n%hB;JY(4@=kLf!9WpvmplN=tkMU4T1Dk@qx-IqBhxfw);uOr+< zft+=U6xqL6LOdPMcUUfli=2MF)Hl{q$HOK#PsQ>m80lL8@XuN!Kf@R?+8ky29EP4W zy8-9RS*KIHt-Sx5tcZ>sCP-cx&%a@mX=b{P{rBuS_bOf-(dnc z-_FMKs<~X>LyhZN4Ayn``-B?y6DFyC3J;YZ5($^ha@+_VpY4qzmddzx+cchNk4)f$ zhtSXL?g*AOW^fw7V{v_rrX~+<4^nDL1YNwAvyv}Ay0vWu2P-`1uW)n*WRz+SHFPTf5oe9{@*QU1r3MzM4LHY~Gi^O8@iWDnVSL$@| z^)DqXOgB3iJbl-n%~D1(*40|%q9B?0K$7qj;Qx{pf2pn3rN>o>rs2RFcCy#xeGUo& zSWOl6`{s0|c}a>9lq)ddFXo63$fpM~&v}Rl-+q>6;U4w7oRzoT*Pg>9s6L;q?rfoz z!)=+W?8rX2fB2ApzBa>6$e)hue0{v~p?1B+LQBW-jt*J3pBClX&QgKr#a`hSrk|rO z_KvyUK@eQ;MG{Z39`JHnue<5MBkc$1`@RuBr@e?pT2JyQC#vmkpf^?80V`!~)5UpA z(!EGY-3Wauso6~2N6eq(!=O`BbHr=1GTlseM*2t!M!p43H%oJ8q=&Vf0g&kyYc;I9 z9V;QWr3kx0o*1^Z;ZtE-GXv>CVHE%})po+TgA$E?lB}{XM`4Q9<88;Qku5tt_-7Z9 zX47x<&>2^&al6$q_l#h6is91K4GVk7V7@t|h-f6RK!x;Iafim>zLH#CFlIk$HrQI- z?P@iVB_8y_SmPQh7(yGPn=w<=QS~$K=^j6irGR_SLRx%9JaGb(OG&|%UOK1&27824 z``3ea!dG*Rey{iVG>bOdp1=YGz!*_&z5Eg0`{Iztl92vjSf@r0k5_XOb82NT^k+_h zGJg#r>OK(k+p`0PAtfx~hYc)dSii;4!X?4!D6}kO)79+-KFXQLHFaX{NU$HxQ6P$4 z%sGPP?q!q>kf{?_Sxq42Vu@N$&wPF)D;%TYwWQrpSVd~NE^og)^0mTCbSI7IN7v4U z%Il9i>sH%Cv+IhzCr>=eBx6$*=HFD2~4tJlc<)sia9FklUuo#`FUg7`9gYw=NNaufmckA8_J2*ax%xPS z3b7_lQaGQ(TGlmS@;c<1*fOoHOvQXktUVPH$)xAT$hEirM8v&N7g*-|0RVB-!`AIZ z+G1KOEII9d`s(%6^6NrLN3^aP+r%cBxy_c%<-!45FYIKV9{i2IGkCJ*#q;ypDwRol z((c8(T|(>8R?I%`Gjmw$G%x*fNSFASrH8aXTb?zoJmEqyF^-xm& z6g|O609d$19SpWNl36e_J=AYak8{bl({<0aTq^jI?~_)15l+t=4hVQprBYPGS*+p_=0j*41>9itik1x z{wXMTMc=KE*o>Fj4yRqC3|yx^oQ9gwn!VU)V(1j)spX}SE_G#I*Xq+vPq0qd59H-L zY#FM>JR_?mM2m7Co7SI8B<_ER3pC{CV z8c1LKoJ}^G*>_HW91F`FY<-&9t<4k-R!ofg;14Cm+!3BXmx-n4!6Y$iwoe)#{y|M~ zki`LCB>l2$%9{^*wG7cKjw&U2BqrLS?coYC=3=pPjT`pO&WnDUNa1 z?*;zJM$ub(OmANG1sFvKkNEY4GMAJNG^MwtFV5#b2Yf+X`=6FdCT%pS!a5iB5)Py1 z$`AGF6Xj-dlEJu8$qfSd=2rE&FaR58B(Q)ol!Bfs1r4>XQr+lLW zY}9=3adlPXdJ-SmU+~A*ujkEji(oQ3*<`SnDP!deIYI<#TudXK;ODb#8x>7J<63rE ziS6WA@+kqnJv5OvhVE(21S!NDqS!+FLR+pcqqlc{Pw(ji@8G}XqaO}VYR&n;;NUHf zEVG0AXWezGroogHbJZ_8QtfG0`HEz7Co*TUcS^YkR^#FZ6qS{+6&N7TdQI#_^%*tX zIQ!tLKjTW(7gS+~GR;`^(8q!=d`YlQxYxBzJSX<;#KMb1cV}$h$x3fuy@qByY4bQc z92zk1`^7>awusO$+)?wKQSR6Nq&t;e{L7YtLTdYLG%9iHvNbOK?H7U~-D=)BHy_Tv zsp&9t`s`sXu1YI4<|@SAJ5%5cw-g`FWwf;>i?xvO$_8*d_-&%AWHn~+-yEvvS~0?H z&`(QM<*wg)ihqIzY?Mc`JsV4Cv?8<9@J(==D^2U!oV|9yGne zk_v`RN~Y@FdeIOsLqzu2Ufn`H@YE`6)m@tKlT0RbJkmT+@qok-tX!myxxv{RBL zWZIHNqqZh7--7}eX1;I^*(qA6w$=5oEPo;J@#F9QLp>uK*ss&H9f0H1w>*=gov`P+ z^%2_`N{Jh}R=6=sCt5o3#$^DibDe7cf?yIcKs~(|8uImts-6*DosYG^r-V0J`IK+?3o6!Q@z^}vUk8ENqB^ArHwO* z!){<+D=Vw!Cg>eAsly{F*xdydc0P1UKjeF=ampTP{D|+@lZ2spPCVDo-Ot)4yY*}c zYbtk@r954yS7-mS8gOrN>CAmC&FyMiGGDWwb-VKQ3?)d+*y8Qy%h(@SW=Cno4yr!y z+>0d+35aP*YGqc?iAJRH_{~M9Imw?00%$)jqf))q;LLh9rXsdd2C z{Wzk4(d3BTfsb&7k7Xp23neIb0Ijrgq574xn3j-QT=3~yPu%*y)11-$+`svC4_+D>Fo5; zmDnG~Ao9|&U{I(T<4nC1F`M}ioZx~I$#RkraQ@d+yb;$^0%x3=T8bT*OQ3^k%WlV*dG zcAC^Dpwwa~z!hZ*3iS!I<6|kO0?w#omxWW#@2xIi0tSk<*GaWjdPwBl8QzFUiHY@@ z3(Q2Kmwe_b(WQsk*-pLecyG&^n~sySDD8Az|I;Ov+xYR%ppb5}KnRzPuPZY=KOQGT z1m;Nf4>b;5yiD!+U{H@2Gz}wk;75KJ`0B`2w|2Mt!F1t7Cl}*ZnHFlm==F{15&b-5 zEk>$k7AR=GX89};Oyl4!F}TLzW^97m`%BlS+!m(O++3eC{p@8n6o#8R$6C z&}BYiPj6*9fuue*OkdH2?MuukKtxy~r@n$V0myUQJ(Y_wKCxNF1sn>__2 z2t2#71Gq5xD3ND5^Kua7P9pyV6cOU?=^HWf9aGC1-*s2zC<0lAwbj518LEu;1IipLk>0z+wEEemnb=DE& zvB7+cjm(z_aJu7*D;2x_(c1mS|CJtGc;k@ML1uWH9Rts;-KXX(`>UkAv9bQs3}Hk# z$GdT?A55Ibl@+eG{(lKKZ!}ZkE5RyFeR=+ZNVc|A*|yqOn6frAJW#en(dhacabzMF zUqnT^dyaX5MQ?+OLYeZO95@nIU$?pGDg`NhR;(s;azWG$WR2PT%X`_i#$0@U@ZSiy zvD#2>vFTg0GSEgZ{jjYt-lLMH1W(7&Jm3h}w;%efZ!j=?epa=i5`0@`$e6nS4WPSN zYs#YY%Nmo|hTe+^&QEpjVxegx4IT*occHsErw)Iej7UW%0+tgDwa>WTs`R$6iZEU{ z?SjjeEH>!yOkpr45I3Ijv#(y^0In83mU_C!7mRCAVG-q}}{YNax8xzjwj^Q^EFOT~qC|`P;n6)4Da{+-CD|_n6Gj7E>NO zRjp=?w3^uXE(Wck7ngIqzUI!wG5SlF!=yRZ46pJ;T5lVS($NfpQgNnMXF!w`)0s03 zn^;5z(3eswT(*K=HUjKCpKqk$N@u|>q8g>aI*H-)*tBYFRu)ICxrvougJmLKU}DC0 znjgm%^k4yvd93x%9RXL7z*x-}Ie~hcOxtBWj?v$sudQCZV_eVCiIg$Yq^6K4KYO(> zOY)lJql#)oDyF7jDUd}*41G$XERFK?G*!UnqhOAyp@7*`fMn% zFsDo`saj-*v{sxA|0Buno6+`sBwNSu*^Fs=G(SG8yiGK9vq?({_ZB$_evP#g6Ff!9 zV#1SeQhj~CuimJkVI}xkIxKHbFU>CUOlJWkYFv<4mg?he9_gr{RIFMM0o?jw*7YL% zO>uSw zjLlkLbpB%!KNgzLdszQ)l`bU@>&G)|JMh>zT%&;6MywdZ z$o0uq4V@#sS*3$iuN2?usrHdsubyMTbmESiw3JNPET83XjW^!oc*GU_1t)?Cy2Z2l zuWnihpCUT}?S}hZqD+``h-@#r!Qu9Cy^K^W9pfsB8QAXN9jKa5heW#p{7rYWM6RX6 zt5G83-$J&pi)*XMR4&VUE0L}H5zjjT1{n)YP&L!1coBeC5!7HuvR3jj!|UE@8q-*a z?n32OWWv-ve^I2W8P~$lX%Qgf%u7HbQ+XxP&v6U<6s!Q`suDAovitxA5Kbjumi9y? zpg+hVJ#(FvcGP=H!L=0Qeb)(DW(~TV&b~ja)VA%8K-UBLY<`^rm`Kl?T?nvd%(R^< zY?J&foFrqbtqmFp&9W9T3FZpltxK-9`cf(iK=t3pigHiaN^$Y5-_5!m9og4u#-)r1 z&Rr|uoiqnexxARVb;j}|ml(48YXQK5QtU1t1>Ak#y-&K8U9foO?%V4Z82vokN8rrc z5y-nY(pf_>ehb$-6sSe+Au0Z?`*v%6)Vh|<3r9604@o3ni+#9Hq_(fe6w(c@G%Trv zYLa;!f$%u3_VtV-QZ%zegt~)4+1YfVZy9iRmkxye?mfX#3};^4x`|>va&`4>b}Knd zOxBtZ|0h^{;$qBPUB89&6fNcMt5F*Yc~@V9WnjV-oBvd?H7F`0(x>p@r@ao|Tc`6U z;?JgJ2OcJmha_qG%NImbtGG94!V8KiXyolJhhLXZp!q8)y-_pozTi#|4&m6YA=KLR zOqCbw+Ad{k0O!A!$T3n>bti?fuu5|6hHTceD5y#czU64j+wfv5<=oc&Wn{e|PVW0xFIF zjQXA4KT`AmKfIbBxsxNiEBtFqZ#}~QwkiI)L-Bv>)mzXQAWiEG*bg>k@JcLFZt`C8 zB%v+id!3bgJiXglzY4+RtMuK6+FGfXUC9lpr%RLz;bKGE``LvBE4_77p9mXh*o+o# zwFuQ4$2t>vI)8wq7|d+fQi}Q@R=yKo8(K_g*AA#zPP?9OhK+zNvI1<6RO%;rI^5b| zTY1NAGcPR{YJTz5T62;KZoU7qzh?`6jnhHMoZ}*uO|k$1jEHpnvQgg+wZWJgB|Cdkc4v+J%ZG{a)qb946E#vD;mLRx z%x2L>v}_-m^CMC(5?zq{3FA79>|kwyFS82V5s1P4y&{yS(R8@)1bZoop76wi4vm3r z=uJS79vsQ%A0&HW_3!^n$Wwjm0at<ht3`%%C}W^sL$7<@!|{0(&ic3x^%4B!SFLh%@8}vR-kS#wMK@c zUXvP!i088Exeg|Eo|Q_rum`L+X{w7cHMY9?_cIn$EAfmx`xfl=UI(a9kACH}F$f)U z^VeDDt=(FWh2jh2dKvHai%gv|_sHW5mQ-1e@m?DSrQ&+}5GU33 z-cFaxj+aX?qDf(kej>0w2LQ)cwscCk?v;9VVHW1m*mB4yY_*x~~;E zs3*zoN?(H0omuJ+xA#`9>-mdI2KOawcPDVgpZgJk3Oz0NIV^^&hh3vo={;k>53Up* zbd?TF*`sQz!RDDsm%XhBOADtjgT1CR&qe8=c9819=o4^45eX4ji89b-rca=ph5(Y= z%3JF!{y8}^;w+W+h0*%{25`Nt)po3X*+QJm*X$-VhkFXR#qnBn`(eV%H0RzjBrI=W zW@ulR!bA=k;tu~JgM|0vZe&`E!>Bw&H{hWwtY)4umJZ)Z#MgYgC<9jAbIh!0FHUfGryGqS^h_ro@`GCqSY5mACU54jzPI z4r2PmV)Ywfsfq`_XXjH8ego!_8HMoVXgx>87b9r;m=kIHZ6RRsrvKA?15fLGS z$;+*E5>e_5jlbz@^nT(jIA!dfdQhB;KHy#2UC(I45)jN^=>lA|FoY1YRK5CDd9!Rr zt8*Yks8p%XZXHO#VmC*q?lW2<@z`1PnK>jYeS~Y#ecLW)ljWp9*3U$&)B!<(v*#^G z6GeaK7?5b?T(VGLY|5h*Y{MMr0-AR|teapyji1ibEOm67X=-zo`&!KVhMz4~>!VZ+l3BR1NCc{3_!@g2qUwDf8|zK+QC3kkqngd=K15njz? z)7;ahHC(SnXSvGa-3~@H$mqnK^56tS_J^d^%bk=FKFMaKEvp>D#Czo*lRkU`+)GY=R7L_|^J-!gWtp+8LW!C&y(LkmghI=|ynjZns>bDp%s(4t5g&RD z;eS`r|3T|n*XLK<8MW{z8-N01Kzsi@#i>UwMdw1|PtUx90v>w__c&IY#2@3I2*Pj% zZq9#3e3@FfiU^mg0&<%ejs;83L|vbMgna0p)2A01`2kN!^_En`#hrl ztj~)pDNi!P9mWXQg9yY$`SY2_tanz`vD_5w^!am}4Nrd^fo!SB1Jc;++dDlnl>@KE zg|aWfz9n(4*z{_^HkX4)<4THlI;|8Ou+B0%67j$%%ceBP}a3`Z@;M#6LN@t{wSeqfa&$IYdjMGhJ ztd0lO&eXU(?YivCWaqNS=<`(PwB~&Wrg)^-`N7vpw29@7swg_gug&r!IW#b6MXZi{ z06y&!^ZnJ~;Tl(aD~DT}?P7<#nhP~Q3(57Ai2p2A_4CWVF8^W%Rk@5K8iix2Di)B9 z>1~x~A46D}3@#pC`87dD3g(=9iCSL@x9Br22eb-UdLh~bhDw>bT$5J+;3E1a8^l9I z7VBguiO^v+=-b($4~N;MTL#*<9QgH-B}sRBuYRfi)wm0A{Yw)ldu^oXK-tIjRyv?o zqbyuoDwfF@y-%`ScVc)Qsq0FQsl7)ht|AF24$$+zfq-#Q)Fek}}em4-#^VZEFqHqB}~MXZblcc|>D7oJ@3 zaP`;gx^iuH&dv)9)dw=7td!#_D&XdF?&O}>sJZC-B z<8>#ekt~yqNo%w^iuRq598TwUJgjLi#n4Q!;BX%WjwQX4KJGI%@3<&tJMAW;W$8g9 z4>%eA)>jRE)S^gLn%t;9-TRyvh20yl+=UnYD6`Z}bp~EILAtDo-W;W{){0M=1{M1> zk?nBiDL@36i4t9gUg0=<52Re&|Nex9$@T)C@A}d;+Uq3=XkB%7g4)T@z+gl^tfypf z6qFLy;Pj=vWui=O3)iofkq>A+-BWEIUiq%3JVvA%IeY>zyRlPqa*STbh|$~SW~{Wl z4B&HJYGXDca&SGX+369IU?$K4cb9zf-((TWkI)9XG66VPJ|kLic+hJI5_BjzA2%~; zgDKc-RgP}howp;jF_0RRk~CVem7-lXM2T`bb_-R?cBu`YZ(lh1&8Xt5>(Z9=!?`ut zznspd`3uB5VYMUtl3LfLZZ<@?-4x8iW9ur)%XJFAQzmMk7j9URx;oCSe@|@7XsOd6 zC*m=`86)c%d;^(bT&E(cE-Vl9jX$>e)F)^JN$av(+S{60y7gJfUYpxxrZ=Oh zq1RwsKyWfvI$W-kRk_+H&0Hg+abDw!Shr?J{zz{jCWFfX5{eYU%F~QlY;`KwO9nGj z=1j@sj*V5GFrzWRZvrT~o4?fuyoyO{@1qX;Zp^(^XyAu9aE!!uWi30@YM>wetiw>t z`qioN64Grq4`0hX#^*Dx%Z^XsVz#)lOHN1|7(fL|XjubN8WWh8O|fVKM%S6tMywHV z`q&IYmt-NCT8o&lZz$YjIqVKWdCzaIcHPWkdYg3GQGT&GITAA;IG=VQ$y^DkaUX(L z5_M!dzigDz08~_HUG3Y46URDn?N41V#_>VO$~jT)@%DI-zKO0h4_`eELEL1a0WK1e z?4p4^rC@HiW`fs)ewvl;y>&n6O8w3IJdF!#PwJ$}y`!t9i3MjGChfb96WXJ-ds@^y zBaif0d`ZfQ^_q!nCD@~K`zEH70Sf*WGDpTF#PKS(MKbW26rApks1eAsb^=u z(rF`RkQHCXZ++bjGfEXVTAlb+-F^fp9^KX%x_v1Tc6Tih!Bzm6ZWJK`H3sKC!!mzJ ziM+Jq79Y~imEQ^!A0hp8u!biZoA>3y?mMuc<=b%c&F72TutseN&ntUQIadQah_y<&jkP|dXw7YdK#+IA+?GNO?3 z%=`n`Wz1(1T?gTZhh`V@bD%&uG1;^a1yjAUiwK+W`#M{P!}D1hd<&ST1phsL*X1#e zhFUWuyU^iD&iBKI;eMwgWSPa;CRpWuZNL%6QgZCXzjN7=SniSy?=6EYTf7n1TYhaQ zG*p(zxaSZ4_POaFne)HD5{5S!BOK>n~^>%vIRiXwmD&dr|}MSRZDVsa~t{)HR=|LS3SHM=&YULidvvy#YZtjS`( zEB(s0iod3EK^=`O^Kw3X|4`hnUsvj{>3XNZk7fsIv9}L5O8;3Q|0CN1Yc9=O7FEwD zAQ#O7C2C%^mfhrv;+`I&3-Ga{IgC6B(Ut5+aLzaxYgl1fta_ z^(JA3>NmkFd;8ioA3U6$Qh@h&}p(i2YOiMb_89sw4eUGz^e^L#3+mvY=UFCmDR z)X3K1P4HEAd;X`|l#*u#|CEq>bGS&Q(-lVN*Q5Y)wIbD@M?#a^-~OHX?!UYL)r$Wu zMz$U&T<1ZkpPkH_Lk+IryZs9E2kZgjmXT`P~6Q#*q;>+vkU$h zt1iP@?dI=YYd&sPA-Hr#jV zRfErFq>8!XU8b*0e1zZd_Z!`Z2wqebaG18)AW}>apK|h5K8UTeu?6Q+zp5_-ZwtpU zjTQAmCM^+8BYuvoy{}2xOlA1{)1NX}@8-n%-Ua4&mrb1XE4j5^AWHta;4i#!FvzRe z&YW&8-j!z9#8)v_E)Ra@OymXA(hOh>(J+sr!t#hRx#Pcx&>w_Hm@3nouWpgy%BgS{ z>&BWg{o*HJw}2Q^&z&y`L;8N}ErGtZ4MtAM@TtPnKJ*{fVff`#%j8q%z@M*x@Xdmt z5E*PwrjDeuXUjFk;NT+4r6UGGM_p7C$dU=&U}f^^M?Pt@<^C8BoO=nYy)#kLBR$?b zxheCyqrN>gvHaon=@~d6J9!#*v|nu4h>d}LiR3oKyG~WF-*4kHDwe_f_Q2Z2bVF%K zPEY?THTxzaCCMQ$hAP#zlotord+u?tisoSR4B3-lx>?gUi1B$y~4uI?)S3#v>C+%pBDq`l@d`0*xp`CFA~?;u7^%Xb&OwV0?&iqKMyxRlc< zIsn^euditq`qlB#spXKVPQqdnGMG4=?l?Fjz76C##fyVjrhXK>=JQOqJgZ*`(~4ya z!EeJB7_yx2HP0JX(S7svo{GDC@uWd;uEr1ZvEk+E@=1sa%s7-TVl;qesy40BeHOP_ zv${gDZ8qH5yN?kK0PQkcN_A97(qy?xX}BfZQcTYDfay&*4mF+Mlj=VSux3pp&^fjz z+7Dk0-~ne0*|#@^2e>I1p;w%l-Og$b-WfD6SW|#8hBElRWV%Jsd8)5{n&;Pr$crAR z1x9zpxiMdj!QSkBCK!LcX)5@8gfft++)@$L`jSCdZtgc_)8Jp8b?Ga?#T z6Jf+AQL1+lO80FF^lHuXx-@IUbdg_*a;ChfyBBd88Mj3duWmkph=+PLP_u<9gbF>=Yd??+D>E3nl+icYin;EA9cAE6<3Ss z)<@W-0A4-YJbVT0RAk4DWI!A^*`2)QEHYffz3cgmdc{C1Wo@b&lD+2j(AY$QusFo6 z@@LX+6M%rZ1^3cAoBfwc8bhq4ok&!e%sC?`{H<#H zDY5y=bEJmc=u=CZDQQ0j1t!xyXgb(5!0g{0H+|u4|gT{MZlbxo3pEK zrGCe_58^Ny;hit9f=1KD8*ix>lNHJ@{Eb*Gn{$LsF{Ss6@3LFt+vwB@0vAEu&V**EQ)wVBIqRzEu6z+Oh8lO*7K7| zW?X+?zXU?S(|{)MBJSa@?AY|&Yx@p6L7x<$;joYVr=Ur>kv2 zDt$@gadAK*hKJy*0Bm-P=7Lfd32tF9t1YjWN317z!snDKJs00Rq_07bP`xm!dGQEx zX_VVlnc>#mz>`ntb@$#u72tQk_j6y8iR??>I+T$DC-W_YXm6rI&Q=dVY!S2j=vq=# zLhranqQ`Z&1TniF0oQx80Sl{b>&tVxDP&CDXU$`CfvXZvov9E^I1*6m->iETCUQ_h zaJhU0_p|1v&Ip>V<38D zT#|Gc0i0Hk#Fj=mPkUw?pscmNPuE%~Skj)dj}P2)!fq%3=o_gHYztmN|A5%WXbLtO zYTEK7c+a79Fq1ksAPYO$Uvefx3A`sXkyP`e@ncog4$Z!b`OjU~Xh-%aW{mKkq#po^ z>`-G_)9*-e{}BAaHok1EAxasfyATlLHgI z)6j+lq8(7M@wOx?O{Td(R=4R154Ea_o+0$kbqsb(qEea{9d$k}8q$ zic&0j0Xa2V-#ciFeO;0~)FSPwNMDhEmW)%^S1@f`;j(b50tOwi4D5C>{fAUSLFnXq zQX>Q}4gI+$el$99M6^`o;I(G2h4B-7BJ(G+7roy8b{UlzD;F&$oGogtF`L(w56jt) zX;?mQdH_D=b9=l+I=MaG#X;;#TnZp4C#Y`o1=bZb%_Hm0D%(>*~wqyvg4p}Xh z4MD?CbE)D<>979EBF5fO(qXb7t?xw>dyc~+choa_vBQKj=sw28J5QLlDJ)Ml0J%if0x0@%FxXcCDkE_;f?d7KJ_M$IX(wwaAj~~Sp-{=!0mJ-FMO+Mb0+6ieR1mn2=;vgDHa<6|+;kD*I zWL0ok?71&ZbV`j7rvH7F1PUb7m*<_+^_5z4VuF!g56H;Lz`<4PaIYE~vSeXk%ELFg zL>U)iMBPI0;LxPZX{mA?uq&ARc=;00M9{MC`7mGqsc@RU{4p#XxFfR9d8hO1=$b^h z)-s+PtbKp*j3o_b^H7WZaf#IjU3HHKvrTTLH`A3tbNOLe3j4YHW61`d_bAAc{XYN=&rGKt?3j2C71NcHoh-8dpks(#w?}{1!r9l{I`bbs^aODQdSFv#vk4vxeb%N2ryO z+U?q&5DZ=RF=mIK42>zA1#JHuD0ea}*#qlNwrY`ri{6K&hXxtDW>56O^tb2avr4+% zxWnioD7x0LPF8vP{hCO^8XM6?pHM?paXXxBKp}~xR6dIpo zxHJr&35uvv<|xU_<-I6p<-Zwmzxc*l&ByH#gk}NCC@>(#GGw6}NMjsS=Q7{xkk89n zMx0}#im3j%chWFYOFmnaywGtoJdmD9p^rH{sWcelTE}uX$LbBK?a5MMOJ%Uf6ZD5f zVAAKwCU;lMD5apSCYN{)S^5#Gm0`3KMXiJW0z|G_zJJQ|wL>(@Aa;YC?>}81K1Hr% zvzzA;q6O0otx?tsr{fU9eLZ_27#P@NDT<%YACMA=Do(Eo^Ma1S5Kjs18{crteKibuYC3l$JYvv0U!|3<8L0h! zEN6!i-Ph@%<>e<3-VdUO57UxFJykWXw)ia-I}N|PV>zWdpuah7XQbF?>5zw%QF2-z z^OQyP(voH(Tc# z=na%C=zj?p*i_yFVf^V+gso%?QI*xbwA=!?{0O$RIeU#X5WE;OF~~eRv^t*_-&?_z z8rxlu5}1?v5|tc)@rxv;P0OWbYH9%LYlAkjWgE3;KfBtI5V{l8yXNs^Y?Ho2)a6Uqk}dt#QON_s5_(Jk^(Uh}o+_v1 z=*FOfeDjF@`w=cwdW+F_MC?)xU6vPZF?KcXEi!O;c1TiOpP1ZgPx5T5`Axv>&>EV} zmOZ^GR;mdBGnx5P7;^+Iiq7UNm7-KND^uKNCi_^BTWE$H_hB%-ly{}PzN9HQ%iv^4 zWhtyfqfUYhd`y(g^-th>bnuy0qF3pxsUU#(=GAA3B5nr>f&`cG> zCqg#xT$Sc_IPZllielPg!)%hQ=Mb)C3#e`S*}Y>uB?iWGoDPz3zgU^COjB&Mw+Nq| zjG_isyZ7c_6P}25RX(yi`NDrpRLBcITHuY2QA5_a@2hdj+j%Adc45ZlHt}t3vKo9s zNnO}?f?Hr7X`OqLU(oB}{JLFoKY;20gg2s$0lUK^1U*=^Tkyj5JD-1k}{K;yD8;{c}`toAUSa62ftVHb& zvqqSjN)+`Sv8JGJ5d8X31X>{DY-p4RZv6fpm_nju$Yw^7d;|~%vl|dTO`jS@0A)b7 zKbP@9z3-%{Y&IQWNgt**Ew;0V9qD#UQQm2<$+j|NmCt{up~W8N*|O`Fxpk6C2YArh zQr2RM7~Ge#0$ycDOk&1QJs=JN71e_V^I&Ez4XIHFTXqS%RXcOp6=W6pR_!Z!Vg*6a zAn2x0wElrP+YuJh%-;P+9#(ohHLl6bf?L2g6-Ize4cp9?O=+{*eZGla&JRC&VdQw} z9VfCD3}370k2HwYQ2s-QxEd7Lyv@ZP_CCm$6klz!k-Kx8@(oGEU6-t8T;0nK{JG&7 zuY&S#7M0r^hd<7wE6G4(Lynrov;fQ4J7XI*dC4u$O3}kBgMyH3W7gVFIkg3J-|DeH zs4Ld`t#8HGKkb!`Uc}nSw0L8{i%_X*-bAyT90BA4rhnWWLuzc>A!}X-lEu}=Y%G>7gH3y9mP#j8fcINL z6o1xkH@jMu!jb(PmIQZo+krg3wF-2F=1yP2=Y!(adY3_RL3#qGsBTWJ1MSGx3LxJGg#qlhI9zENImWl`#!)G)MPA_rQlGV z?y?48>`6m+P7+|K#E zKoR(f27A~Ly5TMk_p_)l@@C})E+KPXCf7h1bMGy!n;tdqPQ6NGYIAiue2BkS!% zm|tsq>?25?VculI^`nh`$PLyNsupL+7t=2@y0kNtCgkvP(sS^j>kL9*Xhd+Yvf2xN zSRUZ9Cd<{+%v`&;FU6l=TEAtQZxh2c>DqZsx3p@DTWH|9Yj&K3>P!P+rW`F9TosPJ8Mv;SPDX`?~`|A}!g^h0-;#=ob=OXGYn`i+NF0o5%e1TmCm@Aci$o|V+FHNW7{h@UB7(t#$nTlcgj0%;ZaCmw7p zYmOH^NZ{`7uMyzck=xmideRI68dq41H#&y9RVt&#LV`W23qGfp@I|T1$!@J^iyATf z7Q}F|@L4;+=-pBsH8c}^9~vc1u4WaNlx%8xJ(I)n_ol)%?Cxwy0v^;72AQLSce9=? z|8)1)PPehhoj!As9As5?UmaWMP-HB3lk>Do1u$~p7tt4Y<{p(>xu)%#0B(ad_(bo1 z1gHay(07sTZt*WO@L3e4StjG4b%kU^7##pV*-Pw|gGvc;OLYe)vcBU>fQx+bFe=(L zX>XA`Tt3EbE!+=U&7^Vo(3RguLzBUyp{XCnso`k&btRH@1?Y!z3?FI;G%Ea>Lr87w zHTs@e#<BH{0@#fblmlm;w#_HBD(@o8m^gMuHlkxxqUFg+aP^6r53qw)+Rsw7f_#qyKPN&; z3%DC$kdtxGHF^s5JG)R661%^Ye<#&>ZQ%uzFCMVSN8GHew0E`f!hYO645Bs0EG{s5 zpJ+c{Z151RrFD_NN0;u)XmB<5=3Er~Y^%2?`SSs>b;=_kUo<{`n?<~ZGT=6SNWQD9 zl=NVeg8s_RiPqIF?u|ZgQDI9?Lnq4XR}I4G_SD=r4*T2lME*R<4%o?>Ug?k197%^n ze_y-mG|J14{iYv)w8^;RHcMS|c-WVcLamB8=38+GVJmuRt--_W_O-+tmY<3s={5^n zHo*k==tJR;C8Baa(4>R}Nnoc5w)8QMO~F%GRWJ7u4O`QpAp_vSi%1jgXCWIO^hVat zQPQ)Nqd9Gwf1FG&gaLR*r;=E0bJRV_v=?tz=1Vf^ zn`>zFEXRqCk$z^I?5f??7u1kyX(q?$TffEbS}0ff_9S2~XG{dyzThiGAg_zvOH=SU z`0$m2{VieX6vvUXmPn>Cvv`4{4{pcwCwm0zQfigxN(32-Qu}1nQkEc*w|H1 zu@}Pjek&9HcV{$)iKPzz*YYM??@&Ujh$Ur;zAYF{D`+P zD4V1ew@8K0Nq`RD@u*H`Ugr0P4i{LmVkRT})zeF;vvAHa=$WkPHm)u)!Nx$7*WWI( zhsB9au1n%4`syFapKfgLkH4C&`xai^eU!LpH__p*vn%h0?@s%TZ0}_=k$21L!8O;7RG@m=o9OB z?eT-8^~i@0YmaWYm-s5iye?66_F5miY;E2b%ua^bEkc%ms7~2%wUhcrzm^+a-$6W=mC`CzS`B7}H;oc%2eXw|XL{%jO_uKUG9Sb)Pfx-8eFPxH2sH zX|`g}YmCoR(|o?Lp*q}?ETPrD15Cr>m+xC<6&tu4I`olh&Dhp!5JV6+twq!Gjd`I& zj{ZufQl*z3y-g_Tfdl?nX5a1dKqxGBsNYPfa5UE*C2*M^ls4L&VVx1VZpuh%_*tp5 z_AdFX0x{GenJ%WG+~H;(*`X(O;&{AictYHIKwb!EKJQ&naNpStm*5(&(*_qHTWo3S zqLr>p6uSktirK1wvG;nJ&x*5^;-x(=6}gyKJ|R6bGyxJ*T9TW?bweA94uX;@onP-q z=JsImn=YkSud#=9_SO!*X>U=Vs2HF2Dku6EoApXK0t<(gg&*`dMdo!sYlnH4`@@^; zl1t5}cg9D|8@l60B+`!;kK*3dLzOKhvkRkz6X!lr=43dGrsXYZG5mtS_gk{byR&@VYwr;I8c1DKDU8xXAG) z_MYGKznib`9ISx`%7aeK6YhSK!n!JBGL^cu5RV8NkW&W2cjdkassp*0)GKgI7B-rY zP<$f*FR5&9+g2xc2aVq~B!fQ4-Wh^1NE`E`1S_yT(V*l)Dnr=1T0{zyvWLFYFCl^H zL91uSJMa(!H4~%69b6MS=B-soH_5ALkR}GxTs_o2bsefaa;W$lqPIAsH+vKUZPsy^ znBvhHm7zb$rhRIphj>3pA+(pMEB|hLA-CI}~vBHW*GbLQdf%%yf<| ziTQGiYR}K{uPQ5oUS-ZlT)&CcH>AI&avZTjZ!1l%J4l{>7#@ke*M_ z>3%{e>3b$pPH0kdZ|JM&D2>S+u6Y_2eapc)(*t#OYB{PoFz&Mvp^J9OFil}Yz|Pi$ zIPSQ2tXa|qND8hOhX`yTZ+PEyv-*T(3Oxr%q zEImu4QVjaS&Q`9iug5DQJ$d7*IR9w6X|o=`R(D@ndk8(58d^?HPbS5550owcAL2ld zh9_BoRsJUCkbClbqSsDF7zTEEH8$(Dq?JMJIFZ1TVDGK5aGo23=bIPAOwEi-mzy_X z&Do7~fw%n>JZ-DKDEY1StO@;qCicU$36aNHlUYKM4%^;I4%-wT|`>*!jW-$J5oCm+lMjB^OzS!^K-;f!s z6C>1!s3+9SQ2QC`-&C+lABxgs$nRxjakktl(L9^beW5M}^c5j$Fkh8HHEe{g_OPymv-S z8tmqZO^oF^ns5IY(3{AETGAH6EBq4M-c?KJ$DlQg8b~p>Vqm36fr7eDS@Qhbm)NCT z1j@0Aus0CP;NI28enL`V1u0cgz01*&rUjZfuor^Ll9J_GM3aZ5EzA#}iNl&8PG8iU zG4FrVe%XFM^38wYDY(pTCNwoHyeNk5PkenfR@7waY1Ah|akS~&9{#FhZ^rId`&%XT zS!d|&?~PPj++bzODBiOV5Qy9p1v&_uQG&h zbJ~Q&W<3m{d?#**55hyw5(q?gcm6JG*mP$!Pk_Ymv=1IoT31txC1l8QAx4}(Q@7pq zP2iL-0O;;S5l0c(e5Ai9gpQ)u2R1B zMi)*stxwh06z$G?W*7xeM33%HJ63yMeS>QRj2=uB%wh_8cwWQk*L4rQYxJ5OB6*dw ztg4L(5j60@Mu8keN-8JB#B6WRX3Sjz@uVpCa=hTYvp+m8c`qy`oy?K9Gf{=hh<0Fe zdlRZlNkOir($OY@C8SYlDUGx_mC8zz;gH4P7luo(@f`KD``I!Qi5A0IrZpewt5=68 zhjeI7+DEJDkt-u3BZEzsuleZ5ySp!X85<*d=bdhA*vZ*lhd*)FIk|4ukUxO1Av}|Z zKn{}A(u6oU&+KXAIZnLK51M1kDEo~ababpG0w+q%u4yB5_ohwGl6J%KUiENvcfA|z z?X{XtI~g`W&7#e8a<{qAU;;i&go-r5K+s;;fo zZg304U~xKr6dt^B#Hf;y!O!h_X}Yaqb#+4c%yHKq2SyL3I9RzmJ0~akyzx~PB0eYE zrSqJoyV~8$ki78lr%JLkMm;OfGcz+0pX|Ax$~haPYnGd??(WjY)ZJFTpP!o!7GWU0 zGydpJIAt(R$*HRD$k!hSk0I1}<5pmV#@>}0^c@1hf1IHP@ySX^NXS%}?$?~`DS$Q_ z9D!eS_J*@GWAOV*+*&faF4){G_rBQ`qjz{3Qdw79z7dfw?q;;-PMMRQVx3^H%Iy@{-5v3bgYdW2) zfOB_xHS_y4alzvzaT0g10@a1w&ro1Mfy#cxelni3=&6wP+}EwS9I1CZgo!e$j(o1J zHM~T3L#8n0y<5;BU@0f%iaTT@*pr?ukLSLFHT;Fda^xVuj9&_iP^v>AX@G{PE*9(#<$?m8^hJBI;U%^=^i~Mo4K!-*S(?i7IEw-YD_kESWQ1AjRrpVZ`(i{-%q#c zm!RKx(p)ExLhq_)N=F8(HU}*@t)VqWgA0U3GRb)gIj46G7Bge&Sd{O`{Wd<-MvkpO zy>!oBE+%DmZ!tFAT}%>>j3`+Aae@)z<76J8Pp;pMr|XG{M=XWJjDJi{KEu5HS*?;m z_q2OFTPiw+4%fXMG5MzED)hixrfIHh|7zcpm)$bI*_6utm$i1?k&8!xif{wLkazL0 zX-2ec61OqaR?h0E$+x?5>kwbx)-Q_&3$E@L_3)!PC-yb8F}=cm@L+CJUUSwoLAvmt znOV3vIM_Hi+3Z`T@mkvRz={*P{;4+#5hs)Jiga1qk%;L2KypYdCMFiHrnTqu7=8a_ zXCYX_xMZrq{iMnL4EMzTINR>w6*_fY8PNSNNN2|f`ej^WaSM!RA=MZ%NbgJ3f^q9> zEY_Q?G|!&A;4a0rL4&bxn#w_~LKu8b#0y1GJ#(%MhnP;;($dm08Xlhb{^u+%=e~aK(PhUw z(`Q14k4Q31LivGV?MvXhNDqyXL62YFTvQHrMug3LTGT-u-LCI{=is(~n@Fqb`D^_T zZl9**bld9TCbw`rTmMl#Y+ zLKp=@LLrLz!=_qyv$9pzP;sxw{1hZ6Afx`QZM~l%Rb#4uFvPF{u?ier{Od;kT&M|fICP!=Z3?fOd{34^HnUH)n z2KAUkQHjf(=Hrkx>9vZhv$OR&2l{aU0bQGAodTK{6}f7Tt37W+L|gTkXlQ>Kvb+_8 z4w z84jEcI(RRfCreGXCw9SBQp#NlT+XVlsV&etSu8VnOb6PcB->Xc-qZ4XHf_PF(K(5) zGmwT;@$nT{#ixjcV$wVRKzqhi9;h2J4)xGcQc9WJCU~7-Z^a%bDWH{^c5SK+DgO13 z$*5FV#*WtwI~%QK2e=9&uof5_;@f~imQg(dB_ukjBG|D1+t+(;(fiRk=u!?a9C)6`mHw+J#<7n=} zw)aWhnWbj=?*c2$)2$D+SXtlNpuu^Ybq`_7q@nkP+?Z4sD+}tOZQh!VV6Q;*T?Zc=sky zPZNe>0PGg{_sK>Cdov{NH-KVqMea%v^P+;eW1<2wg#wTW1X72~&6urjW1~;{z|#d4 zp{Dl18(bfZuT-#69SRG`+C-2@+WHRmRytzrth6wEJOyFi%12v~Yz0NzwXN@^pDBtI zq8E1V=vG-8PV6vpyDzV%Dxx0i{rpb5hnGA9L~xYoZzPo_PD1SbFv3G4REz6d{ni-x zWn!yv)Q7pi4|hTHL=>DF4$K4kG$^i{FMlJ;()E7VKqt<~AkO%W=ljkt19yZvH-x&+ zeU^$pbP}E?Mm#T|5@)2SCPBr2aLn5{MGIB33ma>s-#L!6rIqQdjB?BwcC-j z(H}6kGgVC} z&|*K<^ZbzxWbv!8J3bg2{V1=gNmTv2qu85g##=@z`K4Z4aK+5WutUrgySk5BxSB6E zKnV4>--h+fFTa~OY3-dzmz*d)^RXiN+sW1EH5W_S&w@0LHVjtzi3}_}A04JN*bH9G z)2QJ^iVNv28s*Bg6+&E115$9sSod-~mBM|g!b_K}t*QJ?bfYJ4)(x_QcrUD*@0@s( z8xw`4W0Lf`pBvRoi~sT#Lno)ST~e?S?Ee{!8W%Qvx2~SZ$I6s3`QN_`mreNC-krw) zYps`+zSe7w&^OYj=h3I8f&WSEgMe~BicI&z_8>pJ zxC7;=^rt<;cqnLC_hck~XD_-b(8hKwRPixGPWdPl1bk7km?eYe%Vj)6?53_aOwte7 z^!_pVvB(EN~#Wp^whDHjU72v#7FHQq=a!#KVdlHmng?1{V4ngm-?yAZ|-IPs#GvMZI6N~CEKAKPW8B5 zNZ9v&T^U_S#V7)DR7|%|i)s8tsf57_u>F;&5H3~WEFjuALS0j?C&qsJy6YcorN_AP zF^$_};f?x_pAdYazuQe-*0aP9BP#6?VB_IGgRgvC;%=%4PE*K+7cUtqzCYGa!Mmnp zTN6(!N8^X?e?maK7cj#Z6exhS;>*r??V*&h*X=CNzN(t^O;;L0zX{yN@wh*Y=qB?k zR^Q>&@m?R?^|qO>ci#vLALMxaWUt52W4k?zyapG^F;I3i64V-xA(p>XOrB%Ey8j6Z^rJ+F2eQvTtWA*8kkm*GM z7p;Y6zPC3B@Q99XR(}X0y3a3ii@*VtbLo1T#8=G4{bC@Nm?EOPNxgxCpPz%AeR^c2 zbu~|f^r>%iS5Hs=!H@Y`r}aPQ8U>%-xKi%)(uc+AlX)Hc^u`o>vjz$7%;xbC5d)sK zcGe%A9=f9ZRNP**S7nHaiH_D7Jp(pGPr&fw(hKjl$^Gcq$N$oVo4Eq$5V&O*Z_w81^tjmvGU`r}PNKCgi3GZP zdIoYWO*rCN4G#_wAD^Lq&hjkhb3bjsc>V@yb2?qN%=iJTiR|sha^`63nv0vu`0+fj z*;9V?u6zqKZ{^ob9~Hv(#5epWQPiEDQ{Yxc3%r3O;;K? zoGweUn)+Kq8@U`hJQx}G`})4#-h58ra!7j{JTbU8QM8}J-*CkmOUKIWU2D%(QL3(Z zx3rWtrv*6squjoiVOZCC}n)4;btGcfcN#O*jN8oBFeWz11q;%Y{rK z^PKBu{4oQ=lKd+j62Et`Z0W^J-YqLnk8t1ZPnzh}Rqk4RU_*#_Zg*>W=jHpBRDQPd zO?V9H>jdN_$NxImo7{s5L@kzAP)k;Jw^R;TK|skvh2_Sn-@gYgTx)X7LJtoe7r|td74~C_XIy~7_l-<4-|ciyk#c)3ttx{#8$N=s z{PX}t1U2{NXVG-CrActyl`%C9CAVSB;Bc*W7uEUt+HEH+G!z<>To4!>D)H_e)ok?O z`VsuyExtKNg!dq6xVXhJ351QNS`b2`sH%$S+m3O;&8kcgtEEDTn14=3PGIL?*N_B< z&lRGPK5UxrREwWAwf2$z(+s@#iFa~b-U%u9TM z4$O~P*&TN==hn=sInl*&ES7<2NRu;TWho)TlV{wvzvO&}!=hsU^gHXW;jQ@l_wzdQ z&y}|B@y+7WyI9OdH-MN#Th6OLXG`Xn_qry#prr+^a(XJHhxbIO@C zr4sDyEsM4jMYE;9D`KO&k9YQZuic>+|M4Snjh~SkW}d!snLzB zoS-~)IULL{{cUFb2P-I9SfAi!4GiC-0Qh_V*53v9R?-5E@}*yPGeuv*K+2>0fh$Q+u+@)Xp86wj|1a;| zzojq$E^6DZh`2QH9sixnhfjnM#YnPVYZ|N`<=P*dGyL0I&^mbWksn4xvr_KFACYep z0_=kGe}T&b^^}VBsnTC;@Iy?09j6bkTt@jNKnkKcPrI1da81$g$wRQTx4?tF7m!4MZ_5Oo6}@cWSKn|?QUo`Wd`?{#a3+38};3QW%u zLHB!!sw~Y&3cd5g5b8q(fcu3?TF)?&HZue6#$VJbiT(J(@6WLWqI!uWc&TE30n9C2 z!+Q|fg!n{h>3DZ`C+_cTMq);}dMYNM(Y^so1-T!1BHb;`)0T#O)xOfIcL+C<8=2sT z<HsQWm`Cb}uWWK%;`bO2D@n>HirZq+bBLM$j_? z;meL~96j>Suke?-c0pD|Q}*+rFB%#=>v$0D7)H{<_`R@MnJlt1E~__Z03-r5-g4 zUx6Dn)gqmqu0AAdXvxk*g@E_fp1aMQH-_#sGZxXp_H+YYMW23&``MQF*&hAY>W2I> z!YQ$WlS!fs-qWXhn~UwYoLFaGH8ySjwn9k3?Hc93`?Yz{t!HbUr-s7WJuLtsjxr-- z^O_bQoWo}drlgG?5!H#V+svz}Zp@+wx%T*b~rOUpVcLeT#l!JCck zUqgM)d;O+`&-aaN!RBdwpdf6?~@&YKa&dv%N^1SjRvg$OE?GQeS{~iO68!lV+BA|J=K+md5phg>eC)@ zsw!9Fq;{J9CjIT(90=Q>5_52qv)2?C8^_T4c7J{CUFqG_Od6hTHJj2U^_1Yr)%1MJ z9T&UtTp05*f_Lp!D+oZp<_Sh3Y0%ljv%B5=HQlR98k+d}c#ntJdb&Cf#P5#XZi1WG z!A8R)IdSeTo7AjBBKh~smE1(@lbG|8ZbHb;ZkUo5N(mz1*C9>2+4@M9{?AbDFL(Y7 zs(2O9sA$*N%cl>kbx`v5{+Hu)9*w`DP4PeaSDz|iMV^n@e1-Eock znJWtqk-LV5-ocX(g9f=^_YNif8^N2;P=hHA2$;s5Y+cU|S78Sc2#NpqpxqXm?Ei?z z)|03*9Pq-$Ba@OQDy4_g#RAPk;%3_YmK)RnXR-R%{ucFmRxR? zPlJ267vL_BJ=FHHFOWIC16qftIsN1zA}Zl)z3gVwuAaX0wK~Qll*5)5<0RNxygy5_ z0`cn#t6rT%8Rw<3@N;)N#=~zw`E|njpoNI-3QEWokO->>Xv}SxRrYxq_Nr02T@>SE zNCBHXtUX4wLU}NJfQJKd6dF3*uZ_+h-bgwmcH|>uJKdc$+5i!ecj!u7mo17-fRdj?`e;nGu{w-h$76r@j0AgM`A~A zl_O~49TL#^pza|(Zrzv>kTe7oUG`H9*+Y0D&s|PgqaR|AyAC{lHW~l}I5gcys zL4h2IDWyEWcMG+YnS=Ldb|296;-4mT;6cr70UQ~{h7jKS&oMrHv>KV`P%AKJ`CHa|qzo$BB5yhe0WY4l~oW zAflhbr|$Emky<4a#9oIU&rZNkscqD!7&kNo20l9eW6abwj>cSBhy;Ob^mI$hJCz#sU-k?nBxYpE#9;IkR0bu>XO%#(@6iEdh|(4Q-Y{-Rn#iKIhoC368TqJ zN!C>F_Wm<8iXta_gn-y%+1i3$U{mn{Hu(OE)k?b^CG{tDwtNshD@Um6O^IuT1-zV! zfozFiST-6nOHCiym~-OvXO!$K6R{e~i#kArjI9b(=)P-@BX`;vS1#Lt!(n5TSg@)tPvpyXUs878`tb%sA^Q^|!%x{Pu z1DsBBgqNx7t-np96RE2zJE@{Cgyh(XquX*~N(m-$Eswx6&MDnro11xhx6|64X3m~l zVVM_$i-2M{SN*D+QI3a=TfF4%)gLVlz2v>`Kg)@y9swjlafAn5xcN1qTptDyI8if; z`4dNV9~57v*B(w2+D0=Ko$~Se$N0iGiI<0$8@~hTg>Ztkfa26Er!elZU&G32ztez#U|G|4K}jG2T=eC+~9k;hMS#uLm_28=}4wQg4j z&Y_5}512NdCi%86KkhA9LV3ik-A^?0#@XY6Zu)Sfc6vV}+Rk=_D^I5i`GcuY6GjY3 zidx~f%Jhc{3`WDAA`eK&j#LJG6{*#$usQNmGsI&6HDjTkrD-_iZ@FKnz&Uj_H_PYA zEB0;#7pN`Out{LyNhspoGsX7u1dlqxR?{|d*bMDzEz#9X-n~dqRdW*V6otA{p}HTa zVXpAbw$inl!Ps*vZE;}-kBjzSw~Zff?6Q!RQ2(RP5~IS1w_Ltw(D^CM_`2w$fC)~K zs4Hpi2T77zW9-Sidj#*aeL3;ELG*5h z-Yj)b!lSUj!t6YwU#rba#*Yb!ttUdy=!G#s%e}+r`)0R2!$Sq|~H*JfiBVl=gpc-5l*Jj;}bjS9hVk zS=?y-ZI))M3o0tACxS-L^aC|(loe|7B$W*#%q`zi#8Bf5g8TlVPSu$)F7q<0q%K4~ z;qe+lQ@<@b5(=SbYZ+g@=DpaW)z#RAky4XC+4DPnUze)=)lbXLsys14MjJev_xd7k z3L>8=iZXB!7ypxi`lZK`*l-TJS|dx4%3C{f(bbr0G((rojgq&KK=HgwixC@aVu-^5X?DR*Ja%_#xLcnOVlhZ0Tq8J zfZXpIM(oX&^OErFZk+G99aCYqkOGib$U2*Je*PT?+~W{C&EjcRma#6Y45SCEM`!oM z96rJnYxK+N9?drB%xql;*9RHbiR-T4vY4W`w$&~E|Y1a2EV zd1tyK2D2!WWEuP9qOKfc7#H2jBitW#gLafMrDzp0*;5)|>%dbbfTf_F^ib7pCSfRPou8Q#Cp^Dp!w}td=c4860g3`K^>YpSh zp0wQ}UTHYYmD%8(UH2`GCTrzPV!ffaJ-58mS$NRk0Z!pHq=;LS^Pi6O5lZ^^BXpVz ztwh;g`Lz*B41Dd-)~ztfqMjJ6>Q>dwSFhda|MclvnYIabWX&1vq|*efk>dt?YgBbK zH@|N?VD?3L5?`gqT_M5Xd}Df%%L&zy+g6<12sj=i6n6ehSaebYG3{JX$hT2NhcfJW zY4eTsV1Aq{`T1~?h71Lxf?!06h^p3kY4`?@j)(lSi@QkIBi zZN8Zhw4IvjS0rS+Gt0piHc)|!FN~{PNUy0U%W?&53xwk8zn5Etj;0a0BXnOeY%l#X zz%$N0o-ubEae=S<41mJ0sN0=kPeI}tGD|M|rF4YqcLzpBYSNqcF1g)$P8Q^wOeJpx z8IynAdJ*les>J7HZ52g64BcHJ3FE-3sfxP%T+Qh|-N`tX*quUwZ-O-cD3>5a$0BaBPrMb2)*%%q?!QcA1-PFE#^yPR5Co zfwT1~e~OPe;9>YxoZUUXr+i7dN!f^wuP8@;TFHgJjy+d~=NFqRIj8eNUCohBFNrjQ zCw{Jrn%qg4darHOtUH!D-<)(2v)tKF3?abpLzNF@b69JW{lbZP^nFTr#<-JW`|{I8 z*n{oNtM<`?9jj8VaL+>-SCKP#g}!iu9Y!xtTM?&arJ}(+Io5fHrB5H|YU0mI zGCwLJTq>-iD0Gx9Cm#```4NT%Av{J(JjT@E7`YYl4}Y9!`luMXlyHo3*E6weDzO!D zaEw}=w_$AH#b{J-PE>!~B_1B$>KY9a3Ac8R595LDnM>q%Uhm-#6&l*I znW9#KyH#`|S?puSy0W{s{o`p-<1&VK1v~ZiGZnd6SjwI}-n+){EJx-ex{b{a%eS-& zMAg#<#?2!&wBKqwulD3|*H2VkQ7Y^ui~j-kh&iAA!nw>bi7&}~^71O7iLCcKK=9V~-GKr6>;VY9j zX@TYzBCo4IWO3|P@J3hPl#^nJaqQvr2EYzvI8;$bWHGv$gd61< zY0*V=qatrr@64lvi$irKB_@ZC`mcTE;7(Ja4vm<@yz6(k2hrW{#hZX9cgn!pe3;VR z{Vc3r5S18X(y!vAqqD2ga2{yxe7`R5noh`eC7s6kJj{(GMu~Ki2v?L`a|sIM2C`bV zgQ3@?%) z1$`qQ7iZgB^Np0UqGZ3+Icliyikw1w272?f^Y8@1El?!(67_w1)UwBDDrgJ>o8`&+&H1 zw`X!u7?n+SB&X7u1b2L|(}zXB`iT~WBolX4tIq?bZ1JeZWebLEKl*7D%^KfWjKzO7 zP9HGjh?8~$Ne3DsR!hV3A~zof8>3Ok(R0uUIb+#6MMq`s#S$cyKZmIStRLWs5_++(41?L|WD6^-SFE{z!reHRJAt0ng5y8$r=^kuMi_ zrw)x0?@d#_uR}po7=3R1if}lDQM2gtRH(3s%T(w z`dZ!nq7zcC9Nc@5ydPCj&0S5DaMu_*UlPA>!1(Li8Wj}-gF>Ei5xo|R@$vZv59it5 zycx@#v#J>YBqVNu8+)qNmmd9}RhoZxAAo<%|P>D?l1woU)b>rS#vv+@^Ou6SJw&4dv>GPd(+2`;d1=(s0X=s>RUc* z=&ThaAZ96)T2m)AZKD()!tW557+$6JtM z79K)8O+~i`uYv1gZmvkt5NO5&8h==Xvzi-X`NeD-ZU^p`=#d=!zuAex_YuecA@A_t z&uCoj+^=7s?y}mR#6S_N_SLLMyB0x?C9<}$u%!;J>(Bo@kb|1? ziZwe}%^#a+c_aj6;gQ@O*}f_fXL0H~@6mAFn#%N)>pcFdw3R7BS9AB$YkZwHI|ly* zh3^96mlqHmNXQjRwVnC;M>HZ3LqS7B2q~7+3*7B!Mhl5Q?eD2MQ>4;0ZqhZ&n=r65gvZW`rm z7iu<5gDaKH>#CrnBzR-Oq;h~Q2I0=#geS!e3=Rqc#WUF!A1}G)ON6@?)4gAO{frX+ z^d0W#WanU<&4ZMrvF`DY#Ke%30+Ot$mX;P1)k=%mh2GJtm7Mfw_AD7f0dM{U4I)mb zk&yUFg;521O>)dY?=l~>CM(@0Ylq~8hg)^Vkh~l)-BYR81gD|Un_Ab_WLA?tgOVv; zqU6qHJnR)k_qFv^2{MIkY;?IIo$IZaFuC60AAb2{Qlh>Ce}s2;KFVo)OE~$Qput1|_q{oF zqR_Lo7gEV9yp1lKa3pPpZnagzhAT=e69hhc=5CGz0(Q>?_#s=G%aSGOVj)d;FZmZ2 zJ&8i^b|x;47N-8JPuMG}L2EsiCw5=>g_W0&F_6rE^5t2Y#b8rX)_pl0TIK~kV6C{G z{K!YhU_<^b+$X7>{hcr zDBK&(DB+8to2d_qHNhzt(QAM#3LUF5IOiXUOmNDn( zMj50(XXr@gc=dZR`+R(Sbxx1@>~{n+#Sl|!Xc)pkvOK)dVx$DCibv^~DI3~zUeZJT zMPzj8F83Hu$c#JE#kwm!9zsrj;;JHgc|gXhI->Mx*$fZ5TGBpg*HtN3 zJFX{d>S~^!o(h~snO4j?S;|PdnXVo}EPL%gYBjj!m|@*j2v{1H{D@)DeeHD3L}EC) z292)2SQyy#rpA_S)VK+J>ik~VK;h)Cx`zC3ie9X{SYbDB5JBPlbW>2gaUYETzj|6s zenx-M0FndkY3rJf4^?$NRMVGtKt15>Y*i59^>y6dxq)}cHZ1wN_^G>W2_5b>sGCa< zXhFaAGzV72?Q}!C|1(G)@+@5n-b&5}$wq|SAAUxg4E*5Si;`fckHWwlV>qv~@xE|} z{*i9lC*ZgIK>tl|eaiAQvYU0vvJz*&=z_+@)eW79EkQ%w={cAQpVgu*9Pex^U*c`M ze}QI&=XU>@+B=mt|AX8!6Q*Z>{xE~;hppr^16vcJuH9KqBoay)Lgo!LcKVU-ZrApJ z9Go0e*Q*UezmCNWM^=797oidR5G1F9r5$dQ?IC5Zh0{4@);@u^^x+y;UN*P z=~TC(ST8+bRM0@BiQ4HPcW=a)VQ`+Fv*uu>GbVRI45a=+YfiRpEKC}>lO;>&| zhcQ(-&$c-W3$HHfzJLF|+ROi*=~;nB<#dTduw(%~2zVe8HN8O!;~#YFO6UF2N}Bv1(eOoIM#_Mf+J{nrNriY|=j z$2Njc4+f6B84lZbuCq_sLq9x1B|0Wvui#Zq@GiAswL7z%MK#BLHZl zlamvP-wxDar-IX1pxd=?^$=tNa9c0g%AyzH5PLZ-8;|w!U14M6dfY8|HPIK-pkzQJ^P6AeI9nL141@b4%*^R265HK0`WNbcp@-3!N#CqyHSVmP6 z={b*E%M>$~8r{V7fnt2stuaS@PU3Uajv#b_LB=l4I_v(jWTuF2t=Ham`#LwJ#3lt7 zdwDyZ>fY7@2g99G;0}J>zNXHJ;Cd-96zb;ioWyW>pNC)l!b@SK6{MF+$8!gF8xrw& znS#nizc3a0+4@S;!1#Fg7GHPhP4(rpF4=;{wT`6uA-L>+%a8_&Xwc%B3#+R)qDrv% z=J+OW4sQwx5euPTkU>qxdBFw16Tq>k$%P3R%vdtSQ~~3Db+=%pp2Y5qOtLZ!2T~!6 zO`roH@zj>E<^{(Mrrj-9(*aOUi1hgWmrq+FQ(OC@NP&$Gqobp}?Qh$b|EPK#Ulj7q zX7xWCG%o3EV2Pc1Lx$PZa9mM#myo6t*S|)q%ILH`lZY|GTbwDH4$ILiusBN<7G-cV zINc6j2bmAmpp?*}@owupu(eZ`;MTa`+ZThSjK$s|3KRvt^84_3(}{iSd$*y+;l$PE zrkP?(hgPk}`|hQ)o{8x1aaw9h)#oS9^YeU2BzFls4ofTHJqusnQG|xnU2W}jgKcwn z)_x}TjW~hDDqkVz8K1dU4Ijt>w!B$B1DR~+9?flk6nm}BXDLkGrgmfnu59q5+vgXpP^3LXl3%(0(ip0GGaYf&tanTjKpxDz8GjHto+pRat>WU=W^{kJn)Q`#AD$Y zho_poPP+>nu00$1o$8>BOmk7SSbF=Vka*`e5{if%#Q+R&ajs&uKi43=o1&6u+#h>* zZijnv2t)>xoV?^nevM)e1C|gCoeu`)Z|L<&yMs6M{0P*V(p+5w^Xap<pDRdONmn1R$72C>@eFP~y9Pxt5R?!X3q{@l#NoOTzQ9q$9U1IwMCw+56?e7o0`jr*zJH3)b_w zXui!GVS2;Q zxFm(7q+b%shsA5D^*@Cl=Y5$x=xl4Nl%uSW(+3r>9V~41!$5eSJ)YYW*VaCd6HLYu zTW=x05o*yy?uVThL@66bG?GIb(QfbH*yMC$Ze+!%!`-x$KIptZzqq^WaJFYftSdkf zanTvg7fslvAE=RDSx={eV>5HTJt4sHVSDBVsOHs0%s$!lmsb!7d=~6`0gAL5)J}L< zfbsM;$m}-MXQ91mAZ28nd`reqCrXA%NkJjk%Oy+1!&CSA^=odP8ZzE$v4VH+B#U== z4TrwyD_4x9%BX^h++ZycP8)4^lkTg%J)%Tzr;F>n(B55&s4i|t&=X|wAVqZ7yPaT? ztQ;|__9Zae^mb^U5x3n`zSn;L{!NX_#f2+S27Z38{`jhE*PFAZ{P~sb<(T*^I-1Hd!j|>AEq5Z z#>!fre9UKb!v1xXY$Z9_l?an9^;mi7xD<{Bm#`8 zS)k0KFEdzN-@oyiW=GBx zqHxZP)}Eh(vz7!^;xTFiJ2 zX|SYcom%_%ec69v7?LUdfVU*$trxJ`qT`6)-QBITz182cc9WDDhyVo^j*lNZ+S-0_ zKHC_}kvdE#6A}lp+Zcvaq0~`YgFKp2mR(=&^D9Jdp1Q9ucs6HFXpK1EiX;$Dd4DMi zC64Kh=XMosyD0MulZqKY2bpmF{fUF?O=X6zvm9^6211h!@9J*@o-`-sq!tch2DX8s z(`Eab2uc}Q@oG?JDS}kvvAX1Q>sutsM<@eo`QA}P1O!kE*-&Za_$nH^<>0X6&|^I2#JHQg#iAX&U-(?9=4f_ zCbzA{1o&>Npq`uCvxe)ZO{$)UASgJ(mOY0R38}+Pgy5I7aU-l9Mnu+)iIY|tU zqM@SSp4BZ*?(*tbb(nUvcMgF4wQR#PW+zaMQ$^r>1OM{hHq3 zCZ}zI%hncp=lSPm4b8g)e3Ca-$OW|w6#_-B0Nyi zN`8{zg>*-ryzJFji0E=)gjl0?L#69cG>F9k_jTJH#OQ2&m#01ZyRGdJFw)a_w75;T z1C4xQ!gVL-o~^aWP3z-ZXTBO3z5TxC3S$t|5LratUvXH;VuoVFC=Nd>4(OfAo}5G+ZtY471$91azLQP zP$Z(M@2cKhRyRfyB}j#h?ElOL_6l;^tdvGCpQjW(iNjk5vuu!G1F2Q_--xoYe)nL= XFXj7$trM)u5+d Date: Wed, 6 Apr 2022 17:48:32 +0200 Subject: [PATCH 05/10] Fix LX remarks --- content/blog/2022-v0.7-released.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2022-v0.7-released.md b/content/blog/2022-v0.7-released.md index 5fe3010..071d2ee 100644 --- a/content/blog/2022-v0.7-released.md +++ b/content/blog/2022-v0.7-released.md @@ -18,7 +18,7 @@ This is also our first time welcoming contributors external to the core team, an You can get this release using our binaries or the package provided by your distribution. We ship [statically compiled binaries](https://garagehq.deuxfleurs.fr/download/) for most Linux architectures (amd64, i386, aarch64 and armv6) and associated [Docker containers](https://hub.docker.com/u/dxflrs). Garage now is also packaged by third parties on some OS/distributions. We are currently aware of [FreeBSD](https://cgit.freebsd.org/ports/tree/www/garage/Makefile) and [AUR for Arch Linux](https://aur.archlinux.org/packages/garage). -Feel free to [reach us](mailto:garagehq@deuxfleurs.fr) if you are packaging (or planning to package) Garage, we welcome maintainers and will upstream specific patches if that can help. If you already did package garage, tell us and we'll add it to the documentation. +Feel free to [reach out to us](mailto:garagehq@deuxfleurs.fr) if you are packaging (or planning to package) Garage, we welcome maintainers and will upstream specific patches if that can help. If you already did package Garage, tell us and we'll add it to the documentation. Speaking about the changes of this new version, it obviously includes many bug fixes. We listed them in our [changelogs](https://git.deuxfleurs.fr/Deuxfleurs/garage/releases), take a look, we might have fixed something that annoyed you! From b96dfce719580e3481af02c95f89c5d79ad5b3e7 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Wed, 6 Apr 2022 19:11:11 +0200 Subject: [PATCH 06/10] WIP roadmap --- content/blog/2022-v0.7-released.md | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/content/blog/2022-v0.7-released.md b/content/blog/2022-v0.7-released.md index 071d2ee..c332a80 100644 --- a/content/blog/2022-v0.7-released.md +++ b/content/blog/2022-v0.7-released.md @@ -234,13 +234,14 @@ You can use them to better understand how Garage is interacting with your OS and This plot has been captured at the same moment than the previous one. We do not see a correlation between the writes and the API requests for the full upload but only for its beginning. -However, it maps well to Multipart Uploads requests: this is expected because small files will be throttled by other parts of the system, while large files will be able to saturate the writes of your disk. +More precisely, it maps well to Multipart Uploads requests, and this is expected. +Large files (of the Multipart Uploads) will saturate the writes of your disk but the uploading of small files (via the PutObject endpoint) will be throttled by other parts of the system. -This simple example, done on a test cluster, covers only 2 metrics over the 20+ ones that we already defined but we were still able to precisely describe our cluster usage and identifies where bottlenecks could be. +This simple example covers only 2 metrics over the 20+ ones that we already defined, but we were still able to precisely describe our cluster usage and identifies where bottlenecks could be. We are confident that cleverly using these metrics on a production cluster will give you many more valuable insights on your cluster. -While metrics are good to have a large, general overview of your system, they are however not adapted to dig and pinpoint a specific performance problem on a specific code path. -Thankfully, we also have a solution for this problem: traces. +While metrics are good to have a large, general overview of your system, they are however not adapted to dig and pinpoint a specific performance issue on a specific code path. +Thankfully, we also have a solution for this problem: tracing. Using [Application Performance Monitoring](https://www.elastic.co/observability/application-performance-monitoring) (APM) in conjunction with Kibana, we get the following visualization: @@ -251,14 +252,29 @@ On the top of the screenshot, we see the latency distribution of all PutObject r We learn that the selected request took ~1ms to execute, while 95% of all requests took less than 80ms to run. Having some dispersion between requests is expected as Garage does not run on a strong real-time system, but in this case, you must also consider that a request duration is impacted by the size of the object that is sent (a 10B object will be quicker to process than a 10MB one). +Consequently, this request corresponds probably to a very tiny file. -Below, you can select the request you want to inspect, and then see its stacktrace. -You can break down these lines in 4 parts: fetching the API key to check authentication (`key get`), fetching the bucket identifier from its name (`bucket_alias get`), fetching the bucket configuration to check authorizations (`bucket_v2 get`), and finally inserting the object in the storage (`object insert`). +Below this first histogram, you can select the request you want to inspect, and then see its stacktrace on the bottom part. +You can break down this trace in 4 parts: fetching the API key to check authentication (`key get`), fetching the bucket identifier from its name (`bucket_alias get`), fetching the bucket configuration to check authorizations (`bucket_v2 get`), and finally inserting the object in the storage (`object insert`). With this example, we demonstrated that we can inspect Garage internals to find slow requests, then see which codepath has been taken by a request, to finally identify which part of the code took time. +Keep in mind that this is our first iteration on telemetry for Garage, so things are a bit rough around the edges (step by step documentation is missing, our Grafana dashboard is a work in a progress, etc.). +In all cases, your feedback is welcome on our Matrix channel. ## And next? -roadmap: k2v, allocation simulator, s3 compatibility, community feedback, whitepaper +While we hope that Garage in its current state inspired you, we also understand that you may be curious about what will come next! +Currently, our goal is to reach v1.0, for which we want to work on these three desirable properties: *Feature complete*, *Understandability and manageability*, and *Correctness*. +**Feature complete**. We have already implemented a selected subset of S3 endpoints that works quite well, but we want to work on the corner cases that are not yet solved (eg. [#263](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues), [#248](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/248), [#204](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/204). Based on community feedbacks, we might consider implementing additional endpoints (eg. [#166](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/166) but we can make no promise (sorry!). Finally, we made a serie of observation: 1) the S3 API has a limited semantic, for example it is not adapted for append-only log data structures, 2) many projects require a database additionaly to the object store 3) we already implemented a key value store internally to handle S3 metadata. It leads us to the conclusion that we study the feasibility of providing a simple and totally optional key value interface that we refer as K2V. We are currently writing [an API draft](https://p.adnab.me/code/#/2/code/view/eUNPbfoUrMbCY+CoMXaqed4jmWlmvWALHNDcfuM-O5o/embed/present/) and will try to implement it in the following months. We would like it to be as close as possible as the original [Amazon Dynamo paper](https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf), or if you are more familiar with Cassandra, as the most possible minimalistic Cassandra. + +**Understandability and manageability**. We want a system that is understood and manageable by the largest possible amount of operators. To achieve such a goal, we can follow 2 paths: sharing knowledge and making better tools. We want to explore both approaches, and we identified specific subjects on which to work: 1) Garage's consistency model of the S3 API and the admin API, 2) Explaining how Garage can take its place in the existing ecosystem, including among the other distributed storage systems, but also in term of uses cases and business + + - Well understood, well explained + - Consistency Model + - Deployment Cas Typique + - web interface, rest admin + - Storage density vs reliability, deployment simulator + - Fast, tested and correct + - From 1f45e9d987380034570bc86310fd1dee42c8dcf1 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Wed, 6 Apr 2022 22:39:57 +0200 Subject: [PATCH 07/10] Finish the roadmap --- content/blog/2022-v0.7-released.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/content/blog/2022-v0.7-released.md b/content/blog/2022-v0.7-released.md index c332a80..eaa06da 100644 --- a/content/blog/2022-v0.7-released.md +++ b/content/blog/2022-v0.7-released.md @@ -265,16 +265,19 @@ In all cases, your feedback is welcome on our Matrix channel. ## And next? While we hope that Garage in its current state inspired you, we also understand that you may be curious about what will come next! -Currently, our goal is to reach v1.0, for which we want to work on these three desirable properties: *Feature complete*, *Understandability and manageability*, and *Correctness*. +Currently, our goal is to reach v1.0, for which we want to work on these three desirable properties: *Feature completeness*, *Understandability and manageability*, and *Correctness*. -**Feature complete**. We have already implemented a selected subset of S3 endpoints that works quite well, but we want to work on the corner cases that are not yet solved (eg. [#263](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues), [#248](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/248), [#204](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/204). Based on community feedbacks, we might consider implementing additional endpoints (eg. [#166](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/166) but we can make no promise (sorry!). Finally, we made a serie of observation: 1) the S3 API has a limited semantic, for example it is not adapted for append-only log data structures, 2) many projects require a database additionaly to the object store 3) we already implemented a key value store internally to handle S3 metadata. It leads us to the conclusion that we study the feasibility of providing a simple and totally optional key value interface that we refer as K2V. We are currently writing [an API draft](https://p.adnab.me/code/#/2/code/view/eUNPbfoUrMbCY+CoMXaqed4jmWlmvWALHNDcfuM-O5o/embed/present/) and will try to implement it in the following months. We would like it to be as close as possible as the original [Amazon Dynamo paper](https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf), or if you are more familiar with Cassandra, as the most possible minimalistic Cassandra. +**Feature completeness**. We have already implemented a selected subset of S3 endpoints that works quite well, but we want to work on the corner cases that are not yet solved (eg. [#263](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues), [#248](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/248), [#204](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/204). Based on community feedbacks, we might consider implementing additional endpoints (eg. [#166](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/166) but we can't make any promise (sorry!). Finally, we made a serie of observation: 1) the S3 API has a limited semantic, for example it is not adapted for append-only log data structures, 2) many projects require a database additionaly to the object store, and 3) we already implemented a key value store internally to handle S3 metadata. Following these observations, we want to study the feasibility of providing a simple and totally optional key value interface that we refer to as K2V. We are currently writing [an API draft](https://p.adnab.me/code/#/2/code/view/eUNPbfoUrMbCY+CoMXaqed4jmWlmvWALHNDcfuM-O5o/embed/present/) and will try to implement it in the following months. We would like it to be as close as possible as the original [Amazon Dynamo paper](https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf), or if you like approximative comparisons, K2V could be to Cassandra what sqlite is to PostgreSQL. -**Understandability and manageability**. We want a system that is understood and manageable by the largest possible amount of operators. To achieve such a goal, we can follow 2 paths: sharing knowledge and making better tools. We want to explore both approaches, and we identified specific subjects on which to work: 1) Garage's consistency model of the S3 API and the admin API, 2) Explaining how Garage can take its place in the existing ecosystem, including among the other distributed storage systems, but also in term of uses cases and business +**Understandability and manageability**. We want a system that is understood and manageable by the largest possible amount of operators. We identified the following points that we would like to improve: 1) Explaining Garage's consistency model, both on the S3 and the admin API, 2) Explaining how Garage can take its place in the existing ecosystem, including among the other distributed storage systems (eg. Ceph, Minio, SeaweedFS, IPFS Cluster), but also in term of uses cases and deployments (how does it perform at scale, with which hardware, for which application, etc.) 3) Make possible to manage Garage from a REST API, possibly write a web GUI to make administration easier, 4) help people understand the reliability and storage density they will have for a specific Garage deployment, if possible through a simulator, 5) we might consider adding a system of quota to protect a cluster from a misbehaving user. + +**Correctness**. We know in theory that Garage's design works and scales. +But we still need to make sure that in practise our implementation is correct, and thus features these defined properties. +To convince ourselves, we consider verifying our consistency model implementation through [Jepsen](https://jepsen.io/). +We also plan to deploy Garage on multiple clusters and do a large serie of benchmarks. + +Please note that this roadmap is purely indicative, we are not committing to deliver these features. +We also don't know when v1.0 will be released, except "when it will be ready", but we would be happy if it could be by the end of 2022. +Finally, if you have some knowledge on one or more of thes points and would like to help, feel free to ping us on Matrix. +And see you soon for the next release! - - Well understood, well explained - - Consistency Model - - Deployment Cas Typique - - web interface, rest admin - - Storage density vs reliability, deployment simulator - - Fast, tested and correct - - From b93391bfa6666b224f46946c0455882d3c9324fb Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 7 Apr 2022 11:38:12 +0200 Subject: [PATCH 08/10] Remove the roadmap from this post --- content/blog/2022-v0.7-released.md | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/content/blog/2022-v0.7-released.md b/content/blog/2022-v0.7-released.md index eaa06da..2b90373 100644 --- a/content/blog/2022-v0.7-released.md +++ b/content/blog/2022-v0.7-released.md @@ -262,22 +262,8 @@ With this example, we demonstrated that we can inspect Garage internals to find Keep in mind that this is our first iteration on telemetry for Garage, so things are a bit rough around the edges (step by step documentation is missing, our Grafana dashboard is a work in a progress, etc.). In all cases, your feedback is welcome on our Matrix channel. -## And next? -While we hope that Garage in its current state inspired you, we also understand that you may be curious about what will come next! -Currently, our goal is to reach v1.0, for which we want to work on these three desirable properties: *Feature completeness*, *Understandability and manageability*, and *Correctness*. +## Conclusion -**Feature completeness**. We have already implemented a selected subset of S3 endpoints that works quite well, but we want to work on the corner cases that are not yet solved (eg. [#263](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues), [#248](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/248), [#204](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/204). Based on community feedbacks, we might consider implementing additional endpoints (eg. [#166](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/166) but we can't make any promise (sorry!). Finally, we made a serie of observation: 1) the S3 API has a limited semantic, for example it is not adapted for append-only log data structures, 2) many projects require a database additionaly to the object store, and 3) we already implemented a key value store internally to handle S3 metadata. Following these observations, we want to study the feasibility of providing a simple and totally optional key value interface that we refer to as K2V. We are currently writing [an API draft](https://p.adnab.me/code/#/2/code/view/eUNPbfoUrMbCY+CoMXaqed4jmWlmvWALHNDcfuM-O5o/embed/present/) and will try to implement it in the following months. We would like it to be as close as possible as the original [Amazon Dynamo paper](https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf), or if you like approximative comparisons, K2V could be to Cassandra what sqlite is to PostgreSQL. -**Understandability and manageability**. We want a system that is understood and manageable by the largest possible amount of operators. We identified the following points that we would like to improve: 1) Explaining Garage's consistency model, both on the S3 and the admin API, 2) Explaining how Garage can take its place in the existing ecosystem, including among the other distributed storage systems (eg. Ceph, Minio, SeaweedFS, IPFS Cluster), but also in term of uses cases and deployments (how does it perform at scale, with which hardware, for which application, etc.) 3) Make possible to manage Garage from a REST API, possibly write a web GUI to make administration easier, 4) help people understand the reliability and storage density they will have for a specific Garage deployment, if possible through a simulator, 5) we might consider adding a system of quota to protect a cluster from a misbehaving user. - -**Correctness**. We know in theory that Garage's design works and scales. -But we still need to make sure that in practise our implementation is correct, and thus features these defined properties. -To convince ourselves, we consider verifying our consistency model implementation through [Jepsen](https://jepsen.io/). -We also plan to deploy Garage on multiple clusters and do a large serie of benchmarks. - -Please note that this roadmap is purely indicative, we are not committing to deliver these features. -We also don't know when v1.0 will be released, except "when it will be ready", but we would be happy if it could be by the end of 2022. -Finally, if you have some knowledge on one or more of thes points and would like to help, feel free to ping us on Matrix. -And see you soon for the next release! From df867dea639b8cf1f90e881780f5509a7fcf1a99 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 7 Apr 2022 18:05:43 +0200 Subject: [PATCH 09/10] Rework kube + conclusion --- content/blog/2022-v0.7-released.md | 178 ++++------------------------- 1 file changed, 25 insertions(+), 153 deletions(-) diff --git a/content/blog/2022-v0.7-released.md b/content/blog/2022-v0.7-released.md index 2b90373..be3a8a3 100644 --- a/content/blog/2022-v0.7-released.md +++ b/content/blog/2022-v0.7-released.md @@ -9,7 +9,7 @@ date=2022-04-04 --- -Two months ago, we were impressed by the success of our open beta launch at FOSDEM and on Hacker News: [our intial post](https://garagehq.deuxfleurs.fr/blog/2022-introducing-garage/) lead to more than 40k views in 10 days, going up to 100 views/minute. +Two months ago, we were impressed by the success of our open beta launch at FOSDEM and on Hacker News: [our initial post](https://garagehq.deuxfleurs.fr/blog/2022-introducing-garage/) lead to more than 40k views in 10 days, going up to 100 views/minute, and all requests were served by Garage without cache! Since this event, we continued to improve Garage, and - 2 months after the initial release - we are happy to announce version 0.7.0. But first, we would like to thank the contributors that made this new release possible: Alex, Jill, Max Audron, Maximilien, Quentin, Rune Henrisken, Steam, and trinity-1686a. @@ -26,171 +26,40 @@ Besides bugfixes, there is two new features: a better Kubernetes integration and ## Kubernetes integration -Before Garage v0.7.0, you had to deploy a Consul cluster or spawn a "coordinating" pod to deploy Garage on Kubernetes. -In this new version, Garage integrates a method to discover other peers by using Kubernetes [Custom Resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) to simplify cluster discovery. -Garage can self-apply the [Custom Resource Definition](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) (CRD) to your cluster, or you can manage it manually. +Before Garage v0.7.0, you had to deploy a Consul cluster or spawn a "coordinating" pod to deploy Garage on [Kubernetes](https://kubernetes.io) (K8S). +In this new version, Garage integrates a method to discover other peers by using Kubernetes [Custom Resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) (CR) to simplify cluster discovery. -Let's see practically how it works with a minimalistic example (not secured nor suitable for production). -You can run it on [minikube](https://minikube.sigs.k8s.io) if you want a more interactive reading. +CR discovery can be quickly enabled by configuring the name of the desired service (`kubernetes_namespace`) and which namespace to look for (`kubernetes_service_name`) in your Garage config: -Start by creating a [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) containing Garage's configuration (let's name it `config.yaml`): - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: garage-config - namespace: default -data: - garage.toml: |- - metadata_dir = "/mnt/fast" - data_dir = "/mnt/slow" - - replication_mode = "3" - - rpc_bind_addr = "[::]:3901" - rpc_secret = "" - - bootstrap_peers = [] - - kubernetes_namespace = "default" - kubernetes_service_name = "garage-daemon" - kubernetes_skip_crd = false - - [s3_api] - s3_region = "garage" - api_bind_addr = "[::]:3900" - root_domain = ".s3.garage.tld" - - [s3_web] - bind_addr = "[::]:3902" - root_domain = ".web.garage.tld" - index = "index.html" +```toml +kubernetes_namespace = "default" +kubernetes_service_name = "garage-daemon" ``` -The 3 important parameters are `kubernetes_namespace`, `kubernetes_service_name`, and `kubernetes_skip_crd`. -Configure them according to your planned deployment. -The last one controls wether you want to create the CRD manually or allow Garage to create it automatically on startup. -In this example, we keep it to `false`, which means we allow Garage to automatically create the CRD. +Custom Resources must be defined *a priori* with [Custom Resource Definition](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) (CRD). +If the CRD does not exist, Garage can create it for you. It is enabled by default but it requires some additional permissions. +If you prefer limiting accesses to your K8S cluster, you can create the resource manually and prevent Garage from automatically creating it: -Apply this configuration on your cluster: - -```bash -kubectl apply -f config.yaml +```toml +kubernetes_skip_crd = true ``` -Allowing Garage to create the CRD is not enough, the process must have enough permissions. -A quick unsecure way to add the permission is to create a [ClusterRoleBinding](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding) to give admin rights to our local user, effectively breaking Kubernetes' security model (we name this file `admin.yml`): +If you want to try Garage on K8S, we currently only provide some basic [example files](https://git.deuxfleurs.fr/Deuxfleurs/garage/src/commit/7e1ac51b580afa8e900206e7cc49791ed0a00d94/script/k8s). These files register a [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/), a [ClusterRoleBinding](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding), and a [StatefulSet](https://kubernetes.io/fr/docs/concepts/workloads/controllers/statefulset/) with a [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/). -```yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: garage-admin -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-admin -subjects: -- apiGroup: rbac.authorization.k8s.io - kind: User - name: system:serviceaccount:default:default -``` - -Apply it: - -```bash -kubectl apply -f admin.yaml -``` - -Finally, we create a [StatefulSet](https://kubernetes.io/fr/docs/concepts/workloads/controllers/statefulset/) to run our service (`service.yaml`): - -```yaml -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: garage -spec: - selector: - matchLabels: - app: garage - serviceName: "garage" - replicas: 3 - template: - metadata: - labels: - app: garage - spec: - terminationGracePeriodSeconds: 10 - containers: - - name: garage - image: dxflrs/amd64_garage:v0.7.0 - ports: - - containerPort: 3900 - name: s3-api - - containerPort: 3902 - name: web-api - volumeMounts: - - name: fast - mountPath: /mnt/fast - - name: slow - mountPath: /mnt/slow - - name: etc - mountPath: /etc/garage.toml - subPath: garage.toml - volumes: - - name: etc - configMap: - name: garage-config - volumeClaimTemplates: - - metadata: - name: fast - spec: - accessModes: [ "ReadWriteOnce" ] - resources: - requests: - storage: 100Mi - - metadata: - name: slow - spec: - accessModes: [ "ReadWriteOnce" ] - resources: - requests: - storage: 100Mi -``` - -Garage is a stateful program, so it needs a stable place to store its data and metadata. -This feature is provided by Kubernetes' [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) that can be used only from a [StatefulSet](https://kubernetes.io/fr/docs/concepts/workloads/controllers/statefulset/), hence the choice of this K8S object to deploy our service. - -Kubernetes has many "drivers" for Persistent Volumes, for production uses we recommend **only** the `local` driver. -Using other drivers may lead to huge performance issues or data corruption, probably both in practice. - -In the example, we are claiming 2 volumes of 100MB. -We use 2 volumes instead of 1 because Garage separates its metadata from its data. -By having 2 volumes, you can reserve a smaller capacity on a SSD for the metadata and a larger capacity on a regular HDD for the data. -Do not forget to change the reserved capacity, 100MB is only suitable for testing. - -*Note how we are mounting our ConfigMap: we need to set the `subpath` property to mount only the `garage.toml` file and not the whole `/etc` folder that would prevent K8S from writing its own files -in `/etc` and fail the pod.* - -You can apply this file with: - -```bash -kubectl apply -f service.yaml -``` - -Now, you are ready to interact with your cluster, each instance must have discovered the other ones: +Once these files deployed, you will be able to interact with Garage as follow: ```bash kubectl exec -it garage-0 --container garage -- /garage status # ==== HEALTHY NODES ==== -# ID Hostname Address Tags Zone Capacity -# e6284331c321a23c garage-0 172.17.0.5:3901 NO ROLE ASSIGNED -# 570ff9b0ed3648a7 garage-2 [::ffff:172.17.0.7]:3901 NO ROLE ASSIGNED -# e1990a2069429428 garage-1 [::ffff:172.17.0.6]:3901 NO ROLE ASSIGNED +# ID Hostname Address Tags Zone Capacity +# e628.. garage-0 172.17.0.5:3901 NO ROLE ASSIGNED +# 570f.. garage-2 172.17.0.7:3901 NO ROLE ASSIGNED +# e199.. garage-1 172.17.0.6:3901 NO ROLE ASSIGNED ``` -Of course, to have a full deployment, you will probably want to deploy a [Service](https://kubernetes.io/docs/concepts/services-networking/service/) in front of your cluster and/or a reverse proxy. +You can then follow the [regular documentation](https://garagehq.deuxfleurs.fr/documentation/cookbook/real-world/#creating-a-cluster-layout) to complete the configuration of your cluster. + +If you target a production deployment, you should avoid binding admin rights to your cluster to create Garage's CRD. You will also need to expose some [Services](https://kubernetes.io/docs/concepts/services-networking/service/) to make your cluster reachable. Keep also in mind that Garage is a stateful service, so you must be very careful how you handle your data in Kubernetes to not lose them. In the near future, we plan to release a proper Helm chart and write "best practises" on our documentation. If Kubernetes is not your thing, know that we are running Garage on a Nomad+Consul cluster. We have not documented it yet but you can get a look at [our Nomad service](https://git.deuxfleurs.fr/Deuxfleurs/infrastructure/src/commit/1e5e4af35c073d04698bb10dd4ad1330d6c62a0d/app/garage/deploy/garage.hcl). @@ -265,5 +134,8 @@ In all cases, your feedback is welcome on our Matrix channel. ## Conclusion +This is only the first iteration of the Kubernetes and OpenTelemetry into Garage, so things are still a bit rough. +We plan to polish their integration in the coming months based on our experience and your feedback. - +You may also ask yourself what will be the other works we plan to conduct: stay tuned, we will release a roadmap soon! +In the mean time, we hope you will enjoy Garave v0.7! From b7cfe7c09c3e2b42c0ef867c95600670ea7f2736 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Fri, 8 Apr 2022 12:09:40 +0200 Subject: [PATCH 10/10] Move images & fix english in blog post --- .../blog/2022-v0.7-released}/api_rate.png | Bin .../blog/2022-v0.7-released}/apm.png | Bin .../index.md} | 68 +++++++++--------- .../blog/2022-v0.7-released}/writes.png | Bin 4 files changed, 35 insertions(+), 33 deletions(-) rename {static/images/blog => content/blog/2022-v0.7-released}/api_rate.png (100%) rename {static/images/blog => content/blog/2022-v0.7-released}/apm.png (100%) rename content/blog/{2022-v0.7-released.md => 2022-v0.7-released/index.md} (66%) rename {static/images/blog => content/blog/2022-v0.7-released}/writes.png (100%) diff --git a/static/images/blog/api_rate.png b/content/blog/2022-v0.7-released/api_rate.png similarity index 100% rename from static/images/blog/api_rate.png rename to content/blog/2022-v0.7-released/api_rate.png diff --git a/static/images/blog/apm.png b/content/blog/2022-v0.7-released/apm.png similarity index 100% rename from static/images/blog/apm.png rename to content/blog/2022-v0.7-released/apm.png diff --git a/content/blog/2022-v0.7-released.md b/content/blog/2022-v0.7-released/index.md similarity index 66% rename from content/blog/2022-v0.7-released.md rename to content/blog/2022-v0.7-released/index.md index be3a8a3..1414a81 100644 --- a/content/blog/2022-v0.7-released.md +++ b/content/blog/2022-v0.7-released/index.md @@ -9,27 +9,27 @@ date=2022-04-04 --- -Two months ago, we were impressed by the success of our open beta launch at FOSDEM and on Hacker News: [our initial post](https://garagehq.deuxfleurs.fr/blog/2022-introducing-garage/) lead to more than 40k views in 10 days, going up to 100 views/minute, and all requests were served by Garage without cache! -Since this event, we continued to improve Garage, and - 2 months after the initial release - we are happy to announce version 0.7.0. +Two months ago, we were impressed by the success of our open beta launch at FOSDEM and on Hacker News: [our initial post](https://garagehq.deuxfleurs.fr/blog/2022-introducing-garage/) lead to more than 40k views in 10 days, peaking at 100 views/minute, and all requests were served by Garage, without even using a caching frontend! +Since this event, we continued to improve Garage, and — 2 months after the initial release — we are happy to announce version 0.7.0. But first, we would like to thank the contributors that made this new release possible: Alex, Jill, Max Audron, Maximilien, Quentin, Rune Henrisken, Steam, and trinity-1686a. This is also our first time welcoming contributors external to the core team, and as we wish for Garage to be a community-driven project, we encourage it! You can get this release using our binaries or the package provided by your distribution. -We ship [statically compiled binaries](https://garagehq.deuxfleurs.fr/download/) for most Linux architectures (amd64, i386, aarch64 and armv6) and associated [Docker containers](https://hub.docker.com/u/dxflrs). +We ship [statically compiled binaries](https://garagehq.deuxfleurs.fr/download/) for most common Linux architectures (amd64, i386, aarch64 and armv6) and associated [Docker containers](https://hub.docker.com/u/dxflrs). Garage now is also packaged by third parties on some OS/distributions. We are currently aware of [FreeBSD](https://cgit.freebsd.org/ports/tree/www/garage/Makefile) and [AUR for Arch Linux](https://aur.archlinux.org/packages/garage). -Feel free to [reach out to us](mailto:garagehq@deuxfleurs.fr) if you are packaging (or planning to package) Garage, we welcome maintainers and will upstream specific patches if that can help. If you already did package Garage, tell us and we'll add it to the documentation. +Feel free to [reach out to us](mailto:garagehq@deuxfleurs.fr) if you are packaging (or planning to package) Garage; we welcome maintainers and will upstream specific patches if that can help. If you already did package Garage, please inform us and we'll add it to the documentation. Speaking about the changes of this new version, it obviously includes many bug fixes. -We listed them in our [changelogs](https://git.deuxfleurs.fr/Deuxfleurs/garage/releases), take a look, we might have fixed something that annoyed you! -Besides bugfixes, there is two new features: a better Kubernetes integration and support for OpenTelemetry. +We listed them in our [changelogs](https://git.deuxfleurs.fr/Deuxfleurs/garage/releases), so take a look, we might have fixed some issues you were having! +Besides bugfixes, there are two new major features in this release: better integration with Kubernetes, and support for observability via OpenTelemetry. ## Kubernetes integration Before Garage v0.7.0, you had to deploy a Consul cluster or spawn a "coordinating" pod to deploy Garage on [Kubernetes](https://kubernetes.io) (K8S). In this new version, Garage integrates a method to discover other peers by using Kubernetes [Custom Resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) (CR) to simplify cluster discovery. -CR discovery can be quickly enabled by configuring the name of the desired service (`kubernetes_namespace`) and which namespace to look for (`kubernetes_service_name`) in your Garage config: +CR discovery can be quickly enabled in Garage, by configuring the name of the desired service (`kubernetes_namespace`) and which namespace to look for (`kubernetes_service_name`) in your Garage configuration file: ```toml kubernetes_namespace = "default" @@ -37,8 +37,8 @@ kubernetes_service_name = "garage-daemon" ``` Custom Resources must be defined *a priori* with [Custom Resource Definition](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) (CRD). -If the CRD does not exist, Garage can create it for you. It is enabled by default but it requires some additional permissions. -If you prefer limiting accesses to your K8S cluster, you can create the resource manually and prevent Garage from automatically creating it: +If the CRD does not exist, Garage will create it for you. Automatic CRD creation is enabled by default, but it requires giving additional permissions to Garage to work. +If you prefer strictly controlling access to your K8S cluster, you can create the resource manually and prevent Garage from automatically creating it: ```toml kubernetes_skip_crd = true @@ -59,14 +59,14 @@ kubectl exec -it garage-0 --container garage -- /garage status You can then follow the [regular documentation](https://garagehq.deuxfleurs.fr/documentation/cookbook/real-world/#creating-a-cluster-layout) to complete the configuration of your cluster. -If you target a production deployment, you should avoid binding admin rights to your cluster to create Garage's CRD. You will also need to expose some [Services](https://kubernetes.io/docs/concepts/services-networking/service/) to make your cluster reachable. Keep also in mind that Garage is a stateful service, so you must be very careful how you handle your data in Kubernetes to not lose them. In the near future, we plan to release a proper Helm chart and write "best practises" on our documentation. +If you target a production deployment, you should avoid binding admin rights to your cluster to create Garage's CRD. You will also need to expose some [Services](https://kubernetes.io/docs/concepts/services-networking/service/) to make your cluster reachable. Keep also in mind that Garage is a stateful service, so you must be very careful of how you handle your data in Kubernetes in order not to lose it. In the near future, we plan to release a proper Helm chart and write "best practises" in our documentation. -If Kubernetes is not your thing, know that we are running Garage on a Nomad+Consul cluster. +If Kubernetes is not your thing, know that we are running Garage on a Nomad+Consul cluster, which is also well supported. We have not documented it yet but you can get a look at [our Nomad service](https://git.deuxfleurs.fr/Deuxfleurs/infrastructure/src/commit/1e5e4af35c073d04698bb10dd4ad1330d6c62a0d/app/garage/deploy/garage.hcl). ## OpenTelemetry support -[OpenTelemetry](https://opentelemetry.io/) standardizes how software generate and collect system telemetry, namely metrics, logs and traces. +[OpenTelemetry](https://opentelemetry.io/) standardizes how software generates and collects system telemetry information, namely metrics, logs and traces. By implementing this standard in Garage, we hope that it will help you to better monitor, manage and tune your cluster. Note that to fully leverage this feature, you must be already familiar with monitoring stacks like [Prometheus](https://prometheus.io/)+[Grafana](https://grafana.com/) or [ElasticSearch](https://www.elastic.co/elasticsearch/)+[Kibana](https://www.elastic.co/kibana/). @@ -78,55 +78,57 @@ api_bind_addr = "127.0.0.1:3903" trace_sink = "http://localhost:4317" ``` +The first line, `api_bind_address`, instructs Garage to expose an HTTP endpoint from which metrics can be obtained in Prometheus' data format. +The second line, `trace_sink`, instructs Garage to export tracing information to an OpenTelemetry collector at the given address. +These two options work independently and you can use them separately, depending on if you are interested only in metrics, traces, or both. + We provide [some files](https://git.deuxfleurs.fr/Deuxfleurs/garage/src/branch/main/script/telemetry) to help you quickly bootstrap a testing monitoring stack. It includes a docker-compose file and a pre-configured Grafana dashboard. You can use them if you want to reproduce the following examples. -Now that your telemetry data is collected and stored, you can visualize it. - Grafana is particularly adapted to understand how your cluster is performing from a "bird's eye view". -For example, the following graph shows S3 API calls sent to your node per time-unit, -you can use it to better understand how your users are interacting with your cluster. +For example, the following graph shows S3 API calls sent to your node per time-unit. +You can use it to better understand how your users are interacting with your cluster. -![A screenshot of a plot made by Grafana depicting the number of requests per time units grouped by endpoints](/images/blog/api_rate.png) +![A screenshot of a plot made by Grafana depicting the number of requests per time units grouped by endpoints](api_rate.png) Thanks to this graph, we know that starting at 14:55, an important upload has been started. This upload is made of many small files, as we see many PutObject calls that are often used for small files. -It also has some large objects, as we observe some Multipart Uploads requests. -Conversely, at this time, no read are done as the corresponding read enpoints (ListBuckets, ListObjectsv2, etc.) receive 0 request per time unit. +It also has some large objects, as we observe some multipart uploads requests. +Conversely, at this time, no read are done as the corresponding read enpoints (ListBuckets, ListObjectsV2, etc.) receive 0 request per time unit. Garage also collects metrics from lower level parts of the system. You can use them to better understand how Garage is interacting with your OS and your hardware. -![A screenshot of a plot made by Grafana depicting the write speed (in MB/s) during time.](/images/blog/writes.png) +![A screenshot of a plot made by Grafana depicting the write speed (in MB/s) during time.](writes.png) This plot has been captured at the same moment than the previous one. We do not see a correlation between the writes and the API requests for the full upload but only for its beginning. -More precisely, it maps well to Multipart Uploads requests, and this is expected. -Large files (of the Multipart Uploads) will saturate the writes of your disk but the uploading of small files (via the PutObject endpoint) will be throttled by other parts of the system. +More precisely, it maps well to multipart upload requests, and this is expected. +Large files (of the multipart uploads) will saturate the writes of your disk but the uploading of small files (via the PutObject endpoint) will be limited by other parts of the system. -This simple example covers only 2 metrics over the 20+ ones that we already defined, but we were still able to precisely describe our cluster usage and identifies where bottlenecks could be. +This simple example covers only 2 metrics over the 20+ ones that we already defined, but it still allowed us to precisely describe our cluster usage and identify where bottlenecks could be. We are confident that cleverly using these metrics on a production cluster will give you many more valuable insights on your cluster. -While metrics are good to have a large, general overview of your system, they are however not adapted to dig and pinpoint a specific performance issue on a specific code path. +While metrics are good for having a large, general overview of your system, they are however not adapted for digging and pinpointing a specific performance issue on a specific code path. Thankfully, we also have a solution for this problem: tracing. Using [Application Performance Monitoring](https://www.elastic.co/observability/application-performance-monitoring) (APM) in conjunction with Kibana, -we get the following visualization: +we can get for instance the following visualization of what happens during a PutObject call (click to enlarge): -![A screenshot of APM depicting the trace of a PutObject call](/images/blog/apm.png) +[![A screenshot of APM depicting the trace of a PutObject call](apm.png)](apm.png) On the top of the screenshot, we see the latency distribution of all PutObject requests. We learn that the selected request took ~1ms to execute, while 95% of all requests took less than 80ms to run. Having some dispersion between requests is expected as Garage does not run on a strong real-time system, but in this case, you must also consider that a request duration is impacted by the size of the object that is sent (a 10B object will be quicker to process than a 10MB one). -Consequently, this request corresponds probably to a very tiny file. +Consequently, this request probably corresponds to a very small file. -Below this first histogram, you can select the request you want to inspect, and then see its stacktrace on the bottom part. -You can break down this trace in 4 parts: fetching the API key to check authentication (`key get`), fetching the bucket identifier from its name (`bucket_alias get`), fetching the bucket configuration to check authorizations (`bucket_v2 get`), and finally inserting the object in the storage (`object insert`). +Below this first histogram, you can select the request you want to inspect, and then see its trace on the bottom part. +The trace shown above can be broken down in 4 parts: fetching the API key to check authentication (`key get`), fetching the bucket identifier from its name (`bucket_alias get`), fetching the bucket configuration to check authorizations (`bucket_v2 get`), and finally inserting the object in the storage (`object insert`). -With this example, we demonstrated that we can inspect Garage internals to find slow requests, then see which codepath has been taken by a request, to finally identify which part of the code took time. +With this example, we demonstrated that we can inspect Garage internals to find slow requests, then see which codepath has been taken by a request, and finally to identify which part of the code took time. Keep in mind that this is our first iteration on telemetry for Garage, so things are a bit rough around the edges (step by step documentation is missing, our Grafana dashboard is a work in a progress, etc.). In all cases, your feedback is welcome on our Matrix channel. @@ -134,8 +136,8 @@ In all cases, your feedback is welcome on our Matrix channel. ## Conclusion -This is only the first iteration of the Kubernetes and OpenTelemetry into Garage, so things are still a bit rough. +This is only the first iteration of the Kubernetes and OpenTelemetry integrations in Garage, so things are still a bit rough. We plan to polish their integration in the coming months based on our experience and your feedback. -You may also ask yourself what will be the other works we plan to conduct: stay tuned, we will release a roadmap soon! -In the mean time, we hope you will enjoy Garave v0.7! +You may also ask yourself what will be the other works we plan to conduct: stay tuned, we will soon release information on our roadmap! +In the mean time, we hope you will enjoy using Garage v0.7. diff --git a/static/images/blog/writes.png b/content/blog/2022-v0.7-released/writes.png similarity index 100% rename from static/images/blog/writes.png rename to content/blog/2022-v0.7-released/writes.png