From 0c68a57f329bd1694363a221206c384a647ca802 Mon Sep 17 00:00:00 2001 From: christofluethi Date: Wed, 9 Oct 2024 18:01:15 +0200 Subject: [PATCH] initial version of super lab. --- config/_default/config.toml | 5 + content/en/docs/superlab/_index.md | 23 ++ content/en/docs/superlab/requirements.md | 276 +++++++++++++ content/en/docs/superlab/solution.md | 383 ++++++++++++++++++ .../en/docs/superlab/superlab-overview.drawio | 163 ++++++++ .../en/docs/superlab/superlab-overview.png | Bin 0 -> 90563 bytes 6 files changed, 850 insertions(+) create mode 100644 content/en/docs/superlab/_index.md create mode 100644 content/en/docs/superlab/requirements.md create mode 100644 content/en/docs/superlab/solution.md create mode 100644 content/en/docs/superlab/superlab-overview.drawio create mode 100644 content/en/docs/superlab/superlab-overview.png diff --git a/config/_default/config.toml b/config/_default/config.toml index 64610b8..078a8f5 100644 --- a/config/_default/config.toml +++ b/config/_default/config.toml @@ -86,6 +86,8 @@ maxlabnumber = 7 end-of-lab-title = "Cleaning up resources" end-of-lab-text = "You have reached the end of this lab. Please stop your running virtual machines to save resources on the Kubernetes cluster." +exampleWebAppImage = "quay.io/acend/example-web-python:latest" + # Cloud-init - Fedora Cloud #fedoraCloudCDI = "kubevirt/fedora-cloud-container-disk-demo:latest" # fedora cloud 32 fedoraCloudCDI = "quay.io/containerdisks/fedora:40" @@ -98,6 +100,9 @@ cirrosCDI = "quay.io/kubevirt/cirros-container-disk-demo" cirrosContainerDiskDownload = "https://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img" alpineContainerDiskDownload = "https://dl-cdn.alpinelinux.org/alpine/v3.20/releases/cloud/nocloud_alpine-3.20.2-x86_64-bios-cloudinit-r0.qcow2" +nodeExporter = "https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz" +nodeExporterVersion = "1.8.2" + dummypwd = "changeme" [params.ui] diff --git a/content/en/docs/superlab/_index.md b/content/en/docs/superlab/_index.md new file mode 100644 index 0000000..425d3d9 --- /dev/null +++ b/content/en/docs/superlab/_index.md @@ -0,0 +1,23 @@ +--- +title: "Super Lab" +weight: 9 +labfoldernumber: "09" +description: > + Deploy a sample application mixing virtual machines and containerized workload. +--- + +In this section we will deploy a Fedora based virtual machine hosting a MariaDB database. We will also deploy a simple +containerized web application which accesses the virtual machine using the default kubernetes pod network. + + +## Lab goals + +* Build your own sample application using concepts like + * VM disk creation using DataVolumes + * Disk preparation using provisioning virtual machines + * Cloud-Init startup scripts + * Instance types and preferences + * Mounting secrets and additional disks + * Exposing ports using services + * Mixing virtual machine workload and virtual machine workload + * Provide metrics for prometheus monitoring diff --git a/content/en/docs/superlab/requirements.md b/content/en/docs/superlab/requirements.md new file mode 100644 index 0000000..d9e3c3c --- /dev/null +++ b/content/en/docs/superlab/requirements.md @@ -0,0 +1,276 @@ +--- +title: "Requirements" +weight: 91 +labfoldernumber: "09" +description: > + Requirements for the demo application. +--- + +For this super lab we do not provide a step-by-step guide for the implementation. The goal is that you implement the required +manifests yourself. However, provide a sample solution in the next chapter. + + +## Basic Information + +The goal of this super lab is to deploy a database and a web application connecting to this database. The database should +be run within a KubeVirt virtual machine. As the web application you will use a provided application. + +The setup should fulfill the following requirements: + +Namespace: + +* Use the same namespace as for your previous labs (``) + +Virtual machine: + +* Operating System: Fedora Cloud 40 + * Recommended image: `{{% param "fedoraCloudCDI" %}}` +* MariaDB database +* Node Exporter + +Web application: + +* Python Example Web Application from acend. + * Image: `{{% param "exampleWebAppImage" %}}` +* The webapp will listen on port `5000` +* The connection to the database can be configured with the environment variable `MYSQL_URI=mysql://user:password@hostname/database-name` + +To reduce the startup time of the database, we recommend to use persistent disk. Pre-provision this generic database vm disk +with the mariadb package and the setup for the node exporter. Use a provisioning virtual machine using cloud-init scripts +to prepare the disk. + +The virtual machine running the mariadb instance should clone the pre-provisioned vm disk. Additionally, this instance +should mount another empty `1Gi` disk for the data folder of the database. Use cloud-init to create and configure the database +users, create the database, start the required services and do the basic virtual machine configuration. For example for the +resource usage you are encouraged to define and use VirtualMachineInstanceType and VirtualMachinePreference. + +You should use a secret to store the database details. All components (database and webapp) should have health-checks. + + +### Required details + +Database users and password + +* database-name: acend_exampledb +* database-user: acend_user +* database-password: mysqlpassword +* database-root-password: mysqlrootpassword + + +## Advanced information + +{{% alert title="Note" color="info" %}} +Here you'll find more useful information and hints for the setup. If you like you can skip this section and start implementing on your own. +{{% /alert %}} + +{{% details title="Show overview graphic" %}} +![Superlab Overview](../superlab-overview.png) +{{% /details %}} + + +### Disk provisioning + +* Use a DataVolume to download the fedora image `{{% param "fedoraCloudCDI" %}}` to a vm disk. + * Use this disk as the disk for the provisioning virtual machine +* Your virtual machine should use the `runStrategy: RerunOnFailure` +* Cloud-Init script should: + * Install `mariadb-server` package + * Create a system user `node_exporter` with a group `node_exporter` and the login shell `/bin/nologin` + * Download node-exporter from `{{% param "nodeExporter" %}}` + * Create a systemd service file to easily start the node exporter. You can find some details [here](https://gist.github.com/jarek-przygodzki/735e15337a3502fea40beba27e193b04). + * Configure the node exporter to run on port `9100`. + * Do some cleanup + * Remove the ssh host files `/etc/ssh/ssh_host_*` + * Remove the `/var/lib/cloud/instances` directory to re-run cloud-init + * Shutdown the virtual machine + +You most likely need a cloud-init script like: +```yaml +#cloud-config-archive +- type: "text/cloud-config" + content: | + packages: + [...] + users: + [...] + write_files: + [...] +- type: "text/x-shellscript" + content: | + #!/bin/sh + # install node_exporter + # [...] + # cleanup + # [...] + shutdown now +``` + +{{% details title="Hint for node exporter" %}} +Installation of node exporter: +```shell +curl -fsSL {{% param "nodeExporter" %}} | \ + sudo tar -zxvf - -C /usr/local/bin --strip-components=1 node_exporter-{{% param "nodeExporterVersion" %}}.linux-amd64/node_exporter && \ + sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter +``` + +Systemd service file `/etc/systemd/system/node_exporter.service`. +```shell +[Unit] +Description=Node Exporter +After=network.target + +[Service] +User=node_exporter +Group=node_exporter +# Fallback when environment file does not exist +Environment=OPTIONS= +EnvironmentFile=-/etc/sysconfig/node_exporter +ExecStart=/usr/local/bin/node_exporter $OPTIONS + +[Install] +WantedBy=multi-user.target +``` +{{% /details %}} + + +### Database virtual machine + +* Use a DataVolume to clone the vm disk and another DataVolume to create an empty disk. + * Use the cloned disk as the root disk for the database virtual machine + * Mount the additional disk on `/var/lib/mysql` +* Your virtual machine should use the `runStrategy: RerunOnFailure` +* Create a secret containing + * The database details + * An init script for your mariadb database +* Cloud-Init script should: + * Set password for fedora user + * Mount secret with mysql details using virtiofs + * Mount additional disk for the database data + * Enable and start the mariadb and node_exporter service + * Load the database init script + * Create a kubernetes Service for the node exporter and mariadb +* The easiest health checks are tcp probes against the mariadb port + +You most likely need a cloud-init script like: +```yaml +#cloud-config +password: +chpasswd: +bootcmd: + [...] +mounts: + [...] +runcmd: + [...] +``` + +Be aware of the runtime order of the cloud-init modules and place the commands accordingly. By default, the mounted disks are accessible by root. You may fix the permissions for the mysql user: + +```shell +sudo chown mysql:mysql /var/lib/mysql +sudo chmod 0751 /var/lib/mysql +``` + +{{% details title="Hint for secret creation and database init script" %}} +Basic `init.sql` script to setup the database: +```sql +ALTER USER 'root'@'localhost' IDENTIFIED BY 'mysqlrootpassword'; +CREATE DATABASE acend_exampledb; +CREATE USER 'acend_user'@'%' identified by 'mysqlpassword'; +GRANT ALL PRIVILEGES ON acend_exampledb.* TO 'acend_user'@'%'; +FLUSH PRIVILEGES; +``` + +Creating a secret containing the values for the database as well as the init script can be done with: +```shell +kubectl create secret generic lab09-mariadb \ + --from-literal=database-name=acend_exampledb \ + --from-literal=database-password=mysqlpassword \ + --from-literal=database-root-password=mysqlrootpassword \ + --from-literal=database-user=acend_user \ + --from-file=init.sql=init.sql +``` +{{% /details %}} + + +### Web application + +* Create a deployment for the web application +* In the deployment you need to set environment variable `MYSQL_URI` + * Use the values (database-user, database-password, database-name) from the secret created above. +* The webapp has a `/health` rest endpoint to be used for health checks +* Create a service targeting port `5000` of the deployed webapp. +* Create an ingress pointing to the service of your webapp + +Your ingress will be similar to: + +```shell +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + [...] +spec: + rules: + - host: webapp-. + http: + paths: + - path: / + pathType: Prefix + backend: + service: + [...] + tls: + - hosts: + - webapp-. +``` + +Make sure you replace the occurrences of + +* `` - your username (eg. `user4`) +* `` - ask the trainer + +with the appropriate values. + + +{{% details title="Configuration Hint" %}} +The configuration of the webapp is done with environment variables. Your config will look similar to this one: +```shell +apiVersion: apps/v1 +kind: Deployment +metadata: + [...] +spec: + [...] + template: + [...] + spec: + containers: + - image: quay.io/acend/example-web-python:latest + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-webapp + [...] + env: + - name: MYSQL_DATABASE_NAME + valueFrom: + secretKeyRef: + key: database-name + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + - name: MYSQL_DATABASE_PASSWORD + valueFrom: + secretKeyRef: + key: database-password + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + - name: MYSQL_DATABASE_ROOT_PASSWORD + valueFrom: + secretKeyRef: + key: database-root-password + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + - name: MYSQL_DATABASE_USER + valueFrom: + secretKeyRef: + key: database-user + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + - name: MYSQL_URI + value: mysql://$(MYSQL_DATABASE_USER):$(MYSQL_DATABASE_PASSWORD)@{{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb/$(MYSQL_DATABASE_NAME) +``` +{{% /details %}} + diff --git a/content/en/docs/superlab/solution.md b/content/en/docs/superlab/solution.md new file mode 100644 index 0000000..57b3b03 --- /dev/null +++ b/content/en/docs/superlab/solution.md @@ -0,0 +1,383 @@ +--- +title: "Sample Solution" +weight: 92 +labfoldernumber: "09" +description: > + Sample solution for the super lab. +--- + +As we did not provide a step-by-step guide for the super lab, you can find a sample solution for the lab as kubernetes resources. This is a sample solution and your outcome may vary. +The following code blocks contain multiple manifests separated with `---`. You can write them to one file (e.g. `multiple-manifests.yaml`) and apply them all together. + +Make sure all occurrences of + +* `` - your username (eg. `user4`) +* `` - ask the trainer + +are replaced accordingly, before creating the manifests with: + +```shell +kubectl create -f multiple-manifests.yaml +``` + +If you want to inspect the used cloud-init scripts you can decode the base64 string from the secrets in the code blocks below. Copy the base64 string and use the following command: +```shell +echo -n "" | base64 -d +``` + + +## Provision the Fedora MariaDB database disk + +To create a template disk for spinning up MariaDB database instances we used the following kubernetes manifests. + +```yaml +apiVersion: cdi.kubevirt.io/v1beta1 +kind: DataVolume +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb-base +spec: + source: + registry: + url: "{{% param "fedoraCloudCDI" %}}" + pvc: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 6Gi +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-cloudinit-mariadb-provisioner +data: + userdata: I2Nsb3VkLWNvbmZpZy1hcmNoaXZlCi0gdHlwZTogInRleHQvY2xvdWQtY29uZmlnIgogIGNvbnRlbnQ6IHwKICAgIHBhY2thZ2VzOgogICAgICAtIG1hcmlhZGItc2VydmVyCiAgICB1c2VyczoKICAgICAgLSBuYW1lOiBub2RlX2V4cG9ydGVyCiAgICAgICAgZ2Vjb3M6IE5vZGUgRXhwb3J0ZXIgVXNlcgogICAgICAgIHByaW1hcnlfZ3JvdXA6IG5vZGVfZXhwb3J0ZXIKICAgICAgICBncm91cHM6IG5vZGVfZXhwb3J0ZXIKICAgICAgICBzaGVsbDogL2Jpbi9ub2xvZ2luCiAgICAgICAgc3lzdGVtOiB0cnVlCiAgICB3cml0ZV9maWxlczoKICAgICAgLSBjb250ZW50OiB8CiAgICAgICAgICBbVW5pdF0KICAgICAgICAgIERlc2NyaXB0aW9uPU5vZGUgRXhwb3J0ZXIKICAgICAgICAgIEFmdGVyPW5ldHdvcmsudGFyZ2V0CiAgICAgICAgICAKICAgICAgICAgIFtTZXJ2aWNlXQogICAgICAgICAgVXNlcj1ub2RlX2V4cG9ydGVyCiAgICAgICAgICBHcm91cD1ub2RlX2V4cG9ydGVyCiAgICAgICAgICAjIEZhbGxiYWNrIHdoZW4gZW52aXJvbm1lbnQgZmlsZSBkb2VzIG5vdCBleGlzdAogICAgICAgICAgRW52aXJvbm1lbnQ9T1BUSU9OUz0KICAgICAgICAgIEVudmlyb25tZW50RmlsZT0tL2V0Yy9zeXNjb25maWcvbm9kZV9leHBvcnRlcgogICAgICAgICAgRXhlY1N0YXJ0PS91c3IvbG9jYWwvYmluL25vZGVfZXhwb3J0ZXIgJE9QVElPTlMKICAgICAgICAgICAgICAgIAogICAgICAgICAgW0luc3RhbGxdCiAgICAgICAgICBXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldAogICAgICAgIHBhdGg6IC9ldGMvc3lzdGVtZC9zeXN0ZW0vbm9kZV9leHBvcnRlci5zZXJ2aWNlCiAgICAgIC0gY29udGVudDogfAogICAgICAgICAgT1BUSU9OUz0iLS13ZWIubGlzdGVuLWFkZHJlc3M9MC4wLjAuMDo5MTAwIgogICAgICAgIHBhdGg6IC9ldGMvc3lzY29uZmlnL25vZGVfZXhwb3J0ZXIKLSB0eXBlOiAidGV4dC94LXNoZWxsc2NyaXB0IiAgICAKICBjb250ZW50OiB8ICAgIAogICAgIyEvYmluL3NoICAgIAogICAgIyBpbnN0YWxsIG5vZGVfZXhwb3J0ZXIKICAgIGN1cmwgLWZzU0wgaHR0cHM6Ly9naXRodWIuY29tL3Byb21ldGhldXMvbm9kZV9leHBvcnRlci9yZWxlYXNlcy9kb3dubG9hZC92MS44LjIvbm9kZV9leHBvcnRlci0xLjguMi5saW51eC1hbWQ2NC50YXIuZ3ogfCBzdWRvIHRhciAtenh2ZiAtIC1DIC91c3IvbG9jYWwvYmluIC0tc3RyaXAtY29tcG9uZW50cz0xIG5vZGVfZXhwb3J0ZXItMS44LjIubGludXgtYW1kNjQvbm9kZV9leHBvcnRlciAmJiBzdWRvIGNob3duIG5vZGVfZXhwb3J0ZXI6bm9kZV9leHBvcnRlciAvdXNyL2xvY2FsL2Jpbi9ub2RlX2V4cG9ydGVyCiAgICAjIGNsZWFudXAKICAgIHJtIC1yZiAvZXRjL3NzaC9zc2hfaG9zdF8qCiAgICAjIHJlbW92aW5nIGluc3RhbmNlcyBlbnN1cmVzIGNsb3VkIGluaXQgd2lsbCBleGVjdXRlIGFnYWluIGFmdGVyIHJlYm9vdCAgICAKICAgIHJtIC1yZiAvdmFyL2xpYi9jbG91ZC9pbnN0YW5jZXMgICAgCiAgICBzaHV0ZG93biBub3cgCg== +type: Opaque +--- +apiVersion: kubevirt.io/v1 +kind: VirtualMachine +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb-provisioner +spec: + runStrategy: "RerunOnFailure" + template: + metadata: + labels: + kubevirt.io/domain: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb-provisioner + spec: + domain: + devices: + disks: + - name: fedora-mariadb + disk: + bus: virtio + - name: cloudinitdisk + disk: + bus: virtio + interfaces: + - name: default + masquerade: {} + resources: + requests: + memory: 2Gi + {{< onlyWhen tolerations >}}tolerations: + - effect: NoSchedule + key: baremetal + operator: Equal + value: "true" + {{< /onlyWhen >}}networks: + - name: default + pod: {} + volumes: + - name: fedora-mariadb + persistentVolumeClaim: + claimName: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb-base + - name: cloudinitdisk + cloudInitNoCloud: + secretRef: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-cloudinit-mariadb-provisioner +``` + + +## Creating the Fedora MariaDB virtual machine + +To create a MariaDB database form the provisioned template disk we used the following kubernetes manifests. + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb +spec: + ports: + - port: 3306 + selector: + kubevirt.io/domain: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + clusterIP: None +--- +apiVersion: v1 +kind: Service +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-node-exporter +spec: + ports: + - port: 9100 + protocol: TCP + targetPort: 9100 + selector: + kubevirt.io/domain: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + type: ClusterIP +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-cloudinit-mariadb +data: + userdata: I2Nsb3VkLWNvbmZpZwpwYXNzd29yZDoga3ViZXZpcnQKY2hwYXNzd2Q6IHsgZXhwaXJlOiBGYWxzZSB9CnRpbWV6b25lOiBFdXJvcGUvWnVyaWNoCmJvb3RjbWQ6CiAgLSBzdWRvIHRlc3QgLXogIiQoc3VkbyBibGtpZCAvZGV2L3ZkYykiICYmIHN1ZG8gbWtmcyAtdCBleHQ0IC1MIGJsb2NrZGlzayAvZGV2L3ZkYyAKICAtIHN1ZG8gbWtkaXIgLXAgL3NlY3JldHMvbWFyaWFkYgogIC0gc3VkbyBtb3VudCAtdCB2aXJ0aW9mcyBtYXJpYWRiIC9zZWNyZXRzL21hcmlhZGIKbW91bnRzOgogIC0gWyIvZGV2L3ZkYyIsICIvdmFyL2xpYi9teXNxbCIsICJleHQ0IiwgImRlZmF1bHRzLG5vZmFpbCIsICIwIiwgIjIiIF0KcnVuY21kOgogICAtIHN1ZG8gY2hvd24gbXlzcWw6bXlzcWwgL3Zhci9saWIvbXlzcWwKICAgLSBzdWRvIGNobW9kIDA3NTEgL3Zhci9saWIvbXlzcWwKICAgLSBzdWRvIHN5c3RlbWN0bCBlbmFibGUgLS1ub3cgbWFyaWFkYgogICAtIHN1ZG8gc3lzdGVtY3RsIGVuYWJsZSAtLW5vdyBub2RlX2V4cG9ydGVyCiAgIC0gc3VkbyBteXNxbCAtdXJvb3QgPCAvc2VjcmV0cy9tYXJpYWRiL2luaXQuc3FsCgo= +type: Opaque +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb +data: + database-name: YWNlbmRfZXhhbXBsZWRi + database-password: bXlzcWxwYXNzd29yZA== + database-root-password: bXlzcWxyb290cGFzc3dvcmQ= + database-user: YWNlbmRfdXNlcg== + init.sql: QUxURVIgVVNFUiAncm9vdCdAJ2xvY2FsaG9zdCcgSURFTlRJRklFRCBCWSAnbXlzcWxyb290cGFzc3dvcmQnOwpDUkVBVEUgREFUQUJBU0UgYWNlbmRfZXhhbXBsZWRiOwpDUkVBVEUgVVNFUiAnYWNlbmRfdXNlcidAJyUnIGlkZW50aWZpZWQgYnkgJ215c3FscGFzc3dvcmQnOwpHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBhY2VuZF9leGFtcGxlZGIuKiBUTyAnYWNlbmRfdXNlcidAJyUnOwpGTFVTSCBQUklWSUxFR0VTOwo= +type: Opaque +--- +apiVersion: cdi.kubevirt.io/v1beta1 +kind: DataVolume +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb +spec: + storage: + accessModes: + - ReadWriteOnce + source: + pvc: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb-base + namespace: +--- +apiVersion: cdi.kubevirt.io/v1beta1 +kind: DataVolume +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb-data +spec: + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + volumeMode: Filesystem + source: + blank: {} +--- +apiVersion: instancetype.kubevirt.io/v1beta1 +kind: VirtualMachineInstancetype +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-fedora-mariadb + labels: + instancetype.kubevirt.io/class: general.purpose + instancetype.kubevirt.io/cpu: "1" + instancetype.kubevirt.io/icon-pf: pficon-server-group + instancetype.kubevirt.io/memory: 2Gi + instancetype.kubevirt.io/vendor: kubevirt-basics-training + instancetype.kubevirt.io/version: "1" +spec: + cpu: + guest: 1 + memory: + guest: 2Gi +--- +apiVersion: instancetype.kubevirt.io/v1beta1 +kind: VirtualMachinePreference +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-fedora-mariadb + annotations: + iconClass: icon-fedora + openshift.io/display-name: Fedora MariaDB + tags: hidden,kubevirt,fedora,mariadb + labels: + app.kubernetes.io/component: kubevirt + instancetype.kubevirt.io/os-type: linux +spec: + devices: + preferredDiskBus: virtio + preferredInterfaceModel: virtio + requirements: + cpu: + guest: 1 + memory: + guest: 2Gi +--- +apiVersion: kubevirt.io/v1 +kind: VirtualMachine +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb +spec: + runStrategy: RerunOnFailure + instancetype: + kind: VirtualMachineInstancetype + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-fedora-mariadb + preference: + kind: VirtualMachinePreference + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-fedora-mariadb + template: + metadata: + labels: + kubevirt.io/domain: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + spec: + domain: + devices: + filesystems: + - name: mariadb + virtiofs: {} + disks: + - name: fedora-disk + disk: {} + - name: cloudinitdisk + disk: {} + - name: mariadb-data + disk: {} + interfaces: + - name: default + masquerade: {} + readinessProbe: + initialDelaySeconds: 90 + tcpSocket: + port: 3306 + livenessProbe: + initialDelaySeconds: 90 + tcpSocket: + port: 3306 + networks: + - name: default + pod: {} + {{< onlyWhen tolerations >}}tolerations: + - effect: NoSchedule + key: baremetal + operator: Equal + value: "true" + {{< /onlyWhen >}}volumes: + - name: fedora-disk + persistentVolumeClaim: + claimName: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + - name: cloudinitdisk + cloudInitNoCloud: + secretRef: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-cloudinit-mariadb + - name: mariadb-data + persistentVolumeClaim: + claimName: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb-data + - name: mariadb + secret: + secretName: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb +``` + + +## Creating the web application container + +With the following kubernetes manifests we start a web application pod connecting to our MariaDB database. + +```yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-webapp + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-webapp +spec: + ports: + - port: 5000 + protocol: TCP + targetPort: 5000 + selector: + app: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-webapp + type: ClusterIP +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-webapp +spec: + rules: + - host: webapp-. + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-webapp + port: + number: 5000 + tls: + - hosts: + - webapp-. +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-webapp + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-webapp +spec: + replicas: 1 + selector: + matchLabels: + app: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-webapp + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + labels: + app: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-webapp + spec: + containers: + - image: {{% param "exampleWebAppImage" %}} + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-webapp + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 50m + memory: 128Mi + readinessProbe: + httpGet: + path: /health + port: 5000 + scheme: HTTP + initialDelaySeconds: 10 + timeoutSeconds: 3 + env: + - name: MYSQL_DATABASE_NAME + valueFrom: + secretKeyRef: + key: database-name + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + - name: MYSQL_DATABASE_PASSWORD + valueFrom: + secretKeyRef: + key: database-password + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + - name: MYSQL_DATABASE_ROOT_PASSWORD + valueFrom: + secretKeyRef: + key: database-root-password + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + - name: MYSQL_DATABASE_USER + valueFrom: + secretKeyRef: + key: database-user + name: {{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb + - name: MYSQL_URI + value: mysql://$(MYSQL_DATABASE_USER):$(MYSQL_DATABASE_PASSWORD)@{{% param "labsubfolderprefix" %}}{{% param "labfoldernumber" %}}-mariadb/$(MYSQL_DATABASE_NAME) +``` diff --git a/content/en/docs/superlab/superlab-overview.drawio b/content/en/docs/superlab/superlab-overview.drawio new file mode 100644 index 0000000..e531236 --- /dev/null +++ b/content/en/docs/superlab/superlab-overview.drawio @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/en/docs/superlab/superlab-overview.png b/content/en/docs/superlab/superlab-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..76055152b61a772ebcad9856095c53400af82cc7 GIT binary patch literal 90563 zcmeFZ2|ShC{y)AELNa6y$vn?vhA3m^Y1`&`9y8ArN~WSv5*0G+EmNt;90^fsi)1Jy zLuAgB-+Ia}r_QH&pYJ_CgAUEAMpM2Fi&+4RPnazl7u*zJ+uJ3pf6XXB*CUY7aYAY@86y`bV1)a7_*qqQwPKRobBv=wx9OpPG3(? zH(zJ3-(Ix!^zg8^-4@&S6Ro|yJp+C_%)!%bd)3=xynwWS^K|Hf{tuf9T{UvH^L5%D zDfk*A#pv}hYZAd7Rkx^Zc#d{I<6jSOze+FMH$T8-!6> zZ%;oDJ9|hbKsk>DI63>;>w8(-LN^5fjRM!4eBIr^Uy$7aQ+7M*>E`)GyG87U?8NLP zz;z#AZ%i+p3**Xq2efwh38p ztFq(QM?-e>SHum*Y-`KEo<8Ixzf&q<%tm~Zq@uO2wT-n8@LSOP|0Y@5S=&oG*#4d@ z#cd_+Z5)0sSqei-hgSc`vJ?~97WYpi%Wae1VU>!`KCWOHI^LfC&QO4H_Hg`L#i}R; z{R@QW;OXJJ!$3to|MR=z7Ki@%xx_8>=awtEy|+J)v_*cjTrZ56fynJXOa40xwzmVp zZ`(P0diy$gI(m9oyD5FUdgQnM`r8-{Psove_R=o)zP>@*k=)wP*AvKchY$avUS8He zxLO}iKkv_eAB@3*~|0KcuC>O|D_`aIYXD=!41~l`CjW?UHxFhrl?(FUB zXYHnGZR_Oh@oxslKQt03efgX65z*f|HDS^1jCN-}0vQn448fgVO>Fzx|HNcOe-zD^ z8SY3!{tLzevPthC1n@(G{9-`#pZ_$5{>1#D2qk^r{({nk&wm9v`+m7i`15_>Pv|x% zx3veKzug7>fw}1qm0_pH6!|i0r^giC4gmio%M{&S=MI^5R{=t@K%lU7v-a_E{!%7`%gO)`!GsSFJIo*tPmq2WT=GJyLd|#lc@8zfi2LL?e4|gPrzpZ8e1bh5L1Ns|9@m)$T zB)aXxe`-l=YtIg!ye$b(7=2eF{SrbDmfWr}w(a59kivHHwnGZGZcrTfUgtqn_%2S^ zS^GGB2H>Gwb_Y-cUDvVp1+X~;po3aM5E}3WYB$=(tN|YW9U_Fua4{v#j>PB>3!HD& z6nNaXTIySH{ex`!2iRXi68aZBHc`S)t*zl=rw6`boE z+NI;^3_6%!I}f7YcOE3SJv^p_|FSFFcR^0_&zlNgUiOEt{EB{Kj0h7{Ft7Zw>;E5K zDFXaB=w^KFul(zs*&hA5sqtqcf9QQ+Iy5_s3KL|Ygy9$UZ=zz`(#MGAmxwY#+o5oW zEdG^m`<5v0@Myn{_ustEH%9|`tFI;fA9x*%hZE%g4Tgh(cfQ^AcVIaGOot>c_*)ee z5&w@nB=PUGUPS1-SN;+X>Bn5_e{KZ7DP{jNMu73d|9%bnQ-x)5j0$c$VqwhRm>BsV z2+J5l!}xyTU(pJF%ys`=E5N|AQ2x0M$_ny-)$HGQ>0jf=*MI>w#`5cv)!0i{tCfB>_-UXM>F`=xmWzw zt5^DV^}Fir+nB$(pT8~Qo$4&MjphIQ>in0hsJ~L!{96?R#+~lSQVo3o@9g_39B=`> zAOeD)yPJZoFT`j2N=(zRwy}59@$_-_{lfRO@$~iebl)-Hx6HL2>8+=quN&w*AN|UN z{BI$Mk{DIoHYZWZZBMl$+=~28Ct3V|*+~}vkskAdm>|{s57S}(`%&a?D=B^+v%|RW z9cCA>O*j1kg7mceLCn9c3;zTM{y9N>Nuh09!X$Q5zXF>B!yVcoH-K9D+3`7hIQ#Np zxKQ7VP~YCx8^hKAh0uHvOhZ9nR{Xltp7skZx;*h}5>0{M=c=kDVG1a5k3DKF|wb zY!D*!V^sqV*#1t+@P8^!|Ik(Zog}62dI;bo*O%A++yePAZ~mVLkw28yPL_(uHkP(C z<-$0|e^kn~z0Mt83{%+rKH1_|%DcYjT>KJwm*_S&u|p!x9)OPgxv&xR4FU-E4_@rI zhoIE9hZ}qz3x)Qdx%w3Tj(+*Okw)TY18gv-e0E65Yexb4eVF;JfOK|@{N=>+dvWLI z6VH!{z#mqU`p|D|{0b?6xX|{hFq!%JX^_Q}VAB*?@MV$CcYKq|*@6=NaKjFWqrx4cq=f4B?Z~QP6W}Q3y z)E{v!ewn=XdlrQ-=Ev%O>MROFquL>fpVvCJz0XeTz-ZDx$~u1RS^bf9sChVg+xz(Z zAhMqh`2F5GM8vnF+0ShqKT6_2wwT^DgEphFPdb{;1x^&`jjf5s;J%$fd!A1%e4 z*ZlVLusc)e&);HxlJ?6N+cyB7C16NHzk&L8BbyioV}hwEDi{P>OkcsxyntS5At5I} z$yC5u5WSldkNH}xD08CfiXOQ-AK$+tCz6plwn zXXpKe+JLO7(_K~4D>ZYOA`6`>vMX8pOOB7U1jNJ;(&X0Xs-5S(r1>t^FKw|&s{lrM z726<^Q0K(3u9e2+BWarcN2<^AO~o_lVtG=;;v4{(8r>NWcq%IVq61F<{J9K_4&8lu|mg z<+pBy+l#)K3+`cc_2xfr7+FeZgd0@z9=z{mCo4Va_O4)Y4`0KMHYAC$xqVd!jG=JY zdsB@Z9@RdW$%h$o9^8{*r`gGNlTeZzKKtq(%WW5QN;JW~$&Gz%$5;jKe>i!6>(hFQ zl#jz^f4P18=*mz;dQ0Mdl|tR7Q^fWkh8yO4ZO zo#^+>4M(S>2wF2Ugta}?Q*U5q%kz6^G5_(rcC#dlSvHqCTy5Q8&1vdw@WI=>mUSF0 z!9xD6gkalgiot$ty{!qHxPIS)>9m`9g?d)thT40tsU$wVJP)P5vhcGqS#Jq8``@|` zsUeg2?D}60=3|X#&ATZ88ICN{l~!)p;tR`&)JpgMLHtCgE(Z8h>iRO>9Obo@+paI# zJnJ^u4{vQ$jCNeom-{%3V|>@^np7~NELawO-0psw}%9{@6Fd1ll7=mcd4&aEscJB z8X|96r^ZwGOwfS+ECX*2{z?i*_Aw5IYLXNg&zgPCvbW+}T`GFaN6$;?k4>U^x=Wo+ z3%9KI-wRo}x#!(eEqKX>+05WQmY_jy&dt->X&(v5TU-1r+v~I5FJkdB*D-|bNja%B zbRKEMuU^u5ZGN+}IE6{!Na4WMdj=)_tO(84AbqSHV16dHoeC^#?e`YIZ&eS4@KBQ( zK3+2MxEDBaa?iAw!4|v_E>&n=oQ3`VqFRpK95oSZ)`RmKtAwg6Nj1Ky9L&f|B60## zb*4OyT~|^A=BY0z)SQ}d4Oxy5IIuLsxm!ba<3m$-zH3B~h<12ifK|z@33_f^Fz1k! z2!ROmPwJNK>Faz1&Ty4-nXQvO4IeGS=O}5PhZKbO;M)oj!nLzxxEQ4U4TiBVSkrnf zO`<8~%M!$ozj;s|z8QS)_{b>=0Sg&yI2jx6MZeiW^QpV(tyYv*`*PLx5s;9i`%U$5 z#R6fOVg&*vdr1{Z+kXDx*#iQFdU+`_LG!Kep5`naAiUXs&nG`RCPs-DM=p4=0A*2Q zawuR1WoaSz>7(tVE7EuPW&QbZl8QFz#9ZE`jN3HFsikrojyA>+byxYhUJ|yClc#>M zgoGFC^)d+C#h#Ro+)rjI@86!rcRSI@B1j4L=^}N@{sCcU>00OANdH@e4;68zk@5zm zhdf&pjVtYHJ4~yz@D|+!(zoujZmMV`pRe2GWgF@|IOHbFtDPHWa*R4uX^lAhdNTUm zBoo!b$WzFuXWUcL%lhJ`<$0sQ4tCSp zKCbHJ=?e|OjilVORPD}vlMCv zRg0DN3PbIU*T%>b2XC5J>V``O${!2UF>}!VggD`c&PeT!a5`YTG8XW1FgwCLW%U{L zqbt<`xi(9}-B-0nVt0FGa?F(CC7eXNzPQO1iT#9hZWqeNlZ!ds5D8BWU7df#a#n`i zn)$hV59(6KB@vY>|MzrU7i4!Mz20iett#de-o^WH$Mprjd3XZ0WY}__W1hw(;Wg>& zsgYXKA-H?6wX#EIq!M%AKE7-;7{2~~H$paK8Fj=y3XhmoC5fIa#Cw1x=jm;dC)3?| z@pi4}6xNk@?M=ETeqULb$M~~N)Oiat;J{BbSH38N2Mubuv}i=D!iL!BK@d@ z0I5|@_3#)jb_vjhIMwlj2HDYgvFfqqVpH#h9!<5(kApoa$djjKl6Mu6u93G*ru&9^5Q6UB8jSzgaPFjqKDbX{$~VdPbzT z)zmZZb}B@QRwr)s5i<*WXQGp<&TP^eF83|-m3pE!G94^#QVx(598c*Qi7$IIHx_C< zhV1HT_2dXob*{*7U7V}P8xHY&v_Ts`+FI7s9ii%Jd~bBW^U&=?yS9tQ8RAaY-j^8H znXqeSGi7%ma=lj9T<T4?G@PsvSO>vp z*<+xVt*dSgHT|;G@{m8t`TO^VE}Zh485^KIUC3eoZ^Ak)}g z>WJ$gJnES1Z9jyTz5-=3z4CE_>voDc~lrOTwO zARYPUNDSe`EbQ^?rqeu&kF#V=t?wBW>UCdNijQ?F2|3Be`+9Q{S>jvB|FY1$dO0ll z>ARQsDCWkgV;iGu45YJ+#(oD%TsPQ`UC?>rul>d#UyFfO%A1u1`7~5GItjtS=Ss1= zrE72JB|@4U$hresb{W^$6l!eQ(@8~fq z0X~k1EloYv2m`top4<#or`2jD1`QC+N84_`4^iE8xNX0(rD8OvLps*^zCVTi@d(`+ zTojeS{7r*Ggr?&L{gj!4xJ^~>=V3|rR-Q4$OJ@ysR)K}aMS zzXyKcRmG&mxB?cS7o%qD^AgL$1M!Dkdw98wZf3f@x~rSck)sIRZ-aFakwPTt z-{9c;{vj^BJzYQ`Y;7@F?L7O$MH=I!Y0YDZB@K?A>)8HqCT>JAe1?H*&H|Uf`6ZmC zFfrrK`8Kg5zTD08_NfXvjaxX#r)V5hr^zi7i(skzO5I{NEP~b2VmHK{V;&m|XZeL% zo~@jHDW2xrC6iw|X;Eulq1TwvlU95SF>1qq-e}_Gwfy_@-N^FMc%^dpaVn|6(W|#SsMv8AsP!TruZ4;`>*PO; z2*yUe4Pwa_U9%jFJeY&mmWnhI?Oy8)SsiVUv20(sRNi_Zf9u>vvyV#sB)%Va>xtsi zO9$C1IUOFYW={7l<|rRu7;WQ8oD3@nJE#}3^wMwwJ@)CrO$)8Q)IN7u;!!K~PR$EK7!~RlUQD>OT*w#@<=RFaaxUV#LrcvtBfm$7Wi%J)@ z7&BJ$B6wX2C_P8jjs?#_IM`mkdA%j3d|AvN(3N?y37$hfVeYIiLbTamB7pnG10@Yu! z$7!j3c1gss?W#i5jCwhRDKH~bf$P^>VS9k^O%3Viv68!bWg2*sRufvX%B$Nl#vW^f^ zg=io0-OuU#Dc}=h+AeK6G1ZiO)q@9~?@m^y7HEB=?a;>2F5dcPRfH|{&2Hysg?D5q z4u@Y@I##m~*JCUwV8*|-nlI|nr{L1#%3WRQnYQ=Zl4$=dkCe|;_pny+ey4d>yMtMh zE?4;v9_?A_VF*#5)1#cR$C>HY^LOvhEj1|!bY3l35mft7xA5>iQXI-yTMs>gs*vVHLTdqIvurj6xm-uWG|o*8KM~JqE78 zCMK?3Vycen47K*DMcRX&qaDSiahqkPmF{cWA+=ZTiJ17Xq7EH38BZj)?AC#`McVMj zw~#wgJ4xFsM;qoN;zn{m0|!{ZK{Faemb%nxTXnfS6HgSK`VfU%YO*#^u5fvCMFAu# zZ|e@oWF1V=r{vO8>_TiV_j`_kqU3qBt`@)u@{JQl^1eRF3~a&U72NvC)5ZJS?(j&c z5F!!tre$ty3o#$8PJv2XkuZ(Bm0ZSe(%@eBW>v0g@{x44>ZFF_DR|L_9LDjs-yZb} zl>ZsCB+-Ul?iz?CGoBvbSWwEJrip9%Ht|n6FzZw;1>8>n0669;sD;&7bew%G8Ut z`5oJmO5a-1P&e#Ku3D-X3}BMg(k2H zIu9!?0XU&xIUUbEL>~dzqAONxNy&sD=lT2yE4x%VdEDzpU=1Wfzq5t}6kcMXlr9OV zl!BSak&^0Q3Ki4MPrprJiyKTqLgz#Tcw6`W1braROf{*4m>DX7Z4z_Rczh=KDu~25 z$%tlSXcG1UNon6rf*IU;tnT+V^3Nxcfa=CCfUzJKPi$i?Z&@)&4NW1quAGs2eqIl3 zQw>E@dY=(kM3{S1vhLS?dzf@+%+e_Rv$YchyZVBXc>Es(FU5EVDVl! zKEY*rk;!Ppqvkd(fC)|R;yIoGz>_b+khcRHGeK=o&z_7%8CP^uo#OEV;6}TnDq<;n zR3KM#xUQwIoR2~>bTW;vh3tjG6Qhx$tD7Yf%|`D_L{*$_1AReKI!1t?e>K^#esZ8X z;5~}uAr(IEo91|qXtd;RrzUkQSZLSFCxUWxik9^=2aS2d%f~vbadog7 zU0}_QFDfA^N}sk3GmqP^Ws*-``|e2HEax*cfl47 z)y>$gu3Q{NV(m+2=!b*7cGqk=0bT`WuSk-{Pk?-DoB>Ul)>y3n#*NOTQkNooDFMhx z42HuYo7-In3}@-`EiBiIrF4Q5d=tH_u&X5|Z-lX?9WxJ~Y3#6zj{3^*$CZVJ6)dO>7vs+OWWzNWC1gle$v_10(Uqn98;fFW@UQZm zheg)X!SKsV)z62bkM#AX9;L9dLmxc#MvzZ8GTBhwZf~a+@Ns=t{$R3T%vz)pPzyft zmyI5~kyLREkvBE4VQVfh`qoB%&3Qv2dt0Nu(6b=tbW0IvIA5}qr1U{lhGPJBWRSSM z9op@3#v$p(qQbPX`!vRRB#^VHSv~AU< zy+>7R944O^mQA*6r4k_h%TIZ>kZY8>jI9qy^qdLdVaJNp4_iuBVN8y~CposZI3X)u zu)f*oS9j*|(z|!-vvn))KHUmla(R@-XNqbWpHsBaeadQ?*nG=aOciW`nChO#&cV6B zG#MYULf8@n?3h*gs&(h8jl4EoDIx z_|3ULrsx*v985gPu6jvP-lpa_D9g_eWHa^|zCx{1^z*ddGW4o-CEJzKYK zj-$-UOs@-j2}E@V?lu$z#S2G~q}~WfRDp*Et{uhSJiR{vAWjr?*%6FqE0~Z!39n4WTRCA@Gq(p=OhWcPA(>py>R|j+eV4y+XkIo&8 z3ZKEDtJ_>Qt$8?XL5|+UUdeu5sLvCK4Zl|BO6vtog_4kjUh*ml4ai%smuP27>dx{2 zr0+Zg7o(9zOL9v+rk+am+%re-cEMyUgT^Q~>081c)ogqmIU7tIj(rXb9Vj2?dVRmZ z%)yHXm_a4DaNAR^H%qN{(zCd?b^%2FLtPH^Wm^=2jPMsFmI4Abiz%UCL&@priY&Qx z03ygLQ2X&Zz~hx~TGsKOA!qAWeRm*Y<6xKUN~SW?TrNFnT>dje%Gh3Hq(Z1#Jv9+U zXmY*ZY~5Dv;Da(V8eHvqvc8S?cZMk7L*eW0iD}mbWD*~`-n6%zaZt9SBr{Qr(1l$M zJd`A)BsK^XpF0!>5l_Weq-#SVa|J)T`ekD%X-s3U;NA$z#-h3l#AelSSmd1w9Mqwu z&6)R^VPRL)U{*0D*zngr2(Bo-tMXViT>$e?G8!3XjOto1n4vbW@_ouyhnO2Nflt*s zE&)G5*ueR5kILx273|Q?ae#cyT5<;J1Ot)pMl{#pl;prvkI%~2?pncq*DQ;LjMDMa z1Y6F+j7%OF60`_FBzjoXE+^zZb=Akp?H(;Y61SpU4#?xTu)xs->c`vio2*F{QP^#~q=f~&S? zT<#Z~e#iaxr0ZM^!4v85jX?9Hx3w>*EUyYK1F5Y&uHFu>rdY5+t-YV#UswqNJ(v4e zZdh(>Wj%MOM@s^&3$+`5gDiv(dQU#*0t)%s%3y^kbf(Eu!gG+9KijKe@|pJG;_UuN zRSGwK1z!q+q+=I2udQ4PUYeY6MWn=sB)HNF%58zZK|x6>zq!dQLttxPb%5ul>B`K2 zpBVx@LMJ^V1hm!&Y~lTxQh*KB9h%&N&(O>HwGR!HhH;aUg3yhXeC5hZgA-Rz8@|e% zi@{#kFEgMDIR(4JkKi*d&;3N)%m61-Q?jE_k0!eU8c5eHj0*MG%u~kVP;ZE^vJ$G9 zk)X%%{Kbbn(x;}1hq1~&GQ7WLWlR(413Dw~tK->IL$#mQTnUJXo^ia^O?)x%@Ckkz zKTc(K;2VON-Y&WI4n2uIc!=9ap0MP5nm$cb2}5AP7>QX^j%C#snGeqPvN%0Ff=Ik# zC=-JQ+QpA(o;MA>nRC~Ql7zSH0nOnu5b?JiX@QgywY zq>H75G)gB~U|h@5Hd5#(*N*y~nJu$@$jXgqPT>wUu1|-t$~O+`C z$zCsyC67~IMm;f>ZrKx76c~J#z9+MCxLlW#snX5t_cqYQ=bQomLx zAc7~4SUrd(n+IAoQEm=<7e%n-HPl$ME5v3_ejhAhop@4NVlY$6XEKavHt*f!YQHH+ zhay~?m#;wW+#vCh*v)+TCr#X0s=(fiRu~Sx#Jc;So5${1^I%tj6(wyz@;QPK^Rg1k zcGL%4taEYG^?^qcH)UYTtW7Y^tiur&>y7(7WSUzZQzaYAtcI5|sgc%74yzN^YQPX> z8`SOoIdlTcjMjTXR%Xz$m8x%}6}1EPX4~)*5|RUpGs z2~#pIV`S|5o)jVLSW_EGcj@(E#Lpzd#zzhzM2K@M~9t6@`R>>}C*N^R?XiFG1neSt9A>VJN(Q zN=_&aE|Rw^B~)!rXHkT~p2J)%(=S?~{j#j>Hf@H48BOk{wKt1azIz!rVWMrxfeJ37 zm})k}0+T01Bq9gz4~F1^a$?qSIQ0go48_ppnduVX6*a(^0&^p!QB_Qo$rc+7TclzB zY`fy=qmk`qt+OcATocM-WR-KA@-^ zaY4e|=#n|m&_fJLhDxf8C?ZhJqa#~8wcLw8X>^2TkvI zEVYZ~#G!1A8LY^d;%viV$eUxmnwQ1VZ0;a!?#}B$$Wa?I@V;NpEe1_kE_z#I1{h^X zW9dVp^(L=V{K5t}Z*=j`+-ghZ$+vAR_qGdb5q6)JVnMAnYxX*^5?D^cy< zFaCJ1d;ZC?@{5I$YA_(6XDa3u!jFs|S5i2R1I)tE(_lnwTXNzT(+8N5lI*RNeGH;b z=d##hqfKUTORBBJiVhXbs+q=iFdI`RWq37kUoVbC*L_-3&ncK;bMDUde%nEt*jPoa z40j*yP!Qe)>Y!4W%4Zp)NC(rniUnm*u}Kuo(dk1li;MC84xTDmB#p&oad+PSiZv!H zW@(?1mPGsU&MSmjk#M``p`LR_xvVe07aL*kT;PMFE;4GL z$T{oPL0azm#>~RbjZr30FdeJEK0V5QH#-*CRJRhb9~Map`cATu2>2QM0zi#;u`q6O z+l5Wc<$3JW+Q>MlK?X8)T6=TFcG6TF7?$cQbS?L}%QPj3wzwY3!}Z<=>7s zz4zi1n)c9iUgPWQ+Q&C=mV0bEZngrUfW+MU07}`AB%G8M#e9jJoVVEQo}M-3lj&on z(b))Q;wQ~P_hxHWEOeT3~|mo4CVLYh8-5rytvac*kye=#A1Eg zpfD+^BP%LuutLtF=h|(n~pBu^=5^lXrL{z-zKt}Go4nxpiI~kTRlWeF6OIDyN z$+;W;@F@pqRimBy?+k?_M?l?mGJ!_uND{r&^@o|m1(X-Y+S7T=hVC9eDs11Di~nHc zE+vn;U9ut18V71kdrV#tX;#{{g4&v%bm@c2_>71MDS(k|4N**=Al&r@6>v%n|A=D@Di2;*glKl>sdM1(rPrxSAg{6Y0R6ZvoK-MN-PDY0y556KAs;HeS#y35P z3NAs0*rft#BxPAZ(m3SUL&OMFpuyI)Q`7-`U``Qn)EYR7D6>(L)ng5sA1$JX`Ge9s zcri{I_2zcL7o5C)u`IAcK#F=oj5IAsb z*l@5$l(Czx7kqqmVcdS>8+3_KuSUvxZi8nvTkJQT3stQldxrN zXa?yxvZPjz$odjr8n$g;i8O%m=?rDfPP5&U6j%T?O~zBdt}NNAOd6F`dYM3-blhsf z&YlNTFod=hrFvSKA`PxBEVe4i5{rW6dVJpFKt9b3QL;^|vomK8f1)Y7)k{dtiZZ!Y zemkre7e;D47Sgj)2_jR8vo8QpidL$W{qjIb6XMr<{TXmMhXzj4*9lPW4n{OHJ}WXr z5-vw!t0vPBv^$n*Qw~emwj^xTb6-!>Mf=clM10!FxK-#mRC{va5L9@mhg0*Ju!0IP z4}P@8sGhrg_lOwC-8@y!GNNT~^!mi9@-W|uMFnFcVKyCO6@9e)K)O;(FYT|9bl~vKhhv$N$B(R>o9Qh(x`F~p zT(o*`)FdcvVyG>ibGcyh;CVs9>v^#W04rIp ztuQ2;+eOb}6UWw~S{`ku1-fcs`A}i@LOqq64L~JE!@J}|$c@8B5+#_+u~>rRW$(gl zLobz=lfsJ)`ZH>=v5=u%Cbp)FHV{JjxULRBcLR<%A>|M@cssa4B7_I{dKXXqixP(b zh$nuV4%VUnWKe_|^|D`%exQyJBnG#5C<6ih$sKm`Z-E~Ff3)-;f|g!Zf;*E|P)ho~ zJ2$qEUfk`XMuzC4l<=b}sPk!Jgoy5RhC^7W@{7gwul4UFTx1GE?-o&(CeRN>hpHbx z1<>(ibT4+scHJYxB0NL}7eoqZ4>|{fmLq~G0%P9saBB)D4qH|&$0^i?}MH{+4U`Ltc_y{f@ zf$hfQxh$lzRz&MR$_v=DP(ujR*$cpQ#JYd~rJzxB;3||uuY$~qZsK3O5J2+vp&|H#mf1AjNNM^ziVa@^`&42*OST--Kk(NJW%)%ddy zhy?G%d5Z()oXhd6ZPVI;1A(t&s1p|Af#=*W!J*Beh*&b<8t-YJw+kKLD;Jl1Kq{>N zuGH}(%!`J>SfE>2W@xo|pIG>Y=Cxjnw|<)h@8#0E560BgW>M>5MR1qOgcd(=eRX$k zptMvlV%c`8k^osLu8qQ1K_uR`ORA294NIQKeIGf2RB#Q}$|MYgC^xPXf!9ueO;mbd zSy~l1X9HC#tXi3pJvV&-eDo+?AbVqDp{pBET!KK6nx_;`m0Y<1y1VVI$t+`u5`(dU zSCY|cWj(Jh6CL?tX@NdmC1;|rKVe78*E-S~Cq^CZ{iwHAl$h9bO&9Ajko@gJYe`fj z#6N+3rc#s0F6y9&clDax^Uli!xK+=KswNi=>V5E8qu6BhMVXe>l83usTA^L!@GGETP9{0Z8{I z;e9~pN(M#BBLIbtg05coEoXg(d?L8dSQ{Il{Go@`(|9LDEf@O&36OHYG^ zwMMt^xi7t~zi$)?rTX_%2zNo$cdOen;|!O8Nsz6Ad^i`Byo7m1B^Ie5TDJlUH9yF@ zjXq5ERpdj|BWu6Da(hA~OsU=)%#HF0*4;w={Is58Q+3ewSaf`O%Xw_LA&M|RauCAD z<0!Z&93ZS6P%=8h#2bVMAPZ zE>HmaPCi%ruuq;)a#!qiAabRZ9EkavQv}l7=QV|q&p<-LEm&nm8F4gs;r0uQXRe+D zRcwGVh2|_qzN!f^Dp9G9?O{9|ZU!a~iZ<-5r&*uQ&nZ3QjmJsL~FZJ-J|OdMxrmoNHGbStggscM?McJy>E zP?mDQhUawOi@*(JE+;}LRX4{|*O9>cZ@cD`p_is!@K}M=)V%+J-U#SYxQ_Y*pf&~6 zVvUomjYSM{RvTicVqQmqT_lHZj`5vvPp^g2OleB5>p<)rCW*Go=|B;-_;5UiYHQqH z-crlSip{mT(feguM6OQ4@~9vnBA8Z=at$108u{RFB&&~?}sg9bS$*WENu-6MFQ zIRuJ~ThoIzrs;1TK%+|Ba}cF-4^$9PH}UyR^L4pu(EUOJ%b+pGlL=mQGAEy|-9z*A z8AuL!5(aC-Oj+*4*4M5KhGY=a)W^#fM))C(s`F@ubY<0Mb%ZwIzTN{| zjFYd{CBg@~Ag<8kj*ckWoSbPR zHnej<$8V~gJI6|}u9B~HrO2z=ssTHu6KWF8Tgs0CES$n>pj~1pG$%wSJLoO#qwK?g ztt4X{zPa=QqFnkXl(B(6-g#bYPxsS%8JL$*HeEa|cLQcE7y?SE8jDub0@#X$CS?0v zAGj?LQ%8&Bmf&4`DrL`2ssh}}af);4`}2VEM&-C>Ivt-e9uv0WSS!xAO`4D-)$T9T zmjxK}d9hFls74BBj3D~e@SYOpF#nqBEE%i!8+>=UR z?@AFF3yX>%!gFx17HIXLjBziWFortr=(;sL{V6~;U^=ZmKzM`8=jL8R;5Brbj`tcc zk%N`^5^;Yh0dFCyIRQd!@9#(TNHAax3ktLkpg`NI^)CYLs}j%zrV8HmCz;ECJ(0NG zfqz3go1aA`=>mv*z}qF=wekZyg?-fpU6dLf9gPsrvYLo3rQ=Oo-jr$LNII7sRi%zd z57)b+t9~4-zJn{r9Cq}khG)QpVhO6GKey=dq>B#`x zi&l@$l3RkKD&W)#%cB&w^HB5vfC4LU_udO{HKA@QbV9?@cCHxg?9e2wMzMK~xADAP z#E}&C5Jhr!4c76_thDFOS?4ZGc(&elHL_nn>&V*2@+eA;yc2x`yw%->W^X*({Tnr+WBs^ z!m5>SeT@Z0*|z{%qt?shOy!la(tOK%q~);3Y~N}7DUy5|Lt^p+UTvZiNUbu8hibSs z0KpgY4=$_h1JC0tEeY{W)ivBA(n2iNwcJ<{L=CA3Yvv#&*c47icVBfjC0H-Wo_O|l zgT4Sj5hs*K&K1h<0XI%CZ)e4UQNMk_Fk{)V3$eO}&)&ZuU43eF#Z5Np3ZWuk=%i*r zX=K_u3V6YRBVItEXT$=jjj%u z%|LnTbn#i-4?KbpYsZBFs!xW!{z~7ltScc@7BA^{bo?RS9BsItrs3gHCfG-W&Sf!2 zsE&4jYbM8-1b`D;=iW>#u%pC+%=yD2V2k9=rx43R2km6CnSS8I5J7vtU6Cx}{S~4O zDcs$aZZ9uX%HS{sm-?y!Vo>)k*!RRBA;7G0odB=eXx!SE*7Li|MTa4WN^*fyyMM)C>Z&fVOFXN)~|HLw3pZ#eWVQMNh-kd zEr}y>jC%pn<#Nq!y6qqsH%WT*_{B8N`c@ZSyTLNs(*{VmW)h<;T|81z?}i4~`pRrN zX! zIhu@Ti_o-HgwFsrsp-sM4Np41d5WlWcVHm8#w8l?;wZ=4Kzex|q-D+b7_{kjGn8qW z^l%QV8L~`DQo?L_YSFVRy-8h`OPbiQ{MAVSeve)|%?M!8&UdnSTeHq(I4!|@r)u5$gcA|$8W(lo zD8#|QxSFtae`jz~#q55dE;)x5FUZ1D!GWjto95N5tgMROqpb%yw6iW8JbFq|5sq~e zgj~Fc2F*tbCrOc^&CKnkD1(ZItV%o=^0|KZ697Y*$>r*(HTQP-US{bEh=6F z6UpI?QYgz<4=%MrnO3?bg9Cp0pk`nJ$Es2QEIajVx}YUwq=ne|$<-53g7*3lKqL>{ z0LLI(0aam%2ygOgF<>S=($|(9vkj=KlTwCna(l|t-4TIFu5L1t+A4P!ex^Vq(TN>n zNrBSsL8B~?-_)c-#{{5-16tWK?qpO2EOV{4f}JmKG0$xAA1M>cpnltA#09jQF&wQz6}Wfd@5pz3AK9?NeibU_oh8UVX- z>*e);o^s@n-z2MazzoGJ(FJfU)Kb!`>0x@@hYwysD+2*b@v!=(bjxsE#A9&OEh#U2 zb4}Rit;QzvNdd9s2A4Y?19ttD?kTb%{>3DuS;F?mE{vFigO|z_M#Uz1mg0h*p_f`S zr79}Rtefy~JwspDr)Pp3eZ8wf(IEZk>AkDB&$iMz+My#-Ac95G;G@|9&++N0DbSPT z38f?v2PP5|PSQDnr3&eiQ9_QlKew6Hm)VB*8m^{mPj1urB-g(=cOnfvHo5n1`WDBra5`O!O)EiFOlLcB&s8h)gQw_T;+)RCVRF)T88ik7_laCkwk zXk7{T9N$L*@Qu4^=&D)c8c;zV5hRprB3pe>1Iu0jH5YoFnvn4VIM6DN4L?3xKg9{t zdnJ8NprHm9d|bPJl8M6X8QAjJRu{V!iG&xRA$d8yBy6E!8MM8>;~zxMl@iuJcs2vN zTNB=#8%gu8PaklJri^HsH{tDX)I)-rd!n3wV;9XEE~#4It9P5YYiVwI4q0R$8@aIx z$a${2D9QSvW0$ixQ+SPq!^(*f&EW?WjR!1`Mj$G2ulk2M%TxFQ{tR81QbYF;sNCNn zuG0xj9=t(27>wZpRK?vJHVL)HUIg6%i}aj(v$vb6ITK`o1j85jw}U9enmQj9Aw9O4 z#imZ>nLqJjTSH3;vo8zTo_dMfui&N4rGFzK^N`=MS)o8l8bC+OUjNV!4jsq0bC{K` zfkS>%-K@ zdTK%f7^vY(cUzJ|G@t{nfT{rcL&`>7B}r>_snQ_xnGcX~%O>0f#SnQr$9(b6jXVj* z&};Rd40uzUvkul56MMXIOT^1R_HA)E**ykWBnhs02DP-pEU1)wLpUrzZIdy6M5~C z?>Vvpj~rYE-JFWFuA5$<=%&+d%8jLv)UnKso5m@e(>3?aMTBX%RpD&q1>>Cl^v zxJX2Je3u^uXb+uW1LO;ip(U=jJZWo-}+VU3!)h_a2eg zY<&$Z*@WWN`O-IdOw&~YOjYsAFyzxjNXwAa(rmVt{eVQfIUN);0g@%nJA&iX`*BY) z!m)Bxy>>A*XX)_f(;f0H;GdKApT4LFW}p`%K=hG3a+hlF{y0^KY`HMsY_i(j!zQ<4 zYKmiTVIM0yOr_pZY8E*2>fXs+)Um^I2vV}Psd`BDDD&Jq0_{ojzQ|-Da&7d(1lpW+$4z66C__aB($|q)AB#xgVR^al(!;gW zu=?jVXQV0L^pJzhg z`K4KFlW<$5lyp}a41b2x3BFYN!BImLUcx9F0!C(9&XStt4EDmtc^4x)$`TSfQB|+| z(Nn4i6(vhiGgkrzlRy~`}NiiJpo{0b8-ku}kAxnf$2!5v*&AhsLI}x< z?+(dMcBc)gDoxlQfwOVl-Ojg#+-;g;-FMc|6a@5u++m7ANbB-Oe4 zNW3DV_)A|{IwE1u#drXJ-%b6v{~%O0D~nm!7J+P1pU*Wa=yivJJT3Ei)wUBgTD_;I z))=>ev(lSeW$k$?WG8Y!1VedG=Aw1~gJO1?6oydCwSAjc8L!{y6*#ra2%I;s9{$K2S%hS|_5$=t7hBI{uExEq8!+v8cewgf zt<7uEzAERMBU0ZcdI7L(%%!SBfF(>2V2&5naYeRrTkX*`1R{HizPmA_W+#3#*)Y-` zR};OpWt4_MLB>Y#4K$H{!l>X(exj)09^9R>t)sg zphgNlNGCuLiw!C*`CWGTm2gntxGs2kQ9(yM{vUJi85LF6bqf*%1SLq2B%tId7?31j zK#(L7swi?0B#RdR4lJ9=9$4N6FQ`u?xA=c3dXY|;@>AINYff)J%-KhZu z`tz>IH(wMlH--uphn!ONGv-Fsuids@sNNan!ssvNd37j?eo-bEcSdCvl7<)RA6{u* zzJS*`5i0(n5djem3t8@(B@qD;&22(|)7)8rL|o*}foZzs)q8w&ptSkw?g(MgfC;%+ zW6c9$%Ek&80+dBWqm+lF=Sq6GTu8$#k#BCa8BTDENv}+0&huzhmh~oqDG_G|wF`=jyQ<{qE5mT(C5kneZ-8y%;*O^}KF^}R zO`?xCxjrwc;UmOSR;48l_~BWnc(EwmOhEc5ECh;Xj?m8FFd(gJm03F_}LOK_;D>c z-9&dE{|6qPd=srf{ds$ojZap^?fR_SP_1u;v2eFtTxt;?$Y$($A#{#AFn3%4V(Fw9 z#ep%)SuBgRd15I>v#v&Qb*)*An4rdL#f=89#<4vz=%2};3OT^O`W7+WHO zFMRhVJ!65#=_aru+GX$~gG|VE>vovXQ@AK`HvCF5ep&{&i+KVf#e<$p4VOELLZKrD z3IWPspHemi3pW#)uU~1!aA0UeGUM_qK|-U1M5Y3WnfBGqO;3n0m3;YcTJL;2OcLkO zzh@$Ta%>(_81I%n{_YPD2E_{~);;i6LO;I6C)Eqa5_BZXn}o5+WSQ=F-leuFl>7lY z4o(2vC_^iOg>k{pZh<=;~9hP?$R5oORx zOp0CgG*m&A1+jTag_sihnfi3Z6M=N=T+fPV)^47teEMK4GYk;Ecss!gm#*oG%vVUm zV@l;ur2$krH}`yx`bh|(z=94 zp>~+@cnuJK1}UDp^1@yuK3Mt5z#hQNAIK|xJ9tfAla^E#Ct=-{taaNIf5d-K^g0lH z`FSmN|Ao83QQ(Xn6D>ZGr<=o0gC%6!fT)M%*h`UMmLOg-tXP1Ct3 ztZh;zIlKn^9Uz=-#na_T>s|^k zc5|DQJ-p#MO+&(@=MtPMsiulos?mOYT|x&u4p+Ya6Uz7hC)L|aKP9BdM;;mS4@6L! zDXv<98f6RKt87l+AV(4 z^z4Q3*5o!bztSDBoau-8u8s|3WWmF#oatdefCMZ~kdpPr`x_2Js9w9LfFDvm_R8fp-@nL!?u+zk;MEoYjqX`|u`>9Q6lF3#vU&5aOX5|I?Z4=K6u%}X z#HDA_(LTM2*maSf=cQJ zg~f{ar5iZe0#(!&N^nJpGf&!K=sLdS&JCa(%XRCz*}NU6AMQM6;)-uj-_DSr_kpsb(Ye#(Ft^wG6w{+3DRS+Bu8Aw-XP&kK!-3Je>HGY551! zaX2DA9G*_3w#%SI=-^XPNaypB0v%B4Tvov&b<>dn)n8i(Gl3AT>#tBk7~M5<#?>lb z!tCpgnL2oP6gX(5dtD;&ry3zs>57`R_>HY8em2tI&51$lcC$~fa?%afatq0B?7S?|~cWl6&#RdDlj&NOCh zGMI3HFd5jq`G#w{%y4fi+LG1& zhCUVFRap9u4@lr#KKSQcZV^9?rYd7k%L96;=6#YByb?ky`+*1mVOrL(uM6!I?0@?V zC6VA(UM_n6T@S@}0>eUO^ns3E<=OO%V~LiyAdM9X-kpif02f!~ z$Pfj#6*iveSkXuiw^ZDkd7 zltNi}%*@Q-F4*t^<@oO|pc<0<^H3@z(Dj%dZf3vmOoG;HwnzDa=e^EX*=hg_ynhGdAb?mgG85vz(Lc zk`(acKYCR$arLS5m#H=r{s#_gf9l`}qO77klp=zup8xOBeejvx4Cl0P4k;4%iA^!J zu3#y_^7pFTdVg{pz5bc=-r@S1FRdBAcrU~{+cR*^bR>2gaEmNb6{KdkmOcn=pUBqdO-Gg7rDphW z(-q6^rd{H5O?H{rrda7_RTNH5mq0n1Mw4=(Th}(=x`cP-Z3+4Myg^==w*Q+8HK6#P zZvPZ$XQ^6$dyfKhDjF4RWsOr#Cu?0?U8`J_@cm{U`0MJI?0YEj;bVBNB~^TK%GVEM z-9h|w;UCb@$#ph>$kWX+?#f-yg;9k?D-o@w5d+4)F;=t+l{WaG! zv6~LZwC!hDLyta-!s-tFWcV68Z-F27a{TzW44Pe_N3Av9VV1yzTQncO@(*;0!-&>g z2ub)s2a8c9>)!Q>LS{Y*!@Do^cjbUD-IYLlNaFT zndy9g0yQY~85H0}h@W~}k z$%)I4SP|{o{E#WnkZM`yB3Sl{{8wmh<|u2*i9Y zbc~R0ENGHjUXh%c0z@{pC7RF9#8u=SEMI1s2HU?oDlK^}(cBx?I+|Z0(A*hzZc;}} z(#r9m{Eok->$7*{#ypx@efHD&%NwzxaqhGl6f-ScuN#K$r}>kUMB*M$vNo4Cs!qWM z-ktTp!3KfO3c2bw=)^4P5dXW%MKwt|0hzV4#5I@frKR{QiR-KHq2}@NOyH-R&-K|K zY+`@Tk7=Zr*o^up4Ig-HJl>mJ)U!e5MwMdpxE@Cmqh4cKZmoF_ibHB5iA1ge@HRzWZnr;nTo(Q00BY+LvVUEIQcF z6<<{$q%bJ6&FtI-GM;KA=e-Q@dZkFNaGLJ!2kk!>D0z!E=W(i3>^F1%DXV46@z)Mk>@Gf#ZH*Xq_dhZzFl^m}YL~9Szu<RN_E)BuDb@}BA$$7qH4Uf(wzltWS?Re4=4OK?FO|*UvS0gP}+%> zwT`O#4R|j~>Pc`JvMa~yJ5>@QkMbz@)a^m%sVUs_Nbj$~ujLg>@lQxrYBDO{JxNSiAzkN5TEoPzL;!b(N zka3AEB2%d(%W3|%)QeoNdwV`zL;*%$f!{+dyitEfbT@_JT0C}xtVWcc7qfro-e)sD zlE-T7nKLD^g@&qeWZ7ylLk}7zQE8gv!{R~=I;_|2geVir(vi3G{6@@N;Q80PRYhBX zX2g}6n!4UVEuWM5zZOyd2H6W2)~^#hJ)7@R%Q|ylIE(Q~SLn|)D4Z%3dY&BZ@PNdk z(vWEyWYzc-ycr5eFe-R9CCKA*y^o-hus;M;JoD<(0YNt|I9y8;&0P9slH0mkb(6^Yw%!+IOmx!hBtgL zQ@+JW66RQl6MmrDs^$Hc@VQ%X8|X@D563&? zMFp{!58W$Et%nhJ;y-61Z|K%-MVO7xJ{8!1qL&aJ+pv*M{Sqg|JV z1fHgO0qc^*tZ@vi6GWku6b;;%R=k}l6r=i+{SXRDMW>h=Ws5=Et!D!SIJ_#JMehhi zz~Zk$f*nFx#5dh^m1BiJUXXUaZ&n5cWtM-m)|M?%jmeMKD;?m>>>gxB7X2(&LCKJO zFK)kUx$Sq{Z99I8d8i=K-+6(T^>O?AkbM2NzUqVPc_B^*zZ_ny7xfm~EZYaP<#TjI zpPftU>lZAw=b5Hpi1J`)RUK1~c99ZoZLGa)=j`10eT@R`NyQeMTkSFGId)<9wqQAB zbaIV;>XJi(yhf7e{_*ym(L$z@PQtv~sI8Z)$FFceqtn2bTmh)n&q#ka=i-Fv+!&5ih}0@&WpQn|?7*2fd`bY2iEOJ_Db{Gz zstmJTMHPo%PCV5!-e1|M&Yl$hhW6_*D}yCSkw1_e4|P$gXMgOGY?b4}Gc^kkWh#IWGgO--lAZCQ8d z^ElG_kDpIwou#6VbIekYdEXM<)@0%%P$Fk?o)B$U{v@t3U2#?%E#VmXfJ?D8Ok+j} zQ}E&XZR3t4Ba^!spVbrfwNmd#eh8p?2tgIK|IR67(H@5?YSH+&nRq2o3yvI>@j>ci z>PVs0c3l%|+N|pu88Mx%Bh%CUqbWK!9ug=QNtd0C%8$uDrhYO;) zU8&K$rbA+Ofr`ij^>|K$zwNkSVN=OxX+f42*;GU9Lu^Br)qJF1XgMJY@|H3~Ed!T6 zxdjq1{kgQBB8_zmnYk?aq1ls^>R6zZtl6R^dP*qtbD{8_c_*+ zjhPNn2zmObjoyQ!>|BuOjU%q-?6f4kc?i{H0#0rAtAEY*&TboxZ%K^0b9KAoT?U}? z{T_I(Z2%i@jX}+xxu~{5++{OV;S`ew99LV)Je=r)?KPPwE`rZRg{QWPg1$58$@(5w zg}nfIn@4p^fagCIqU{u-lI&32ji^t?{p0=*&lGnq0PSwfNFS z`V>v<@GX8CIWvEq{E>%IvQam?mlLVbC{n}nCq~~!kqQ!oaloFSzkqnXqOSRE9;{cc zU!vQt{3AnNV|U4h_96q}D}Y}Y+(f-38r3=}~fpLnWy)p{{?Z|HcseMr^M z#7VWq+B_Z;?vUe)_H>QQX7@EL+1a-5(|PRmS?97*jquV!e>5*bu&v@PW2QO!21Q=; z`mjW4fLAB48XQx~F`=}|;A-yl!W~qI=P9h_Bddy=%1oB6X>j@*k2FbGNA`Axlehg%*^F6Y?#28Lu z_T#YZAmBWsvye@^CwPs%4@HI<**nfmnb>|jvT@r99H`^PJ4m7dH4ZB^63+e>B$33+ zNl18gZbF&+>U0H#+!sx14bdVsQi0JcjBcoVdG3oRb#l}hNn>B#3bVY)FnhiieA4{B=?pr(L%RaJs02NS-j% z&$NFbxL2|739vdcf%hNZOF*K*Oqew=Ga*P|rJ%k>M{=$Y4*6|46p19)8^YM1@4-+b zZo!lpYiC$kwH~7AstF{$r~LJKD+(6WB5Pa!#RX86(;i>_MqGKFNuDr2Q%Gk^Z`hvS zmc+x&h6hk3PGY5iwljmqX*#!a2%>B#IXcy?e0F}ZwI451<%23Xv7QZS6d~OHYjBjg0Hx`95^TJP!40E3i-N2YPkM8}G9p{;W7-KA)iz$8 z1lqr~y!#Q}rQ&r((I#pCW&P6opP!5fN**S_6a{g@T2c5s^_-+H|5)n>)dH7*wk&V^ zuxs=u$El4M9QF^Vz@Rfzdx11+zUVrOrh0_fB};O15;eya9-^cU(EM9B8G{Aou zbMHyrds>p4Bnpc=3KX&!1c#(gkl$Q?W9a5R^l?941yJUfvsgDKE2 zQ`u=DQj8pBJCFw=E^Uz&gQh9LGLYFoBI4|PnRq+(gMI4^g{j`^mkIAo>lP=E-|ciZ zE1BP{-h3r8s4?J6G!Tza!7bPzAIA;|JX|3f){m9DL9Jr5}{TNSIHHE^R-`xnv(jV#4=Z-yEz6VlM%ZG z5Z&`tW~#(=KQnuSZ3!TcRr?QJ0IZ9$W=hOIa>kPS4&*(zPcS_qqyHdpSG>8!D5B3$UAsJAf= z_%a}wA^}Fx^=}S!ysIG{>{2q(SBmFlL9&8+A$V-Y0yZL@!Gt4Imye$t951MpewRfPKD~P8>pPE* z`RYlUVW*C~fumWLGb4@71@P*N37Kt~fXZC%Y0il_gocT+_AM+VH!wy#lYu*t-<6|O ztWj<)G5s}7w^8ZAR@H`*zDViMXCp0I*dt%2H}E|B!<}T*tRE?8%7PhfBlR+1DYIS~ zu&UCik{Cv%fM;FWn#7%-kDZ;+u>7Z(f(m2NU!MxDf5<==DlN;l0?BO3H5#gD| zRpt{Bq{WX;2-|(3Nc$KvHr{+&+&dg<`+~GEZrH7JLtC96zeSu=wbEP0+wvvy0cRqc z$DkPbQsc2k*W{B?fy08Nj(z7!t9&-U*B-+aTQaipWs3*6Ohix;6-$M8kSz-)P~*ZS zgq_sJCq!J_xF@Y?88lAtuqARb99Pr1FdS5ZkQMMVv`+}ZjQ5g!(u&}`N1+k#q?5?h zp_eENSp}ddblaecXZ3xkoEImUDOb6(Y9`QA6`;1!?s==C7i}H2`h@U6F*?`Q}!y_PL&KSG-XlNeS+0sZ1^2GCq3<^eh{F#%!*O zb5qMBU&VDv!*+91KY$Qkj9qWHsQ_j9UDsy_VG-nTHX{bI7OZy>@dL!zh0cMCLyFHT6d<`dhV3%f4gH``hW+s$sg%8&i3V_wf?U zgS}I&t@-RUt?~l2I$IXR3U1F%UHsu6P4o0@ zaw0xjUieUKC4Lpy`5F$8-@<9UeW@1$Xoo^Ppm^nPF@B}~QvIZ9RL@V@#lrE# z{wXP~@E5W;0_CTtX^1Y}kGMzlZAA7!xml&>FQBym;haWy*F`{cgSeoY7C-(=^zYOdUS z%bqBk*Lq3HM<7t~^?4NTK8hnRz|93x2d_+yWy_|-6&STts9tR>5kt{E3x@US8BiDg zWj+5?Np?Barv*_9?$? z_Y5UV*G?!)cc_e;HCI8zS(Y~6u_`NS7p5C`OmRoO=TKX>xNya%F?qa}84Pc%5FCk_ z3crL)q{uOqF z&7-EAC*j7Co}8A7 z5UBzz|s7SATNK5p)FNX9(t4u{uUq3jGM zzL`m(%8fpokjuaS3gDGtcU_2yh?rD-_vc2URr%E8zh9~YOO?~2A$0!d9{f&MqCS?n znH!db@TVnqow(h|J^%sGDm&uPXzfe9YHG757j}MB-}M!ui8%IxlFvk8?LdjgLOhcb9;rCuD=2@OYA=Fh~BD^!+Bh@kp zOmS3v0`d2?v|UJ=j^Soox$|6qERqRNtSb5c{*#gpE9?1buBu!D#3G-1(oL!9Ux^7j zxsQK+`nVJQD_K67`j!(Z`ZS*+Y89Z@2I^QHQwC3@rY@L8=0fTAI=IwPi7Fn0tnmGb z@mE)eO7DXk9KWtV`f-+2?;77r#7^HD8R{NNY#Zb1*!`jAsPe+Z_pw5Q&lz-RpER_@ z6VSRCbWd=^bqBqn)f`!t-F;qB`Qzw!q%3+_TuUUVF3(nr0yEE*S!&Knatf(#ah9@@ z6Px!khc~Z#5lfK^0>+=IHIk>uR|6WN0O)88x^PJ#n{bjM9va?kd{Y6G`Z-8p+X1UD zwqghpy(BeS64LYf8H?DRm(MK2CT;3Y(*zNjCxV3Kx(f?QAxfF!d$>}2-bozqWkWTqzWisRNhD6qvgq?- zQG7=9s4WGav5n>=#F+SdmY>;vb$NUCX^+ECA#plAUM_ls$oA}b7Y}YMOGUnMjfb)o zSy}Y##RWB+LQg^Le3`{x;fvV3aHCVmtu8(NE?q*H%&oq!;x7@^4E^P@|NW^yWM#1S z?LNtN7Ws>kGnjeVD=zjLrU<2?GJ6$MgsRJlZaFM!X;qNiML*JQb`^oB%!^+a^>9{-dW8%x5etJqZNf>ATURpN z|JRR$I}xa{9weG)9C+*DynI)EL4x|^7Tk_rt|Q#e{(Qck9T7TS`2g7npJs*gXVEaM zH69Bi@pXBlAq&I6WBt!3!LHXq)J$5UCe>=MJ;=J7q&BK7Nnz})GHaH|G4ts1$NA(K zTi$#an{E{$QWzWClwIlTBG|mw&7?Oj{pZut3byjafg;sG{-%rNJT9|PyO9Lx@*()& zFWBCIuV=*9YOCaeEvr4Aw`)2~xaJwa1W7{yhID?YDQ%Lb> z++~LSqJ?8{Ul#MA2}J6>uc)R`eA~LrB^88Pm`~_R_6c3 z4gJx>DXH5u3d3Z@H_{GmrrV5EzQ=m0I|xdc<lRJIm1M=8ntVoYroC^ zl|=tw5~=SA#%q*`n{H`Z3Kr+VZWthciQW_ACL`JkEj;0(`PXL06x zK|QUw`YNxjkXVP`3T17+Y`N}qj3Q}tGrxLDeSYo8&7rI0^7mLVcW|yo2XkBn2xHj5r)sb8z!C;Kgh_1`aR?)kbT$d-lwEdv)p9S+@i`SG4CA&Uj zGcWUuHvi*IO;hn#M91ezF)KZfykJTE7{1lUzDtZbE_EeI-X1Q!ea3dIIJ)170^=d_ zF%t$tztyln2EU3g!BzkBLX~`*|10a6Gr1Z`FEZr0xzumc<4 zRTef*R6u=w>bhsM>HbAyuU6e^(h=Xy;Psi-d#qXN&*DX0iY-oc%pX7U?R?!7J~#03 z+WSi`g8E|iO#R;D-<56UotZ{FcO%T3Lhemgx~0?Z$)_`#nf02Fo5Ek@ul6{K51DGe zt9`JQDOqIR6_{9ig}c_BS&>;QGi~nZKy#g2c~d+k0oI4QB^6GF3!7J&k(Jl^3%kE= z$>ga`ec?Eo>0L$%)Z{-66bVe~PS38cTb>Pc2t1p4au{T-wPIXq-iC~? zUgz7!jC!wjTFTYU*9r8@mhU|mFbF)`YhQOOgk6M1eQ7v|qCZ#FVWBr`MG%?7Bk!0| z$9!#eAY|Hb2Q%GfGxEM=^KU!rytoe$;xZ!SYL>G4i#$Yj{6gnEGDq2<3vmRsQkpVxB!U9fn06;hmZ2^|@g>4@ z2&tG^OZ4~^t|#tt*UT1cce{xjmZrnFD&}Sq5qb?74hJ~+Mc=A zdQmOS@1v>9O4lQuT3tu!k|*k4q~C*~C@X+t54P2Na7wo#4i z?vmH&@okGu?K1k>xtZDaCGk5st^dx}#AFi`KEmG%KQoU;#oaf>UC)XL3nmH_GUdi3 z$@&IX=K^S!{jEAkt2m>DvcJKWtxmb6=Wf=+w?Fc84T6%u#dmIB2x}`HJ&=8u2q=P? z@4mZ}{5*yBHLkkP!*ZQs2UBnGF=Jq6QSWGJ)r^Iiw%)9q{7+MM<3fK=70zz#CBj|C zXqp(aJmBjW8_wER?+EdKWjLkziglP{Ugv1z8L6AQL+u9dGw(D$MIkW$-bFAkQ#8{V zZ)mT6zsxH0!<|d9oA@O{J3&dBk772@PZL{d+H$i-rcAfrr#Hjrno*N|+>dcYyMZuY zwfovD^B?b&m3(9_jUqTgg|PGKep2B>$@>Ceyupc_6at)JL~@Kd{XLE)D?5BlKGR&;&y}1faHGd&DpNKPVQ1~w;f0NVsoDI{;zwr zXE3p^Nw0PK=%x~RYn7Z|`oO04u{+CBbScec!P>rj1$QlsLYy3vcQH-p62*W5VYQiy z^YF*b;mqW@`7$9d9`)r<9K#CAM?r*z^X~?=1%!p)nST$y-OgG@yOJ0Fm3q1TCwFS9<41 z&C1Y{p!+=GMGu^y61K|5nsuWTv*c(nD@jw_itj8Jx6=;)RlOvF`H}v7GfzMMqDAig|I7BA6(I$m5$Jm99~R6OVUdxwH#M zx8B+DbRw=M%5>)ES(>PUGZewBw^B9koNN``u)jAV-8zcPX%)h*3W8Kg3IDj7t;K) z;kfh2doR90j?wRV(ru@C>kLV$KMvp(O~8O`0LkwKOOWLnv?sERDZyyrlav)p=ts#Y z*__Y?@pNY??apbsegTVPHI^$+m|PtCL*vEmZTctdq%Xfjs84ULw2~l?hL5j$xWEG; zbTvwFyja^CZ}0oU4o2TegcLQY`8nDP9P?{AkAYw8o_6(&(G*^mrq>Y=OfaeGv;ku+TEjP?SEY3l5lKT z60%yInt?w7Nvl12_H(so-@YQLdb04nVnZj_L8c~7+&ph6l?!*6CtU6r2pd1C(0vXC z!sq-cq!?%)5OBK;>}0%xwJabo^Zt4Ulb4;FZz>Mdm`xCDb^?kzJM37S2@3EE9b4cT zd~ySOi}~C+OLg$Xd^+6Gm9EqS1On!1pMCw&woBD9My5E%tqctR>SrQbPb6Wco}f;e z&Cz~$T)>$CiO=3AKDKhEG>OJvDr1@#&Jv-GRsRPLRz3A5&)h1CUj5e0>`U4$dMgiAVrNT6+lvx4WU5~cmm`= zNxQeiO2cUrbG+4WqEl+ESx>qNwVhg?fe%+6&4PCnG@iJ2rv|Rj19D$}P(7cG$gu+gUenphxJEm`rRrJ(Yw2!oh;*}d# zTO6_;?}0UZi$MsP0lcJj)EW;+drTr9?SZ#SH)!!~phxBJeh}nn7aCW8(bzqJY@Q!> z%-*UO&p|@TpQ=&A{Ssl)8(o}MH%yVUq<3#=rob@uj>~*^j7S3ilf{9}&AsO;JC=Gw zCDw%A?|IcFF{7TF5h~ZM6?*n}GFdF!xt)ders9g5Oz+pwPR{OoS4pdH z+zq5n^WxiD-lD>|7MLUtQL-t{+`y#IcBOUwMxf_r=X&rb)BIqmK!fdsv`el-;?Sm1 zBZWWB1O&rOS%qUY>U*{McfbDa$n0&2)((AOG;r6T#{HR~RyjL9gr3*o*Z3xc>^u~= zvuRq4C^r?i%f~M~h%9;FYcO^r;v$pG;`*BXl9?1(}K# zu!_gdQ9hKh?z|}Ny?@;sSUUjX@p&BXUTOa%6+LE1xJ!WEJqMr? zocAEQ-k7PV1{dCLU`JH=_*nv~?4JIW2wkxM#+8QjCLl&}TaQ4j{WlZJ(^|l5n}wbW z66weH&bz}w+svO)dc-MjPi5{L*{zEzV-=HB)8+c@&uORLl`p` z=}J-cvl%MO%O;WROJk~M`Y@TvpB>UUUjJ~C(MXb=yt#^rweJmnvT_)6LbaOTmr9pt zRJ+ZFYOEQk8Z36Iq35Yhkv+rMSP<>;B^b-dM*Dg99(w64R*)fQ=q@ zRk=V)-+#k)^XGk3_4663GRLu`0>g@WyIQ<^hAg}Qg*?v<;84w1V7I~wV~EBXk2iEd1;*9;=P^V-@qpQ_y+NzwfS?7zBwT0b!`66lAxb8(x?Jn#a%Q^<% z8kYs6&m)pfl0!n8F6vtXersR~H$mo4f7$Q@v=6uqFmx6$GM#D(%KT=)y08bN!sJk(g zb$2DHem)5H2S{Ci~6kB{3M z%n&ba{OKnHcy1P^l5O`4RBX(iGCoVivKxy%M~!kiEPuo#b`vc#({AQ?HEMkYDqc@d ziX3&7sX64c(uI7^Qoq<9jryeucz9-p)B=DR*+#wdF`Cd3SJqv70f$xsLzK7cPfsD! zg%jIeLGWW^tA`q?_LRWoYR}|9#QFIVY@e3)Ko*VB)dhBrfTe&Y7y=B+P@HCyd}_Ko z-MspR6Zpk%U(%Bk1f6`!eE(lu0PGMrzH|aRW7iR+rZR|JtpM3*zgi%)JOqyBp6>(? z$wk53I{_4nnczGkK>P=GPJRgDs|!~>q}j1kdC3&^X}$&XWWo*UArCFM{YuwYg0Yq0 zhz5Oe=w|MotgQgE*a?Mo8lW$|Hw*aF0hzifu39nbE*pL(f>KjAH7g2jc3zPz%F33T zd4J*SJ%?n|z=fVhhe8dW7M6^5j0fk>NN6lBF42zfAfu@ z-^7MRyUJi~uG$EzL{`Gd;oa9mpUH!8_RQVd|E6nrbisM)uSly_DrbY>O?2B0hcpD; z$(EnFhTUvW_U3rkWcdT)?eoYT4*6fEH2{FSykk-p0bEek-kO*Q9oSmseFJ3*ymN9A6JQDFPv-D9_bC?S+l$s{9-xF^-o zRX%?%WhX?gBAv(fxOXN&H}4TCmhpT_`HLNP{VQ_8gvAfa*)OP^5zV^RVH;WXBG;$G zcyoAyYjLhUMnGEZ2QvKN?r?S50!e=_57PyB8qY!@erZ&RBiJpNdALVrSoCx zrHC8_)3#~0S)t{5aud`gO8i%J0E14-iVZ-x^J{0S+=E6uj~>1zJ9nvElD@gCB;+W4 zfGgxCK_hti`?noJm2^V4|DrR|j^;#dnA_p)$Bo3E&|!~=zFsw?A$pa!?Hn>j7VUS_ z-D@JWaRj;g;E!oKSPNnM&zsc~SZ-fh)C7M$zMo9nt4^hjfl}&#&IQQ6V{cx{*S??Z` zn5oN1VeQpmcKy%qU7nvM{!xvUp=M80;Hc7Qka5ZQ*7LX%-Cwv{$GvG*He?`oIM0tfy2Fa1i+&ei>a=To39Y|Hg|O{USzP!%87yV zL2KQ23$~@~TsYNfFCG$-aS_rJMoLbB$@NDu4hZbo#-=F;=dEDA{ z(?#!Bap#jK9AX~bk*jK~A4Oicb!tUu+u3|9mkX2j&PiW%sOfkRpFIMM6)(GE!$9{pI#iN;gPf*7uNjzd~aZB z^$!u+RzLuoR}-ZW8;B4&^#;Xf$`C=(k(C%dX;ifO*L9&UbbDoNr6&SX`6vyFw?vMR zAKI>vPdH+wpKV@56z+>1EYhIFzXo_MB*$VytZzwbJ^dTvG?L<2?OhJr+)xNDlr?45 zNsuGfbF(iI8m`ZA{+?#f(!_2yOFjQP)k(W}!Y1!irNPF4+ESJizys_1T^Cl%#Z2oG z;&-&-z4PE$9=TJqrEvzuhRdV5E6BMruHMM-TAv5<-WUcHLPPr{;w1t}u=B-yd%MO)3t(=w`v^X@0Nuy zmp{n{kZ#T2@(w(uS0^5gIHk8hF z@d?cYag%cSmnchcM$xHovdlIyO!E1tl=T?0j~plp>Hr0F^mO=vhN$6})xMGZFYKf{ z*t9}?XMq0Lckb$;k4PZ*m=f~rtYMDwCrtQ8(M|T19~Kg$sx$|bAgh<`xH0Tgr={W zTnWi>&ma;@!4G}(WZUDnRZSGob^>bs1nk zv3}--J7rTCTbo-|!}HS`=BB0>#~R--ZUT{)&)xW0>j@k>Ii}xUm0Gr)&)x&*sbQyM zW#nrdbYi&$-4QY&!d|al&oQVt!@gx2`m)Ccy#4Qq0!j`}R-Hg`+4EDxxM4{fj5eU6 zKk34-o^tuZ?+*~;Xo z&O5m|b@M;Ugsh(?hw0=aiRXVmUo{YiRc(I$t`HQzHGB-d30lmJe3kG-u4U$DfDhJM z+!Ca%0^ikUf`7BIbQ87BJZPz3M@!_djv#G{MjZ{^ag#KGTqw6C^}U=w6FHt;<7m5KJ}2iT&8vU3&yBE!1^j4-Aom%HgD+sE@n<+757C zLLj>@sA<+L%$C1c^WYk!rVQ`b)9Oy(Wi8vWr|EzNg$}f0xJY)IlAL^E>=0g(t6z+3 zygvT<5vmFo`{Ox57$~A&I-XMi?iXEP!O^^M${h(VHVaodOd;^E@oK_1xg)pBhL)fk zvKwH&BXHLO6f1i?hv2O6LL{IvTO;`am{)V&;#;;R6EjbIE$zDeyJZ1$<LftNncwpJ@;B#C9bADHdew}L!yz+=L z$SW+ht2KTF;HC>}q~72g_1*g>TH}#T4Z*>O z#!eMDqoT)LA!lm92?0NRN>s#ajZl)B{pNi*S}1}LUbzgATf8g;Zv{v1k4pa9O}=2z z(=*NJt$;cLFen#tyt56v^-a`2Be|3Y-VSGLa0DWB36ap z+;39{6Gu#hIdc+1WxE#OBM5c^!T6#y=aA_x13X|UuB+E}27v4iAU^{@lG~E&% zRO!0Z>Z>${PpeMb{a_&*&ION&rewlfMZemhucS7rQPtzUt|>G7BTNJAtFI4SHRGL` z`EAzUJE||F)TSf-vh&JIulde{umi-(1V>Y;x+^>1E%3L%wCti zmAsL7e!tb=hSwk?|3km(*nu{hwYHmAJMz$?`@z_d2)f@!Ls{yq_~-~?#X#`u`EHCL zK^h$q5ZqeJtOR5As2>uvE04wEJn;0hEbJ&zfGmTMrwR*}3h7FEzKV^U+>@ z2)~Pc9QT6{>nllvTN(?9lPm!so=KjNJY_~F_XpFtUo_@R2 z+%uLa<@8qL3l2YI)2Wp!w@`aB`^4e1z*lbE;A zn5x=!V0A_--85}k8~bOV_JA!jwN9o${sL*|0acmIj9xAZ8f7MIwH5qP*c?bPM4L3{ zvfPnt#cWAB@E<3Or`TGppZMa*CkS$7upx1{f_1{H_}s!%E^@V=)l;b`mWZBR+Bul3 zgy5|thr&xlqth%SCl33$UZ0%it+>+nQxQJLhf*iZL6^)<_~-APzCt^%WN{(od=R&Q zuaf*~8V9?MqZxzf@w3^e;uD5!u15(m=dqOzJ^J&%*JUVz8IxVv4&D|R*VF~^uZ{jr zofL4`5C8qZ^(CU5_M_Zu7%bjm{9pw~FkP@XwIWc{9Mj39gc8v$xZo=w{Tfk~|2>Y0 ziuhK}nQ?~HiUIA3`M0CcXiI^_Qv$no0^pt@@+HDc>gzrsLB^jp`jof+qHc#`6YUv~ zYO4bf1Q;|2%~lq!7GK56&w&~P1p$(0(BS2}XrIy@0yafHGT|4Fw(jCZq724&FvL&& zXzI-;Y)I(q(Up(eS&T({b2MM~pWSUI%emBjW>mrb7QSw1E-F}+b$Y`AT8AZn?JBlZ zm6IS|;IX&4wI(f<)5f#bB)5e+?cCVY&`@4}+ z`CYhbar*U*?P+r~ohhrGghF;I73Ld3eGcn6+tGT#J8{t4vo6W#LZ`pA#D&US5=^Y< z+Lc5Z@2Dmz``^MW-Pv?yi=D6aOBa@lpdck1+gi#DvBI@b5i^GMi>H_lkc0`luXG>- zbUD0AW&wJ(fCdz{klrNz3oV&3$}b5m>R|4Cw7>=p@31Ko$jSLv zb4HbF*PTAFm0(GW$i1zDHr9^YP^9b-+z&5Pfv93ol}zmWB~?GED$}Oeix{@mV)lq2 zadN6C`~Cv9 z!-dD6T33kv%rXNipz)d%Jk+hY6zL5Tv&zA!z)L8xkBrkUrg<4`e}WxU^t@CO#9mY1 z2#KSKr;On3w_{?I#E7joLaK6rC?m4~PhQu9J%soLM`;xb7&rbj;ZPy zqILx(^m5YN%X(LjDIiyVqFL`j6!w&ydkD-Ps5{~%pU0QY z$|ZVHT{ZD$-A2Zi*LrDVb!HPg(3k6=YuEp0-#r<1Ne}mk(yf4X1^cr+B+@jHagye) zNE89KX)Qg)@Or@uU1pw#cvfvuiIp4V>0BR<9WTx0s|KLl$=@BjK;Zwt(h!0lt{h$r zf^ea3@bZwyDdMLk%PqT&qb|j9-v9(V0T673eYFvqWz6$l4aa>uF}i%u?_sOLZhH5Q zjvYz;f-2}BxxTxeEikjx%hATE?QegPcB+y=0;0f+>fBr zmGfI5$F5OkUmgCYPm%<;zRS>UPx_Zg4kdL9e;(NZGe7dvbWtDUJakJFt6Z@$nTJ(= z-DR|db}vXyj%O-|&gaZkZ2;=S?>7y^ zNYdax)04i8q>1?{eP_s-^8Ay!X2j4^!|W0z)I{p6cg+M%G=BPfY@FLztsB9i6LVYy ze^l9Ru$3t96BY5K?Qb8AFG0D853QZ`p)CpJYInL5V<4_9wFjv!=0kr^R0w=I=3=JK zd2*(7_;Q;QKs$)P>7^CIdfgv?^MgeBMdzsW4PXh$&mU=*TP|Z{T{@LJ%scJ63Tror zkDW=6QED-wLG{A0P$Zh1i_6hYXEK$w?e~<^-%&sLffN*-N4Z&KdmC*eW<0D-aA5l z)wsqp26|*D0UT@PxBwF6&h3r}h?;9k5qttPGA@a$6HRH*1XKfr`q_Yel|by&1}tq5 z*#>kBOc7;rR z9uhHTVF2vZKqixl@CX1=u^FompiIQ;1sj@fXhZ!?_siHr?Sqr{ghuSpK93)1l8Hpq zIvL9J(CUXv%6lggyjoQKE%>2avE6?PR>SKU7vRkO@bvxZ9)P+jT1)v$l$?pk@u)u^ z=7aLfT44x2Sc1QQ`t+#{U^5%Q+U{Yz=PipQbAaAldkmhJF;H3lZed*hkUgA3D!y=l z?yubS$V*R;=>-j;&6{&~8eHii)pwC!L}}UB zTzo4CU8(E&fFinWseIQC*>15>S`qoM-RAhpg@Lk>>aV%-$8pilTr#Imm|PEPxo=iH zxO8;yi0xcFbH*PWx>eF{ha={Yns85!_Ao|<)ZO%0@o%pK?hy2=lmUw-i%veg>kt7~ zThs5-QRiBm2P+I(J$gNn4i|p*RUYK29WL?SeMB{{AhrzY`i{nVJYFj4hEh>*tedXM-JyKJZ{}wY1(6&OC3g5|eMt220TRd9INeypRfrw}Vsjsn{CrSo3sU-p($Y-P_; z{H(Y4mQ3);2;B-^|E3}OmizYr#6O`@8uiw#S1t_c=2~zE`OD+OJy&AQ1zvX12TY9@ zPnk0C91>U-TYi+enib* zhFTZkl)?Q4_tZf_xMJ+hZbzf%Dp&+QB>&(+RMQVFnb3Mo6<*36YFAlOd`3tX=6`)# zs#urmN3ortSDQ^3>hHl~vA41{wkOIZ#v06TaC{90&_6d2L%9zO&FP=Z9E=57JFi{v~_xA1xXF?1@@Ui?U^2L;T^ z@`86}t`IX&X2UX1fj;bEfGH|~0b24%jn}%#f_9eLRTc57drTbq_2;XT!C=7hEV#rs zB%zF^0F>a~isph^a$HwGXtbHonr`q?2S4C=-c7!`;G^KPBLEf}2l{Zp?h5r;|GNhZ zKwTq`vReCLh$Q*LzyPZ8>7c}tu7jB(AE7y*%S?R3CAN(+WRCOD=rS9iWVL0+W|X@B zU88yE6+q083TPT~OxpFNlL0*HFUv3skH5hF3tZL)e15mm#tT_f`4Q{geg_-O8J-HX zJdU`5Tz#Q!Io4>nNY9Mp9-@)5ec}M{?IXVTg!o-FrK{dGtU9{-{=hvN2#;mJ1^3#I zXGV8>E$Ff%d4#Qo2F+9}bfD~h8w$kGLAWa6RPjIHMRJ{ZpO`Fw+n||M| z;NbZB1UeJcJ7Mbis&nA5Gg}>VXfhc9*8*n~@8|qUkz+Yc)}(ht?N8~6V6CbbU{$?+ zs&KWc-i|Kljd`m7X`+LZEa5B#|9$p;n3aOH4BHY#>#d4Q^(%0lRTq>%O{2tf(=Kb9 zVp7el-U^O6rbkc_Y}E*@!B#*+XcQiAHD+)i#3#pVd&#PE4$4rw@fSQS@f*b~5ptUm z=bS^#7jY<7vbiYZNUD@MauBv1)y9&R3J#9+=Vf>sK7Jz!JUYqL8e=*z* zKhme+wT2il|FZrVBg#NyT-uE@h5&qtu4ro-{#oQH+$+27k4iX@fY$L@pmQG!FI9#T zMMws4!_9bsy&Cs9Ix#Y+lDA``MBAL-;lcSzyEJT-0UQ;)mW!Rpi2;KPdM5$rBn#tK zw>@<@rAAHVKc4HPYXuunYi86pS8xudw=Z@_ANw6YQl zUyvx*e`Ew(=@4EJxgjR>Mc!?~L)?!f{RL=vxlhXFyr@CD5H@VK-$Ug<9u6DCcHCvA7$);QL#OV~E81z@fHQ zoy-IWoi#M8+!k%XW!8Jw5o{fIjxxZZd!5&`qAG{t5_R=Ixd0xk6FT6P{U*nBWa%$T z$n9+vhPm5@_3K+r=p_3oRkdy$Yw5Xyi>6_a;WW=sS<{)80;lW5&K?wapXB*Ywb3g_ zUwo~YNbvi1C_{(s2#G1pYF+T!850H!AJCPL~^*u@IE^>F_A<<>Q)V*qt&wdnCRDY_S3;?G~fDr84{2@%% zl`&tq(2Pzd=r~V&Ndc#&Kri%Xd?#-tbe{)@tIJlckpVP!egK86(s_~?e61s(rHm;V zF#uqG-)|3@137oMBh*3dJW!(utRqrOkfoMwL|;($g^{x5*=^n zX`%~Qm6+WrwRC8LGI7aK*_WK#PM<0`jq2>fk;zANmpV(Mm!FA0tv_89%* z3tm>QY1G2J#jwO?^-hnFax(b#D?zQ?DvM5fAMBB4p_63_6xBbvGj_+#^ul}c-v1Vt zME%7-fdES!%%T5=bQlT2e1LK{{sS*(2LP+MusHvfbOJO9B~$%~cD)^V5$uG&6w+(D zr4Wp_#_hAeSPoBi144m6@brx4yZUJTY{QnZ|MA5btFf?*vw-i=4M(;|4VCq2F0Sd0 z_lm)}Ujnj~K<=7}(ENabVFSJ}C2orb&sEQP7_BY?1l9vCJWNKNi4ux!NjUiQwcMv< zkzJSBP+;Mj!FJeCw|yX#Mj;8w zcx_xCDdF>BKQK0WJXVhnhDc?)g`TrL=SMuk$&Mji(tvpRiA#APzLzxF3AEHe+vuY< zxnJT8jE1%r{M{g!%0O$%s6uXn(-E?BmGaq(u1P`S*t{nz*$uA)HB8P25RF9xjxL6+ zCs5L>^8=%hg}4S5j(t5sLc&HfdRGE};7A{!r|VC`>X;C+kEUZ`X}c13a9<5M5UD15 z-wWHG@~uC$6*u9Z0n_-A|0X0B)N1ipEr?&xcueXaLLip|$)3^m3wuD=yg^w3?MW|a zf38Lj-~xxRrFU=um-$aGhUQ5Qw7pLNjpbi-cqVx2%>i~VMMV1O!G1cGm6rEqsZ=uE zi=5jkVAL={GX{ZJpkH9#QxJR7oj;;d$D~=)r+o1@_R#o9vIQm-)r$0fx{~>OSei`+ z;G*UyUO11dtZdewcFOL7P%T?6Q5;eGNRu&f7#TTpe-(nClpqZ9Q{9xVQ+Dz zQ!}O9L+36{=wb;8f`>LfW>7tZP?L5s*ariV=%2%Mz$~W;BNIOJHN2!f|B_UtFC22T zt=!anK(Vv{jO4Of87@^&aYW2o zO)Gb1JJ<7no!{Q|%D=Uxdd~=Jo%FOIgWQSaJ~t(7Y9#v%d)~S5)b})J;{T#7z0tr| zwm-gMnm`<;Vd@n0FJ-B2!VBnUdbg9rOhYXI^(@dGmm6C+hk@cpCl6Hnrww)u)sWpY z@jvVyWn)jMC}Cc-iI=|;d(k3D{U_`(VFVgJTMlFJmXP0Jp6ii^z*f+`_S-imz){*ko=;o+?^4gNGjFU{7zj~i=KcZs#}1gHe$4u1-AJQG{wkst=E2urBV4wnDNp>*T*1Ut$Mnwxkt6K(xa(4sT4eq=AsI z$30otylVW8eUDV4Dv@d(HjCYk_4MHTr$4G#Zg;1(BwxrA2W3})8&kYP%NdP~a9agk zhsQAn3iu+3vO-%m=Pos}VKwyAMDf(lo;`c~{0#948oXF}8rJLgBe3T-kw3eqjUAYo zF{UrTh~)CZmn7c$_g|6)=S?c3ph;jkjnI9SAuwk0K#BAinWDJOE}2}a#ujJ3O3BQt zgf}KAqs#7TRzl(}<-An?c;xwWGW#-KKs4c*oomMWY6P{4vAei&i~=G^O*8rdK6KAu zXX#y8JzE4HC;rbqUeaMoAF6yO)t{bD%w;lT?pGfL=JyTlUyn1f8lk(km9ok&9%R7v zlJ{+v@fodNX~4VjMY!lQfr8L#f(l=>W$ff*=yn{b?$*1MV?wv0ihm$ui%$q`$tA68 zJMe|x_S^Z!Kl#>keI7|neOUK~Nl&01Or1S+y#Q&2i{ot#hGkgW6lD>R;i*|Ki=Sr- z;YQ{=7IGVro4A?xeP_ulpa_Hd^BhM9^@fQN%{yD@F(^S*Qfru^+`neX-bBmrGXcms zc_(9{t2F)tpPMG;6w!!geSRTdW?4DGTXmxWOaFPfvR=RV>yAgw!S*_M*i*h4FO5|- zc^SwEu$tF{0`V1%C3tf_0P7Fl)mOB{<*q@8x`h1&3n3GHi3ZFnW^UkFS6544hPxum zX|Y!X1QW9Zg{p=S{^yu=ToDLBjpjlv^}Vl_0VfbOVNd!jSZ||C;y<_zs5V>YA`#%+ zvi&@F3w7G;S?z3v$^O1PdG&kP_5C#htnW>tlG9LVy6ylmbFaGce40P{3LGF2hYKSi z==I*E%C9?NDEI@tLmyjq6I^xEqaHA-AieI-w!0YUq3c5%9SlGcokmC%8vd&M$Jzh& zQSQ#KV7|vm#X#Stix3<4RcrFE=I?Q3*JC2)?yM@ovfgxf3dQrx57GUKf6oc${*M~^ zygymLT;HrRBckt*dy1v5iUk<07aqE4m_NsDFRgLzCo_l{VX5wkiog^7|KBBTXs^|| z(WW`U7CD&+CWtj=-gNoZU{4xqmcIgF6{eE>FZ^U04dYpUN+BLHhUE-#|asmYm{3C@0fqaj|o zpT1xm9#VLUm`wqf9;XOT3i^z8C;->a@??Oz4p~XK7GF0<1?;Y^`!7rHW<-~sd!%XW z^C!Vp`2K{_RU|ifo0u@PC(RF~?vIYr{OyhrZ-CJTO3xL*)P42x7Y{fn3)& zwG6cKy?x3qrvrGDm!N5U=i8Yil?K630#dN_J6I(-ub%X?_-WK#`o9(!&acA-svj7W z8gYd6LGNX2{5AHH;YDD~M2oxH<-K3a_Jzq(48MCp^9%x2+}0F3O@A7IH>STSV+x4! ztDN^N7#RB^by>)GKG6Z4W^w}zz6scps`L*$~!021+T&sjfo!5eo6dZ3rH+z^Z(ei;2;}`di%Vr_Y}8 zLbYrI`10Kd*UaV5w-TVni#v_gOYCZ;E6GBs<-GqQkmC{ZH60UE>v7^uKWQ^r!^+3D z-=A6h`L8sm76zYL9F}pI(Qh8ONm9NCap07rP<+256>`5Di=0EHUOnW*&>jzpiCOT) zwAIIuPh=tFxq~}Uujp)oaqd|hF6V{ZN|KQuh56EJHCSjS>^i3dp)W1a{GLI-NA@Ls zR}pLO@5R6r(11jL7O-`&YmVn#sEs}%@tJ@Sw~@IxgmBsBVxVJ!65l!MqW9q0?% zK*rf&uJk*W29xQR%CQ1>@Y~OOv34)i70{!Q6VJjz z`yGVE1`^c+d!{{hxbAqajN$)9BPxN6r+N%>MF}KR#b=;c`bQ2mLjER9VD!t&)1MN7 z19xq~{38_}LeLldLu*I2^8kvbH+k@^1*-AeTm6-?j*WngG|NP4_`)_Ilj%H;#9hGG_dKknFG zyG(nLo27FFef;Dyuqoy{LFK&p;9}uiQ0(i^b3o!@l36VqL^Vw7EtsFBT&5bi4gE%e zDSpOI|9F4&cx~8OCV=NK%z%G679=&Qcl1MD-iD2k&an zBy2TG4<(NqyHdJvBnD+u}C)_DJ$&>ic zFAUJ4e@R)qnktF!fGas~kAE`+ZquzexB=#Vbc+_w2?$d=X2vKyuryO4{R{hCHU3TpqxX@^D|ZZ~ z&>)TWC|XHKW%rKd)xL0~vWs|2{kSU%)#UOpR{bisn=5zzG42S5bDBajZ|C~hX-!c$ zhp0X%#_c1;1+l>EF3>pYfVnz#rIr9~+@XI!HTFbSPE0~F)nBni{*|1({EZT(PV!S+ z1S?!bf~JuxY!g2k9aExc;zR2u-3bmIfRN+yp-VS#dE!UCOHelHIYm9!?XVlM>x;uZ zuC{Q4pbuj_74R>fN&4sFwE_D?lk3(gPvEqsxcB8YL-TKPK;ZHlK61s^1K&T0hO1hW zjIgg?r=YU+v_Ifn9WG99qa2yPJdZ z%P@g58jiySLRl$^Ap-RHloLbz^o)K}EvK%T3h>uLiFC*HmP~Q_q-T9Mz+6ao@-r7} z61#v&WMNl5zK~wzSR|A6`2Fm5XnxosQLPKLm#NCJ#0Ik~V%fJ%aqA?x|3GA?iK<&? zVcZUr0Nk2<7FKwsIhCz5ggX~9t~WOc1sa|`V-$^BC&fMv#I>#|1mfUEMXF_D3yicR z9=p#96*pSwb0?n2>zvs7#1+WYDI~+n!J~V)-tas28-|{8kQsf|9p6>(t3D2f5aAoM&%A-$F8RXF3ony z3H-yQb14PgRv(?NyB^&3*_xF8b~J6$%>$EE^+EYp(>xQ!Pa}PQH?7Zi2xa1a57_zI z;qK+=BGla$Hpsa;UzI^AUVKJCxYL=IVmSqS<$`V@G=7=5#zt|oe}(ky_$4uhYGsc+ zY|!Q89_C#0&*7Xt=c=cgSskn=KNH|Nh&?~Ur7{m!-$IHj!^7u9FNE|Il&+}xKCZ5! zcKq#J51`02bsSO{xY7QSFt*UN#YEfVaUpd+#3ho)z^<{1>Gl7pPUrNJ@C_6Nx4uh7 z=fhy4`ffa)(eOm;ttRWOUGhWklrzV>M zFZ3`w`!v~zx}^GGBS=PHe(^XmO^NnUz?67O?wS^akB=w-LMzH0={W>aQym!yYv zbj^d6+)8qb2I|YnCzBM6Lh(HmE?ypytRiob+u=+;MV7@f@j?Ovtkp{b-meR7WGd2% zS4|^$w~F}A2J6wKEsNbEWbq)xid`XmVLKKsaY|Ba(2yqywajrj0JXdk631FdPJJrB zGSU($=;hg#2iG*W8ymeLq{b#j74MQMCEj>K*O4F`G7`!V{_39RgRHaddJmEzy50=G z_*WQ%j};4S(zi*POv1G`#EofwPIO+08VkQZawSa-F9GY68+;)c3@3k#3&3rVun|nd zA9$KCOP0^Il7)IJf$K3PNqv1IVdp6-qXv9t+M3(1j@|y~Cj#TV@rGRDYAoBxr3Etp z%e*p53&2hpSFc^yw996d7yJf#G_4buhZ-J>_L`x z=jXn{CnUv>b@$Ga7s9R8|AF)`Ixs^a`Hh62KcB=wyTf$4ZKAfR#I{!pIwG=fV9=CNfZ<2c^(JGWta^Gx6o&TPk@o3icCt`a8KEuEt1-Q;#lD85PP>~E z^01)v5@vXNk!SSj)cJJv2e}#<3=Rf$Q4J>5q@B-wss}^)?|1=!00HO@yqaGC#sxX0 z3XjkR zt=tQ#hglC5^2~XsJ`#Ac$Nq7CArJ}5F@oEVdKLZ-svysZ#ggq?Ig6iDGi#zJBjs%_ zCA0%Z&1f`O!KvQl&5M9ZKn%2Qsp1cKp+_glCEAm4*<|wy0N)9I*{jQiDYm~~b_yO( z9}y~E%E%=BE1Ny<9fX2XyZk4>&^OVFnd%?Dle|Ph_5I+)e6Up0?BJkoIMysRzL1e+ zU(;DxH2-%TG{YV>n~Q^(y;=7jqNLNbBhK=fJR@RMM|%|kI)-1(jjJ;4L+_g1A?kAp zvA=44ylM%)3J|sy&TBmKiUMZ$j}vD^&&vwBJB)c^!DoDBQ$Oh(-klPg zZpp899vlIvMOFXP^Y~c!)=42^r!Er!kY^z5iH5Fe5#lsI5*kEozSmMnVg`S|`#Dl9 z?#CeV@ceeJoh{^%%Q#SenFtlfAcsE}vV0KL6Gof_CWb9GX#OS0;%{^MY|w5m_GH}k zKI{f71u_ow)Wb2y+TG{JuWH(XC6$I~=z!?xA$tIwf}B14tVnag%g;%;{GnX@QT#$GS_!$>_ro+9C9z^F6ed7T2&{CXzM_`*ibG0#e28Zu zuQ^6zC5|9-9QD+iegKXC)cNK)ywem<{F5g1n|^)i8iVrZ&zvyztJ`;F| zwYwui%)UmdY(X# zRDq%dJ~(0rT8g`uyS$EUup@OOq)DGvwdU`qA1NWL&es#FDFyF-C_|;vnie)x$(O|R zXT>>+CN09UXXEQ8GL=$bvY$`m|h*>-*Y%K`>^d+n`5x@41iqKwmqf&w)tp9@+yQ z1wvxH6n)1>+jS?@e?t`Ru{u=dU`X{L$Qnnh#@)bIEroYShAvsiYiofr5O79s3bZCk zbqL-qJkEMLcOq(5(XbS%LWFbva2X^=)%5}z$#~C(kmQ!;rNS>;b-?JwmngP4mL8>kI?7>>mO=RS~D1pM=m1`Q=I%I#4+dvwV5WRl0xvg zrTa}2v=sRFqN=XQ2`sGMW)D4u&=N;;Gn%Pt`M}w5(hNbv-^7PkV!?@Z~hIpf6q;&~nJObDuwde$A4r)TaCCI7271 z38|T89vhw;WcbQ)SI)|_4ry(@hW@wVd{9#fbyn01qFNc`!hePTWkt*!AIN*=wd+i? z!1J7bbhy9mM}c0YY>)^#{0N4jX`q2Bylw}3Tqj%O>=qg!?-clI$vs__!ViC~+fC3} z3A&bhczdw4KT+Wc@0FP~5-+hHy}H^cPZ`&gWLYm7b?u=)r758xO{6KSw=Vt{?)eXb zLMVQwF8cs%v&)}Q-=yduc3QH4PtXKRy1``QRxaf~xd4um*W->~cf0`w*&16@JNdb4 z($96e`9^nEeiIsfylK39d1ko0U}?SO&FX%XB6fH7?uUcCT$9eC#K-h{rL`iUG$>A~ z$Gk9r{_8PLO61j?$_=TscrVL)l~(%dErK`|>+$3Y$577n=qXjEvkXIe56s8oFQ~Fm zdpSH1g{j%lwV*vI)^PBJi!terhsO9KAtl739{l6%wHN}ZAjJyyliBCD%FGM#S2#*Cl0HCt*F5!i7{01{oJ-kVhI_M+ARy)I& z+tv$^tbHLVF`FST#3A=Dl`?cgb?SouX@5!%jX)y4E9rm}1WGIFHTi0L+#CBLE9axP z!S$0NNoPUI0r+Wt&$~dnNwY%;)Ne*QYu3fh0LwU zb0?NTYSes{p)cq}#qCj=ShlO5o<0t|ndU2V$%MnSU>=0LdZDd*)9oraa^ekxG0bMd zZmOB3)yHin7s9jEugF}8Qbs&pPueAk)y8SInZG)dz@$kRXR+f04nr`AB|WM+x{#{6 z)-CGPAxl%Zm^+tX4O zS_VA53JHq##))niN0}l>ot`(0NE78s3euM*EIxJ9*cWd~Ll3I*!mx@36H(}R?1E;m z(*G`@(nnt6E*>X1{~v8%=bjrL9uw$u2eqniCp;frL ze2^rx^`u9J@n=30mSoDkfYTqGY3Nh0(h#%gAA7&62e8P5!l*P!=$>#`u0RrVU^Mpw z_5luAM-S~)Z_@(aEwie4p6{mgqv3JXK<=T8pwp_QSn;0yYp_jG_Eu5__uw#I=XiHB z%h-(G(C*w1ZTtgKvfTJ@WqM)e-N6c%x3F+TCg_CZb5-+!nr+<7pSE!=vIRysAp|^% zcTdph`RMZdzb$G-NrzLSKen7c+cj@6Hi%w zJQ1!NPNr0Q^!htOYJN>StBKDF?OS^NjW;{jv*v#R@ufC0#t){wPwO=`h$Oe z7CQAq(wP{$v)F)dvyv+wS_H9%N2W}li>=7bv=Q!Oe%`{lnhqj#&47wB)88nR%lzPa z5Ya`oHJwu8Xc2Dc@D z=R4{3FWCtCc{{u%WN~g&z)+JFdAE+b7Ouj%(XH}@89+LP5(QHK1ra6>5a=ce`TTjQ ziC}u+ED`j>xOx4uR8az~TT#4Ugn}uqZqe~aH%Maci|gOo{}(V>K$I_Oz4z^OnnAan zFN+8Ve;Ib5_<@4M3G||+$T3G~J;rZ%v?vW^Egg@Gg17$80{`B*Prh%w$2mEK_yHyxp&-c0>BlV|fG+Yjz`%U|Q_S{t1 zj5}|hmpP8A0bZ4Q{%))W;3_ka&(d9gXv8AnCIJ0sUILv@CLka{*zd@jxENBib!&)@ z&(+&~koK_w3~U1g{BuL4{H~zoCILmdn#(l_SO@Aqo4ok(Hta@oEP(i}hJS)oNZKz#9jxnQlP;*AA z!OyfuvyU>9;i){Lb(d8TbG~a3p`RaQ8Ek_ znkcolmjr*bWRk3w7l8#(bH6qkDMS#?f&62pxKla}5V>y1ce0^;9DU77S=@DwuF>)z zu+UH7Y|q;Ovv%P%kx>JML7}PaQ7)vO3;IM|i26w?LkVaH7fMQPdoMgkMH?d)Wo3ZF z&Vj$g^1qP;DAk=nKl|(Mx4IBakm}z?-b$crC7U6xS$~G;xBixi2U4n7&p6TG4bC`i z{(4YTdEN&7+plOe3|B&=jUXnAV2V+b@lW|scK{&?(`9N<`GAwtSSO!OwhWNWQxH=O ze|$nF%h!;rwTyIMGAwiY1na-kZx4()I_wJh3%|)J- zXHt3g^yx+T38XwD?sp`4l3hF+c)7};YeEghhnv$y z(DfdOvxTPkjX9tZ&dk>@e%@X`98!}HYNg5Qodv)(raJ$r87R7x8;^3DeOn4MU0QaS zzMYCk7fF==jZm|mgS@qPp#}oXnt^Wvr(jn9INg)E(BOdo9IlJno~Q zC%Bb0;gs?GBK_^1w#@J#uuS{4sug4 zHJ`nUuoCw)1lNozoB|NsZZiX%EeFi(&?bo4Ooq7x!jMqJw#6N&;_Hv?y>GIrc0(Zx z@Dk7%U;)O~^VW#jkYz0skV9K?1=tT$+5z~ll~$sl=>1lGt0U?>MNnYiN)o!B|Nkc+ zpn{xU-Uq)~Ove^#BnV-XJL*0^HwO|H zI~^dc6C@^47fp$XzW?;d@w~pNH`XSUS@}anH-*8a_wh5~CoeWUVpT5(4EzGGGJ|Wp zriBC`02svUsV=1}Je><&l9~-B?m8Z-{l&yO;VIzM{an&wE3wF+Lv^1ov!fM0UOM~9 zxs*JYC99@{O$6?Ww9NO>YufOi!@iYk59H~($VoT!#^4X2pPIc6_EXL<-h-Ye3Ana&A#OESqV1R(Pn={3ZDvUSAuaVEm2_G(1S zpoV9$QD9hp87Ro%(0j*1g+$;drXCX%&SN}q53un=k+%$oy7+niG7&`ip#GZ9L%Z~j zU~+DXOC?!tLZTav(C7;;(00{kE}uC;X9pqS^s(j&-IS? z9QGpDYi6JQKHoE`U-texe1RSq=Cwp{s>4=Gv+hjlhEmfknBO2GK17TH5%Wu^G~ETP zCX3;cL09W*Zd)kTJlVhSi4O|UGiAOLfYTqBW z{%No3YKX@Oyz8{V9W_n=6KJbb!32A}$@DZcAM5G$aE?h#-BIwe!5{TLslvGsaL6-J}Y~eA%pp3BAEgH=SOd6V+!9<2(#_>hY!Ys{U~t)axn@I)C%r9oE;5o&dk@I_*<;4@^PVUVYxW5~KV>dPlD=;UqTs`TVIeNV4=vNHk z(x3vPu_a8dQ*Ssti&?Pc2wzeB4gT+ec<)fncqi7B{`Djggc*3MQ+5v+#!$qzw&iBFV{QQxB=cdS9pKLn z5W~2^tW@zfWhFccaa|tyl~`c=IZ8*BwO{DLlbZuN1QZ>cN zZn-cqwrHxQIZtAB~|Sj7_cqX&NElWi5?v97&OH%A?7 zHe-iPd5zJo^f|x$K>%p+-m&)6FOSLa{(NHzo_yFIWw6n!HZfUAo|yO7jJi81%J6|{vNBoV+UxtJ1w=(J4s()ziALnGc@kw_E4!eYvEDEo2W%w6(DjXc_g^etvm(f^yB-c{Ufd}v>r|I2ee4>dQ) z?*7v(>w~XnOxxbY^bV>eusH`c&ijZtb6v&1U-wfi4j5a%)WpUEH$^8}@8jv9?_Jpb z0XDsh&^p%b@auF%e_z@9cZp6b+L9b4Q9tU`m3G`Y z4%dEI1%J8tob_QL(hS&-owV@0rAU2pSB4YW8LU~;ZS8v-rqxXhhPRgDq-*+OSB6+> zHCn(+_Gf4%w6I^5b3Hrb=5qc->s&#j$-CV9k3P&w_r>#(SxC2RLcXyqdhT`M{T}su zgwnbey}HLyTI$kEQxzX?p&MV#+!d_(JyL~9^eG>*DJDJS*H|5oN_v(BR%pJk=cA;j+B;FCeqP)l5Es z_S}z_dEb=qNu;@+1seWi!>{%vQa-6UC&^w(ZRu^VEf&-r4dqdEGpwB&sXLewe5fmp z`vtZ!Rbx*n*v{2-s=Q~PiC9Q^!7(Szo(D(}Z#{5mevEi6FAhnJ`4j$pcGSdpZ=uLa z9J+4J&Y|y>#vH=A^RUfiR&rC7dgfipY4n%W%?p2@4j{WH?&u<1iV1y$quLVF#_$a3!}P+bo-Bg-?rJ zL_}*IUzUyeJ!$faRn1c5A#M2a<{9j2#8usy*LX#9w3#n3J)EgA-QDsz=QNkk4qLr7 zP9T-un@L+r(WNekYNrsa?gFmigR14)DoANsrSRr$aG01ksxMPaO7dRZm)fb_{qw#b zIA!l4CK~=J^PW=)y*Y*@`2z>?_avV!{e569LL=dASD3uF(l3ind;+ zB`j+9=CDhR%nnqkUYe({x$*#U{j9mnF_CPqwyC|n|4L$MrfpvSd<^c>kfyegHyd1Q z(tEM#;%m-=E#W*xEakz?$DWb6ot8NM4JADNP10U@loe+xER(N2v)9@fkUQ=rw!dc< zAI+?075i8KiuF?ZF%S6G^=mv`-%8;c^NWf+Wn$TElwVOgQR@W*!ZEEC`xZ-jIFxN2R(I~B( zo2ia3-7hSHA5$dXqw^yG(Gd|q}6Q9 zRPM!Mj4rp$ZCQ*-40v{^-!3v3@yRsi(Y8nPzrls%D;A&T@SHijof1jq6RZOW*!3k5 zd0B_dJ&dl<%m~_e>MKV2+wQMrUu%AJu9K^6e_-apym3&go$SM@1d;d%uN&5hf*MV& zb^-Oh4`SflLfuyUeD0JCx-rC4UmtZ}NuQa$tt7K{pmAOG`mf&{BkJO_=UAmYOT1>( zJ9GIYGF*g-H082Iy!ZI@RYxyNAMRVcy3uUqdMwuQNLA&$oTEvZ4>K@y!|u~_a-ibbJkuZMk@MZ zW^+o>n|P_@w=KHoun?fR{dnSVEmPiVg>qi5pWM4x|I6?FthOj`|y>K!!e>_ColzU@x@lVs=1DYz6B`?>u!OH}bGVRCsK>TAGv-RIgb+H6@eYe&JSZvkM&0y@1Pl+l?d=B?w8 zu;23g>y(u@9ywXLZIT#L@1LTvD!S&tlbdZd!fJ_2sJ3mfQMDdOnXNLY!t7*a;?EOO z)v!s6P{mxWIaq5q-qLK~vDLn>DMTdf7G0yupv{G$#8O!ai}K8>r+OR$BWy!yzD8gdarj*dmxAUO`m&*0L`QaXrc{{{HA`PEMsK z&D#@pm)`eBD~pz%4RxDA{qpQWi)N;N!-xicn!{j!8pv9ymrhj|-SkvKi{4@8l}ffh zOw3%0^-+D5DPs4GDbE4NX>sT2ITW+LRKjv$Bb6E&RdB5?>NKw4T3eaaS}Qkm>1lM| zwdIpVb`M#qLiqm%uB}JDdC9x@ovPS$t7Sn+hgZbi9XzQ<2lBWVrRNwr~0H zLy7B`+<|cT@Vc>sLHg|KY;T7)W9(O-*vr_d@cG9|Q^paQvwZWIeKls&OhZ1`%Hj$JyX1`f-=7!52=w&F;5|2m-|u)Z^qVXuIG!>~G0XJT2pW6?_g z8?MH9#X&L$WeFDhVm2w$EK5`Yy?(Wa^F(ko&xxqMJJ*e^-!vOr<1o7A3Lm@~--Sky z{LGZVeRMrGwwBtbDoXMpK2|pHX|wxHk?z00qV%FUQkpV~(q8#v=Ip*$B#M)+xS+A6 zCc#HA1WRmLS}~#E=(j6zG;4To`b5(x&rN$)DC2uHSNJQc3!RTu@ z+a~6)Bd^~@;rfQYq@TUR_%u3wMD&PwID6=J=JCmj-^vm-y2q`0-jZV@&h1Q9W;@59 z%I@~(6$^E;S0t5iVP7{+l=^3W-$o+FUP=fayV^|y72GcpAsxk%+bfj#^mzz#`H5(;rKh2P&set+Cu#M zckJwn`_t`J^E2tnZMwOz;=L5y*b$BUsMiHvH?V4S`ey&9y)O@kvTgqtN-7aOEo3Q6 zw)7zTl2QtdWXv$uvKw0zvXfL4X^?D{XqW{VMk1tSnGi9`UXf*NDH9LL_nhZR@6+>p zkKaGv<9i(MA8*IupXQ!>?(4d*>%7kMbAHax=|pX0HwbJZE3Fgbi(#V(#%vosET+ZI zf6-CXzqtE`uG7Kg1xI&hs}M5t8A?ZW(81W6IkkVLrRA%1Zz=-Y`A|Gz+B4#=?|w@9 zzP`wp;-oX2T$p%~E9ErodH!T+DfSZ_3V65nHy7cc*%)`XUclhq=VokJ$W)f(T1m>v z9qV2-xztMCM9e-n>CXe|l=Q&i_igOdRW86s)vIKK8~VGPRWxHh>?;mt1_snRkM`OZ ziFi>xRz52PCJ+Tqw_xerr<6?D8?pDIvaO3HOlQ;S*y&&{v~LTM*V3v)6T7g2iT$3c zx~xXk`rQK^X1e*&W+#>FZ^cOMLy=?y*KKC8Hytnc)-?@HO^S^6#4PXUCU_j}-tI(| zer}K_C!Q#Qp|_^hEKm6WeJf}>D}KB|CNJ~DKur1RTK4&YV^!kCle3-3lieaAlV_l6 zg!ua2YmWnS3a6?rA1<0I2M=e8<&tLw4m>Wc1}$A$*a>wkuXx<*tm4${) z*x5j%kCkieS5^W!>^>INu2)&62z`nua2>2Ie#>JyBS8mW2UXm zZiqv*&p?nhRX&t3os~@(0>AYfKPf&!BA69Fte9PqI5x3RYM3bT`6&l4*-Y#ujbR(u z?;Kq45RygfSE>HKraFsW_XZ>GRzu24_$#&&%V=3 zjBy zP>1-448<;G9VS{D7~AU5$5{|ne4VbGsc3!&pgY;VCVcvQiq-_VWD*1-9|7$1qN?>U zMx6VRk`W|p9+50Gt`S8`b>b8pdpUX*QOkvg9c#aPZ20nycZWb%p=&G4qDZGC>K*|B8Df=kaaCl#dGiWV;>zE%Db|2T$j9?@9nBD&K_CFF7^-;Su< zCgP=&yd;ovDu()$w@3BO_KYWkp~Zqjo*8L~W{TyJGmjXg(a&q_lOy4tLKaTzeVV2} z5xSW-H@RRiDUC*R-Zjes9s^Gv3+U>MG43ke!=YmFPUB_0-X+lPp$=jH9i(_{FH=CJ zq|iI7NLLqT`75j`EexG`{FB5TM24!r|8YAyuWdA^7ig$S1zB`mUPBS*S z)A)%Ngk8hmA^5cR5q#Kl%Egj*Irwbq@5XIF&O9|=kq#khWxwP8C!Y?#X@CY;{fO*a z2gdTRCgF{)HIOkSyGB{Cj>jqV34YmZw7q@El*-_S@plD{F(Zex))u9SvC$}&J6^-|ATB>fW4kbC*pE!9&+NO zNES%6V#FjY~680D+BlwLYQMfo+-WclE zu|`yh{mZ+n_n6>NOvFr5XYtwhhu^3nrp!ky{nD^VKk}xcBN)+5(#i$;elpvD`YTg4 z5BG8?k}s=f*dW$MfLcjERqk5418Il!9YJN-!Yk`~0k~Z_m$zip!SLtx=mVB&Z3|}` z*Y3sBhv#1d;yJ9jG+(pQAMXo}=w!9gvQ8V9+Hd`PaZYf)DVkod(nIGQizl!r3ul%s%kS!kMyXIoqN;<&4Ii3_!A_H{2zx$vd^O~> zNfS{5i9|Br?F&jSH#{Qwn6}RF9Zkep&C)2W=!7H8Z*;zUou+we^_%D?!`fj21Sp*8 z1$J)V42_0eG%y*T!WtFtaC=TnGSO_Zt?X*XAFQ*eGo%o!b5-jNSE?Z<_f8^GGKP<< z0`%u0yovjNy$kO^rsjQfAUbH$(QHn zP3CXlOFVWNA5f7(BAe*e2#Y}g7yD=ADvQh_cn|12xxaKo^t>49eSDO|_?Fc$DMmqY zJRxJMNG;*~&Q6iMucgBC1NCzQ?M;CvDIUjo9~~OCb<;U%A0cxxd&x$A3cNjjnZ-24 zCZ+!nuM@UPlCGw? z7$!<~{w53<0{#do6Tc$MQRw~#XNK6a-5L>}ydbMZWQ9N0cCP%<)E$d6?B7o4 zUW+}Be9g>`*41mTI2Zo~&Z>wi-LdC)PfW}8zkyZg?8-MhxktyM`M~K{dL&C>il8v- zAjY^!no$I;YT}9yHewYG;&m;I#0V5wMRS*v69*-O2r@;^%A|1$k=z4)@@%_KW_lf1wp895-C@N18!&3lbBa%eX`1U z-gR|mS_dbr%#H<7i0*Ybb7z+qo^Z)oCborCe}&@tp>RAWE=#qi$5g8k`+jB2XNNj60={;&@{n82KmA%(HTK{N@PJlx9P}(g4Kk9RIug z5;~uB=ljli7vvv7eI{_d6*#F~Y=cR8>#mcJ&%(+&RFJVq3GUCgti8u6B-*r032_rS z_vD`ZD?ZNaIs!Rb4baq^iK-^A6>4!86koSiq`9C~5a^C~y4j4S@ z53sg|MveyasH5|-3=`2&0*393DWQCOBX-9YIAp`rzvjboQRKyI>nV&Ik}7Kt1B4*KcV2vkQ=xjnLG6K6M}o?4>i%wmzf%?`&We$O zMDGWA@nKrzrZ))b|NCJi()HL6sqr7WcRPj+6F<+lZ=`rYTpx0E+n2Z3kxuYf?MGM#aRDcVv42k^@!+k_t?MBePSk6QKf)*NvRe;5 zq;uq2kY~M&5@2L*djKPgL9=6++qXE;MUAl=E&-$$;e1Lq5+=pQgZ3QnY z_y8a$|9;S0IO8zu6X_Rt+Z{wQeB(BOVNGY@PuVGY=;foF7-j=5oqcyCc^&`yiks`% zSyPIAa>Y&YMvMBMcE?9z4_5`GlI1e7SYm!$K&cb`a5`kqj9>wNH&i`#YWMSpWCe$B}@m@f$%_O6bBre@hR& zlY?6_lDx>HO<|<&r5^h66}Y1q>3Y;9z{{4`iC~y7lX_U&{l^^>QT2LxbF=PkLL2IDuH?3Mvi{SxF@* z-7K)H3hn}3y@^gj5_B3?J0$VVUY5eRE2DCFb#+A535Y#UUf9hS!UiHc6aXfyA^d>~ zQg2X}7V>Dj7q!p6y3a0nT(WZXPKYNEMpRvzcW42QK^`}V8kk&Cka|GL{H0X?*U zE}KL6A1o{cm{#2YQo2L^B>5B8wKdbdzcTOZzX90K8sN07lz zul93-Oi;^p0oT86+#_OuCP%&?9My-9eDV|N-#+72e(uA>^?*?Cd6rpz%}MZVxPAh8 zBvq|o_1j=}aB2w`1f*qTV&~WT`PZ*A{zDjCpYWg#!PP0_mej*54n*y(o=xysq|Y+a zzr7H|w1|3GUHoCf#A-Pc(=Kq`U8vWp9=Bj2{=I;lO#u<({ET&fTlPE&$ktuJd2j>p zslRRfn{GTCg?9Gm)?g13i)BkMw=GW1&{<`ms#mB2A;K#OJ=l^NY#FW-JNhwk8%j$(*leMwa((>+8 z&ro!{+;aEeAiB_o#lT->Ys!}{$Ykc^1s`yI=~Ulnz1xH;UO`kSz6W=vP*qz$MMLcHcUupHDE0<69Pa78 z)N@VOIckRBfcfQ^psYSjBepdf*4Zw_znz52PErFok^kEPOQ*8&7SD?8s8bu5ZJA^2 z;7Y^MCbgYZlua_%{@g^AJx}#L(F+&%p9qcSJ!PlasQ&5N&VM{>8l5v?jf7;>q5Y#c z7;D3tf1HL+Dp8JXhK8rxZqhTkgfT4|4ubz$uiZ22`hbtN1iO-zVe!-2n3n)$qgFsN zodTM8>GRE6WV6n|KHn=@fOCDk!xGO40RkP1u!M=308U%+8jf}4-^lJzDh5FI;6R>71Hm3rc_BJn7-n3Fo1EjW1s>sFpD@ag+i8hU4zoO2^6G>i&|Q09 zs{(69Jwq$7us>)tD}{zNG>r9v1jpB+h-Hte?_jK3p~%6-_?CPza2YFBT1Up{q*PXc zvMMa{UdV+^wx|uBU&cv``gfiZB5Ts`^4zg(gwEK#=t)R}Q;{Yb59UU3p0N*ynFWsq zC?&0$FLhVGo%@pz=+AVF*D}?w5fn{@!xH)QQCEa=Nu9InaP!u}adI3(9K!?n_Bk+F=(c;?;n>N^c zZcyI*?K1zb>rSuL$sf2+ChsI7SkNH?@EF$lVO@SU+ZM74CTO4ujkmIzLA9hQHvs#| z35a~fER|^QxFY-r14>Jx1k{^|A`g)rktvuIwi+Npl`Vhmt^Ca2(I3#;A_Xin(0^8S zc4wjUd!LSD?C4s-b8eMzUDgE=KuV-)O@w7xy%j(w{~7G=&Jd_*iJ;#F+U;Y) zbAF_A63PG>>R(k+|AVh(VBs(RL&RJu#Ov<>Un_uMrR1z3G6yXbQ6=4j+j8(`05Yr-bny96AaJ`LxkFQAfP4ariQUTA7aWn~q= z4&6AYi9u~sL0!QwGqe$oUFJib=_q=he+dXupY<|4k&=?)X?)&4UK2zNM&9lw^_A;_ zx2!Auy=e1447)}O%6T0tNg||zO@4`0uzT{hDdQ3eO2SQaJJbxJCo2_k`}f)`BpMBR z@6H~5<+H&QqCCDU4IAv;?Fd;c?+u@U!8w_mWa5W0M@$urwJml)PoQ?h5^CEcU^fLk zC&z5mo^}3nA?MEGdeCwAQaKQ;!pM#*jAP;RdH(BqV0n|{+7C>D|?Z-4D6Lr z{MtO#Gp|csoPBPhylq6mB@*2V0mat81r(l4SjnFC| z1MY@>m1)t$2f9PTs0K$rpJx1u%mQ*vuKK$%$X$h4qq7WCbP1$A{>;#UM`avQC_kys zt1}$1*JQBRaycB>j5aIu8gS?iDtsZGAk>{&HfhQoHtPsr`hyx`8MuuV*C(M8*<6;y zB^vsWr0*rIOp>30W7}3WP#<7f#=-Biyp_Prw5{SZek8n&q$OIs#K3WGOkvC7n)@sdS+}X(kRY-F8eU4jc$-@M7eScQV8&f|CVE zbK#d?b@vmmwdlLvq-*QpxqtdTiBtNX0HGrCIZZC&#ZxedsdZ$P`#oM3-Nw$kuQWz? z1>RBBHY+p3APud8(ol%sy38>MIXfygrMJ`&>B1az&Gfz8+ib|h?jtLu;rix=!0eqD z5~=$1Y@_#v8K3YkLKf4YQxTBX2EMjNJKg+rK{5P@4f;-H;EeYxo%u{_4_R*LHk2>m zjo|6pIt)cq6)KO2UmzuU4tZbsCd%1U@@4w;6F3#$67uda@a7(x{;J2yW?S%Hw9ERD zzVFnw{Ud^$~H@osZxObC+*ptujGOPE)vF;Z*8S4`|lyQxUf1IzJ0DP;V9jHR?)q6pmgmP_6 zoyV1{MHZR0=C@wT=fCpw`u(YPAVATZk{PSB5~&x&imh&J{2)}bFcKW*UN~_>|41TT z{m4y^Rex0M0t6foArPbM)Z{`BZEHO?qMVx6E0%3Axs@WgWk;U=&nTYArw8hA1s7<1 zgCAm1QaUZ8>90e}Qktk&&Tpm&njIM1xcYvJB_o^bR7W&Wns!-uc@9PH{62W0C%^I~YT#45w7ySjy?@yQGiSsc$}ktkiDAFD>69}vM?cH0my zua4u-w;h+NSLo~yaVSg*^~2iap*!LvjddrOtES@5k?Q&KHy%MlEt}VNo3l}HjCWx> z^Uu7o4a^b_n`>zi((mI#Jo$-1&c*ob`8~Lg@iE zV&S=HW+FZpS>@e+KjvjJ;*Ve z23)^9Gh3A3dbdY*O)jA6s9ZBY)%(USboS_crQ;2q zu9S|}r;S*bXzqVvN`I|N5rD6PE+LS=tW{Xui8}$M`X%Q6v4?{sBFQ6LR1vHA($Br_ c!uehF%EjWN4>)S~vcW&Yqb5fR51+pHKW>VG{{R30 literal 0 HcmV?d00001