From 04da2cea0e779f642fcfb16103ddf886b536c509 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Mon, 16 Mar 2026 16:05:54 +0100 Subject: [PATCH 01/11] reorganize docs --- README.md | 3 +- docs/about.mdx | 34 --- docs/comparison.mdx | 55 ++-- docs/glossary.mdx | 25 +- docs/guides/change-panel-domain.mdx | 15 +- docs/guides/database-hosts.mdx | 6 +- docs/guides/disk-quotas/ext4-xfs.mdx | 43 +-- .../disk-quotas/{about.mdx => index.mdx} | 28 +- docs/guides/docker.mdx | 42 --- .../eggs/creating-a-custom-egg.mdx | 22 +- .../eggs/creating-a-custom-yolk.mdx | 3 +- docs/guides/mounts.mdx | 16 +- docs/guides/php-upgrade.mdx | 9 +- docs/guides/ssl.mdx | 286 ------------------ docs/guides/uninstalling.mdx | 9 +- docs/index.mdx | 56 ++-- docs/install/install.mdx | 34 +++ .../advanced => install/misc}/mysql.mdx | 122 ++++---- .../advanced => install/misc}/redis.mdx | 4 +- docs/install/misc/ssl.mdx | 124 ++++++++ .../panel/dockerized.mdx} | 82 +++-- .../panel/standalone.mdx} | 163 ++++++++-- docs/install/wings/dockerized.mdx | 85 ++++++ docs/install/wings/standalone.mdx | 115 +++++++ docs/panel/advanced/artisan.mdx | 267 ---------------- docs/panel/getting-started.mdx | 92 ------ docs/panel/optional-config.mdx | 107 ------- docs/panel/panel-setup.mdx | 56 ---- docs/panel/update.mdx | 141 --------- docs/{panel/advanced => }/plugins.mdx | 41 ++- docs/troubleshooting.mdx | 15 +- docs/wings/install.mdx | 137 --------- docs/wings/optional-config.mdx | 155 ---------- docs/wings/update.mdx | 47 --- docusaurus.config.ts | 6 +- sidebars.ts | 99 +++--- src/pages/faq.mdx | 12 +- src/pages/index.tsx | 8 +- static/img/docs/example_setup.png | Bin 0 -> 235694 bytes 39 files changed, 863 insertions(+), 1701 deletions(-) delete mode 100644 docs/about.mdx rename docs/guides/disk-quotas/{about.mdx => index.mdx} (62%) delete mode 100644 docs/guides/docker.mdx rename docs/{ => guides}/eggs/creating-a-custom-egg.mdx (97%) rename docs/{ => guides}/eggs/creating-a-custom-yolk.mdx (99%) delete mode 100644 docs/guides/ssl.mdx create mode 100644 docs/install/install.mdx rename docs/{panel/advanced => install/misc}/mysql.mdx (96%) rename docs/{panel/advanced => install/misc}/redis.mdx (95%) create mode 100644 docs/install/misc/ssl.mdx rename docs/{panel/advanced/docker.mdx => install/panel/dockerized.mdx} (66%) rename docs/{panel/webserver-config.mdx => install/panel/standalone.mdx} (74%) create mode 100644 docs/install/wings/dockerized.mdx create mode 100644 docs/install/wings/standalone.mdx delete mode 100644 docs/panel/advanced/artisan.mdx delete mode 100644 docs/panel/getting-started.mdx delete mode 100644 docs/panel/optional-config.mdx delete mode 100644 docs/panel/panel-setup.mdx delete mode 100644 docs/panel/update.mdx rename docs/{panel/advanced => }/plugins.mdx (96%) delete mode 100644 docs/wings/install.mdx delete mode 100644 docs/wings/optional-config.mdx delete mode 100644 docs/wings/update.mdx create mode 100644 static/img/docs/example_setup.png diff --git a/README.md b/README.md index 7e7f89fb..663d06d1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Pelican Docs + Pelican docs are created with [Docusaurus](https://docusaurus.io). ## Building @@ -8,4 +9,4 @@ To test changes locally install the dependencies and run the server using pnpm. ```shell pnpm i pnpm run start -``` \ No newline at end of file +``` diff --git a/docs/about.mdx b/docs/about.mdx deleted file mode 100644 index 4b28d022..00000000 --- a/docs/about.mdx +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: about ---- - -# The Team & Pelican - -### Core Team - -| Name | Discord | Role | -|--------------------------------------------------------|-----------------|-----------------------------| -| [Lance Pioch](https://github.com/lancepioch) | `shadowlancer` | Project Lead & Fullstack Dev| -| [Michael Parker](https://github.com/parkervcp) | `parkervcp` | Egg/ Docker Maintainer | -| [Charles Morgan](https://github.com/notAreYouScared) | `areyouscared` | Fullstack Dev | -| [Alex 'Scai' Vlad](https://github.com/alexevladgabriel)| `.scai` | Fullstack Dev | -| [Boy132](https://github.com/boy132) | `boy132` | Fullstack Dev | -| [Martin Oscar](https://github.com/RMartinOscar) | `rmartinoscar` | Fullstack Dev | - -Core members of Pelican have a light blue username in Discord. - -### Community Staff - -| Name | Discord | Role | -|------------------------------------------------|---------------|---------------| -| [Trixter](https://github.com/TrixterTheTux) | `trixter` | Moderator | -| [Quinten](https://github.com/QuintenQVD0) | `quintenqvd` | Egg Maintainer| -| [Red-Thirten](https://github.com/redthirten) | `red_thirten` | Egg Maintainer| - -Community Staff have a darker blue username in Discord. - -## License - -Pelican® Copyright © 2024 - -Code released under AGPLv3 diff --git a/docs/comparison.mdx b/docs/comparison.mdx index eafd8d45..7f399aa6 100644 --- a/docs/comparison.mdx +++ b/docs/comparison.mdx @@ -1,18 +1,15 @@ ---- -id: comparison ---- - -import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; # Comparison -Pelican is a fork of [Pterodactyl](https://pterodactyl.io). However, Pelican has many Improvements over it now! +Pelican is a fork of [Pterodactyl](https://pterodactyl.io). However, Pelican has many improvements over it now! - +:::info Want to see these changes in action? Check out our [Demo](https://demo.pelican.dev)! - +::: + +## Roadmap @@ -93,24 +90,26 @@ Pelican is a fork of [Pterodactyl](https://pterodactyl.io). However, Pelican has -## Comparison with our competitors. -| | Pelican | Pterodactyl | PufferPanel | Crafty Controller | Multicraft | TCAdmin | AMP | -|--------------------------|-----------|-------------|-------------|-----------------------|----------------|---------|----------------| -| File manager | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| Scheduled Tasks | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | -| Free and Open Source | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | -| Multilingual | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | -| Database Management | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | -| OAuth | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | -| Webhooks | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ | -| Roles & Permissions | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | -| Announcements | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | -| Themes | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ | ✅ | -| Plugins | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | -| Self update | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | -| Captcha Login | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | -| Remote Backups | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | +## Comparison with other Software + +| | Pelican | Pterodactyl | PufferPanel | Crafty Controller | Multicraft | TCAdmin | AMP | +| -------------------- | ------- | ----------- | ----------- | ----------------- | ---------- | ------- | --- | +| Free and Open Source | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | +| Multilingual | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | +| Plugins | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | +| Themes | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ | ✅ | +| File manager | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| Scheduled Tasks | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | +| Database Management | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | +| OAuth | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | +| Webhooks | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ | +| Roles & Permissions | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | +| Captcha Login | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| Remote Backups | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | +| Self update | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | +| Announcements | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | + +#### Features information -### Features information. -- Plugins can add any features that Pelican doesn't have by default. -- These values are not constantly updated, and competitors may have implemented some of the features marked with a cross in their latest version. +- Plugins can add any feature that Pelican doesn't have by default. +- These values are not constantly updated and the others may have implemented some of the features marked with a cross in their latest version. diff --git a/docs/glossary.mdx b/docs/glossary.mdx index ae54480d..fd0972a9 100644 --- a/docs/glossary.mdx +++ b/docs/glossary.mdx @@ -1,11 +1,5 @@ ---- -id: glossary ---- - # Glossary -### What is ...? - **Panel** — web application that interfaces with Wings and lets you control your Servers. **Wings** — application that gives you secure control of your Servers via your Panel. @@ -25,19 +19,6 @@ id: glossary **Yolk** — curated collection of (core) Docker Images that can be used with Pelican's Eggs. -## Basic Example Setup Diagram - -```mermaid -flowchart TD - A(Pelican Panel) - A --> B1(Basement Server) - A --> B2(Rented Server) - B1 --> W1(Wings) - B2 --> W2(Wings) - W2 ---> C5(Palworld) - W2 ---> C6(Discord Bot) - W1 ---> C7(FTB Minecraft) - W1 ---> C8(Factorio) - W1 ---> C9(GTA FiveM) - W1 ---> C4(Project Zomboid) -``` +#### Basic Example Setup Diagram + +![Example banner](/img/docs/example_setup.png) diff --git a/docs/guides/change-panel-domain.mdx b/docs/guides/change-panel-domain.mdx index c9c3b353..fd47c87b 100644 --- a/docs/guides/change-panel-domain.mdx +++ b/docs/guides/change-panel-domain.mdx @@ -1,9 +1,10 @@ -import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; # Change Panel Domain +A brief guide on how to change the Panel domain. + ## Webserver & Panel First you need to modify the server name in your web server config. @@ -15,9 +16,9 @@ First you need to modify the server name in your web server config. # Search for "server_name" ``` - - If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](./ssl). - + :::info[Using HTTPS?] + If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](../install/misc/ssl). + ::: ```sh @@ -25,9 +26,9 @@ First you need to modify the server name in your web server config. # Search for "ServerName" ``` - - If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](./ssl). - + :::info[Using HTTPS?] + If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](../install/misc/ssl). + ::: ```sh diff --git a/docs/guides/database-hosts.mdx b/docs/guides/database-hosts.mdx index 2aa6a459..c0388c82 100644 --- a/docs/guides/database-hosts.mdx +++ b/docs/guides/database-hosts.mdx @@ -1,5 +1,3 @@ -import Admonition from '@theme/Admonition'; - # Database Hosts Database hosts allow to create per-server databases on the given host. @@ -41,9 +39,9 @@ Restart MySQL/ MariaDB to apply these changes. This will override the default My In the admin area of the panel, go to "Databases" and click the "New Database Host" button. - +:::tip Users will later see the host as their database endpoint. Therefore, you should set it to a public ip or FQDN and not to `localhost` for example. - +::: Hit "Create" and if everything was entered correctly you should be redirected to the database host list and see your new database host. diff --git a/docs/guides/disk-quotas/ext4-xfs.mdx b/docs/guides/disk-quotas/ext4-xfs.mdx index 2683784b..5543834a 100644 --- a/docs/guides/disk-quotas/ext4-xfs.mdx +++ b/docs/guides/disk-quotas/ext4-xfs.mdx @@ -1,4 +1,3 @@ -import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Link from '@docusaurus/Link'; @@ -9,21 +8,22 @@ This page covers disk quota management for EXT4/XFS. Both EXT4 and XFS use the built-in quota management services in linux. - +:::warning Please read About Quotas before continuing - +::: ## Configure Filesystem + How to format and mount a device for use with quotas
I understand the risks and Pelican is not Liable for anything that breaks - +:::warning Enabling quotas for `/` is difficult, as it requires booting a live disk to change. We do not recommended this! - +::: These examples use the following: `/dev/sdb` as the device formatted as EXT4 enabling only project quotas. @@ -41,9 +41,9 @@ These examples use the following: mkfs.ext4 -O quota -E quotatype=prjquota /dev/sdb ``` - + :::warning You need to update fstab so the disk mounts automatically on boot with quotas enabled. - + ::: ## Add to fstab ### get device UUID @@ -63,11 +63,11 @@ These examples use the following: ``` For more information on fstab check the [Arch Linux fstab docs](https://wiki.archlinux.org/title/Fstab) - + :::warning Depending on the OS you may need to refresh services to be able to mount the partition after updating `fstab`. It is often easier to reboot and have the disk mount on boot. - + ::: ## Update existing partition @@ -91,9 +91,9 @@ These examples use the following: ``` ## Enable quotas - + :::warning This can only be ran on an unmounted disk - + ::: `tune2fs` is used to adjust tunable file system parameters for EXT filesystems * The `Q` flag is to manage quotas - `prjquota` is to enable project quotas @@ -114,32 +114,35 @@ These examples use the following: ``` For more information on fstab check the [Arch Linux fstab docs](https://wiki.archlinux.org/title/Fstab) - + :::warning Depending on the OS you may need to refresh services to be able to mount the partition after updating `fstab`. It is often easier to reboot and have the disk mount on boot. - + :::
## Advanced EXT4 Quota Management - + +:::danger The following section is for manual management of quotas. - +:::
I understand - +:::danger You should never need to go here, this is your last warning. - +:::
I agree and Pelican is not Liable for anything that breaks ## Manually Manage Quotas + Limits for the servers are managed on a "project" level so they can be assigned per-directory. ### Add A New Project + To add a new project 2 files must be edited. First is the `projid` file which is formatted where each line is in the `project_name:project_id` format as seen below @@ -157,6 +160,7 @@ Second is the `projects` file which is formatted where each line is in the `proj ``` ### Set directory attributes + The project attribute must be set on the directory to track quota usage. The `chattr` command changes attribute for files and directories. @@ -198,6 +202,7 @@ setquota -P 235844d3-9258-4846-bb04-bcff209ccf9a 0 10G 0 0 /var/lib/pelican/volu ``` ### get quota stats + The `repquota` command will generate a report on the quotas for the specified device or mount path * The `P` flag will break down the report by project. - In this case it should be the server UUID that is the project name @@ -221,6 +226,6 @@ cdb26bbb-963d-44b1-8353-360243032b1 -- 2G 0G 2G 1g
- +:::note TODO: Add documentation specifically for XFS - \ No newline at end of file +::: \ No newline at end of file diff --git a/docs/guides/disk-quotas/about.mdx b/docs/guides/disk-quotas/index.mdx similarity index 62% rename from docs/guides/disk-quotas/about.mdx rename to docs/guides/disk-quotas/index.mdx index 0ac5a804..64e79a6f 100644 --- a/docs/guides/disk-quotas/about.mdx +++ b/docs/guides/disk-quotas/index.mdx @@ -1,29 +1,27 @@ -import Admonition from '@theme/Admonition'; -import Link from '@docusaurus/Link'; +# Quotas -# About Quotas - - +:::tip As called out in the Wings install docs, it is always recommended to keep the server files on a separate partition. - +::: ## There are a lot of notices here for a reason! - +:::danger Support for disk quotas is still being worked on! - +::: - +:::warning These are advanced configurations meant for hosts but "should" work for individuals as well. - +::: - +:::warning Depending on the filesystem Quotas can be difficult to enable for the `/` mount, which requires booting a live disk to change. - +::: - +:::info You can either make a new mount with quotas enabled or enable quotas on an existing partition. - +::: ## Filesystem-specific docs -EXT4/XFS \ No newline at end of file + +- [EXT4/XFS](ext4-xfs) \ No newline at end of file diff --git a/docs/guides/docker.mdx b/docs/guides/docker.mdx deleted file mode 100644 index 5e707565..00000000 --- a/docs/guides/docker.mdx +++ /dev/null @@ -1,42 +0,0 @@ -import Admonition from '@theme/Admonition'; - -# Installing Docker - -For a quick install of Docker CE, you can use the command below: - -```sh -curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh -``` - - - If the above command does not work, please refer to the [official Docker documentation](https://docs.docker.com/engine/install/) on how to install Docker CE on your server. - - -## Start Docker on Boot - -If you are on an operating system with systemd (Ubuntu 16+, Debian 8+, CentOS 7+) run the command below to have Docker start when you boot your machine. - -```sh -sudo systemctl enable --now docker -``` - -## Enabling Swap - -On most systems, Docker will be unable to setup swap space by default. You can confirm this by running `docker info` and looking for the output of `WARNING: No swap limit support` near the bottom. - -Enabling swap is entirely optional, but we recommended doing it if you will be hosting for others and to prevent OOM errors. - -To enable swap, open `/etc/default/grub` as a root user and find the line starting with `GRUB_CMDLINE_LINUX_DEFAULT`. Make -sure the line includes `swapaccount=1` somewhere inside the double-quotes. - -After that, run `sudo update-grub` followed by `sudo reboot` to restart the server and have swap enabled. -Below is an example of what the line should look like, _do not copy this line verbatim. It often has additional OS-specific parameters._ - -```text -GRUB_CMDLINE_LINUX_DEFAULT="swapaccount=1" -``` - - - Some Linux distros may ignore `GRUB_CMDLINE_LINUX_DEFAULT`. - Therefore you might have to use `GRUB_CMDLINE_LINUX` instead should the above variable not work for you. - \ No newline at end of file diff --git a/docs/eggs/creating-a-custom-egg.mdx b/docs/guides/eggs/creating-a-custom-egg.mdx similarity index 97% rename from docs/eggs/creating-a-custom-egg.mdx rename to docs/guides/eggs/creating-a-custom-egg.mdx index 6076c583..51b6f05e 100644 --- a/docs/eggs/creating-a-custom-egg.mdx +++ b/docs/guides/eggs/creating-a-custom-egg.mdx @@ -1,5 +1,7 @@ # Creating a Custom Egg +A guide on how to create a custom Egg. + ## Create New Egg Navigate to the Admin Panel and click the eggs option in the sidebar then select `New Egg` button. @@ -7,24 +9,32 @@ Navigate to the Admin Panel and click the eggs option in the sidebar then select You will be taken to a new egg configuration page which is where most of the configuration happens. ### Name + This is the name of your egg. ### Author + This is the original creator's email. ### Description + This is the description of your egg and what is needed to run it. ### Startup Commands + Here you can assign multiple startup commands to run your server. Example below: + ```bash java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}} ``` + ### File Denylist + Here you can specify a list of files that the end user is not allowed to edit. ### Features (Egg Features) + Egg features can do different things when specified. Example below: | Tag | Description | | ------------------------- | ------------------------------------------- | @@ -34,12 +44,15 @@ Egg features can do different things when specified. Example below: | steam_disk_space | Sets a limit to enable an "out of disk space" Popup if the host system is out of disk space | ### Tags + The tag system allows you to group eggs together by type. This is the successor to nests. ### Update URL + This can be specified so that users who use your egg can update the egg without having to look around for where the egg is hosted. ### Docker Images (Yolks) + Every egg has a Docker image or Yolk as they are referred to. Images can be custom-made, and you can learn how to create them in the "Creating a Custom Yolk" guide or you can use the pre-made ones found here [Yolk Repo](https://github.com/pelican-eggs/yolks). They have two fields that need to be defined: the name of the image and the URL where the image is hosted. :::info @@ -166,13 +179,14 @@ java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}} ``` :::note -Variable syntax depends on the context: -**Startup commands**: Use `{{VAR_NAME}}` (e.g., `{{SERVER_MEMORY}}`) -**Configuration file parsers**: Use `{{server.environment.VAR_NAME}}` or `{{server.allocations.default.port}}` -**Install scripts and shell environments**: Use `${VAR_NAME}` + Variable syntax depends on the context: + **Startup commands**: Use `{{VAR_NAME}}` (e.g., `{{SERVER_MEMORY}}`) + **Configuration file parsers**: Use `{{server.environment.VAR_NAME}}` or `{{server.allocations.default.port}}` + **Install scripts and shell environments**: Use `${VAR_NAME}` ::: **In Install Scripts:** + ```bash #!/bin/bash cd /mnt/server diff --git a/docs/eggs/creating-a-custom-yolk.mdx b/docs/guides/eggs/creating-a-custom-yolk.mdx similarity index 99% rename from docs/eggs/creating-a-custom-yolk.mdx rename to docs/guides/eggs/creating-a-custom-yolk.mdx index c18648d4..bb638311 100644 --- a/docs/eggs/creating-a-custom-yolk.mdx +++ b/docs/guides/eggs/creating-a-custom-yolk.mdx @@ -1,6 +1,7 @@ - # Creating a Custom Yolk +A guide on how to create a custom Yolk. (Docker image for Pelican) + :::warning This tutorial uses examples from our [`ghcr.io/pelican-eggs/yolks:java_8`](https://github.com/pelican-eggs/yolks) docker image, which can be found on GitHub. This tutorial also assumes some knowledge of [Docker](https://docker.io/), we suggest reading up if this all looks foreign to you. ::: diff --git a/docs/guides/mounts.mdx b/docs/guides/mounts.mdx index 965a9d95..ce9575f5 100644 --- a/docs/guides/mounts.mdx +++ b/docs/guides/mounts.mdx @@ -1,8 +1,6 @@ -import Admonition from '@theme/Admonition'; - # Using Mounts -Mounts is a feature that allows administrators to mount other directories from the host file-system into a Server's container. +Mounts allow administrators to mount other directories from the host file-system into a Server's container. ## Wings Configuration @@ -23,10 +21,10 @@ You have to restart Wings to apply new changes to your Wings config. You have to configure mounts in admin Panel in order to use them with your servers. They consist of a source pad on the node and a target path where it will be mounted in the container. - +:::warning By default Mounts cannot target `/home/container` or any of its subdirectory, you can allow it by setting `BlockBaseDirMount` to `false` in the Wings configuration. You cannot cross-mount servers such as Server A's directory into Server B. - +::: ### Creating a Mount @@ -41,9 +39,9 @@ You have to configure mounts in admin Panel in order to use them with your serve - **User Mountable**: Whether to allow users to self mount this mount. 4. After creating the mount, you are required to add both **Eggs** and **Nodes** that this mount may be used on. - +:::warning All servers using the same mounts will **only** share their contents when they are on the same node. Mounts are not synchronized between nodes. - +::: ### Assigning a Mount to a Server @@ -54,9 +52,9 @@ You have to configure mounts in admin Panel in order to use them with your serve The files of the mount should become available in the target path in the container. You can temporarily change your server startup command to `ls `, which should output the contents of the mount if configured correctly. - +:::tip Mounts do not appear in the Panel's file manager, nor are they accessible via SFTP. However, the server itself will be able to see and use the mounts. - +::: ### Example Mount diff --git a/docs/guides/php-upgrade.mdx b/docs/guides/php-upgrade.mdx index 00a7ec3a..d3f7a6cb 100644 --- a/docs/guides/php-upgrade.mdx +++ b/docs/guides/php-upgrade.mdx @@ -1,14 +1,11 @@ ---- -id: php-upgrade ---- - import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; # Upgrading PHP -This documentation includes instructions for upgrading your system to the latest version of PHP. Please reference the -table below to check what PHP version you need for your version of Pelican. +A brief guide on how to upgrade PHP to the latest supported version. + +Please reference the table below to check what PHP version you need for your version of Pelican. | Panel Version | PHP Version | |---------------|--------------------| diff --git a/docs/guides/ssl.mdx b/docs/guides/ssl.mdx deleted file mode 100644 index d52e2bec..00000000 --- a/docs/guides/ssl.mdx +++ /dev/null @@ -1,286 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - -# Creating SSL Certificates - -These tutorials briefly cover creating a new SSL certificates for your panel and/or wings. - - - - - This way is the most recommended and should work in 98% of setups. - - To begin, we will install certbot, a simple script that automatically renews our certificates and allows much easier creation of them. - The command below is for Ubuntu distributions, but you can always check [Certbot's official site](https://certbot.eff.org/) for installation instructions. - We have also included a command below to install certbot's Nginx/Apache plugin so you won't have to stop your webserver. - - - - ```sh - sudo apt install -y python3-certbot-nginx - ``` - - - ```sh - sudo apt install -y python3-certbot-apache - ``` - - - ```sh - sudo apt install -y certbot - ``` - - - - ### Creating a Certificate - - After installing certbot, we need to generate a certificate. There are a couple of ways to do that, but the easiest - is to use the web server-specific certbot plugin you just installed. - - - For Wings-only machines that don't need a web server, use the standalone or DNS method of the certbot as you don't need a web server for it. - - - Then, in the command below, you should replace `example.com` with the domain you would like to generate a certificate - for. When you have multiple domains you would like certificates for, simply add more `-d anotherdomain.com` flags to the - command. You can also look into generating a wildcard certificate but that is not covered in this tutorial. - - When you are using certbot's Nginx/Apache plugin, you won't need to restart your webserver to have the certificate - applied assuming that you've already configured the webservers to use SSL as instructed in the [web server configuration step](../panel/webserver-config). - - ### HTTP challenge - - HTTP challenge requires you to expose port 80 for the challenge verification. - - - - ```sh - certbot certonly --nginx -d example.com - ``` - - - ```sh - certbot certonly --apache -d example.com - ``` - - - ```sh - certbot certonly --standalone -d example.com - ``` - - - - ### DNS challenge - - DNS challenge requires you to create a new TXT DNS record to verify domain ownership, instead of having to expose port 80. The instructions are displayed when you run the certbot command below. - - ```sh - certbot -d example.com --manual --preferred-challenges dns certonly - ``` - - ### Auto Renewal - - You'll also probably want to configure the automatic renewal of certificates to prevent unexpected certificate expirations. - You can open crontab with `sudo crontab -e` and add the line from below to the bottom of it for attempting renewal every day at 23 (11 PM). - - Deploy hook would restart the Nginx service to apply a new certificate when it's renewed successfully. Change `nginx` in the restart command to suit your own needs, such as to `apache` or `wings`. - - - For advanced users, we suggest installing and using [acme.sh](https://acme.sh) - which provides more options, and is much more powerful than certbot. - - - ```text - 0 23 * * * certbot renew --quiet --deploy-hook "systemctl restart nginx" - ``` - - ### Troubleshooting - - If you get an `Insecure Connection` or SSL/TLS related error when trying to access your panel or wings, the certificate has likely expired. - This can be easily fixed by renewing the SSL certificate, although using the command `certbot renew` might not do the job if port 80 is in use, as it'll return errors like: `Error: Attempting to renew cert (domain) from /etc/letsencrypt/renew/domain.conf produced an unexpected error`. - - This will happen especially if you're running Nginx instead of Apache. The solution for this is to use Nginx or Apache plugins with `--nginx` and `--apache`. Alternatively, you can stop Nginx, then renew the certificate, finally restart Nginx. Replace `nginx` with your own web server or with `wings` should you be renewing the certificate for Wings. - - Stop Nginx: - - ```sh - systemctl stop nginx - ``` - - Renew the certificate: - - ```sh - certbot renew - ``` - - Once the process has completed, you can restart Nginx: - - ```sh - systemctl start nginx - ``` - - You may also need to restart Wings as not every service is able to automatically apply an updated certificate: - - ```sh - systemctl restart wings - ``` - - - - - This is for advanced users, whose server systems do not have access to port 80. - The command below is for Ubuntu distributions and CloudFlare API (you may google for other APIs for other DNS providers), - but you can always check [acme.sh's official site](https://github.com/Neilpang/acme.sh) for installation instructions. - - Make sure you read both instructions, as some people may have moved to CloudFlare's [new authorization system](https://blog.cloudflare.com/permissions-best-practices) (Modern), but other's [have not](https://community.cloudflare.com/t/cannot-add-new-member-error-1005/421516) (Legacy). - - - ```sh - curl https://get.acme.sh | sh - ``` - - - - ### Obtaining CloudFlare API Key (Legacy) - - After installing acme.sh, we need to fetch a CloudFlare API key. - On Cloudfare's website, select your domain, then on the right side, copy your "Zone ID" and "Account ID". - Click on "Get your API token", click on "Create Token" > select the template "Edit zone DNS" > select the scope of "Zone Resources" - Click on "Continue to summary", copy your token. - - ### Creating a Certificate - - Since the configuration file is based on Certbot, we need to create the folder manually. - - ```sh - sudo mkdir -p /etc/letsencrypt/live/example.com - ``` - - After installing acme.sh and obtaining CloudFlare API key, we need to then generate a certificate. First input the CloudFlare API credentials. - - ```sh - export CF_Token="Your_CloudFlare_API_Key" - export CF_Account_ID="Your_CloudFlare_Account_ID" - export CF_Zone_ID="Your_CloudFlare_Zone_ID" - ``` - - - - ### Obtaining CloudFlare API Key (Modern) - - After installing acme.sh, we need to fetch a CloudFlare API key. - - Cloudfare's website, click on your profile on the top right. - - Go to "My Profile" --> "[API Tokens](https://dash.cloudflare.com/profile/api-tokens)". - - Click "Create Token" and use the "Edit zone DNS" template. - - Then once on the next page, goto "Zone Resources" and "Include" - "Specific Zone" - (Select the domain you want to use). - - Continue to the summery. - - Confirm you'd like to create the token. - - ### Creating a Certificate - - Since the configuration file is based on Certbot, we need to create the folder manually. - - ```sh - sudo mkdir -p /etc/letsencrypt/live/example.com - ``` - - After installing acme.sh and obtaining CloudFlare API key, we need to then generate a certificate. First input the CloudFlare API credentials. - - ```sh - export CF_Key="Your_CloudFlare_API_Key" - export CF_Email="Your_CloudFlare_Email" - ``` - - - - - - - This is for advanced users, who are running Cloudflare in proxy mode or do not have access to port `80`. - - - ### Installing Caddy with Cloudflare DNS plugin - - Caddy does not come by default with Cloudflare DNS plugin, you need to install it yourself. - - There are two main methods: - - 1. Using `xcaddy` - CLI tool to build your own Caddy build - 2. Downloading prebuilt binary from [Caddy's download page](https://caddyserver.com/download). - 3. Using Ansible to download and install Caddy with plugins. See [caddy-ansible](https://github.com/caddy-ansible/caddy-ansible) - - #### Build Caddy using `xcaddy` on your server - - Please refer to [Caddy docs on building Caddy](https://caddyserver.com/docs/build#xcaddy). - - ### Obtaining CloudFlare API Token - - After installing acme.sh, we need to fetch a CloudFlare API key. Please make sure that a DNS record (A or CNAME record) is pointing to your target node, and set the cloud to grey (bypassing CloudFlare proxy). Then go to My Profile > API keys and on Global API Key subtab, click on "view", enter your CloudFlare password, and copy the API key to clipboard. - - After install Caddy with Cloudflare DNS plugin, we need to fetch a Cloudflare API token. - Please make sure that a DNS record (A or CNAME record) is pointing at your target node. - Then go to My Profile > API Tokens and on API Tokens click "Create Token". - Create API Token > API token templates, at the end of line with "Edit zone DNS", click "Use template". Under **Zone Resources**, select your DNS zone for which you wish to create the API token, click "Continue to summary". - Review the API token summary and click "Create Token". Finally copy the API token to clipboard. - - ### Reconfiguring Caddy to use Cloudflare DNS for obtaining certificates - - Create an environment variable file (like `.env`), keep in mind that this file contains secrets and should not be accessed by public. - - We recommend that you create the secret file in the following location: `/etc/caddy/.secrets.env`. - - ```sh - CLOUDFLARE_API_TOKEN= - ``` - - For security reasons, we recommend setting permissions to `0600` (only owner can read or write to the file). - - ```sh - # Set ownership of the `.secrets.env` file to `caddy` system user - sudo chown caddy:caddy /etc/caddy/.secrets.env - - # Set read-write permissions only to owner - the `caddy` system user - sudo chmod 0600 /etc/caddy/.secrets.env - ``` - - Modify the systemd unit file, to load environment variables from file (add `--envfile /etc/caddy/.secrets.env` flag to `ExecStart`), the default systemd unit file location is `/etc/systemd/system/caddy.service`: - - ```unit {12} - [Unit] - Description=Caddy - Documentation=https://caddyserver.com/docs/ - After=network.target network-online.target - Requires=network-online.target - - [Service] - Type=notify - User=caddy - Group=caddy - ExecStart=/usr/bin/caddy run --environ --envfile /etc/caddy/.secrets.env --config /etc/caddy/Caddyfile - ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile - TimeoutStopSec=5s - LimitNOFILE=1048576 - LimitNPROC=512 - PrivateTmp=true - ProtectSystem=full - AmbientCapabilities=CAP_NET_BIND_SERVICE - - [Install] - WantedBy=multi-user.target - ``` - - You can add a `tls` block to your `Caddyfile`, under the `` block of your panel configuration, the Caddy config file location is `/etc/caddy/Caddyfile`: - - ```caddyfile {5-7} - { - # ...s - - tls { - dns cloudflare {env.CLOUDFLARE_API_TOKEN} - } - } - ``` - - diff --git a/docs/guides/uninstalling.mdx b/docs/guides/uninstalling.mdx index 1148e914..d566f44e 100644 --- a/docs/guides/uninstalling.mdx +++ b/docs/guides/uninstalling.mdx @@ -1,14 +1,15 @@ -import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; # Uninstalling -This guide will show you how to uninstall the Pelican Panel and Wings. Note that the uninstallation of dependency services is not covered here. +This guide will show you how to uninstall the Pelican Panel and Wings. - +Note that the uninstallation of dependency services is not covered here. + +:::danger **You will lose all data and this action is irreversible!** - +::: ## Panel diff --git a/docs/index.mdx b/docs/index.mdx index c0a496ed..5bb8daa5 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -2,46 +2,32 @@ id: welcome --- -import Admonition from '@theme/Admonition'; - # Welcome to Pelican! -### Who is Pelican? -In the realm of technology and hosting services, bold pioneers left the constraints of Pterodactyl to forge their own path. - -United by a shared vision and a relentless pursuit of excellence, they came together to form the heart and soul of **Pelican**—a beacon of innovation and reliability, defined not only by its technological prowess but also by its unwavering dedication to customer satisfaction. - -With innovation as their compass and collaboration as their strength, Pelican soars to new heights, shaping the future of server management with each triumphant flight. - -### Core Team - -| Name | Discord | Role | -|--------------------------------------------------------|-----------------|-----------------------------| -| [Lance Pioch](https://github.com/lancepioch) | `shadowlancer` | Project Lead & Fullstack Dev| -| [Michael Parker](https://github.com/parkervcp) | `parkervcp` | Egg / Docker Maintainer | -| [Charles Morgan](https://github.com/notAreYouScared) | `areyouscared` | Fullstack Dev | -| [Alex 'Scai' Vlad](https://github.com/alexevladgabriel)| `.scai` | Fullstack Dev | -| [Boy132](https://github.com/boy132) | `boy132` | Fullstack Dev | -| [Martin Oscar](https://github.com/RMartinOscar) | `rmartinoscar` | Fullstack Dev | +## What is Pelican? -Core members of Pelican have a light blue username in Discord. +Pelican is an open-source game server management tool built upon [Pterodactyl](https://pterodactyl.io), paired with Wings, which runs the game servers in isolated Docker containers for maximum separation and stability. -### Community Staff +:::warning[Reporting Security Issues] + If you notice anything that raises a concern, please create a [Github security advisory](https://github.com/pelican-dev/panel/security/advisories/new ) or reach out directly to **team@pelican.dev** + For security reasons, we ask that you handle security disclosures responsibly and **avoid posting them as GitHub issues/discussions.** +::: -| Name | Discord | Role | -|------------------------------------------------|---------------|---------------| -| [Trixter](https://github.com/TrixterTheTux) | `trixter` | Moderator | -| [Quinten](https://github.com/QuintenQVD0) | `quintenqvd` | Egg Maintainer| -| [Red-Thirten](https://github.com/redthirten) | `red_thirten` | Egg Maintainer| +## Core Team -Community Staff have a darker blue username in Discord. -### What is Pelican? -Pelican is an open-source game server management tool built upon Pterodactyl, paired with Wings, which runs the game servers in isolated Docker containers for maximum separation and stability. +| Name | Discord | +|--------------------------------------------------------|-----------------| +| [Lance Pioch](https://github.com/lancepioch) | `shadowlancer` | +| [Michael Parker](https://github.com/parkervcp) | `parkervcp` | +| [Charles Morgan](https://github.com/notAreYouScared) | `areyouscared` | +| [Alex 'Scai' Vlad](https://github.com/alexevladgabriel)| `.scai` | +| [Boy132](https://github.com/boy132) | `boy132` | +| [Martin Oscar](https://github.com/RMartinOscar) | `rmartinoscar` | -### Open Source! -Pelican is open-source, allowing users to browse the code, contribute improvements, and help to identify bugs and security issues. +## Community Staff - - If you notice anything that raises a concern, please reach out directly to **team@pelican.dev** - For security reasons, we ask that you handle security disclosures responsibly and **avoid posting them on GitHub.** - +| Name | Discord | +|------------------------------------------------|---------------| +| [Trixter](https://github.com/TrixterTheTux) | `trixter` | +| [Quinten](https://github.com/QuintenQVD0) | `quintenqvd` | +| [Red-Thirten](https://github.com/redthirten) | `red_thirten` | diff --git a/docs/install/install.mdx b/docs/install/install.mdx new file mode 100644 index 00000000..211e7939 --- /dev/null +++ b/docs/install/install.mdx @@ -0,0 +1,34 @@ +# Installation + +Pelican consists of two main components: the **Panel** and **Wings**. + +The Panel is a [Laravel](https://laravel.com) web application that serves as web interface for the user. +Wings is the backend service that will be installed on one or more node machines and serves as interface between [Docker](https://docker.com) and the Panel. + +:::warning + Pelican is currently in **Beta**! Some things might change / break between beta versions! +::: + +## First steps + +:::info[What is...?] + Not sure what a specific term means? Check out our [Glossary](../glossary)! +::: + +First you will need to install the Panel. You can choose between two installation methods: + +1. [Standalone](panel/standalone) - run the Pelican Panel directly on a web server. +2. [Dockerized](panel/dockerized) - run the Pelican Panel inside a docker container. + +## Node setup + +After your setup your Panel you will have to create some Nodes. For do that install and configure the Wings Daemon, either on the same machine as the Panel or on a separate machine. + +Similar to the Panel installation you can choose between two installation methods: + +1. [Standalone](wings/standalone) - run the Wings Daemon directly on a linux server. +2. [Dockerized](wings/dockerized) - run the Wings Daemon inside a docker container. + +:::info + A Panel can have multiple Nodes but a Node is always tied to just one Panel. +:: \ No newline at end of file diff --git a/docs/panel/advanced/mysql.mdx b/docs/install/misc/mysql.mdx similarity index 96% rename from docs/panel/advanced/mysql.mdx rename to docs/install/misc/mysql.mdx index b08f7b8e..7de90883 100644 --- a/docs/panel/advanced/mysql.mdx +++ b/docs/install/misc/mysql.mdx @@ -1,60 +1,62 @@ -# MySQL - -## Install MariaDB - -MariaDB is a MySQL fork and the preferred MySQL software. Run the following commands to quickly install it. - -```sh -curl -sSL https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -sudo apt install -y mariadb-server -``` - -## Create User & Database - -### Logging In - -After installing you want to login to the MySQL command line where we will be executing statements to get -things setup. To do so, simply run the command below and provide the Root MySQL account's password that you setup when -installing MySQL. If you do not remember doing this, chances are you can just hit enter as no password is set. - -```sh -mysql -u root -p -``` - -### Creating User - -Next, we will create a user called `pelican` and allow logins from localhost which prevents any external connections -to our database. You can also use `%` as a wildcard or enter a numeric IP. We will also set the account password -to `somePassword`. - -```sql -CREATE USER 'pelican'@'127.0.0.1' IDENTIFIED BY 'somePassword'; -``` - -### Creating Database - -Next, we need to create a database for the panel. In this tutorial we will be naming the database `panel`, but you can -substitute that for whatever name you wish. - -```sql -CREATE DATABASE panel; -``` - -### Assigning Permissions - -Finally, we need to tell MySQL that our pelican user should have access to the panel database. To do this, simply -run the command below. - -```sql -GRANT ALL PRIVILEGES ON panel.* TO 'pelican'@'127.0.0.1'; -``` - -## Setup Pelican for MySQL - -If you are switching to MySQL after installing the Panel you have to run the database setup command below. -**You do not have to run this if this is the first time you are installing the Panel. You will provide the database data via the Web Installer.** - -```sh -cd /var/www/pelican -php artisan p:environment:database -``` +# MySQL + +A brief guide on how to install and setup MariaDB. + +## Install MariaDB + +MariaDB is a MySQL fork and the preferred MySQL software. Run the following commands to quickly install it. + +```sh +curl -sSL https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash +sudo apt install -y mariadb-server +``` + +## Create User & Database + +### Logging In + +After installing you want to login to the MySQL command line where we will be executing statements to get +things setup. To do so, simply run the command below and provide the Root MySQL account's password that you setup when +installing MySQL. If you do not remember doing this, chances are you can just hit enter as no password is set. + +```sh +mysql -u root -p +``` + +### Creating User + +Next, we will create a user called `pelican` and allow logins from localhost which prevents any external connections +to our database. You can also use `%` as a wildcard or enter a numeric IP. We will also set the account password +to `somePassword`. + +```sql +CREATE USER 'pelican'@'127.0.0.1' IDENTIFIED BY 'somePassword'; +``` + +### Creating Database + +Next, we need to create a database for the panel. In this tutorial we will be naming the database `panel`, but you can +substitute that for whatever name you wish. + +```sql +CREATE DATABASE panel; +``` + +### Assigning Permissions + +Finally, we need to tell MySQL that our pelican user should have access to the panel database. To do this, simply +run the command below. + +```sql +GRANT ALL PRIVILEGES ON panel.* TO 'pelican'@'127.0.0.1'; +``` + +## Setup Pelican for MySQL + +If you are switching to MySQL after installing the Panel you have to run the database setup command below. +**You do not have to run this if this is the first time you are installing the Panel. You will provide the database data via the Web Installer.** + +```sh +cd /var/www/pelican +php artisan p:environment:database +``` diff --git a/docs/panel/advanced/redis.mdx b/docs/install/misc/redis.mdx similarity index 95% rename from docs/panel/advanced/redis.mdx rename to docs/install/misc/redis.mdx index f794a717..0151687e 100644 --- a/docs/panel/advanced/redis.mdx +++ b/docs/install/misc/redis.mdx @@ -1,5 +1,7 @@ # Redis +A brief guide on how to install and setup Redis. + ## Install Redis To install Redis you first need add their repository. @@ -25,8 +27,6 @@ sudo systemctl enable --now redis-server ## Setup Pelican for Redis -### Use Redis as driver - If you are switching to Redis after installing the Panel you have to run the setup command below. **You do not have to run this if this is the first time you are installing the Panel. You will provide the redis data via the Web Installer.** diff --git a/docs/install/misc/ssl.mdx b/docs/install/misc/ssl.mdx new file mode 100644 index 00000000..fb70db68 --- /dev/null +++ b/docs/install/misc/ssl.mdx @@ -0,0 +1,124 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Creating SSL Certificates + +A brief guide on how to create SSL certificates for your Panel and/or Wings using Certbot. + +## Install Certbot + +To begin, we will install certbot, a simple script that automatically renews our certificates and allows much easier creation of them. +The command below is for Ubuntu distributions, but you can always check [Certbot's official site](https://certbot.eff.org/) for installation instructions. +We have also included a command below to install certbot's Nginx/Apache plugin so you won't have to stop your webserver. + + + + ```sh + sudo apt install -y python3-certbot-nginx + ``` + + + ```sh + sudo apt install -y python3-certbot-apache + ``` + + + ```sh + sudo apt install -y certbot + ``` + + + +## Creating a Certificate + +After installing certbot, we need to generate a certificate. There are a couple of ways to do that, but the easiest +is to use the web server-specific certbot plugin you just installed. + +:::info + For Wings-only machines that don't need a web server, use the standalone or DNS method of the certbot as you don't need a web server for it. +::: + +Then, in the command below, you should replace `example.com` with the domain you would like to generate a certificate +for. When you have multiple domains you would like certificates for, simply add more `-d anotherdomain.com` flags to the +command. You can also look into generating a wildcard certificate but that is not covered in this tutorial. + +When you are using certbot's Nginx/Apache plugin, you won't need to restart your webserver to have the certificate +applied assuming that you've already configured the webservers to use SSL as instructed in the [web server configuration step](../panel/standalone#webserver-configuration). + + + + HTTP challenge requires you to expose port 80 for the challenge verification. + + + + ```sh + certbot certonly --nginx -d example.com + ``` + + + ```sh + certbot certonly --apache -d example.com + ``` + + + ```sh + certbot certonly --standalone -d example.com + ``` + + + + + DNS challenge requires you to create a new TXT DNS record to verify domain ownership, instead of having to expose port 80. The instructions are displayed when you run the certbot command below. + + ```sh + certbot -d example.com --manual --preferred-challenges dns certonly + ``` + + + +## Auto Renewal + +You'll also probably want to configure the automatic renewal of certificates to prevent unexpected certificate expirations. +You can open crontab with `sudo crontab -e` and add the line from below to the bottom of it for attempting renewal every day at 23 (11 PM). + +Deploy hook would restart the Nginx service to apply a new certificate when it's renewed successfully. Change `nginx` in the restart command to suit your own needs, such as to `apache` or `wings`. + +:::info + For advanced users, we suggest installing and using [acme.sh](https://acme.sh) + which provides more options, and is much more powerful than certbot. +::: + +```text +0 23 * * * certbot renew --quiet --deploy-hook "systemctl restart nginx" +``` + +## Troubleshooting + +If you get an `Insecure Connection` or SSL/TLS related error when trying to access your panel or wings, the certificate has likely expired. +This can be easily fixed by renewing the SSL certificate, although using the command `certbot renew` might not do the job if port 80 is in use, as it'll return errors like: `Error: Attempting to renew cert (domain) from /etc/letsencrypt/renew/domain.conf produced an unexpected error`. + +This will happen especially if you're running Nginx instead of Apache. The solution for this is to use Nginx or Apache plugins with `--nginx` and `--apache`. Alternatively, you can stop Nginx, then renew the certificate, finally restart Nginx. Replace `nginx` with your own web server or with `wings` should you be renewing the certificate for Wings. + +Stop Nginx: + +```sh +systemctl stop nginx +``` + +Renew the certificate: + +```sh +certbot renew +``` + +Once the process has completed, you can restart Nginx: + +```sh +systemctl start nginx +``` + +You may also need to restart Wings as not every service is able to automatically apply an updated certificate: + +```sh +systemctl restart wings +``` \ No newline at end of file diff --git a/docs/panel/advanced/docker.mdx b/docs/install/panel/dockerized.mdx similarity index 66% rename from docs/panel/advanced/docker.mdx rename to docs/install/panel/dockerized.mdx index d866f174..a20c46f3 100644 --- a/docs/panel/advanced/docker.mdx +++ b/docs/install/panel/dockerized.mdx @@ -1,10 +1,34 @@ -# Docker +# Dockerized installation -Pelican provides pre-built Docker images via GitHub Packages. `ghcr.io/pelican-dev/panel:latest` is the current latest release, and `ghcr.io/pelican-dev/panel:main` is built automatically from the current `main` branch. Deploying the panel in Docker is still a work in progress. While the plan is to make Docker the preferred installation method, we currently recommend the [standard deployment instructions](/docs/panel/getting-started) +Run the Pelican Panel inside a docker container. -This guide requires Docker CE. (Docker Compose has been included in the Docker CLI since v2. Docker Compose v1 is unsupported.) For instructions on installing and configuring Docker, see the [installation guide](/docs/guides/docker). +:::danger + **You should have some basic familiarity with Docker before you proceed!** +::: + +Pelican provides pre-built Docker images via GitHub Packages. `ghcr.io/pelican-dev/panel:latest` is the current latest release, and `ghcr.io/pelican-dev/panel:main` is built automatically from the current `main` branch. Deploying the panel in Docker is still a work in progress. + +## Install Docker + +For a quick install of Docker CE, you can use the command below: + +```sh +curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh +``` + +:::info[Trouble installing?] + If the above command does not work, please refer to the [official Docker documentation](https://docs.docker.com/engine/install/) on how to install Docker CE on your server. +::: + +### Start Docker on Boot -## Basics +If you are on an operating system with systemd (Ubuntu 16+, Debian 8+, CentOS 7+) run the command below to have Docker start when you boot your machine. + +```sh +sudo systemctl enable --now docker +``` + +## Setup compose file The easiest deployment method is using the standard `compose.yml` file. @@ -12,25 +36,48 @@ This configuration includes an integrated web server that will automatically obt ### Create compose.yml -```yml {17,18} title="compose.yml" +```yml {4-7,9-10,12} title="compose.yml" +x-common: + panel: + &panel-environment + APP_URL: "http://localhost" + LE_EMAIL: "USEYOUROWNEMAILHERE@example.com" # email to be used for let's encrypt certificates + APP_DEBUG: "false" + APP_ENV: "production" + + # BEHIND_PROXY: true # uncomment to run behind a proxy + # TRUSTED_PROXIES: 127.0.0.1,172.17.0.1,172.20.0.1 # defaults are for local proxies + + # SKIP_CADDY: true # enable when not using caddy. + +# +# ------------------------------------------------------------------------------------------ +# DANGER ZONE BELOW +# +# The remainder of this file likely does not need to be changed. Please only make modifications +# below if you understand what you are doing. +# + services: panel: image: ghcr.io/pelican-dev/panel:latest - restart: always + build: . + restart: unless-stopped networks: - default ports: - "80:80" - "443:443" + # - "81:80" # if you are behind a proxy uncomment this line and comment out 80 and 443 + # - "9000:9000" # enable when not using caddy to be able to reach php-fpm extra_hosts: - - "host.docker.internal:host-gateway" + - "host.docker.internal:host-gateway" # shows the panel on the internal docker network as well. usually '172.17.0.1' volumes: - pelican-data:/pelican-data - pelican-logs:/var/www/html/storage/logs environment: + <<: [*panel-environment, *mail-environment] XDG_DATA_HOME: /pelican-data - APP_URL: "http://localhost" - ADMIN_EMAIL: "USEYOUROWNEMAILHERE@example.com" volumes: pelican-data: @@ -51,7 +98,7 @@ networks: Now, close and save changes to `compose.yml`. -### Starting +## Start the container From the directory in which the compose file is located, run: @@ -67,14 +114,15 @@ The first time the container starts, it will generate an `APP_KEY` which is used docker compose logs panel | grep 'Generated app key:' ``` -### Installing +## Finish setup Open the installer in your browser at `APP_URL/installer` to finish setting up the panel. :::note -The first time the container starts after installing or updating, it will apply database migrations, which may take a few minutes. The panel will not be accessible during this process. + The first time the container starts after installing or updating, it will apply database migrations, which may take a few minutes. The panel will not be accessible during this process. ::: + #### Sensible Driver Defaults: * Cache Driver: Filesystem @@ -84,7 +132,7 @@ The first time the container starts after installing or updating, it will apply For other configuration, such as UI options, CAPTCHA, email, backups and OAuth, head to the settings menu in the admin panel. -### Stopping +## Stopping The panel will automatically restart if the container crashes or the host restarts. If you need to non-destructively stop the panel for any reason, navigate back to the directory containing `compose.yml` and run: @@ -92,7 +140,7 @@ The panel will automatically restart if the container crashes or the host restar docker compose down ``` -### Uninstalling +## Uninstalling To uninstall the panel, navigate to the directory containing `compose.yml` and run: @@ -101,7 +149,7 @@ docker compose down -v ``` :::danger - **This will permanently delete the panel and all associated data including the SQLite database and your encryption key.** + **This will permanently delete the panel and all associated data including the SQLite database and your encryption key.** ::: ## Advanced Options @@ -164,7 +212,7 @@ An example Caddyfile for hosting the panel behind a reverse proxy is shown below ``` :::info - **Note:** If the trusted directive is not set or improperly configured, file uploads will fail. Commonly, when the reverse proxy is running outside of Docker, the IP address will not match `127.0.0.1`, but will instead match a Docker bridge interface or `docker0`. + **Note:** If the trusted directive is not set or improperly configured, file uploads will fail. Commonly, when the reverse proxy is running outside of Docker, the IP address will not match `127.0.0.1`, but will instead match a Docker bridge interface or `docker0`. ::: #### Raising file upload limits @@ -183,4 +231,4 @@ The default file upload limit is 2MB. To raise this limit, modify the `Caddyfile } file_server } -``` +``` \ No newline at end of file diff --git a/docs/panel/webserver-config.mdx b/docs/install/panel/standalone.mdx similarity index 74% rename from docs/panel/webserver-config.mdx rename to docs/install/panel/standalone.mdx index c1919430..1978756c 100644 --- a/docs/panel/webserver-config.mdx +++ b/docs/install/panel/standalone.mdx @@ -1,21 +1,88 @@ -import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -# Webserver Configuration +# Standalone installation - +Run the Pelican Panel directly on a web server. + +:::danger + **You should have some basic familiarity with Linux before you proceed!** +::: + +## Requirements + +### Operating System (OS) + +The Panel runs on a wide range of operating systems, so pick whichever you are most comfortable using. +This documentation will assume a Debian based OS with `apt`. + +:::info +SQLite support depends on [libsqlite3-0_3.35+](https://pkgs.org/download/libsqlite3-0) being on the host system. +OS's that do _not_ support SQLite include: Debian 11, Alma Linux 8 or 9, Rocky Linux 8 or 9. +::: + +### Dependencies + +For the Panel you need to install **PHP `8.5` (recommended), `8.4`, `8.3` or `8.2`**, with the following **extensions**: +`gd`, `mysql`, `mbstring`, `bcmath`, `xml`, `curl`, `zip`, `intl`, `sqlite3` and `fpm`. + +You will also need a Webserver. Currently, **Apache, NGINX or Caddy** are supported. + +If you want to use MySQL, MariaDB or PostgreSQL for the panel database make sure to install either **MySQL 8+, MariaDB 10.6+ or PostgreSQL 14+**. (both client and server!) + +Finally, for some commands during the installation you need `curl`, `tar` and `unzip`. + +:::warning + Please make sure you installed **all** needed dependencies before continuing! +::: + +## Download Panel files + +The first step in this process is to create the folder where the panel will live and then move ourselves into that +newly created folder. + +```sh +sudo mkdir -p /var/www/pelican +cd /var/www/pelican +``` + +Once you have created a new directory to use and moved into it, you'll need to download the Panel files. +This is as simple as using `curl` to download the latest release. + +```sh +curl -L https://github.com/pelican-dev/panel/releases/latest/download/panel.tar.gz | sudo tar -xzv +``` + +## Install Composer + +Next we will set up Composer along with the required dependencies. + +```sh +curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer +``` + +```sh +sudo COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader +``` + +:::info + Even though composer might tell you that you have outdated dependencies, do **not** run `composer update`! +::: + +## Webserver Configuration + +:::info When using the SSL (https) configuration you MUST create SSL certificates, otherwise your webserver will fail to start. - See the [Creating SSL Certificates](../guides/ssl) documentation page to learn how to create these certificates before continuing. - + See the [Creating SSL Certificates](../misc/ssl) documentation page to learn how to create these certificates before continuing. +::: - + :::warning[php & fpm] If you're **not** using php8.5, you will need to edit the config file to point to the proper php fpm socket. The line is highlighted below. - + ::: First, remove the default NGINX configuration. ```sh sudo rm /etc/nginx/sites-enabled/default @@ -24,9 +91,9 @@ import TabItem from '@theme/TabItem'; `pelican.conf` and place the file in `/etc/nginx/sites-available/`. - + :::warning **Note:** IPs cannot be used with SSL. - + ::: ```nginx {5,11,25-26,47} title="/etc/nginx/sites-available/pelican.conf" server_tokens off; @@ -146,7 +213,8 @@ import TabItem from '@theme/TabItem'; ``` - ### Enabling Configuration + + #### Enabling Configuration The final step is to enable your NGINX configuration and restart it. @@ -174,9 +242,9 @@ import TabItem from '@theme/TabItem'; Note: When using Apache, make sure you have the `libapache2-mod-php` package installed or else PHP will not display on your webserver. - + :::warning **Note:** IPs cannot be used with SSL. - + ::: ```apacheconf {2,10,24-25} title="/etc/apache2/sites-available/pelican.conf" ServerName @@ -225,15 +293,16 @@ import TabItem from '@theme/TabItem'; ``` - ### Enabling Configuration + + #### Enabling Configuration Once you've created the file above, simply run the commands below. - + :::warning[php & fpm] If you're **not** using php8.5, you will need to edit the command to point to enable the correct mod. The line is highlighted below. - + ::: ```sh {3} sudo a2ensite pelican.conf @@ -249,11 +318,11 @@ import TabItem from '@theme/TabItem'; - + :::warning[php & fpm] If you're **not** using php8.5, you will need to edit the config file to point to the proper php fpm socket. The line is highlighted below. - + ::: First, remove the default Caddy configuration. ```sh @@ -264,9 +333,9 @@ import TabItem from '@theme/TabItem'; - + :::warning **Note:** IPs cannot be used with SSL. - + ::: ```caddy {9,14} title="/etc/caddy/Caddyfile" { servers :443 { @@ -372,7 +441,9 @@ import TabItem from '@theme/TabItem'; ``` - ### Enabling Configuration + + #### Enabling Configuration + The final step is to restart Caddy. ```sh @@ -380,3 +451,55 @@ import TabItem from '@theme/TabItem'; ``` + +## Panel Setup + +The core environment is easily configured using a single CLI command & the web installer built into the app. +These steps will cover setting up things such as sessions, caching, database credentials, and email sending. + +Running `php artisan p:environment:setup` will, if it does not exist, auto create the required `.env` file and generate a `APP_KEY`. + +```sh +sudo php artisan p:environment:setup +``` + +:::warning[BACK UP `APP_KEY`!] + **Back up** your encryption key (APP_KEY in the `.env` file). This is used as an encryption key for all data that needs to be stored securely (e.g. api keys). + Store it somewhere safe - not just on your server. If you lose it all encrypted data is irrecoverable -- **even if you have database backups.** +::: + +## Setting Permissions + +The next step in the installation process is to set the correct permissions on the Panel files so that the webserver can use them correctly. + +```sh +sudo chmod -R 755 storage/* bootstrap/cache/ +``` + + + + ```sh + sudo chown -R www-data:www-data /var/www/pelican + ``` + + + ```sh + sudo chown -R nginx:nginx /var/www/pelican + ``` + + + ```sh + sudo chown -R apache:apache /var/www/pelican + ``` + + + +## Web Installer + +Once you've set the proper permissions, continue the Panel install on the web interface. +The web installer is located at `/installer` or `/installer`, e.g. `https://panel.example.com/installer` + +:::info[Want something advanced?] + Make sure to read the [MySQL guide](./advanced/mysql) first if you want to use MySQL/ MariaDB instead of SQLite! + If you want to use Redis make sure to read the [Redis guide](./advanced/redis) first. +::: \ No newline at end of file diff --git a/docs/install/wings/dockerized.mdx b/docs/install/wings/dockerized.mdx new file mode 100644 index 00000000..daff7ed8 --- /dev/null +++ b/docs/install/wings/dockerized.mdx @@ -0,0 +1,85 @@ +# Dockerized installation + +Run the Wings Daemon inside a docker container. + +:::danger + **You should have some basic familiarity with Docker before you proceed!** +::: + +Pelican provides pre-built Docker images via GitHub Packages. `ghcr.io/pelican-dev/wings:latest` is the current latest release, and `ghcr.io/pelican-dev/wings:main` is built automatically from the current `main` branch. + +## Install Docker + +For a quick install of Docker CE, you can use the command below: + +```sh +curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh +``` + +:::info[Trouble installing?] + If the above command does not work, please refer to the [official Docker documentation](https://docs.docker.com/engine/install/) on how to install Docker CE on your server. +::: + +### Start Docker on Boot + +If you are on an operating system with systemd (Ubuntu 16+, Debian 8+, CentOS 7+) run the command below to have Docker start when you boot your machine. + +```sh +sudo systemctl enable --now docker +``` + +## Setup compose file + +The easiest deployment method is using the standard `compose.yml` file. + +This configuration includes an integrated web server that will automatically obtain SSL certificates if you are serving over HTTPS. For the database, it assumes you want to use SQLite (or you have an external database server to configure using the installer.) It also assumes you intend to use the Filesystem driver for cache, filesystem or database driver for session, and database driver for queue (or you have an external Redis server to configure using the installer.) If you want to use other options built into Docker, see [Advanced Options](#advanced-options). + +### Create compose.yml + +```yml title="compose.yml" +services: + wings: + image: ghcr.io/pelican-dev/wings:latest + restart: always + networks: + - wings0 + ports: + - "8080:8080" + - "2022:2022" + tty: true + environment: + TZ: "UTC" + WINGS_UID: 988 + WINGS_GID: 988 + WINGS_USERNAME: pelican + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + - "/var/lib/docker/containers/:/var/lib/docker/containers/" + - "/etc/pelican/:/etc/pelican/" + - "/var/lib/pelican/:/var/lib/pelican/" + - "/var/log/pelican/:/var/log/pelican/" + - "/tmp/pelican/:/tmp/pelican/" + - "/etc/ssl/certs:/etc/ssl/certs:ro" + # you may need /srv/daemon-data if you are upgrading from an old daemon + #- "/srv/daemon-data/:/srv/daemon-data/" + # Required for ssl if you use let's encrypt. uncomment to use. + #- "/etc/letsencrypt/:/etc/letsencrypt/" + +networks: + wings0: + name: wings0 + driver: bridge + ipam: + config: + - subnet: "172.21.0.0/16" + driver_opts: + com.docker.network.bridge.name: wings0 +``` + +## Start the container + +From the directory in which the compose file is located, run: + +```sh +docker compose up -d +``` \ No newline at end of file diff --git a/docs/install/wings/standalone.mdx b/docs/install/wings/standalone.mdx new file mode 100644 index 00000000..4040f540 --- /dev/null +++ b/docs/install/wings/standalone.mdx @@ -0,0 +1,115 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Standalone installation + +Run the Wings Daemon directly on a linux server. + +:::danger + **You should have some basic familiarity with Linux before you proceed!** +::: + +## System Requirements + +:::warning + Please be aware that some hosts install a modified kernel that does not support some docker features required for Wings to operate correctly. + Please check your kernel by running `uname -r`. If your kernel ends in `-xxxx-grs-ipv6-64` or `-xxxx-mod-std-ipv6-64` you're probably using a non-supported kernel. You should contact your host, and request a non-modified kernel. +::: + +To run Wings, you will need a Linux system capable of running Docker containers. Most VPS and almost all +dedicated servers should be capable of running Docker, but there are edge cases. + +When your provider uses `Virtuozzo`, `OpenVZ` (or `OVZ`), or `LXC` virtualization, you will most likely be unable to +run Wings. Some providers have made the necessary changes for nested virtualization to support Docker. Ask your provider's support team to make sure. KVM is guaranteed to work. + +The easiest way to check is to type `systemd-detect-virt`. +If the result doesn't contain `OpenVZ` or`LXC`, it should be fine. The result of `none` will appear when running dedicated hardware without any virtualization. + +Should that not work for some reason, or you're still unsure, you can also run the command below. + +```sh +sudo dmidecode -s system-manufacturer +``` + +## Installing Docker + +Wings requires Docker CE. For a quick install of Docker CE, you can use the command below: + +```sh +curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh +``` + +:::info[Trouble installing?] + If the above command does not work, please refer to the [official Docker documentation](https://docs.docker.com/engine/install/) on how to install Docker CE on your server. +::: + +## Download Wings binary + +The first step for installing Wings is to ensure we have the required directory structure setup. To do so, run the commands below, which will create the base directory and download the wings executable. + +```sh +sudo mkdir -p /etc/pelican /var/run/wings +sudo curl -L -o /usr/local/bin/wings "https://github.com/pelican-dev/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")" +sudo chmod u+x /usr/local/bin/wings +``` + +## Configure + +Once you have installed Wings and the required components, the next step is to create a node on your installed Panel. +Go to your Panel administrative view, select Nodes from the sidebar, and on the right side click Create New button. + +After you have created a node, click on it and there will be a tab called Configuration. +Copy the code block content, create a new file at `/etc/pelican/config.yml`, paste the content into it and save. + +Alternatively, you can click on the Auto Deploy Command button, copy the sh command and paste it into your terminal. + +:::warning[Using ssl?] + If your Panel is using SSL, Wings must also use SSL. + + See [Creating SSL Certificates](../misc/ssl) documentation page for how to create these certificates before continuing. +::: + +## Starting Wings for the first time + +To start Wings for the first time, simply run the command below, which will start it in a debug mode. +Once you confirmed that it is running without errors, use `CTRL+C` to terminate the process and daemonize it by following the instructions below. + +Depending on your server's internet connection pulling and starting Wings for the first time may take a few minutes. + +```sh +sudo wings --debug +``` + +## Daemonizing (using systemd) + +Running Wings in the background is a simple task, just make sure that it runs without errors before doing this. + +Place the contents below in a file called `wings.service` in the `/etc/systemd/system` directory. + +```ini {9} title="/etc/systemd/system/wings.service" +[Unit] +Description=Wings Daemon +After=docker.service +Requires=docker.service +PartOf=docker.service + +[Service] +User=root +WorkingDirectory=/etc/pelican +LimitNOFILE=4096 +PIDFile=/var/run/wings/daemon.pid +ExecStart=/usr/local/bin/wings +Restart=on-failure +StartLimitInterval=180 +StartLimitBurst=30 +RestartSec=5s + +[Install] +WantedBy=multi-user.target +``` + +Then, run the command below to start Wings and enable start on boot. + +```sh +sudo systemctl enable --now wings +``` \ No newline at end of file diff --git a/docs/panel/advanced/artisan.mdx b/docs/panel/advanced/artisan.mdx deleted file mode 100644 index 10fed0c6..00000000 --- a/docs/panel/advanced/artisan.mdx +++ /dev/null @@ -1,267 +0,0 @@ -# Artisan Commands -This is very much a WIP! Many Many commands, Layout might change. - -Updated: 01/11/2025 -## User Commands -### Create a User - -Creates a user on the system via the CLI. -```sh -php artisan p:user:make [options] -``` - -```sh -Options: - --email[=EMAIL] - --username[=USERNAME] - --password[=PASSWORD] - --admin[=ADMIN] - --no-password - -q, --quiet Do not output any message - -V, --version Display this application version - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` - -### Delete a User - -Deletes a user from the Panel if no servers are attached to their account. -```sh -php artisan p:user:delete [options] -``` - -```sh -Options: - --user[=USER] - -q, --quiet Do not output any message - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` - -### Disable 2fa for a single User - -Disable two-factor authentication for a specific user in the Panel. -```sh -php artisan p:user:disable2fa [options] -``` - -```sh -Options: - --email[=EMAIL] The email of the user to disable 2-Factor for. - -q, --quiet Do not output any message - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question - -``` - -## Editing the Environment - -### Editing Cache -```sh -php artisan p:environment:cache [options] -``` - -```sh -Options: - --driver[=DRIVER] The cache driver backend to use. - --redis-host[=REDIS-HOST] Redis host to use for connections. - --redis-user[=REDIS-USER] User used to connect to redis. - --redis-pass[=REDIS-PASS] Password used to connect to redis. - --redis-port[=REDIS-PORT] Port to connect to redis over. - -q, --quiet Do not output any message - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` - -### Editing Database -```sh -php artisan p:environment:database [options] -``` - -```sh -Options: - --driver[=DRIVER] The database driver backend to use. - --database[=DATABASE] The database to use. - --host[=HOST] The connection address for the MySQL/ MariaDB server. - --port[=PORT] The connection port for the MySQL/ MariaDB server. - --username[=USERNAME] Username to use when connecting to the MySQL/ MariaDB server. - --password[=PASSWORD] Password to use for the MySQL/ MariaDB database. - -q, --quiet Do not output any message - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` -### Editing Mail -```sh -php artisan p:environment:mail [options] -``` - -```sh -Options: - --driver[=DRIVER] The mail driver to use. - --email[=EMAIL] Email address that messages from the Panel will originate from. - --from[=FROM] The name emails from the Panel will appear to be from. - --encryption[=ENCRYPTION] - --host[=HOST] - --port[=PORT] - --endpoint[=ENDPOINT] - --username[=USERNAME] - --password[=PASSWORD] - -q, --quiet Do not output any message - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` -### Editing Queue -```sh -php artisan p:environment:queue [options] -``` - -```sh -Options: - --driver[=DRIVER] The queue driver backend to use. - --redis-host[=REDIS-HOST] Redis host to use for connections. - --redis-user[=REDIS-USER] User used to connect to redis. - --redis-pass[=REDIS-PASS] Password used to connect to redis. - --redis-port[=REDIS-PORT] Port to connect to redis over. - -q, --quiet Do not output any message - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` -### Editing Queue Service -```sh -php artisan p:environment:queue-service [options] -``` - -```sh -Options: - --service-name[=SERVICE-NAME] Name of the queue worker service. - --user[=USER] The user that PHP runs under. - --group[=GROUP] The group that PHP runs under. - --overwrite Force overwrite if the service file already exists. - -q, --quiet Do not output any message - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` -### Editing Session -```sh -php artisan p:environment:session [options] -``` - -```sh -Options: - --driver[=DRIVER] The queue driver backend to use. - --redis-host[=REDIS-HOST] Redis host to use for connections. - --redis-user[=REDIS-USER] User used to connect to redis. - --redis-pass[=REDIS-PASS] Password used to connect to redis. - --redis-port[=REDIS-PORT] Port to connect to redis over. - -q, --quiet Do not output any message - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` -### Setting cache, queue & session driver at once -```sh -php artisan p:redis:setup [options] -``` - -```sh -Options: - --redis-host[=REDIS-HOST] Redis host to use for connections. - --redis-user[=REDIS-USER] User used to connect to redis. - --redis-pass[=REDIS-PASS] Password used to connect to redis. - --redis-port[=REDIS-PORT] Port to connect to redis over. - -q, --quiet Do not output any message - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` -### Editing Setup -```sh -php artisan p:environment:setup [options] -``` - -```sh -Options: - -q, --quiet Do not output any message - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` - -## Migrations -### Migration Command -```sh -php artisan migrate [options] -``` - -```sh -Options: - --database[=DATABASE] The database connection to use - --force Force the operation to run when in production - --path[=PATH] The path(s) to the migrations files to be executed (multiple values allowed) - --realpath Indicate any provided migration file paths are pre-resolved absolute paths - --schema-path[=SCHEMA-PATH] The path to a schema dump file - --pretend Dump the SQL queries that would be run - --seed Indicates if the seed task should be re-run - --seeder[=SEEDER] The class name of the root seeder - --step Force the migrations to be run so they can be rolled back individually - --graceful Return a successful exit code even if an error occurs - --isolated[=ISOLATED] Do not run the command if another instance of the command is already running [default: false] - -q, --quiet Do not output any message - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` -### Running Migations -```sh -php artisan migrate -``` - -### Rollback previous Migration -```sh -php artisan migrate:rollback [options] -``` - -```sh -Options: - --database[=DATABASE] The database connection to use - --force Force the operation to run when in production - --path[=PATH] The path(s) to the migrations files to be executed (multiple values allowed) - --realpath Indicate any provided migration file paths are pre-resolved absolute paths - --pretend Dump the SQL queries that would be run - --step[=STEP] The number of migrations to be reverted - --batch=BATCH The batch of migrations (identified by their batch number) to be reverted - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` - -### Check Migration Status -```sh -php artisan migrate:status [options] -``` -```sh -Options: - --database[=DATABASE] The database connection to use - --pending[=PENDING] Only list pending migrations [default: false] - --path[=PATH] The path(s) to the migrations files to use (multiple values allowed) - --realpath Indicate any provided migration file paths are pre-resolved absolute paths - --ansi|--no-ansi Force (or disable --no-ansi) ANSI output - -n, --no-interaction Do not ask any interactive question -``` -Providing no extra options, `php artisan migrate:status`, You should see an output similar to the below -```sh title='Migration Status Output' - Migration name .............................................................................. Batch / Status - 2016_01_23_195641_add_allocations_table ............................................................ [1] Ran - 2016_01_23_195851_add_api_keys ..................................................................... [1] Ran - ... - ... - 2024_07_12_095213_fix_missing_sqlite_foreign_keys .................................................. [1] Ran - 2024_08_13_171337_fix_allocation_server_foreign_key ................................................ [2] Ran -``` -If any show `PENDING` or `FAILED`. Open a support thread on our discord for further assistance. - -## Clearing Cache - -The below commands are helpful if you need to clear the config or application cache. - -```sh -php artisan cache:clear # Clears application cache -``` -```sh -php artisan config:clear # Clears configuration cache -``` diff --git a/docs/panel/getting-started.mdx b/docs/panel/getting-started.mdx deleted file mode 100644 index b2c148d8..00000000 --- a/docs/panel/getting-started.mdx +++ /dev/null @@ -1,92 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -# Getting Started - -Pelican Panel is designed to run on your webserver. - -You are expected to read through our documentation. -We have spent a lot of time curating these docs for the community, -so please take some time to read through them before asking for help on the forums! - - - **You should have some basic familiarity with Linux before you proceed!** - - - - Pelican is currently in **Beta**! Some things might change / break between beta versions! - - -### Picking an Operating System (OS) - -Pelican runs on a wide range of operating systems, so pick whichever you are most comfortable using. Note: Other OS's, not listed below, might still work. - - - OpenVZ, **unless specifically configured**, will **not** work with Pelican. - - -| Operating System | Version | Supported | Notes | -|:----------------:|:--------:|:---------:|:---------------------------------------------------------------------:| -| **Ubuntu** | 22.04 | ✅︎︎ | | -| | **24.04**| ✅︎ | Documentation written assuming Ubuntu 24.04 as the base OS. | -| **Alma Linux** | 10 | ✅︎ | | -| | 9 | ⚠️ | **No SQLite Support** | -| | 8 | ⚠️ | **No SQLite Support** | -| **Rocky Linux** | 10 | ✅︎ | | -| | 9 | ⚠️ | **No SQLite Support** | -| | 8 | ⚠️ | **No SQLite Support** | -| **CentOS** | 10 | ✅︎ | | -| **Debian** | 11 | ⚠️ | **No SQLite Support** | -| | 12 | ✅︎ | | - -SQLite support depends on [libsqlite3-0_3.35+](https://pkgs.org/download/libsqlite3-0) being on the host system. -**No SQLite Support** means you'll have to build the package from source. - -### Dependencies - -For the Panel you need to install **PHP `8.5` (recommended), `8.4`, `8.3` or `8.2`**, with the following **extensions**: -`gd`, `mysql`, `mbstring`, `bcmath`, `xml`, `curl`, `zip`, `intl`, `sqlite3` and `fpm`. - -You will also need a Webserver. Currently, **Apache, NGINX or Caddy** are supported. - -If you want to use MySQL, MariaDB or PostgreSQL for the panel database make sure to install either **MySQL 8+, MariaDB 10.6+ or PostgreSQL 14+**. (both client and server!) - -Finally, for some commands during the installation you need `curl`, `tar` and `unzip`. - - - Please make sure you installed **all** needed dependencies before continuing! - - -### Create Directories & Downloading Files - -The first step in this process is to create the folder where the panel will live and then move ourselves into that -newly created folder. - -```sh -sudo mkdir -p /var/www/pelican -cd /var/www/pelican -``` - -Once you have created a new directory to use and moved into it, you'll need to download the Panel files. -This is as simple as using `curl` to download the latest release. - -```sh -curl -L https://github.com/pelican-dev/panel/releases/latest/download/panel.tar.gz | sudo tar -xzv -``` - -### Install Composer - -Next we will set up Composer along with the required dependencies. - -``` bash -curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer -``` - -```sh -sudo COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader -``` - - - Even though composer might tell you that you have outdated dependencies, do **not** run `composer update`! - diff --git a/docs/panel/optional-config.mdx b/docs/panel/optional-config.mdx deleted file mode 100644 index 2a2f7b62..00000000 --- a/docs/panel/optional-config.mdx +++ /dev/null @@ -1,107 +0,0 @@ -# Optional Configuration - -## Backups - -Pelican allows users to create backups of their servers. To create backups, a backup storage method has to be configured. - -When changing Pelican's backup storage method, users may still download or delete existing backups from the prior storage driver. In the instance of migrating from S3 to local backups, S3 credentials must remain configured after switching to the local backup storage method. - -Make sure to clear the config cache (`cd /var/www/pelican && php artisan config:clear`) and to restart the queue worker (`systemctl restart pelican-queue`) after changing the backup driver to apply the changes. - -### Using Local Backups - -By default, Pelican uses local storage via Wings for backups. That said, this method of backup storage can be explicitly set within the Settings Page on the Admin side of the panel. - - -Please note that, when using local storage via Wings, the destination for backups is set in the Wings config file with the following setting key: - -```yml {2} -system: - backup_directory: /path/to/backup/storage -``` - -### Using S3 Backups - -AWS S3 (or compatible storage) can be used to store remote or cloud-based backups. This can be configured in the Settings Page on the Admin side of the panel. - -For some configurations, you might have to change your S3 URL from `bucket.domain.com` to `domain.com/bucket`. To accomplish this, add `AWS_USE_PATH_STYLE_ENDPOINT=true` to your `.env` file. - -#### Multipart Upload - -The S3 backup is using the S3 multipart upload capabilities. In rare situations, you might want to adjust the size of a single part or the lifespan of the generated pre-signed URLs. The default part size is 5GB, and the default pre-signed URL lifespan is 60 minutes. - -You can configure the maximal part size using the `BACKUP_MAX_PART_SIZE` environment variable. You must specify the size in bytes. To define the pre-signed URL lifespan, use the `BACKUP_PRESIGNED_URL_LIFESPAN` variable. The expected unit is minutes. - -The following `.env` snippet configures 1GB parts and uses 120 minutes as the pre-signed URL lifespan: - -```sh -BACKUP_MAX_PART_SIZE=1073741824 -BACKUP_PRESIGNED_URL_LIFESPAN=120 -``` - -#### Storage Class - -Should you need to specify a storage class, use the `AWS_BACKUPS_STORAGE_CLASS` environment variable. The default option is `STANDARD` (S3 Standard). - -```sh -AWS_BACKUPS_STORAGE_CLASS= -``` - -## Reverse Proxy Setup - -When running Pelican behind a reverse proxy, such as [Cloudflare's Flexible SSL](https://support.cloudflare.com/hc/en-us/articles/200170416-What-do-the-SSL-options-mean-) -or NGINX/Apache/Caddy, etc., you will need to make a quick modification to the Panel to ensure things continue to work as expected. By default, when using these reverse proxies, -your Panel will not correctly handle requests. You'll most likely be unable to login or see security warnings in your browser console as it attempts to load insecure assets. -This is because the internal logic the Panel uses to determine how links should be generated thinks it is running over HTTP and not over HTTPS. - -You will need to edit trusted proxies, on the Settings page. We highly suggest providing a specific IP address -(or comma-separated list of IPs) rather than allowing `*`. For example, if your proxy is running on the same machine as the server, -the chances are that using `127.0.0.1` would work for you. - -### NGINX Specific Configuration - -To properly respond to an NGINX reverse proxy, the NGINX `location` config must contain the following lines: - -```NGINX -proxy_set_header X-Real-IP $remote_addr; -proxy_set_header Host $host; -proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; -proxy_set_header X-Forwarded-Proto $scheme; -proxy_redirect off; -proxy_buffering off; -proxy_request_buffering off; -``` - -### Cloudflare Specific Configuration - -If you're using Cloudflare's Flexible SSL you should set `TRUSTED_PROXIES` to contain [their IP addresses](https://www.cloudflare.com/ips/). - -You can easily do this on the Settings page in the Panel. - -## Captcha - -The Panel has options to enable captcha to secure the login page from brute-force attacks. By default only Cloudflare Turnstile is available. - -### Disable Captcha - -If you cannot access your panel, you have to modify the `.env` directly to disable it. - -Edit the `.env` in the panel's root directory `/var/www/pelican/` and change the value of `CAPTCHA_TURNSTILE_ENABLED` to `false`. - -After that run `php artisan config:clear` to refresh the config cache. - -## 2FA - -If possible you should use the panel to update your 2FA settings. If you can't access your panel for whatever reason you can use the following steps. - -### Disable 2FA requirement - -Edit the `.env` in the panel's root directory `/var/www/pelican/` and change the value of `APP_2FA_REQUIRED` to `0`. - -### Disable 2FA for a specific user - -Run the following command in your `/var/www/pelican` directory. - -```sh -php artisan p:user:disable2fa -``` diff --git a/docs/panel/panel-setup.mdx b/docs/panel/panel-setup.mdx deleted file mode 100644 index f780d22c..00000000 --- a/docs/panel/panel-setup.mdx +++ /dev/null @@ -1,56 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -# Panel Setup - -The core environment is easily configured using a single CLI command & the web installer built into the app. -These steps will cover setting up things such as sessions, caching, database credentials, and email sending. - -Running `php artisan p:environment:setup` will, if it does not exist, auto create the required `.env` file and generate a `APP_KEY`. - -```sh -sudo php artisan p:environment:setup -``` - - - **Back up** your encryption key (APP_KEY in the `.env` file). This is used as an encryption key for all data that needs to be stored securely (e.g. api keys). - Store it somewhere safe - not just on your server. If you lose it all encrypted data is irrecoverable -- **even if you have database backups.** - - -### Setting Permissions - -The next step in the installation process is to set the correct permissions on the Panel files so that the webserver can -use them correctly. - -```sh -sudo chmod -R 755 storage/* bootstrap/cache/ -``` - - - - ```sh - sudo chown -R www-data:www-data /var/www/pelican - ``` - - - ```sh - sudo chown -R nginx:nginx /var/www/pelican - ``` - - - ```sh - sudo chown -R apache:apache /var/www/pelican - ``` - - - -### Web-Installer - -Once you've set the proper permissions, continue the Panel install on the web interface. -The web installer is located at `/installer` or `/installer`. - - - Make sure to read the [MySQL guide](./advanced/mysql) first if you want to use MySQL/ MariaDB instead of SQLite! - If you want to use Redis make sure to read the [Redis guide](./advanced/redis) first. - diff --git a/docs/panel/update.mdx b/docs/panel/update.mdx deleted file mode 100644 index 06cfc2b9..00000000 --- a/docs/panel/update.mdx +++ /dev/null @@ -1,141 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -# Updating the Panel - -This documentation covers the process for updating the panel portion of Pelican. - -## Version Requirements - -Each version of Pelican Panel also has a corresponding minimum version of Wings that is required for it to run. - -Please see the chart below for how these versions line up. - -| Panel Version | Wings Version | Supported | PHP Version | -|:-------------:|:-------------:|:---------:|:---------------:| -| 1.x | 1.x | ✅︎ | 8.2/8.3/8.4/8.5 | - -## Updating - -You have two options for updating: use the automatic update script (recommended) or do the update steps manually. - - - - Simply run the command below and the update script will guide you through the process: - - ```sh - sudo bash -c "$(curl -fsSL https://pelican.dev/updatePanel.sh)" - ``` - - - ### Enter Maintenance Mode - - Whenever you are performing an update you should be sure to place your Panel into maintenance mode. This will prevent - users from encountering unexpected errors. - - ```sh - cd /var/www/pelican - sudo php artisan down - ``` - - ### Download Update - - The first step in the update process is to download the new panel files from GitHub. The command below will download - the release archive for the most recent version of Pelican, save it in the current directory and will automatically - unpack the archive into your current folder. - - ```sh - curl -L https://github.com/pelican-dev/panel/releases/latest/download/panel.tar.gz | sudo tar -xzv - ``` - - Once the archive is downloaded and extracted we need to set the correct permissions on the cache and storage directories to avoid - any webserver related errors. - - ```sh - sudo chmod -R 755 storage/* bootstrap/cache - ``` - - ### Update Dependencies - - ```sh - sudo COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader - ``` - - - Even though composer might tell you that you have outdated dependencies, do **not** run `composer update`! - - - ### Create storage symlinks - - ```sh - sudo php artisan storage:link - ``` - - ### Cache components - - ```sh - sudo php artisan optimize:clear - sudo php artisan filament:optimize - ``` - - ### Update Database - - You'll also need to update your database schema. Running the command below - will update the schema and ensure the default eggs we ship are up to date (and add any new ones we might have). Just - remember, _never edit core eggs we ship_! They will be overwritten by this update process. - - ```sh - sudo php artisan migrate --seed --force - ``` - - ### Themes - - If you previously had any themes installed you need to manually build the panel assets again: - - ```sh - yarn install - yarn build - ``` - - ### Set Permissions - - The last step is to set proper ownership of the files. In most cases this - is `www-data` but can vary from system to system — sometimes being `nginx`, `caddy`, `apache`, or even `nobody`. - - - - ```sh - sudo chown -R www-data:www-data /var/www/pelican - ``` - - - ```sh - sudo chown -R nginx:nginx /var/www/pelican - ``` - - - ```sh - sudo chown -R apache:apache /var/www/pelican - ``` - - - - ### Restart Queue Workers - - After _every update_ you should restart the queue worker. - - ```sh - sudo php artisan queue:restart - ``` - - ### Exit Maintenance Mode - - Now that everything has been updated you need to exit maintenance mode. - - ```sh - sudo php artisan up - ``` - - - diff --git a/docs/panel/advanced/plugins.mdx b/docs/plugins.mdx similarity index 96% rename from docs/panel/advanced/plugins.mdx rename to docs/plugins.mdx index 57ec5253..5f1ce05e 100644 --- a/docs/panel/advanced/plugins.mdx +++ b/docs/plugins.mdx @@ -1,4 +1,3 @@ -import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -6,9 +5,9 @@ import TabItem from '@theme/TabItem'; Plugins allow you to add new functionality to the panel without modifying any panel core files. - +:::warning The plugin system is still in development and features might be missing! - +::: ## Install a Plugin @@ -21,22 +20,22 @@ Plugins allow you to add new functionality to the panel without modifying any pa
- +:::info[Need some plugins?] Check out our [Plugins repo](https://github.com/pelican-dev/plugins)! It contains free and open source plugins created by the Pelican team and the community. We are also working on adding a plugin marketplace to the [Hub](https://hub.pelican.dev). - +::: ## Create a Plugin - +:::danger You **need** at least basic [PHP](https://php.net), [Laravel](https://laravel.com) and [Filament](https://filamentphp.com) knowledge to create plugins! - +::: Run `php artisan p:plugin:make` inside your panel directory (`/var/www/pelican` by default) to create the basic files and folders for your new plugin. This will create the `plugin.json`, the main plugin file, a config file and a service provider. - +:::info[Need help?] Visit our [Discord](https://discord.gg/pelican-panel) if you need any help when creating plugins! - +::: ### Plugin Structure @@ -48,9 +47,9 @@ Everything is auto-discovered and service providers, artisan commands, migration The only exception to a normal Laravel project is the `app` folder, it is called `src` instead. Besides that, is still follows the same sub-structure, e.g. models go in `src/Models` and service providers are in `src/Providers`. - +:::info The plugin id and the plugin root folder name need to match! - +::: #### plugin.json @@ -71,9 +70,9 @@ Most of the fields inside the `plugin.json` are generated when running the [arti | panel_version | No | The panel version required for the plugin. See [below](#panel-version) for more information. | | composer_packages | No | Array of additional composer packages. Key is the package name and value is the version. See [below](#additional-composer-dependencies) for more information. | - +:::info You can ignore the `meta` fields. Those are used internally to keep track of the plugin status and load order. - +::: #### Update URL @@ -271,9 +270,9 @@ public function saveSettings(array $data): void } ``` - +:::info[Naming Conventions] When adding new environment variables make sure to prefix them with your plugin id, e.g. `MYPLUGIN_TEST_INPUT` and not just `TEST_INPUT`. - +::: ### Modify existing resources @@ -350,10 +349,10 @@ public function register(): void ## Publish a Plugin - +:::danger While Pelican is still in beta, please do **not** sell plugins. Also, if possible, please make them open source. During the beta we still add new features and change existing ones. So keeping your plugins open helps us to improve the plugin system! - +::: To publish a plugin you only need to do two things: @@ -362,12 +361,12 @@ To publish a plugin you only need to do two things: And that's it! Now you can take the zip file and share it with the world! - +:::info[Marketplace] We are currently working on adding a plugin marketplace to the [Hub](https://hub.pelican.dev). Until then you can publish your plugins on our [plugins repo](https://github.com/pelican-dev/plugins). You can also share them in the `#plugins` channel in our [Discord](https://discord.gg/pelican-panel). - +::: - +:::info[License] You can license your plugin code under whatever license you want. You do not have to use the same license as the panel! You also don't have to open source your plugin code. But if you do want to open source it we recommend [MIT](https://choosealicense.com/licenses/mit) or [GPL v3](https://choosealicense.com/licenses/gpl-3.0) as license. - +::: diff --git a/docs/troubleshooting.mdx b/docs/troubleshooting.mdx index be1bf9b2..20e1def2 100644 --- a/docs/troubleshooting.mdx +++ b/docs/troubleshooting.mdx @@ -1,8 +1,3 @@ ---- -id: troubleshooting ---- - -import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -23,9 +18,9 @@ tail -n 1000 /var/www/pelican/storage/logs/laravel-$(date +%F).log | grep "\[$(d * `502 Bad Gateway Error`: Make sure that php-fpm is running and that you are using the correct php version in your webserver config. * `CSRF token mismatch`: Enable SSL for your Panel with HTTPS protocol scheme in the `APP_URL`, or set `SESSION_SECURE_COOKIE` to `false` in your `.env` file. * `Connection refused [tcp://_______:6379]`: Redis isn't running or isn't reachable for some other reason. (start by checking the status of the redis service: `systemctl status redis-server`) - * `SSL: no alternative certificate subject name matches target host name '_______'`: The used SSL certificate for your panel isn't valid for your panel domain, see [this guide](./guides/ssl) for creating a new SSL certificate. + * `SSL: no alternative certificate subject name matches target host name '_______'`: The used SSL certificate for your panel isn't valid for your panel domain, see [this guide](./install/misc/ssl) for creating a new SSL certificate. * `General error: 8 attempt to write a readonly database`: Your `database.sqlite` has wrong file permissions and is read-only. Make sure the file is writable and owned by the correct user. - * `Class '_____' not found`: This usually means you are missing php extensions. Make sure [all needed extensions](./panel/getting-started#dependencies) are installed and that you are using the correct php version. + * `Class '_____' not found`: This usually means you are missing php extensions. Make sure [all needed extensions](./install/panel/standalone#dependencies) are installed and that you are using the correct php version. * `Connection timed out after 5001 milliseconds for _______:8080`: Your panel can't reach wings, see the wings connection issues steps below. @@ -62,7 +57,7 @@ It should say that the service is active and running. If its in a failed state r
Common errors - * `open /etc/letsencrypt/live/_____________/fullchain.pem: no such file or directory`: The SSL certificate for wings is missing, see [this guide](./guides/ssl) for creating a SSL certificate. + * `open /etc/letsencrypt/live/_____________/fullchain.pem: no such file or directory`: The SSL certificate for wings is missing, see [this guide](./install/misc/ssl) for creating a SSL certificate. * `Pool overlaps with other one on this address space`: You already have a docker network using the default subnet. (`172.18.0.0/16`) Change the subnet in your wings config file and use `systemctl stop wings && docker network rm pelican_nw && systemctl start wings` to apply the change. * `Error response from Panel: AccessDeniedHttpException: You are not authorized to access this resource. (HTTP/403)`: Your wings token is wrong, you need [update the token in your config.yml file](./wings/install#configure) * `Error response from Panel: _MissingResponseCode: No error response returned from API endpoint`: Your panel is not responding correctly. This usually happens when Cloudflare is blocking the connection. In that case make sure your wings ip is added to the Cloudflare firewall. If you aren't using Cloudflare it might be some other CDN/ DDoS protection service or your provider. @@ -104,10 +99,10 @@ In both cases it should output this when wings is reachable: {"error" : "The required authorization heads were not present in the request."} ``` - +:::info Not sure what a specific error means? Visit our [Discord](https://discord.gg/pelican-panel) and we will be happy to help you! - +::: ### Check node settings diff --git a/docs/wings/install.mdx b/docs/wings/install.mdx deleted file mode 100644 index 32894926..00000000 --- a/docs/wings/install.mdx +++ /dev/null @@ -1,137 +0,0 @@ -import Admonition from '@theme/Admonition'; - -# Installing Wings - - -This software will not work on Windows operating systems. - - - - It is always recommended to keep the server files on a separate partition. - This prevents the root partition from filling and causing the host to crash, potentially becoming unbootable. - - -## Supported Systems - -The following is a list of supported operating systems. Please be aware that this is not an exhaustive list, -there is a high probability that you can run the software on other Linux distributions without much effort. -You are responsible for determining which packages may be necessary on those systems. There is also a very -high probability that new releases of the supported OSes below will work just fine, you are not restricted to -only the versions listed below. - -| Operating System | Version | Supported | Notes | -|:----------------:|:--------:|:---------:|:---------------------------------------------------------------------:| -| **Ubuntu** | 22.04 | ✅︎︎ | | -| | **24.04**| ✅︎ | Documentation written assuming Ubuntu 24.04 as the base OS. | -| **Alma Linux** | 10 | ✅︎ | | -| | 9 | ✅︎ | | -| | 8 | ✅︎ | | -| **Rocky Linux** | 9 | ✅︎ | | -| | 8 | ✅︎ | | -| **CentOS** | 10 | ✅︎ | | -| **Debian** | 11 | ✅︎ | | -| | 12 | ✅︎ | | - -## System Requirements - - - Please be aware that some hosts install a modified kernel that does not support some docker features required for Wings to operate correctly. Please - check your kernel by running `uname -r`. If your kernel ends in `-xxxx-grs-ipv6-64` or `-xxxx-mod-std-ipv6-64` you're - probably using a non-supported kernel. You should contact your host, and request a non-modified kernel. - - -To run Wings, you will need a Linux system capable of running Docker containers. Most VPS and almost all -dedicated servers should be capable of running Docker, but there are edge cases. - -When your provider uses `Virtuozzo`, `OpenVZ` (or `OVZ`), or `LXC` virtualization, you will most likely be unable to -run Wings. Some providers have made the necessary changes for nested virtualization to support Docker. Ask your provider's support team to make sure. KVM is guaranteed to work. - -The easiest way to check is to type `systemd-detect-virt`. -If the result doesn't contain `OpenVZ` or`LXC`, it should be fine. The result of `none` will appear when running dedicated hardware without any virtualization. - -Should that not work for some reason, or you're still unsure, you can also run the command below. - -```sh -sudo dmidecode -s system-manufacturer -``` - -### Installing Docker -Wings requires Docker CE. For full instructions on installing and configuring Docker, see the [installation guide](/docs/guides/docker). - -For a quick install of Docker CE, you can use the command below: - -```sh -curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh -``` - -### Installing Wings - -The first step for installing Wings is to ensure we have the required directory structure setup. To do so, -run the commands below, which will create the base directory and download the wings executable. - -```sh -sudo mkdir -p /etc/pelican /var/run/wings -sudo curl -L -o /usr/local/bin/wings "https://github.com/pelican-dev/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")" -sudo chmod u+x /usr/local/bin/wings -``` - -### Configure - -Once you have installed Wings and the required components, the next step is to create a node on your installed Panel. -Go to your Panel administrative view, select Nodes from the sidebar, and on the right side click Create New button. - -After you have created a node, click on it and there will be a tab called Configuration. -Copy the code block content, create a new file at `/etc/pelican/config.yml`, paste the content into it and save. - -Alternatively, you can click on the Auto Deploy Command button, copy the sh command and paste it into your terminal. - - - If your Panel is using SSL, then Wings must also use SSL. - - See [Creating SSL Certificates](../guides/ssl) documentation page for how to create these certificates before continuing. - - -### Starting Wings - -To start Wings, simply run the command below, which will start it in a debug mode. -Once you confirmed that it is running without errors, use `CTRL+C` to terminate the process and daemonize it by following the instructions below. -Depending on your server's internet connection pulling and starting Wings for the first time may take a few minutes. - -```sh -sudo wings --debug -``` - -You may optionally add the `--debug` flag to run Wings in debug mode. - -### Daemonizing (using systemd) - -Running Wings in the background is a simple task, just make sure that it runs without errors before doing -this. Place the contents below in a file called `wings.service` in the `/etc/systemd/system` directory. - -```ini {9} title="/etc/systemd/system/wings.service" -[Unit] -Description=Wings Daemon -After=docker.service -Requires=docker.service -PartOf=docker.service - -[Service] -User=root -WorkingDirectory=/etc/pelican -LimitNOFILE=4096 -PIDFile=/var/run/wings/daemon.pid -ExecStart=/usr/local/bin/wings -Restart=on-failure -StartLimitInterval=180 -StartLimitBurst=30 -RestartSec=5s - -[Install] -WantedBy=multi-user.target -``` - -Then, run the commands below to reload systemd and start Wings. - -```sh -sudo systemctl enable --now wings -``` diff --git a/docs/wings/optional-config.mdx b/docs/wings/optional-config.mdx deleted file mode 100644 index 43b6ebce..00000000 --- a/docs/wings/optional-config.mdx +++ /dev/null @@ -1,155 +0,0 @@ -import Admonition from '@theme/Admonition'; - -# Additional Configuration - - -These are advanced configurations for Wings. You risk breaking Wings and making containers unusable if -you misconfigure something. Proceed only if you know what each configuration value does. - - -You must apply all changes to your Wings `config.yml` file located at `/etc/pelican` and restart wings. -Verify your config file using [Yaml Lint](http://www.yamllint.com/) should you receive errors related to YAML parsing. - -## Private Registries - -You can use these settings to authenticate against (private) docker registries when pulling images. - -### Available Keys - -| Setting Key | Default Value | Notes | -| ----------- | :-----------: | ----------------- | -| name | null | Registry address | -| username | null | Registry username | -| password | null | Registry password | - -### Example of usage - -```yml -docker: - registries: - registry.example.com: - username: "registryusername" - password: "registrypassword" -``` - -## Custom Network Interfaces - -You can change the network interface that Wings uses for all containers by editing the network name; it is by default set to `pelican_nw`. For example, to enable Docker host mode change the network name to `host`. - - - Changing network mode to `host` grants Pelican direct access to all machine interfaces and Panel users can bind to any IP or Port even if it's not allocated to their container. You will lose all benefits of Docker network isolation. It is not recommended for public installations that are hosting other users' servers. - - -### Example of usage - -```yml -docker: - network: - name: host - network_mode: host -``` - -After making changes, the following commands will stop the Wings, remove the Pelican network, and start the Wings again. Run at your own risk. -`systemctl stop wings && docker network rm pelican_nw && systemctl start wings` - -## Enabling Cloudflare proxy - -Cloudflare proxying of the Wings isn't beneficial since users will be connecting to the machine directly and bypassing any Cloudflare protection. As such, your Node machine IP will still be exposed. - -To enable Cloudflare proxy, you must change the Wings port to one of the Cloudflare HTTPS ports with caching enabled (more info [here](https://developers.cloudflare.com/fundamentals/get-started/reference/network-ports/)), such as 8443, because Cloudflare only supports HTTP on port 8080. Select your Node in the Admin Panel, and on the settings tab, change the port. Make sure that you set "Not Behind Proxy" when using Full SSL settings in Cloudflare. Then on Cloudflare dashboard, your FQDN must have an orange cloud enabled beside it. - -You are unable to proxy the SFTP port through Cloudflare unless you have their enterprise plan. Server transfers will most likely not work either due to [Cloudflare's request body limits](https://developers.cloudflare.com/workers/platform/limits/#request-limits). - -## Container PID Limit - -You can change the total number of processes that can be active in a container at any given moment by changing the `container_pid_limit` value. The default value is `512`. -You can set it to `0` to disable the limit completely. However, this is _not_ recommended as the limit prevents malicious overloading of the node. -Restart wings and your game server to apply the new limit. - -### Example of usage - -```yml -docker: - ... - container_pid_limit: 512 - ... -``` - -## Throttles Limits - -You can use these settings to adjust or completely disable throttling. - -| Setting Key | Default Value | Notes | -| :-------------------- | :-----------: | ---------------------------------------------------------------------------| -| enabled | true | Whether or not the throttler is enabled | -| lines | 2000 | Total lines that can be output in a given line_reset_interval period | -| line_reset_interval | 100 | The amount of time after which the number of lines processed is reset to 0 | - -### Example of usage - -```yml -throttles: - enabled: true - lines: 2000 - line_reset_interval: 100 -``` - -## Backups Limits - -You can use these settings to adjust or completely disable throttling. - -| Setting Key | Default Value | Notes | -| :-------------------- | :-----------: | ------------------------------------------------------------------------------------------------------------------------------------| -| write_limit | 0 | Impose I/O write limit for backups to the disk, 0 = unlimited. Value greater than 0 throttles write speed to the set value in MiB/s | - -### Example of usage - -```yml -backups: - write_limit: 0 -``` - -## Transfers Limits - -You can use these settings to adjust or completely disable throttling. - -| Setting Key | Default Value | Notes | -| :-------------------- | :-----------: | ------------------------------------------------------------------------------------------------------------------------------------| -| download_limit | 0 | Impose a Network I/O read limit for archives, 0 = unlimited. Value greater than 0 throttles read speed to the set value in MiB/s | - -### Example of usage - -```yml -transfers: - download_limit: 0 -``` - -## Installer Limits - -Defines the limits on the installer containers that prevents a server's installation process from unintentionally consuming more resources than expected. This is used in conjunction with the server's defined limits. Whichever value is higher will take precedence in the install containers. - -| Setting Key | Default Value | Notes | -| :---------- | :-----------: | ----------------------------------------------------------------------------------------------------------- | -| memory | 1024 | The maximum amount of memory install container can use unless server memory limit is higher than this value | -| cpu | 100 | The maximum amount of cpu install container can use unless server cpu limit is higher than this value | - -### Example of usage - -```yml -installer_limits: - memory: 1024 - cpu: 100 -``` - -## Other values - -More commonly discussed values. - -| Setting Key | Default Value | Notes | -| -------------------------- | :-----------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | -| debug | false | Force Wings to run in debug mode | -| tmpfs_size | 100 | The size of the /tmp directory in MB when mounted into a container | -| websocket_log_count | 150 | The number of lines to display in the console | -| detect_clean_exit_as_crash | true | Mark server as crashed if it's stopped without user interaction, e.g., not pressing stop button | -| (crash detection) timeout | 60 | Timeout between server crashes that will not cause the server to be automatically restarted | -| check_permissions_on_boot | true | Check all file permissions on each boot. Disable this when you have a very large amount of files and the server startup is hanging on checking permissions | diff --git a/docs/wings/update.mdx b/docs/wings/update.mdx deleted file mode 100644 index ccc1e62f..00000000 --- a/docs/wings/update.mdx +++ /dev/null @@ -1,47 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -# Updating Wings - -Updating Wings is a painless process and should take less than a minute to complete. - -## Wings Version Requirements - -| Panel Version | Wings Version | Supported | -|:-------------:|:-------------:|:---------:| -|1.0.0+ | 1.0.0+ | ✅︎ | - -## Download Update - - - Running servers **will not** be affected. - - - - - First, you need to run the Wings auto-updater, which is included starting from **beta9**. - - ```sh - sudo wings update - ``` - - - First, download the updated wings binary into `/usr/local/bin`. You will need to stop Wings briefly. - - ```sh - sudo systemctl stop wings - sudo curl -L -o /usr/local/bin/wings "https://github.com/pelican-dev/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")" - sudo chmod u+x /usr/local/bin/wings - ``` - - - - -## Restart - -Secondly, Restart the process. - -```sh -sudo systemctl restart wings -``` diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 5156b8d2..55308768 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -72,15 +72,15 @@ const config: Config = { items: [ { label: 'Panel', - to: '/docs/panel/getting-started', + to: '/docs/category/panel', }, { label: 'Wings', - to: '/docs/wings/install', + to: '/docs/category/wings', }, { label: 'SSL Setup', - to: '/docs/guides/ssl' + to: '/docs/install/misc/ssl' }, ], }, diff --git a/sidebars.ts b/sidebars.ts index c2e0ad7f..97a4c1e6 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -15,64 +15,87 @@ const sidebars: SidebarsConfig = { 'welcome', { type: 'category', - label: 'Panel', - collapsed: false, + label: 'Installation', + link: { + type: 'doc', + id: 'install/install', + }, items: [ - 'panel/getting-started', - 'panel/webserver-config', - 'panel/panel-setup', - 'panel/optional-config', - 'panel/update', { type: 'category', - label: 'Advanced', + label: 'Panel', + link: { + type: 'generated-index', + description: "You can choose between two installation methods:", + }, + collapsed: false, items: [ - 'panel/advanced/redis', - 'panel/advanced/mysql', - 'panel/advanced/artisan', - 'panel/advanced/docker', - 'panel/advanced/plugins', - ] - } - ], - }, - { - type: 'category', - label: 'Wings', - items: [ - 'wings/install', - 'wings/optional-config', - 'wings/update' - ], - }, - { - type: 'category', - label: 'Eggs', - items: [ - 'eggs/creating-a-custom-egg', - 'eggs/creating-a-custom-yolk', + 'install/panel/standalone', + 'install/panel/dockerized', + ], + }, + { + type: 'category', + label: 'Wings', + link: { + type: 'generated-index', + description: "You can choose between two installation methods:", + }, + collapsed: false, + items: [ + 'install/wings/standalone', + 'install/wings/dockerized', + ], + }, + { + type: 'category', + label: 'Misc', + link: { + type: 'generated-index', + }, + items: [ + 'install/misc/ssl', + 'install/misc/mysql', + 'install/misc/redis', + ], + }, ], }, + 'plugins', { type: 'category', label: 'Guides', + link: { + type: 'generated-index', + }, items: [ - 'guides/docker', 'guides/mounts', - 'guides/ssl', 'guides/php-upgrade', 'guides/database-hosts', 'guides/change-panel-domain', 'guides/uninstalling', - + { + type: 'category', + label: 'Eggs', + link: { + type: 'generated-index', + }, + items: [ + 'guides/eggs/creating-a-custom-egg', + 'guides/eggs/creating-a-custom-yolk', + ], + }, { type: 'category', label: 'Disk Quotas', + link: { + type: 'doc', + id: 'guides/disk-quotas/index', + }, items: [ - 'guides/disk-quotas/about', 'guides/disk-quotas/ext4-xfs', - ] - } + ], + }, ], }, 'troubleshooting', diff --git a/src/pages/faq.mdx b/src/pages/faq.mdx index 9daa1a58..9056fac5 100644 --- a/src/pages/faq.mdx +++ b/src/pages/faq.mdx @@ -1,7 +1,5 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import Admonition from '@theme/Admonition'; - # Frequently Asked Questions @@ -9,10 +7,10 @@ Here are some of the most asked questions and our answers. **Last Updated: 2026-03-12** - +:::info[When is the beta?] The Beta is now available! - **Head over to the [Install docs](/docs/panel/getting-started) and try out Pelican yourself.** - + **Head over to the [Install docs](/docs/install) and try out Pelican yourself.** +::: @@ -94,7 +92,7 @@ Here are some of the most asked questions and our answers. Plugins do _not_ fall under the new license because they do not modify the panel source code. See the [plugin FAQ](?faq=plugins) for more information. - + :::info[Summary] The license change does only affect you if you meet _all_ of the following requirements: 1. You modified the Pelican panel source files. 2. These modifications are not open source. @@ -102,7 +100,7 @@ Here are some of the most asked questions and our answers. If you meet _all_ of the above requirements you need a commercial license. **Please note that the usage or development of plugins/themes does not require a commercial license.** - + :::
diff --git a/src/pages/index.tsx b/src/pages/index.tsx index b632ead6..7c42cab4 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,4 +1,4 @@ -import React, {JSX} from 'react'; +import React, { JSX } from 'react'; import clsx from 'clsx'; import Link from '@docusaurus/Link'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; @@ -13,7 +13,7 @@ import { Icon } from '@iconify/react/dist/iconify.js'; import styles from './index.module.css'; function HomepageHeader() { - const {siteConfig} = useDocusaurusContext(); + const { siteConfig } = useDocusaurusContext(); return (
@@ -25,7 +25,7 @@ function HomepageHeader() { Install e_QN{v_ja~#51p(=u;Lt<_M37#D5LyU5^fo#wNKNhTIj(- zQF<>4O^{9qy(hf;pffu6%v#TLf9rk!`PO6>4&>~!&)&cNE7x`Hodn%fSEfG9co+tQ zQL9{2xCQ?A90sGh^UFc-j(3k4ANXH`m$shkEi-p^M`s618#^SstEVH99qD0X34?jy z(KoNs)Uf|jx&6rZ?v=nL<_dHK`JJqPeqTB|y2gyzRiR^zJU1D3t_)pajlbs^-UaOjOpS^k9B@2E_p*l3m{AT~`Tn*KdgSu5Z8|wvwT6#VHNEmG2eH(fCn=111f6NNZCBgSewdw~s z=2}y&S`OaBZpWQ|(Mz05=@rB(*y?e(Ne4C2S%9zFI zz|{q+K>q;oOXb&shE)&qnoEn%f2i;duW%1&%NFdO3)=VEl3`lGsA*ic7N@%*5O}=q z_~U1ax?g+l+I#K`3Uay9!rZ7Ib#WPvFsp09bKI+mo zZ3lwb%J?dF>dL;nc`NimNmNFI`NA1hJWSk+N1YTjMH=Xw`FIja#Iw33QNt0{ zSM=I+1dTE!9{n8sSm7{-MVIE)(`QnPY}21z>+~D=03Y4Z`ttPC?R}i}KiS?qE8({Q z-x$o%Pe^i(xa*X%UW3%~bAqe(~FpAa4_1O)S+MW4`6(!|h=6(AKZ)-8i z5$gesEO$0kVvc@#vLk%ooYn)L=FqTTzC>;}j$r7`mU&Dry4(P_kA~*ApcBYE?@Fn* zK|-|^o=k@M89HZ4CSCCYe&=Qb+)PjHh9trP&1YueV24HPnhotucC*In;?hmVRmU} z3ropc3QFI)0DsAFSi8D9O7io&ySwwb3-LKPTk#7>NJ#Ks5#$#Xoz;*UN#)o!PQ~R@fdzWuk0QTVbFmvP= z;Jd<)M)Uu8hl{JC8|dWQfd26g7i|!&{I`%U4j5+yQqc`*@5=dO7Z!*=?{~yF+wD!q z0>O{8L!v=b7w}YpzdTY|MeXLFcR(hvvOzoU-35&OmzJ(Jmfwx_m$5-t_NMdWK)~&P z_WPICf6RTaF=(ZxCaK_nz(B)OQIO$)o-b+PfUvQU-1}9;Le$b6DIv;hE+lTrD~z-> z;}y3w7vL2^3R?&W3ksW?iHQHum5RNKtC>9l33UZJ=d%I*AVn?2&BTR8dBw%WMR|n< zK|kW+NHbmmOLI{%VQ~?JIYRJ!HfS>|B)_A*)!qfj;F4Ews>pB% z@?H7<&P_WrS4(gMhyfdW3kP?X@0YY~&`2#;GsvC-Vq!v~qT)hgViFRfViI3Rz1O1- z(%A+0BGjwE6+R)+z1yLMkp$BLrZs~+6?CxoKA4T9yff0w)xlZY!NE?31L}euy7SM= zY9OF2%v{YB%v_P6(<_3al2?Qz1w^$4ge8R}B!$Fyt_Vn8`Jugog^i`>|I``^A9m@l zi+;_<1w7w#@2#&frG<3*`q$S#?QHgfiJg5fEF{ekU#H+==7zM`8z<=N>m`J>nY|Sf z|KJRkqT-@LR|GA2Ero^6zzT|)^GXN;e-gG7L<);ahzJNF5P$96#lh0m z-OL$z)e6`V*a|r4o~_s~ep{+be{Jt>jfB<#n2h&|5bqBrGZlWb7nF4VAHKe=!~er4fUf_2$bV(uf6eu;x&A8){8x?t z^{#)-^8*WvGE3TY1zkUOACrxiut0-ANuTvb^CwhR52Qk5A2-Z|uW zP2U9uTrSY`E#WG$UZ~h_!!=8@c!V+KWVVM1|oH5jta<0V} zTayLui%i{DM?Ak5Z4+?j=EYm-H}ACFId`4*tYpFufB}AgSuC=ueg6ymCU@ej@L%3Iap?KJAK!Rze4~E@vjwtNBnCA zC@lW9!k!gU*KO~%EVf8BYwqG_7vDRWhS2$!$lu$$CdM;AD5Vt2%sLsF%)+)sA`AZl zb2RWGu96p>i9Cw~b`4MW+GtRmz(P)^N+n6IQt``mmmbgzNT z$6b0jpFQq#x%hI^ui(9ejv>!X37pIB&PMI)ZpOX*mU5E8{lPBB?>$%h4?16OJXkZb zEXz2)|6xtpy$81Epg~Pt2&JY<%XQPJtn^m4GuSmH&0Uwhd7`9+q7+i*k*@R;OkJh_ zLNl{~mr;U{wRL3Fv5?WHvW$nId)cY#5}*72YR&QnLs%hWIhtv-YUuMmSZ3gE%=KFMkck>a#S1Oij;kbT#P!E$w3P?JUILgHXnUF!AXe!kc`N0JmA0BcQ>luk8c)z@R9>#|>C1 z#a@bY{e@zW9;uq+dvk>z?^&GdHwtpxX)~%nsHj=&yTtdKo=pL<; z>wzNBgmJINr35p$A3R%>P_?#2*%;bMYvfW-UJMmadvh}l8vk1r^SKQbO#@MO#v!{v z(g55PI1*P5_yrEV(NVBZz-{Lo^-oaSHnk8bm-3UpHns;7+!PdQ0^7$@&HJu>y~y?C z?%lhkYglYALz~USy)qgwZ#59x8Fk!%hLQ1@;)i%@T3XGW-;UWHhi(*CNnD;( zd67gY)d!E~N{k*hYY}j|09|@pQCBLI$#b@dSy)U=SwX?3Kj7lUi*4-CHOHsiJZ$u| zw4o1aY>tBYbuLNWXe50F3a;?6mW15j+m>!_eRd9oTEn>VAwS*+Tafw+6<8)%ctOwq z0*ik$`JR9LThAaf{QtuWUU?vUq-05#j|>$NT@F%*HXPCtZn~5*5t}(SJ}A}Ekeh_j zDp}1?{l6F77n;*63Qcv~1`%H_V6+xL)H-O!ZowNu-s_9xPn`y+yym z%1T&7w8-A-i1=Qu-5bu^S2I;{pjt(RGHWrkN|Pz!JL`|VjT-7^z+feTb(Hg2L= ztZ*dq;&X}>sBnu^vh<)rb2a<2X-Np!>gbf%=XtJK2{SH(}@>IV*@ct9zb&VMH4) zBh8;P7YeUT>dXfQwq2hK8E-sO+k!U450<XL@%A;jZG>ia@Ju)8#oQxaoM!YkDxWjek)JCm1uGcY%! zWfhea8skp-xFOBEdgGb1q6v9jk5egJl`vF@^4@7oJ9gd=7rmtv_Nr-mrw}JBf!^j3 zvf^STxD87TZ)>6!c%!b@PE7W&mJoL*>ZGJjX@>>^54lJoX6~MdPd1Fl-ZjCBZftPD zPa^6yBwziS^rxxbPAh}lAUcyrh7bsn4qnE-HJ6z0NEvXGKUZ&SYZqA0nnc%l zhCd|Fe|G*P4XT*><@x?HwCaH8SV-lpbjJWQd?V9e+I}Nj5%}gyeSMY){&?01S$IzU z@Osc~(~!(0k93UpI>~hI=1XgGoK+{5hf62%=AD-yw{_;udH~Q}x8KFG{_!I-0Wzw0 zyy}sj>XdE&=zZea_*QvU4%vOCh(Y4vhXPO6cUAiL?E7c31`CD2(zWxR%?2J-;yd;_ zA!(X4>~5v4p53sG$D;e`hpR~~2_&MHhV%)ZteBb{7dkzL?}E!z{!rQ>Sb)}`X~L7T zt?ths9^z#z!L%3OCiF{CwS{$q#Npx)dm1E*EC|J@z0lcwqoEK1XfvFyN7u;wHjw8Ps>U5 z0M{GERoH*rWL0K1eljanLPkrkEmT&1h~)7rDE*MU=&`Q|(Vd+g#>HAzt-AfI%d!;6 z59aSG3CmtDP&zvG4KwE@i1F7mMql|;uD0we!lM0_n{4u}dfiO>{#;nOaEtT8u#w31 zWMx5lsVcAYdE%}MZz&#kTINEQQb(UY(_5{j7hc%`u_LsX0F;c0NqYKK=QszJ+T0z2 zE7*Lb^KM7F*%O{>?t*n$)RmV#AulUh(;gCNhDxv-0imsARAMSg2-m|9QHoF3gUI2rfG>7NHda{(&?KfS!%?r zEVK-+HXj`k9y)6aRRM-^h-Zx@@7zf6|E!pUgreWX)6>0<0+Q$AJ^!ux()kGowh|mz z`*2wwhq_g|(=jz8&*>Cu@6##T=zDhcb}JE+5;Y48B+=E;<;(i3^L?#-*rW&ds74dv zIF{L7>3CYd0T8L$#!k0~vMR@4<8nolUilRi4OK7Zo!(#Z2PmRHa zR!hk{&|)bWmJAGc9E+)!xc8uLyLIL??UUjvP7c;*LQ*(Em$gGVzf$e3g4{YDL~l08 zgEmOhjU^G!P}N_9mFWiJvA&-&l0$#H*V^g64-}oNdjVL5B}Ii4_+_xE5A2qi<}_S{ ziUVpP6O=J1jV|T~^9L!j;ly~2I)P_G!Pr>sqh`|UJ!~wdP}82$6f$ey?D1S0v=wl^ zfz&qg(5$nyDf`)yGT#2Mzz>&YH59puTw2gXAV6F(JdXu&rAh7@^Yq8fufVH4F!%;- zP@ykybKUr~xq%Vk*^ANf)7;WMLK^T`P0`JQX?=N8}zuU(fZOD==zX2*;H&Q)`Ts2its(Y7}%C+FSAv!_3p z_smJypu0ip|?6*!N+1G>?Z*_|5)3`#V1MSPq3-++a7r)ZV5wt9-aq zOjJEhXVQf{E9^@LgMEwva;jqkVR3XKqyR_0esbNk!d4OQ24G85oJ{7Rq!;j36lI=m zbc-P-Bg(|YhH!{Q3)WAR&D(dF)U0gXnBr51ZIAeV0jIPzGGj)LKcUT@q zfoh`79ko8Aua(*S(WVUvEnchp9e>|ZO8V1 zbodB_o={98BBC{*Z?_LudGQbEf*+|mOY+4J+v!DUiY|>MH%<3}Qkx3udXA~3;UGy5 zWd3w?Of>b!Y1ZOwFLyiRRgCu-fPo2A`>GelQO+}@h)ng?Um8SMY^Ms|)qP8hWAnWr zlO26UAMJz&`Mxms$}`?ReTjVTOx&%TH;+f1d{M(TEX&*&!)MDo{H@#*bFF{bvtU~+ zKKDUas?W&dgbSDL!n>o@)%i(7Px|=l{4H%W!;oZ9&ygWz#m6Cae@X%Zo?1N+*no<{ zMK%C_M;naEjSUFOSa=_=%1w`i#Xpd?~)A2R!vCn}}$p zZ{Y#swchGD%&?tV?57yDR-P3XB{Q=dI6E(cJC?-Pr)5NcKjS2oe+Q!jQxB4=QI-zrsIbuu~!?8@NX%! zU|1>`4WP%edR^W5yy`2l8Ud85@qy$58QoQhgFj1|n|IT>(A*2ded!1h^_yLIp1t3u zF^0F{VpjRi>&jg8j@647gTsM=gVp}|gWdCc27{GERzC&k$c+o zWIyKz&b^E4U8{Q9>sc3;9J$_LQ;!ErWF*7mf+;M=%P=6Vl7%jkmczGdHbCjLwfl(5 z$etGkdDDg`h}X1ys`R&XyZtNxD9Jvb1tQlQj3eK$Uw4VAO%JN6X9AT()>rCRRu1`8 zmisxaZlZF_)G)?qt3P2~CQEmsxOcw4-{#(JbSN;uNl6MQB7*aV+))j`WSu@8^F`*D zc=YL77JmCP-*$F}Fc2Hqc(_~`26x`_0x>OxHX?~J^;oyLe|r0FvKIW<0Jmbd0x>2R zUgBij?6m$0V4opd$x{_>cFlSRX7o&BC8S8Owji&`aEHlaf9zXL?+4mPQSQj>GmztH zt^ttl-e6@X+0}-Sx2AoP|5OjuMk4M8$akJfOzTCh03^h5axBN;b8F~mJ#+ZnIQD(? z(V=cS)8&;leKV$5SN7eT4rW3YvbF|64VFIBhy>Wt;`rB;vGNPxoneP=>wXcLaLw+Z zVO4IuZCX;&d4bzlze?dAAR`Iq_UIKU|KTL2!85nocj!>_C6*bn#A2hHX-KG~ct5^1H(iJvVxZ9_=j zTA3{WQhw`|HtO+o#^tl`&JavIDCr(L6;dOyS&(BE`B?poh|)X zNY?c_1Jt*XNHI_j1t>yV%La!ojatiD*9XTV#`64Q=|^S`TdmIEPM6s4PUvcsZ5!{} zqLuVPE`|isui~=YP*I+7OtD50%T!<>y%%Lcy#fa@1;6IPe9ZC#`$LT5OmAmif?UK( z;A)wvyFC}pZyb5X<15J&XHWxijen-Bg^ z=Z%e8Xs#S0{?->38CXpyzLd30-bd6_0zQNhkg_awj)KDw6rvmaNNObzZ@ zqSXKa!N2wbaTo}ytI!%ss!agQmL;w|KL_9~kWmu~?p?U|(4-BKm*X>X{Mgq$M>$qm zN%I?(3p;robwf#Bqff+l-v_4x_(GZ~hFB)bQ`e~X$;5;QND6`ClCjph;o~oEy|VUM z4lOFE7Ein4g&9i^R@qwP2?Z-xtUiMOgSu1c-c`-G1!1|gVa$ZbO#V7QN9x9YwzmwW&g(3uE|d)rv^=1@2XM{54(JC&PtY=V9!20EQX=S0)US`aQg-*1%+X3#{k7;oAGzkHuk%%zDn#b zmg$k+E-WhG_t}ig_LU;wfMRkfjpgZuZM3JXOBL4cTmB6$&eAzIG#qW^+Qn73UV6tw zd8;QYukzG=D_q`(VH+U5_wU7i-gxaDpck2sj4YQINzA!_*fg}e=a8)|*dZn^BBYeVBe^bKL|Kh6RGmITi? zHS!xTcB0&;E0*FhY!=d}2drQpDJE(om26o!7N5R8oB4f$Opn zl05b0YYl!F&Pez?3*2n6hI4(gOT%Dm5fDUkfYAjo_z;@=?I62>Fi#zH8h{WxU{273 zA#vcS$N1J|h=RLqUvHem?+oA}-7B2wy%z*~i}brs>nbXc64ua%o&$yzT2|83Fuged znr&>A%(tMJWr1h_QAxE6K665nP(Fi_-D}byn5Q{OwPF+!KMbpb0ja@42M=T(fPdd6 z1Gmw`dYCC~LVGtekFuQO&hrqiqh<8nscBYEp{*tWR`tZIPBypZs1f|%NAjqbwg9Kr zr;@s0Dk?L{Kr$Js;+)(96-t$fKFhzj=fhwqkSM2$ymR+rDnP3j*vEX?1=V?%AL2Pj z9+(b{M@&O5d8Q>fUP~@3XIz!8)_-otxWz078ti;d;nM5b-y{mhwg{7oPAbVXzPK=T zg)+cQo_Wt^C;Y0En3Iyi4#9yl2VaBgNxCuw0GE)?5;vRpImTfhP7>-{ptHnX#)8FV z_4Y7f?lVo+)qBP1>+*-Jh?&1zdCwZCNPY_%yU$#FLG5Rn$Q5F?aji|^4Ww<+`3g{6}iWZ`YQ=a5Cl7i=35~SHS45`!s2W&w==trezV-y zjLitqp*9#+)V10-rFS-JHFadK3~i1P78@EX#^7!gKF;)x6Fue2xckJgbts3#TdAvN z&*nYwIR_M7y`FNg7)+g3z;>h;f<+40f_@x8ZnkfR1-}tTZN!XC_;3w8j)6akY1k)?U{&ue zR-71{2bKloQ>ER4rI)}x(Ze94C!UZUSbM+BfMnbKVzne$4@#8tP|4`~V8QuiP)7NV z-I{O-9n8tPYX+rlrT)eWcZKoaFX3+P$;Sa&O0{pEFd#y|K{MA++^SH5YkyBA)bLRI zXs~|aq(w-E&QT@?+J0Rjh?d=koA%8A{3Oc{cR4K^Feuc`ml?S-71(;9%t2toT#xS) zh?>HK5BRE=@bprCx9TRd0C#{2UGN#%XS6z=KwR>;^SQ%5QM(uvet>vVL_R|LKxG}L z)?OOp$g$gana@%l4Z^nIU_!zDWrMm}E*)QiB#$qY5buR=%2VZF{#LYXPtWjxhZSnr z8WJ>aB#LrI^O`&pWw2E}PW1Tv@eIffc2y)uX*`*QdsZ9{DLK+hZ;fsCRe($hs7>Zvx0z>8KZ**qU_7^(bsOfCT88OG02ro00Z{Y;?|&$+fI7O zn!U}#-R)NRRL6)N-!Li zLjnV#WXVICl2hiBbz3|yLGlLJID0>rN=vhIvimNjwlbI0eqg=sQS#+5NFp06kLxQ$ zZ99d3nq;gXfR#^JkSNIUibl&>0Br>){>=qi=x{!2O8rny0#zilH;UKe=_xrW9Y`6N z9XP-+mH`zoC^?5qbPOb5U+V?~)d4^MT4g^~GF|VmY@U2_9uQ-M8YnF7MuWxJO8p85V*H-A9OC7GXYH9rv1ClpjIpFVY} zrn}Jo5m0vw14X$l*!iNCVaCfGyhL6TF(@qj#-RGh?wf$a>i^huhOTT)}C{YlNhyrm#l1%2*~Uc;>> zHIaS;L0gZzeDb7w22>+JvfC4Bds|B{1F5b;BtU2Bx2GHU?#{98T`QApiXz5m*T zfG*sQIt47F#(4mn7p$n(daWX(R;J^Z7a=8m@%`rD6_2R{`i)f7GVrvyOjXwA?Hy1O zKwgrxA-Oa*`S61M4`uGC>qnj^ew0%-T+QpTjI1J&t;T(PuvcG>`QotrUG9~o5|d-c zKrVwuxs(w+3aC*n;#g~NV)blNfIi4;t9^bE=M)GF;2cH`Vi&aN>3;;yZfd$ZQl9_pjjHMH709+@8Kk(=NgPC}m z1eVq$9>* z0}^m5i^SuO5P{Tm^J6{9H6axijsB^@E~}|H6JRXC1{2@$413}cuxc;vCjv}7(RB>$ zCY2m?HV6Sa290SwbV$Ypx1Lr?S@T?siY**-u&)%F#NCp0yr$I8!%tElfD?vkzTkBa z0$&*G_at^#Nod@P<*kXfSUDf_0xc#Y>N;)ltZb;-M6pWff>yKWbCfFFhDnJ9=+JpV z7OfXAH~kWXy>XKe3v$UE0Ao5k7ES|8tNgVChL*JeZ+9^2F@rMbR6pDrmQ1#AlFncF zyzzcAv*xW!Bl+P^;GB>uP`XE2p-slL%P}#JA-sehF6DMQT?D|)%ClB+vxd_Q$YZ|i z*o6JpflZ2N4ukE=P=NL@jdo^pv~n^6eHgr^Gy!^o&U<~lXu9%YGf_twd;BIgKX1&~3T*xr6#y|9 z;;$jTg*hj>fohpBJ7cPoB%srkWOwrB8uv_M?_?tu-wn3r+`Rp*rS!*Kstqs$2z>4} zT>yA;stATbmtXNhSq@6LKrf#tN*%~2r{|DY^DGC~!B%VCGiSgL!RpsZu?9k$eNFzA zl4o{2JO`HB!Zj{li3zv!trmimN?j&Ml*79bqQ(s@44=Ot&Ulx7#BLc_71aW`04em+ ztF7?B+1%F^c%&JC+ z{M<$y$^vKU!X&eF*JAvDz7W_RW5fu2(Q?NQ(>qLTmU&Z zq%#EUACt-t9;;$Um1gJI@!ZFx;{pRs&~?~lY6r{%>^c(Yu@KY3%S`lE?|6a*Q_&s< zxLc-R7!1heR&V|o*El8&2;PNZovf{3>y2xt3$pzN!xZml3)A#Gxm;j=8mfDKBoL`D?aBS}k`HuYRJsZa%Y{aB56e;KIS97lYT`mWCfd zn~go6EZFo)g>$N&zNb3kSGiNV4f$1$1Co%(xq6-$qv~5`;?1|Z+J$uv_oB!&WadcU zGxqjh{WOqE20A~>RyB1>+E>;BXnHBI+Sn^DRuvxqnIPp+@LLeDn!w7==fyfUlW>Ts zRO;6N?UR&8xHa)$2Kv55;n{JzF?(+1#BKvcmolzjplmEm=5 z%Ma@xZY8sT`O!L5ukQ9&tS`Ktk@84J%@aWMRTt!g@ z-=~>;X`ycAdKjJf#LYS@$HR6uFNGYcW5_Fn)ycF*cjr56F8*3}F`9#F->Zx6C+;4! zbemj%DBoadC4WLRK5@ZIMk6^BMJ(<$7;beZsx>uu`?}R@EwkFc=_HgM(hBR>3+tM4 z>J_H{b-N}b`O}P(pz+D!cnRJ|*ClHfg8744tGwz7vpqEhx=9+|ctT7yWmjY)_-;2( zOnphUs7QIT$r&;gwOYk1_r=V*+ElCL8?hzOMK!HD<@Jsv0qd#yRMnDsK%rh73};&W ztd@7YJ3gcCe5RUISEAIZI6 z9as*>C}wv3vahFRgYQe_$ss1IW3r?`5{szoZmz_>gr_u#9X%|}jtx5QFW)Q48oha* zqPKfhJ|5F#QpIy?UPMH@B#k&ih3J{XGoXfdZ4z|FyO#=^vm3_NMVbW4b+Uh9GDkBF=j`k!maLU?Gf`&qXz`;w6!6&*q$Vo zy9PT9I63T0Z4cj&YE@$r10!V;3|p2HYkn5Bc<@)%$J0SUr}rPUBI|*jpzu6(HUAmY z=G;V^!Eu`0MGDM7{wkKdTx_v;x9GS*#ofCfT9%)migFD^+kX zW=*TP+Ye6=+CCQY+D2$O6~*xttX&9F;K+?#a=)~$XzNA{DO(>r9g+3IYE{o_jqO>n zFM6r_vlI+_}@Df#AurmAa88D07S$!KdSHDvvk-x%(L#&va7X5;%V-REn%3>$VL7B)^d@oxE=PMvvk^ZkB@L8wtJcv zw+eJ`QC@s`qC8p48Qv1Sw3H;^wvstI8g3f7Du+*h)hXx}CtWI~?o#rp*SC0WEH*9L zUuOI0#F~d~WceVu(4lp!RT>uBt_11;h2zP!ni!m$VS+a$P^o(IH7YN>F?U1t?Mvq` z&*)_+ah0rAz)~9>y45TZFVs;>-W4%xA@L6JgQ@$iw08e+izPY41 zY(7JVsn}Oj>)?0u&p(L`fxPFYTlqx)nb zh_0{@j9qhV3Fa%4=9zp`@j}vXaU^{7#ig+^ARp}rxbZyBbLo4fTJn-v;sRw6E3ud; z;ezPsvRPe!(3?AW+Y2xmmuY?3vk)dQH@a4!n9qCvA|icl^K>S6H`W2 zQXhR5<)uVIAd5OkRXcI7F~+J)hsrJhnbMVE0~ zIlHH!rv=l=M)V|J9{sS;53-v1!kf=FX6XtXw6{Ag>pEiSGNh|WjtGr&C!BzfLs#=x z#uXVV1`_-I?<9B`gwuO>(=o2ryt8XUYE2MF&{A&mUR}8r4<<@-=kF=``)jMkGe8r| z!z~P)b$IN`Ph{Y%_YrMj^%)W%hJDjwnRV4G`G_VTk5zALH2d{^2JW4mXsAUh!yf!( zvGh!OVc~taKeyjvr}s>ZZWT^=3&6L6=B?r^t?1zEk{097Gb>Q9$9m$kQZ0L1l&Ujd zrpvFq5|`o#yFAxbb!ffW#uqqQulqHEp)MVYvf)K0e=bIe)!>VnMseHzXILcN0-cg^ zms?n*uWacgFmQQXyaa>sCV*V?SoeaiT5G(^B~qtY!}dxjw89R?#vqr41zN9k%7c-d zAXCuNTtxV)3Obn>MtqDZSU>=jpQ)1xNeHlRjcG1_p+a7W}C+JcFm4iqvMGv z+g)km?he}y85}|H$S(}D`sVh%xR>G=)Dq7eYl^*HoeNB$w=x&eTpk|T{BVs}O%+2b z2az|Q8G}Tcl1Q&)QoSphF%-p^^xxb3)(QR^N1pRS#bN1XzAoFMQ^Y5WIvAev&_8Jr zek`lWl^>gbw&(%t<1(AEtqU@5qc|gSs2JHosV1>J7hhJxeTb{O$7g$UbN%J!T3DpU zAbYM4?wWDE<*5%14Tj4~d&MNvawSb&&49s*q#-pdv@JJfq;y(4UD18s$K&M7zSX(y zuR3LlBBQjOhctPk713Eoy*dl6xcS?Z=lW%&((M2$@_3d^aYa0N=m|pBa2M7X{o45I z)db*(*(PP+?1)aD5v%v?%nT{~e8i_`yIqx$>pm-$!C@Pvz|Xtxz|bIq1w8r|vSm*d zq|0ZXkx}MKa&;a`GBn#>*&ZKM^?u=#si1IUBc8uF&^s3-?D2j1pw6-JL|4)WC;19O ziCdX9kuF?%>+|I2fpD6Tth}8YM*1|9Z;LE>90=>c*l34xj9mG_g~F%7tM88+RXOywZWI) zlfOfaX*4MCxEc{wSdyFDK8R;LT!r51+|m))1q**Zu+(PkK_3p|a_*}qZLKPvXGzW8 zY2uU}TFZ&=?7{F8`_pMq{P117h_L=llEkG(s<12pw_fe~EdG|f-C-%FUa`$(r^>1J zEO&f)FMwpP>-s>Paw~@g@%ye47OTAd8N_@xnQVS50!}q)4tBCg(3$LSuQt0s5X0;@ zz|fsej*O1V%rVUWQhR|oHZs!bM}7Y-<4k4G&9|2#;8kRu2wPW2u^b59;Kg>^zIaU{ zJf`n9XkKcBhFMu+gJ>xKOlR72XM>-Kh9-z5*RPr~-Wpf5`|iVo%pBBpxutb}-Vi_w zU+)g*m}c4D62p$Evy;=>{3#zkwh25QOVKN|$&@pgV0Y|Cm ze()LQCzSmU)9;r@Up8q=r%@XB-Fk7L_>9c91+b_R2|>np+srD3SHF0-(5V<>l!VQ_ zG+6;kW1M!HhN;YE;CjCA>_n+e!^Q@F*iSae$Id?6clnsw>(+K>0~`J8VwH-mvJCt! z{@loTGqwtGo_gDhH%mcf3eEjcSnXN#Zq*^zi}<*A;@u#HhIROPC3Ynvay<1ZP5UcV zF;ix0Yg6rnHJO`*D65G5@fywE;`VWZvh!Ol@VcE$HiuhpSM*fQozNW0bTATGEH9nq zS{|JsSY~3Jeuf1gRDN(aPPg%z*^VCaXy&@G4O?>jPRXT4sC>`q3o)L)f;ZM;Ss%in z8p^?wodC)gDfQLgjHOO;Ku8+NZ1xT4K^|DABXGwNUw%HAuBKr;PjrS1a@c5?Kjq<8 zIdpO~nADtb1|0He4BliDS(}OUlzPKy4ETZm5##eGf{Nty08FJmc>I{??sUD7+tsZ8 zVj;I)i+OcX`}dJuzA_?tnl9@z!OMu%hVe_Y5O7YbD+iRKl3Yo`myur*E1tidsB$0l z`nW042A<#3x;zurI7SDr;+o$af|tA`bpkMu85Mnq=cl$52r)sG<~}j_^!|^Re)tGd znBI2k=rdsqo|c&Q+};}G3Ao*HG@u3pUM{!0=J2rvegnT>YR^qcdAEMZ>C>d(!1ob+4#IQUA6Kehqgw}14yTkCfZBWo5OkM!h(bCn4*B>4z4ELAH z&f_@AE^cHs)AjSza#@gT94$)`9BVCuDK{Rv{zufp?M&u_3}Q(FsBzk9 zw)gd|o*Yo4DAOd|@p})c!wZ&##zKZpYwE6FwZoUn>hO7=A2M1sFp$dv&;|6c^SGXI zEkC&PCnV%ex|!;M039RR+QJpX!2$Vu>+3ZQ$h>q6JYE=MVDQnp9?J`j=wAIS-0>QO z$BW2&u7k{zHubO6(wGG&?IC*h=sdqDy%!Jn^l?Pq)~`cNzF^J73wPfZ<(kscR<$xd z?nZ=?=jb|YO99h?oD=G+bn0ni+DJ`=dGqVuvEmH=j07zJ(qG1j3Ppp2j;^lu+Msx> z-k(g}O?mF5M0yk%V9N0%P!o}-K0Ci&727$JS4rNm~4EPY{Ha@%WUg8Z91Y|iBUk`9~9md~Z6}X_heJ_Cc zr8afh8$(SiH1_eL_Tm=L=0UA-&=I$C?p~SduHfKpaxEQWc?ni!z-M-@5+ITwRd~di zpCs3JX!YT(>c-`@Q;R?YXd$pENofxP_f6>bzgZ_S%w`#HBqB4u3IRfwUabyEG_hLr zn7gkI0O|64FIN=Xe<21x8k;b*swcbHYgD|T5viwQ0#QLPvSxb#oL#wWo%a3nBo=>E zU`~9!O$Kr?RBApH6hylvZ!Qpxrdu;5Oe{X!0HfN+3Ge^`LU@Zlt={xx6lcAH+4iVq zXdb|%&pao?<6WD`Ei(QJKC@KtAizpI#n!1Y(iLEZ!yEFILaWMEdiyB={goH}vGMfP`a3fBVw@&R@M>=9v@*vAc#w>4}eoeR%@S(k0plj^yTR7z3UEEub z)V(2YM}Hb-5VvhL%z8VSjfGHRuXB_=)Ajpz8Hk5L2qJPEOAM<-bpz^=ihWW3u9vZ5 z7Zeyx5wsCFNgXTV=Y_HQkV|#X8`c&l1o>F77MrM8$5g=^6vx= zfR31b=zM<-RJS^a!qQE`Ax@<|?3w3n(<;yEzq?v6)o)r4i96GMy=|4oJFlEV4=b|z z@J2;PiP;R%!8+;MOUoMR=zC#Kx?d}rYYfk<0!qb@E$mi&3piHrevI#v-VN? z%Rbf^Q!HkiPELK>b^VPXecI9#v#T+2K zser-t6*>7PEW$s>zF(^iozDd_FNU8t`0m}4;ag6I5ky0=`rJeUCr2v4(-(T}LHaGU zt*Soq37|q22wX?HPMtc>B6Z{{ORZ;EU|+F|x6cA4Nqn`4RezTi7U1KyJ4Zl#GOy;6 z?tzDwlA0E;aee<(>yio354Hl@+IJ8H1rE*XT{26nLFa}+A&5E_O=29=8o~d@a&(2K zjspN6RifXsFk}fi=+j_7zARktp7`1t*+mzp5Z9f%(_zg4%Gs_MA%cNnCgMLV#&>aka{X&u= z*m^5Y=Cv$b66-LSO)sbZ*UPZS|M~SJ|8f66G)PSOp2)xhH}imA85n3y$dwZaNcgLv zt@lCr805@TKYc9w9~bnmUv$#;Q5=YiqEdG#9}%9c0a#@N`1?teP1H~VrjV}Z2&h$5LQ@{E3Ane!a1nl%?xhpCt6rpuf{^kHhFsP`E ze-t>p?~4)BUz`%ge)2C-@;8%N@0);=JqF<0YkkIAIsef0EJ#EU4#rhs{${_wdFnrS z+JE|L`wz$r%&z?q#Gh7*Dgf-ZESK!7CzpCKVlH`69C6K zU;J%m|BIpiEv)`CYDlT7eBqRP50uQd&HuqEE`AlLZvVnQ`J?avt!ONyM1FfYGUI^; zR$P%)h^_vnNa?Ia-ME104MThCmplziwc_mX?nQ%<~vXT98xdeZ` zHJ>k^%c4VB*-Dw6&2Ts8#oCHbaMmFZ?P?5gB;vCIY{4}Q6`-<>0B3T+SDiz zr<&aOAX^W6(NA!Dd!l1xaXA^+#-3C4y%dmlgnj#w4da`tTa za2kRj025f`cr(HLp+gDZUTxPQJxT_pL}r^f<0gHng<%N3E>!w`#y&_jUb`fUM#Zx`pK9F&1{e%BhN4}Co1kLMrurI)KX59Bf0`z#udE)B=gXRgh> zxB~RJ!{{UUI(>Psdg!NbmOm7ZE59(GyqK5oHNNyrW;Xg|+?v`|;egAwKY-DkMpMZY zs7t37>YqT3EwZ(uo@Nmn5V*9b!O<34H3wPE5 z^P$IT?PiYc4Y@}4AEtZV&SSPYFz_Oq_L-pH;m5$RHoCDX=*VN-!GVDy{ytURA*dff zLd4N8k;8(27z@`+95p`nlQ-m+Swn z8pGKCim3ipEB+S^{x%u4+&EUStH$&5V;9NqN*ZL;{|U7e!Jw^8XfLwQP&e~$`MU`A zO&jI0b=T!N_*jeUyS6Jg+XkxTPOq|?GU0CcMd0xDRoDY;P%=@>V?F(7pX2X8dLIOC zMl0Vx+Q@SwoZb%$7&9?j{3P(1XDrQe`${cL{8#i}Km{z|#t(NxQ~CHW6#NHl|9=Y# z2I!bmI>YPl4R5P->5w#!g7Yrk#ogZK^X~o(%gKI50M>|p1cPcg*!6vK`;6iyejFEL<1c>h!rDe!7b1V9ljL)xtAte{humpFN+- z=>k|Bd}mi)EjTgIVZsCQ`Tbfht8wv6-N>4uHB_P7(4_WSBO#8_N+>tneSI8@FH356TA8oMWS zvYAChfxyBM@~vvV)$IOHATGyK1Qq~?S*Bh!ZdIS|7CGpX&9Rl}uj5K=2Xe5er}z9x zoFJw2S=tyffi8@N5&YODz(Lt4^BkXRviY-?bqm*bi9xHTX?`5+r3vmeF* za7@lIp0FxPhu&@-!D&5)Ef6}(GN)gn&|T#4XIHSc*F~CuYgo(t+y-M`Z`fK5WSW0= zik3D@H#e}q&{9D#RvT>Se0>>ELv+IWJn*9095LNPDf`|EJZ4ldWDRer($)Od=wtb& z2Amb*tYGiuk9cXj4hcs zmuM)aLDA(kW~QapC6hA`w82K`FU|IHHc&+=D%8Zmak=c@o(NFWo)Hd%oeY5d08vU9 z%B;8xdn?dIsw@POWfYxX=AV=Jqj9!r1;7!9rT!0PZvqeH`o<6IbgFZXN~Iz~yCfvp z*AAs3l2FzY$xgBxTdSRR$udfk7?XV&OJ&Wz4rVN6LX4Toz6|Dn-O4$g-|zRn|Mz`9 zpH}lcb3gZeE#K>VeV_Y@f630nw$ox;**t7~#^4eQ1EloNl|8>-InB=kAW5vUcaS+; zmY895dMn^Y*mHrLt#f>37}jGbGbC)gI9)RVNXKAk^89+X>eb9!pP^y-dSw7t>K}9B zL!&*GWS~cfD7fWX&w36)n9Z9{#D#8M%{H!*tSb+jzyT2sm-v2UzJg}8+SdPjE>&Si z0tz4tc7D8a9sW=mXsRv0$8SqpKH#0 z5`ByHVcBjdW0>{$pRCV)=4nO4j8$s*r!j(Z`!Lkp@|onNgAFO8T;QgryI0AGn*2W_ zuxpyzwqtkd>}&=DKotP;XSj5Kl9^br6~FPlOj^jClUheh!`R2)_io)7K+yuM28{sx zpKP)nNTaiIR7-=`R|yJ+A#Zy$O_Jac4dNOsesKzr(cYh-(!IPDm-O(TyYXmhg1+Ri zeuwN4H0`5Gwy87a*xv4~}-a?48)Z08$?F&uC;Kga(vIb`TK~1{wTt~5RAnf=#-*AmWxU>Wx>}-Z5 zCHJB@D?BJjCdr`VD=|ysVS`(j3%-NJ+GrA*m}Ukbzca(jK!Me%F(vu+k`9V)BYW1e zS+DsSBvso%1%y{BUU<7Z*|M>ipXJW9*kRTuQ0YDRevR|zKn ztL$0iClEdD`>}lU*jQ?yw0CLX#D^jS^WL6PoSEp4IJY+M>;cx!M#Z9o@m|-C-@=#X zIcgNauf>AiYgI4j&s{pOjyMrp;|F0@ePOI!(wPoqidTsPS)LG?=Lap54kelsBRoM+6-{gu+A% z9PP(}L)4G6>E#m(1_WBjs_ZjE;Y!l`&*>2;i=G}mgEBb=dD#v_Jrm@M1bg3_LX86v zL9G~%$X2FnWG+o<3$h%i;*#Cy#$NY~`KkGI?ig)I@u;d-E*7#F%0#0kKBj%p<_K33 z5Q$7zEG&PLmsk0rYJ2ide_H00bDs!DMW4^aL_Ix-*yQY#Z*l$>MH|+|L#vqJXS^=n zYB)L>A~MuP83Q!jSSW*a$dUlQvWd~*15K~e$+tt<(>ZQq3l?JSVq6eZYZ~cOpO=Ks zm}I{b*MoV|oUNHX*sY}bZ=eUj>rcSx&S&uHC}mGkdyPu>i`>qE`ODsDiArDan^TuO z!1j^-J2wRR3EjY<$z(@(J{m>hLhBW1|D3kS#ed+RRDo5e?P`AwZ!oJYSK z%MEij=O)meH`-M(rx?ucN#Xv{(0NJuE9=-)mc}{xSJn=00KEw|U=$=eUGg_b;#3&4cTRRWI zrXWPVLjg}Tmt^DfXHp)yZCKMZt+9_(ju?cG5-d5(#Z+xEr%Bm};?FJIlVhuX0RzH4 z!jAtl5^Hg9{YS43JNbL4*NhXWQpv7oLW904<}bWuiU1h`@wi>AgYKy;wKS$JL>^5g zN41Egi8Ga$FZ^^m$6h{KBe-chU|D?|d%cDa0)~d?e z6PMcOWmN$wf*QqQZKIz5V2Vt4`5OXzJoYpnaEx_PjlJk;{*Z8c|3m+Xg1$w|GYO*) zg7=y?Rju1O?hDo)ovHBU!SQgVs{?vmm8CsP7u9^YpOVL?iO5q_ONL@UFS@C$uD<_I zE22Rg0|@I6)OnRj&NTZT6IA%WHs#2yH9aQdJ(Yg$dycNo(8Cu+XLb)I4utzTRlHRK z3Cg2u~%$4P-atG+fZmvw>j zJS~r41Ky^i!-%}Vz5DWJScg1pd50}PVL6hun{5cWNh&RixzwM0(~3rw{Zi` zN1Gk390A)YpR}w5bCf~d`e~D%F5K{`hq;WVoY~i5W6Fb~LE9$!z_Yv=^l(2GhI*b5 z#m9Zs?#gF}05wH3aFRWv05%C!ehTXB!UiX+Ff_iyUevDKl^qf(# zAg$C3_PEwJ2G(OEgXGg7g5AIKua~hh)v{qvYIVnYNGRR6%iZT zxT(Wb{8Nt^Ctc!(V%KXV_id`omxoyb({yFI+W8Uz7WJM~%RQ-Mwp-Fv%-8<1`Qqzy zLIY7EPd0=K3>pdvZ!;hV$GhR&zC|auFtV#Q4rNbF=oQ)~i)_pwa+sy09duYDQgK6a zHP7*jnry=RZ1?e;*W_xL;do+{-aY5M?!j;4p0N~h#*D8CgX&wHPHm9o_Zjz|$dQg@ zK0C30P4HNg&MoE_Q+(mv#8`@#?q1UgUwc>P*_lg!ku+q!Q_n>%hX8In=Vn+wR z=3=W)enBfmJxt)qysWg7im}_o5GNL21j_bAKLW-n73G{U5DT@S``;!Sge#QB$+Tgqi%{4eAU^-i3Px{() z9X7dUFoHFBv(Ytm?cPd`(9=<8Pu2DKF8VgNTz}a^sWMSGAimVKSXw=6SRWW8Z=9Fq z!uFL{_o^`ud-@`|dhxG#b2i_f8;Ai9&->Ee=g%;nK$Q}52A=EQ_K>V72=@{er~iaU znkZedG(r-^xBKMFzBy#udr44P@NT&9S$W3>H~(kcrP;pP$y7Q%J$!Y$TX4bqy$v*X zk*mIQ57gMwGfIT`OMLYRRU3H?cnaoZQ^szL6l%#Q=h)iFZt*Z<;hiZ-eG%I<1j6Ht z+^w?nD(@Z;6IKxr;!`?Q>F;A0+gw`uUxPh4@p+4ssct2- zE!l4&wLCw&D8IGXV;@Ym@f@xoxBy2LPV7&i(fBdL?O3hl*^MLa+SC7;Y>+fk?B;8! zz^ZjH1+)v*neR_+VimJX8I#T2vX?#09s5E{Lo4s9>g3?$aMZ4h>k}^h)S1I!-9@Y7 zOfAlxzP$DE)|bENg-@Mz9?GfhZ%I|=Q&ry(vGC!B`Vd&7omeSx_EiniVx5uCoO6e0>9xP= zOpXaU(;nyH&UEXhitE<&k1^v0}m1|&1e3rr>{RKAWC*i=6QFKL_11G1{Fm5BJEgbODE{jKbVAs4;kW5EHt(g_dVOd5e2ovm{0TZ55WPMLzF@@L*(V7w4_h{Ku1loxAyy9>p{AHEc<-}Xe&z5k#bhs`8p+(FUI3U zd+vyJnvKh{>A8mJ&_taDJbzRRVDKlO4R?LAGl-NT)sm0B2@#>Kq z=@L#}(zX~+rRU2LmA-|RFM#)EKXcQ&MU)GR^En+3{7@*Y}hjn)^4=4 zGujHmuS~{wtXUgV7%83Gn7?ld;Qm{(f+cxz?CgAWI>N9tS4<9rn)Ys7YT;wDJMgrtE}*$bab_Y(Zw^YDr`)3=`U8FZw2KRZ((1mn;}vWH4^=93$rN4|)v14p;H0}kOu&w=Ki@AKTXMh~6S49q zX86cF4gvl33EDqbrad? zI)RPP8~ZO&MeM?>y8L6J2eF$91nPAE#|X{@MuxO}PTcy-SC_^Ap!Xww_FA}h)9#-M z4cHX!-J(a|_7306`bA5&xc`W*@cDp^|GwS-yukmuzux2(k`vtxn_%gK%X|0k*~1K5 z`mgDM@6Xmy;%pV23;UDJH~ruD&DON}=PvrEUnK=#gOI@mRokLTD~+unVw+k2A0Lo9 zCiDwiak^~>d&WQql|m~E+_w7bzc}tD)k-a4-CxszV(k?ZJlRn|VK$HfDb{w;C& z|GrGu3XLGhmwWd1*KS+0e8cFsr9hP5-`S*t*&i#KzG^PY0M)3z{>(EgX}F8ZyRX`0 zq{Rd?nO4|ursM4EroA_S+i8Z~`CB$1vtw~?p){lmOE|iA5SzrUf?d|K$kba}PK6Ti zrD8nPzTfYO6!{+C8nt1VD96!VbQJROdCHE7e^$?2!I|jE@qNot zbbGy)%T7}M^kd={%2~TySL#AxG5%FO-|KXg<$4UQs1l`T!&uh#!GYhOy?~Qg6r40~ z|CE7UVp7tHl^Iuw)ir#?4XDCRSVh0U#)>c@#_--xkpv8O0wE&DZ$U1K%P+xT`+64) zi4vI{77B6G0322e)3w+qV3GXz#K*Vy8PS;ekK_Kq`^{LjG8b9T)~)~HihCg9JbJ<< zI9SNJi@cP|M{8if9aY+m`Yk1udyZyjR@aPUap3YO3pb6M*B4oxVP? zw!Ek!stU|Bk(*7hnpF?8prWQ0hSiDZR))O4Bd(+K+QE$%I+7|S2DQ&F7EML>UG-Un zaJ|2hBFayBzI1r+@tn#vFQ|^R9YV`2u@zODt+P7!V2ml1qI={^@ z{F6GTk83`a6;(QKxYemm@@0g8ob9!!#zF_hL(;`hp9*7@3d=mM^fg3L!VB*rYORg# zB{`;frs`37erQ#>S7M<1TpihTrqj3M0zF*MgN4}%2Gla%pZ`VdRg&%BGk2|U+4gts z*#pa==IEz&j3}Knc=Y#sd}MJ4NbG2dmjTqD7}L&<0iI>39(v{vx%HYk**k*+oy;C@ zHYP6gU6WYr!Q8+1ltc=uJmxv9t^(<=} zc)SQ!Lo(0O7MpV7IhH&83)`He+rt+sX$A$-2kneXkAH_`-F`=oE464rrF z=_Y?3Vy4B$*WogA=+HRuPuwnQ?2INQM3%RmUc_@xFkVRyhRq zjOMSo5qeT%3)#LNR zrAj#evuCMqUI&9;+=mTs`);*Jg}IK-;Q)SAwXE?-s&6!vk!aXC`S~FCb$7L$v^Ue$ z9s(M!u6DHC_O9Zc)CRjK6jlJul~)*O1_OGkxHJ^M!>L`m^2W2mi>&I(3(0vwiN~{J z^!@hYFh&}+_w%88;KT?W5(=`x#%(=Ou}0^}mr?7vGXE-Jy>SO+yhF&D^L* zenT-xjXyhDeC=zq90y=A$P4N=Ue0@V+7Q zb=l1D9DQj&M@9Du7ZNRvNG##<=Q6_1IoKK-n#OuR5fH7O2wlO%GB%ooFB0Ok2aN}R zZ5mp}Ag63LOl6N8QgOFmmjy`n!nI@?s&d1R@4rJ!Z-zLr`D93td!+9?%kfN%ktg$J z_NVh;oB3nv9aYaTSWVa8jf(9ZjE_-2Xq8>V8LqZAE48}3=i-wX>0JmLJ{7WbrgAY( z-6q7FOc?vv_O_MFG2KgIw{K-afhI_-tEq|T&)kioN~Q00`#shMVD8}?0$V;fkmJ)e zjXaYrp&dSBa}3WJfi+I$oK zQIqY7So;D+@eWfzMQ2U0H_wFm`ZOC%_@Y7!!r^ z>DxiT^y9EzMkqz=jAfi{p|al&sT9v0`_`E&@^l!>&d!Zcl|%bWY9TQxxUs77p!Q8bB-UiUb}{t&%GaU%4p3HLIafEVa{ zFecF`w(~0&o8llOtg$NHN`wtUeyp)deZ-okRvFI9J~TqD6GU$|<1l-tRaNQ*R+>y5(l>w)hKn)zEI*Z$`wQ=rm}Cui?|)~5ujtM9mR*KWv>dxBgO3PmBR zC-LP`rS(#?qU?Egx~W5ljUxTx&_?B;ku1Y1pRAzWO!$B@AipIB9K9VHP&`c|lOnhvy$HNN`7uP#UVuWI!sR zPcBK}eU-#TV?6yx;(FU8gPnUX3DnFgscUif4lde^T*qZKD7HrZo#GN!GjvfWo%HO8 zi*XvfRYKCwt3z1aeBo`mc$NDRJM!kV_LsE>${}s5mp9WdLiN1`TUtbYT%JGrVlyqh zRq9^$JjPCe06B^ zpQ(7or(gdf>Zrf{EFg0BPE)SZ1oqp2zC*f|C-2lM>ju^=|U57AaCMz_xVu@^i~(s9Fs9MZ%GuT2 zhZGMD4qWl<4k#~n@UeHv&fa-i-f@C7#M$Tr*uHNHGddc*5|r2yI1w$%$1Oj1Q*Aa4 z0@@qZj);1~`3YDWAVvv2l0OjO8#@wx$PBIH-aY32ZVvsO!C947MR|aqcFy>2;FFv+ zNwESV39%D3$&nF@?KwISy6su*5!nq_H>(rkdP=`M&j$udP_8M*3Q~>pV8Q~0)EdY> zew5_#>Xoni`81$yZHpiS2RmA$*fS&VOq{K*8JS5}p7`+Giuqw>0+VkmV_62`Oc#U7 zcMDltS4z%oySgtr!J9}xrzQPq4VEiRuvSZ^{;-`*o7KzgaJ#dkav7(0&Zt{xkQ7Uc zwTvOBS?)BI+X2xq3=%P-trO?2xga!$XvW~elWN^)dyy;)L~{}TFzM#s#tt42I50l1SYFqNsc|#Z6CyrFmC0;h#-R! zE7`Y%ITy8s^5VhGhtqK%>DajZKwRU3)Yu##q%AYeI-a5g7Sngt->#swXSs~bPIX9l z4VDa`sT}5Ne}phNUotg&LsmP@R}wKxzpb=>bM)oL4r{Tx4ylFTe$3W2Id5wHUC+gKk~M6cyu!CMJs*>(;iN#BTL~~LiYMv` zmj@4js0`0l`CLo~;&7G!J~;BYaAG zX;RTeTlvzGSjHEs|BiK3vx$Hk-)Rq(z`Nn{V&duD*%B!9w4pG%11E8LFu$!arb9`9 zl_R-h9tDB8c;$h{0|!v)dUb1rt-Z`vjZ#;GZqMO73R8ON;GuX@Z-e+*8y8*ya<^qr z3e=)6VvGQ`0!48;-0sj!WxsNPEaICpM(?gOuP@fVdLgx^vGfslRD_VtgytE}o)%O| z7lymNf+FMaVvC7$Ypj0|qi;5GxoWv-7!8vZ_1irM!>s*djG)9g20&$x!Un-X<44?h zsGk!Ti5>i5MuSVbXjF)dwitTSV^S(Ob+%*_E$}oVol^c7k@?FT{TDZyIH zoKB}QsFP044$#biZp1T^6Ig9gNvRSA!+L*~!=2mP)`WSH%S?Q~xFdP9J;fr1uwD&O zT8NXc3y-~*=8P!cQD{8X^~}@{n5=E~yViOu*l@Hf179oZUS+qC+&7%iaj|c!vRTIN zv0fht=O*d*&18z`0CBsw5w1@D@DM zmTPeVpnMn+-Z_ApgY&!FZC;?-NHTXT6$;Dw!IWiMcQbwU}YOfiu740f8C#OQ}2 zE684KD7ktSUn~KcinGzSXM98OeC~#?ZdV3xhH_HgggirqXYf3l)@L=vs9No(Q(2N@ zj@uq@Er;7HDPNfnHo>po*%&L}KTh2aG7OJ<;*~E5tTT#aYo70UVA4`(NCD6sA+WSq zBXiD#3j(%5Y7{QKy_V?i?FeRVyhxivS*e!#C_*T>tD`PV9&fT85DtxAfV-0?X6->6 zHqeYH^u<>o?g2HDI4S8w+G~yOs8R`K{lmV;GD_1&?tLs&wCqnCqm@W=T7@^}uQmdk zTJ9^%__}x~2)d>A;%pccX#$UZ(KTASM-_NWx@nSNjBGrx*k##>YU{L83`m@ zMYwWdNyjbpO7-Q#7k8zzI{#XKTeVW+a^G(GAxOE$AicOM7P|xEKB`g2!Ruj~N8BMr zFUsE4+;sm|q?0mCqIO-uLDb2ZE}kX4Ch0#MiGUZ2+`e#RHjR7cV+I)f+t#T}W~p)p zo~XDjYC|xp)ltqv$-QkJS)|;neW(FaRv8zi(`3^!`nz*;8oR~Jgx=WXo3k``13Qx$ zN>l_x|CBxaOnls;Om~_1%J73yWa|c@pfRjyTnh@M|gcdlqa;?M!% zG~5e)A865eMbd<07PEQeG`Zf ze%j8P^EJh)$97s$0yC+2Sd@25g=O>JnXZS7Ju7SQ4uf7%fL=X_VAGeB6~F?leBLtT zTlpZ{wQ-~WT^hNWJ>3?{`ZD+$uL!EoYg@|XF^mP+|qs70^PY!@)&I{MsgQ%H>mQO_h z1yqFoQpQk28_1OsD~1PUq&@>`&^Avn05GI?7`l=XAgHoD{F!iNzv0<~qP+cgli?}>i52m;i6(QQ zR#kv$8xWOr=HPf+KI8<1G)c~=(J$rETI00SU=!|oYiP!Ju1BFuJ#@GM>Q5i>eh+;N zt;N_FY-?&yuitp1^4Z%-3glK@$glbIh*aHD2>^fnH)0Gbqa5dMs;sz6>{@y$GuP9x z^=|%LgMYY0qv(ZA35~O*4`G(PPXj1Mtn7uV7pUtC43^c-tb8S261c>Z9G{Opg7lmY@{<&2Km!U>-z5I{`vxa@mb+KpA9It169N88EL;f`8bb>X$a?e=9~_ipk}mHBIVq1>`Da!H@~}Y5&muOlFE550yyH=4iU0yGT9+k%V0oBHRl`brIt-J>juQnP+1hw9Sg228|dwU@m3Q|7R0!a6CuXjOdmcP#lFew6tDMvI@fsoR2 zV;%x5B<64B_hoQHkQvTfs(H;QVlf=*AyV!iTPGYUFl+lI4_;~lD~f0Uk~pt{Qv?9N zSB$I@p`1ae3i<&WYO!-$&NN1#W?yhAEifnNnW>rmw%0&J!uU38QD(b& z^BUC#`eTn_aN7NqIKHOL%=rq`!Fitu73q#rI|r;bEEGc8%c#G}Xe7?mELsjJ!uam8 zk%^O_HgcO^XOF`=n3(MVszrRp38+U7Xx8?lK)_7j$=vAS(W8%wgXZS9?Jxrfw1OM# zgee(IGAg;J^H&-mm~N&=E$8l{T!shLgWkz7I)E^pIbIu2T9GPz6RidcS;Ie9Z8sa6 zr}oHlLtoJfXqG+Iu4CJDBQQ9KNZMfrVn)2+k>0MQs4KA{A;%4Z5q*&`fNsNq!$Cea zE(lzI{LU^xGhS|iPAaEWkn4d9i$w269zD(r`r&5tfi`8MAX|CK?~pL zhCco0xm)V7G4ozPbR3wORIB*CcpcxGCX!*Ek1DD$$hgIf?*$gs$x{JtxUYEH?5KAY zFUY2FW<`4wJ(ApdU=TYPmQV=NppW$i`bVgzwFBo-+wDJcB!Ji(&nR-gREcQ-b4Id3 z->FH)A1krv)8s2eN~v(Xf$~_KA4F1B#rk0TPm8Zz-D90)KAbrA*r>E~FUA3t!;qPt z3jgR8{ZMe}m|>0}ILlwk2u3S{Y9-Uu9_XRo|3f4ksQ0~s>m#2hu2pwu&8Sa&R(|RB zmmLrl4%!CDb%WiIN4NLI3!oc2?}AE#?%6~tc|#}!70q8Gkd!QhchEJz5zH?5EfJ~! zOcFoz{?CM2)nT7?`a_*}@Q~1{H8E03xw2P9^Jnw_yrDcd)SiNQ26X{92n#QG z6`>y5GGh$YoVMbEChFI?cNn=a9@^ZKs^C$YDZD`phM9rU>P+pY{ zlkqArW_%B7?ykkM?qBpGziFGK%qZU9{%2?q1R`!E1h`X+Fa~&L1vGKCRG~gJsw2z0 zVJZ7;tg?VeI#3A(N{8^&Ea)>&g^}HrLW5=>rYc4MCZp%*ozdg%nlx3A%hduBDsI#} znQ>as>7R3goczj6To$K~WE#715%D%uf*W9=eSca)K!`L_44_{~a(p24cS&6FnlHkSA` zekh+gyvO`Uk;Hl9T~H9B!%x0%U16_(NJq7F4NUS5DwWPQ_Lnw#nurIql3-yX1EZ9< z3Gw8|PqC#}j{8hL82jVbYtO3Tejv8&yKctn#0!*H5`Tlsm%JUe`a^vBp0qb5fA3O@zDk5UiH5M^$^VX&EFfxzY4( zn~_QqLQIkF#QZC3dzm(RMl1g5PVnxOu@OtVM6lrgr{H3*e(~F^zWS_*Tbx`j*#s6p zP*Q#~L^Dp5BCMsGI;A|bp{G^lTc7H<k@P0)ISRHha zOn?LZvhG_|>>dMLEPPBd&-98Uyh?utcre~;;exm@Ar6?hHfNP`X z?R(y3fZRtXQIieT%;Gcpz7~O1rpu~VWUUu2zD68gsv#uwf6C_XN=|iSFFBn8nGc1b+_uQ=ewTYi);*=e!!BQRjdeypv675E2Qg;P8<|I9S}H zIaXA@_QXpMFVs&VDbhds8)3Qq7g`!vcWZtCfpW}}dn?(5*#F`Zm%EoHdFJis9BD!~ z12t@QtTP-u(`n46<_R0#Eu+D24=o4kcPU?{7V%Y3_XzYiGn8I{c&Djsxy$WcjS7#k z=v(6$d)g(ll6}oyHh?!JMk3no=f=GvxxW}WMc#B?d*n6Qz{sJ@m(Q&}M206ehVV5` z>pCbpkPpK%n$X)n5K%mCegakUe9 z_)CVSJ7H!B3h55#aJEKgN#gJ?P)7a*$o?=?D)h`OV+@Jvhy+BG+@Y@wNv!x<-Ak?FFjr5`U_mF|e0r>N=DEZj)rUPzB=*Yh zq(hOx;^0RS=US_%@*8gq-~miF?;FcyB!>;TIOTQzP~lyqA#3!bL5n-Xq_{A37}qCQ z8NGJ!q@TSfz8&un@M>?*hMC9O0(=NeA%C%eVlz0PY4nbS#2@d9mz5<@B}8^yCbvEg z9s?XBzo81KnA7YBr34)5L`i5FH-62}y^(3L+N&4`e8msRkmX8P>DXc5fH*1AKU8o5t<_Hci{x_8**j$xOApp0>uo@WZ`#Ky zjDnY1n~o_VS?Jdt4g~4A`z|LV)0Lq`$PI#=+;nB0^Ky`CK}UcX6+$sFo{zbO0!h}& z)zr~c3*YYa<#sQ7zR1O+(og(`(?L}mf>a;+aK8vLh7r2}=(aUNxY*&wK~0~EwATz1 z1DF&wWb9M%s9X^O^jLmxXgm>s4v#5DVr0662hZ@|J3ZRT1#%AE#^>_Aj^2cNf=q(J zw8HE{z{kd!{<%y`nL6N3M zmlQdxZG9*>&q=KRgQqbIR=WK~;z?uEjJ}9BtZqK4z|x6PZ%2cXi5D#{{h=D$%Vm=U z#{Oh0s?v;hwlO}ZwEMd9Q`l_chi>pr9T2C7Zo~64o6~BIO?jgxMX!jDfy&SQDythXC)c+e zonU0WZre4a(Y7PXwqg6(S|AE9k!;AiK!Cwl@!R-uRq#(V6uQ|k6P zLreooKUm8M$uiQfBF-H37c=cTpSUqxg@i@K=wpTkfN|72$RJ~R3i+{G>6OMMb#No^ z?&BXUs7=tw5DAciqVTC-#TU+W1G77Ckwd8y=dK+$HCOoSFRe$~0yM54&!H>!tDO_=Xzo+N$tqf{`Nw9_4yhF|=o_CmPq<3y~AZ?QFo5MQ~cHQ~o zm&qN=M3e40SOCP7Ul>XQamGbJzB@ch4srYFo5$MxmXh&&_))4JJQ}kM_YfB)Qtr_w z9p%B(Z)YR>;J1u$tWGb5X$%swa!>jT*&g~*4$vRvi1>FNc*Q00htgun*tN*+GLVh6 z48B_EDi>XC9sO%5>FzKnGNx*n*8w%us+b>8YI~*Hox%A2-eb1O+ZL;>H*dDuC?`=e ziz^Lt@*DIQj7XiGb8#MExjeqPitXB;%TGSU&Wpy%NFpf_lE;R5G(#b<+^?J-nL-cX zRM-0_%eNuT1l&YegCYB1Ry$G|LOm0o zZx+o`geWhrbe@8ZPtf6g;{B(a*#+Gk{^u@(+igRP@;Cl#?QWswpuGmX9$;P+s&tR6 zEKX0MpXWo?iCu(dPyvceVTET<*Hye1WU)I;TtI%HonkdU`fO;+=kzXiE7IwFTo|Rvr+qPbt9_BqgHgM6op69kI9R3Q z;|qs`^mfn`Uj!MSt?`BPo4D!=k2u$XC|R%))d_^2HxV0#!{ITJNO~!XJSJw*PkG^? zIDr{&gzv)g6m;%4dx5C0dqCWXxWD62%+vMJIUCHcZZR}wz7uO5BoQfb)Hp0RYjnxX zl_wrNWlLn=jGDP4C?kBQ9UBVh+MJYSQQliKBpbD)D_5W%F{)JpKUb%Z9C-Tu#=rGW zsZ$yl-?AQLl(h`@Iu11+U&WRn{~h6-T8@BrGeso9jyR;70r^&A#tOsY;$h}*7T6PI z3;kzc@8pE2OV6d;B4v1#3X!za1;wx{mit)}GAN~(&T1{9$_)ty%f*3tYge~W-Nh>a`ajwf+-Mk%DaKMo9-f90##SD10J|kLd4^ z>**J5&FoQ}E?l++wpdfYzV}$>FKq9Emv@u+x*M4GE$<^CpY6EguXO>D6wsN@YvhHt zS+MhuzV7T?$OaG|NFyCL6uuTyGsMbFUjCq_cx`-I0qWkFPW4BsS} z19(Iv2+J^ciZt8iqN|$e+F+chVD*dJ$7yJ2A-hDxs zfBQ2-uqGt)A$h!ZkR~8~GHN2jV}j~H?Lm3B6`dxJUo=HzU4JL4Y}ahYkg=@#(eixY z*6H(9MimV+ zVa6T8Oh0{HM>%@dY;9BW_l}NYG6*Gt9d+;*_^J=8Tz>(I#ZUwlT}MaGKybVWlGzLI z4)XXajFkbVyB;} zU)Csr(q|7?=JInGIL_hoM1AlSwND47m6O%w+>od%IKmT91tJMRu8OE4<>Hy(*FbZj zPW2q3fkxaZ@3fFVI-L1?95EpeH7HRTtNG8@6N#vB{5aMz=2XAl2gb-jak`%GEk74^R_RFVp6rNK3(@fQbx!b^)e< zmdVtESF{Z$>eG>tch|Pu-go@h6DP_8)Xu)$a_r9dxdO#~uPr}_ zMq00HjNbpu5Oa$}e5>H2&+q=!sClF3L4|t>H*W_eaQ|`r*($ePRVB&`SEcrDyji#2 zWp**WmfG)Yh4X;7b}FP_lCYys*|YBF;a+><4aYL`7u|;^Kk_N;{!W9pJs-e}^?fSk zFwD9>wKgxsGtWFV)+yC+;q6&Awr7IEhzx6kmy^=6EF!h^gdZ#pcxVqa>0lSD+q333 zEcT5X614UUP&0%>FW~DgU2tHj^WmBC*t*9Y#*emX=vxk_It}J{g=V=nXO4C!8|B&+ zJ528^G729u)BW9gNU7(I1J`zktoIHiw?lImJBl-y_3={DiZgT_XnCJw*rvX8sPhZt zs2;Bn&U`hAd*kbmT{@rhxCX9)!PP%@8=y*YGsAJ6xdjn2Zk~e*Q|9f{yzEi0G$I=$ z!3+{kl+2{U`?90wye4~X+V%HSrCl2*ceKgNGnyS9j*t3Z>l>Bz%v11g%q~)(KDMnI z=_`XTG7ISu$Mz`zip&$ zw;y4$n*bg|&3{j6YgaI4PLm>i9A_)Hnbm&i!Vd~e^i>PHY`0u;VSiJP_fwszYw#_! z{PfmW%C4gLgug$I}G`u`0MS z&AVDgiy3}4dKa$TyWyRPc1t){yODRXK(p{GOW&apCVY{DPH1NC^jK=n8Sh*dw)4^I zlN;wR&N%cHKv;B)=~*{T`U0<-sWTN|Dikv2KEBa=D^*oV?_hl@5r}p>`^O)KSH4Jd z^!&wwWxpUe@$&8Kx5Ucg+{}Xqt?#3g(`4UfP|4lx6H+r{?4f_;&H7Ny`5kK(mFTQw zfx+J2S-K9GzQ(BuwdIUl-+9x^<){luVu#=Ojnlyj0fQ9S7*<|W&R9n(Eig5))2BoU(_Ck)Rf^A} zKHqCg0>`MHgJiaRRUe_by`1M^O*`QbZ82JLy^Q?{cB@juDdUIx0%K*aJTzc^cM)~b6Fv2o!>GLvfRE&Emk&*7EbuGkWYLd(8(gO2e# zs>t-fll*3h>QWa^*xMQP@jnAZx{K|!+VKlZ^EH|!OYarr-Q0<3p7I^=uJ)6m))Gq# zKJ=abPVLhXigJ>{?L7$@-t^`!-n5&8tiPjXf@tdNes8R*WVyBMPjrD_RN7cN#^=xCINd-|KB?ic zTzya#9pg9yH^k=l(sw9VcDiV9sy+wCePk3xh>hH`uaC!?9X}qr(|P2ZZEDPZ23NCE zO~w#k^mH7V=St@p$AZxY+chm29kGUbJ6E2Ie3ovZr697m^!j;HF5}?(1k*X{K5!?w zHZW1yPoXR$xfq|tTbE>*?Q7lq62+K#Tl4xHA2M283oiFb+BqC^PMS_SU--D3mTi@uWh)S zH@EL_YtFc&JMZ3J@DGrAA7JYy`(s1o5*MRe#M|4V?6Hrk-~YYUMtJ?p-zgHl zq`d{BB(s-g8{^je(#9)b@uNokemRx!M@=giUjFm-{VmYAI=0F}TSj3>!2J@8ZU1^U zYqqNkb91p1NfJkGKA`O{z8_6rmxr?QPY6GWPgaBx%l~OT3vZEoxKGGlZy&7OzdwBJ z7YJq5O_%rnx~h$^{a>fCB^=QI=d}!M0fw2^rc(=+x{V&}Gf=vAUj;TR*^>6p&bHvG zR|Zli$|QaUTI_YQHf93SHCt`Hr0Oy z-*)O>A7=~T`S*a?&h6a~>XMb?_3BnXR`w<|7Q>L0|Aaqnt8QMx>n}3j8?j<@Eu`Ht>C)2Rg9{ff{PrKS^GzIQrovm)7hsHO z9}qfpSo6WwZQJ#QUn~wqOAEhP_4Wk4aH`VSmH6>ej(IfPUDD5sBTxq4dO2`?eYliSIT0D>>tk2E?13mHcK&4vOv0HQbI~j-Pi5xmyC#hU=tf$be zKC|P=&?`pY6E|w_HZYj*yU12o4*R=P?AEG*qovKi7$!yVk%pA<#YfRuEq9!*_IIIi zvNc&B{LutNXT3Y%{gs%awK&_ zhIGegi?t7&K8c-l+TlSg^&hox>nkvFeCFv8V#H-NKuwBv{Y*=F?WtYO=JWD-*~u%D zof9pEXM_K9W_dIGR?%)U;^TDH9r7=vI^7M*j7)S`FY`$K5=pN-4|rAj2?XH z&Z=xXy$aXD+TI)@K^-d{A_^=Kfxmgay)NeAa4Y}E!kmE*Y$K0%B=ew^G>b!ll=*+pTtKm)Ux1RrOsVpnHdFPE8UA>m0=0x9)D0I0o47M)2PuW2Q3}e&JhOw)i-MWJ{IkNMJ=ec5R*{WOX z2IQ@<_xH^)e&_h&~zKqxj4#Im%?m;5(8JSpIzg*J+Pu)urBAbO?3Q}K9kn!sHD1nsV;MQ@6o9BKywK% z6g|-vx^{g+v|Z1ueSGd;V{hL42&tVrVTUUGGG8i^oytZV_;q`p%Ke zmc#xorw<)EbQ{L~kC8#K^0?*~lBl9bgP7w&r0Zx?$$P9z&K^?1L-5dNDFnx2ajrPG z>-xBh2mT|+G})(_sW9=u9Z9d>zHN?Wf|*C*{pK`;#Dp9D{T^laj~eh$u-OwgEXnPkj!QOHNGMkUxbO=05Rr( zR1KV!Rp}>Dc2^+Q5--yDGL&9j=*Hmri;e9&5>TN?+t%ej;wpUvwb$)cY#ZJ+U|eg* ztgufTDlqKdfhkV_T(Orq`7y`9wD~oxx9Czsfsl#bGeNA+0nWw}S&MYp{devx9fO_A z3NNFvSpTw?u6zv8e$0m#e_m!&S>06fe^`4Ds3w=TZ8TW0AfQ{3E*1m_^tE$;U%g_x@m`U)KOdv{`)j-8oBKIy*8tYG#6Mze34y z&{s3#`D*I*xeCo77T?B`0o3hhzj`&3$?t}I(^EElxuhQ(y132l-%9Y-abx{&| zH4>U^RcZ_n{eP5w#9J~%Fqhta)EjlE$pB$fS8u!0055Il^6?0N`3*7ubfaF@ z&D2E^7_Me@x6{Y>XKZNBn=(HN+n-vWFSJAAQjQa6p6`|@7TMWW{wwLr7HfbuaT`g4PRF}ooRFvZTRu|}G;>In5Yqqq^JTrGtba19E8 z4E{AepXlAwubJI=w>yKj80QHAd`J6Yd&E?qbKOVj059e{Abb=5nP@TEX6J0Di#mNw z7xbue-ncDKk&vfh#!TLyj)0o1ANpVK9dMisYq1M(!|2=BMs{KEl*?V{SW5JP=heAA zi`b%q1%xxe5MUemLcG~G+pSChRmr*QzvftNB)=42HT8h7S-Q2;E+gK&u^4M#>a2(M z-;8pu%krm$e9``A!hv|A-<08A_&(OI;ux)*E!x}p&_vj0k=B(Zb>m5lfSr|z|MLdh zhpKxAG0tNjlH1~n%ALPnmuabuT+T0V@_X9CMt-t8)5O!Dv_Cxv;h&mAt6~P$oc@&= zA-#eV%=P3;s74t0E`FB;K|IdMi|xH>qZV5&%`ula9Uu@U_P^6iG`f&QmXr83t0Slm`EOF`|AacjS#_&on0;D5OL7Cs;rx8FP&43kRX!JDi+3FZ+A_Ed~6ZRRxxmY_|kJ zl-#QTEW2%nx>v3E;Qb$AM!)qemd}$#zcC~v_uVyw1Dz@bR zRsOcuf@i5yuG0BN3y_zXp4feEeAoJAKge#?ksK1_@eGKkk1-^Lxb&qEFS6mubA<2r<>u`MpqD5w#ojR@;(0{W0fx(0qJZsJ|5SzD{$*7EF^>%qUdX)4W=O@)^yOsD@ zeT?`Kbn`&*9_G5IU!$hy5;zLoz4s?n%-nYGQq7fG8BONpR-uwDs?ZO&td>km28~G1 zSLA}8#~ArqP5UZA#(aG#H`;J;kGltimxF?b=`qBOTNX29>H%oMD8gT4CQkF$z<#U= zPFI5J8zotWODEuyVxudIlTeXO+ZISOy{_?QsD!q>rqSNxUY9<%kZ@veHIiwH#S=OF zvt+)#Oxwxo%}-2Y>rn1trCynpS%zwCLbfIcr&5*MpxFKi)=yZUrIivp&53yK?iWCu zosN}}j@JvvHWR3#dz(!c%6v#H+g8;a@#A0MAJbX~c+qv`G4`XE^YhCZm&VJ>Egf)W z^@D?-;^W6Q%nomhVleE@%v8}cp~sbpE2!ne4&D5N;VujGaPjE)(F>iR$HL8ee`X5e zcPw)JI1L6jJqZoG()S00J1HY^ZPv!46V_h)i*(dhGz`~FyN8-!OS!RH4TB=K%0C3l+q7MU5n2WI#7=*u&5U0lVNy5-2_ z>OMGToM3#o8^a*7v>_Tj^$9LfsjX9&x&(?VhHjKOzDSD)xrsV#p0gD%%Z_T|x;enn zaJ`hMSZ)1qw54hdE|SF(qFknIqA`AvEi-kZ_9GvUwF5CN%`_gm6VL$kW*|c^Qo8$= z7Vh5DOpb3RT|epEHAEJCf9b*VUoF-ez05vMlwGeJ3ntKYz=XJU+;dS{Z{}ObO7O0; zeRi3>Z1Tv?BXn&i+8t|y%W>1bW;5tTvKh?LTHKQ?uu%wTbqsR5ZmFjZ$eO3c;y^BR zUpt_>j*oQ^*W#$1XB4?sN?__Pr7PurRNdP!Go$EHo_f_j@1`&qk(x>?t&Broqb1LE zem%XaDl0hlVA#2ZRu$H+P}0)Fu`iuHp1rrejfLAi;H&-82k3EYLrgf9?O^+tP^z83 z!*GBfk#IU3F4q~{+L0qY-$uNc>o9AgBo>>>?^YIy_+fk7{n|wDH)d6acf7=n{`i=g z)W(*SQ+H%)T#+rApT#r5{-VmgX)Ax~ecx;T8CK1yqJjXwbMgCTS{XMbicc}?`0-v} z)TcU$NJ8lraqEQb>P31jm#qn-N6*_yjksr2t~s6-;sVved1p%%8>f}d1=O@UpBegM z&E>pO?TbjBhU>G-YqW35?Hj(K5J&zD+7ijw>w=C&m!QY-W!$Q3f8qw zr3_}8AG~{Ax#yk9lPbpxMf-~&)Rq&RzOSs$Z@z`{g!DuWa3>1g8!WTx86%GVwFsr> zRN0nF$dDA(zj#4tjvy#1x~%KHT&1ik{mg?r1Y%Ui7`pP2*d4)(=AEz0&0LQ11K|Kd z-2^hcsWd6}oumVLeea%*jOeb|CT;$_$a->o0%nF$|v4s{cn!(~2HAFS*4 zIHz4@g4k5H4ZCGQ&!KA86EE25eA48XG5QtJYNtXuCIgO_6mukvjI~-ogl@i8cs*B# z=OmBn4-EZC#v97gS@4Er9|Ch}5%ezzMiGQXKYIC6<;FLn(*$j!MH09Hq~L8YKO*t= zM0+tcOEr|@i1gZVX_ zP08>l2T@x(6BMwY55>z?M{JJX0-0XLTuT(;sB!nRlCGh498aC7HYl`E06g!Wqqh10 z5MF7vAz{Kwp(LKahBxyDxr2n&Wsh#dqOhS+3MH)K?if%TP6v8vYOET~ND0d1WAqbZ zENUY_ubw^*du+EmvUnE~_bzF_+9IabtxdJIDg#$1RjWqT{_{pk2fO5UwS;DwRXX`j z8NjQ#Z|Gu^Cpm4QSDY#o$q|MvM-%10era+5BCS%YKc(!VC9dj@jMQZO&VZSY83+i^ ziGw+@r&E`|g3{ZwXWDW1xRAd}iQl=!=(jp%%f4I6$keM})$wHM+t|p=<3bQC z6%!4UMk8mdJeG~(pNYbPbaZrF>Pas!WM7M1#UgGXDAbW&eyP@c($lXDyok23#P6d~ zpxXOW|BNU4L`)F_HZ^3A_8sG7yCsROTX)L9dfp-)9QbSwSRmB1zy+75-;y#d);4H4 zlm<#{W5%zc$=(l_;s^7pcs&&UyyM$W?Cl+#r|H*Da^++6 z+)e3UUZK!dKq?ZAeXj6C^KMXFm8~T{Qu|z9l`CYe9mSy}?(1~o1w7bvrYQZfGUEAeWcbOWB3;Fr7Mx1EOP%rzknXo1PSB`EkZs0q zpvQ7*Hs@QFB9bIro6AtpQ^%g3FSRyIaJ!C*WT(Po=}wl~HAHBU5i@+AvEQ1FC;A9P z$lQBTP@pN<>pmEWd-{dXqtqdB0@sC@N`r%gff43+1%a!pK6woE3P_La%^T6?PYS6nF_Stw{>?))f7 z+*F_mz<43ShiY_BQH%5g!R2c^p8a^zjzEE&-s(!fDd*(P3<^##!hs;07OJ{ z+8H0wkbf!wDonO>LCls|4)Qf6uGxYB6S@Nau}J=b{Y~9CPwY?nld|XkkGd=ySz?I1 zdIjRKl=i{{IJWG~D<6zikXMOkAP6q<*nx=xU36u0#s9aUVFh;l{PUXcY%K;c?Lrs< zd>^8sK24};!TEM4Ce>~|z>avIJd)-9500gBFWks?ZAk>Fsav8FAeI>%ymcGi_>EmD zlU2s#JCT{p-%KV>9UOyGaLx?p$7e z`v1{#rvDpX23O0{P(IiGsnmA#R?OadV2$S5O94ohCfP^3e@Re$G1v>t$&RD|_tx#V z_~+r}gQt)Bi@V}z`F|ECwieko^^zxM1bb702UPWN!lXYXwER1T2##j)p%eK{%8R=v z$-Ujgybu+v^YXNL3Y z2>H>-FGMdO2oY)b&dSzm0&mTq@~OInF@lyUEm45SZ8?#Gjaa;fPzs{ryUU;HmrO(c=dYJ+{l9&Me?=w2H9ms<`b)^XAr&yYfy52CzVm@ej2Wn9zht7u z29*aSmGPWR_RAJO3#5wpl>_A4f_^ z<#SU~3;;UkkEt*JdG80$m9Hn9zaFPQ`8y@~d;KxXLcg~}@eucy;WBDc8y^M0ZMN0P zSAa_#W`SB(34Q|GBm+qvwu&1Ktunl4{CU%UyFsB}z-OI*TnYMpSp;MJ;RKalp^fF{ zh&#H3oBOYm>h{n#e>a_}&V9r)b6_*CdMU0slG9>)WgNp15XGZ2v)aUl{TVA*?6LYR z^6&P++%EZUZ&jL2Xz3MKk-NF*cXSEeo@@+l?NDS(jOLAR%ilpC?k`)keB|ocR7sYW zTCOA6E!B~hhP;<+J?GM6a(sPphVGaRoN=<-;y~<$-+k!%XNoYrl?$Mp4wBh3Ddsjb zbRTxDB(_P&tXuQfu0N&`n|d#~*=O4CHfXDI_U}*ni+BE7Oa#*5itFNl@Oe&E8|~vI zO>FR*#v=o}eCR!=^S{#+g67YFPkNE4mH4>b&?nYE=g0 zf>=J(?$SPVB>XKEhTca3$(_jNJ``C#h`9jj)_esqylwUt-Ynh~*og62hhKdKZQ3)7 z2GZvO!7Q0iQRY*{mf?#_f;|U=?|7j>!M6Oyq83N;}vm!DkQbhO17I zcM$hCw+Fedr%W+iO6>;7$c(@94?>RVj>A~c(kK`_(Y~!d)9~qbd0IO1ssLG5T_Cmz zBbAG-rq{r6-6d9VQdnYVnPJd{ay}(M|Kxg#fr*@5h5~^pYxoBUF{P;{ire=3ky~Mf z+oL!B@tO9}FQBL^sNXi4Gr)agr54J{L*(1i}AXW3AZ+gNVD0PPuMG+dT!k+aXXGnZ{-}mq={E2nQQCLo9R~L~ zcp?93IOOShpbINU#B&ZOu?NFIH%6)hNtn%e1$EPC{bA`oS-sV0N{j;zDOhGuO~w@L z`^5r`mnluH9d}6fAZ4^!a{9TAHg} zl1nvN_h^5|Bs=O+n#oU-+{cgxO=M67K|Z-IGE0o#_}Io)nZprBlG*88&Gj-C@5TPOO7X-R}oVU zV%T(>o)$7Wt0gTYP5?^ZHIq-n&fXQW4vvu%| z7Yrohz!;pqW8T_8Z*&a4(jqAZKf?p@c@qj&m2d%_i5f$m zKoMYP<1MVuRUnuhp^)wzP4aLF@J*Ij$O`wZ0e%9bu(?5o)UJcH_iRk3^;R9T;c--I z>Q%6!MH5Kp29vhrMPPvbM~oiK2m0(-kNyPAMZ}AS5Hn9!)JG3HzJoDUEsbON$1?$Q`1{>OQY{ zaZB1mmCcP*^&>T7Sw?h!Avn~?c$&ek#nCuPG;^Smb_fpBj)|HHUJe}|yLI7~f2bZX zL5edmD!A0%p5O|Ijr1R!8O92OLrp6h>HG~-TPnjNW>WEH(ZvJ6uVN{`n*YjL39$ty0$P#f*ST$FRHY%6Dlgk+YuRH)ml)Wd{Um*%$6e)YIDj$Z|N`xbG+79m= z__;949oI8}(Dh$XppbiEaM!Wt z-knydv$*_^4!uk?6n_4Do+ zDu$Z0+R(%X`}y56@cp2svd)7Dziqn^6R?00t)OEl)hO=f=qf1bet%ak-d}sP{p4#} zrc~)GCTmMe$kdlz+}wM5$kBu9EAO}32+H03LXYzjhnRAgs5L@@7ml~@2HuCwzOiOk z0tb6tS7L*&zyrqyQ}(%bCj-g}u`#2rH{O)lw$cX<+@oe~mU#+^LA_fK;J)MgcswAm zTjCB4r1bA2@nA<&gBr3+oV`y|KxC=L=ce=QuDzTx7>IucfeBo?bjb?gr zGm|@>lZ2dS9$^y1iWPc~e3>@Ga1u(_qeR)oF3A>OenUq7h*B}fg*QMPt@`APr5&_6 z0t=Vfic=W_3Sj)pmn7t}|H=Ku?BjHsQu;E+BnYoY8$QU+0E;l(98? zc?WAvBf!d5)|Lgz_665F-eZLprPhisOY7rZvM2SS z^Os)VzlW{XIK$cl+Rr1G5HCx7I&{rz3oTbMg;;eOQ&2-KA{k1jJ9pD)Flv*aRrM@V)-jaGv{JaQC@MgRSp^aMt9{UKy(ljp6tgX`m$OL6#pasEP_0ml^*z9eZ2c2cO*&k#NmNHrdpY9pPsW~s{KNthp0ukE|O19P9 zj~Ac0CG`vli(o=Mj4&7y&q{QbI1SFMY(Hsr-pk2y)QCcQ#L3NylU9d5_}8f~F_qvU z^{Qifg#FFs6on9eoBJQLYhD_QKlAYRx>4i)6g5);6Cn_WxdP25pHbqxjlUf^I@Q$> zDGIJy!kD?HCe%vINME|;B1d3m(y#^1Ww&{6l2GD|H2+yw-Dq1)+SOvL%CTBnFY%>b zgC;|(?#9v`vF)gz$T36*<)f=eyLu8Iv=)MU&(1#%NlVlh#@D?LG~28~Xwl0SJ2<)Z zmgu=dB~labM588~!m@($;h`iytbOtn8^A=ef>&P!YNKj$A9+WXXV;jPT~&OoaaQOp zYw~jE$g86parF|2_-}bM8p|&z*4WxZQjeg%d^oD8<+Yx+d+d7_2)xrr?jSCsA22po za@*q#2~_v|tDrS|`{MS@-Cc^SI<8SBy=UWd_Y1>8_etIy0CzzE1N|+p9h1Y!k zHt`q1qyHu8R7wg)!q_O!)_V(?*3`hnuYLkj;uj@h@cMqEP&099;2_jQ((9WmjjhG) z*bAc4BkhI@P5aHll+}UZakK41bctNtANy_cZavZJN=U5s>e+=xE=ld9t_UgZ?mY2J z%-5L%F>`XSC;eiCjg7-$AOlm|egXFIW<@JN7ff>DOZ_kN}zCakp z8AY()g~7Deid4Dz32Aj+_DIS`>h@O>jX%0tYgOucUpOAkH732@UYq&cQv|qZ1up75 z)IXqz_EOh;j7&%0r<360bhn+HN?kUfyoR;frlwcd`%t2eADG%7>hf{>2(43i{zXR1 zvb@6gA()q!p~Rg{BsL1fOrT`-8}zb%%31iN3X7nVla}sdD3bYvt%_=?p4)ccDl`%K zQ_Aq^Nrcj4w$V$y`Av=YR?JgWxVgoU4XvX(-R-92FOG)J+-o~m-d^oqw4-%FXV(6D3|(Ota^3Bo%$xrw~v3A(cQmPtGU zeh1_L%sa5bhR{`dEKNjO=Syd;ykgOD|4j~-_Rq_b?HmEH;!BBbFUYwf5%ZR7!1snc zzl=xtOD~s9kQl(MyDw}`em*93?@M`nr|0KBze_M66qQ_46u$X$Rp8OxHKTYleYebR z?pM)qv1Sa4ua7a`4GqB$x5b0?CD2-b=_`T$ogd!G3%k)-pQNkyQHlsb#@7#mV@^8+ z%IKfwu++>?&2(IyH+0I-rEh8d=y^v4%*Y#u_rgqM;_sUFToqfD2>SMXlYMb0M{G-L zbiX3IYMnyXTEKL3I2arPUFq$X!T^c80KO-ml^K80Xjz?8x_AdIzG)h^X)BSnn0$Re z@?dGA$7`&o`uS}`ISmjhOg}b7W3)-zJ8MpfclL|RI5Mqvc0&W3PKPM3kG0y*cFD+O z^QdqHgZu!2*gn!c)_(J3Dn%(hd_x@sL$CP3_*ghiQ2S}+htw1zA>f;v>nlGkX_o8h zCEg{^sW3Gviqf;9^S1&l`krp z6yy4M6#n5}3TR)Px;H21@r~KM%E%^bA`iTyhU@&9aQcfevt9P?>c7eW%rx%y|EK{I zp^%(&j4aO??E4cZR>~|D!=UI*2hw!vJeb>b(I3TyniPullq}~0%{s35dYXb*kDu&M zk2gt3Dhp2)Dgc>mmLFa-ngW4>38_HMnytEY=>iRC5ibqc%n`x(>5TTbPZ<}Us6{DG3y_lQyUpM zqk1WSqS&HzhG5$}t*n#Z^G>6%Gzse@7a4?9{=7&8qZehktrj3nZfEA{ke;6UP#OpF zkPW2GoJ8ogpQCm#P!C@UbTn~%>!e2iBQwMzbkOeMklDW1&#{x&GY_9HzANKdeBan` zCeJZ!p~h$OV13=v74Hcy!O~HzgD~;Q$WjMokwco(>MTGBIA=5(Ywp?I{(&5MrOr-e zgRu)y=sh`5%k+D!Lz%=Mr+f&-NmW$m%bd6X*;8wdeP(!rKeF0_-p~9f>@k?w2u4HS z{j>5Xd1Xi+qXi>qumZ zl<~4=W8KZDiwS~18Qtq0s2K)uO9|->7K?3_^Z9K0=uN6s)UD?_?~T)zrFV?LFSMXO z+KkPLx#85wOrOWT%AGz#v~Dk81*532Wgyyo_HHEK@!}k+=Y~S@Q64MrrH6`oW@!35 z(-sage?B63tkw*ou+9QJ`mHjf&xw+9Qoa`$hxE6wpP? z=F#$3N-%HHE-KYIaG6Ti1(+1RP|6hzeu`?&4s)X+@Ci-9sz z-xS6(*Hk}1(#(kH?4$$r&GExgx}N;--4ok-_?A0qp%!W5pm@{>l{i^>i`vXZ; z#t|hX^*}Jcb4g5K7AsJm5OW!!0_9&)wXJP_iI91|sR-2y0G$e`>hn_Wo_eu)dp-FJ zMl8lVVy&$$Q&S5I?KNa{qvva2Fg#znUj?tVCW5arE=JA|^&kfpX%^Ki9h)9XWX_K! zxBvJ=DP{+xVtwLB{KJ7tEj3<4jY;eU2n?Kn073x7zW_+m%?r(#7MwoZ2YdD`@+K%$ zy}W~2`7(Rj#cXJegQH$Ock;pT^BS+$U0K)iZ0o_ouP*!BkrNqc|{01CHuwqtYKJy7X0?{{WPwYN1+nM{kb*go4V7H<@KBf6d_b*^y|)cDODTu z+>vvq$+!W`Gfa`@>jo{Ov6AJ?M;PNZt5WBS7h_<~&w@ob!R};_?uF8CrkR^F@kK)= zm)$_PY*gzUnutzuC^3pvw)|+;a@tk%+DY+dt+L(>>kfdfY#k!q64OdtuBWFH_Eq#* zlE9h5AOcdO&;G*Zcg(@$lRvo_!unR2^2hD4WPx|`d*02hU52eV`;RVMh_cx*ed{ys z*V&ha-znY??9bI)-3xs#^GZ9JC`GZXjaR+EBy zW<~-+GCwn1Z)d>_fxW$InkRDXTW_A1azI`%O2>i@bfJutQzpCRK(2)C3}K{ebR{AE zdIOE|dB=lFadP1CL(d0j-+L)p&V(kh-k z9WtV`Q@KWolwT9g-X*Z+_faD%J>0UKWTHo^b6aR^WUVbk;>q}pt#&KpQiYTecK<*c zpdd|#Zm8v|Sgp%)yqC|KAatwoKC76+6LTW)fz$)C-aoD1Ht>uc-pHXscve&n7}km1 zQlPC{ui}ft&@5v?MpZ)-{i5hOv_5`_M4mAAs%_i>v(YY;qNIh`=C|v)NaBh-N*0u5 zkzEl-U>BY38^My9QAEjwdt! z8m6r^-z|(dJuNak!GqP%!MC=uN@F#34IWQ=CgmJ~MJ(=Q?t3NP}* zM^h?!qw|cAbjkJ;V+yE`F;SNA7QWiG7@65}cU4>r;h<;UxU1aQH?L_aG2H?V&;P5= zAU{ITr|ks7j9Jhz?pH$h_UqHm7sG)O25H+BWccNpx_dmM9vv$l(-2MDs`$hf(Gia? zGFkQ^xyah(!~MJ0tcRBHnmee8iaEOWCV`Q1y!XK^fFnvA!6~}_=1+Wf-U1TyZj#XwKxh-i;)%rK5$`4AmIu zu+A(7b<~VaG6Oq0@Z8rn{W!j4DKs>0W7dU+qvRB*S&Fx5ECKKRSYXL|TrL3Fr{T2S z&G5QuGsYgB2 zc>PL~VoYMy=esXA`cQ%>Q+HgL2+2^_AQcR1Pn-q4RzD*dDnOud(G0T1h-*yhwVSG{ z!KY7&Bp{pHT6I9(*0L*Js!r_9pS*hFVMLx#>=`16q9+nfBDtrrqzvYMh% zumYkaJ;og9C_(Yaq-p}q#_D1UxL6fTghztkINxVI7Ssx1cr!BYR@IEE8IPz<*{NhH zv1RSo$0>EUw!p*Euu0?r76gT!A8-26O9cb(#as;Bt-F=5@#!{`y)_2hbL4Jx$kWT+JF zqMDj#+S66ZHRh6@6BGS%v}kE#X$qsY zb*GrjnCbzsa!vHCw3pAcy|9nfJCpra;bl6jC-&i`#1O+kGv}l#z4}ShTnZs2pkUoN zq^MnAArPl0`oE6b*$9gj5Z_}6aXUXY0O4$9l8t0n<9AmGJKa^Ej}^^Di;hEv0oBr~ zDV{u9-bAohVO z!L)oN&BSCMMIkiT+3*-Ja_eS$KU-aQ0KsXNH6KH(B!>)2*WMnFyTz?7Z77MNm)>z% z?XDNh>^G2HU)3hLXG$6y*%5~{u6*@cJ*WmuzH2wx3@rm6w~TLdK$f#RAjpvgqXV0v zMAufODNxqTzM*_#-zhL@VWc0ai8Ls8I#HbEhc@VAkr3$Kb!|YzN$I;WAHAisv5b3~ zpLqpKWck@rb_!8j4omsweIlo}D?MJ<$nrK|>DgV|=!aw~(M zPwNlL+?^hKEX!7te(qfB(*$JZlyP3Uo235cx8wmA2tw3dPCbD8!H>4H>plBrvWhCy9(lt#@ATVZ{bbb1-gSZiP82C zG{>tSDl;v6FC9$Xt8N{Zs_wgq%x>++X0B12$c7XZ5vj}2)LK+HRl8s&@y_k)^}tdZ z+iJ_tNf<9h zN$?d^@S_Z#3vleQ;gS_ELQzd_q`1?UGTZ%eDaJtA{x202^Yp`+E&FbcgslGX(Y~jy zcXXaf%H1ZdG9wp%OiuJ_kVB0xiB(9z&Oa|!>M?!GK|RH5?eu3W3r>6f)Vyl<*Ur`M zf0rqp-9?{$aFo4vJwKeyE zU(HhY*}BOA$3VwvRf~&ojTrj~7;8faE=AFBRhzEebhkQP4TtqEXB zkKG|L+oyJafG9#y0-_)oJ?<92p~4ZFfvM^$Sg34TMsAW!0JGTN&xZ@$3_-7Ma^!1m zJ$z9Gl&8hO)<+zXS74kz&JTR)`%_>C3*o}v;&h42uZy{3{`0**U7ys9LD?lbFB zvUxfL*`b{^bFXGiWY6gOIJ!bj{Z>(#Isg-Xs-S z+1zBctFs3^w7>jBJCB^M7+^F*94M1N$e3eif+9LaCOXnj7R*u5RcgWQY5#>DV&@eUWLs^G&x z&XcU!Gf$6XrT2fNeGg^Qy$?Qc!{FQidMhb+rLcLIUH zXt|yBmPzvYD|tg-2qHy+Hl! zzdP4XQH{I1P955w;7#As+<$O<4WQbd0WEtyiFlyAbvuWTX6i5bsQbP6+PnOkEQJ5| z3~Z|qK+o=(as@7cb@4*LbUs<-KU4ZKt?w3&Y2I>YHwW2779XP$xO#ylF+i*rxo!jH zREiVYzv#L#pXY95{A}2cB+A^)$^IyDND|tOJ;`Zdp%Uj8GA_*LJ+2na%$9HBI5|B$ ztiuth1VSJxF*fhBUXX2AzQmHD`t+?MkOF?Yp$iS6@prF4gv7v}dg^MY*lcy6&%8nj zQ5Ta-jk=9vLo7}-j0&c-*luyK2)wIa2Q;lN76=bFB)?Sc1NjsnqID}g%^9LIY-C*1 z)JD9rr@=pEf4#>W?Q*UeAS?i|^KZSOETQ!I64=}J*8}}>o6j{ztGLX+T|Qz7a|RlZ zmcz_DZM(geCDwFg^^Mtwk(%dql1GD)aD3nrdZpwyTzWM$!|$op zdU43u_AGUbs5HGb1Km+eayUrLK&js`Wn799UxLV*R&DO;iBQ}K5mb0hW~53I<-K>* zfN(QhKE@TBv%}i({Px@jPUCK>5V*z3R9-MZG#DA6v0)xxi)>D-OF0)fHVn#9VBz&w zBGP^tWwtxzS0uN9uhe&}kh?B#byZO7iNnB*#dn~QsCA~dN1Gi)KLx&3A}?=Y;B1=l z%MjsM5E|4~!B`dmouO2}#uF$WQ8BJXZG$HicCC9qcOh#Kqc#WmCJPh&DcbahI!5I{ z*!~5K0d=+MwZ{*&rFi<1Hev5~T?sus=6axd_-=pW3`ScVkvmZ$-W1N-F<$aS`l)>U zo@cpT|9$z(yaGSf04}<4f_DJe9eKnuawocofV${FacpE%yahuO%^6pigra@M1%Nqb_QJ2f>6Q7C zFV_~EvT+ThDNx^`@~4k=LWD|ZO&sUxnX-kKYvvgzi?rpZ`2eh#=~d6t@ItNE#is?!i*a-v3)o7fs@4Qm$bK_sU@uq^=T7uTU}_M zautZpYfs3u>m5|v>niZE|3a_2HolbINpbN<$qobRxo5K0GnAk4m#CSF2^LS+uH zC2{Y<2X=V%F+yv z?_bQ(W|NchVS1j_{qtu19m2gjvIJB=Xp!(^dJMwilCto!En!zLkG>lCc+AJa^T3`1 z?2prYG#vQQPgIhf>y7_epM`i_p-Ap9+CGF5#y7K#UlsRNwJ zN@FXQlhQ`~m?UG*;66XQjrX}^mlyaYNeUOrkl{MI_~d@rs!#jg_56obF2$*RFH(Zf z&^!j@ge5KJ+)E2gfGm^$%or%+z{bh~&`#UUyvoh?u+i=^DzZB0rTn+)o?44Uv?wsh zq*nTh2a=1FGu39e2o7=Ml_0BUd#k~LQF5a|?TxrQYNvRPESEbqiujd5=T2-v;e4Caq3_kgjYJ62#I@>yvgy$Qz((T>48c@ZiE|54aabN8SY+$S zvZbdlbtJKsHD_if8yF5>&>b%oD?*1FQiZg?fk_<kWFHdd|_}m1zNWB z_XTo2Zq1SGSia#iq_O^VP~a)X;A9pJOux8WBs=MF%J#IADHO6&)PRk?|1@TW+u1{@ zaPw|oUvcgFMxYbp{+Y7Vij87!By&>HaoNu`(TEkWn}Z3UBf-fsUzuQ8dtT-6XtFd9 z4!gE-DgpBL#F%{Xt$0j}gyXw0M(9V*OG!LRUSOZ%Tvq=0yOv+Yd^bk4$$#W8V~jGD z5$Vj#=TpW_Qh*_q1M(n^t#gM>Z|3MyJCJ#pT}Q?5Y|E+JnoUg&7(95wT$xG5w0HL= z0(A$_8f}@ww}7a1Cy*{a1}o?M@4J9cE?@G!t5nTz*w;I76n1g*CG5-e{KH5kVEW`z z-14Ru0EA=(2UJ_m+b^?U9FZZw?#Y~V&dddRu_wEit4)3*i%u{^GV5TCNQC zNk+_(d4SjHx2N)Msn0Bqs_+k!GF)qRchtHq)DggW?Y#pZ`4Gvw=34G<*+=^$u&D|5 zBkcw&>6RiH#=V=m=7vM|U9nwDoMfdTQcz##l+XlHN}68M;9s|o~jE_t)2F(yz_0aOWtsp|G3Dop+xW8#HXRI<6bWP`dWb%0OsF7 zRIl>A)8kwt(Cy~rAJrR*W!Ph}u>xglpjPl^+~^FieyJzbGRV)im>RM2lDCk!hM_@o zuJOU;j~_mu0CYoS-9Pyqf@%P&hP(s0nudlj-kf{P(DT=uh%_*fwb}&D9bWbN)T%_3 za5=_Yc@>?IWKwLW?3h>cQ@}2mC<#UyS_w-52w7-(O_D3AdyzGtzj1u_p151RYV?-D>#9MGDZ`}B)$$XW(g}f z37^_N=3xoYwET%;E%?5!yOg_r=%AO2;K8{|7v}OAX&Z5##$XtPeprheLwmchP#6apHdr$cIDFAh4FFh8?-CdxAM_W zCrVrJo=m{k2_c(4WFu=-E%xE=YQbL-TLZQIoipDrEJ}Y&Q9ImA8@6+S8H&5ObO`dJ zk=Gc5O7KCp004)jmdN_bUlRgW^L!V7u1b(FneIVkiPr$?QhDAOp!urH^!XOuLuYehEIdct1nCj3R zDCN={lu;JS)rrq@l9hLKa?^(0E4h0uRm(^_qh2P1o7YwCGkj&UyOR!B0wJOhw_$ez zyHY3cS)XnLQ{A|G*3cwSEmUJ=?DFxzooukKVdRX##k!HiXXj=0i3?Y)XHnc@oNDD+ zxDScRI+M~zQA*Rv0T`~G_$Mg8gY#sIO>B#I3S%kfCmod!awM|Q^uE<9o2NY(3?3ld z?hb!eyJ6`bJTr=xZ8b9NoDU!`_UK$ImwE5PmFz(hy0~y<=UV zYk8|CwGAzA_qzyC&3Dwcc)rvl$@w4VlY7p_6Fo(FP*N>n)n@ zq2@{8Z07(Ycw@*LNsVtIo2T<}Sh5w$Qeo@g{QNOkLvsB177i?a5K+2};!RNVB$eWs zOXKx{&Ou$ptu5t!{4Yr|P^;FB$;g{s-q5<<+f6>gs7|%w*8kb0`0le%&LMqCe~O^J}VA(Z0{#PBb=YGL(4M zXEwqPsN82Ov4>gP-W*wga~^?JpFIsP$ z{J4AUq*CV|i5@n35P;g;=%YeVyr0OwWW}H_jz~8@SknW`1m0NT3tsi#yh%|8j49^c zc%hpa3b@oY&m=($R??Z()P9@do5F%fRnpk_d@9hqHr4{R`XtTgM1sm1{(3O!TsU)1 zRN9E#U?WfWM7vMEXTryai0Q|Vv#F3AVE|N*e(n=pv%6N&Q|~jplj$Y z^Ole@HD1aWiIHZLa7hTD;=QZIR#RC~t-(^_#ka(2^U{KBBk{DKDKS^L-WcMQH$R%+ zXbU0*`23&swj{nZ4GN6--l$)Ctw_FOJ5y=YWhM$Cgw=iv%yXXtkquwdlE?E)8^AWU~a@>4pEN2z|R`q zDwnX`JOQ)h_FLJ+q4PT@;eINS8KbFWWBLRt5O769LGQFnUi)^uyZCFzu>Qg5`otf? z?`kE7t%qj70wM03e3rfYn{yLfWC5z8pyK;DRXDl3wlq0Xeq|J1s5NcsIoYE*^xdDU z$A=oLmfg4k5im(C_~OrmXJlkF-xufNH6&xweK!(6wyR4K)Dh5CK>wtk1biPz5c!VP z;pO7JDL26f-O?^SX%AjOYXYv?_k}U zxckP0{c(uO(l1%2wX4-|mBqu^27uC^vcdsm3XNmb zH$6E9)>T0_e@H~I0}CWrOg{@n;=PwN!gOpYhc3yfQZ{^(4oJ0}rFc z81b7(?p-aEZ=!=^Uon-FmLiv_C++HnnkjgVX^r7Psl=7yu$^GdVhLD=LnefP#5`sx zxj|O@TppKDo>}BfhJe*cPfQ#}FW0k{m2+frXDM!Ru3QM-;mvOAO>1@(79YdR(cnDW7p;;n!l1e1JO`;tix|>_WZ+v z#MGTF{`MlBm>ZHM@Q@MvBQSr{#xr5Pp_ld}3m_*6C7F*z7Sl-FhifX1x7U(v`6o**lT9bMFP*i|Z zh0jW*?qWk|I1Yh)HqF)@6Y_wZF(9%b3Sd7i7^OUiLNhR5P5R?va5|NBK!jHjEy3H7 z^h;U4fVhPog++V>>o(e06Kr~ki#SctO=k#X@~YKV?b)L(4?{_V`g~>*;Nspsy1dKi zA2U1Nv}eW;cahI_+842KxG~(*H_EPJ@sjJ-#%BST$Oy&o1sV9ui>QOdi@qyw8rztZ zAk(Ygwq-6t7y~NF8WKcY&2*_4oNslS3 z#njaN*O+Ln!EqbKc{yu{N|j5H1K(A!EDzEiQCb!TJJt?q3T3oeDAQU^Xn5CANCOXl zbNW^-HWY4pa^9)mgR`UQo7N)uU$U#4=rI{eQUn3b3f!?fbz16AT0;4H`i~LK;QE zp}RvwS_Wxp#6XcyI;6Wnx>W?En~|1gNQt52zYl)*-tYIH=ed5*1!m@)H}+n8t+n4H z-O~GV$z2&Z1av2Nz63>4+6VjAg=bS5Akj%~nv{d%T?kqL6OEJO;ff91e(|=Ab z?0$d2D+LuWd|S)CH>yprGXbb843;pn@F`^ujkst0hruKAZG;u^gyBplSoS8y#6KQO z%^KA|iXccNx;zLZ7mgEP&`lWC55>@Yj0jJ#5gMy`_U%E(g@EEC*{k2 z-q!$%slUjf8qcjR2*TYzlRBp1X~HV9Dc>}*A6skx;D!fbw=B5PRD|tS4%~>_E&@m4 z)SB=Fd#j;HNmDF+&M`W`X4;~a8UUM;@}u0*!4}WzgBakrFCl;F$H=`JN^G*4EG=*E z79D4X)vaOo zP`8a)ku&&5l2XN5F~Cno2sl<8D*4>HfI0WJw?fZM=YiGZ@^^EU(cSY@R;9-}PaJMY zlt6gZhp1yh|L^9C)5P?YB0MO3G zi$+cYn-X`v1Ef+_aN!Uigt3sT@xn0yHdb@7d~!pXUvG=tFBd&pj`?vL{lz&?@gaDT z){$NfFiEob{%lIhJgEh;3g$6JFA85nO+zOk^|!$5p+b24AC1koicggf$B1}zzI6GS0@(&$4|(~`B=#$> z#Jw`wVq?u}jDx4C1?CjJfRwL?Q!1^@MKKWMz*3~Vw)tr5*b5D8wdv@sp&r4qK9c&o zU;OAmxK)}+y$xu|9GmV$JEuNTrYYovvTBNovBt`f_SgF4!FU14`4Pe%x9>#TKjxwnHd zAG|iM4@92n3-#0rA)(AUY1%6pK-Bc+m1h`K?{wP>fB~d(x7`IqJbCbdS<6PNLdbyS z#{_c9kuv9op;{FKLJ7pS?b}96cKPuOlG*-mhcqmO*yPpzKzH?6D}(U}L%kER1b8G) zO$o}^+OYa*7X5acymYyo9r1QmRNk15j~Ekd3uXu;Yb)0QKPpD3O(~Dv)x|lrGEgaa zzyY6oa3vbTDe`OoA*VpZ@34@z6Kr=~4>n-09mKZD#r}I;5_ReB9(oD(pK2!KvR)Sf zK3_FL@*>KE#|xR;0I0}8C4at(4E-ye!qKtb4hojbG_*>F8wLIUsPRxmGVe#9?8&C& zW67-BqS8pQ7P{FsAfE#cQ*GgharPzviO4YD5wGR1kO5=@At96V*QH?r`BA%Hp=Fq9 zP`S^AXbCQ@m+fJ+OlgoS0H90QK_*iEfR9m@%Ms;+qL6oAi26)10Z(phOH#l4g`~wb zI)wqy6E|V~O?-0A735tg)N@CqDE`mu_ZJ0@cSa{)ajTqzPw)u23ZyH34hRy`!*)>* zRfbr(cXVk{fp?&<1)=`_^F~xjCYQuHUwF^kBCw9RR@g;)OSUpY7DDjaR@@dhCh$|B zIkf~Kk;0?HH))1L69p+R=F}Th`$Tr^;phMTGmN!NcV<6gf}#*pb8xVbl~w>( z03GtltimJ8liSeW&hz(@aND1?NCK z*q(dKi2NQNH#qwqK*fJw>{2ov=aCzz8|$i7LP9eiM{U_NFd_sbz88z9M+0bAQMOif zcRUa?S8o|BEnjR8X1MqUF5Kjp$l^f4;CTH+S54>>_{7+jt6<}AsqK*|9@+TVC}5;? z1|^z6!NaFHI+}Ot%!#sj(iv`E=5#BCO zM6|J}>e%P#da$5Ywm(%0^Vk0SU({`>y>-G>R7CToAXHZPp#Cl3I$ZJtl6AL@9PF|***%Q zW43D}DSJM81Zi&;jTAj`7$yIH0!tqG18~0%=oDL{*aQnijw5@`qp7*n#@OzE2y_nnt>vIbZ{=)hf5u}Lx_+uhK z+#tH+c;cWGukyDKNJ8j9Z-_(s4NNZnJ4T3t3#TK%KIO6}QbQmwGH|A$1M2+W2ht7Q zwn(SL!R){l{QonO`nD3GB9M1@yy<(^J9>174t=rSA5Od8*=ig}iENEwL!>_MW6&RV z1xJLmQ$c?f6QKvg!+(#2nLHl?n2^tToCkl?8qKC4za;ADRH7A1@}9;8xAb$VSdk8n z=tdei@X+F>tf?psi!P0o`CoI|-F)Fer2D}U^s)AKr-^9xTn%VWc>RwnAtP{$!aBwGOw-DlFTgcu3W4tV-`DS0Z|aT{v2pZ2 zg>+(-9zJYjW$F&kpAL!$XGZsb4!dvVA$|djB?Lp2bm*Fz`}Ao2mjwUxKEYw8UkztW z#3SfT$2K|MPVT!^t*qmcD+U9R5(=3`b@&>S!v8ZFZ0Cf&f5({z6%`NNIHK5 zCm2TDxK4L}F&jgAG4)NQ*LqrRNqg?i8;oj@3K-K#u0i5tbNZhoBkwrx8^h%9afnesQDFo>}|hmU3a&uxpIwg%B9 z?fa7?BO_Di*?o%g2#xQCV&9+8q4$o8(V<&qTVJ<&5I*IJv`ha}K!>yKXyey-uE;1G z-QKZFWf*feKJ)W4v?AmL@bwjn4`dDy;@1?wFpghcRe9%ri$57+)!TXLUrcBU5r)>q zabD@jbUCbr{A~2nNhFfQs{A_vLI)Nr3`ur@SkK$m>-Vpd4m*34Im~76zr1E`W2fZI zXzWeIbw03x4l0U(wd#Wb`?_XP%~j+a^>AkAjFHC@chkMt}`{??7`@XYp~mrI|oUPH+sZ94yZ zwOj>qs3?V|9SA0h@5})cqf>D&U2C}MZi>SgWqu<^u|+zN-!d1qu$BHyhjVcZ=kzmV z8CQo?yr;`-iZEFnD|pI6m%XG`W(d7p!VH=~>LDxin!+vcreQ~KypOP6Vk#{;ZwpTi zLgJdCu^~&UL#&|CV1~BkqqWDbWpI` zq=S0*zU?{M5FqvplOD-d(z%2UJ#4N0n+QCUdl&(Vq76*WjeR>wV|B9A{=8rBAqLrg zxeXKbwqd|KA)e5T(-PP;qH=HNLj;$*AbAfm1Rrg2V>`QI&INzoGOs+hGga781*%!D z2!rjnEY1K{?vMI|N3R*ql#9Q*e|@qwD)S{zLSaO(( z>i&@3s4v!E3L&%iALoF+ggf;<%F+i_EuGi0KzqKmH)r6uM%ih^-d-_?WSz!VAqtTV zv-h-&sPG2X)iKjl1Bq`#4He==^=L zx&5Tr3h8nO?d=M)X;kT zhzy)M@o}$<0NuGZ$DmfOJMs0l-Rf*6Ey;Xf-?J$PcbJ3%NzkbN_cA#K7Hxc6&V>T7 z$kwcsgnja+jt z4(1+&LH}65`b#wejyP@O`ZE~K26N53ha1AL6Xa$*xym-TdER0Z6DYjr6ooYKz1Z4u zGHfw+dR(Xc9U^Z5s=U~p9!+uK&aXH;qfCW3C67hNw+Td#Lu%~vhbLh4dw>HemNPWw zA7s{kWD~#9!&V)|b}RHb;3WX<;`49X#-51JPMzdsiS-gWeng&?Kxo%)skxkcx@@4( zW@*F8rbP>OA)ODzg40%GGx~>PEl}Y0&sh7caUuPy9;)vTH-06Ie6=8tcHW8Lw8>IX!{E=6>|F&?fj;x+#GI#yXyXj{z1&$lh8_gA0qBC zPU1yXQ*;{UGmT!xLY*H?8pPc8mx-2tV{T8WCz1gF^O6?;U7l;BlpL8M_(TO!Ig!e( zALdRj!}k&79}EJLw0eQ+-j>dgLzhrMB6O6rY}RyXE^jgDa77}?)OTKVMHbyzI9}gt zR{ry){_Jp#6wx}p(gXO80{;KAdQ;!ry69kDM;omQCUwCJ1p4J^A|jl{}1{=5rHWXp;k?oS2pO;=dYc2n#L7#@iX|1p-gxH0^>I; z-Z)M1x&uMv1(j$+PAlG8I2H0dX%s(_&nX=7ANegr?AMb1Z0-w+YXZhR4=;IV3q6~%v$`9*AM5SQbsxho1#@EHNByOLJ#!CIdIEX9snWA}sv89;*vG#Hv~ z?CA`s!A(9v$MD>iS9Fgn@6ZjjW|dn4LO6k~A{o#i*T)5ciI`XKxwIsjS`BK*F~ff8qj!U@sSymsBB$F~S^#ZqMd zp*e4f*yaH7zyxgs__beMx74`pQcBCat2o{(0qIP#@xDYXl!e~*I~W&0Zf z|GBGJPpE#(QEY$>dF4K9Eb)Pt6*r#KYc{z}GA~Ti-X*s&vP=19eNk^*8?HeUztqzo zS*51I*Y~y_pcI$O?{hLVRu;aaId6wk+KS!cEE>SP7ISldZ-{UXTUp^cr@Xo+LfxHl zuv^};uRh2#NhU+Xm)80+D?Z@K(B7IWM1~+bAs)+@;`KjzOtagnG%U{!p*uq@-4t>* zT5DRw9NJ2h#E6JZ|9GhPF5l>nuBe%+tb%Nr>|2^W9LMauB0FtfYrMpA&C0xTSPHr+ z+N$@8{{cxn_0G>GdWdN+axZk*C5&^=^+!_mr(~5E<7#9MzBp%U4mXw2z!QQNXOnr! zE0ZZ{!wt{IBkWaGA3S5=1iwS&TDd%wsia2_+J-CZAF3=l@46pE_=(=Hx$NyAD)o@Q zzPnFXQNFA3L6)F~k?L$;kiDh3QQyO+GY;hzhIRXC<ohUG7_Xr743xk=2$p8G1-W-o&EHy zp5=@fTG7eqEsYjeexpSQF?5f8j>w$oerhqY;hHqJT*nd2#Kgi?XLz=_H+^4(iZ8XE ztR>SnJeX3=e6p^`Y4qjv(+@Lh;}$p7X|zU#u@ANz3@`)*=}#x0ny)A+vFOw-=9-VL zJp2;I<{er7!yu}|dX>sMoHt<*+goqhzP))i!fMBrLV&CP#()ifl+)IN8p|1{Qktec z31X)8PvopR*uWeSB?gx%r>YcVBa`u7HkICI-&TIH)E5Z5z4D6^*2RSZ#KS+I9}kX} zps(l5)G>+TKSD?thW8Kuu=XoHyg%4UU5{>|_mLK@+hcetIl)bh!tm=bO0f$6txS}a zs>VON_1h>5R1anpRMz|CTs#bagGmQL={f=z@YSp%iUY*gD7e<@2roWzb{%4rY!YPq z&=)_w6r(kbilD2_(lUCT{=MJJq`Q!J_SSix@T1L=e4pcWh&D`IcL~w8FS9~N+#cE_ zx3c6%ck1T^w9344BIz#m94UabO}{wIP+pS_<1Vzdedp5KDtIu@-l_T^`?1ub#o;NQ zWJW#rmN^hC&wgbwLr0}3sfzbu{eKQ;oF=31N^TKi1lY0Nj| zTd7+&(Uip)j@C-Je)^>Oo4oSs{2r=bqOZ9UW|WQ?VxorTiOZi%wWZ#ES7g=|!AVeH zRa0m3DCV1_z^7!k5jQh!t%kG)Z#hY(;tv`PdA86KX@ArBmYb%zu2YI^ecp8N5V!NJ zG@EwSqqbXmN$+I!%`SF((rO}0z5T0CHLJJ*rd;bKnQN=paL7 zSB}{kcz~`Y2pb~W2s$~L7$cYrdxdh+MxWg!Sbat3A2DSs%iyM0Nkz8t}ejg!;k8F^v}-1a5~49yWwZx&y( zQYsWPDRm?sSMO07EHmVuO)g@#${$!^)zcoemv++a)8QCTVa5z`7M~kk&b(+h8?RzL z9Q3+`L1H8goxn(u<4aAEMk37q2gQ(?o76 znzL_Mw>Cv&RhM_uQkuU0OX9`PL;7lPoe{#^QlG8xHTxA2o2YUW>Y9uj)N> zVU)*xcWqg+p38VP(;9o}^5fpqB!b4xmRsvxlI9_s5+_=o6a}5ERH0{O9LN&Wcsg?J z61%{1-N`yzT&rrZ)dC?8=2w_z3?+`y|H{2QCatH1!}(ToWW@$*x~>4T8T`sBn~P=} z?Wl|WN|KuAvR{5vGM4RebRO7nGnUqBCiBhyy`A@PEwJ|4C*{GdmQT}6`OUCFd6TF2 z?PN=-Tj4Xbh`z&^ULw8JYbLF~aQ{-T@Q*M#zRzRpWnDO1f$4bU&ZP~mOHi(6M|I4u zRW9zALU4v?mbE$50I)JT@Sy(S;WqKR#LF9vHf-@Dw)Rn+$T~yIpw4R7O5RJ zj`!8Y4j*N8X=$rh>wTVaKDP1J-RX6wvFxn6wI7s>%Kb?eVQh^vk5n!srkQM|*O3~2 z;QG$#b;r$mE`5qW+50{hz4l0Gba>pLphRiY^c0`ZqWmXULTuWw{(=|_b=S|AHwvCE zXw|tmMh#1TkdwUa*Woj;q$IlPq3PR#vo%{EOQFBy6;2biCLesSWGq4l)16XrRsB7z z6NvVguYFrm3YZ-XZw|iErZDw+`zQUMU-T2{W$ylWLye{DePUGg)xS(cJQoVd?v$gs zV@B31oY?8-@RGpDmy)OMgmV&=EOQsS9sfD!nRG&SWyfWudLHT_-JQPZaeEgQfsj#s z9beq++e;Z^u>ZrBy9%CfU9T)!ym)rbAc^vjG~&AISj}%+l`0PbkY#U(6eZ|;jzV5c zcG}%`YO{?$cU&ULC9+Yez4Fn1-$=o&Q4fwKel~PvywgmCzFLNBXweEUZ^~n2u27!F z@Q+96pSPm@BO_XjX(i>#h6Fifn_Kg3!S?Dl6MeooRW{Ai%Bg;#Oh_6km?myPRgI4f zdlPw*^+8s%VH_3Rh=m-%hovW%f8&7 zI_N2ZsT>w;PYeATUZs;4GmT5^xX5j~ z_JiL)%})M#p?^}tQ|r^IPLhze>Krdu3uxT1aNX2L$Z>caLz%;Pfw@HdRAt$HwSqHH zEX;!J5*vY_t6qQmnI?xOVb|6tMX74oj2@Bi4CvWm=Fgrw5BN%}XPW!&@Y_uVt<&;7 zcDY;)1AJcEoVr(%x9xILI}J56vW?)3d1OAu>ZKP(?BxeU(D7H{haTi*mtPhX1g7|~ zn*`g@rThAQTkyqA&K>CJU%m+u>DXJkjYWxoL0xm&!R*F`^%+vku_{Ril{s4dJG#yX zt0XM*A61;BqXcYWOCw{BDYjKByfBioyH&3FAoLvtw%qpjP3}GUH&Hp-HRuj8ah2tr zM5Q)%*Woa|%|E9L-8x?=HpoK~_Zd3%Y3Muz*oGXnUw4m2NE z@bGQ7N(!{=d^F#Dp!p_;x~(-+fm(ZMV@aT(y4Qf;rq_m~01vIM6PnDpw?(t7Ifr#W z++!>-NggbpTUvXJE!`J-Rhpg@F**HY(kR#HDHTgOy-xR_TXwmHc!LrR>wy0Smr9K5 zMpA%MU~sUTxYWTqoQbBL+|iYd?GbbO`Lyiy7!-DydTy<~r6V?m#ATmj;DnJNYYtE2 z>C!(J76Efdab^=gTO0pGhYTjk74h@6?8Mo;A0H z^Urx|3&gnOcgz$pppQD?b5{9l`rkA@Df+pXJGa*+^08XahE4ClviNp9_n_v2tbTNX z>&Qlc_tIn}D<8S}wx|Y{qPH6|rbZUWVR{K$933SZ3;9fL8lD2zKqo>=>-Gn^YZ&wU zFy^O_F)yp73@X|PTjn+|Q3;e7(HIR}`CX|=bUedOKKE^3yfR!LN%ig{KyRP+GIh)i zM0%4AW6XcOzBcQwq__W^7S(=LXmy4Z-FeYcB$4dfOGH+jh`J@1lfZnX|6=vX!Z%L* zIOF`LsE=z$8R?{JoX=^l09KIjhzrWT;9VwzFxZaCrc&Ei5EG_o}g<-GdjP~Vb3+zQgj&v(pYOr+*8o^ zEgndJm?5br5^eWAjAn4BUvp_hilnvc2jfx*U<+%rFLlDU8JVN1zO=%!DK=jUCI{q( zJe2|ymTq=AX4~#bnHh3uk=}9B%&K3XO~?8??wU`#Bh<-}8JjBaCn#ZcR*n{{h90@B zFN{VC8$q&c9~w?cR^Dt?sE`o2R%|ozO@O9^X`{0XV)=b9{}KH2aMzZ-1fHIr&I`)Z z9EOumDGj`@h-As)^_Ck1>PmUby!~9c0lS&M=GmZ;?fQCRpA0y@vXz7J1BY^ZIz>c6 z{A5i`l1N`v$(j`)#V-tWp?$x7lTTiBgcB#0%5W! zL)?-R+tz0mjV-7BHxOPjmVjSx&3)TyTCRV4nYh@ivD=Fg^I2^X>#*=>LOefodv@-D zE1tU^L_98OdJ;Ob#uXcC@vAZc@!7Nq=KGu_sxP^mb*m0DFTcZ#?Y%ky0Grv17vkQq zJ_(KvzgAv@v6W!e=g?Z))FEji>u9?%kje4~L8SW^^tgP%X zcpk~Qo!oSqa6#nr6KRrJq1@gb3}<-3RFcDf1^K4LsZ=feUgb6`AGbyf z;{qKRAv}mSH@D3i(p!Leg}VB}HLkA@p={`_*o|BEGE*peB*c%4JH7wyE;}*Mg!)BH zXY(I2GaIIWWjpUnXWPuAvu@WyK1OvZ?mX!sI;Hq{Q6##1`1Ky1=FrOhe3{-wcd)Pt zyTn;IcTO{5gN!UHRGEsb^y9|ywoALogB5zLE<+FlG7>Gj=?gwclo^x~R&mM(A2=(@ zF5U{xu7Te{JhEFNU0f!z4r>|BniMom+Kbv(}#j740d8rXb!b&DrFzxWCUeZRjr!a%0hg;YE48y*8iz9Ibd~zm8f| z2z0nz{Uu&zBzSNfd_UUeIM4j*k6Y0@Hz((PPN8z!D#!zcJnIGvyVf}j!d4l(EiKFl zYmMSUMLEAoA9u>v;N(y zayHLEDX&?XKb?ncgcfJJH`yjv=6ekGHUfS*;ZA9TiIKij&KMma;i)&te6q3RZT3H* zgnGbM8RkNApF;x)2KN=?F9clR=G&H)p%BWG9T0NcF5#f=TH?@q;IZ+6;!0NPrw-C1 zqLnankG9QZ;;USWHyOgX;cz}BW1U=*)X~aa7ne&rKR-Y%kK7cJdvv3!l>Mt5MeZFk zRwkkmTRcj|Zfa>-)fw!PR}l*J>zm2tb`&g4h)OWu1Pq<#zEisSD-I zXU}buU?)-_jjLj`vx>6%&7fXUv}#YC+Of<2jvd~;+Il${VKR9;ftdr^h>p?%m+mfP_#i+g_nO3@u?6fcZXd>Waq|tAs3qi z-bdqDMq*4`d_p)`Bx~zTN#5WfP9kg4(-s>)vNr3=kdT zQbu0L9)y*qe)luHWCc`~J#JMzHGOSM>%s$PyB>4Hx?D!P91fwxw#WXuO7t5xNn`Tb zgM;+J!z0CSwVD*V@tZl>n6zBm!l-m*6oK@_>?;FM*#4NRe?0CO3MrW46zbgMb$8o~2 zp|WSCehpptkuv8<@)v$}W2^9f5UM%jR->#YiDLqb&b> znCKd|+bXowS(2Wn<8OUAs(23cPMcLk1Cw%jsQISRhbieO!_TZxy9Yr1OGi&f&jOKn zz>{IVz@vHn+Fe61g9xP zSzXx<7HwCKf(l216Sx|1NCgM1IL;^X(@7*?0CPVyZ3Gn?qOx6l7>zQ?yL7VpDSmJ=8JL35}0i z((a`A;4tjhu3|AydrqG4eNVMOrkP@>S`{$f)bz>bC6J zV~@Tpsoo7{G=5<|VK>-1dL7wh`R#4LDP?OsRB(0QF#aXnX* zaM_+c_?l0zA`Wtni~q^1Aa)~{d?_`v*y*&X3+L>CyT81khRBX*+9$gzx!T3WmHC8+ z6KK0Ky~CD@;DAw_Jl-*t=_1W=QHJgi$i&_Fh&YX2q*NWf&i(YqjMM38wBj6D$mycR z3LD2d+nj7QwNjU9;;6wXYDeN5?H7RLII&J8Y+uso(O6VDLeaJFHYs9~2gO=OrVZ}5 zw!T8#n#9#c?yq)0->}pO?f6sOP98W`$dhcdN+rI@@TKiHe@{iCc)(id39aC!k=xH- zYyD~aB|)Bjts=c>p==MBx8TU7)Ia#f5{ymbuX5iAI^SSitkosOeQbzPL`Xok&@PNZcA^4?= zob?3X=IGxY-Q0VN*Axqfm^j-V2U!5`O?NyZ5jK35@1FVv0xsojx_3q#T0!pXycYZJ z)v-*-gtY$*I@Y;g_V~+`yP(#_!5+<73iE{9@C#8PTz^;k&cXWU{k(axApwIBeg~Yc zB^(uHcI7ftLuEp6$}ujI)Q**;nyW^kA3IXbExD3OjCYlBPN%$24Skn&Ez>iQRwI3s z@d!PWR>1*Cyfw^zAwq>Fr3**44iuWc^b&f=TzbRqin+z>LK2Q-8*BG8Ye($jvzPlu zIaR8v7MckSaxxtd@R^ME&+tXHN`^Wt{9wF9gf;t)r()sPQ(okB7`*#!hRn#}mtEVS zY2A*|pqpM+nP({sEb<sP68?m#k`y{9)e}MGzp2K+??Xw+yB&O|+6M`?r4$95sQgC^BI4l=!yu#8D@- zitzay;mIk!iLU09)*bt65bO&7jFOYyv3y(P9+2pU-B69peaudWe3r>;B-@$z`<+_o zP~hEbdla?Fp|n#>-MuasfM}Pf-}iK!HM!^CT9u`1{dnlEY4cdriiuU|ju@mC|6!@Q zVdlXw*+-I@U!1$XC8X6A)IPH+_u{esed4feG6gk+g4$8(jltfZCVw9su<9ii`3X|S zDYHHZytw4o!2PHQWD7!GJy!yNN(x{c#aUBW?AM>n`P>39S4f-^C@)dfz-d?V3|>n zflV24)1B4M=_{oM@{Ru;{bGMQY?!8-2Att*yL&dsBmq_tmk@xoh9H_P3a8aqcZ=<+ z)_zxLYL6Qw1ja)Brr6keO5kL2jNlYm$eDxj&#BL(+eSo+A$S9@8Gj*J8&|na9EPNxk-pkf&)pY$MfU6Zqc%1-spC_xdfeI|$RI$3 zPGzTN{{y`+^F6D%kSny0rD}Pf){)SrykkGFLRbu|7e5+GYdSD&ITWp^_5{*tncWYz z$!tbeMy+=NF(`_KCR$H}IQg%T0hy%pB?lSUeGrd1K zE2mHWnQ@XymO7D$L_r$mm~Z*Z4z)A;dA#Y9lPV(@HddDvV5K60mX|;E`b=edNXXUV ztrEK?ga#{Zf=G?XP|Xq{vtK8s$62B12VDh5UNcuvHP637-AD+C=hEX^k`C4^t|U3> z9F;4JV`jeS0J59@Y{fT}5&GUkHUP4CmjxyLy_DSbYj$og4B-Y3HLOnHPV96JMkj}h zgAzd|t~Z_C>hTJ=I`v0bHFQbGD9hO@+fTh>Cjww4 z<#BD@U3Z@Yoh>rNM)Ik(>9rHhr7==_dwp8 z#cvEV@!tJM2GwW|u@<>}>r>DdCAsQl?W6&XQmaA;>^h4Vx7c5=+_$6eymKcA&>w!8 zk_#$=oOyZjJ8luMFOV92q@r2|E8{b9{aC~~cN?26?M}r5yJ4`5_jETGhkI&nHLXb5 zfTyS=w*Oe6yiqRtVe*0Y*S4#F7eJv^9)I+4ZH(&k{Hr>%%^AHbublDS+1)jo8+a%G zx9vdo>%RESH(oUaD~{iOyJYcT=|EvFws&Q9Sw&U0$S+1X8`!7$ULD-9l|!h;2<&6h zJMM2`-$G$^>5h9D;YO7z!ilvRyZ2_lavt;)?R{=u8Wo&Qp#(@HypNF^5ZGWHmsR(I zil6DWCs77fpt(cZxCZ0CAaP|*mQBl!ZFL>nW!|kcW<k zA`#GlwoC<>n{K;3FUqEgiG9Vz$^{TMWZcZW5djOz0LcK&LKBq)Sv|@Nyrl~@k+eTl zb}G9pKUkHA3IoLm3U=lBF(1gkK=)H#Yw5Jhm~lby=s=jN%ZhAPT~Orob7vECxKqfn zs^&sM{BN9Z<{lPGIvcs?#^*vKq(NxB-`COtse!xrX^)XNtRoL`Fl|KyWzjBtRNg&S zxqU*Xr;c&tnXU7w$7ruydniwuieo5fQK2rktAOcfbluj(p)?zOz4Y29ONXRCC4xN0 zoT-xvDjJ2}Dt=idD9h*?E0(b;I3zeQ3w{}VMQ%XVBG`dl4$vjV(k(~MgyQ2JFxyl6 zc77n#E9q55rd}&PBY$VaNLwAQ2-W^0i2MwmINW86LFH=(-)S=Htv)Vn_i%tYZG3Zd9DIe< zLm{`$8-B=CIKejF%~9-{Iqzm`s#G`3R{A*y&Ir3DbXQKUYTxJl11;L>xaLY5bg=L_ zd%(#wR|5CcHi(ML2s_hjl&%%Xysve?I>KA=fj!GGln)sl(LG9cHJ`dc`{E;7$G~=k zhu->#AnHg5$pD&)ae^EwJ=iP*EuNj!-w+KG{ttr)_d~^Hul_Wg*Pw8!0~B-5I;0JR zGhN?BS088;QyL<|D)-*U0qfIhKUgq}k##PQJv2buPhbCq5FoU<@gMJFx$ew_`qliIeJwVUQwUCSz zEVa88`>81|?|u7LnbSkfE1Syog3EO60Ydyl>um2n1dpui2xV6`b?5ALSODC&DieMT z4FD6N5x!jFHwRSbpEBnFl`8^Vnn2_P4{+FVw zljeS<>~O2}RgbLk3k`KE(J76L#YJGhI~(u z1>7a~J(VQ%+DNj+r-rZO+tyz!o^goLV;o z5L(R@;d-iM@aFr)9@H%DH7>3z^~6+aAaFh9&=Ry?{obYhN;B!G2~w(3%1IUgVIc5n z%3f*WMeoVtN!p6>mz*ze1ECkKW{-uE-Y4<`?ogL1EF&1T<;O$n@!gVO6q;Cff~&;P z)`{@o;;bzd5t$nihi#^+jID=1)hkJIansZ8loK?n!VJ_dj&wGaIntSz>-6^SHBX~kfGg%T)lt4mD z1rXE71cRht_pD2yO1SD0p|4r|Q_AQ+4+p0xsLMe(0~$QSt!TPrK`*qOou;pNrFA4g zGlWL!VPQ_wat2z+?8`9x72PGT+)i1l9?Rp?={k4hd>aC%Wk58Wln6*{T^N{|WffQ! zgSAS+r>D$>o)x&Nh)~)HMaRVg59D|{4`NpUsnF9P2}|7SW=W9*D0Q|XBW+$HnCbAv_1wZ!^YT#pe%>s1t?rs;0vaP+jd)fa!W`?eYckTc<^W;f%a5C<{DadM>gs7VET+%c0=2m=Xdo(_%0(=G-Z?9T4w_?iOg*ZCVv ztm%L7z$DCmC~48$8auUT(<{O@~m9AIX_l+i( zA$bR}bslQ=cJ+;RJ|mXHwZ{(|Z;%UVej+JTvC6 z+6&IT9;o2^sy)5{B)YkDTQq0JAlKgVytDy-tfOd)pUyYF96?=d-&@Im*3Z91EDr|- z`N#JS1g19GD7r(k5qNs$Qy${<;5zA}w%2GTh!DcrpZZ%_d6?aR%4)QEIffoxS*E*C zXdo>s!;>sfgkwTO80bd8SD+=2*|!yS*OeA=a1tp4dD4353tP%3@!3i*%L!%#{0@6H zAdyKc5i+P#A{q6o0f=Eb-4*Bt4#|O-)_;xFJD&o4haFD_9d7hjy^ysfF{`5@4r&dnWqme?CO3zVFUc1oL7r@@adg1HD2L?`c3mc~M z?K2VB_*8jQMn6OY6#oN`4-<&P+?xJfIAyT6)a?f4IjEI9J2(-^u?`#!Y)TcJ6E9}y z2~b@Ms|;1{$JSTc_Urz2nLnE=jRWjyB?F-dYTms9?DrQ6k@oYbiUx#-aesB2dz;V> zgAIX8eNJ$!=tKY=Qtm+M09|=d?gTy`Ye%CMi*vKjKB>@iJt)*dwNPNdkAShI4osvs zAL)FVkk)g`A8~h)Jx25!Wb+2NhZV%1O98w3c$jq zeusxt;k3A{ciF3C{&BV5O~{A>aSYvhNYL1H`wgf=e+^ z!&!rZL~jV%V}CHxUnVG6t|9z;B#(#qRgf<5)aTNSE^!?v@Hh?4-4Q`eyA-m;>7lfa zXn;Hz>KXuP$#U-$VE=CR&n;CdWZ(y2MBx6POv$OaDBdrP%k_3y9ty2n16aj6Z#Koh z2(Z^@3#x~;iMci=;4@(d1w*xwzrPiPsF?^-hwylhD&ea~Q)%ko#R~sYaA2=S{9P~5 z^pSiUMe$lCveyKxmI2;JO-TG`r4*3AjXnPkXnSYlX2q|QM&1Omx;m04+etSgKhzi- zw?=>J9-6Dec3zm^L2B8T1eXp{9z(hc{usoB23_J~7cR3PvhQ#Cf73u1D&Ye?$$*ed zS1H(nhk0*jQ3^urlVAfo{wU2=+)mvt;B_@~+8aA(5YDo$BoL(h&k@>2d{B%+w$gVw zx7Y$D6CJw6<>12yMEyK`#eQNr885Wk#v2^ss0rov;R=8;B_;AuLt;a|)HLPBM2h%` zC=uugvkkXIjOW57QZBDbsahO9?#zS>p>5*Cu=W9o5KJ8>HzkRFit9KVBsCQipR$iU z=!;fLSSTbu)%z>11Bu2E2|JyFYC~lyLG;Zf=y3eSw6!8 z)CpCnl{IOr?*$ah{f=gd`4zT19y8RGeySZtaz+3tqOsYACO2rr<1A*a&)PHIAHv5Cv_dgvz zcil2}Q&qSoS9m;q&Slhb@^fBObg0}RtAhKSzfC{Dp0X+ez28u_(J?Qnd3~|5UUTMN z4DI=m#1L3VLY--Mt2MZm>MEFT!yNC-coY7P--eJSoLshi>#w2)dErc zQ8udJv|?gMM&U&qi~zKq#<#9Il6p9a1GAvH*heL_@yFF^D;mq9(>kI(n8k9)%vQy|kQcG|Nf2P?B0H_E_EbwVu~Ugd`-5jM=I*q(|F-O}o_6*oQ0{t3?Zsuj&AL5JL<@F; zugAIf)3zc+Eb^%Mst@f2sDMPfr8?8u`M&KwH~q!4MJLVT@VA6AAht;bAWG(XoEE-; zmoft%`v~>tHC#f=_OudG^88KVn*6Kxg!o6vbj&z=oGL{Is3{J*U9y~c{jMJp(5SD_ zeJpbyiqY9Y0p)<867vi-KaTH78NYxoVy)yu;x%S9`yQKlNl%!cR&i!0{%(|P)?i70 z*ir{`MJET1h-<~*f^rhLFo5JnxGKvkS~Xl481-Aj-2V6xRjjDP;u=3`EktNLe&p|$ zA}i68ojZJO=CxMAVr}Ux|^`_uNhv)f>2- zN%mPgA80d!l%CDIn(JxfcFWp((9$mO}mR0_5Jbo)f_L%!kt&h@GW&a zU|vyqTjghLOwl#;y-d})8qy*%jPnDCi+o8t8hMKdt;poWempc>T*;B@9Mi~ou~1rI ztz;#S0sGNkTH|muKGL1_naM`hEBI5LEQT1xFS7xiK)s1%`ITXUEB{Zpa# zA>^;u?izV_)*c-EMm}lr%j(T!EqilRg~ThZ#0D^1lCm-(ba?OiZ*Ttg*dX^*1F=WE zf7?WzHe<|z(Y$9`kCkn;07v$wz}q8-<5{)QBK+%f+09 z7&>NvbzuHg>)V=pf-nzz22m^sR(vkv?}PpLmk31s5N`@kCp|{dT_S2zBu+6I!p`}6B}fL; zQpIY$J=5vCw{u=ttS}K;F(#;;ZTEuA>F?lC9@{}18DjY!xfEg$Q?y>Agu3MP+sRQ$u$X%%sMkD5Uz?I67hM>Gfc*s*GG_gGQ zvU>7l>dov<-U*imo4PpAJUCzsz%Mbi?zAC0%Du=_1WTdLR!U0VcZ2oz*JnPa8{dS$ zk!)PS6RUQ>sWVg|LC*6_15Wbsm4!$4rYdR~>9yE(n-@#z2P9D#Ri zzdv61RiU(=Zx6(OG8F6;_L*+NRnTIv!Eg5r?gHFDv!585dbtWz`@*1!fuh?nFmf94 zX3(LF+sZUrTq3QIry2cy#rEGM*pJ}cc9OZ`S_yvE^c+~8I=ei@q7ift`>xwXS)`V| zwpVzJS}^yhtAh?A7##3+#Uni&f+q?eOs`vTP4yE{3>O!}2az74J9+W`(O3MDHsWe} zU3$V*Riwv6E3W}mtAASdpi8$z>fkd?3PPSIf&}}fqJ0x0JrpXeXe61yLCEq@G5quD z?(b2v??nEWa1o=>-=HKp7`YyY*wGXszju33oj5k_H#+3xmCqb$ zMoB@jC%!pNL4``Jh?8Pd0WT)USeM$#*PoDQ{e%&jGt;T+Eg?Zgq*LHB2?jOJir%qE z&JT*eGcauSPnUWQlqziQdIu8=qy7h_NjP7E|LDD%?guvJcE~Bk!MMfed(q|lwB_%| zQ!E~a(%QeumsJeeknd+w*zs-yp_d;=)LBclL0(f!52zdfmFmEJg*^DD4M3cx`$M@D z+!T1&s+`}+)tDTOfKeT1(S1iO_52pN|L|t#SE=ps$rDbxr*6qym>}(x_Ha(--XA)A zPZvy)u_A>{F4{!XLX)ON-o+&jZHak>h1#;4o>oStZ=Uu&)_R{(Jw7M)Y*)sIfy2g$ zp9Qi}SJO$MIwj%gQQK2Y3Ij#YcR#>Q6BdZ_lU;dn05CfLcWT*3QJOlk<1?i)PU05b(cF(K9sqQ{$!RcoNR zCnR~6Me;n}i6ZkrdMxl;*R$+CGqEt077diJ?i^ZzzN3&^{V>nBL%^YhXALM{f+y>| z4o#Ca%VFf7i2X^#>Sf40r__@0l3L$~t}9}_zF8bJrz9knelq{;nR6r=7WB!hht+M) z`bf54(H$0hB@&#KA&yZ@5asKHynPp?MW@9!3vxtGrd5khizF)39)~g-=KuD5c3hR+ zBGv(OpqE$L()aaqOCMuyeUBQ2u7UnwFsoTm{d9**Y(56m{kr-Yb*S;Rh-eoqk4MbW zXF`i0D`cWx{|`g~=*dxm$MD61;!VW0-Qi_4B{foom2Ao0nquO3<;wuZT%+ZJcLFw^<0v~JYiriMgsS6g@NYgqyGuP z-Y=+d4*_|o%4_&&ns3cZ)FG)P*b?D-!^n^k@j(U!nXKx&JBT?oXf+JocRjCv^Xgsw z@JgEBkqCgGvKB%XzUn@atgszyO2w4-zXAR2Egh}fr$~J9u~7eA0revQ(l7hLou!hb zi6H&%n~P>5BahmX#u9Iu+0F=dXU3W`vF&VU=f@Wj8x^4eK^aoi%>!+j;DP_?rg;aV z1^rQ|Kg~+xIB;*4qf_3H(tm&XK)U+CjA-e%w|%kIFSNLhFVgyj#k0c zwwn=}dkP%FwAX$!8@^IS& zo(vl`B<1$Itnc+{z1bt$48}fyv}yPnQ+EVcP&?UVq4PC^#A5kBzJyr;Y99`-%;Z8a z$aa069NG{e;+hyWdH^#Ado0Oou0WB=e!t;d@%My00b>s*A7Z=CT@qG=h`8aph0h13 zBB=1wGDHS(Fe|vo$AQzz|7Q)j8{a0cDx2KopJZ=8Dn|hK2vAa zDi-2o`SQ50(5JUC=Jb`X+0hI)5nq=1`F;;p4!!2N&On! z9m6lF13Do>pw!-t-q6^CC+3B?lbO->Rhl8ryPwd2H15E1oz=^mcH$UWi)5NkHNtWk_fffP1EdQYHkJyIlsenh*{N z3(Lmj=(ofTU8KzFOs5jMu5-Oy9dD0!uAUcbI6$J+3VnSdE~7#R_(l)HzlvetuuqDw zbpdt)R}uOg8o518FM>~n`&h$$(xdHJC_hz|uU@Iz*pXKhb$eY$V!7C@8rO})`z%|K z%u>VV9VES|^-t0Y8Y2hZ@9A7%drBxtpn}3lyDu>pHdeBXcfBXYp_=crPCmvlP(=1c zy2^Pw`2!?AEx_iec?4NwBRs;0Ju3*<&KVo_PgnTPtlg}lc$RTS0JDNueZ^GjQ-PIZ zcvdA}Nxy?6=ZUu;uD2SPpQTJOj}xdKE^|$vOF2Z8Q(v0%h}K)vyYB^jN)2#7ORNCO zLP`RJBy-FwYY$$lTqP$>xU-3w?)|b%6lZ-?ylOb+y+x%Qk!J*sL8zOOvG+#|Z}~>l z&f>yK%6?-Qp9lonD|J6z3ukd0z{7~rZ``YaegI4GTw>+1CU?a77G4>O=jZTq`J{Ut zC9BK~BBE`;v%PNO(7d{`D4y$vaa;U4cp^jA@op@-fDlau1$+ItRs4in{Mb-dyPM;< zSi4Gl8_$5tRQho77aFmxs|PJ>Nly+WB~9jd89`bo<WAO7*RhM7* z%QZjXVX=Nt2(Lz_e^!^={`jdkR9tb*^Es9?Zi(9XVTrq?@q&r2OuW-2h95Ntn=a&v z$#2nN5c&l=4Cy_&CS^V`(G=&flMTXx6|05TweL>N^c4tx;Z0yzi;l*Xzj|M8fB%6W z<_K;keL`^77H0`b_;XuGp64nI86N}}d-FtbgbMWRpnlB=a!4|*heh*{*J62Edz-0p z&0~A_u`;*3<1{v!5fZVeeQ&eyoT%thvCD<4nrb$Z+k{`6&Wm4f%nq)^u3q&*YF^_J z%inqKeGg&Ml$%PDn}KeA$bqX=6RwVMLkZX3_<5dx#jLkj=B4{!j&^SKAykgcb;&&} z3ii?toa5B`+6Il_2m44Nl`;z_vHanO64m9uBqbR1(LQQXIeEL{4ak{E#=EQEc8ZSJ zBHeOx=F68Zb93L0*h-u8p&LXJ?zVZXSmzE(wztiU4gDHo7fyR}`iSGHn%wAUB%$*N zAhEt)+swcctW{eK!W84n#C!`Mq-53EQ}O;fYzL={H!J zM{rXqSw-)M`2Qr;i1?W1sp)>B;q>`Ke2&my$YzJX5! zxl4s}7$G8O_xD=c{ZX;G7B{mSJl^5?fVQv6R+)Y9eB>Mc`x%zW8f8;I)07p?-ICR1 z&0v!Cl1*Vdd&-nbvEfr_oq8b)?>VO%#W!pVB7^VIN^EQ=dR2>x#v2bbPj+Ue=nin zUlWt8lfhvFMP_UbBqXJ8vF18%=%uiR`-$gCShW#wm2B0-7g2Da8Gp7pbfkP~ScT#%_R!>kpz-h34jUgp7~Gc|2wPi{ zMCfySyq1&Pd`ZdJlJNgVn?IC?pB z$0u|PQANqmx*04AA<6G3W0@7~a*swtR|NEo zyEHbj@`@J?p-qMcQo`OBn{L8hu^Q5q8k!+g-HA?-_?p7stC}q>w{`1^g_!61*%ho& z#YqRFi&znNkz&}l`b)@r-z&VIlT)xyOiW&PU+M7Ad)iU$t<$7beqF{gaylc`U}(Em zy?%2n%j6Qh2vVP0vIAzqh`9eX@zVZgFPS}ZPWD`x4~k&(w=)?2QF_~3$ZEhNNqO@y z1*2}}$-eeAJ+JlYCn-$VKCYfU-n={~cngF7?LhuETW>M2Xa0^=U_6cf+{poWU6uG_ z^;c+&=+7?l4A)UOV{6HQ8?=Ex~y(K$U`xHFSbH=%8fF0 zj@Nc`oviu(7~1(xo@8!5PdBrI{Tu`5F*~pgRDQcId%?KWS;Y~j&;8r5w9WRC9B)!+ z8i=N2?@E`tV70lj5M3YZ-=v64KN-RM-YIPgFX`Qb{4g1FW-Phe#N*cx3;7Xpo!gtL z7KrLk2QB@GgZ2BT3#NHv;|+o0fS@kx7K8DRRB=-tt@JRZ8q`q68RpodcPPDgR9+u6 zNP~2(ODG#iUf(T= z?{-j{wD~nUY;jhqwb*?6!)~Qss+mT}89uLW8*P*4p~){a0HR&BoENmD3E+R0nFJNk#>y)a!A*`OOlLCt8t zaIRpWFfI*+{LcSTa$CGd5AQAGY>Z}j>_kvsjxwdAk64uT=GX2B+)nVJ9}lU+w&403!;a`$4O zo5&|++}3uJLuwv&_#=CbFYnkDP*rPcy3DoGmDJA$I&$Tnp0tV~QKSKx`i{-8!(Ut1 z*7S$tX4{8rE(*E^^BB9D*a!U_|3qO1vP*l=6l?}6@Ann|yLz5Rg^Q1!T0E;Uej+ab zXg}@9G+WCKVXE=HxK8>H3qN!7$})=2hnTSvqgPtO{>1Lr5}!00?P)U5}y1x_k(G0mdtdEvRW7uDoeYf7bly$ z?#BoWc0$Xaoy8Jf+v-`0bu!_D zmZU4cH(zF)(W@&i~}=)wy4U+qG)R4eUJji(kYoeN}Qm>N}>lj-+J0b?zzaxJsg9 z@Cb*tYz#1aGy4-=F>-RH6g#Hjmzr;c$hqk z{`RFRmf=j*hDANWe5?0%1nNv}nFTs1TO{;-&N~1feNLm&m0*83u*`-ui(_3r)HsM^#PiRo{P!S>EU-?Q(ZhlV_$v{H#*j_Romi?3O7MSx2S zwQJ4%Jis*9pQX05bpO@Tq*^=^d`=I303<*OY;#0NOoE{46FuV4ylOZi@r4X=Iu3q_ zIg?*bnctv)fkcbxuM|ARM2EC`DsRL+ry_O@?Omf{ikdSWzWc1fNXuAKt${mtu3)3`NxNu?Ew`-)+F>-`Dcfixd)jNh(B0-c*%IGG z1tLn!r^uZ^tMRMiLHX*Mo@{&UeVP-LM|+a>TluW|cvfh)o>}b{667L>*(|=4E@)oi zpR9L_;Voe#%G_83MYb08wtnz_ zEHD0C`;C#oEiUB_tHmu;6d%rl0z96|x_xY%`-)f3BQ|e?(KX>4-qy*DYJtuho{I#c z!%vMTvZND#cJ}gRJz2Gk=V2@`pB4Des>i)FtZB45S2(=wA6l-YtElmerN5_Q@L>%qrE3s@7@GBXH!PTkr+KP{#!BIrueUx#|xC@uS z$OjQ@=a(F!CT&Nw^1d|Mi(ldMo{>fzuhFKjcOZUl?BS->-^2F(?Y9RVHgdquO`{Z? z=!#Yr?9#t<)MUW?PFSr7d=HEfZRoV(aTQ5_f8G>4b(J zc5bGRSNg!sFG1T9)fDvn>|0fBBiQl5&l;k;2S|M1oZAiD^G?2sF1;?w8Ly_zCG2NI z&SRWSh4%J@-;*PurrEc_r~tG08-Zj2FEX0MPefQ#fTU&&hNhtm0e$%l_g>->#6Dv; z_gDT~3*gg7`doh3L)C;+80{~aq-=(9mlG0?2e>)M!2NxhA;)wH37$<+a-)y@o6MYk;^c2|cc(1^&Ji znZr9(6%>Q*<@Va4X7YBad8@JZtdG6#7U-nrJ;O}Lkk-B~-`V24%lycRz+IX2qnKUh zd{>VF+F2P~%>8=96j(hM8c!rT;r)8q><{z);j@euQBK;M?Xq!54OfS`*T&X79L}lP)ZjflP{xt>pQz*(teuJC%_ zWSJb;pfWae4UU3II3TGo<271&a9^M@YhQ zXqfjTEMbwZh+fnBzI$1)X$6!2e^$Z_0ExTLcg?fZQiB&5kzic!Wf^w70+2UG7hQA1y7foZNI(!y>OKvobMMKB-`Y>D zAKAC^F)irj%1t+OFp(DoPqqnAXgK2`Yl0Ck7c?j-=|#9dE7(#C~hljxCqS*JFnSQp%;hczU$*VM)9W zxQ>B*m*{Q+Y@yl0K{as@`}=~R9c{wlKpb1LlM=t}fE53bO-up0#vD^zU}8o{eefT^ zf%SzT2E3Cvq45Dg%rLjM${{*Uy@s9{+Y=h^#jKeZXbK7*0oV|he%v3<}~4h zNz%pkiHjIl)n9R)5H%aDY#YoDy!+*>nh;;JMSD0sFE^g1Z+E2Tm%|UHj|bxdR_Xea zl7ubFf0#42_Jv~>L}KhTZ9TJ?tbn(GHztpqi(Qu_rTM2%w?BKFH2!!{wQrv zboXY_hXX>_J!f-p504}^G|9HwOESM{SYyl559n5D(s^*Z<*coKr2p*bN%W4-6Nspz zpD7(3{Q24wP5E1eC-CfXMU+kFw?fHBO%K7Xpr$vge??#LpR*cXp-l&53&DXhrVY*? zS3Xb(Q~^Xg+KX9= zX%AnrBc%Q!*T2Sp!&u&~sXfD&{;zJ;He7w!maF=lgDWWBMF;b_*jCSi#s-~dlM&Pg zo*Nv`akHBo(#O$G<~XEE({|}y|HG2IsrPO?U2``hs|uuPx{c<&4zw6)z7)s>+y!EECGlg2lVZ zBItSo&<(|b^bzU~%?=N;s5)Jx>d1TULE!m_lio9$TrjWmvz-I`oA5)w)?qu!ROM#5 zXDhXrISo=DS$uC0LI(&qW=ARv5nePxvk%XASAU4}Fv|x#dGCBjvH96elcuI@SDHzH zxQ@&_(L_M&>l6iZjtkF1FRmkFXf?_)?WveT`R3C^e^+)exTz$W0CBPhT%2u#-B|19V}P0PkD}IE!$dG~ z#cwcsqIruvnkFyHJcgyn**{~aRu~we>{4yR!Y2bALGzIjC?x`>Pq)O#wLolWh~;$5 zqN9^8E+O2SzE?wL<9N5J;cnluA1_e>%nOnVZCyg`y)POG4td$7xX6jV_o(Y_z}w#9 z+K&FimBF2)gpZded1XwhcsPWz#GL6Xs~}1>gyo_XL0_9>iR2D*PHasOZ+jmH>t`Jk z!I4MtEVn-R)c8FYS_k}!DwYZYc3HJey_>r!{N2AYSbq1E6rE2XUo9wqik6(0M zmK#cWM{Cf0KVx#yCS%M*#$lJQyk9t=n-Vu0AQ75;8v7SWj(*RfHw<&(Q{@m5%?mSP1&mVNvhAd5?38o%R*uQ~ zo<)La(VpCb$d>j!nG0+tDyPg8hvY3mcmsHbqLw(T09CH$O z_puB0_CD&=7mq>p=}Q%94+f=L#M!kv_ih0R2W*$D(0dPQ!#;am8CNxayWz!WrD?Sf zzl0>yY@Ko-3Cr4tb&fg2SD99AXG?f_rvlRE zf&8{Zz0BAd`h|32c)D2WEz=8pZ-GcegNAX(+jVuABIb6lM_YWF30Na7A?_(GoCB?*&3#QB$VJGd_19#4}Cw-yJAu8QZ8f5zqyAjiUCJnS4%49+j@!hh^LGFhfKi2iCHoA6n{+ZG0|et<)0K@hn~U9%rvT#jkour~&oKk&u?(i?gMoylnC#bz47Mx6gtR zJXNEbaXN*M91CdaD*ngB6z3$CG1)&bI@8MWC3sp5Ta~5tHGy7H-tg<-vt@J8MNQ(e zhyTG0i7&UmWj0uBJ1&E+fLORU(@x&_$A)!N!AxILZjLRYD3LabiL~hY#-{d~aKwr+ z*DL{bKO-k-tRxf0^x9h5yW5`2%NJ(8b4A2QL*mJw9ANtlEB&@m-nD?LW`YVp2E^q zPcDVUeD~?+r|_9igSq^kDq+s|$)ZhAcXGW%bn+JRh+;d7sa6wbsFI~V7Fhp3z{ja2 zi{M~=14_#|-3Q@{2olHEu>eHE;;|zdKqj?%+Un!(=4rXo^<>MB@Qj#3fS@Fn!{@{* z4G+N&G)LlU*!FLjq~04_Iz)|?o@0^p)gE4951&byi;CDC4kJ{t+Eld|7^)$4{i>AO z<1_&f!%VX;8Ju0Ogpsto9?2v|`RXa&+pI08q;RLHb8>fQldS9PEIxmz9GCF>iU9PC zY3xUu>gI3*#ny-N3L%G=%T2jX&|P}dAbn4LdTwe!317v1C#29u=JftHZ+`_h=EG^% zMw{({>kyfwK)UTL6g~d*&Y_g}C9!-b zGsxOqR+E&>gyl_x#u&j-XfQRj(CamZ8i}Iq`&M($mu7Q=rBF8AfUGF%tHncfC~1%L zTDnR|Z>GX$m=vUu4fC8*_fU$dXmNb0>q`J?N?E(EH5^*qPsLvc1|!}E91dU|U2HUW z4^Qb5Nl)>Y6H9GglIVHc<+Sqidm1sPV`}o>Cxq1CoBb(KYfSL!3kmzU7jxO{$v%p2Z&qr08%*LsD*Y~pC*k6D+%t-GQ5w)#PN@^eqr zSuekMSTeY>`rVbjBP-qFv!h#b`3pZ>LqHtzv-?n2QH1wMsVY%v#5|)+;`oiIkF|aM zpTg`t%(-jc&xsN!m7*|^FHfs$|DGw($2|t%6WbP@uv;08=n6+uF#xMW?wDNSNdZ#1 zo8Uh1{pV;Ikr5I!92J;3XAX-4g`D@s%uUj=e!EndY%U|3TmTwFn@LjQsbJyuXaHRB z+Sx^ma9CWJRph&(;kfmjOTIcG@OL}%1k#Olq>^5#)m+QebrpT?Y-#-VN|R|A+*ket zJ^J-Ja{b>{BN%N$3o+4kwL||h-o2XYkW|X2GsNtsPV0E(j(LX6B?oljIYxKYg;#_8HVY9!ZpR|zXNpxZ zY`-ypRME)irhW6TxGaGdM9dCG+FOz+W}}L9XTma)CfqVfA-(_aRqGZ!5=S&OoFv05 zp4#Y=c47K=!l5qxU8LC-PfkR{TyfWYd#Tj96(J}Zd#?X_ZD+GBCe^YhM%!mQcL^0M zxGLb+%ajq6rad0dfbBOa70Z_{Pu!-dlJ1V=v>(%T6_{o0ws<%0WG$E38u#O;wxmd% zBPmW>2V}zCb(Jg#A^luNN$lY?W9tr~a%&4!gY^o6qc`-~sf#GBGn(*jy^cmdtCPvI zZ-PY$vbTJMES|4FER_MN`NZ;-stLEqu>1c$4gkeU`8}X0m9n;35*U&U^5oBbM^+@t z>HC5(pHN{x<-J3A&;A9s@l~OEi3&^(=mh;Bsf?)~sQ|e;7?CCy&!4O074af*5zY7W zJ~kfnpM>+Jj5Jz%-}0%%5h9bqy(&fw=Zdbjt#@|C+W)$8MbUEyp2nYh?8CPIS;O6s zgMJolyX(1Ildjd@{yVgEjUV#1En**aF8Q$2lC(VAj}9UrV36Lkz#AC%+}8GoZCnDN{v4vi84(rAsj%p9ezbe3w4#i*Sa7!gm$M1@ zj7#j)!#juTcQ`7>>Emhp9Q1y=;oR1>ro4vc9k3h<8xz6iify-h412Ck1*PqDoT5BN zL5X@N@tn2N|J7y)UD46yCEX5MdoF^3gG&79+Sbq^wbrE0rHmt>-$eUwD_Hd@LuojB zi*Qlco9n;x+35A0dGp?&U+m|Zi zXJP|WBLH*sq;DN-Mc>=ajMwolsVMyQ-1A>PVNWW~(eHDJMx0&_{>j~>%x&JZ=v~{91N5J}c2GX#Ryy zKCK9Bd)OuerNtnh_r|Rzgyi6EMnQEkkWF5TD^v;^i#trrsZ64)VB2xc-t|V*QXh8E z=3M+YV!8H!$KJ4f@1s^S)S%FY#PQ2MM_N1K(!i|9YMOu)17F??OGtO~x-Nv8YA{+12%OmfGbRV_p{s-$Ra9 z65&IVP4457CJ+uGi5ihL^E9-vPMKSoYP=E{j;ggzC(dJ&6Ks0uq++v7yX=N@`$Zna z0s3mHM3*EVfnueyvB@}VjDT`c>$-SZ6ZfH-4xWdvls(Q8NZ7~3qQngl6ze1IWcayX8#JrVdsd2H5!8$qT78r5?qjtIhFSiQwxXWc*HPd0h) z`X5kKRtRS@r)wvIHXh@EqPITg-|S07bL2(NNO){7ptU+$A?e;? zG+m@->gq`eYeR4BAxy!4R|$fnt(GAeQ{A)b_m&E_6&+qSB{@((o) zU8b7J&TR@$Pv9w*!D5I`2JYT}cImiz$>7-)ha()YltyF7eN)b?Fav1+vjBaIwg;?p z`Yzd(VJO3U^rHYwJd(D)+!Ew8XwD^M`R68A*)LDB0v@_}4(gq>|0u(!*?~N5nN31x z=Z-k+xdh(*{MO`Nr+>sTN*hjvf%xi?6l^oz1dc7hdzSW>5vi_woA@<~ppHPV?H1?Z zPX}#NirnjIny?4N@q#Z(>IR(moZ~j2s?kp& ztkA7(Y_Ra}4kRS%Suz)qW1e_SC|MC=vG z<6*ffO9Bn1AEGP3O`fG?WNSYE&PJ~$aeS#fA*bT#}IfJ#{)UuuRMp(#SYy%U9G%RLwYP0%1sQw(f+o6P9qh|3BFxDgC&A*r0DK%E3r2q>x9Xh1ochskw?SF-as&r^%wjATFq5_Sv9_ zgu@Vn?oScX5LXe2k>TlL9^?8iS#J-bogx#D8GONcBIa9zW*2&{&CEvPMGigyhVrrd z&^jvsH?SnqCC8@|FPX((e^iYe&UiMtyH&(A{hE#TzjI9-m=W<%Aoy83F|*Nk2grOy z6=n25Ag%>9o5@6a$UForO(tkw1499fbfIketO|t?seEBg^e33I=C4 z?xBK%X6IK0L#NBZvkFOEOJ%}27PmQbh4lU#5Ahm#B*goa;q*bh3x>BoX*u~A6QUn( z&!;f4@Cj+vZ%Uf??|!Y4S^h?UBHTKgFzGopB_(Lzf1ba(GLNZw1Mh`iPM?^fjDV1! z?WiGatY!Wlx4qbuf7!<1lm>4%9lB>`fNg#6z_)+rol|801Wa|7IU4s0CMz)g`Gd2Z z!tzAihgGXtuk0@a$4FDW?HNd)L+--o0bokj#OX`WgQwm*s)rslunc`+x8BaYj2(uk z2uzHuiG@C3RWJh_C`k&OpfjCrQ;&5&);6ouhrBNxTp#^7!>&t#jl1lbdW1J0Vf;RR z92q|;DnYifuKPr{l#6;>H^h1A&{*b}$#X8~_y5l|`f2~LT&a}OPk!;%=n&e>4B*`=ey?X&<|l2v zcO={A);)iYP38~-vEnnDAt={dK5hD2VW$bq;6#aTYm$9O5#krY-Uon*S(gm}>d|+U z8kZo~{_H71e6s6zK0N#aY7O*P%uFcpFH+{8^)ja$s|Bww_M~iB&NXfPnh0jCG}FGD zL_z@`PebDj-8kEp_u0VRu~SjHnmbjU#5{#8@vm|r~tw^ z7Ke!31rV0uxbk}N_=xCF^yqLO48WbDM;wbO=5kJq8w{)or_a zxpK^9yZTY=I75N0eiQ`I#4lL}UcR37e@(7X=(>$GNwiW3=7I=ik*7+L=@;3+6>7JiCRAyElo zr+#C?AS4|;w2)A(w`?kNKKtUoNU`;Po+U)Cfw3Dpd1#kvNIMhRCL);$o}1mp9+Ivm zK3n`C@Y$UaH+PB!%$`h@8rzWmlez3>Q7|K1uC(eSN{9pT^$ma72F?9YGR#BQfcP+ zmup)IGd)-f>#@b#MGiky@7alHt+_$0{RsdrE;ri;XW4$kPH8BoUfwPw8Q>f2-v)di z@MX+7#AMp~naL@LFhoOKEaewfXBCw0Gzr|Z{=rl#{ag)P^9rD&8CP7D;!wnce%-;O z@ErRe?I%Cl0IoLO#@2{@47>NyW+iLwvrOyNFEqmQqzW3_0zUBrQooo5PC+`5o#A);@M?vfJmT z{)!O%ltPI<;g;zTBji&in^TE8tXAR?ztgH~1PR1?vF;DdSC-$v1ly(|ZF0yRf5|5gD%>$^=00#WNBT z)?UbwAg*6AzBCKFo?~L4C1^ctkJ5y5cSl^`OCp`pa8!MX;(pH$?DK+QbE%tkMIKK1 z01&(1<;n0n{Vvo%Fds5%voFDc$6^HsQiSX4l}WntAWtia`#;k`B6KawpjZ!wmYWV# zFg+>FR<~m8fP$}-le>!jMM}rcaq+%I9IMf(k2}xK#l z>hOQM4d9KA!>?bhxALtne+Wi;Z*P<@cPpVXwUsD*7H`z=eEsF6sHptu33tLCd*sV{ zr@qQRZu{3G75AT-=JYMZr(XH;(iK(P6!9~m8({WKky;Zg81InfHPI8(i&Dd~|9xsB zBk#3`;o+Q7`2M*c*aH|Bix<#YQD`MoDB$o?M{&`fSQ0XRwT)_E%-tBVQk1EWbjj$0 z^Q2!2G&NfG_*xTz>+Y|n9EL_2#df*f+L!Deu-wn~d*j{tl_2S4OQ=XI@fW{w zD@`rFFI6SFXs+XYL!+IJ#^cvCoBUdOdZL)lX?K1bYOSwT+e!E|5lYx)!Q|K?& zKRPIYOT%NQGgr|w!v}&hRE^^m%SzrZYqiA->l=>m2+R&vnIWMVGBf^4jZP~vr*HdE zJnLfl>g-_d4YS>(>_OM))f5W`9rww5*>8SaZ`(1z)a9ah)lO&|bLDCnkAHc7A!_+c z)9VfKM!j9TqXU&3H%-597#t#7Mm;|?C+Ih5D-gX(FJyV%2F2R%Oo>EgPO8w_H06i~ z<<1a%t;6K-vO;cas#@ei|%9p%n`8<@?-TkK&2a2k`3FCBjGg)B6yWb)qg^#uk zyyoL05Z8Gz69kvLBMd5ZyhBzb*`Kp%ce}}U-SmOlO7#lJ&tG14;u5Av5MDCuH3;Jw zP;(DT4?+%(WdY2dej~e!0(x6PW44?h(ZTDQE*tQW>VK8eBvO8n(A5M6rSt{#a4GaD zN;*Wl+?zpJ_|ouIN~fvDc7yrm^Jwu9xi9+r}<&hKFoIitFgsS zfQw?jznbSwnMR33h_&-8=5q%}>xzKf8IF>;Nz9v^lB(DV;;s_fW;yu(h)}5;QKThZ zSL)?5?~F_7XX-)^R)vATQTDwnBYbV!69Ep(U`6Q%Hwjm*1}F9EV=6YpKhZi=XvRgL z?i5+0ercoST``20(xOHdA4}|4ayiQwp&Az~JnTERnvwgZqw-VZ(>AT`Zl#II$(#i0 z>{ypBwkMJi#x9Z7@sgS!u2$wW9Ujhor_;v2=r=|_PtXmdiD=Qtj+$|I%fMH8{nEzr z)Qdz$1}Gw`vJL;S`aTuWTdB_r^OKPp5Mcj%KsNZqj6;;i_16A%aFiW_xYMkB{s~4x*$;z-~UxaD0nXg06S2{Yl85aL0T<^L(`#pVt#PH^JOkw zXyOy1peU2>*u~}2@PEg^0Tiba>`O4_Q+LBbF6#q$CMJy4LP9G&0;WrCL=e1z#*Y>F zF}>rvRJ2P0X14Y5HqKk`lZgJ$Z@44U<~#RW%n*(Nl{H}%H7N8s(!jq^^SNB$#7J@( zr$etEik*6Ub=-B=gut9>S`#;e&Q1GFIlCgYyBQN#;Jz|rO+TcJMDI+TZ*6X4L9Ix1 z*5q1?SjqPl+odN9`{&igcBsa12Ykyk*0^;fJIZaVmqpt0`aHuvhl|Ywi0a(qHC8@0 zXH#T8>%tMYT98j^Zq;|f)Ed4-4q7F0NTZftUxgG+n&r70V4KA=JkFMwePDTVRY6el zWKNLy0J6A<`ro!RAU`S~)jE0Y46_1}fx8F{T+!WCs%%r*6v3-rmmp~s_E=SN_p0oi zO;>96r59HfA}>snN?VFjY>HWh+u$$^cM0lU%kpAGRd{QfIU3Eqq(Y)eP$Goci!SrbF!T4&Cv9pwN`y*PBaip zIB~B5KAkF&yem{s8289aUngU**4BeXfdejfNy!`@R3+|6Z&Rvl_QBnQR>XvDrf(}P zQg$>9;I>{!FW{hqCcZ%UhDJvq#mQFx;PEc7YCV+@TshYpqcim@QuC?0RO4f(AW;d%7G=TTt->x^KzLnWSudb8Prox>OJ0>`)|9VeR%GoF zw^F`m_AnJic7v1+4R$)c_^y`bHnzt*%qT^|rgD*u=x)+rgo%5GRhDCImK?c>a_DXl^8gJPdoXG`S4Xh9#y1wa0Koe(< zTcyC>I~F$!o)Lp~q)3U*5;8hdfz}7*h&2TW{hw=MVs7rv@0}UdXX@9~;v79CtP5gM z>uNy7u8GHf<0Y%l)Gi41sPfram-opsP7A)Oh8o_UPLaqlC{j}7&rQFmSETWx-@1>F z?1);7(3taF-guLWS;T2+nJ;+Jy;^NYs2$D}K4?XBE@#TF75eCA=6Bn@4jxVfdS6jx zYh*Wpi#5i7Nf-PHijPTs=Zo&Q&Bt8p{0`}WwEjPgO1~Iz!h9y)XQzufLg<8YtcY7T z-{j=vPE7{`g9T#e+0)|J8ue{$o{VX#;T~1^YQtoL#Lf`+!wel2L4Q}R+tGdGN9J|M z*>XBJ8NEN9MWWAs)GQwzWRB2cyI=XsEL&%Z(O%MqEej?_Q-@pOn{jSA!s3V5DhG1`5qz z^W+v;beL$8*iDTdC|?RPN#%UtC;HA<j?^2V&OpB& zdQMgKu*}TEVbLD2>MiiVI_3n;k&^f83}=dwZmmez+GL?3*ZDfHF?W?35{*SQt0Bb7i!i7OpMiJ3bLAs6_&3&+{CK$tk<6z1F+lwf5e}JYjf0!M8-kyjh<6 zRrYQ#tm;i1O%hYH{5Jx;j0s6{9_uyME?x133nNofEegqmzkT?YB*P`$xIT9=P04F~ z-|X^dgMq)nFDA_qhCuW5Ps?fm9y$Hfk8t^eKm2P)KlzD!EzX@Be00k{FVK9i(5gUZ ziZ8Ut@$ofb&G!A$)r3oh8BuO@V6ubtS<}rH=`vf}q**)eQpX)_tTSZj3QU%uq7?wC zu?r$MSyRY#^vBksY`7)8!D4xgrRNqD9S2?TF!zErFFQrEVwPNtJVa1J#SF zKZZ6ucyQjMxh=Hx*_z#4&a*YI?Yp6O;7Wyh{MwhiDHc6Rt3}zcZSKN7US0XADVwg& zA!W+FfV*8F3kkgxemQ(*ngeA|Y|0pypYmS)d;|d9>!eK{C!{^`B0sLi%9Rv38Htb_ z8woK~XY>x&GW+O)K^4SSd0-}&Dz0u{d-`}rxs-@ebx_uX%Qc+|m=UNkY=TTSuGW`SO_b_m(Wqlr*09 zuW6YF8%eustz0;Qo@HTCoe2XDc3#bC| zv#pPMH0o%rr}Un}?rLf_bl$Luq8QP}EMzuzX{)59&9r4v8eDXHfI6DAq$S}QwjnrAZe zh#>FvMKXpWWv^XxAC6yN7!(Z>pULKse*XZDZ`eppm=@jC(S;U14$=OCbKQ129M9y~ z?~F$U-B%(ZEIUe0zS|UM2*Q0 zkVWRGOIxLGSf!mdL$c)59nPIPy!lF#+D>7~^Ox|3kkO%mfoYeW-k6}-JS z1ccU^f@zlR{QNo=csfey4$r)y+m3MjQI$UCGYPTNFPLC*IjNH8wYA{!H`m}=gvg|0 zc`{V3@Yfn26J!M6Iq1Kil=A!>^wE~rA3(&nStZqqk!k8@sG%{=9ash#p{W1Si(wN_ie z;|FsLqY8|xGpx|8+KQ~5S-(xUA32txK+euN7QuM?Le_4>k>**+6w$@hU zwTHuQg)(k*`HV>O0tg{Zc!V zH1T&|k$L?wb}|2EJ4UEtyVrbDseM{9IH7mZQSe7rZQ2dXuTXxKPo6wE#;SBhB{WK5 z4u46Qkivj<4-^S#-zkQsSnlDNEPa)UJ2AdE#h}%teL1^gi^kQjDqEa=em--3=k3Gg z6~Q^K(nBk*2yziP&i6vmt!mM%Ox?inH>fQvEUbMMg=?REUC>c#({6&xy@ZltA zL%nF8sQuNBy{#y2=09jE%IfNN_ejd)uXzLrCh=st!wiSOO~D4$HvM}FYhUz$V4nfx zgKFbw(r9;p!<~4cB++BRDw)*Clj`3uGWciSYETr^RwoEdf^TWB3i@XSSJ}+2#`*|% zDF?2YeqSPCLTlwq$kwc?WuxM-KKd!`GN0`J;*sk#4j1zBt7dwWmwLfCfqpg{v^9iD zNCyy*UIfe_<6#qhC{;*bPnjo}z2>PU;*>i>s)+&_jr%Xw4${#GJGdRHu&#?e@((u> z`9P0YqYY~Gw<1MxG$`h<3H(ox8OC8{VS2+<&i7_-<8%Rs^!nG>cyHztG!ilTT}Yex zlrw&-WcxDz5tBo|VzH4%>JBujk2xhJb1}Lbb@*5=z4&j@e_GLUoX2=~oS7fmd9$|| zhV2Ezy&Tk(M-97*Vcm(JWOYYA7g)MCCe(iE(tKaROjW03@~BJEILXU9mHvI5le3ev zPgMtA2tUI6?Aam6f?Ph*&2`g0Q?|IgDq9LP%;@yKkT5>>ZS-F#KN`@D?24WcHBa)$ zz!<95Z+}*SG`H6s=;fLxNZC%g2-dKt9>rfvT(#mwEM6@sLUSI>sU4tAH-?Ou#f@@G z&W|?QA7x-TbfAKbS0dP8`=y1Bj(hp(hANk$PV?#@ezmfCbMt7M$vxRz%)Q}Ds4JU` z)qCz%zSl;x%zG6n-|Ti+c#BWZ_^&TaWzahCof3KE+m`0%nwBgtKFIBNjsd5XJlut} z+bFB_Tiy&yCdjtLRafmQ|&w6HY4S~kWVewD_-z;~RSsvx;PIksGBYB~+ACI%AeSC_T| zul8L%1v->|Zn*pfWVGgd93I7|7B6c2W}ye##v=SkDp?xh@^#ic!90yYv{7Q?S%kgb zSMw6V4MKi0hqZ5gYObKuZt|}5(r9c>w(?%KIcYG8q8(Fus&_t3NwG?TRrKqy*dg!K zq)1d;rn&i)s2%eVi~VM|^0abxU}OKIgre~)ARU!Q4Q?H!QLNO?rxwY1S%#OFGvs_Qr=sje>9!=$VseXfi35!G9B2IMdPDq_xLnIoBYsl? z0uXGwH&<}<0s*oqr;(@aP-Va6P}|GNj;a{JyYwoXCXwXoy$JE1n9ZVaCBovmqE9gP z(oe$agU+=hj4}(u!^5_EGrK$y8n$?3LyDwm^PBOJRDIE+FI|F$9P45hCd&Ni`s0ez zp29$6sXZrcRxE2*_r5S!%X_#A*3@K;jx4Zfk_x%QR)Rv|(Qeu>(mrK%DY92vF$if)7ckAkpWn%qTD;nLti+&-&|Ppu?)@ML#a#=0i)M^!faj3E;%Z zZ4HKcJ71X@bsk+5UsccDxb0hEW*=n%i+q82`))?=CkjdD7094fEikkb0(+z}j5I-< zs|?&a%32wsc}%PB*-nlbhgDEsh=u5xAZ69AIBW-d$$^=Qxx@(!7^Nwhex3J=4UCNX z7D;0XZ=>IOi3<3Sd+)|cV})$2`69dDJiovmFNks(_2i~hFUIq*8|d2+Iu)ONR zc+YTacnl}!t*)=DZjv75qtwc&J-gLJG`MDz0TDquDI)s6({HE8XF@-1cZc6cnCi79$AX$bcG5QK+t81g3JY) z(FMk(BKZl0kcu91cZp96%2of?Z{Eqo`yBA>ss#og8{hi6Ar{xJr6=aOZkDOLpCAHY z-3Y7Hfu&SkvAhPI+yYZ#nb-V?EdpQ1Cf1%yRuQPU_tfoJmdndwD5gavioyOt?F8#kfk1fNeorHO`Z9#dX@g2q8?MkSPA z?Zpd?r?eH9cqP(%sH!Q(ILD_Noj6Wd&_e}k_^==|n@ae+Ii>7E|Q491XEbhw9b!?xF+;J}lYkO*Q>; zrc#D8Z$xZ=l_dDx)z-e4D;trdgS1y)zIphuUVQS2FT()`Z*_;O`Dh)zm<_xEZYHiv z+;=v{xME_&1ydoWwz@&ti=w3VyFeFSNO7-=o$iylN0L{;a5FeLvqi8hF1&eCcSoRr zkYw8I?aADem@HymZ#%cFBfxz{K@qy8)l8;KJ}vrFC_%ug&}e_PGk{zd#jDm?xA~n_leOd0_vb#RlFG$y^{iW~ZJI_^toE#0~YUVCtFPtny*(4~>F1PYA zQhw$F6uM#F=v>go6hlx2#xd7LP}v3sh^BZiVDs1X`3!mnL^rJQ@07aSz3z(kS1OMM*^%%2_jg49oKLt~= z*Q+6dEk0l}vs<~dAsV^rfx%M;ha0*XYN)^(efTa(4@$=_~GA-dB5bVMM0gO+2=ymxqOXBV1p>*$2pHCxgr z4Wlt~r5R5*XWRn#LF0COprvbYG=1|YTVH`xfoV+EOBS1*=x4?fK|U51wGWE%8^XlY z7dj#0_l+pW6+>#FXTat#e!_BAR}phL61Z<>_oJq`C2Om zifm;G;cHiF9vDS}Ml-M9(zLS5IQLTuCoY!&_!h7cis1ca9|r?T`9h`*=Mu~}`hn3Y zxEZyvI5-G~LU`y*e@^N~D0*nf1;L3W`THQ39t~a@ZG`#;dZP$CgyO)>P&{&YcqWn< zsAyX4(u)?Ys~G9ELT?gk=LIbhn@MztNt|-CJho;ADQ)JqQWm$fouiaYgpu&FMM0Dh zC6qTFi7O`063d->c2VZUO?hH35`tbu1#RS3IHQ)ddKPM?c5zRhyLGs6@4|UHwwfs1 zwUd-RmGU$eEuiMnt3%?&O};Pn(!H(XI5K>$%sd+6qBvDf0Ph z{hpuX`E0kp=*12EG-P1uMgvbfrNkcnWVZPB2>5m#UNl8nUU_fRusqiTmY;?Lj;c5i z%y*@hly9n9$oj>+D7(c(T&5mw;2xx)J7kM26h&T=jzId&J+|cXI08WyjO=_$XsW|z z6`}mMU#ljE!)8yRrk|`~<9k!(?T7P*YiH2du6KiQ*GK#P^V;^U45FC<%M)};m^F>~ z>E09@3ZPap=q^{Nrg<1^bEtuUE|^9UFn=aX^J~OS3v0EBfWAq$%W}y zZvn00S>Wa}1$o)uisG`Bs-QODqMo_Axj}Qom6t5t9o9_ye4@o>{WhrpLx_LtJ~i0< z*3F*_bs@_(^$>kndP&K-{Z3M*r5`*zQRa%8u6d;--g4|!LVQ7QgR(*buXqB$ra;14 z!X4X>pN$op!bDqLxYIH5!U~xA(|rFnCw)PYtKkx5CY7;^Q$E4&ZfhSOo`5lj$8{yl zZf#Kv?G!fqu5r8VeP$33{PxVP2E)*mhKQi7Cx*@xjYDTc;M->Eaz0LHO{?wn<3$3C z`h8d|ef0U7taV#F0BZ6WiR12hDHv}zvc|yP22Ug3ChxVtf!6P!O$~yGe&9QTeu+QM_F z{iMgO9mS;>&2!;aN^CQEsC|`*;$hu_?=onJo#~3tdHZdfPRYX4PT$NdMFYE5G`8D9 z(TrAD87lW%s(r?)w0Fbp8}r+zhb78vJ@u)sg{QqzBEZ>W(;H1QjpD1qE#lt_P7Olu z7oTQk{)5rP$k7-FJhv-jJ`4%Q4 z1-J?r8o9TOwse*70h>(>WEGgcE0xT*a493q4fZ-+K{ly`g)8D4Zt+$aMtY|6R`6=X z&xUY2Cbhg;r8RC?{NV9uvNeHS7%scC&WB&0!zfO*MfO^2D-2#XFmK!l79R)tb*Tx5 zifF@lll>SERTze|iq~~imD?#p@A6j6b}z&QSO{eBc7#y&p}gPab2ksLSbC?|GHf^?qm6*1yq9P?hI8+RQu!x`E z>bdPbLmk+H47lD-MBp}o>ZUu|rzGehWZH#(ay_7>8jAS2Nw9Y_Ru^s&x2k~2czy2} zXDP~KG~>}k8pY+FOZ~(+vFAw3EeYe|0_W-m+-iQg<5XyYW&I`5LbJ3bMSp@fJXJ1E ziWT42q*9(j#0KnMVD(%5yOFub0&(O_$XfT}4r5n+IkXs0$U_fr*LBr#EXx|`>(6BA zYB-r0F=V7xrhY598L?+HLyO=mr|K4bNX=H#9PO_3^@CyXC(h`;pGz zvVcc!VYcp(wzFTJs0gvhlh(HdPL~ZhdDNP`x}rQa6Rv#xX;H5-$NM%m2DQ?y+^_{xJ7T1@SCW(7R z#An#W@$mBU)=m`Srkk)!es=f;eEI#4p0ZQn?n*)?!GE%GWGx)6&MJC;nNWwOEZ zip`gdnal3q{C1WKmG6vGFd>#>YgaqznK}XZ5=)iy?#|QCUn?Z;L0h^l)jU3$VxzBx z9B+7PU|d_;VdRKwOjxe-fhf?nj2d4g9$ z=Eb6GwYazqMIn{Y{ei-i?I$39GXg41+8fVnq0u9bl-gExpuYZUii zG!ARPVzHDi7i?2u|JRz8Q%p{lXWF^pFQ$_D!^rJi$)Yea_iAm>c0kKl!=|0_fSF|M zIDS{9lYUwpzPo*mGe0{!yTi!ceZ>Mr7^Q^_b#D}@eCtkUGi<7BezX$*aX;0zJ(AD*5NVG2^pb68O{%}f)c|BMK-lnq>Wdm3e<`K$3>l(Z8)?7bHs~%|!aQysR z~I}Q_hPc@>C0)T-%PWc0;TyE4=n&NDCU@$fj7`n(aI*KVOQzF$w^>snxVguLgfM<7Y1bnsd^r%1vX#*=|+nl1SiSul?=?CMlCZ9B)ES zrgcsT21`Y+Oxc(rhXNHHccopF-au^yB*4-Kk1R}F6{ScAy%8fZqRg8-^p&=@;D~nR z09*3ji!QLEZ#|uy!AFZ1w)MV548G1ADo|JHhLyUc)(TBzE%unY)Lm|Gaj5&gkY%&ZO|+VHCl8yw1FSvkaz_{Kdr$R|+HffD+$5 zcR)q~VpPosNQA7W`>Iara72}B`Dx(Cme$|5uS)1afDu9EEC3M;1e)#RZ*6_ehcGr` zQ=rnHEPiVA?IDDe$&&BbhxK{iv1~s&GuU7>O9(|C)MEA8>ywHJvbD7h+@69< zv(=N`_;3xL2sK=9>R=O$w2nth$0)D#H>~Y>vKMXJq&Y(DkPG_UueZ-Dc2?VAU# zH@Zo%;YaG-$abAQvaWqAkW2WRFX7teFxb1&>TqRf@z(S=U-PdHi@;#7uIA~}do`4m zmGN1ltCnDgOC#cv*@U;|hcBec`M8LWct7eXaD8@YL034V@sEk+QlKFMNcoiL1jC}+ z(TgHuX&}0AI_~rldIw3N0VuC#RSy180SPEYc4)ee&3QHF=#Ty)^|& zZk6@xt^xEsa*^bU%}|LcO|2|cem4}~lYGSu8Gg%JMVrn01IceQkw2+B7)h*ooVZuZ zK2WGyEamHlDm2B~6jW5KS)hdRqw8e15nb5Tc6@&$G^P~TSYV@9)-(Wo3tV_F6@y+H zuU{L;^Nwg!S62@(s-PKGlF{sb6kw8V2Gs(N{9jq)@-qwUWFbSdpxgs&eG5f3%&J&XgiE^x#%$!}N!bI(Jfbc1xMD`nbQK^c_^fSh%|UHGi(fk6 zfCh5DT8?gxp@u8fuK0iY+l)el_dd^II(d9Kn^ob#eKI*LD0L<13Yer@&K)R^-5XHO zEGoJq^Rq@YG+`NU-+o(P9Ix*Gid^U^4CDgPr>TFn13++E4C3tFMClRDZfa`k z-DWAm5TknHkU>rXHROV<=U0t1Kqn|o+@Az7V;`|hg-Cm~q z6WY~0=8ugiDtS0#d5x?fFRC=Vnogw8~; zBdd31g)Gb7_pbuKjlN=^7`XrP7Hav0=>C*F<{_HBDbU$}eQ~g455(ti?G&yCqZ zy>BNVPgZ+^_T|Oj{)D#=hfK;G0{JZcbin!gGL3_e@*96W>i+?2HTV}P2r}tBo|Is^ z&&HxGozw3@Y-(THs)}Pr&XO(3>m?1<=5<~jmRjVyF)PLU%|!cwEJNE*hlm|;i$HJJ z=Cvh0yx9gWfqO_yTgmT6uL8{LT`5*!`?iQ5g&uIUThpTaK~nn3`RtA44(&bLqYR^W zI30((A{fGQqGV+`<>R+Y9B9=Y`flxiYsb3XyUMQcApLHzR6cON&7fWFdZUec)KLg} z^ex!A=bz()POitk3BaLW*^C0Oznj6$Dh%eeW2-9VhLiKzA~*-L@PTg1xI}&?{2qTJ z>8+X9N3a>x?5K924De;W?zRgG33cPhyW;a$H;UbHD54dIt0>K>%I&r=sx9kZHMUP% ziWs{d+n3Imw6a~H37tseIqL9X@?AxNCtuJ;i(2$EPy3mE?7qprNRTG%bznQAdf3}< zp)>lTh28O}*iR+{k(`oRZF1fs<3s{HiM(u;8U!d=C6Y9}gI{^~qqIf!dlm8ww{o%u zWnD4Ms~cF2X?DvURJgqNG``5UmBcp#(BF-tM@J3L%-7qJh$eKTHt1jn?2xWW&w}>TE z;VmV?3yn7() zhQC;S%nDr)kR>gOUvZi1lSbjO$;o@G2y8MLEwPQ zW16tkQ`+3o{ikl(Y*zTy0@OCW(1H3F+0jf~7Tc{T2fh)r=$n{Rp%Gt+1QJL?0GikL zZu^qwqC0&f1n?o(-0DTA_$}V7oDy}Br~)Qxf3&J0;2{@uZUT{G2zI-fGbeW6B>Lm7 zL4x}0MZm|phs`KrUxrHWSzmwZna@!yTV}HIiD9HRzsPC_7PPx`nuP^=s`}M|lULC? zfFLIYlHc)k@Wx!VFp^G8{9YgX`BtYY7IGAb_fN;s&1Tx~dy-^z~uC-5x!DiHN$?oH*TuHx|hh-3rdR;sJwGP0N; zP1m;vG8^EmQQBRRNlDDg$T#j&;>+9T)uIXLYFo@=&KS+;Q!3u z>pON3u6L{R$`m!4+u!Na?V!h^x!fs86zR*~2{A-?((n_f=T;n+)Z~C=%ddR}DbASAM zfA9ss1XN^6+kE84M*C{-dxL^JJHQdYwA-e5{ol)IWUgP#xW;~Oto9;^L-wdB!|s8y z;A&Z4f)ogkYrkE{ah|FX<)%`tV|bV_K-j2ZzjN(3A}_6X;OPjdR!#|`(lrX)lK?Su#rFajW4gusbX)a{fc+6x>$ zB+r5l^PCE6N*o!S%HHD{jzbRs?NZcC7^L>d{hxIQe*RxMyoPxOPnQlckZ2Hn zmFD>4T#bp#`uB7*X$~|9fFMx-`Nyj&bfOdQTk)N4f(4AL+v&K=rHOSH%VXQF*7Raua(1WH9}9l!)4050SC~ig%W~ zNuHOt(aDtXCeB$31gum*o$6^HKFu!zzED!?Jm7GFIVrGDFbhKG41%POUvX|wio+Vr zJ=!1w%Idw42;O({k3J{rumc~}wg$LH^cymUBX^X2Dd(xFUh5#n=+2UsG--bfQu*X) z-zun}-Db<$>hwOs2Bh!go)wqj-uXsvGV>KACQ)Ckj^1*=@Uz%5PE=3FwSH!nhpNg? z{Xx^S@S2|3LuC{gE$j7R z_vVu)EjK`xfrUkx+`o*pRL0L&fxi!L#{%AI>$Pa$xk|}OV>$bqzX)2v>X}kYrNs8Y z9h+#0?r5LAFW2S`U2k1*a5fMIp;b=<8w__^7f8!WZmD*C(-KL%x%7{kU<}>f_uWO(r7FbkO0b0*6JniydIZfX8{FxTx zmSA;9PnZ~c4A*N1oGw|c)+A442@*Cjsjc}myF=-f|fN!JJ1OKl@Q z&kk(~l$xHA(bw7D{Mz-oVTIXffbcqc+Wr8@H@$nEjtywI+y8Ko{8Ri9&Tn`j{ev1; zNd2|B@WB;O>3`M*C>o0gqumxDBS!SSaMqNQ_Gxd(XJCVCHCzJ1c%j=4e4w32N}Q|> zL@kpKX^V75+b3iJtr)XG<%7Qm7DBo3ia%{e1<2(TL3}&pxwZbXm< z!lIGMPZ@;BwVRYTu%l)^Skj7ivaND+%@k#(qn+DL54Abj0qZsq5T(79>Tef%j5`q| zDU#?;(;OF9cldz!-w<+)QS!06gmUS8!q05m`Xr9=W(A18*>`l$Frs69h_NqpW>}S6 z9d?f|rDEuyiO-L0s+gO@@{n%5FLngWJtj36TM>$rbkHcnD%xCar0iQldB}}P}2lfk*Se5Je%wLQmHzI`L z2{Cnrka!rF6pN{s_Lt%&^^hoAIhK#4&|k}CJsxS5n`0-pU6zU?4oUX-z`6|X*>;rW zQDd$;#(p5?I-^~@{jj`y?67J~SJAEmUn5a;pc1NWMN_B_a<|Tb_-)U&+SC;g0yA^p z&&mZlgN3Crg@vU#CCk&$22>rIDqQI1N4yu#mXcvDH~_sbn#Fos7XSd2NtcfDu5$ko z3?&OKNQBe2?An7Mi7vAI+A7{$%47ryIo=Hq*?c9B+#xOHBXW*c4PtF1WBcs*s%4Q3ld3L~`u1o=F)oF~vaC zl$u~T3 N2?W^tdHE9G!^iOOrVwaOjb5n-n`-7lUSV$GNaC3_L%Wu|&d^V@7FfOF zM70vtW>rqlKb-HMpo$op$_k;lasM#V*I}VXLYo zS7}23(Lb^WH`Jmf1(A~e$B*9t;w*4!{@hRG70d%NA}~B1e)bzIhiQ72!b|tR zmj@&v+&aQYGkTF%V&ZRVPMovbj!}yT2zskUbE180zy`L@G7VYcEaXZ0(JCSZ-a^7^ z#K(;m-gh`b=w_tHj}BUIh^}%$yf`En!!xXJO3heSk-G(6&$#uVZ<%)9OS4^387?sq zM6}KU3~cRB$)uq;0}}-@)l~Fx~Q`AYEmuw?E_n_ zbZ>y#8q`5LL8c1=Q7mE*0hcK1s4Et6Yplzxoang8Sj@dpV6GKaOGtlVB0Rr}7jcaL z)1-YsG3cZSfYxW;b+RwD3zm0zD zc8^&MYm_2z&x@^rg!MjUzzF{X9XT>#XOL~093xNK7h}7M>ocwVWi zy8iT}TTSn>yGqPr;*mnxlt;U-sAK?_(2utTOF2!eDL$jQ`jR!Mt#oG;Yy)$Ura}kg zJcqpoiLJMItK)^JD-{1ac+?*MkxnoIsM(dW5M%>9v!}Ein_$Sywo8*00Pz=d`Pa2H zNgpe)v+y80q!>QA3emlPAZ2r{f-@kPriPSH=OI&Yi zzWvK<{O$7KmVa%_q5s@SbKmm6k3LQZ;y|__j0x=CsqdBi?Kw2Z>8Q!&nzfrrE_r66 z$I|tG2mIi|5^d1fzaNV+)Tsx*9i$zkb}DA6paceOg|Z>1<3TZpF;IUaTQd zsfoh8EDUrOsvxYOE4I#ajiwM-uwQq5%>gqvZ12wRdI?#G9HTMOY>(coz5gw}do1OfQAL3#Mll)i&)^1{y|5@|G$2ue)zxZ59I#$D?TXwKbugG zI{D+@qXI^y#lU&z#MON9@2j@_`y=W9@pz8I|B^dw|6r(pZw92&GIe@Nm8t8UjrdFd z*UvQn|AHBL0{CJG@hFA3(IgWq;J|$MKD)zaZ93lWe4>%L@mt%d{;kT@Ag#Q+KmaC- z4^UB&{$SpR2Tscu2Ry1Xhd-SEeF$tif+r+ye%W&=9s#_SNjCsfI|LQMZlgnB|G0dm zB=#mB=Q+rGFT6T7W@{Q8rW2OpQyjm(|Q0xFJfD^%2-Hc2~U=uWr}QS>@gsB64JlP}B= zC;W$c@B@b@nP4eL>+5e{9XxwQ=7>t?v_JWw_-wCcbjM?kiT%1Fi&ShX7Dfr&@?E+% zk;G(4Q*-4~YQp;Bi$*qCxf@49LUm50pOjv|qHzVd(VUV0EMxFnZ%{u5-}-G=t>1o= zc=68yyuW<~R$!7|-gFjR{~R*twWKNAO4FC&uX`XJf15R?=(E7Sx9l_r_>N%w_OFUP zZH+U5OVHE*(K6I$)rtMsG4($W23t@6*z4|pzV5qt{lD`5&+q@ArOxC3KCAn`Pnp~0 z3ViSyoF|{r^iBTQbosxR&^Vkk>X2RuvyA2By=ztD@?1%Bw^yVV4*bt;UN@h$Gj+LFU2jnh*ZsTW z#x)wRv!H5q3eaA$LetXo6FX}2QqPiGPRnoeF><(EcgvjyWid?MO>N{67-h>H3O}i?UhbWHHR)Z0E?9CXkERwy?ZvEWH+esAslvewjl#7m|1&CY3kgh1e|q!2S0^Iww>8 zxu4O$cqIPs0Q&Lds|jFT>Z{eB*5R!u&M`QL;W+d* z!=U#J?oFl=J?`Nvb1(xjf;fRO4y3@=goi=LOgiZop!!wbxn2Le2WSlQ@9ULB^Yb`; zbmP*y?$I!5FQQs$k<_ftr47khBrF=@9)MsFDuEW+IQ} z^pHxF5cF<7JkapjPAg^#JV>f}=lKGlX ziFs|;ivGr?*xY7*0d%+8!0WN8P&k27aaFp_sKFXN_Yv#!Xsu-`cli1Kv)zTy0{XFO zl8d}!9NAw#N=y0$rknL%B8)d^pUJYH@i55ED>FILG9@{;dGKc2hNRa!hN1bl9x%UU zn|$Z5XQOfq=zT^Sr#y2w^DZjpfBC9Z$J>$j_5A*s(?hFcl|V44U9@vFCvuugdQtjH zRg}xSu#0VMtzp0D`X4R8`7PAKPR;HpZF&n(5f8N-g#NCww=TLe3lcK!3kJ1cvkj_I zwY_;pNm=kq6+2m3U_3iq_SF923bS4(AV439Y-r??L^w;a@i~nUML&hg(bB+b#8@aa zS6o(5Yl_G^o_Be4bIW(vJg4COb*R*=di0;sQyX8(=;@C7RvI$0=P|%xdq{&?j$tjN z)OlHpDf>v|tJuf1=Dusm@JGbTQaLx%dc7kZD@l#p7GUUX|Cp%vTUQpTQw81mrum7& zjJhQovP)1<4zlp;gtWqp_O&YWE?mPURX^MMrE$>q3prSbMDQ%4s#3mk@3rB~%21U< z;X6P61133_n~gw^SC8PUt3q>Lb|$A70yV+Fv~L0iiGxHi@?o=^=>AnS)@>KVF%##% zK_MgEXbMa5O%g%+_07273Pk;QRRwGIaA7Rb!%u+=tQ)S~I=RB;1%1*D^Pleu;rCv>ottsW$SSZD*<5q2oCS;D z@`vP3no=5&IiVPmhk@fT*wdpJ9dutAh~frvY62d0)~OLfxU<3i72&2@!R8wgkMJAD zZGUCWeZd(J<7?)>=-eVc4c@(zVz?0#7bOTpkN$r(l;LMpXKY_nN~-@-78b028Q^y2 zYCBlC+UvX@+}^pT({kbQP4WHEw|z>XQS5eqoRCCjIHN*2T4X>C_zinE5?QPxbaj)o zM0+e}7-``z0-~hzT-)1Bvl*TArQr%iyPx8J)0nnY_6fItXnLpgv z!uxs;lbyF`5h#EBx8hLmO;?Ql*)Y@Vl@roYted8WQEKIb75n?Cp_j+t81j(Y9}pC` zM?j=)Z&x4Ca4n^v$JG;)3cQ;od>)x@buk7Ki6%1_i`PSUEug;Qhkn2q&-RXo*R(`|fI=8Zpr9PJ+{zWaxxh zM15P1GrEBV2dpS=D@hD_QFyz@dUS7=A7c`GM*oYB1?$7Y-)lv4n|{&0V)_}v8#C$Z zf!SRAlZaO>a~(E6HFf6HnOn5r+Ti10N3su+{9}uxgyZBVDojF20%~%;qZtbfEbNRI zhFN9)`gmDH*)Q9C6P>RuO0-aqf)xT4x-sj$ZX3cR_}m+OUtQPEMi(^0eO{eVJOftQ8>z5m-M`PzcI6@HEGRw`T$90Z8o}4VQLdioNLErx6A@ z%gG@ys#B{HfVu(3Csn~L517Be`V{XQ=Y#-2xNjMh(9NmW0<2)%D-Pl*4yYfQUHx`s z0%YjKc#6!`*X}U7qr<~skVJBRwPkvw%pVoY)|QYby7F7J3A6~CJ7yl)6fmVM)40$o zFFA&+9`QU?aB_FJY{lPx|0HO^FVKLV-IiU;!9V9h57X2vWNFu$&g(5@pP-TB08kCZ z5tW0)0WI^kzZNP@9L&}?m4jg=m)KzIo!t7bAk7b)B^Kv~|BN_PTy%pmS z5H$eSg$qAbFdGa=U;o1!eUvoFAh#5y2dzbDXek`qw`GeNh&n*+ZbKSs0aIQ?i-)?` z@D33bRQ&tF_fgoM*agphP(~ZZmL4mU)n2_zio0=2 zexm3cL6g)cF7-#t2uG`*F7%Sx1#LSa03WYi`@L8+a%#rUR-ktiS&tOf^+v-p=Z5Al zZPcANdfu{o@e{|uqHKa=rm&qb*P6nYcHi^%w|I>`9KqvZc}`B zzddLz@>JMne?j--K%9k_C2}dHcw^Wx;pp+ym3ake0mVCdM2_^Kll?tDQO-54<4vM< zqWBPH4)Le7$|mCGVmej|)717l4*+

}JZlQ1^ivQxKyNxrFLk!!FCF#kvkYICvGI31Uyb zwq}l{Mmq91{ZbQx~=tL-BVSJ%h1+KlF3s$IC%g_6ZJ9pXayu zROc<3qnxfBGc?eF)F5g-L-7y3*p6>~ndL))^=(*3;CnhZ`6C?+kW+OT35ic=<}L&6 zXXfc4g=1|CaoyTC^g`}?gjjJvB8HTe)`Ec=5G{$7v3jHNfpcJ*ue!2%o&3ZOj?-09A}F6KH$XT2vE2|Q zmAcFhHkN)q_3haCig9T3ahaz+{jd>SUB~m+p({YGVvK`s040C)Q8Q_^D^4=Vx%_c` zXyE1;{75?ORek|E_ZuV+pG#}>l#9<#umwkg1SX)3Sq_3e1{UCK zn66mv5PSZF;k|D|45B#J z%?-d7M4!HU0;0Vn0CS(HCu&7#MuPso5q+AIHP1@LRbp(bY0twPjFXM*+2-ElpuTNb zfw8#jiYyU~HYM5$@FEMNE4N^zrvTnJrwnN1Z$jI>AJ<1AH4QcItzmO_2Xk6Oua0G| z%MhJo1pcN6TP;jn0`C3?$qT@XXf|(UJ6s3UHXQWu@ScF;u6{jn=WW-vXe$p-JN*zX z0oZJlN{gM24=v8XdptJv(9-4-|D28{&*2(uWa6L_noUM;TE>KtMpc zh|~~}8amiu6al45uhM%9Jt_jyn-E%p(jh>k1_olD2@4xrf%UZfvA>^KW&Mu$* z*`ISyVPm^0|KKnE5Bwo}NX7Phubfi=IIGlpQ;-#P^0VTN0MVC=(rdgN-w(U^Ga}1k z1$jxfo46tV&@vSPC`S~jIGLM0pGMEdjkM+TW)@9xOxG(GEV~eSV)%1AO;pgCcrkqg zll>tITYJnMb420EwSL!05!Z%1urrWS_N=_yenhU@Z5|XNvVNwf)Tp#M&Tp>Crxlr* zxJ|E;%+Kxbv-4?mV&0@(s4Bcv(_TB1bgY5Lm7ox5VRg|J|6#g)?FsOBv(jm{7KyK2dliEKqOHz)ci#q10}!ZE zD^E#yT2|VJ3Fmmu^h0I>t5TjoE?j6G2pgIycG~2upSW9-W1_^%@qNC3YXR&4ypPJ!{+sqDg@B1``o$&b@#9s?ll^V04PC|G(kmE@ zjwGBk7nOSAiXbm4U7|uKxZ9?~lyytwVt!|eSDNp*O^0HxS3=vO@>FFP+c$BN2&?eR zxMDNwKqWSe#@WXB1_&T6DH7hJ@%@5fA0rF4|#)hq~{kkR*c< z%XBYq6wWe1S(duDX71|#mh#kG?(S^1mjTP|cj&e{y_)=8HTOMMqC>0&KU;13u|ytD z1a`r7aRN1FcPA6LgeXlkXy6a6((EANyfbfph&Q^)A@efex;e)2N|D(K|4Tm=Zt$G9 zn?~$UC48<2!h_{Hz36l>8+X)fP?*=d-uG5Bl=Z!p*ykhbZuO6z)^b@4mzJ7NJTT=t zNpa3gY*?eKc-s)?_c)O zC7tx<03#r+X>G|J^4vPKckf=+qd?3;YOtQTF=snQzC20siZU2VG?8&vRcYH0t*Tnu zgNrHtix-L7V8p?XbR+bJ#Iy}I+A1S%pnHIjD4ts8Bfc7d(jW2lXzX_39#08lpq?I_ zWPC87VI}Yyc%OiUn`Cj(x}_B{N=sa>Mt;>tmVgXfd|IzTVz&y8L>J%UW*d;0T_-cj zI8!9b^7|p|)0;t>e0oX1fgD~W^|)AUovRW1lcns>_K8@$6q#iNRSMDL=8#Vr)uV^0dLD^7dkx4npLonlhU?Uzy-C zmLE1pR$uK{EE<|!(@dY`kP1P9SFi}c_VQ@u&;Cx=GszHQ%(P~@w_PU##qY^19gWT z-0O#mX|Z}@ZDhfF&tH5?#{hw25WDSz8RAcEN*#B^dn~PGna1(`8=T;$Er3Ja0Ha$P zSl?fkG|SY`RLzzuOD&SB_&5>0cmzAnw{a`epi;dC?LjBAh%dA1^Yc33EOU+9 z|4~-rFR2OkZ*aeA)_A{>scJa`Fk-={X}UaXt%3*$n{K3xo}Ln6Kb|#Dy=BOn)-Kp& zzq`6k;K)f_lOvpqH+X&cg7Hc6%2$Ugd%Rm;Z8mT?Qq$%EEIKeFIQsxX(EvdKwFIq@ z3^1dW23aUy&!BOzC#M%?e^u5s7-@`A)QB`e=uR$rrO`1@c^i( zL3f56*t4|sfjsq~VQUAt{G|KV~d=o@#FGdVq&?*vE z6O3D}9!3up|3-gsI^lYlR9aOOrJu`?VsYrMCEwkc|Y}{*mXLy({Betz}vqXKw;==HztYD*0kI1zk|)cD3L#B zDLW*Oa(i-m@F6`N<%|c*$%?g}U6BvBOHC_00ovx=rNdR>%Ea~Wla=5a$cvs_r)vz`eWZ4p$jqPl{Y=8dP5J) zvv{Cxm#%M(u9}o02DLtjG3tHA(mim$6YL_W2n@ky|7>MfHY5|woK%;!#gcf(>jcSL zrPI+8>Nx@`tgqjyBy&2eJ8$H%n(?}ir@mC6h+z|=XpeOJdn8qkRJIj*jQ>X^qSND>JLXdP92c z0$ZB|*d-UYnO2vq(yf#~zwv=4zUzP5xw5{i1gaAQt9TMDc2F`DJ4_FKbA9;B1*oio z5sxc#b48bho>p?D=cTC~==p)6Q_9AdjmL|g z%I6*%*xpy;3|Kvmm*H9(dwxo%a3NgU ze!O`*o%7+SjdDCmiqc80d~^yg+Nzn$I7!^2ohyav4s$#`6=-9%9HAxi)CndAY10T! z0MAdyDdc4jte4NxegKi_zYfd^+RR7pE!a@m-!hif6B(N86h%oh5*6AF?bL&iEPi}V zUT}n@t+N@cpIiBgm_ZulSepITHDGn=C3gTRH&A4&MS>Wy==hGa2zZiPoKlWeJbAeT zp0@FcwUk#-!r1Ir3Q|5Ei-**R?pK?X3cDvv9n`9Evp!iO;l8Bz?rU|JQ*t4PL?+L% zecygfl6x5^NicIq*;xip3`#ysLvDL$WO*&hcKQbWvnRIrzOnfr-jVt^|9(B$G{4580`yd@_1!Ttn< z@7;db_Qmvx$+K&ruI5{sWXDvc5)qcl436E0?)+Im9Q2D0N>;&ypDo#@Bj$6pcsM&3 z;$4gyPPXW-MqoA&b|EH|sU?=uk#fw{qT5rU6RP}{7(qSoHlKK;$E23Do zn-4ROcR6Mzuu$ch%5{ZPJTaLiS&a8D?RChO9sj9-B8x}0=@dWES6~)#%}YqqmJ3V! zoGkqJ9H#G6;C9c9R2voH230QkJbTAdk|JEH!rXP)hOcH3KWtJ92f>%*f(#;{PC)P z9-p^kIb?lZT)$H803_Xyfrs+qvQC?@1_&0 zn;r2Fc?svu8mT9A1UyWBVxuvH za0{9fA_IGo_8Xr6|L~l@s!~#1EOD&MBrETe#r_9-hk-$fJp5eWW;z`x9(-VI{~TR- z45k!el3ENTAbIfOZr~D^C($Anz}XH3pdhaAb&vU4QoTNAKeE*IwxX(jWh|Wba|2q< zH5yFxEIp!zX6^>=Kj9ayEI?Uw9Apl@A<(luPS@2 zX-nzpFC>+lfn8)z!E045DZB=ORI?)sVm%PwAL1r= z%9sk|n3b)02A~ZoF^ZGa1^YjauuJn&^9#@Muhk9koPTc_=IE{cT#jnqe>^isRCrr> z07=H-;#}PF>w3K6mx?s-(`bi*H6mwHTUMP!K3A078zTI#CM+#9)HvLp$ zRJQR`v5$G!o;k$g2`oU=?|hZsLl+_s4&d#dZu>bwYCm*nRSgT6DW+?ec(1e|X6zA*n)OYdtW-!2mit-n=QDE((Cx6z{@8f&BlM0ts=m|9;J% z-|7F`fAjzM_stQB%>TY*lm2=(e*3jj0wWyJ_nWKwj{*qU@Q&bLX!Ly{@msUVT!m=g_Vmei%t1$5)WW)lL>s3qt__e;vPYaO8U4lsMpD2f|xvw(1p8#_09?WPSy; z^^gh|IJuHgm)?0_p))?AhUW*Wo+iEtkc$H+$hD?Ye%?-N;+!}u&*BV(hSwTdcF{i0;NZdOjqzY8ysO1MZ!+pz$Hmc|JTYJ` z{0(dEPlc_sE00^XF4Lh(ilzVTnmO0MPa)-)pPl)*B>-(FN&wmLaxlIADS&R@wG?qw z1K%u)qeZ?lt5}+p#8$HUTkg{er>>_W;KG5|cftO&0`^R*+J9&43Xr-QW{5gt55TzM zQCjJQWTjl2i$6W*;sJR`pC1|B)en5d^1_Cwdw_sJp)3S><#b=Tu{P;mq)6Kn$pNhZ z=rDhN_wxbt!B(+G-sK58H;p{%E4_ee(+Tdk146^CU-=C1E-Q~gT2QP%RG%`6ZW7Jv zX87<7Uy!Tlr;$gtpWRx*IVLPfLf_oMtv-@Sd7BH+rPqTqO zgtiM~d)eMTCq!?Ap8maN17P>>YTGF|oHX(BzdM1v~b-*xmHkT?qpWOQz zcKh^U>^V^ISij7l1p25fT0`0%8pQ}{1UwK@RP4%*!i~g#l``+9PNwygGq8kU`3w;q zM^|l*phiga#h0`Jr4jT7w4Bb+uIvXv$|iNeD~#){O3R(ww~t=?0lCxsIbp&gRn$uz6YUN7DJRkbr&rU$Kc=0lF3U0j(;_>ETN93dsF~1s5M49w_x~SC_A;k{k?J!l%Yru z6w1j;{$syq4ox8(_uJieTBnc+MKws|Zr@})*OsaEyA45*s(SE;Dx79g4WWt8U2f$4 zZt20D=z`y`{p4T`Jx-SLzqs>^hamd%!tX^!QjqvUIsI9a_Sms~hmxbT0dl|{n6OCQ zMaAlx?av3%Q)Fl%d|+$U!70APs>Jhh7raw%J_Nk)vrHOY5OF zdF4V)JxO6^n+17{JLRQ+MJPRyLH65Wnupo*&XWD*7F8=_?o_w*?ZQ=;^8bjK%A?ss zXx?>yNzxKwssqizZfQ}YQjLzD8|2b^sa3Tkd@1TMXX!@?A158YYTHuijwqTJ?kZY` zJn&twg0M~JO2UO)$(bi|=Cv2Oc{%WiVffa=>L9IKpa_@(fRja$$30@UUP4#x@cR$& zn9uq5C|dTw>!4aB)fC&9&u>R$GkR`471`dB0-)`U`TzmWbv9hFc#T3<2%2*<&#`{t zpSnZN4%Y3>?+c>S@+uIf5wqGyKZZ}z**bqRNNrMkjw8pl^@^n2vMZ5e}BG)ajO?OqGe7WTK z!GERYi1SVcfo)B$9GQ`}IvE%#Qc#P}^Jky&m<4^JgK8N}@UFPH&9CfaQof)X!!OL8 zlY@%g;gyd>rv`G2RB+e}Uy6Y@aCMua^;z@{#0rb!5|^wpr_uS=mE#xiiVIVJuCA zwFyE)3*H|%O-?al`&WJ&UC&gX_GuZjbf#0QUy9$I#_HNsR^F;VvRPb%&#|p2&OO$% zmnNQP^FFP4dmbnzS+7ujJnC5%3&I~+tP{c>Kekl7Y~H+d928U#NPs)KELWO&5!&!X zJVeCWBU1tseTS4{gFT1t%83>Mjno(&^>e#42K@;U)_D58B$4b}ujg8I0&RGB(o<)c z^x;y?Wlphb!Ut>2wt2>PqErv^ZeVH&fy{XnX!9C-C;MRTsSp_TOy73)#j2wY=w^+Q5e^`Eu*L zgTGAEv4pa3-UKbjnYMXoh=6d8Txz6MP}eI@FY=NC0<pc+#tsy3KAQqnjNa=2>lQJW(xSeq1Q*UT!PZrL z*RaH}L@?{>b8BkU?E>9CT~YlqVYyp3nSzz)e+=_rLUf31mZ04_E?HB`_ca~}P-Mv^ zwnnRFAS>qM+Aoy&v;WergLLC#URz$)bY03cZEK=_?3J3%@#S8R2}eLt*zKB&;Ym6I zZC-LX{e^%PtH#iz%7T{VT#i3bHe0)0=xXke2&y|J{R$go|6^R|7 zOPw|+9)OgJ&KUAG%AZ|l=jN)%JfFz&?9Gv?sQRjV<;oT5M@1Htt=kB8+|f}*0t1AG z-5`ypA%rf@?5(+MR9f7Ef0-|jh_nk54=MynO}qj4xE@2Y({!0oP_wMtPbT^CV+v77 zf8YAR^1i9*t2XabzIgXUMTho0n9Sk-W2KL_qS(yXI%yGZl8!SIP)1N4Aw$A60F;c0 z*Om{7=;L$9wxwcOU2%mzk3Os%>3^Tb|0?W)`I~AP`;uyYKF#;lZN=2C?Ve|ii~k7- zFktarAgglFWn_NZ{+lti2sT^!Hh>frIxN5jGu82^TchT6Fhm*Rg^~$Yl!NtqYM;q=a!f{EDc}OAr7%!eV@W){YRugSF_&;0sEI zse}dctho)LvNHEr&>l}<=3Hq0ZJI=pi8%dgxuz<5I$Uh zKK9OB80^y41Ar&w6&hB#81ndWq;VkD|OiuPR?K`e?OmdlA z+!FzM<~>TFKK@eEu^Y+{5J-z-QZ`=Xs59Q6dg1P-8{(GTfKC!%b|;~K*gS{05ly=? zq*(n=k2c+wa|5NgK|cSYqhZ>&5vC!Af1UsL5rF5A2Z-~N7CbFZ`%yP5`C5;TFEF}h zdRc*j2)b^$y;Zb(mv4^`9*+C9A9RA!_Q7=o%ad^uv*uWj)kDTBQ(nft(zNxsvrE+h zCGrLx<%a$cL(M^;T)fn1(?I=_*Sqfrczqw?-~XY12i@hy zerTb9zKa++yV3l&7QmL+<4z_)dSn_80F=-|BDicjlTi>FYgc|DuL4wnyCFNTmKw3C zJqbx~@Ugv8V#8eo%2lR1Fzr!LqBpJ6)x3d#3Nm-`C9$);9-pY<^8pF&7s?}!1}lJ7 z!VaJRyv$Dlqtm{BV3L!F2X(z`jRr`iR@eheH9OnK7&H(`0ib5Id-@F?i5Jd;zVdC@U34fS&Vlx))A3N)wzsPkA}lK0zA&s#eo$ zc=msW;*CO1SSM(LqE_Xlysa~he$DtMt6Gu!I%Gv3Q}AKq{_JX- zj9b02S#k;L0uS+o*<@u2N-h9dlaZ&RtENxx(mk<)rGrfL`~7HUC zU^e-!gNgt!Y&tbafcqAi698q0$t+l=Vy=L=;(M_Jm|*eI4?QAe#q<7@PbbSP(!PeWne*qP!tWFaz-r1yGQGcLkNN!VM=hv9Z&qW9bmDTfuzhoei zciWgIl~~oSfG61*IHW@Zt^Kk0!9E^BGvzxJKYx11yW*#azGF6wD>Fg2cj(}YeyOJ- z4}X8$mJi#tv_?JubOa{x9EDB@VFwQ$%yKa)6}ttQXyVxK!O6ghZ2B}uUUHJpNZB;M zDeLAn^UOB{ih8J_?yYLWRB@i~jfUCrT=F{)(LqPA1`k>m=evQ-xOSo!3MO3#f29AKYY-2S z4ZOL;k^@4~=7X^j1Y19(Q4T^jS3yq(TD&EeE$|_oZ&CF+46-Q1PUP-cx6dB( zrs?#lJXtDywXzjVGA`wv*C`;Ed~+WJ^KXE%Mbx81Z&K6`7qI{_r&DSA$W<#4xXthE zr-K{Z(->WXLTAACMxm)dHMYSXNu*Y$mhVt^6Mu`WGW7sw0}!a=CdoqK4=twX1o&K_Fw`mbA!fqAsaMoL`pH;}6lFCbeRboDdKg>@E)Lfn@} z#rX^h;|fxfOr&nr(e%;8*q2~dj)|+?SRb531 zddXf=qA%~q6Move{0iijUniPjKWBd$?P;2J0&Ma;9Fqt77`qTHrvd8P#)xE%^OrxK zI#qcBWfGRQzh*nNd+vjp#H=UcON=_ z+`)1C7k$Rx;fBV$82;y*XdKv}jrFjb3BYpj^_x|@azWe|UyC{cQoxS46gKMv-4Lb_ z$wsEM_jr}rKl%kAnI>)aUIS+DH-#4gfp>10@2CG?<~`;mLUML)9x}5upZ=A+3fnjI z&pkE$Q|tMPOFyHUOW{SnynYv18}0>sf!*LgYXwC%vT-)&Ce*?qlAQU9&slcql-SNVy?KFR3S|=IB2jK`wvi&_4`jB!~FGsc3kuQ^5a7q;;;QZ z^1p7Y=*EvbeY{T`_;$xv>z2h&mTsB54}A(BLtsmDH>{7s@mOqV8^)npL4UjUB+xL!d79N+Qr`Vp-kPawS@DzhDj%B zW-c|6@S`MAsTlas-HW{znxAu)L7l%m+u<)?^r59~evFy9=dEW$l+sE#W=QnehX7$my$V-! z@X(fqTDewZBgNuav9_jG98-tQ*tm; zPtlG)M#&_8(@i&B@GGOF(3Y&PZq=Mq)2vq6cZV&~fI-Sm)})PKN1$`nSost`LOc3} zGjz({ncT9k5ysiTfYl3{$KSdU)EprqimMTE*8)~ z`1X8{?%^bj!!uFpbuZ8QFmP0$)Lc32?j7Oq{KNOazgLs3z+XAwU1BBgsMM2VP(hdw za5gg1Jg?uEg1TV!Ieu_8Gxx+clZfT*s0v>OMXmAtiZf$%iqw4SD|rEh0W4ME?%)>HWd zUFTM4Y?L^y0H#7u&DJhE<2T-8vJw)0X`-zE4ClL4_UIrc73sK(cn_P0wr}&7uAE}u@rZ1i*~p{J z?Pr!VW?o+_c2o#5++4*DFkICIOESHKKReEU8&knMC$}R^uMWw`oT&<&%s8prPX0sMzdWJk&7I&8c`bAoYqyM7MybaPQ;jTS14@#D(6mO^d&SZG6n5My=USYH%nvDQ(=6*$W%*lqRNcV?S~Z;Zz( zxXk1z_y@4vb~Hb?)l-TlX6#RruMFD|}A;|8Z4m#?j=bYQz z63Ut!oh0q#o-ePkFc@6;v^`Q)O()1GY2Vu!f85T7vbV^0Bj|o-OwVhbd$;^jZZ|)1 z+8%WVcYBbZ)MF7O1mM?s?|A5wn zy-cNKQtst!)!RG@bE`ubwBuci_kOvf;3s8W)5|)u!!L2BA58HcvrjYaVP+$gzpf4csp6BoTlk7 zK(dBl1`3W*CJ6H+wMrQIaVE-0Nu+kHrUm<2bqU8g-?K}y&23~~tLN~{Xs|_G^VQFL z77>HXU+jJHmUnUKRNH82hlXxt>r3vqHh2df%d6g6IkSh!efVAWksHEhUDo$uuEwT0 zHspfEDwb!09@Vpl9S|Lif)IQHzxmNixs@t#GG8~A^iAE@ba?eT%WS6Mf+<9fg07r- zxNphjFCp^OIz38$w)8f{fBz4E2(+asfj1l6{KtxEX!_Y=Al+oQeXU~g$EL7!=X!1o z3_HQ#2aa3mKv25)rue;>Rt#}?-eim_wB}Bn+1tXd3kff29)=y9MK4dsB5dxv+Z+}& z@~0f+9{5_dVHwp0So_Qk36D=#%$9|Pgv|uG;ByS35Zfj2dWDenUEGq|l$iwYM_qkD zyF%_Zmt3S2R=wIWGB^_{VHa8l)+qHQlj_WkWynU>A~%W>w`T8a6>z1C&!(ZP$JdP8 z;E}@f{he9v_T49*C`RoY8<*4?n6X8M+lTkMTdPdUDK;YT4(Wu78t6y9=RPtxGaqGu zfoy}s=8DGQDDwh==G-|gZm*CoO>Th&&| zqYQ>+-hpn6S!+=lf+_^(KImS;nrrhRXY*rqhsn1IDa;umaA|BD#HJ%zC zbFpuTLI6>px`E}&8~+OTs;=^tvqQrdS;V8zRxORf+Co^{>qY5-N~q6Y(Y2kSNY;du zbzwr^UO9Nqk&g)iUlKFq4KG9Jdoch`^cIX8OLYYUU4Yd&p4+F1WK(;U&!faBcJpNvL5K!xL-D{m zD{HSwx9p=FNt@|2mxQDX_amVqvv3Q*Pw`3RXh@^%9_168j4yk0gasmX@uNC_8w8s0 zZA5-7q9J(UlX0<_;~km3yY7WMFHC8@*e2|v(TO{9lctFF^xM-@GFge2J=b5GF?$eU z1|bl>y(|qtN|!Kesg7i>?6|dXeRf%12)?PUSR(?O)4QiVFULZv5o0ZdU^j63*O^;u z1@cq`PC>|@dHZ+1U5)Z2iwP+#G#Aybp#){{yJ#dVyQgvE5f&sbC-SQrS{`_8@l|Ab z>(UtmnpZ831#ty)MD(Xcbt9-jd<6+#cwu+~bSy;q;)X4V#HOF?161mj+0-?OJTQKL zY23;aQLDvbNXdg1#eGCaFG?eai7J|4?G+X!oof&(6`6%L15Bt0zWp15S4+ulf)i8b zf7i(0L}Ms?ZPogXi{lIH%~9K?>sn5#$7!50EClh}S;LP!*54Xiq(7#S<>dmj#^P~= ztUqXw?_dIVs(1JoBuEdNK@v#TZJVWX7zHY?qW=uFtIHEM6!(gz6cQvZo^TK2<`Yje z$-mQ}yCy=po&<2@Ddys-ulBI`PXMX_*x{1?_u6fZKMihcKDBL&IiutW8$i8d=5Sl9 zIzgkQsvLI?)0n>%Kf9~l;P^o{yT&)$Q=THr_^u!>#F#!mQGY>|S$!UiMQ!=`I0DS- zG9RLqv9-&jk3VfuFc;`KH={W)g#tJu-^QzOgk7ynF}E*?yyahKADcfC& ziinTDN?NzU4}wEl6_BN#tfS{EA<$w;uDsJjL>^%a>sX>Mdui<=EN%5b+z`}1h^xs{ zp*%p~UBy!QqA8!b(434j>8ed(YUSwLzv)>b!?|^iu$lnYNE1aZv*u9TiQo6!OLfi} zU)Hm28BqvAezUnkPCrZ2eiH_V?u=^r=|j+{cVjFMsVDui!M6_|B#|{+EiKGcJ3ABY zwTvL&pw1vZb_x>D@f-FjEd(BtUd6hAe;wkiS?+Osv6RWDLvuZ5?-0Co5<+G ztQ9j>uHH{+*~JUZX*m`JUS^JB z1I$tTlAsPLt0iHJ=JZVn zts$U;FBWI@-Ciw45squQGSy*J4)?Os?YvXI;~4_PU%mIypuKTZS9lldNPdgMg>A`{ zFF6u?lZ)1OpvqaN&ouwVDg*L(ODtBH&>#{+nHX}rU}muL=&cQwcq+CFt z_1HD7 zjH@Af!m{xGRHJEN#SDuvpu#fM$q(TMXd!mz=C20TN?H0rGxK;3%JoneT@LNT*q^> z-x$*o)g0?aaKp^=4E+0 zR#TEJButcw7pDbNOR5{TUUQs`p*MUOLBmW_^z&8o_7@v#DuwnGdU7M+q@S-2T;Yzj zw+cSm517$0QQNM;%mn9#Y=xl3`q*G7 zJA~b;V50p$pa$-L`t(SQ9BE&2Zhwhjt}a|ldcCX=Tdqq~^os5>--x}kS?L^gS9M#4 z?E4SzR3re-&B12xA}v0?P+4%#dP~U7G}dip3Ng#(bhNZpo>Z$OCAbe)<0&E8*1Xm> zD%u^0Ef@D3ZWNdcafywcw>z_KttXKa%sf)A4)QL&edaAYc zdy*pYlT8N4U^+@-=2HTb`{#>d58lPIeop=1b!%6=KPZ&?-^v9{519`Fv=qT~TOy#L z3^99+ zfUeS69s;kN{E_nk6)U|PhBSws9bxjQwTKXPyAm|&VRmF_SXd+$H{>nN$F6lT&!$f5 zn~ICWhmnZ+(M6@J`bg0hovEw>sm8y@9;OGuVaelDjF-&%2jPs8kgX@Y>QGV?qIz|{ zm-y&&`&L?tF$OW*TlRKke(6v<`~7 zFW9F#Fx#`!?j=%qKHed2k0TOi-NHjtC<(MFkXF#ub15;i0aC`RPT7A4x%jH7yE^^n zPsk2cr*ovUt&jK!jr{B7vMcVJ2b?6q-*aLC>o8q{CCCyX`@p%usZL028s^#TZBg^pZ)h&G({*NYV$%3-mIs} z>$fX2T~+4i`dbSi_#1$`gMTM|_#@ehGay{oO@ILGxm88$hZM$k!@hwUa6raCul_2j zP#T(&nQC43Pf!f{jWktXlxO^#Ue}3H(GwQ&@|yKs#0S`%1pr8PCAc~@_~X_s8;PqD zwKTm~0F1snAt`Ko6S%MA^%EeafMWU1&T9}EfcU*9h;SRvM>zNb0wpTW)yUJS{qPxK z$e}dm+M7Y5NR9tu1d6;n$Nw274GmG_`=iBD+K$IOHprQGH z$95xM)&ARmr2aYpYa#ZhWyG z`eGN&y9y%wfRM}!AAu#>_wLC5EB^ogs~PE6KS0B*Tkc%;TV)MUw{Me+e&^gVsqqX) zukIlhBloE_alVn){sbK1v=7o&w5Iwz01nn-HdzWS0sKm-9dw*2ez8o+M)egMwQ`BOEpI5AoA+6OK<%Bq%CaJRdH;`e)QQZQ`~9)yzLHZxN(u#v_4b4|cOaRWv(c zkI(pEuuRAm-y^?VM%B7H8gl4mNT&V9t>NG77#^TB%WJ>*xkzR-f!i~}L@|5}isu_a z(U(krSKj!R|KYFh)%WkuI|NdW*-l_)?FS~v-$MhHUz+rxa{EoN-`6w!v5im8skz*~ zwzc(SVl1#Qwj~C)YHP{ZigXVek$*hK@(&Ou|Mq13-G4?5kJ%1JzV{|XSjo*#f)SUu zI=B?@3pr(9;A=ipViHN(5^86Us|lMsXY8YETNG$({HQ>m>e>i+ta+%dwLVuy1_F@k z&Y+0&mAsu0wqmUTPi}#j%GK~GDZ=`p`0;BizaZ){w>{}8k4y$`$WEm^48!pK8G3*H!FR_m z(vI5K&M&^W`&vSp;>5z>R_MS_|ND)|TJCM{O;mbfP9ZFKC+@i9I}r#7{n1bWBQvNJ z^fHT?)4R^paY`?i9Jr|*^ZDKD2ZNN(O^BP3aJYx1Bq>v+exp z=;&NL`huFh(4LxEt`Z7rB^2o?H`$??p<=g#&pv3j6>ns(XBiZV7j8*bl;&Q?vQH5f z;~l2-s#{RH;1sqwr-*|0qVR?J;2J3_p=Gu6s(XCU_(-Q>1A^Ol#-dEqB~g&&sa;s_ zz(jcB8W^M zEUQA0SLNiiCbrs(+U?>0*dVluI<_<-^XBL4ac@j)_?y(bwqE(hu9{qo7x7qGl3cCu zwOdImWNs;hC4NZ_w-M>5Bm~P(e5Ay_n$urt+Q5%bYz=KCb`;lbHi-%v4YDbT*P!>u zqf5uzcgfk$HE=X0F!-hzE7Ui;TbOzZj$vwL`(!+}y(U(22gCSdnxd-eS-9O(oo9Rk ztV3xvl1bJ2i=Bhvb`t`g(f!XBgSccoCg-BXhF_kTaOGZ_CJHjfIU0Gcw-blm$;^8>lBJ3-!Z&8T*%)%Yq)0A%I>IH?!d1yc7>sA zviXo*8`d)@XH4I(p5R0djBH;1mVBMrQO)gJ&-SO#3H?~Gh~L0sZgt0hEt|66<{nyI z!oR3LpJ^D@AQ)?X2``1K#H!NF>c*9EYCQ2t1%I6(KVW@SZ_C?#nLSwoTJaU5#BnM&MYJ;Q#nWLKS%zm5Li@B?uarQ z=^h@eqWqD>>~EOnVH+GNJjxiTay}rp!olj`v#W*n`k1NS`_5MDGgC@EAzauYuj{r{ z-tC9_g>0?x`|1nhg-qJQziGv6ryrJbH_vp_)E5s=g;dL>&@#$crMJ@!z7H|)%d=87Q#|Pv%|T;=@ImB&4vTnTMSTV#*S(E zYaIP|zPv?lazn#1j6c0;i95EXpxm{#_v4FoY%o_nott44E<8e@#Y$+dyK2IzZF#h4 zh!Gpebf?53fNwrQN> z{;1`NKIGf(sI0{W+(z8LRdRlbueGba{S`i(Pa){M_Lh7K?t+wxGS%baNzJ|r!>y@c zV4uec$i)u$;Wm>^CU+*g zF1&4HGu3|d{q>nnDq`dvs{`Av>KDI=IJ|3*c3bc*09SBHSgG9@o`0^;L;FSAt&8yz z#7$j~xC-3~4>$+PRKMM6WyuVpK%&E^$*&Pilol=hrP-N zCPFd%Lm49oVDnXGj!|)+9Pyv~nw;@^?Hj~kGn@6RVch~v1?whjf%RL0j4>`(GTo0r zz;#aFakuw)0n4H5mioE|KD%BIyewFMIOAqer4Ge1HhP8nnLj$*P*VCL&e{Dw0)=7L zq`#+9$+4KGMU`;R{L7x-*C`?dBKHC$y;dx_QVdx!1XRx6K8fxMFk>%^ah58);$s>a^U> zP%c0T#QW`YF`tuEFam#{3@}?)X3XD4D}C`ds)HeZx@V<%RAKF-hOrbE6!g>3Rnj3u zHdc_MP~3VkIlO`M-ZW0PLGGwi0X+KfO5$n1fu$;dK(RI+<34x5EV#5aap!~0B&+o8 zW9|rF`kqBb5ZJ@a%=}{HwZ^Fuw-^8+XrVbBVsWVlWX}GXvS(KlI_AM{EkoOep`-}n zqO!HODE?Kc%2sr^3@td2@(m9@>sd@P8Y58ntZ~bxRlYybv>!olOjP=BZ%~wZkBdWN zhJUKkrp))JyeHppv0iYxg=sPlF*uZdekNMsG% z(Oup#^*F*Kkpwf`X0Vn1o9UQ52riP+Z^Z*u(pxixGqKJaP)qSxw|x&L-I3icTVvWT z?l&D{y48y4ovaiPOs+~16m8z&M6OlF@u@6qRX(QIoGGr2o!+PE7 zTd6U2P?ME3nu(0mPQXN!Bo3AQje=&o-2!G{1ukF$Aovx@v1~j}scn4hUVugP2HEWW0p>BQjV!Su{BVqCTXX&Vw#P0ZHr}|GH_FkQ|4-LQQYg2)6Xy%e$aBVButVtxY=;#+XQR}&_!`^&3{LAh6- zj_%D!I9l@wmw}lD3aUoOsOzl$YWp8K!T0X##^qLPRmiQ~0@@%~1VLkTp{G(fq83Hs zdj~1#M)>R{95mba!c_ohR#}{*!vm#Esl3FYG5Sjz$g0jL5Jq0$-B=!i2Ot;? zj+He|FhSsHMSitOj^i6cWPk@7OIHqhzXNtoHZ36xUT?fm&QIlf6HW|=L%j=A908&N zk>%xpMwUzK?$fE=a`}#1ON@7{JOOybQZ9067CnGg#HiEMG`|zG>SKg+0g?o{1^(l} z9mwq$$pLohC7Oc4wc6u|%J z1qUsQEVaHYFQlwnnknF&x!^F4tBVNHv3vNc=K3|r8qo1id=%y#pMmUAw*VmGytEsF zD?fT^=}Cp=oPQeJ0f(U5Vi#m0{Z3OM#yQxdxIo>u+DOluMBo)l(2E z0AS7%L_YPqhwMGT4>7~{(^W+ozsa!!6j3o)y_f+N5ZJBLV>^AK-1(%a==1NwV3vJg z>{AOub&1SS02w5T1Cn7S`jBpP;}$XSP(xxXBrS2zc#Bl>2*WaU?>P-8gQ~(ffN@V0 zwRa5DuLe|a5~mxP{ZNi1Wd>+%;sTnNl@R+k=b=Lk4hYB6ci|-}Ss7hRiRsek$0H&sU z#&mgiVe@gouoyuJWDuORg=!Vowh2vz62YcDPv+uv^scKVI68|u?VMQ7!IA{S_BIT{ zI*cJ_>FtX~98-pyQ?Ypgh{LSA;aQ>~HMhSq@*IdlAj2yoC_cfFkB1xr=)QymftwIT zs>laU2G7LjuL4Gj`>V&{+rSrZE`ci#0(%<(7mP{ zUh%elQ`$IZ3*?*wC%By_jAb%ysB`jIN~cVs|K3bDKFJ3j zC|{VctnG}Mgv_jJfkr$tD?z(X?o%c3Gl6NH0<^-^#H0z|8hJqsKn9L4&vd*p)L>JK z2p@3N0feg)flkve21-4z*}DKi)5{YTAoFhFIdlNYUXFi*8luLa{1z{y(0#GZty-v# zEs?Y;6%;J6HF);aage*Vn06{F1l0@6OZZNO@&ug=e~#%qf;tZB1~)-%0S*+L%0Var z0zn`WgE2#mq}e(5RJyT@I=;y8t*NrdI3w@nmil#urUDj=3L&|K8bHY|w~gz%w+`mk z$q#`ax~WDQV_eQK#u@xf)NM~pOpJnxYEAb}#2*KdjRYaX}dEN7t_>0rPUC zfhvulk_t(^SDH}N2wREYuH0oWpYKz=INyofovnlT(m{4t={?#2)YkYPJoAguMId;f zfX5%HSO%q2qiV8%9_Gn9ue31RDS}o z!O8LbmgVxYaD5U76dRpbWb(TSpOTG@ z1?8S>O_%OpehdOUh2P%$`cfPzQGLG5q#VX9wTnIpg4DmSF5i=%9Z4B;UF4%o*4dd0bs{5ezY= z@`Tssdw5ym+^XIjjATyIx>h4G4Pm_zeI5pD+S1EKf+B|+ux%Uf59{*8K{}#JV-w-+PD58LeXxu6vzgqwlwFTC?pZgh0tkTTs+! z4A>7y=N`=AJ(!b6P=OE*Syh+P3w%Y{o$eG5p?<#GAfE?40ZQ;FfxIy!RL}|->+OEn znfvKlw8MdHPU0{JSOEoofxNZhtoL4KXUIy2LN#T2mFuTL4f*>UwGtk7ovFeOs4d*9 z<_NvEhwf|_{+(*0A5=b>gqZc5KD)W2X5Ar%U95*nDeuJSMS)`d@JA0F?9D;R<85yR zx{t@X?zDmEIX8rAy?zTF3XD}khf%JtepJ#}U3YtPvq>oY7d2HE4k%?T@M;RXjX_1@ z2mOu*g1~RT-6v!+4jZOnth@_^LFwtg1@I&gzoA|NPgepo-50(w+oVGH&1wn_so#1T`wZFE0o1HnC>qo*%;p zD0f^rgC~6ifj%0?Jx9p4aa;6Vs~?gCZ&aj%;&Z4Xa(OoHiSt6U29yYfgcJBrG9aGV zPLW`8lkn}c{~6(_#WNe#61{oGmyeqshjNoUJFe75pcoJy%AOAlES;eCi{H-&Itjqg zq+Ir70}APK z%ID3ue~qL>8Kjwf0Yf?CiEVlQz`nKdSaOhSJ&Lw&DXNpt3-Udy>#@!ooN&EbwhUZ9s+YBt`n_T zm&D|MJ-r6J68%s}al;%prz3Wo(zV~%GGp_b$rt(J#;V#PRQ9oA)a-7t)T!T9E#Tfo zPLL>^|G_ZCS}M4*qk#zO*W_LpO&?`nxVsW5l#>!9@JL zYwifUYo6d;*F21vYiiQ9e~slnc-f9{)YTwlZZnE=sJKpM&ou-&!9|a4(p&T3C82+E zLFG=M__-bMvG}58_Y0?ov!GB}Lu!ouY>gu*@eOBY)o@lkWnP`u)dhe3uePDrpK4m? zmawjA28e?2+=U3=Z!J5&NYzXQ?e4r#0XS5Q2uR{GC|&6RwSBA?1aDs{c?t?Ql=w-+ zK3R|JJf31g03bq{4Rr)@?o#nlRGu8IV7@+q$83;>s<&_FP;YgNGjc!n{o{(S@t=2( zDPQ}p{I}DeaM^1X=!Pm9IsYh zUOEL6<&$#>Jm&=O9y@Dv^o7x%FK&G}y?vrKjOHWb&lg@aQ$)c=JEMhKyH|C{N-?X7 zbrHRTae77FL`-vqAJzgq^1hy%Y%k%lHjfM?xUEGn^C+B@RdfUmze4#7235nM`JDZx%dB+S*x1he>pelQ)3+WS3uR_vV=uO8UcRGUBy8O^iybP}mkFj9NU+{(u5w#Z08D1qDzE)b1V1jliZ%MKdySl_jSrovWhc)z)kQ0z z*m4{AC2SdYfR)aNrSmMb|AIkSlrFv0ZB$~r7JG(x%-m4-DE=O5 zcMxAVZ?V-jMDtX`)aGE`CZ>O;(C|Cw0_D0pk$Cx7m)K*IFRj^`nSY~4H?zQ87Hnqm z<0@0=O))Fa*5=V@`ZRhWTVXB6p&@gg-f)dDrSb|so+)&A%qGvy_giri0uQzy>dVB? zuB}&2=2{HV=Wv_L*IFKW+Hr=ujaG6x%98s9YD}d$EG0ws1 zdny_g2F{l_H4;!eeX+`H5j`FgHfwWMe=CpYTWsMF0t1*2k+q$vh6JA4y0V3V;Wl0M zuo=5_Xyo7S`=*{g*)heT9m*J8evQYty}2*e$iL%Yun#h{BGJ(WyTr>YgQ&WwQfpnq zYcSXuQ#`V&aNC(17A5(XLc7S{-#;+%fxtM6e8;ko8ZO9sd$XpiKjOQeW>NJE*R=(! zru0UzxL5i4(_Yyr7ZfCNn=9Qy$;$5fS8CWa*3={~U-WI^9k0*7T)a}KgixxJw_?y?9S%#;1()^jVJe6wEy`Op1Fy|To0mq zR$gq>2maBIS^Vv7gRjmjJ$?G(`N1k_UveB>(TB8YZy|)CBW`3?>FKL@sAs9+(k#Wh z)s*niv~sNeHQ25=STB{yyLmYOkrymd6IEeMp^R&F^UZkOrmPofak&o?lrQQCXmm&P z5T)#9s~8gy$XH~p2%J03K}mA-?hUvS?~6dsXK9OK_XVjyI`+O;rC29}aH#PbV@Iq9 zF=J~dnr83Y#u*_2VO0E;2)ul7)90{)2fN5K_?12EMp+`i!9l08%bq)tL==;2#TbV&_ZoNbUGVa__UITz5MDkZxS0){$c;c}y%1~5 zdcmT6bx%8VLMCx*Lx7M2L>tJ&J-8C`rPcZ*?}{-qT=%K7`#SNAyp-lhwV0KMt>=0p zC2gW~C>`EOG$=Nv~O!r9#r#!Y+4XR24vh>QL8=?LoWi;Vov&&tgRuHdHAIy%ndBiOLo zYK4L>kwtrDsyXWg#CF0`_kff`!b+V~Q1x|00LVPuYXA6tNxAVRJex(uux0K@iS#+`ZN)m>}k^O;!o6tJF)(9^W&3Rsn~3e^|Cs_49OZJ1Q`p zy*m?obe{P=c6nIr6pK;w}JCmN*fV#&E$pm^!G;}+l~!o?qqc3bamvP==&TdP~nMn zw$!MeOt`sw?h`#&ZEBIlAUjMtUERfKB_UQOt1I2R&MRTtozB|{u?<_cIHV4S3p-Lr zpSRg#z1QA~vBD(R)9|{;`o?EB9nKD`!j9Yn$ zqCPRYKCLboDY2=}U~0+u9-E>+^J*ySajsJ+!i z**IYiIJece)WAH3#2;nc2fABv0U`|LV(Tbp7i@y?UMIG>3Q6)5aF}o!@I>e*S`XK% zm*?uf=l2}T*q*EdNYT!MU5Y*;&`G_svnw&fIofr()I%3vIDiU3Y5C<=VY_tTrlx6EJ zm@l*$+wRhzr}({$oYngMUONo*G9j&XvN?3|hK_Wv?uc;u%?UUFLtbe(6p!&dW#a>; zdA5&L|3SGoN1pTd&OL3=G8g5Qy z%nV=S=e@e`h@E)^eESn?{4DTvx%ijYV1Vp;P}x2Aw3AK?-R}xa`-QHf(e3k};xl4# z9q`bdT?x+*m#eDI?3a~NL`yO5xrC;=Xd@(pbMOBJd)`GOP{iFop6x19zR&B%T9&GK zB%=SE7tT}n(3+h!vn{FR@Lb#MyaK#$;Qij{WH4*jbN~68x!Dgx(mi$rMv=E{7meKd zcFcKAG3THU*FhgLp+5Y)cyV)rMKp$aXmzk^Zg5#d0(y$q!=z_yldrLR>Y)a}#8=u) z+Jf&X@`ThlJBN95LYb*|)*6-ABF^kb!pFE*s(AkC;%w?;4O?MfN3y_|>pOQ70K*3t zMFkk#vd;+*b}%a$U|gabb=#E3VOLh656U9>g5Z1HY3dzS-RW8G{j`o(>koW~&G2XC z4EcC&-xbH?XD!>Jiytgp++;!xKnP-a$`PG-HX_1zpI{to3g*DJUKU$-6&S`uGH=ci zJOu+Tcko|lV z(CZ|)O}%E$(Cc$1x?8sd4p+&>*eXkgWN|Y?Kd<;Eou)J#Lf4UirW`7C*5?x`1IHq$ zsf8(c{7Q)yG%UJ)1Z=qt2-D^lKe5P$hAHL@&(~AmwA2jN;Cnh_43ai4_K7dOasr=8bDkO75!)b}Rzu*WS)d$*ec_#L(@Pra zg}i>g+JW~_cVHdfsQ90wpq1&zS>Zug*Be+*GsiNkk!ZOP>wEjtSRtL=sA4>m7hs2K zxu{X{8DstF7|b^ibaALIn}$&g*~N7WRK( z4!#GGCCjTdFRzwKM@Q%KDz6`vSZrjZG3QJtJ@0HoTXwwjS3Ul+Y&Iq-RY4o_&;L4m z@P-y?_PLCCLFcyrmjqFpYwg#(qc}% zlFxN093=e<r}vy%!r{>mUbwB}lrv=4zEkZt_~jzg zfs=D(%*EHxHFj-sun-r<3{+LNhjd*v?S15sF1L??K$0H<0O6Wz<>K3vk<_{zc3s^Wz~sKKuv zCuww_{`|VH=ddqN&K_*Lru}5HVrFBhc*6%sZfu@({^*e^zs?+U%Gs>MH6|P-hqeXJaa-zv$)(;kBZKsc`csO*=?n)gx*vL z2P{JDlhd<2Myu0zG}XDd$758e`dgk(b@)Py^q`;-%<#t{9z|OI{NZtOTKT!xxr2p} zP&GDI11-YG6Vm4_1|!j0ra~rm#%EsLlJwMkZ?&?RrHSRxR8J(!PtUba zj0^$u^z>-0z5(mOkF|1gT(n-1zlIC`*MfR!x{>evKV-3S2O-)0 zPse(`Mh@h9TIe(AAU}0_rP9T7R9nKQ`r6AT&o~X)wQRmMeWSYnORwUCc!<}LPc`#% zKdr@L{1~0@TS^VP=x_-h+uDw^n+BT(VY}bQQ&w*Y6PPo~)ABUj9WV8DwkG=!A%60c z{7i}91DUNb6BMd0a>lRi)JGwEaH`2bt|t4<38g`QR=mWeqJvzQ`xY9$aRg4<_3E&z z{nJD4$aM*_LY_HgIZr<`J3G5lRV%k`J2$w3+u2I#6p5M_qNUhbuQYk+-Vn&(-Z3H@ z&CPnAC6KUE1!SyD;@%j-!C?}tqes+SaTzlY|g3P;j$Fc>UvZYlz zdtP0?ZwNGUUsS5(oRx>?TdmKxkrxzohrFOR8gv$>^F(L8PlH>Ow4Ga3jr`U!BOmyV z%^9~wayAe0U@mwXE%KT51x2d}6{9RI96upJ_3%(pnvCtb4twzw#`Op7mn5g)Vs|Nt z7vZYGrcvlJ<`q2do$3B;d6~Z<&(`g}p`nPi;9%zFrSW*v(cV6HG*DqQ>gLRf++dUp zv10a4E#lQrqJB;`kYYLb>SAM6cmikH`H2Rf+d1w1wUs000Zkat?cY9nca!yQjOBmTFz?oN&jN2a+4Rk8c{)c+2=B}-;}Kd z+anOfs=2P8#=SkuvIVUjXHIPkSpbFU*J!LWE}43u=So#pGDXV1X3Jtz1=O1&a4)#9@X0Aj=uJM-n;v9@w|&H)L(d$=xB*&0$W}@_59&2ciZXifx^u7Enb zwFaIhXDFX<(Nmt!gYZsxu~JN0U*B$h61YJt!R2+V<_oor6xW{rEh@E*NpIgA=C5-e zSSbX$=De#=b1O&J+1Sj?$Z3yk*v^=cDd?3kFtl6FtUJzIUtZrQxNe31Dgy7N8q6UZ zu7SBr7-{-ppq-r%JLuwT4q05=C0bOA7}D6+3~+!O897PC#q6GYYSam(#5u|WB-eWF zT0h?|Z1sWO0)Qt!w@0`OIoTgNWSbx5Qn;f_X;(q|SKccJ!z_O1hZh0c6u+V%Lq)jwDuU4#!DJ2Q4;@pwa@;iXjG<4`Pnl zd;o%ck;0VVgpVx(+Gep$UX*+`vI1)-ADZ9xT)O(zQL0s2z>*@ED}nSfALXe~pA0fH z7G>zJ3ZEd3d%*O#<&Fm)ob?E+1z3Dycf%W?ZH<$)~;}DW^L=53y~S7O+9&1ll+!d z!F29pq6RR|Yka&!e=h%Aonkfs4=$F9Ma^d@LU<&4)2G~xYiCHZBI6}hL!~tQ`CBn3 zk3#x~BuyE+w2Qk@*dXiySej!ujP^DZNXcpsYAt3$Yw+~e&A)tBD9L*fROFJ)(;1Eb z<{-FI$}F5D&nKEQlw?ZSv_?;f9_iJ!I{gb6JrE0V2O)}3Kp#)^50n6G*jZrQDbU5H zY@B&MHdr>^yhBvmD?>R~0iS(=YMgBUkGH*^~*b`AJ-#6d~-b-#G4NF8(xdZLPe972xfe{m2lk;yD=zDdPT{ zQgyIDh!x7<-9@o&*JtZ4ki z>RK^&dzD3rzk1*ytfC=~CPf7}JiExng`MeI#{lvR;a;b2?31{$YydL%Y3#xPU`kA6v2RgBxJ z1oDaa0x)aGY&e`NZ|4Ci)+L=UXf7Iw zH1OE1(bcj7{=_myZ&v|*7uy^FKwXNsWMBb-JzDp^>XUA*e_01Q5y& zb{TilAkQLa&cQ4m(n-f1n{3yF|_x{%AuhA+*di64_V|_b5`DU zKxU(Tw%Trcc|^%`W%OA{9`^$;8T$iv>b$1|z;dtE&$He6vKK_V8$HIA(VlvP{^Yrf z3n0&(jBWBWX}guZ-0cOii;~p9ifFiZvKP;l-HcY|7XnW7Rk|;R1E4^MU^zTmd(#p) z$(wl!9@^S4@dDhk-o`Jzi51V)`UTv4;?55#%Y!%LI}Vop4ZVeF`&J|0A#FE?nCcaE z5N-R#13SeFy5))`{oI#ax3zV#eS3N43(1&JH=dolEf$QN^m-F8`R%y>=?ll7+FfTe z3yw34b{OfxqCdalZ}T-wm(x;>jL3P>+ZLDh3)7->LF%@|AKICpGHn*uPdI;tKjAy! zCc+r9y;PBJ7i5>;Sy_jAfBwu zS~zlQ_N@3cRNZqs#d8I@*m7Z9>Q;mB18M3Y2KbAER$yMtV4Ix%tK#+a_j{)T22<)= zRc{LluEk8&zB!6;EnrwS>z3`155BP9)QKs#m0F|DcrJLA`QSB?r9t&7Q?iKyjT|=B z6#9bCT(9rQ@d9+_7=kv!R+kn0%dZ_y$z)&q8{_p+-p3x6ZWCkA6$+tyM!Vvy>riu*D>vcT zwuFZ$1L#ZWvU+&9|9i`al9GVo3g_6m?ImMy)F!z6+fuU#W{5=>f$9h5-JN=^0|v>r zp?`p`(MN}J5&nwCsMuldOuxeEOQvdnSJZPK+&+sG@*QR|&#*9d>qwkX+7Gxw zw_9ER{oqU>4w^M{3LNScgTD|5_kNGG6yn{hM=`@?JhycrsW>bq_tJXHaT96+$eR$5 zNV6fvoco08#Bi|qPUzlV9dC+NWyKIH;Xk3-Nm9387}Ny!DR63kl`#V(^M5 zU}J^-roOZoerzAUj1VuzwWIRi+XNWuGti}d$&a5L8uZ@Zi{Z9Ix1aufm$nD+p4mxc zkNe?Ure0cqfV0&0uiR&v!%ub>TOV=kxK}8%&E$2y~{9RJ~g~JP+!?}N{Ui)q_5K~G^M2Cp63knW6#pmy@Y;KTR zfKh0w&h?)ycVqJwkSg45M)40`E&H~H{P@AjORQ0G8xTa8Wf@VTXgM8olw;46BX2O+ z^NYWiJsAkh*3T%P7!k+1dOVn}C#d~klxp)(^V1H_4rzh-WDr=nq@l<**`}dW=n(^lhMZ z@`r~)h`&D6)Z543!JA_Q@a6$0Zi$GX5!ipK`-`PuI-Ss{)p7HH<F_@KaA(MHgExLI4BB;|!><2OvBrI%Ir5hDY?@zR|z?6-r z=<$O;)UBRQc__2WlfI^NmN0*)vZwmG?7)= z!hY%GRp|LudirwD1@{LHze+tF15TeD$qVmg^>HD@ed0}w)Xmn-i+Pg4`^^k$7hE>x z;6&;DPl`t&WO8M6H(Lr=10qjs8r*h%4pozhM;F@?1?4>ShviV_I08Ehixhn5$Srub zaz>=tfK3GR(8x&ZW+Fn-ZI9kS=-l~?zP^>vJKxQZQ|9aJ<`?)<6nHecA@?5wgDHxF zO`!Ha-`g;2 zEENpGQ|CI&HfOROO2ah4iv5`hsROvYE*@g1;@dwH_rHA3N|wB*Kor7bTrhuT~{XpbLXZzAW9<-tO_aQ=_g0wifzLog1ktYb{a{TzL zXNcGxV-_j$0kz`yq-CWC-i2j^huaG){Jak=&1R`-N~CW4WN(WMulc}x06y0bCh1zp zq5e+v0*EC}mCOJ=y#Y7F5ppgkxQ6Pfo`9a8bYXHX&f(5Ixa*pvhCL^V|BdNEx86G* zc5C_eJys2C$y0XMK@QixbG{%}@rCED46I`1hdIxS!!( zJ5V=tHA00vtAb0y3m@ z`~SLc@&qrqtDm5LV%~|l4P?U;P0V+YF-Hxk$%)Xme*K#8>!8is>xc8EE#*6us~{Si zcKkFrIPU*9?6FH9fZ#CQdo^6g^Xx00Pq$nPg6}s~C#K8REGPSuX~eV-Mx3O5D6orM zqy-NL)aQpTzX}VBc%yHV;kNv94!Xy|$JZR~E9V~^Tx%4c^Qk0>;fTHTK?{mjhpM>I zNUTbfOXO2Y2ogECyFwClba2qg=gC}mL;FYxJM&HqLRbXdU#q27YK~{OE|}VBB3nP0 z7x&=~eO{?QQVrxjJ{a0KZdXOtBCnkm8fmQ>i+Y4mTItHVig;A;Y)_UqB&-K^2G;V& zfxwSNmXnbthWYUBFV{y<&VrPV|{@KgUa_0 z1Wfg?Cl!XkB*!cdY(rSCG{E%%DKdGHVS`Kp>u&(feljnXDW+DyyC-rZ1G2SU<>kZW zD`CZ9Oveu<=sEAfvUzDK0Y>IBTY32+Jv}?zWvf}r9@X{w0vS2O|2b2vQCPU7i8Kuu zupBhlp{-X*NLZM~Pi+ zI%HfgwF2?rwXpF#m~Log58ik1ItRAI-XHO(l4`zgMzghS7&DmM{t;!}58mD)K4iI5 zWdf>Smw60O$)~3;an>1a>U^hQ&6I+@KAf(bz6Vu^?kg1Q>KEEV1FS1n4$T9Ssk~ZfvCXm2E>0i03rOY zaodBmIQb7i&+6huy!H0Tt2(I*6u|xIiB)`Z8jvB(OO1jgakRh$RTa795?FBl1F=mS zz3xT6>Dqx0&>qLD*4g5Bo-GHCpap#?S{d9TFj8iM@-9D8BtyFOSesa^@SmNAUwNiHGIIzDkbbUb>{1+J= zM;Ko=7O}yKKoU+zH^+L&7{Qh@`!|SJio?j#bj{PMkA5DwE%!~n%tQXqhy5SGV1FNC zP0KrKvCT(7m?D|o_nPmQT20Cw@Zse#Gslv3(XD6u;|B8YvfvrgI+9aqA$RL==10FB z&OEpES8JJ7V3Ka06(?)k?LYt>yBn=H#v47Do589ohzhETxc>2%Ahypy+>m4=--^ z|1AGgu)1;y8^TY>D{=eLfm_n1VFz^Hyhe2D>(i@(CSGyzbgbvdvto1l(B`zH0tD!k zcT%Z-^lfrxCSO3$?FLvbvI4*^grPrduVSPUHQ#na_V+{KdTXA%CE5N0Qm_AeTqR@W zH@6nYqir2t4U`ufFXoJppLCOX%Objq5R2eERLLW-&m3bK!%SZ7%g1`?=yqTE284* z70cC3R|9kIr`Ptsf+d{+NBHf3YzYkKF-A0YeF#l8wXRL?pdUGOW7yAwr47TnLE00_ z3<>V$v^sI_toZLSr~DqXeovnxPGnJOX*;62z^J{yX7e;NoFE&YnXe=GboHFg=CYv(=^Ohn&7~|F#yVC# zEME+1H)Lxr$NDBbpEFo<@jEJ8y*pogyR)sWZ%`_s>$Swa&{Q~=NSkP^#VD&4D z9z0a{Dha&BMre)t;P>jYpi|H-Id?tpEn?pWE+H}~NUqS0s(2{(<45&*^yM_P>x~GT zJMepjQYyv10kbH(Fh41YQle#wQG0BbOR1ULtF&pnbzN_iou?uy*pk?xrOXUJK}FXm z5h83^s4G$)v-NXii2Gtv^^Yn9?dtM`;~m{?4-C%M(OUhM+3E@x(rnAv4(ugTyBg@S zPQ})@SK$#sza$mH#%)`WyvF#fZ_iu$Z(&X?t+3h3epMO5B>+>`#gKfq4z|hafhS<% ztN@)#jpilYcQ)@p5X($Fb*hiV;HeI|PANCsyj4y;Io&y1W<_c=M<)!K3w57{S{4E*C;jOsF#dBcd=9tySo@RU^)5< zJ((e&*bg@9zsV8Fyu1GC!&N?m&)F(Dno}XQHP{nJV3PrP&8fhtXHSxmf+7KsJijuy z$lDN-nzZ*cTk#XvME^TlXMVRx!kCudnsw3D0#nugvChs$Pe4fMa%-V>rR@{; zJ@u@!>p|UZLo2QGjz-4D8I24KOz@bkH9u)-Y0jQq(h`nMWckMmiZV$jM1V&*v2#ma zL1g6(@RXaA*j}7G*?7Tou7bIFq!pizC!9LjzU~_Lz>$UfTcLw;QW7Z35CFiRoaO?>o1Q#4IhH06H3cG_t5QipzW}gXbn(pTPKOi#V%s zhmqUF3kaNa=%t-9ZR)@}E-bwYr%qLB;-x!$Q?8dKQ29CB+}!tx@iXN=9C72l((Wz} z{Vlw);3#{P%S`=}q}S)WYYPEA;pJl7Q?br`eaBLyvNej+fvzak`(KQRj?MyZv!Kgr z=AL?`CXz#g749$Sq^^u{QtQPeBuhuI-TNZlRF}CM%B*%-iq~RrtP20p!or}VEu49` zZi1SU(IZ2a&zVGD_0K;d7p@vk)vXN(5zHrJA#k40D3dl$$ zUMbLh_}b;?5X)vcBYE1tNOvDZ!PH9upr)K2uKn)!^e^_8+|kb}Z4LVi)D(^prVG}w z&S>>A!j~65QjZmx**`m=UFI>ainnNKDd`4DF_V_NyMak9X{|HE=PUWKghEGxXuL=i z8{AB>JhG-n^GYkExUneC-l@{o`$?X9b?@D-A_(Zv)XAIy_B(fKy0)urC;jVUcsoB5 zdQ);lwD9FOna&lrKQ#DU>w$eDECpJv)ZrRC`*c>7)-|}R5 zQoB}>ASI@|AWHUDF9MYXkU!~*d}wOLTjqMYcg-l*okCl%wQpy}@#DBH!~UtZ-G&=p ze2AWvn2qH>N>|satV}Td^-m=H&h)4ydM0J7&@scCS>#QJw;5@_%H3sv!O~I??A9Dx zo8}NbW;O*XO^LM5EwdPbzamd0j2$`^9=g;^FS2{zgo7Z==1mKBRCZeV7RB)^D=&Ul zvr4lHdG6I1x!qF>y>IqIvEK#({JPox?3o22!rduU{>Xd6`bpht%*Q(84aK41VWpiL zJ*n?9jtXwdgc^13su~qnDsIcji(1*&g{3w!(6gU7;TLOld5}Y#8Ux-eB`s|0g~Odv z9`EcrX1_sMM=%3>5{9pOC~_=l=6%;^x46sA!&OY|6AzL|^B3q<&DR%1w$>W4ft&m+ z$Rq~zv6a4?MW$i5Tz30UHtbBze;Tf|yZq!hEGZmBXATt@c#*)7crvc%CKr}omjeQU zhqmDJjRPv=)h{hmojGKOlL?g!sfm3Pek4z;oI5@2To~)$tXkzB-av@i;j`T$W4?Ie z9H#xFZqdsirH;7f71uZcJJo>5eC{bBL`~4Q%Y_d~_McCO2rEuonXo9tbEnf*qLkZX zcvouX=gZf*(^K?=XMem4a}&5ZRxoX%UuD{x&R4cNYk5(U_FlVG6E>~XnqH5TAE8)tvqu~8n)NAK?ha?_Xo>M! zW9}%>tK{mqxK!1}lZu(MoRz70msV?jR<+0SD>JRT2%d|*2KWCHo3|kF#Oz@o@9&+YoW`PFZaQK~nVrZj)zFe@oO8BrZPlK3rDkhn zLEk%NRx=PNI&vg_^0{>ZPS<5OW}P5%P0BG}fTu6>gH&On6mD-%tJ;y!jj4S)>^b)S z+_^COHSO%#fh^W_U*aTgMAD7Azs^aqXJhhS?=66ol6i8oW zzuGHxJ~TWbfm2ARTG&#nz)GjzE{9d^GU%|1%*@OTKRW&MI7b1_uh#u$kf*6XbJmMm z!L0>67e~Gn|MEAP0<-afzu-N_jJ0WemYPwsuk35`YT4BCEu6W|1iWWHZoeFrqEFNg zX&h>X9{~4-^NE>*AJuuSMyJye>SZq@mKaLS`rA+fDt+VEd3cncKHV<0Q~T%9_x0&6 zJt+gVZutZT%Km|ZQY(Cyu3Ri%^9o|?k!Fm81vX1gtBlQzbX}+7eY%kxZBCvZEqIYo zD?br$gepk%+*Iimi)DgqF7Do`tgK|^ix__+;C*WZi@whkB<*KvqkyKU%}bQ@$tf=cn}N^+SwV-bT0lSgtY_ZYI>(e zim@M&=7VEyjCww&F5b6jx;FIeZZp!7me=xER$H6w(BR+&EfN1&;di6e3e;kvqMhqs zlNmA$-GwipoKM1TYnI&#TevEys3VBzdiyR6ctbf$Ty^P?9hj^)HjMQ{E|K{g>;mI~ zTkypUN`f()c6oVRNC_OgjQH}=${{RR<6aH3$!e6@qjmg>XT z@v9T(L$ZBy%s*iYWI~Sk?6uK)M~yCi-H3&{wbU3a6S}pw5RLbc1-+@W`;6HfXcuye%`BVQjD`d6ZwCb>h;g%Pq$^E94AV-P6^obO=+;N2gv+pjVs4y$3v{H8QU& zkZX#K=r+vTN-fzq^V~jeX;TU-Bug#2$f(kGc8Bes7AmS)Pgm;QGJ`Zei=nKF4JTd; z#m`<^K{336GplEcLHS~)?n9B4l00BmJoY?vvx3S;J3<)i60%&Zcq86BJ$iK#zQr!6 z*&fT=itvQPn7 zZ_DNb-y5|JRFHxP{&DrixyW(OZ1<~3y?nX4cOp^!kJ@}`S<$RKp(4S16vrKU&W|&6 zD6`b>#1Z(Y_pum9^rCf()nfkI)^zU^%G~^qcH!*{(O^w zOI#>F#?C&Fyf_6?5i`B%%S=!9p%8cnhe3s0B@mRIKedVbiD5wB{+s5nQct9ZUSz*q zhS^2GSO;cyIH0ksqbuiw6eF2=Gqq$a-85So(%%3dq~{aUQfTTJQLB_Rrnfa+TmGy( zUn_c7l+Sv|NOrr#%(<5+go)gB2R=l0YU+e}Rm`py*t|+o{YRmTO6i)ZN@l09<3f4E zv7czc@+g2Fme`B=Uh?ykACX#(U8y}evcH$w(9C=LMXsS=7xv&)8r&w zzi-UKLdn>pfV`u59UgO^=nhh6(jd-}?J%#YDuS^U61&Q0k>t8SmrO0%KHF1lIT9S} z+x6&?M9>WI!YgmtKfT)cbIPc4zB@%K;-i}qIO-?<{U~vxq=msRATqb>^CxdRN~ei4 zYbB=h%4Xv~fz7zO-gjCW?6mBZm!KuLxmEJaMbh^h(+$K<9}T?c*G2R2_aAc|F>X45 zWTVj7hIXyepJ;l(4P`=y%a&BXQxL;HhVLkt+-&tr>`)@k_V;Bt7Jv=Gwv*S)TeKLj z5>S(6W!W0NDj)`W>3TYio(Ge$F$)pzTCIXESbMzCUy-2;bg$Pb4}h{6xB_7)t2selt`yA_y{OutLB9gwx64#%X0xD zO+ttys#cx6S-RA%JkG*4Y40x?LX(k^==Ru=lK$`4WZCjk5a3Yq-1;XlSkAKABE$Cf(w5dfyRfIM!BPYMv)W5|WgQams$= zbE?6mu<%t3FOD{E=(EbncPy)0w1jEzb&S&FODevLevrG+ysXmT<}Lh3q*;GBOgDWD|3493Bnr}x=M?I*J)6QDb#-#!$Y9WQ!jlOx;hz0 z;I&^AS1Hh~RU}|5o;vX7h^bPTFD40{swvoBs8$n__!hLFnCNj&0s0^P@K&blb2Z=! zJf^(brv{Rxd1f_}4jzB^SkjNkkluEAfQqUG`d90e)titb2=td9Vp8p9!Au#Mo>ejf zwg@F}3gXHt{R07kY(0XNW}%sP@Q+)!`S|36t~!r?rjm&wvBGBo2iMlt4v%KCS5_MT zIg0hf*S}K^f@!X#Gq_A;y#kSf7k>l+j|o)o%GV0daHJW3ym+ooEgnasu-Vk~*kw?6qSP zYa^EP)vF~J<6*y3A#GctVq2^1#AybncHZKW1+{nY-nqE!uuG0*BU+7IW|yS;ay67w z_Kb=(&Q`Baqu0~f_Xc0liyq zlwE>TMKumDsvbiIJOltdXIpf_yq^#(NR_nqih%xruQ~dtE*YkV+c(^XkALnqkPu%xAUh%%!U_fu8d{f0>Tkd{; zR`YZC0rNk1G_iXVd6OAU1neS|cV&u;7W7io0#rezR5-U;Y=~7N(_QJ5ihWLpaBJff zbr}9Ob<`RHfSX)>9(B!#=i$gqSu&m7*Eed%{UHf2hDGX4@S7zrf&SD4QTV04nr-&}Dz|yC2w94X z5Y#d8eh?&>iq`-x;U&LsY{B89S3zH^O!cvT>A&aw0)z=&kOT@YIaMWb5SMV;IdpZ% z%;?+mWdYO|tgAfS-1wc3b*KbrA2#<+#Pyu8M6?v~+`@nncNE{+z)Hh1U3!|?q`2{# zt-?#sHCbNBnKNeuG3)o7+LjqT=ur6Ej*|JN(O&Bg6i_? z3B>H|=_X&o?j1Hc-*2#0effj^f(u8s9B{^Kb)t$whIcA*>su|gjO3wy8$EZbaGllc zZ12>%O9K=_8~se=0}fs)>X(Afjd6rnSGn|fa5J-TlosNiEKRT;dA@`ejlbhPwVANB z@eI-nBqg+F@!u#U-=UO3^W`B7dZeK2>7+SCD^8t_SLt$ZT@o}+T8M(*#a`I?pP3GV*CAt zll1Jjs-xU(m)z9e=KKe+J)IDy4pdR{<;$00Gm}OB*qYXi7l|(so?RY(Cr_R{e!~6M zTu3@vB}*k{X1?#s2YFAy5>0Y}c24>DM=6Mty8pd8R1tJD$t-ejXR``1^KM@BY0D`; zNqG3b;cNn!_1L&giyzOISN-&l84sXAK(Iixq#k8TI{}xV<13IJtPYdrg!tE?Hi?wI zGML>X5re(v^YR+Dwv~-LB4O*!vu%t*rqy3Q1nlKC&&=CFx-kc|@&>s#b+NEn;~Hgrp0?4^r2Vj6V2L$q zq!7M=8SkHXl_^wl;Q{q*K!tao?UJ?o9w6%FUo=peUR{)vlVkKEH$fs4}s_=^TuKIbNUYsU8oMY#ilYE{+xNvpmIlJZ2N~q2YGJ<&VEVc z{QA1G2f-b`+h1*UJ0zT0y!X?+V^!6b9xD$Y%A{r9+G!`WwhpCK-J|Szk9Pt+!u2(F z^Y3eeRZDM{97m(seqO%y>~5s*>T_W>r%RXk)XK}tStu!y2|K-icTlZk^JmkJXH!cs`V|F}IijDTUOU;(@@)n9h=%74Oy_4n_cADzrV|5Z#! zig9FlgDxrQsd3Wi$<#OP_q(p#f@_?uULr2_nE)`i(*qhNGa9zIIWNKhlOYl={|8VF z;{m(j{=N@&&lb~lM~e^k1cpC2t_`TD$;diYhZQ@qW{?K}+EnG)!Jof`IL_McmuX|k z(Ek6m7i(P#w2eai4-8lK(bfM&1gwj80Iu}U!F=dx?Xqo6B)_DB3w5a6no4{?-2e^XpNq&7Y9m_(Ev4Wn&yr67HJ4OdcITt+bR}8O&YNJUu@Nf zKk5iQ8=yVl%u`#6W%wGbo2z+`Q9v&`BqRjXH#2?tS+!WB1@M3#BJ0R@k=5?2xpb4&n(^oU+^j}EFM;%3ky9N!SV^IfRzqaS08Xw)DO;; z(+yn&g0J9}9kAeLCRc^&y}ZDyOyg;iO?MdavYpf41m!)W^G8aD25g`Rr8tm3#qQ)S zD_`xkX8rmezG%c*?Uci2EUL-9IF+5tf2^h5S%uisetO_XzEV2dW8zW}8jYoDV>NDNXbyrq4Q~UOlQ6lfMx0c?j5nhhH zt&Nrh6MX>WkFmw;(4ayCy-w;%_0}cLh3)Z6wcn<$uGCihE|%U*nkZ5L z+o8MrvllNY_JGU`?=bMXTd&B_;*r-HyQbwtToNitH)R6Um!K1XA1|IrSVCZolPsN_ ziYs4dUh@m^@gXm-Nl;whv3bq5#Q;sA7shcVV;<_Ody=jZT!)~6;{^qQ)%Dnc%?!m& zYu5sk`|nzLFwYuUWH)|3k(9EQeVq^+o1H>EovT}HXdqO4v99#Z^xFve{F#e6oRD!- z)8l*Ra0U7U4gRti%SIN^Yib+&){e4Tdz@?seGO1~aY62%Bwy%QrmCd9bqwy5N+7)84PM+3_B4s;f5hk(+7Bn~nUn3)0L!qUo{1udTA^Sdp ztB7cKo7moJCj;`cPbAvT+3l;c@S#yK2Tr3j`C}0^^m2}qP1k>5DBiChhGTyKAVMLX zsR#r%)AQau`X&JRiCAph1qGwawU4{xx7}a7)bWl!g(< z8|g#rM~kqs{V3Ylv`d@oNXYf4AoBGG)QA8jNgBq8+N_EvhzH#3@o(B%-Y)M_mYB*1 zxK2k36+p@nOB=K836j$pz79}O7)0z(yh7}OLm@KdUx~xMY<9Ka@%a3v#H6I8)hhTW zxrCcWNCx&2qZebPUywfAtJ=ejg-^e{tqFSaw{qcPb%_Y9o-@x=O&?bbEp8y6KDUt1 zB~Yr6VP68#Rw_eXpgBNQr-3NWc+skO)Z=InP#ws-INH2>KHmaF0N z+X^F|N+7m>Tu(Mc`26qZ97;8M9hCtjL-#dgx6^@mf+lF#+mEsX5J%$F?+tN8@!Ok2 zwFn#uv^_UhfT;dnTPoTHUH_G!D=;tcoV)d!b7b5RTr!sIR9R^DYOiUlO_WtgDu$ur zuyH&83`EPm4|0A|S$D|`L)W`MjPGdtr-Y0ZCV%~~+MSk!OAb=>W)FN5xYWN`xH$}J zbJHY=djRQgCys`{3lq;SHm=g*Y>xJok^X0rFoj%OS?Vtm3c508Rqiwqx#st=-ud%~ za`yt5Bkj{gU_v^tmOotbe7uQp4jsn;)fvh(M_cxh4Ee3=XU zE#Sl|Jkm(IC_~Zn3nTZD3?4r}g>!SZe2mYVh%0>0IVPGJP`8Frlw~L2Q1C}iL+s`~ z>uX9h`heE^$?a~rDK3wj2(Kn(d5nv~W+MI621^7qMnKOEpU!p|8i2;KwJdtgV4bLCT^IoVh-dDUx6So5F!On_oB1l;-jVHJ;wx^m@;>(~TTju4yn8!{n$GEbhSp)ZIXVOk z-9v~cWWR#KFrWw7eG0#|Nbxe|`M(ne|1KGmeafo4P51Ngh3e)HT|;UD#h?bh4dzf+ zK45lrH*H(on04=n-&QLk=WAsJH;u}F`H(`IJlELRIN|IEh<&Ge@;!jO4}Y@C5wjoV zkGpm0ZK1wM4Z6Ft`{!RPUoCGfuGYMH*oHXbOFcLiJeWioBQ1`hb;3Kim4j|W+FDw8 zNt-Q}QIzCJGD+a}?aen!wAz~E5w(BgcEas5exq^1CZ(rN_2-#^+Q?Nr(I zzWav5FcUw-)iYnXn5m<^k%BJktTDvEU<(a$P5VK8HVbR@PR7)z9QDO9dbyi(%3+uC zVT#Vlb1{GjR~q#Wx+!lqrQ7mf|2$&CfsM+Pc0rF5MKrLSd(b+Z4Lv7neI4-yQ8i~f$2aNcxp%pim z?|#nfvk_gPEJ}HAL^n#6xVRwv2qT6V&yXw20<+ci(yI%_fG^>)@)+`dHhO!w%)3As zs$TI#6!`iLd^TSc z$yqThI!ihzU3p$$Olgz?uTabONoAAl zZejWAr*j9uSd!P>oD>~B)>8y;E(c&U>;*}i2LFhy8(17Xw13$oM=Bim-}ZADt2Swl zNa+qNy8~hdt$Ra8MPaPk#jrnnIkBXvh$m9Z0 z2=$>0VE96_n1SO@*n`5Tx=k@iCt+6E4GyGmQKTpHC_kV4(uj z7-my%ZKvAZqIA+)J@NcUmLrxN}P10mZLD{xD$|G^hNGGuZW_2 zl`m{vh)j&X?9sD*_3xI(T1Ga2O z`ZN7q^;WX~1kBk_a=6QE>63Pcgi_toNVJx~q}m<0d3Fb%IkX0g8kU-?C70Jvlh_eE z_4Ik55Z99*M{F%*rvw;Tf2=|FS7>yrRS2M_--d(?pV_rD{M2lsSTI|ye6^PZ=mC7SLNVYscm%s2qmaxWMYjt43&_fe?ZnF-!vIw5mv zR-HHC?ctihVqs(Nw%vV{FqGj_RXq`l_tvi{N*wpw)Ro=bF8~Y>e0%&A%Vx{%4ci~w zDSD>2Xdpd%-ps|Jd*cA`Mfmlq0xbaI-9R1;$DbgxXr<;8P>pvS<%ZB;j@V*Dk&|Q< z!r-_@XJ>e|^TEq&*D|6%`1YFnM4WI$%y+c9y15CUiIqcs-7Kp{Rvt3I>J(RSugr$0 zHXjJ!!H8>@Jx|iP|Kqthl6vG1?3wzIxQquGUPcLIF~(;c*VnMh%p#_@6m;gkKLTtY zqJs?Pvs(m*gw!t{Bs@dFNZ%v2)^nh?Ut^Pyr7tfD4A@s&n}Ew>p>A0a`lJ`CuO^nJ ztH!A-QLcHe@oAn?1AOyJ7HBpMUO$uasz&KVI1IkO*YtHePB;g?m;&d5`1_;6{xN)< ztPFy5!dBbaguSL3kh_$T(VpwQqU2xs9)E0mBB!kE&a~M9oAiB;iIxk2Qgfg$XX#rx z({1*1VvmS50UQ&I^w9}aQxB8N^JWQ|%^a)+t1reZZ^gHLd$tMdF~-2FSoK`^;C~&bPLI|PUGf6H6Hbb z6|t&j7q9u9LLz7>#2lo2K!Dip_*u|YKgDW(`fK%@)%NX^6Uaj-)a8#ZxKIfs8>xRU zDqn3o6%`f+tCT9xQ)3o&=zXG=_$=RJNzc`3@KZNEb$DoKagrJiG~4XM)ebelQmnfb zDS<<2s|sNg1#YB<442snMYTrf{FA^5G!=^-c~R~^8tw%KuIWA5acun7xa8g@iSsJR z(nHnu8o1+a_=h4$zPfEhP6}Pn|wr z(;Us<5(2Ft%oa|>gldXWY*JhJhu0JsiiH_f_;(5(qEiottLA=KVOioCZk(o z-grxN9AH6r%y*uuQSHNN9NH_O#G93Ig7!9-m`yW5w5TJmEK5uHN~LsAhKl!3ka~*i zsaGM@Zi5X99=G=cNUPG|U@+?RPGZ)NyPA*RoC@v#g29n6)ip-&F?1I`O|#9GD1 zXY{sxFZ`|>t7knsaI0O`wf#LG@0nBS*QV~?n`~I4C&XS){qUT(cz${^!^e1DYGBuR z+b?|5+bsr9(d_C_<4{k@|M}DT_=z{X&zwHcHS**m!@_)PS@V+u;2x{}k2^a(JOpYU zZ%4%G-}e*Syie1*+>m(SbN@O+-22?Z5Chn7X5?_WW0vQE!|cjfuJLQ%LKMowCuN-G zyaD|f!-dOPem!K58^ZVac+~SZevs6G~b1{_^Jfcc>30qom_71FA;dC&gr%?{gb|Xl5lnx(y$w(SHt3g$sLmbij<5fJu<>c*D8at|8A$I-|)86>}Ud z6zB2(53)DaM?cdpLrazoq9L-Ea?-vksUY9T?!HZC*}HM*ML1G)RN%LZ{<&79@74z` z^-RJ-&-8G$MI2pYBcGVqL4L&M#)jrG4UMs$8Xm>Ji?ri9lV%ofK<#om7b4{KFDlfW z2HMAkoRm0Kq+x}9`dmli<6kb29r{`p1Z>Y|Z2>1f-m@PVGCR?vQ75z$@XIU?oP3o} z4#l0uab?;$9uhYf6TVnePjncHIq?JemFUkx5hEibNvZzS)Vrt2aH1iWY&s6Jl^06p z(bs1VcD?v6G_;o*=BtR@+T~fx(-nXQ|EdfI%s!`cCDc2YT!BjwMt0G=-iNLf%}0fY zCV^nC5lbzVw$p)u%6#iB7go-PbtgBx7m&;LDn26FpPM$P<~M`u))s|JZ8Wl{h7wOL zWOKwG6n+@|n{v?1FDtvx7wj6<($RsVR}F~eBrXma)YS?7HoY6?q(#U)-8Y7B2{_q) z{%BBIUYdT$%QWbI`uDernD@VcAA;BT4L|#Ao4R;_!#DjmwsM_bcNm*|w6d{Lz52rS zn#?t=E*WY*r{4XV_y<79uozj~(lo51S{MJdmZpiidm19`VHk0qHLonnj^#GNU`%{R z`1b<Hf{R#+85r+h{ox$OA+18$8^8CpqZQAU+5PVVO-9*N zga^UL#|Z!|s*l@BI*bnR;0w=JVuKv(vGm7jclrEZe3gYXag{L@vm|D>yz|cRhD~fC zs*v}W@fKKq|JM6$`TfBZ7a5sHDLKiAme(^XU*&a;p*>atJ}ZO8$EOvWoOp!|rU|M5 z+RtbyPzQKWGrq=n-cqwr0{rBO3B_MG2)^;!VJH8CY13)JUPJS(nB##Fke?hMmH@X= z%s$p%n-^hNZp+U+U(IkxnKE{kv(*p@tZNUE_=9!y^0NJ(2?&~}4%?d1nNl@wQ1|Nn z9RGApUy8P=B34bno`}%x{C!o=eU<7rvPplx$px!W?FyCU*AoE$?aaO3;M(&<&EdSh zVJy!RBd_J&VUNT!AGX>rn;4-B|iwTo~v}drBFQviM0v51|UBlw==2DP8r9&q`gA$Lw&5Il#SS~ z*Z;TRaAe1kz{AVAD@hA<>7>SmW~+7#&y8=(A1&0B$8P7=?~m-{8EA7D7#Tc1+&`(W z1)r2X*kl&gTQfbHAaNji=GT5da%ATI;R9k7ThzR}pE8Q9< zQWzV|Z=*A?5N9Pxp`=gB3qlM@l)wDhe;JFxr&y@{)=}{KT)rGXTey2@gp9n z(16En4CI6o+9DE+7Fb-IXSjGVqb1ibIQ$(hZRc+`Sx*HFFf=D7h7hW%+A6HvL>-rf zwh=_$C&wd!wuH>i?vL|~5g5wNwm4r^-LHGUYY#SFo43Dj*qZ0*5d4JBPtqp2jxwna z>HWUA);3Wuq*!$n=n-iQ8^|@?pPaeaBmu7cKoVC3q=3R3TZP49{;2-JoRZ}N{ra@& zQH)Oni2dmwj+ID#bbr+80dLQFd_N3f_8Qjz$>tV#6Pl|amTH1WXISGH<-cQB)l~cQ z+@Cyf@LA<|hZP+e8v5w?+WEeS_EI^`<-cmgUbQvT|D&B>$-u(m$0p_RMVZLIS1HI8br5 z9%dwi;39g?=C*VR+xG8pSA zMLug)MxZq`L;kvpZy>aEn_cIEB;t$SV`3Qp+`_j%cTnB^^C4ISitYXeW}Y8^Ty|uV z_FC=zmdCNU74MFo_JB#Yw6|+}eEjHs^|m(f|DT!gYLKXR?DIs8l$jKVd8;2=WBKpw z*|Wj#6oe=qS$Ky%BMvOJs20om_@BGIDFLXS%x!r-Pakdd@VXD%NwjGh+u4tJ`xsAn ztqwad-F0(wK|@3(_ zU>mLsvtfS$a@gVfFAFT)4{bBdG{yCI}T0E$jp1k z)-qEWzinhe+gn@n8eG7glnR^n4{f=#NxD7=K$#X(QQyxNWhTp@=9RG7flxnwuWbaw z1xCXMmeB@BP$l|)vNyNPXlq>gbEtOdm&#Z4{4AHA|<+uX6s9pVU4Fj z*uA!pd|kA4WQ2=zZW=Jr6(j{1f&En%dr+-~-0Jx*3F{k$RQz{m)A8QQ=m z#B30CD~gitkUCm#&Cc*%-+VcqwDH0^VDIsZBWE=q&&d7D$8p%4mThUW_dQBDi*Zpf{cAHFN<2hdOp_01`H!aBFauqIA5U_q^ zi>EqqbnI-Yf*YX)#{ZQq_+?ao6aEcET6RCnB-Ar@pMAhhq!#vfH)8utH#0gL4o(o- z>hBIZojRHAx;iSU=1;Y-s5iA%Da>|Mbj4rz4Jt*+?D5^4 zaJDiW zv-}Q1VUs5iX2w4N?_+ceTXUhc>%EBYyU6(k3GlZg?lGUfKUNCt_R( zDihbj#oU`2$+%&8fBd)g;?@eq+q8%-IO-10e$JV(;NgULmd6m=R5PsLJ`VN7k>O#( zu5$ssgVeB5lh4-gngZCD;RIvvyM7&unioNdA3uH!rVL82 zR+eoT*c+#7X{krIesFVh3v&P)nEL{_=8D&jCQ>R$kfYKM!TRT%@ZV4Q?z&atqhXBn zLujW_F4%+9l_1og_nEq|TW+fq>D*W2Jo%EzpZuysej}a-2)9twe*Fw3Q-HUjS;TDr zn~3eutk#DgB(S1s-B(u&ifhCF<39{51pW4}iM zK|pU`AI3)`6^zA8`#?GALHKUq?c<$q;S=Do+-~sK2trD;|`oA#*Kb*kmn@ zvtHQq54E(T>xRonxIQqRJr&M?m7kr2Bjq>e0Ym7W0TprsZ2vrwprtx@Y2%KqQP;?TYT4UseJx? z^~^asU1NoGegH}IWhB#DG(5_vHOFOglhjcWLd3n~Ivy^+*Zo z5M&c}?z zFlC&d(+UjE(Oc;jBmv@#okjh9vM04l1gvH3CMmJeF<^2^5xf04$PjIo=weTNQ;$J> zoiHr7Odew1*2v6;k>;Ux#J&2nTW&JMXwTKtF(lkdxCc;!hbuJJ z)RT)|XJ%M8Yiq3H!pD5FhBiev7Sj+vUy!Zr>~>S&V_Eahmy*dsOa3)QH;p3zO4%}o z38&+bJOJmvhn!1`!5b?+cmP}8fv8A(G)Z{wJ*uYTFvy{;y_}km>_-UIWOjCOB4%qF z?~t%@a4rcV@8r4vL?vI$VN6JznFmWIu{I{xY#bn_f&RYrdlyE4x3HnAKgw*Fks(`T zUIgFZUt#ynt?Sa!T7;t`p?_Rs#4GS2QbB=4C{LCxl9&r&79ljJ1VnKf7#QZO!Rz65 z%rI%3SUI{>jfP+&wyRN3A~0oT{k>dJ=7N>9N(sNMb;097D+12KyMw2vJ+{v*WHKws zxv2@1QkYjpFrqK5eExa`?k)ZiH_8y*GYCaHqLpN+9}7`usq^6g_+=dtG7=L9Q;L+q zbfw;9$+I#3!Wj(~7UmZjE+#(p?wkpRxBKJN&UI=ZbJ3BRH zY~6)*o~&q!Bh`30@)(V@4Oj6z7?Z-#VndHGpf!qX#l}wwLXb6ZHVkaYI5w6Eyk{tx zo-LM>R@RWs=@z2E3GW33s%c$Dy%dVTEm#USR{Xxf5I0bG(mBk`=%}u*2X(yUK-U{` zDl4A^B75aP?5d!U5MwtAT}O7Q;^ez_P36^zaRX~Gw*U>*>k64Dl9F_V~FS<2F_u z4CbBXes~3pjbB?4)-&x1#C0FV6EkgO%+>$_gV@Giwr&PFNqbC6UFsRHY1)OGDk|zd zZ+k3eaSfFGO}%lbll!AkrEq_f%kj*i7LLN|8}K1xgQ1}_L###9c|fHipoh}e+PLX= zgJ?1|G>dxXHSoMn>C#e!{D86OYbK0S$_4XUYVuJag|DCU`P}pQ-uA?phP)7z3zBeS z_c|D}1(wdye4`5W*4nNhW!ssB0jsvwo8dSww^*l;>|3)R7#RLdv*62Xss+HnVpPO9 zaJ^GhSH_m?T7K02T!Jo%(JDxYR!VZx?85sBb7Kra7u2x2=P%3L&At-le=w2KG`&`b zj^H1f39O=trlzMYJ{n;V8A|mx(z`zmOn!SXUB$WhXwRFAi|r=sNPVY`r7bQ&4Vig@ z-7$ZD&f3#|b@VuJLPNv+q(|Cd6L@`K4Aarmi%qwnEDyd zT^>gL4PVvPG~%DWK2B?lK~a&>vAa1h>e5RF3r>26OsL8U%6oiW1YOe9%ws$LQqi#9 zy9SBW-dc^O-&zk^%L`6Q8gh$u57@=ZF5ZXq_G!o#-t!vc3-T@C=H|SDKiOx)%PC`s z+-kLP14PAhV3-wH#^@K1XFY#txpnZ@ysBH#c+y_UBS}fZNI~L((@vD@!F+ol09b>E z>Y*II652iF>1co9`%x2QO{m{Zbc1osHk?mbcwF$g7{D!Li8Gp@GjhNW*rWtxp`>3i zT=x4Jys0}5U5iKC5Sw;rKB?vrZILkcJZrVYO9D9n;(*T=jUn8=__Vc&@!jB55b!6P z(4VW)Kmsx*rBF}^tc@O$$yF6OgpP2h;z>7gr*WA5_PGU8%37c@hu_1RWA_=nBn*&S zLm!KY;1^e?rV27ze$#l^%&Msd5LVR8)kQ@`iO%6FLXRXkZ8ot`_R+A>!I9h$Kp%~F z-%ukvXM>PRTijc7uUq%_`{=`-nt-g-1hWd7n!-p+h&1f)SVZLBJEno2zak5J4YJ{P z1>5T>KEw8kHy~#gdesxbk-LE*2EiH+-+N^!9dD|apS%0Q;-tC7+4E_Q>~BR)=bzX4 zeb@UwQX}3Eo|VhK009r&9>AZ7Z;rg)YWS0Q4Fo%I7a(=A$Sf2IoH*z7&4xBtOhvhU zP7UKZ#=R0UR7`74{`r-}j_BCN9)dlpV6|YL_WVm+4Jf{F7eE@n>eHUuuGx|F%SZ2w zZg`#yWEsK0@PeE30dC8x)&;o1p&^NuSIjcQ%MS5)^FRnTC*4b3b$bj_4raZsISba7P?*Qx)-r(E|Az+4^#n}1Q2Cr+G$USg?GeLlfdHuCrRN7mJU8s!rVZ&qZlqOOZn)3039b- zfp`YklX>}xvluw8R~dYWYLJ+9v)A!JyWvogJHFrAtEY=jZcV9L5T|>s&YX?VR8q1o z**h>>>{7bXRU8I2e-c@H~C9S{3Ck8b$ll#ae#!rxwO>gX0w< z+1+A32l2-^oHVANI6t&abJ%|K=JE*2h@6mQRA-)5LLr27<$Dz;9|sR)hCoOMH>{Op zNY_+Sx%1j}+W^2n&wG0YN0w6Rjg&MGfwun%D4LU#G#IhW_Q3wS?+Km1LD{AxaSsVI zHp_}j2R#x?0O%V+<+B40e7N+_IvN9+!)CpK`Lg`>_n!hqSF9~8GA6&iVIiNbGq4wX zgIry6CE@aI?^5d&lf68P3LKM$S;%>LJOW!p{VJsQ5l-OB{XUoP%Ecj{ zXJnYN%YGT85(5Hw#l^R?t71EoWeXS!@T_DFx%CgA<377m076nS$NCoIe12{H_~@uH zYR508MBaMql%#|N!%#}Vh!~+aEzGeVRgjF>zn4VidCd)x-9Xur>L%hq>y->|Yu zbwyIV z>(uL5p)UP6X61xHd6D@U9i!sU{4$vqd!+BgC4_{G~V0Lcb~H79tX-Q#29`$cp6Nb(7s!t-gJP2 zY2s6?z^3GtRj2M>dm;PcD#PJGBgSM=u3x)V$8v}}ib?38=TtJpdlGFEBrhE2D=>M4 zv2k|tjKESs@xIqBAvLeDP1}+^j$6;3D@Cw8p4kN*6VsF9-1T3BF2*1>$~apqye-hW z*1=j6VU>#U@AWR=Q z1C7rsna2v z6tjIqTwmYY8?Ozz&T@PD{vq_D_0_7KoxiUy3}n8G5H_vNU8zx^r7X||ZERKE5m653 zTmpfK6G(;j^0l~F(baT*%ad>xBM&m6sl3&)+I*z+fYv|UU2LUpeg=RCUQh4ObXi8G z->Lm>V6?+6JIWiO!_I*lvH`;GYnS5If;67v3V~J@7S{p77Jp!1#&sKQfB*3+v1ng$ zzjEhq0Ha$bSOY^;$sVSS`Gf>wxtDocwYt7tl$SHtwJKjX|I!GfpH<@K<@qoNGEDco z9+H2h3N}=_t4q!g75oO&7{9duK)6utWtRg4d}HndTIS}+lCidmSzU7Jr%#$>k^`+d z*akx_c3doKjB-2y&eQ9G6_InE_|NZ_PaUV-z^d$V1zR5VOqKz~3UvonnJcuQ3?61x zRW*o8BU`;69;-;XJ^<5%be?K{(nF2gzD9E{evNmFj`dX0kd^HB9iI~JFlwedXhb-| z;qc?`E4dv02PRsk&-2R^Y?+vt2wuugeq!@*Nbl$SCvj~90}}NjQccS&k||D#rN>Uv zB?NY-lU8n*Qz#?Gn@<4C<{`tSc=~h@EP6 z&wM!kj{sxz+iA544hxHmW|s4rZJehiy~cZiv^HE%D3RCJDU)+?uq67H-vQ9!7_aXy z_T_}FWX>=EOmS9JzPZXbEsz%e^o?2}x1cKm;uYr50GqCC))C@TRV-l?S_JZBBjIb~ ztk%Nx_xRi59T<1op}sYGLe1u3%~g(Lw`!PG_lU`oKBV4{Ri@Oq2hyIlB9w~?Mx-St z8pdc9<8=IWL+Vota_3P$Rf=gzNl9c*P>_tQOn;5O2KL5=!OCEjDzuYg2x;|R8`)&0 z@CH!DtP2`u>*)ynF8rj;S*WB4)dR}1zb_ofdHq^Cs6Bw(EE)_ou*;!|i$Gm6ZS34) zN?gVD4Ng=G6{BLZvV2*@>!#eed3Xd!Pe1;9@giXMXwY4g3L>yo*Rg8v_Yw!o_J)7> zA%di1d04J8DglOLZw4(%!>Bo1OR_VRWW|juwpZ`DJoh!k*gL-NzIJWf1mmZstn4tR zxy8H?M_m(Fqt3LO%T|P8IvBfBq`eNRp%cJvtAeU;H<&-07hNtad(zm8!w65YW?JTh zU$_ugQ~_KAakOU)youl$<4IaIoAb9F6X1(mi>jZ~ri#vh!9+&Zzk<)!mg-Tqk+$*y zSv>%P!X~n_JdX$R@kuI@>91&BIa9sZPwIrZqS^#b8%+iQf zF?PK?eY+Wg^e3;-qyHHm^7Y_b6;1IPgXWtl@fE*c#C=N3*TraqY6dm-$$(ydt3lo^ zp-5=t7#D<1x-5zlK&!2wbOi-)ndjFDgiHTJkOmh|8;{pJ4N-2N{aw!K0}{8fsYzh=0skTAdn8ri5Rj;x1xT1--4s2* zCACgj4}!_23)ktR?e6|vX|S_b{(dWp)9!05o0QvJ=<>=+d*k57$>&OPvi+xcqT>#J zPFPu4+4bR*n(8zx)@~&gEEg`DW7=DoWeSX|dO>iXrB61gbS@cmb48C!$82K9k!RG- z*A}FJ=LkUpov_vGZaNNi9p@*e&o@AtV7&Z{Km7IAAk4G%2o*U`W1zk1k3-8>Wj7BL z>8f@eOhmD44*w15g)WubF2hAyho#n1{>sR#&3|w@Rq*5`zPtXvCP-FFFsk=d>yE4 zyVdSQ_@cPERO`{syZ^2#@5BwEZ9;Iulg{ZSCIw&&+nk}RYrcbhPG%;<(oJyC zW}V$yQvUACr{F>aBIQQP9EE6kz}0oDueg4xN0~huOq6(epTyz-+&QjeU7KVmYv@Xp zon8Lo!ZWpq?c6m-`$SjQ=y>mYxcpg)_VbKauUu9^{4(DL=-jtKPv_jngw26E6C=u} zWpPOF!LbtXJhgOmOuM@PFU?L|Vs$XO1BcnKO$6KpDcIVrx6Cd|VQpKS=h4k^w`woP z9G*9Ff*KkT*Yw{?CnlRZ%D4XxsuW&qj#&1F8o1qYAAAT_YdZ)5+4bAu zG{M6W7H3A#RpCB0bKC(3cK9AJe&w~wtMiey@FDIASr=?Z2OT(OqFD7zw>ebXSvRM@ zfU=LWzvR^9e=-1yE11{Ic8dv!$x5ezZzG-mSxn$?L{L1+$Os2|0(_VsZ}H{Jb;n_! zW}%5u`;p7f8g<7Gh&1eCJ*y;vIK({6%3}D#H;jeEBJ-0D(z|$j5zJ8ma}hg+YrCHu zqZbFfdR>u=^Z-hr#<#$7WwdH3fh^&5P+Q_);b2ux(0g?vIc{$plk3FSjAi1H+a0w0QMe0;pPuQ7O$r6uJ^PEZP$ zd5nY?$Z-n^snN?yJpy{pa5?IR06@iR`}e*Epv|VaQ4_Ueg8@Ged{q2aMYh{FCSsD3 z{2CAbdi63U#sLY&J;95lJU)UT+gkJZx&h_lt#iYyd4sP`77rfmtWN_-(sZ*z`}djv(czU4bP6oGx=n|S ziNSe<)o5j@AQlepH61X!)j!_o$r$KwZVEFBU8(c?%hJKYVcAF2-qwB%)b1~imFTZH zt&MB4X~=RxN=wUhj%h?_1!&|x&Ugdnrckge09FF0C^7`TR#rvskCfkp!vV4%zG4Vz zJL|p@68?Cjaj%$PlRX#b72#4WSRNGD~j?`3k*u|1X-pZlY7h=e640e;woE=L@o4}j^}?jW5b%mRqn z&G6akY&_@dmOL#2n!XQ7`IIkIe|)HhD~qtXOpcI|cmljZRE^^Hjne1iIE55IQ>h?3 zGgHKC#90Ay&|MCn4@YkNW#TsP=WxYosMI^n&&a@(MfKT?9MC2)NQQ6DcP&lFrwqI@Vu*J0jS)p|2Ak|0t zJ-hERb*m$Njlt*V)3l>6LzvO-KfA9|>Re;q$b&;^SjYe)=NrNquGXUKM~yf1QdQ*R z(rlFKGV3cG2O2{R;;f54bid&t)K|7)H5F zPxJ^(kBjOt12(z0-NN*JR+d%#cgn0>vZ(%q(C%l!!f5ai-@bhq=56&cJS+28aLA)u z8Hw55DH?cBUVChkV+c-CxMzkSC$$DgXxxBDfx#pZa>;oy1>&*0*eAV+?K(9OKaiOK zwMAI$KVXyir(kqcwcrVePK#@(5x|5(;+n)1<`u=tjyGBS_teav9sm?eh+-Tj02o$O!UWV5E|ri zpMG>Z1sVs6%L_lEG6!D;6%E$?YNH22;vmRndx7>btm%t#wM5f1=Rsp0$0_>LSzA`T zLV@hKykcd4awV+4BBWj)u_uWZV-_~n)O3EU6pk@BEfeI-lfK8=JmFEaWPgJ9=vcK!&*%^bj8Jx2iXkPl z&_1fpa0g5K1(#J|!U_f1G&h7KlqI_b)J+}H29R^OJ zetF$T9(vcufw98Tg`{oJ{mseim#nm|d5M{udcO{(hG? za=-{%J)U$!y{leA4_u=F=x^Am^^al8x==OWTB|lOyOE;*fU?Fy#=7Ol(Q1@UgaBzI zPy1xY-Ub|UOQD=XCi3-^OyJQ$!p4=UtsK6vD`W>8f>I9iD`5|qXOks<@6%`nkaUA2 zkoT!2?v6|6rh4&&Mq#lO4=k`e z`(j`n))25+cycwmifBfj6ZCbe#IdoC;p(dDwsvM`i3<8In^GH8Q-A-v3)tlbqF zkuUV16S1(R0pk}}FCa6EnFM<(RQ>f5^*Uw&E5gT@H_XbOwdLkra2)@sI9nQV+;*|p z`yM#nTqCZgize8NP6pLoFfEjTpF?)%2X`#!)baD1p|~y}0$!v*oLW0OW2cUA<$~Fq z3FO8{4uh2jA$8=>r%Ws@O}pnDYKnITnbcV9x*HA%gK0^?(qUk30h^i4+J*Y3Yse>B zgiZqH0A)(`dQnaz%?TeaRAV)Y6^>ob>ftEr=+ltP{Om<9sMnBHHV5lAp?FaJyx?Cl z7XiL)HW`Y1S#e{(%%hO&=ajv(TtwL_gXz!p^alF>1Y-P)(-y?KS@ zesr+#=DRXveFK(T1->5yjw}#NkeNUP+4zl{!B!gaO`9g-0RW&$N!Q-$s`XKB8fP&( zQu?iVym*Zb*59JK$t>6#yYiwD@dyBn2>)-+G|IPepeGxXG8eG>PVVDPRlo!NqKty2 zKN>H1Q1>^xa`jHv22Hqa-vv{50Z8Oeg}>s=^MFqPb^{Qh#I=!;Q~R@FHM(gOFmHuG zGBpXSqpqNV2Td&DCw?hG#wx+(*AvAj-8()!?q|axyS|eFJXkjrY->DEF7^a*2zvdl z+D+8eF?@#=JO7>ET9fCATA&AIp|r6!IbCBv6jq)&7X2^Kdl1*Wg7&uR)W8%IEz5p6 z09vIkP)ei_%dcJCTy?rS3_ONO_7+5OF21>Z?6gu7N)=tnmMOJ}CmJ_5V*V9fC^%D(MqrxUN%avUe=s z16)Uo-(uUb|KXZieD2qG?}9@|a~2jTU{KlnDS940SxT+UsL70Jms%JWOJh`OS-pY& zL8Xx}(q51zm$;ku<;xewOIOmdX%~W3AL`&61%VjEZ>G(v2()vTMAn0Ms_Pi6>I^FoNM;#js6u?6!2z! z_K9L(xKaqpQ$9-Wce)1m!dg8=u=q_fu(CO;#U5;- zt^MonBDXp#s-7k)|B9PfcoL97Pq&jQutZTXK1 z_kMquW}3laFVtZ<5`FeK!7%Ar0tQj^V?ql1^Xq} z2tlD;6DM#T4Jg=BxCt^7D4}@|^`QJRe>RB1!I9xl;NUFn`yAQ4pnTE+DLYBlM~_4z zRXb0nU%P&tNXoQBa)PoD$Wy|99Sc?Q3Fy}$T0j}f_y7JpS0T{ywOdT!lN;8)$zceIdlM%8?_9kQ}BzudCBr7X>kL*H{l`^w;S=n3JGD9dC*|J^6_gt;}^ZP!2 zzsKWu{c%6;yZegw`!&vap67XcrPf0QT(HU&%t=%{Bn8h#)E{@?fJMjt z)h6CX6-05YfSwsay(aKSCMywWCjVQ%IXg6qQOfz?&Q)LdO&w2R`m1Nn4V+6pmJ0+< zKPEy?q1UFO_=|@>lRPXcI@kVp<-eBv7HFs3WnuH313oVhzH4eZ{rc#|>!U=q0j16& zQ(iCv)xxE=SJ4VVG~GVYRK7aOBo8AH@LPZHAc9dBG9hznzg|?rjn`!O5zLUW4bk-p+qlLt0fB#L=B&OfI{R=@5fBhZ(fS3*nc^VeW2nqp4^gE$H zhmU`Y2vY9q);gzy+KMgo&yWTvRj#mUCX@dJ`Z)DJ>6>ZVKLp#Xthwu(D@q9*@@UQY ze-ESqLNv5mi*=1Ie|3roQ?vk>@ndJFbOav% zUq#qo-JUNM2W;(v_T)20=;Jtm!w~eh89%~wwbKo1=OV>~0`C2OBgFpSNY(D0SaKG4 zRJ0-j6+QX zb-}?G^8mdG z^=u>U@8%T#YL7a9kBDVXJZTqmSF{>|DEb18kgxxr1^cV%t~9QDwHuB$Mz9Uiv~KVP z!5l!Mp!d>(R1Nl%iJ~d3f;dLBv|cvCRhHj!RQ=7P>84gTCZ;TAU^1&8H<#W2fvs71 zKfRwJc&SGO)!Fgs`LBD6V9Dp4_hOJ={K6{nKRawk@y8fY(F4Er`{Wo;SfQ&Om?f?c zRcH%-9=}M<*!i)$KViU(l!y|Y-}ueJmo+wXIek{=j!i$y@dkf>glyfQ{d zM+Z$F&KUaKg!aAy5xoYLIzXO~WMArv1j_BwCChAR33p(AKms}wfgYdDFZhC<-?P%AG{JZZ!`XKTnG*Fyb&7>(AP8m zNJXus{#l>~(m&TpLib=jx|dO2S@ggcU8{j*_oSodnMFA==g}-MNWxcSB_%z|t}^Qc zeRWU!3b&(5+X_toZGDY785EE_~$xg zML=OFWi(@s9{;8=Pb|=IL14!o0_nue@9JDWB)0m=ulj46q*sl!Cx2;_6NsQ zTx|EwYre|q$wLo%e$98{CklBZCkE3K8-wZ~`qKDRu}In{pKj<17;&iTo5M-1Q(|U~ zxHQCMiPYk;&vWnSyL5K9%CFTO$%fVr|I2+`xqZ8nCpinweZq=%fnJ8<+=6@SRmO$r zgk&pi6&*i^oU6^Htjvm_&IGls%|OU}(ltIubI?z8#N@%K0jZ4SPG&o?D*}?-CFjxl zLq>}Q>D`5oS83FtIbWf0UA7l$YxVmN1vz2&&!an*?W?t)miH<5w^VNIH5>`vpZs;N zKcQ&7SbpU!(LVl{Yh17^-8mzSd0p`t>1>QtNwa z&kfzIYd|(*bIHM_ARSU|ou58QsiJnQPEwnnzk%$B6|xJ%>*rUGM@~-HO6$>D-0HP% zE|KA!+T_Jydq@FnV26jOsyzymeM-YxgtzK6{`c{-LQzt*jyRW1)> zMWm_VmDHeE3Pg##W8KG=QJ1Kx2O)B*`8Cr{f&%A4L5EUtKbN)!P?Je6{o{mt3;Xb~wk~uIG%Jd6rqm%|T=bl|X}8 zeS5PTZl?}>_>J8yE_9p%Fecr=)6;(rMuTl9RR!J1=#gU%SRS{-)s>R>9ti%MGsYV(H1X9@5>X%!%9U(`*bx z@*p?&px5QQ+*>lwTDiR8hcFka%qSESzv?ys&6^P$EAq4o&y&0tjW1L!DP0#DKh{s45%LpJ^kbY}@!F zSz3LwTV~ve2Nff3UGlMQXObjhqqsP?*d8sxrW zJJ zKqGG;?DDBJ$JVOL%B{ZJyXSC?Z@m!XE$S*sg=cHVb&u^VADAxDKZ*T zR7{-8KnAd1{?NYFKElnra<$sU&TnRWsd}kEuzhhdIO#bfT=71%Y8-mkPX5BGDNk!o z`m;cxe5L(m1m(ep(l6ZuFBOb3#+N2T=0|) z0xc$*%EnBhSsZCs17ndlVtu13kFl+=2au~7Ea+eXd5e!Y|n zRTX1zZ>T(n5uMKke+|%JW&qds`%*fX`7lBZ^|$7dg!qp_BSEKvn=^n6E@dmihR4gp z2?(m%lH};b^sRS4#waSap>&qKowjC;;|p*cFx;whk)<*Hf21}u^xC&Oi|VSYEr;?` zfj0*l6rBY42wVA_WbJYA>k&)eT5kg+>!+Rk)I)lmlXy^r1XN94|!4kdRW+wvvT)f%Rk2=k7swN&_I85+*!(TdFZ11L-wwx+#Xd|FHw7p?2&6~ z>*)y>GBKV;;BHaH=!YwUXc*~JreXbFhQ4tWUsii@wELwvzWUtkY|Llpb%~3q-}Eem z9nCod`jWnje!U$Og8pQaF|V2#hZfNyjM}njoAX~KQxg#W`9zURo6G$AXv~o8zDudh zf&nH_CLkTMn6NR^1_Z)gYd0k&ya*bcz}}zy2wz{Xb175Vgl*njlvUxBG4Fd}YK*b) zX3{CEIs;^?L%(&OM0}kS%B=xLA>7fKY%cV8kFw}X!GIU4RiWd{QFVxaSt?_Nqwcu! ziGo^WG)2Fnuy0@>FNQm}5NgP<1~|Oj)4`VV4{IwYi8j8jc7ftP|Lg_wLo#y4{7#=( z@9~5A3c@UCcD)u?Q>|wBBArh0mjW#_&u`Ov0CM5142e;M0ha zWOjG)3pzv3UAfArkikKXH*Ye(ewxjbYAt*IJ$;!#&rP$>*Pq3@>GnH%eAl? zK{3$Lo&Q9p=2_;5ArkQK>9POk>1W5B5Wcs?uR3G)*FSqK&Dr&ehmf^?92c?2&qZFK zmoRGn$`KxjGouOu1@UvfQ_bkJ+40SuLENdCmnp!R);)|f#{6& zEG$Vr_wOXtn*aBZaW7tBBe(>4P0a|7ZiipGekrRbXr}8u4#M|BqD#|cp~yq)>X=bO zWPKFZ%KlUd`O#$ckg#|Ew60Rm0Je2>Vq&Ks>*LJ!>?%r93X|FBt3zWWt)oJUiTt$J zm0NcudRJff=cHfIt0?ykd{4oqr{7Sj$@=h1`Dxg?nLCodPeU)`gj@>|QXJ9nR9QUe zwY9c0_TNLVO3ED|`}@@MbMUZWBKn4_E{Hr{Kmy>zAIMZ{ODLhm>GZ7EJAZO#DosB6 zisecoztt5*=wq#o+G}fL5BvcWQMAkxQM>Pi>`Z?xVsvKjTDpFPjkcROKCM{G;mtZJ zM1jxLz2$7zdbn3gPb^%%5TCi!&=&_~qL z2rK;e-dn!@>wrl%#jb5 zH&fZq&rdQY(%N)e^t=1cgjl zE&TWq^Zw3yYV#f|^O==#-E^N5?*(JC;7!&34>j5Z5~byQ%~EUEXAQOQsfBU9PEPI( ze*Np=q-127UFJD(GvYp>_-p#c6l3Cobsfm)e_uYfonu@g z0|RH=f9Hk&zw@Gy!omsC;=Sx0|Q<3;z0^RC0m!7?P zrMBn|a_wS=kw`hE>Og3^_SJRNqSTy@beM`#pnbI8_Wb5l0g5Ivrh{lVLoH{ze)b%m z)^)xcvO^hJS-~47u+T14hfv;XV2S#$sVZbYCyJ1;9J~au

6IQS{`S@p1;M4*sdowPaCJTfE<=h`k)NH3Wnd7Z9WGO{w32d;WL4=r8Dr)RLs} z=hADm(#p!pgRA0eHKAH&WzUYW;N;(v%-y;Ts>H z!;abEKvw&?P2MJ;P4+!JoF76r60-mH{aRN-{nq|_S0&#%Z%O{127Cp**YQ7VXrpfYdVl)pPiXz?t- zK;rjRmyvlnm?C-F)%9s>s>#&=Q`V9E_VVs8eQ)H6jS~hxV0FfFG-UCL-x_}WQ1pZM z)9aIB=98t|uP!0|z0-p#?RhCmw7=a%CGSOvyn1zMC}O*vqJW)^%k)!llc!#r!5JE%?BSkFFOP?xD=CjqJ7lppU`3>F zDPLYMN>8(k_VZ?7dnI_9Ho}Yc0wo{wMx{ZubK~xkR$8r-m9ehlvgYy$gA9p8;&oGc z(YElf5}LkfV-6i~g1f1-n>R96o8DTT|A=+CiG@dVpbuZ%`RMA&<3{i3

P??(VKr zYE)?MF&lm9m8b^|>IAFtXCGIx{crUwoXUL4GAA|+NUDgbQztU;o`?pQL~q}B4oIDH8+J>x z2M>Zw#h%!0FY?RWY`@GRj2ZgzT4k22@9={w#bqo0aqc@3MRD#;eSO6fGkUsZjdS5s z-|osVDkTX&{*X;B>bZxtGG6XC(1~Yfzj}@}PeAC=7WugxfApOm8f!YmdKgP5AV3xs z)gMx2M<^Jr)~}+B|5~_I+BP_8VZ8l(W@drHgyC@7*;t?VB=fM&bBaP~oGtYHGk8x; z)kYRb z9ED_*`nT^d2QG_?izk2ib0he301O~}y~J$-b+7p${`w#Kw2qL_+JKMhwFr_keGmn7 zEB!_&@P%AD;pJ0**3|-liu0+zD^6(9HB9Y6F7X>?p}%^Q$Qk4J{~andys=`pC&$du zX87RGzI-CjPz&wrQ!$?G>A?dkUsOAd5;QLn@$uxwlS4zKn3$N$@swmFB#erQFJCrI zP97uO6w|_>Zw@|;-Miq6@n?I%Uyd~q{Mq=SN^hkIAx}mU`?#We3)9-8bm({2C}NIL zc$1MqCniQ?Y;2711$>zbzWSMh?sf&oH4c=cDX6UP zet(LtqTguCo zV^Z|}%O_!+WAl&R*JzzGcCv@ZHbVUI=zv9Sxc;G!LN5_3gv4MV&N41~QF8@Ju+Pr* zCPzYNr81|+#zq7pK{2Re%A0DYEquUr+INvQMj;T!x?mtC-R7w=1+op9X;`2ZTOH?4 zEGgf>9M|mE=3qhsAbso{9Rm^*^+QMW32#8M9*5%gA3( zu!0U>;j|U&?~DgB?_gnJ`2vfpwG*k9(*hF)0`|Yrm8Pw+Sr<6p;>6Q5q!}*UZLdS( ztlq}#`+dOSpO&wraJ1OY8=By@pq7#WG9)_KB66so03A?&$lS9=|v^U9Sgizg8$7lRqc%dE1Zj`sHU zve|KPaW(RipmXE30QIsvz=$R+?f1}Ir*?EU=U>MmMEluw)FbW#;q3?Q{~*v1PtczS z&enQ*Nenly?n?+md($77TmVjg@RYfsp<&u07o2}PXXl{c;NWa)J3B7X8#jjPN{dvO z?RJ)RTiV*BQdM9)VL^ehg+(a1P-%MAlPP{lNy(n* ztUr89K%$zX5fUCwDy0H(EeE$K0X20v9C-}pY;S0J&iM+dqeBiM`}DVO^kV{WFQ8Gg z^u2rZ=wmfHJ|6cTiLi5UATH2miNU&XL9_Y_LQYxv7F-2$eK>*8gW_u?Z1`iSz0*U+ zludnu;(7b^X-OSDy{5rI5?DhnZtiO(Cr@mMiHRS>qan^VUb=eqs*s3CoRHzo$Dx7a zB!=oYd&^2u=wT;JJCYW=PXPL*N(U1V6Q72XgPNnA@%%bjQmvXrO?k<(Z)-hiYbo&V zaeIZ#Yx^v=B49o8w2QuhNIN7f%wL0r^i)$Bbv(;)66@Ve6=tsc9|(+f;dqi@2aauO ze|l&5#Y&Z#1R60m!y%ACfu|u2w=kZvovJg?iGB9$a?Ne*@rzy+B;F5R@a+WS)5@!(1`8ntMJTTsG!vS1ow-m@aQRl*?Ho`4_c*cG7^N4ij`rT& z{C#)8CJFy%lft~cE|n~fhmY=BUC#98!9ZinU$KbA>(NmiRYZ4Nn=FY0s{%{Rz5SoF z@m$9KD%T43;#MB}`%kZ|7%XnU)YCwxrQsZ}{<;O&D={n_oX5$@$;J7_xk^Sxm*L8B z!RhUHJ9p+xLw`Tvl;>tRv+Me1uQ<+l$Lu3M>oF3zuxUpJ`}@YwW&#dc+u{D^O;S() z$B&IoOdi7wjxZ^ro4YvK!My0@;wQDCB_?LjGcz+gM@vhq%AeZgh1%N-*)bUQ#<>=w z05{@=Ug(FZDI~j&s;G>bhJ*wHBzDEt;{vI+w<%|)r;WbG2R6QV+oPGG_B9UaO&IQA z&y$cZwR?L*?5rU5f`D*stL-#dY#e2CLr(W?BwwF*JVUw@|A8>vcNF=iI{rgZUV(2xmiF#hIc!jtdfJW1oFVtX8 zGHB9W5e3Y!%K0#rvjrjH>ROroQ_CJ~EOd2eD%7uXytcFYMgN{1E8J0!o#mVoZe|(@ z){gOUDwdesCKL=x@`w8L1>vyB#(?w0aLd{C%I~#em)Wyc0p%?Ep!;P;|I%c+b>f(i z_O|ym_C0bMng}>{Vhb9%xf-4NrRJ)kYbh{DG9QYLTFh!{=JQ;s;EKbw#NLG5*R#&q zw7$D=k+eWGyXXdTpkY1nD~yaU#)|s;`_s%cu0%_6#69uXnw*?WW4TZ2HbRP@LW*zG zoxpoeAw$h%gq)VPNb7p(n_Vrpk>}5z`F@PP8t4A>2(>%%gEzG@Ik1FS%VM9|Tyl6*|Z3spt=aVybpcDx+2)NfbHX6Y~ z5R#DvLChXHb`k$B3F)OvxCx4wK0ZFMzM0r-rDW$)sHk*j@_qgK6?|Dh zWMpJBQd%G+$5+6J+rXr)wZ)MX0~(RTQ{a#W{mz=Y&F8McW`j;=wKV`{CUFK#IPWRFB201R?PWr znq%9R{t6jQkhYNVg$$xRtpXzU z&D~vX4;MJ8^gKLjgPb?Pk)|TUv|q6O5PlMDaP`j10I=%lw_Fih-`U~dM_dG_y0_=5 z_>%8D`hkD`R72I|DDLS*W9Qj1F*1?{q>{_z@n`kCYW|*Ms4}6BCh5E7jEM*>n(K zs}R0Gio)td#m6%Tyl!f42CrzixN+*#sQ?9G-UnR-Ui(vRZJ5>0EB^4s<b#N z@QkkMAlc`b0@5V2t68pP<+Gh}IOFmeYGvLU%p}hgGK$~6B|0l;=)G^6y7oj{^Y-oA z19G%z3pRmbVqsChTGN>G-q_v_lu9KizW@jbrcq^E(yBV4*AJrYGb#i&JpBBvaHj*d zf#f7TWdt2X^VT<==6k5W(%|FZ5XZvie1odBCSLj&1wtaCQyFTyvo6k>UCH7|Yh4+c z06o)Um@@gKFlXUlW2PNvgfmKR`s-J^08gA|T~fDpHl1PwBukq_O6{n$wY62NVGbhB zkrs?k2u(|QeV60ns$UZd;k!UhMM=rR#@W-}eoJR}wR#QWAC*#TF!+I!CoZoeuEevUg&hCwvmDMp3|!XMAVF(e zf1L>BeW6A6gtoW^#rxYm9rw^1S$g-I}KY6I28_iWNUlD8*5VRv(n~oxNALj$-4D* zbz{bcfi-ibCH1N6;CVR8r7B^4u=NAXq@BIJ-)}gUcUYL6n>MdL_D;y84Oev`Z_ljx z@i}|~5)zF?F_xbZ++a!~Qq^+oU@u`(g7$)ey5`N(<`R;=#g)%M#y? zZD?_n>_UpXzFf(}kMnz;{XCfcmhmi{`0wV}WMuA3@=HUI$K}0j{vTNtMP~euJ&Zw# z*cwe0`Jp2sTIIcGL%;B-TwbZwh!T6gdW;b;=KQzROnuW_!c-tD(%v&L0$_||fs4F>ZR zq^aJ?={Qo;6UumVT-0?#QbV^@+N^bo31Y6a^?tBETwVuTk9PI>B*yc!IX~Rz>F1@m zbcwCz;(Z>9wn*B@D27{>HyhNhL>r$RAI&Cp!p87D5)G8{1D}x>*lekwpb!R6>!P|b z{b)lW-L!Tym+C>G7Lp7ng%q>L*+%y&n;AjD0~9qvAb^bsimcr5dmIH%O(*FC@uw$ z47=~#!h+7KM_q0h@)m@CLu0_wYPy|(STir$<9#W}(C9+0SksaEn}?xvJu%E1a(L&t z?hTr!PVF95#{7p^=-FHUF+EF}$_W9@x1{VL4xe;4Ia9AA^@a)Wm?FT`+bVG1?Om2p z%epb;=aGXUWZEr!k?_|`4^FH{>pUQB^gdGX6>2+Y&^^~cIa#dL%;DnnT@AM30zFI* z6bGi(_i^LFdZE&=XPI1k3KqX?(_C>91L^!*gk!-rQ^Ov+QzP*QWi*&Uobw+ zgrZp(&0%;s(jOP|W2(JJ>CmkV04KP-*fGOY6|_YzE-7hzaZSAs&K9t<*_x{?Ica0y zV{dMjQS)Hq;c;w^u~5Y_Yp5|L#mC3%(RPMCm6R{H`NHxNS?kUZ<8&|(5K~!_4)Xy% zRV_tAfTksxvv+jQ(z4@R?BeThG4)|$NWgJ{$;rr^aRo*q#aBXvV60`_-G%SnyGKAq zcE!DimzS52n)(7vlcKDT{Weq`%ZZFQPkaSy69R`8Sf$HRq9@3oK|$X-bOBBbiH!gh z%Bw|TPpx1FrpfwOx1Jt{P*r6q60%_$ZYM*Z%X2%hQ%LXK*Ru%h~j(OE-JILCF&uizMcz4TlSvEXFrhU30}T&BmEOf zUb)wIDtEi-@RrHsusI@pF*$knD9k~%#MLRpDsc5I+`iYvXm)Ny^W-4EC%HmzTF3zli^!3`|?z zK^jkE$+wY27&-s4NRFTO4y)nE0@t#Vl$6UtLP8CIsX(W33*a$?JK3+()6)r_<$PRX z7Td9~u$YawB zKH&ohNb4|xz+!JU4k=?DrtJZHcegB(iin8*CGze4P%i3=7quBi^hD2iK!o>bN>{U> zP?w5@NP<{wO^5J~iIyl`Bfrdr5?za-!tS)*{~=H^fA@{gLN4+l~UnA)Ct z$Gt|Ks(v)fGHg3}9)aZJh3J) z-#3)M+rz23C8ca~*v^YiI(_KvHESQ?x^d%%C(lP{yuCTZGEwEEpN_)E#%pX>7jJI8 zJ;J)P>b8SRb?9O|*7d#;)hmAKa_-K2D&TDM&wy%*AxHt=C!L`t3AcA`vexzFX!qt& z9t3cK60OsXk8h&(j!|oYh#-XwDHWAx*}~z9SMo+u)4q*}ILs+BlVE3Suq=P6u8?Kf zc#-9*Sq)Jv&?HzU#W2hOaaJ-aAm9w--SSo#0E3fPEG(FpEivcm-8C{Yib2@|%sW{` z1s)r)=#}NVI@O~?)&#a6`z#RTbHnjMpOV(ro9yHdt*mfBdflb3r#GyN>`J4tbN|Lp~k=fElCJ^lWs^uuIEi=CjCO6@uBlH0b=@R8I{f=ivO@qFAT~z?4ME+caI`U~X4nj}k zsX8x9uL@v_-M#Ajp2)MrgeB3YT&~gI+GjZ^WX9!wUsV+*mF6(l)dw3o0ga2duV!{`5x^JP+r(5}K}qqv?w0J`DkOQ}v_oAEE$jLa0PgSi4@|%9<5( ze=u7$ZN_@6^t`I7YLiF4IXYl9fg1&Y6oN*wx;03=L_%qMUf_5b4?s_YTM*7)QH)1G zBq#?Fi^SJA^3g`1@NwF`zkwJN?5xkWBTz`odtw{wn5J^zp4mg@wO{~zW*p-!om8$tktQQACPHjAotXozJ* zq9>N2v+J?`Vw}&WK_Cmxms*dD$O0YKE{|guHt2%cg6HK&jS?XN|B#ZG{&>XDqpYjE zzyG2P249?5?fPb<{>F}edSBZoHFgl|%gP4Xt&Utw6v%J%k-cy+*5};=Vj$+PBg%}r zJWenWhZIC%+1U%0YnApXq1T)J{Moq`ZKB#Mxe>kqD7p8BD(n{4r~Vg*WLCRwd~03C{EbXA8Z5 zXeiXb)%8j&qpc3%e(cGY#tHM|Ru1aaeEkuuZFXsOK5) zIqahP97%JU87qa|aPRs{K`X6P6WAT0twl6(e3^fR?C0htT|b7Q^K!RewlTY2X~VXa zcGRnveowdfDnFi!BPY+#9-{o-X3Lvz}h3qba>AGiPLKpp!%XwMH)y=ID zDErd2v~lQPPQJVPg>}OdC&qbl_H{J0AAl#qla`hSe+oIW&^9A5I_vA}1hv(WS@`<> zdq7(_70$@U!BSB(u#S-F4TQIVhQVR5Wn~T=`KL6t?&9=T)HoD;IC=}t7ksD2qW876 zq|3SaVH3(3U!q@&xWHsjU~P@Tn=&vkh`Rke0}pXpg`kx3hC83w(UyAI<*X~DwVBT+ zlLH+c9gS>lBY}elDNuCu*TqF_YHI3*g$1m&PWZ!b$44j?mKZ6dVzL;udZwak-lCpf zG9}0{T0#iTCu^<)YoDsY@)f?%$;k-_T~)|Xek~c69Jp~+zNDL|ntYer79$uW0SgDa zYmsi7bH-p^Eq%n<*4|~;?3y}R(EDnY(gxwWpDnSEgW5p)W9;i;#y=&w`pj+?g>6Ci zz%LuQ<3=*Fx1>`)NSTjbYiTj`k4`_0dWL2t(H}V+et<~5W`chrP6GuHftAoCArSSP z7t@P~rBBO@8J(=1o33zA=US_Hh;guE&r)KoGb-O@P^lO{RpvxJR$f+E;xN8ke*r{I zrx9$s8$k~BVljHk{A<(6KE?@CE(l-isUq2SJZc4N)cCPPzRtVz2&0rKEDRCBbkp0q z8If*B?xJD`YkUab!U(+M(fX_=NrBud7luiOk|SP&Z5%?mVGkRj`l0>~`D$Lo8VnJZ6* zBW23=*67OkHX&{M6MgHT#56|%3 znJx(*3dZgooZoyh=V6Ra)pGyl{m`ISrs*%uUNv0znjbU-jj`6%U-@mhogeB#@8kT> z+%itfL&i2j2QK8007oE@1$$&7<&J);C7hqWs57t6hS>)0_dZbM5cGB49^-!{?t?)% zpKiy?O}gLvvk&lD&EUIpmkbv}m0k-E>zz%9e0qyP)zj>3a~avz%iPyVFKllaSr1Xx zLe3vRNnei1$N6_V)fce#W?@ieZ(1+cH0g+1q0sx6qi^;(w#m?GZ-%~ zUYfiRPAS0l?g-?Egv1Vn_Hg`W7oFaiPDp_$B|ed|8M^Rpm9F_E?cC_df3rK#TW{2T zP=N47o-R+*%+vbN;qJ?8)=R(KLUFh15p{Q>fb6+MXYzFgpRL6qb&a8KKnG%pU-X-4 zSEgI-(9G88H5xBtxO=cIDL!9kez%cRb7Yp+)OPB0IOQVUyak8%{)$AIl=;neHZYbT z(n$rbD%G03tJ~Q40j@62HN`uMFpfcg=BV6C86ofxB8t(I0cSqj$xDsFcr(+an0T-Pz+HjtnUth(h>o=he$Z(l|T0Q!8=q$^zYi z-0N*$^e#ERd7i{#(@E)@U!?eFt-JF(eJqLEYb<=kw+2GAjLj!qlh zKRE*~kDa4Q(wUiWPPWx->T4`YsgPD?+u5fijOy3G;XCqbnc6=$RF*;`XaEpdeMHYM-nPFw&K|uaQGn3a9dr^k)SZ?W6BP zVy}7L4{}<-gej%?)yZ1@jG{cWlyfz)nBiPXdb)aswaE+z9n%pWqQUw@1JAC*_Lvhq zFwq>+Ip3YX3-bb{(MHq$YVp<3On5phHEeSs#@J+`oHUP8Q^J2;Y*m+E9C1 zFW;cqfHB0hlp-z}+rEP1or<*w-wwJ-&_L?g%VTEq{ky(=UEYbBgb=3N^-bG}*V4Qu z@NR^IZq#`EIzgQnh$rz%zb05dH1gG+J-t5eCoSZ?c*~j>~7f4~-c>j20DZe-UJl z1j)~Qm0&FE`+6WqaWMFFaikr8e0twgWHLqL^DE_^Z5Z}Tz=FfFYANiimF-GkogaMl z4=IQzaaKMYx8y-!kqRk0KwAdc@CTaz#3c0Wsef~P^wuRtlWam;Z-YUEIq;zOF$-tp zYblL(D7fNsSd=mLZjY@0cChVgeC(;g=e>Ue3z2fQzxAm_Qic}0!kydAFOU1C*DP8E!QBQxxjxiy<2x0D#7IcVz^t4YFw z=dp;J@bl--Z=x0kbE3J9MpElHAjlz#jCuZ&<;*r>T5`t(ymj2@PKjD*y_6IN!n%O1 zZ>%Y8@{8bA<=2Fn)#I_$Y1OXWJ8nMC#X$)P7U9WLbKUxA=7rAp0l106Blnr^s7Eyd z4=)Rs+cH?z&$J^qW+sz6zpU+ND=7jB>^xCHu$}f1GA2j-OWWaRn?2RHMBWVgp+P2@m%#E z=BWe5Rb3Ua*1%dN8rCKjhE1cUG#gN!#b(d#5&&9)A_`QD3A!PRgfRN4!3jS2+hvVUaOI~Xr*^Q8 zDqBYIVb6jgwI~w&+bctQ3GZKEV$mzE=Hyf|isJR0{u&w(z}WTjU9oIExr_|y=2(cf z{qhaw7AV2sr;&WhN{vbs)uVq9fpdnB#N$4^B8i#nVlqsBjdZWx&i z(0~?>V2p{0so7@#lwMY4PH<&1?$j!H2Libv(W-E-JNjFX-MxB;IEY!th zffo(PHE?rtt0ZtBL>B2hez7G|3C3gd;=a*Q1#2J33=zIjQFM1v+p-HE9X`0deDdb| zeaGSwRguYUs}0M}Z^T4KrbDvUZc?89c81Mgf;8S!>KeE~9FKQMLEohxt4_!&uMfKS3Gv@ zJrd8*8tLrqZ9i@h58M}1;zw-?rlP-#q4lRkfWCkpNSGe>rOVcIH)ZbgJ?Pf`5N0mpln=78`0FNNT+j-WzDem- z3sSPNGT{X#f}AIX6YQ(bqL>sOZEHrJAOcZTDRl4ir<)6Xjk4@^_f3Z|acbv{e4h{_ zroUw@33(p|v=v>O&O)YmK0l2pu2=~us=pi7^I9bI6cS=0*PN^y!-YGKb@M>!mnd%` zv}aaqjx0QS9ry#f;>WnwgnVE|oQpaDOa-?Ono#tmv@wv`?ccf zQ+=txl5#CF^RZHS;P+npOya*KW4Ao?o}_hEiQjp7%ng<|g-qf!!oh*J>*dBZ#rv{N zZ(HugtSj)WL~q#n>{6>rD9}e44N@`OBpv3lIXPYQgLbA{wFn2Jv}t|?{v~~?lk~=_{T*I6p@wTelJ%ig&ZT zD#@wNW&D&6+%Xt967cC!RNa<3ecG$^p{~l8!m_}#2SQ{Tk5ndneBo_ltCCw<7{7|H zSc~MG)mr)~jK0f@PpYs|&Yxf!-Q)|umLE1;S4#?H#QMt$^1NZ2Z@oC7e=qzZ;;&5X zjT5;H!zZzovGUeZ`i^2(QvbqBHYaLE+_lvP&+3~UA^(Ep%1zhin8xNoFIZqC6+GR$#Q)S z!fgEtj;1Y8vn$jbPcxha?PCl+nG`eKt>zT992x7)%}qj*N4SW-8Vi$BtMS6gFRW;F zda3kvx+;K+bhucEAX5zr);r$bb?fs$+cYKDoSamEf-$gsSc_cXjd(tLH<$S|tLf@^ zLj$6a!z*C_CyOM-f?yL&+*P=nm6!Jf%5!lx;l(7x9PL8U&b6;1GMy_q!A&_Y`5MA} zFq_cbd5x_rE6Ys7$_Hep#a(8EvFr&r9^*<(<<~EgKCu;i*o@|J*99jwYEQJ@WMsuv z^}bvc#Njn@T%E}2T5`9pOyr_={;83((i4}Z`QQhF#1Stjc1k0(2n8$QYfuq^ z@XbH>`GY2@X!N9mS;OdP<=_f%J5g>$(@%^cy%3hW^dd7ngXumyE(QYZtv%H8g&P31 z@6Yw6I*a|`SOupG6(p&o_)A}bd_7EuY;Mln_6sF~z*(3GpZ39%@;eF&WCytp^GdEC z>n_K~9La?amh!2NZ*AeGR!vY9y-ziku61`wo~S$W%x8nGeP<0DV{WLeb{r?Qc8z2~ z(5P~~-EA7{Yh-82NPzg!x!RzzDQgmI)+jlyoyYy_$DVl3YwNe(J?QSZVfb#Ycl>+I z=5;wq>NnoO3V_p|c3 z=()QhxM#8ZfNdiw5YR-E1hV##LC?V5!(!CML$fZK!*X!~H>QAm%c`ln2iJ2n=~)ZS zls)K*QJu&2>w6m}WdguoqP$Vk@oPhQS;Gdmyxw$lN-HiiHG4q2qOhCAkyWlC@--RnA}n3wlXI13fz`d-XH&}Xc4x+&ml?R>?*oe!Z6Eu)~*%Ljc=0* zC)q?1v=oe27~9xnMlH!HdU}H?7tt`M3Y9qp_2Op^)d+AQ&vUb)@GNN`C7-#k@z2IR z7%GNn2u~F3YhHCbTg<9mbbbKp!`3V1_zU*-sDP~@n&U*ir&kmas?p$Fi-yb$_CR#uN zHO6Ogk)Ghsut^J;UDuMNOipO`I+~&SG zRn9*&%p~#X)57{P5o4P^=Sa@E(tNx3R_@DlZk1Ro2Te8+(5WfJD*QoxzhGt?2=S>L0vm+q3#c!Uw z6SbX^GN$b_?>(#4^|7OaD06^k6^at@v<@mG!_HLXE&+GbR2mv;A6UW5Z_T7A?z%2f z+A~>K4GA(AT@on~rvo-bLmASR&*Brz!PLW9N=xH3T2H}fI{c`9*4oL*5d!gccelv< z7b)`E!Y_0@9EXaIt%XU7c}^0IQ3m7vap3d*>#I#=@i z$}kNrR-nt%S&}O~s3jYu$FVcLw-{%a-)hq(S~iRG5iHw@6px?k{B@OtQNusZbY1D-@AIGe_G zYr(#3HwqdTmTbDkABlRZCR~12S69bXz@}A_=T+@&KGuTx9Qi`Xb6H5XewPDr85l+5 zECvjO66eJ;cbGbf`bGDq79g?sIfEj12@QPgh5N#?a@~n`iiHYyaf@P_>p+ZFt}L9rQxz+sCFMoy#w{F zc2N6?*&AXh-!Cx+b$8G3X?&AzR5dq9B)^uHagt3uZGQ8lw&C*22QZVB5|8uq%;wF` z0Hk4SG6m7!tr)uWcPFw9pHWhL`|k#E4>uEgBROP|S(8A8vu72Zh%U@Rd83p>ULl{w z&l+KEQ-2|a+070m%!6;7x`L4JVhFk*+faA9()|V@R7(YxlyKWjD3Xjp7jnsXn!PX_ z*atMY{`BdSv9)y|bkH*Ps`pmfcBy&diD3YG*>NbIAZzGF_yW>ipKd%2+)GVc&)U6* zmomFwMxs65?2T#{*{lcw^Dkqk$mSjtn_FWHXcZJYjpIF>s*UW`IQxB0Y)$=$MZ^8J zl6>Rp7mp}=6kd{;S6KLxmbN7-mWM(tNeGWuO#ci5ON=P!dUAJw41IsD_rSnFbG2=K z#L!YX0s&Pj4Q2H>h|3(SL@$)FCvUHwxJi>N5A19dS%W}D=+Uy!DWDu6%JLp18jAWO zLV*-%JN$@72};7Dssn=Ghyk5kfWwWhD`aG3G={L9ta}&DnY|MFuUJ+SOgAaj=%uOUgtP{`+lMyZhS9)11 zH5tE;l-<5az92~CFKE^iWU}zAk^hm+|69>#j2`KlvGY#-ae`jSgf_$c_8Ymt1~}H* z7PLNRXo)icKA6+RXjyvX3B)!zPQEj9{mFRlPNG8Ts=@c~-?0wG1DyBdvI(R_4qW2< zGLdkuTtD~y)dIM0C>7knO(L|Y0K=Y2nF|fXJK((7%@+tE`5M74) z%v0T4$}H14m=#1T!ESpVJ$sqd^FL?W;y;mX{V^Q?NPbq&l0O1I{qmKzz<42aMY7Mh zSXAu)U2XdMweooRaMRZ3b*!5CW2N`w(3cC%KpIa%)pNm}c_r$=A0IaR(FIQJ%}N*u zO#Fqbx#ojV^lp4`x5W+j(jNBl-Vzt00m{O-Y(Br$8*%+P+9J;qWZQKLRk^O9QASq5Ebo5^ur|!ObwAR}4hQwGHN}PH%C~T(O zXck|TnXCR-xuai3be0G$a^Mnl%h=gi*f25HQ%+;erOdo@^Z-;zuiSSV5*#ktZS7ff zRVAOLHlRNA<~oDu%PTDEvO+to5ZeA1PHo7i>a{;55I|os|NvM|)hj zlzqv5eDt5P56IESSPv4?L~Ff9Lz!g@WVAvHe?jB_>Zc;1wCVyR1Wq&W`Ok=~ zDN8hk%Q)jkk-bG1#lD%wLB5BQKvAd632Uedn)H}Dy*bC(b`U-_v$G;XDU!UiGIoAo zKJ6YMZL-QL^jvM3R+{tr#r2Qr>F1Pj^YH~()lVXP#UDrfAI9D~Dyr{`8y-ar5HPSn zzyJX$m6R59=thQ=?ha`b6(waT0V(O0?lM3c=|-fxJLcUN@caCpcfEhSvleRsGjs2` z=j^lhK07|2KaJtV?|n)MP-YXW*hJ&yv4)|x;uEf~&(s8_bbd77rb4=qGuoyXIanPi zo9liRs6-n>R_OS7#RqS>p(AlaryV0D$0UYEi=B_(=2@rbEP%w(t6vjbFZgka{E$+l>9@Ij9^lz!H>ZLJGqrD?gw<~8r<#H*BdW_@8g>xSs8E((!4w-yg8D&s7 zL%zME>R{M*5>h*DDT|%4Z^%D%L3h`al2!gH`2&IbNNPc5VZZ}4_;MdaeMOi0rJ}^6u6y)cQb>z3fkGgWi@&}eIn|Q?mMWK ze1imn{;M;7hWB5yx_wH9jOor|FJ+FYDgIABeB{=HrYE9m>omvD==WK}7kwhR-G^T!fP*HhIj*Up;U$$pbYV;(P0`(*BwNH7C!uqz zOtnz{6V)(30Tk{rWTqLq=%OmzW~w*%7D!&$L6F11IDDJ?2;E6PqqRY1Mo8H!l~S4# z5?a34>f4+kFm5eTWMx#n^YoK|{SMnjrp2FW!j2C>?GG7k+&{LnVwhxXWgX!{&%V}j zf!ARzwJq;oC$O(y!e3T756Cr0sW;^W>Ibf|Y7~%L;i$@LOM>w;3JJ|OmjW&Fp`YN2 zkdTjholohvECu(P+@e9%DSZ~@>5%Mkv#Axu7vT>xR96jlQbeFX`csz(Xq!?L0iM2T zIVa`K0edQNSB6;5U;iS^Kqj~hrDm-0;>r1e>C{C)T)ZJK_^pZ!v1F2|7?@%PU}yr3tU zc*pJ}ob&wPoQ95Iz3Vb3%C%-A`2C%|P_dU%{(@#j)5hrfwf|a^W5!u~b_GrnoO-*2 zCjO$C@i*I!@Q(3R^+Z>+o1_yR(6(J-srqI*ih(2xKB7m4N^J+3t;+#(_-uUs{J;s+ zoo3TxB6S@G#z0#@EgI?Rfse|`&4L0LPkX+OF&&+cWbE#L_wb!Ci zFWfWAHm+J;V#Y&#=CY*Jy?INc?*#4@(rKEje>2$tA0-hvc7vVi0@U4BmZ>>cLkwM; zGDg#V?b{0U1%I_%_kC&DMh?N74_|p9DgkAYnzKb>1wkJfd-iJluky>p(UD!Yvavq} zl9krtjL9{4`*R>0e4p2~_?-SNcZU2GUmAA_7VPS#d$RpTqbR8krY=H)t0*~@&s_grOr+dzy@#i#>$TPN=S3*{EM8%8 zdlc6`unr_k4)NmYc5wx};~7r|`@a-E!L5q{TXgic14(ni-I(?`nG*!Z0#L_kX@Mh@ zob2wBbzB5bhUGZRRD0%&WK0|ucvG0SJua+_|33DZ!lP!b4Cjzl4vV5Vu{}IAl)gT= z8Tq7aNk9e7$#8G${c!4Av3rFBDU%Ob_%n_sM!tUN~f+EqTUbQE;T0Ux1qr&8

rT$|s{@s2v6Ti9e zk8?D1IzYvIjAHAp>F{-dmfsuai?AkukzDp0e*D~=9_Q*&Ub}S3jajWIbwnn?`j4cS z=>22gXN-*5tQLl+2ACXZQ(aLm`1l-|Rx?|Ub3#tJW=Wx(#y0>mI-EcJi<8s|>%G@# z0O`*4D0-LE`FAvh8m%iMQ@ZfDTv0)v9#XmTVeIeC*iHA>`~ zv6@!Sae>Xtm4v9x7M>j45S|EF^z~w>L%PnbPjc^2NF=ora^eKMGA+ z$0$Wk8mo=$Il4DfCqbb>D7%vfhe^+uO*NL5%pWpXYMCCII%|LO@^@wScXHe@{ry6X z_dhcLO0u`ZF#B7vmufs~Gx@2Uh9}Yt?fVB6ftjrU2<>U!ZP|cK|4($20Ouo$of^5we`V(l)+NwRq_34GePNL&1o zi>qte?SrXeIyra4K7t)!$NC;ZuZrH~x^GZBatff7{i`HC1*9?bI8pT0aQL#s;nCSc zTcbU#(Pv^R{x79x{d&mHCKbHV1bFlW%v}5Ec;_>q5tEZ#*0Hc+++sPmwb9m|AalzQ zw?{WSKpySn_uE5+E1e-YBT?$18a}&W^2N#r$qG%JgO%PD@!f7(0De>GV|@0i)~RT@ zG-)*8PBWb!FMO~IMewa+r)aUcE8Fe%IW7WniR!`g>pWasiBH$lr}`%OcQ?nSD7aoe zd%E}j_mF@_pyLvYwsL7QhP_`l#@>2!>t$VM=TlYHTsh#FQHr3wq^m3DxNbb#U914r zMv_0u=qMz(X%sHGfsSKHv>RJhD9%fut})_Bi7!qOrw;F!d$0Gin)X*+3dg$aMWD07 zqz`{wTTg^M&fBa3`?4~7+ix!^c$}4i-m7Kky9?b|Q;dgzjnH_LS^!Yo@fxr#`>;7T_ohX+ zHJ*u#)%gpx{#M%ufKQVX4k_Va{VO<}cOl=Y49Mct*-w6f_R`c-m z-!!`_75ASBt?Z6+r<{piGgfMSMJAZJYa~hbf8YKPC_hRWEzF;!Q0=1th@$Y|=rYzl z>oUEgsK%$_AdEB>FX29=1d-bo1r$DC!+i$_`Uk?9W8mbS@kZC=d)>dlRp`WjtaWkyF)Zy9fIxxV9%+{70tiVkG@eS&yu@0W%Hs61XQFPi1tU2U!#7XXw7;t-M5kB*Qs*GC*7!Kp;=%khiV$TZUnJ^`s>B;@0_^jGt^EJOK zc9YfM6v>yff((V74N=kG5e#Lw><0`NU25zO^_s5TN=WgWCA4&j)A=AA06120R%Mc?;%M(f-BjGto*LUt2wfBFcT=dLww5$ z0W4O+plXICm)|jae-r?0{rx3J;5DL;B$GPX>B?m{PMmP?I1(kx|6N%6j5i81xp{wa zZvc;4dyn62r%Qp3;NX&GcnA1|s6N*_`#8J6uqY?JzZSu%3hI-R8M<2baM6A z`Fjy}Z^LYZ`w?}Ba_M>~U6SfBaU4c{$$)iT_p(Y)aezLy^f>X$NBq{M^ydz*C8fN7 zEqAb}bMt(HST;}z){||ozU;q`it0P$jH@U=1M1AO?78~pIe%ooOfK&ECaQ$VTRlZ! z(Serq`dFiy-lUmY*MpqYBRQ24eDM$PPDn0DoAhsqAr20;ehsJP=$yRUze_70URv<_ z;oK>e{jw5^bQikNlg-fo`(OaVu3t_fa$Kx>nf(c<{9o18B9^+&Lb^N$?*|zE$9)Y? zYctaqb0vG6o`Yi`tM89dv%l}U3~UK)*n5(6zoCewO}FBsqj%c#O7V8(&m%+f4*`Wh z&NVV}XE*E@z{~fw8FtLrZD~}VL%00+nrYBGMwuS%sQT~%Lsw1rA3BnCvgBzMC9zO8 zX?1m(LirS%r|W}89ER16DgYyr;`8IjRM!W8ixep_BFAZi9}D9n6VC$;vA_tVT;`~l zQL^^VX3o1M$9F(VUApvV~PM9x~@p#ZVVO}9k!MAa?J-_K;*6r8B%PXmI zd=6`Rbs5DYD#h_r9ckZB0C#l-6Pw`_3xgrUtan$28~`_8tZa~tDKdQ3`4E*h1O2Ok z`N0X!#DlTOTs$nD3;s^Ak$?MeBF`<*O6_Yzx*KyQ>}+~}P{yj|(yam^v45fj(JhE` zzB|a-o>cvP3&4{-ytt#RvO``+*F!SLV*saD1gHinV4?_KA60_0kBQA&z&>Y7ZX_jfvDFq?e%f*Kj!0IUsG~&{0;VwfSU7K_u};1LnCu7+9iO` zv=gh%kgKJrv;OJ-crk)`92}&?G*uoy)qb_JkC&f}gh2JmiWSg0N`XDp8%t$@!=N&- zh<_O+AU24H-e-?r>;c27dfn})~&el@l5|b+ms~qmOy*T5n8YqjQ)~FTzULF1Ny%WYZF+h(GMdgGBE6h z7bp3*wzre&oQ!i#zH=b9Q582oaf7fFmM(y%^R=es7*lih_os*I{X5fOzRB(_@5npo zb4PNP{^m;EY#aam07F%#NU~m}cEs76{?J;~QgBD_FTbSM)vGh@3F~;F0^6*+1&-0j z1y(-*NFP9~Psg5`nhM;<03h=;SKrB({}bDTT*D$oRov3_W71QF zz@HZc0IaI;BwW5K zV7n)DRB!ZSu@X_8_0m>>?M67ofk@ZV{4;>pkJCOSBI6PiVBW~Via!7_sc1j}0)JT|9@XT{x49g!9PqF=C|D=vew36vz$ zZ>2PIv^Gh)xmQs%VlnTCvKkU%KS$HieatgfV#s;=UfX#fc#w{duk?9dxS!vPki4v{ zzgi3RbYI27^65rJlc|$5-EDpr%{IFfr9XZ|5l;?2f#8w;+u)B7ftZsm&HxJuxPg=J z4yZOM%!xMn-(u!83+Y=%BOFkGcy-^a(R%G$3#pLs}?wR(I*_}3hbh$ zHroQ--1vSz{2&SN=tj$&Hj82G4iRO~zdpjU-8D+>$t$F7T5b4rUrCJ#!;IcC`x{nN ztnF!(;Zkbm7vHocjLp$lyaW)&$sOrR8FDF|lU5#5V!LEXD#aZJ*0zLl$+BqAa;0SY z$c8{_rceQyh=|+(i!m<_(}83)=WUe}B-P0Vfx-qCCo($H=HxvuKFG>vDcPQ0@VnWQ zts7}G+no|)UL9!Op2}@)0O)`51SSKbL}YC&>qE2 zcQRmmoHyH#I`OZMiJ$N#A=3#-SE!azs}DDC{bcEaOZ)X}*TaWD5kOd*Kg4Q55Q>F_ zQ^Br1Jx=G9SUcm_B!kYidh2q+?TBAuvMWc3oSaw0>Uh>?9Cn>UdBm)zUIr)XK9L9e z01Cxme&8gWgW<$HoUE=(Ynp)}FzAqlaH5>smfhgPO(z|$u3p2oY10ddstW1KzZD2C zieSmwmV+{Uo0xoYGu^VYJ*7__*5+ii+K$jf?ug{_^^eM>1if~{yKuQnmYt7xNv^J< zB0d?+elWAz@0L*kIxepFBtX96dbHpoV;Fe8G-e#2`;Y2C zv5}oT_ID{GuQOh=$wj3pZAjo(PtTT*@>2*I_$55GrV!z!K?9AcS^D*yzv*ezAsMQ` zu_~b7Q*X!ZQfbvX{Z!+;6*Wht1rxF3%5}cg5f?a><5Ql?->l~%yOcn}zw^jpovLUu zH`d=}GM^$Oyj-Yf5P|is1#(q2K2}u+yXUWbY2XAk8amstS*A1~(CfS@X8KMHOFt`} zH|mai-#R4lH^)SCjGa&K&&{nSO+4A?*D4XyDINnHtgrQ!xVt-K8aoV> zWH7$KIw<9TEOmOkTgD(XJEwo$c0Fu;c)?F#rEy!vYI5lUx~0GJ2zYr9A*|9~dDBH0 z``3p?f8uNKYK{B+K-PH$6Q4+~XsHaZ+&41RHLWp4p>$d?@GCt^a+am{V^{s1J5KL8EssbRjKy zSWaeM>~aEl7s6Q4_?$3qCY9w59;#Z$)#ReLIjuM%J7E)CA35M=b1zj>g>u<>5aZ4! zEMF2OaInqdhq_{Laq)W+JTI{r?DWnn3Q60ZI5E+kZ~_Ub0ggtHIgrzY^4XSg7;TEt zV#TM^PMu#J8nKm|B!2T+*aIT+n0S(_dojNZdVxX&n6p%|R&30wJnK);*ociL&19MC z?fBWb-b*1&t{l!Ybh(DT7(fcF=U~2j7j0SoDI?N(;079rimy5^90B6TRiC!j-Z~K$ zub1MWBx^1vlda9P-nTi$NZ;fY8%tfvwnZd@Vv0gLl`ibCCaaZ4#I=6vHtHz*wQKLP zL<*WAPKI8WT}Sy7e;D`uCj0T#`b7DLIKkB-$IUF~=eyb31FXIa3ikFz{2O|q+RiJU zO-Pinn|n0m2HtCM!>^&xj~>X1-bzy~m8Wv%7QwE}X30(cE=2;pOR4((+}7z-gGCEh zzlXt|F38UIonwz*{(O~5rA3vDUlv_M zn=3FC<=kEN5LO#bwTU!!@|dFr(re=S>FMoShMEtrOR0ldfe;3_^;Qn#x!H}!F5Qb$ z$tvMjuekXWNXu0z^iTOe3sE^nan*v@2T_4|{qwDLEZ!f(!^5=;fkBL{EhD4m{P&gm zufbL~CUZ1~eHa|SKUtmmT`IV}yu3xkZN`syp)`V^LCQEVp^U6 z(1wP%R{}ZObsW~yJ)3z`3w2d;aeG@u)9JT^CSw+9tyZVxL?$N0J8XW|PUlkW{$-sa zZMj=*PDwduzZrKHX#Au>tAkGYd!F>qd^Kwfs>$oIXE3Jf*cN-U!+c5LY|lq($hNSX zUIe<7h*(|s@>E0}>+PIM!<5SVuFWgyHF=d#)6gh!2e&UKC*792JnacZUX zepM2Fv)0Q1=*72V#uCo!BurSgtBTFB?2J%)*Q~6Pq8NWO#us6nw`JTo3AAiIhznWS zfH!INHf&|4LlIf3uCA9fG?61D(20b+qLlxIQLc>4$v=dHR2$@}ys5Tp#iH5h9TM2k z1jGcgt**BSOepD^Fzm>A{NqRJRr`^eUi-l=1+|Y7{Y5{EGT8f7+P}VVbM(ysOZ_mC z@-vfbP+)dtRIu7halp!DL1XrI4OS-xn3RIkN|cMN(3WM&dLb@06CZhblHgpc|Lf1I zo&xJ)YW=xj!nQceXL*0*?4&b=)*3Yc;VwvA$~HL&QtcC2uou$9cx_(yVGvNr5p`~Q&rNr!!ZAGMfshYjy!qY~#*U8!gtd>|*iX0!CFP<`JDUgchWnHpZ8bR0P=%!)peAv0vNc_`I z4c->ZY}MNJj)+XJ!%Ko7hlOZr8zZEbfZGxwYIh|>qH}awcqe$jtPX|c z&TO|I#(+?g%!lFKsH?SP!v565-LjB=5Gr1Kqz9=xn^~Wai(ZTICirS&1@? zpB9%Jl`jo7Xt$CXenKQy9+3g<(Vq=%jYGOlpNyOPH$m(-BwjU+Mrnyg*ah9C2eO2Yk4_%$R`*vjw?;3JsI%Ij{L)dZya+ z>#X8x1DCE&W70w?C!8alH}u`8^_K!dLhl*p6n#97q&5*7b|_q zS8jp23cTL44M)C$(m5OS;d{PB?62UfoQxFB-77~gwlsu11drD0gws&lArU9g+_SWCW z=l26_f@kd@d5;9VIZU?$4_ypY?IGnQ>d!4W8FE^S)G>X!H5o4%YE^0&>f--o$;|fV z=XV+}bd|mm8zH8+lgnXydYItcM1k4R-*WzVfRF9(*zU2K+04ixN@|4t!s=g+&;0 zbf2g~X51(wT{8L`Q#H?h$UZ(jpF1~h=Cs>j%k5{y-8+p0Rz_dPZCO-G-F`zqyO+Nb((`Z2S$uQ|N@o|8S7>SVH0qyJSjsn%3HqZ5 zpfgLQd#OXYFC<9XT%T^63oSbgWGMe0Q*+L*=S)<~_|azLBAcW7($0%nr3`Cq$BKJr zAUOz9+b%0cV%wf7Cu72Hpf^{t36WQd;s0z!j_-}m}9Z0zE%2g<-EP6Fz3MwA;!v6h0FHK;UtjgjNMz_aCPh#2r?$U zR&oNF1$8n`gKPB5>*}zBH+L^0`vAx}4~c+Lf7A*uiu%VwcDZ>YGvgOT;Je#oXMMR7 zhk@-@f-8c_D@f*!SkVAqL(Oj~F*5d#VM^A8@|J%7F)M z+r_`uM(4|y^XJ}ZRx`CSH#Tmn;vk5k9pd9D@@M3dpw-GNqwB!YJ01MKXK#0Xkc`#j zwf5kgaleoR@zralrWwjS*1Jx7j!A{I!ejt$ti3f-)4J(AxOo0U5O}fG8r_|@0~wU! z3464g0JIk}#7nEIQuC_O-0SOu9=@KPWxGKa{Nlj-1ftp@dadkO^2b_p->Nwu^k4I76* z@Rgabr+l7i&~mi)f^mOd|GoLKF?q&qOleVy_E!Cs;c|>Zd+{8$yc{C`yKSXPm-qxU za=G*A5NGLlH2^t`$9~Mv>E0=pV8!CQ%mIjR|(hh-F*WnM7LtCxCKf}ErixnTcZ!_JYMtbE!+(UQGmA3P~Np{&4 z%GE_&JSj52N<(>EfCl;R<5s5iQN5r!*Yx(3#Y)7tA&u4%W5pGSZN#V9>u*T@iv-^D zJk-T>XH8}zg4m;Op{uf!ghfQM-?aJA-nz{{R6woxTEDZ8D-y6!S=txZ^6Ixa^<$Hf zjb&?@!rW=V+&wTng%QhBRyw`z6H=r7`9tHkRvqPv^K^ZN z8+5YEwzkM=K0lNH_Cd?eUbYiQ zd`wp@y=`bXeYIM(A@)7S7l0Xzn^pr!zLKd`VSk2<2b?yRL@V(TR-=%(4xD)89W{S3vrmp*;0swb_ZRcuCR%L zLF+BJGH!{Bl&fhfu68X*&%dt8d0&UU@) zXI+2|8Y(naYh4DL3BN~5?b@$0c0SROWDxd;$Qg`W1Y5$_zp7WxkF($2Obd1|E(ZTo z8!A1X4olFnv&;GT+;_Q^V{8d|g{?wr{qI48BO5ik_Bm>UMh`g9+zuRagN&HeaEBPi z^+!NDw$wK`GBT~w)strsVW>_5iz_(vi;SDcX)EKZi!Gww;T3@YPm_n3GbKW?i*@Pp z)i5aHSeYzmT;7f$)^XSkp5@7Em`7CA70rn0zFeL!%|3CA?#;<^mcLsi_>!9tQeaH} zi?DB;yUFrQM@Rq8#0qE(TP^&G#8Ts`R@=(wA3}YMhTn_`*!G@c+(#s+ojuOfR%(n% zhMni(!Jh~lF322`C6nbDJ|$_**vcC8e97*+Cti*!5Z#*Y+w`=zHu{t-pA?JGe3oh8 z@7l3FkaE|^DxJqg%w))?VS+wb4ov&e67En^&0~;|X!q;qG|_oSj_eT-7->wht#05!VsHZRhphGmvXU|eKq&`K$tJ;>3%16yGc#;ZzeCC~j>ma<9QLM534oIC zK|T4*=$lyoGIdg!gmLLki`gc-zGIzJ|K9eh$?M7o4Vx8+%jof{RY2vVzrO^8L+}3Q zG(S3Yn*VUz=jy7fyuR+khQC|aIjLh=cq$r+LQJ%}wbRGOIQQ-qI}a8<&3t+uDh*V` z$T%gpZH(J;^j!fp(1Y#GE%fZXae`@CasqU#O?D32(2eQ6<~1xzk*m9wtKTmS|D_AK z^QpMFc;FOy!gqIHJ<~_AYfm2CW*+*~c)2Ml$iaGZlU;gQN9;mdNyt^)<`PCxAuh{J zIpuyzkb4*eu@bgcoklxj&0qPJ7Z^_eok{&LUzWz_ux_xuM&Z$QDQ*~@Ffyg_5l)Ht z>`i_0vppe0)Y;vsp>yeQyud&;@CB;KYb+T(wkr{OeFc7H8;&0GX{s?Qz%^~gh#pH( zu-@7DaL%E0g9vbm&li>n}$=%zNRwf`xmw6$eEv zTfC&n!S6`ot|9k>JNl;{(#^vkZ)3!!9kk4nVZ)c|sAL+igK^t3nIu3^P7(k@*>}1tv9WF-*e}fCT#KN z(x3&>_mY0)2Sa8bf{VgPY9S43t;LT@5(Ct^-qJ`7z!b{^QXl}6WdM970UogDJ`?AE z{NEj*>TLgJbPu4pg9Z(TyFN*XF5-}+Ux-Ke z4DOaU-BDD)5oa+n!)6ysKOhSJ6LzCl975AN4SPb^m8rV#BSS;ti?1y78b9Cf9#c_P zZp$@P07`?v9?dO4kGnudmJHDG;)nHkFnOocMNS<|ov;shlQd}LV1v{_y+#SruXVXP z_v8y;7!=%7l!C>f94@LkKT~^}V-}p`2o>%`k>EyB3c3WZCz^Si5E%GXSs5)$)rzGN z;mSn0N>|tX_PcR#@u>R45`UEBYsfAKQB!z(#$0|p;#Wp84L>p`QI8u322^DP?8~3! zo2yk57iDOk@E{7%xaCh@UGW^A5J19c(DyE%wtH7=GuxvbvbMU~U}^NA!+~epn2qcL zc*XF#a{65_#ug}Y0H1(hB?18V>T=xOPh7f)ih53g8@EhE#~dd;oZJ5nF|Ox+eD4>- zB3U-bYaW)RMUje#ipuKgC2BkW{_jr2f{iNR@ z0reY54=!B3tf$DKQ-3*4rI@3)06vR<;)Dnm_*>i3lsN00y{_JuzI*pBXPPbG{Z4ge zsO60scBKC9%G6|9?#(ytEU{b8(W*HY7aQA`GY3#&z+A!GyM?S_p`|XAYl%P$F@AbG z`+W)t)oN<(cZ>Wx3lER#16TIhNHb+D;=Fkr#5Y{;)rB79@=*a-;eqaP>DqWb6BUlX z2CJc65ABbuYrUr9mp_NH8wP=#M`~XB8W2EA1hD5YBKif6eB<8u=H}+B`5{;=LcXcr zk*a8yt~uEf7kb}P$7h?vV&qxF=ljd?s|m5O&>#O8k!FyB=niwpUKdjO2VAKlBqAzJ zvp<58l0C?~yL%uCk~;rwpcg{iIsVk(VLwIQtNqmXS{XI~+#+6k0HA;2EYkMn zv1ePBwn*Jlre<}m);%NqiOb z43j&id$4n0+uj9`#&#JAJ{sWOx^g;1#SH34J{i};<1l78t##`n6Gk(WYcVPeB?ky) zC^mrUD!~U4%6!} zG#28?l11I350FJW0}tp;!6OgC*?m+|0JoE^T?AN~oNsf1lZCN0jMKDneeLhxzgZ1x zgy|}+r4F`rD=-TdDiU=;Osg)qb(f`ug|A4}7kCi&N^NE_-k0wRJ&BQ$)=4z__U05k zZ9tLrbdWA8?V8O@m!I)o)yE!hh{GErL*11+L4$@uc$q`X7oczTPdmSW)7;YHqBN9S z6JO;`MU__}H4RZ-Cy9w0Fa9mMWtg8u!D9pGRjy9!zRTZg>i`(uq{mrR^p=dz_9Zg1 z(BX|Ec*nJRBjHntz?u!aTnaG@YqJah*xKE5vC&0Dm9Rji72wXVR>L}BxT{C4l~Jf2 zrQat=M6f+M2IzkxAOHK*L1Aswu_-fCCA9QLRT`p)qE0Wat(EC3LhQxQn8mPwNx6*)KtaU%6@4W{rT5ux{Dft@7jW68ZWf84&9sQmRs9^&6HV2jDuxxN|{IP0Z#G zc7Xd&kan|&-OtYtl-i(Jo$2ZDQ5$3)$TMB4w4EEd$p6LMqv{VUUr~}rAt)bI*?kQT zC@ld^g9UZ#- z^C+S`C96Qcv-j?JhnM7m4rDj%pu2VJ38;Zh)p>7Ar*9g&CK*;P#L^0>0{MpJmhJ&r51; zU_aW+U0jU&i`WOJDR^I+$gzDXGFm1kk&DqscP;X_7!ke%2g~di-yZHy~qZljGMjF034flwKY{SyRF;>XO!W4 z^*)yHG)i&;3NU}YytSO2WDX|vUtBPPiRM81=t5xkLGH5+>PRtV7Jmlmj#va;);Lk zUC29*K|a2)0^C!RNe?O-v|FUTD1?Cj8#`tAq2nn0wNirr78(P~6BpKiydQO%T)?^H zi7#dN^faQ^Pf$5Z{#jiEF$7wb!m9pR|3U>QFF6oE4+OZ5?$D{vY@3z%kMe;kf==&dW>PwE`O$uPYl%}VC& z;p5W*$kj+2q|)4a+GX!2A)@iTzOz*rV2Z2l>{Nh_QExlW4mC;!b31Pl-SXP)D7*H( zSGtG8CHc>7E%=p)XK%Bi2l+Tm=7vajPnRU={)b$7Dzt=U5-39`_!C_2q5roy72ibE&Bnhl0+a5so0+MKkZj3|ICwSLk-Yp4>ltdRr z9jr@K-+$i`_Hx*TnkcA~4GeI^9$u5wAD$P9RbW?o63_mVu2JH{h&hyKK}L!DZB8(C zDYp&p;n|w*IMnc~Qmy+?>o3Uo*7To%X28m$uq2{Ii=3P zyHTXjgc5fWCFxPGwvYy8c=x!-*%mUL|GVqC|LzLLUv;?3D~K9ugFmoj9EESkHSd<5 z(EIao9H}$i5hX#SV9pt> z8#%&H30vgTpGSiP1Oi5ALbS-Hc4ZG3WXlFz!pS?3w-Y zcdzT~F6)uYkP;Ke_U*-mS&n|IV2caI(p=Z&={}hz z{Zv<>ta$EKYMHHAc`tHL+w$ce(KMdHS9nprH~IKB+jRHth2#J@(d4OMm;^r=1qJ=r5V6i#5Z@&Iq7Co3wx4j`H zTng`z2k&7~Z;I&O?)e}t#DjS$&r`_3FyL%Gkhw#49lt{A@M{~N-XMzf&hb)MTQn9K zBLB*7IU#T%FOMESAHh^ORZFVF_MFjG^UT3>EuKG^K`Ez)ITFq@Zi<^e0yz*^xZ^R? zmHYJN@jE}N+sRFfcHTvNC@8sU;sg+L8A@i`rfkLTk8T9uCJ*9NHVOWlHvnuJ5 z8erzd{rl#G%eG)6 z@9=3)5UHDQ7EY^gAgiC>(HGplo{q*c8meNOT-Idx$q}{cI=n#Tyc{;TQ?+kgy_}pf z)^-C~aJIBcM^F{|U-c&0(OA>8J)WT}6?Yge7B7!S;xsr+yMw3;hqk6gKkUom`D+LB z{M2Tq$DhQ>N)8(qvhnW1ofMPNro9G6W^qP5xEp-ahAf?9MSn#)nh*6^Nb6 z_i}qFG?C%_Ird?H>8e6}8q;@bh^TCiLXQ6Pt-!Mwdfwt#^LX@6)WeCr`8~@r`_6u} z@_Xd|sCTdTRj2yZ+yCzYF72(CReythPQTEev0Dn0@yW`{W^_zxuV^QvI%|w(b4OQT z^d%v3723mP5eFvJ|Cz2&0-X6yi_0Ng=C6MuLwpiW%VAQRmOrQ%vFF^XmRdW{;^6;w ze=e^d&ck>_R{?zrzk?+<*2cnku4Fd|5f>ylsV+-*vDmU#VXoF~nhL#C`_{%}uP;G{ zC#mW$GK7jVXZHo^Bi`(Z<&Y+)>uG7*SZYpX7nK2r{$h)Lb|Amab)ZZvhQ;!WUL(1NJAaW&t#|BRL!@*mFKkak&e?QQBT{AmOLxxg zkF{AMvn#x}%tC=u8Tag*!g*vx#LLSrH7ee5G5Nor?#{t&B-_uEbB=cO&a+)WPJ&#< z#5q*;#$Ck$SYgi7?0hG`-&|pTe3gU!AnqLV-1oN)dJa_M1tc)H#}#jxB#+^eSjauxMA2eW7< zEv&$R`=-{fI*^xYhvwgSg$qrx9#^^s--`;CcFfxvU>`O9%L;#@E_WZ!$A?$q*UrZv z!b)?Zhhz+yw-cQL(gU~n5&Pr%`#_yke1wgJNa>WdP{?Iujj9qr8+W%ZSJ_ zjfPI3?BEsSwZCm$U&t{%*^V*9RkSz4$ke^MGYuv7CLM4s)0VDatn3D<${9LKRvVBl z_;`QDr4DDD{;s5#JYCy(6aV7byNEsa(x3=eQN%UJ?8Zkh!OrC@nJ-dq;bPT|Fn{;< z;H#ns1ErTcoLNwc^rk7WSiVjZc#0)@(F|W;E-L8EKn@%*5sg!(sWoFvz4p64<$q@t z#*NDdKO@t;Z}KnSJeb$d7k_HlQf~bA-BzL5eK(z9`DK4Fk~}uEHCyhKb-RY0t34)D zP#_IMG`_LFVZ~EmO6@FKWeT?=99nydGD`Yu4B`Dd_j2Zp>u&lA_`#Y#$RMmCC0JE- zZs=_(S@BK^m(`3$E~0+=KnU(=fPtaKt(3adfI>NVj`iKeVv7c)!Oy^O`J5U)%!Qx) zRyWt*FdN3NTO+3seQ)mIGqtvze9iL)GqAaW)Ryy0tI!z-Q#k0fg^ z`f2vuE2=e~N|RBKQGL}Su1gnmxC)73NO!gG{O*3eX_@`<_cs`4z&Eesp8Hn)D(8VN z(ro2?;(IBACj0#IH0ln)1<(F&mnc4^{Q3IEekMD!-J5s=8TYtZ z@%Q!TW#R)Ft@4h+*Z*J1Dcf7sAW|2-y3Aob5PHISWf*3P32}0b)pknGV~=p@Bf2t; zeO-IC)DTMzGZ^cQa0g0w|iH{N-Qq4A!) zMKo0Y{J7o7BJI*bjPJUqvA@FWULMnOnzvVoE}nKh-vW+#nCa&9k->)~D@Cj>197`Y zbLnLoEq|Zj4F>1&uP23mf3HpbpH%Q(O72_UOEK38)#3EuMfQqo>!F4#usu`^V+ncM zv+FL+^FPX40&?(!8yX(Jy^?;1#OrdLzAiZjKcZP%=J)kvXnxs!7{umAa#NtMY2;4V ziR>i`7ri4#xR?)}yTTpHO~mTGC2F;tc&ip)x_hbn>tcRLm{(v{R$%hZr)H%; z9$VDd^kwMLHkmtxTDUj9FU~UI5PD6{k_4(Cp3f+on2^(*v$sAAfa}}mOm5ndHm$lA zP*|LI3Q3M;bI}+aqoCo{BEieRWT{d|aoQr2w|=FsfGc?&(C>+!-e{-pF3vTTVgs>! z*W~s@7yP)VZT&57cxZsW6F@qW|F1ua&w-{oI3n2~*H~@+ zPYWqG^XM!WAG_#8rFR)i)peZF00<>qokx$R=q7olb$}a9f{A(r4c1}KBjI2w_%Zm% zG(L%%lM(JOI}AC0Z6e`qe5S59J&4ec4}DSdz^m&I)|fnuVxQC&q(#4RgwHXF?u8YS zKq=t+8f)S7$c2D zD0=KO7+)o`ggwRUvjX(?`e;=A1N|Xe@-_fwX_uFlj}o`l3&DU@e7Mo z*Hhn?QU`jhwXd2D*%4mxVz7_$TH>CMa6Ch1^w@&~s?Rl@X!&Hm zG@O)99WLI_M@pM82h#8#og}qivjSEmYs;GnPC;LiQ>(7!r$Ls>J?_c9iGU8Imu=47 zT?}1r9;vzV#OVegsdhpuAw2tS_&WfZfl1Tk0`JXn?*BArQzU=ko@Qzno4cqRd(Ixm z%Vje+wBin3!&&x@%M88pS`FNEj_f+ctTGttN-$LAys)4Ui|vcsPQi#ZJHIz`(&gI6 zu1Wq-#4pk-24aEYWuom^;?nYvYQ-E{bS z7hV`}uDRDzlz$=um`e}*Dm-{X1LAS#eEez0`^KPN$-I5UAn(6#`b-6R^D;pL(a70E z`uV5bd9qyiVZGrIOVE+C=_!t9v5$5;!f}KyXdrPUb^@4~=w6zG84RdG!MS_w0Hx`& zBx#WKp*Ii4h~A!u!$q^31hOBNy0N@2sWkc5tyLs>jTO8a_!_3!>$PxMUw>mVv(b~u zoE|&+Jn#nxbL8;{$s<@O+%s^H!d9KLedB#YJZd^HSb=9{ZmfLXTdNbWD(T$sZ1B^0>8{7+*5Vcr&;7<9 z8h6+n0pb@zSN04f=1?aCB!JCwZg@!?bQ)Uc$||}U4W{^C{)uo;l+2|3PEf4x`j;!_3-#uaTNz}o9Ngjrh)yJ&Q7`9N5M^`OfwYb>9SQ<4He%;w)QUFp)jSh zWL-uCK9GxBAmVwDdYHT185Eixm&@}66<9G4$Q*+0Czvk-8zKvVv5=CO)Kf+>S8|P! znbCu3YO9)4ejj{a3V81tV`(FsJVBDJD?kaJRpdad*ofkzpjg-@ z>Ua>b+_pdZsM>@E{e9>P55_*(X&xC<7V{EPS`uxzuIM7 zP0?Ku540FT3SOrxi zeyMgF>R!)q^TcITmA!$NQ8K&hg66s+z0N?curKf2Jsg*Cq&lftsnVVwd?0643x$v13`57}fP9s+Rv z-T>X8o~inQ>~{@(PYY1NciS}!;W;tDN^iE~lV42ffhQbnejc-sH@S^KO87~n&w;@- z1|%6!t^!i@%T}q;Uto?s$Dz44Q!qsQWSHuMEdkdLfFDf`1cV@|XFyRbn~nFu`l}%L z@8Tdl9e6c4%erB(G{S0eXf{jVn8SC&)SL*s^xD+|pap9Kmca=-q8NB;{R_6A4cMwE zTa$vd%g_!Yq=?h$Vq5P!~k;DH{U=i=`X3M0Q?qqOZOu67k+(f#bzFz z*m$;raWS?-nVyWt*BxOy=Yi$qw0UZzCo14i2*_i79B971!^b@Xelgror1CzJYrzpHWg0S20Y$3-Q~@4;zy7585`=9_ zjD!X~3DakPAM!`62MC(Kip0S)anbeKwRSNaZW@OJGABv7LLN4LF$8ts#`w*=djj(T zaCD5a=?Yj{e_#K}3Em0>g>EIA=N^!6inm7Z!;%mdG>ZaNk-RT4(~6z2J)$$p1q4@s{NBwYUxAKhTv1a&4)^)UarW}BJ>3P&S69Z z>_bHW^jd0^kLc~=Jp^a|dq9GmB(T-ZZ(rPE%J4NxIkq|~YL!)0aNYThWm~6z_5whv z>nPX4m4d{PupKS65d0`$JqHB*Gx=Gr9e>+L?^CLQ-NWTM3Ef$(tauElu3@2t~Y-@R-vTmYKN*v=}TMG-rR z#5~+%D>5FVAnTaw&}_Or6(g!_Ica)IxGdV>eVd6xhip{q;fjTbw=4PkI8Pg?3dZTl zpWwUfa@~y8_*~{Ut^{-~YjiE>Ngh|B$olgFZs*?73o zxuO{qcFgMP#vD4+C4r>rlok_Cv!Lq@tihc!T+RcJ2 z_w(`LX}Fv0C_&*tTN`Kyzx!u79>;^A;%ie38b0Lrpp5)YXY?8$^qpKy6a&!L=Z&_O zLf^>WY8>?S6?876FQJh9tv#df7$T=Gw?2n5PN9Xe^$zN@ZM}qYwf@}#^luc{_3&>k jz+w0|3je=RSlHawp>Vs{`7ixo_#kl?^)!mqZT|c(V~oAi literal 0 HcmV?d00001 From 190243d04d226ba2c00fdb0ccae526b85a9e8365 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Mon, 16 Mar 2026 16:10:34 +0100 Subject: [PATCH 02/11] fix broken links --- docs/guides/disk-quotas/ext4-xfs.mdx | 3 +-- docs/install/panel/standalone.mdx | 4 ++-- docs/troubleshooting.mdx | 2 +- src/pages/faq.mdx | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/guides/disk-quotas/ext4-xfs.mdx b/docs/guides/disk-quotas/ext4-xfs.mdx index 5543834a..ae511237 100644 --- a/docs/guides/disk-quotas/ext4-xfs.mdx +++ b/docs/guides/disk-quotas/ext4-xfs.mdx @@ -1,6 +1,5 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import Link from '@docusaurus/Link'; # EXT4 and XFS @@ -9,7 +8,7 @@ This page covers disk quota management for EXT4/XFS. Both EXT4 and XFS use the built-in quota management services in linux. :::warning - Please read About Quotas before continuing + Please read [About Quotas](./) before continuing ::: ## Configure Filesystem diff --git a/docs/install/panel/standalone.mdx b/docs/install/panel/standalone.mdx index 1978756c..2e0c9bb9 100644 --- a/docs/install/panel/standalone.mdx +++ b/docs/install/panel/standalone.mdx @@ -500,6 +500,6 @@ Once you've set the proper permissions, continue the Panel install on the web in The web installer is located at `/installer` or `/installer`, e.g. `https://panel.example.com/installer` :::info[Want something advanced?] - Make sure to read the [MySQL guide](./advanced/mysql) first if you want to use MySQL/ MariaDB instead of SQLite! - If you want to use Redis make sure to read the [Redis guide](./advanced/redis) first. + Make sure to read the [MySQL guide](./../misc/mysql) first if you want to use MySQL/ MariaDB instead of SQLite! + If you want to use Redis make sure to read the [Redis guide](./../misc/redis) first. ::: \ No newline at end of file diff --git a/docs/troubleshooting.mdx b/docs/troubleshooting.mdx index 20e1def2..10216ce2 100644 --- a/docs/troubleshooting.mdx +++ b/docs/troubleshooting.mdx @@ -59,7 +59,7 @@ It should say that the service is active and running. If its in a failed state r * `open /etc/letsencrypt/live/_____________/fullchain.pem: no such file or directory`: The SSL certificate for wings is missing, see [this guide](./install/misc/ssl) for creating a SSL certificate. * `Pool overlaps with other one on this address space`: You already have a docker network using the default subnet. (`172.18.0.0/16`) Change the subnet in your wings config file and use `systemctl stop wings && docker network rm pelican_nw && systemctl start wings` to apply the change. - * `Error response from Panel: AccessDeniedHttpException: You are not authorized to access this resource. (HTTP/403)`: Your wings token is wrong, you need [update the token in your config.yml file](./wings/install#configure) + * `Error response from Panel: AccessDeniedHttpException: You are not authorized to access this resource. (HTTP/403)`: Your wings token is wrong, you need [update the token in your config.yml file](./install/wings/standalone#configure) * `Error response from Panel: _MissingResponseCode: No error response returned from API endpoint`: Your panel is not responding correctly. This usually happens when Cloudflare is blocking the connection. In that case make sure your wings ip is added to the Cloudflare firewall. If you aren't using Cloudflare it might be some other CDN/ DDoS protection service or your provider. * `remote: could not unmarshal response: invalid character '<' looking for beginning of value`: This is basically the same error as above: Cloudflare is blocking the connection.

diff --git a/src/pages/faq.mdx b/src/pages/faq.mdx index 9056fac5..9c344fdb 100644 --- a/src/pages/faq.mdx +++ b/src/pages/faq.mdx @@ -167,12 +167,12 @@ Here are some of the most asked questions and our answers.
How are plugins installed? - You can find information on that [here](./docs/panel/advanced/plugins#install-a-plugin). + You can find information on that [here](./docs/plugins#install-a-plugin).
How do you create plugins? - You can find detailed information on that [here](./docs/panel/advanced/plugins#create-a-plugin). + You can find detailed information on that [here](./docs/plugins#create-a-plugin).
Are the plugins from the sneak peaks available? From 04d1302a54dfb8c2c52e4f95745ca9c306f36bf2 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 17 Mar 2026 09:27:47 +0100 Subject: [PATCH 03/11] add back updating docs --- docs/update/panel.mdx | 139 ++++++++++++++++++++++++++++++++++++++++++ docs/update/wings.mdx | 42 +++++++++++++ sidebars.ts | 11 ++++ 3 files changed, 192 insertions(+) create mode 100644 docs/update/panel.mdx create mode 100644 docs/update/wings.mdx diff --git a/docs/update/panel.mdx b/docs/update/panel.mdx new file mode 100644 index 00000000..1f616393 --- /dev/null +++ b/docs/update/panel.mdx @@ -0,0 +1,139 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Panel + +A brief guide on how to update the Pelican Panel to the latest version. + +## Version Requirements + +Each version of Pelican Panel also has a corresponding minimum version of Wings that is required for it to run. + +Please see the chart below for how these versions line up. + +| Panel Version | Wings Version | Supported | PHP Version | +|:-------------:|:-------------:|:---------:|:---------------:| +| 1.x | 1.x | ✅︎ | 8.2/8.3/8.4/8.5 | + +## Updating + +You have two options for updating: use the automatic update script (recommended) or do the update steps manually. + + + + Simply run the command below and the update script will guide you through the process: + + ```sh + sudo bash -c "$(curl -fsSL https://pelican.dev/updatePanel.sh)" + ``` + + + #### Enter Maintenance Mode + + Whenever you are performing an update you should be sure to place your Panel into maintenance mode. This will prevent + users from encountering unexpected errors. + + ```sh + cd /var/www/pelican + sudo php artisan down + ``` + + #### Download Update + + The first step in the update process is to download the new panel files from GitHub. The command below will download + the release archive for the most recent version of Pelican, save it in the current directory and will automatically + unpack the archive into your current folder. + + ```sh + curl -L https://github.com/pelican-dev/panel/releases/latest/download/panel.tar.gz | sudo tar -xzv + ``` + + Once the archive is downloaded and extracted we need to set the correct permissions on the cache and storage directories to avoid + any webserver related errors. + + ```sh + sudo chmod -R 755 storage/* bootstrap/cache + ``` + + #### Update Dependencies + + ```sh + sudo COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader + ``` + + :::info + Even though composer might tell you that you have outdated dependencies, do **not** run `composer update`! + ::: + + #### Create storage symlinks + + ```sh + sudo php artisan storage:link + ``` + + #### Cache components + + ```sh + sudo php artisan optimize:clear + sudo php artisan filament:optimize + ``` + + #### Update Database + + You'll also need to update your database schema. Running the command below + will update the schema and ensure the default eggs we ship are up to date (and add any new ones we might have). Just + remember, _never edit core eggs we ship_! They will be overwritten by this update process. + + ```sh + sudo php artisan migrate --seed --force + ``` + + #### Themes + + If you previously had any themes installed you need to manually build the panel assets again: + + ```sh + yarn install + yarn build + ``` + + #### Set Permissions + + The last step is to set proper ownership of the files. In most cases this + is `www-data` but can vary from system to system — sometimes being `nginx`, `caddy`, `apache`, or even `nobody`. + + + + ```sh + sudo chown -R www-data:www-data /var/www/pelican + ``` + + + ```sh + sudo chown -R nginx:nginx /var/www/pelican + ``` + + + ```sh + sudo chown -R apache:apache /var/www/pelican + ``` + + + + #### Restart Queue Workers + + After _every update_ you should restart the queue worker. + + ```sh + sudo php artisan queue:restart + ``` + + #### Exit Maintenance Mode + + Now that everything has been updated you need to exit maintenance mode. + + ```sh + sudo php artisan up + ``` + + diff --git a/docs/update/wings.mdx b/docs/update/wings.mdx new file mode 100644 index 00000000..ff1fdcb9 --- /dev/null +++ b/docs/update/wings.mdx @@ -0,0 +1,42 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Wings + +A brief guide on how to update the Wings Daemon to the latest version. + +## Wings Version Requirements + +| Panel Version | Wings Version | Supported | +|:-------------:|:-------------:|:---------:| +|1.0.0+ | 1.0.0+ | ✅︎ | + +## Download Update + +:::tip + Updating Wings **will not** affect running (game-) servers. +::: + + + + Since **beta9** Wings includes a self updater. Simply run the following commands to update: + + ```sh + sudo wings update + + sudo systemctl restart wings + ``` + + + Manually updating Wings is very simple. Briefly stop the Wings service, download the new Wings release and start the service again: + + ```sh + sudo systemctl stop wings + + sudo curl -L -o /usr/local/bin/wings "https://github.com/pelican-dev/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")" + sudo chmod u+x /usr/local/bin/wings + + sudo systemctl restart wings + ``` + + diff --git a/sidebars.ts b/sidebars.ts index 97a4c1e6..a9076a54 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -61,6 +61,17 @@ const sidebars: SidebarsConfig = { }, ], }, + { + type: 'category', + label: 'Updating', + link: { + type: 'generated-index', + }, + items: [ + 'update/panel', + 'update/wings', + ], + }, 'plugins', { type: 'category', From 32ab7e76481bde59b349cde5b258b24d05a7b30a Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 17 Mar 2026 10:20:24 +0100 Subject: [PATCH 04/11] reorganize docs part two --- docs/comparison.mdx | 9 ++- docs/glossary.mdx | 5 ++ docs/guides/database-hosts.mdx | 2 +- docs/guides/uninstalling.mdx | 2 +- docs/index.mdx | 51 ++++++++++++++-- docs/install/install.mdx | 34 ----------- .../misc => panel/advanced}/mysql.mdx | 5 ++ .../misc => panel/advanced}/redis.mdx | 5 ++ docs/{install/misc => panel/advanced}/ssl.mdx | 7 ++- .../panel => panel/install}/dockerized.mdx | 11 +++- .../panel => panel/install}/standalone.mdx | 21 ++++--- docs/{ => panel}/plugins.mdx | 5 ++ docs/{update/panel.mdx => panel/update.mdx} | 9 ++- docs/troubleshooting.mdx | 25 ++++---- .../wings => wings/install}/dockerized.mdx | 5 ++ .../wings => wings/install}/standalone.mdx | 7 ++- docs/{update/wings.mdx => wings/update.mdx} | 7 ++- docusaurus.config.ts | 2 +- sidebars.ts | 59 ++++++++++--------- src/pages/faq.mdx | 10 ++-- src/pages/index.tsx | 4 +- 21 files changed, 180 insertions(+), 105 deletions(-) delete mode 100644 docs/install/install.mdx rename docs/{install/misc => panel/advanced}/mysql.mdx (97%) rename docs/{install/misc => panel/advanced}/redis.mdx (95%) rename docs/{install/misc => panel/advanced}/ssl.mdx (97%) rename docs/{install/panel => panel/install}/dockerized.mdx (96%) rename docs/{install/panel => panel/install}/standalone.mdx (97%) rename docs/{ => panel}/plugins.mdx (99%) rename docs/{update/panel.mdx => panel/update.mdx} (97%) rename docs/{install/wings => wings/install}/dockerized.mdx (98%) rename docs/{install/wings => wings/install}/standalone.mdx (95%) rename docs/{update/wings.mdx => wings/update.mdx} (95%) diff --git a/docs/comparison.mdx b/docs/comparison.mdx index 7f399aa6..75139bdc 100644 --- a/docs/comparison.mdx +++ b/docs/comparison.mdx @@ -1,3 +1,8 @@ +--- +pagination_prev: null +pagination_next: null +--- + import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -90,7 +95,7 @@ Pelican is a fork of [Pterodactyl](https://pterodactyl.io). However, Pelican has -## Comparison with other Software +## Comparison with other software | | Pelican | Pterodactyl | PufferPanel | Crafty Controller | Multicraft | TCAdmin | AMP | | -------------------- | ------- | ----------- | ----------- | ----------------- | ---------- | ------- | --- | @@ -112,4 +117,4 @@ Pelican is a fork of [Pterodactyl](https://pterodactyl.io). However, Pelican has #### Features information - Plugins can add any feature that Pelican doesn't have by default. -- These values are not constantly updated and the others may have implemented some of the features marked with a cross in their latest version. +- These values are not constantly updated and the other software may have implemented some of the features marked with a cross in their latest version. diff --git a/docs/glossary.mdx b/docs/glossary.mdx index fd0972a9..9865c514 100644 --- a/docs/glossary.mdx +++ b/docs/glossary.mdx @@ -1,3 +1,8 @@ +--- +pagination_prev: null +pagination_next: null +--- + # Glossary **Panel** — web application that interfaces with Wings and lets you control your Servers. diff --git a/docs/guides/database-hosts.mdx b/docs/guides/database-hosts.mdx index c0388c82..f35ff163 100644 --- a/docs/guides/database-hosts.mdx +++ b/docs/guides/database-hosts.mdx @@ -33,7 +33,7 @@ Open `my.cnf`, add text below to the bottom of the file and save it: bind-address=0.0.0.0 ``` -Restart MySQL/ MariaDB to apply these changes. This will override the default MySQL configuration, which by default will only accept requests from localhost. Updating this will allow connections on all interfaces, and thus, external connections. Make sure to allow the MySQL port (default 3306) in your firewall. +Restart MySQL/MariaDB to apply these changes. This will override the default MySQL configuration, which by default will only accept requests from localhost. Updating this will allow connections on all interfaces, and thus, external connections. Make sure to allow the MySQL port (default 3306) in your firewall. ## Panel Configuration diff --git a/docs/guides/uninstalling.mdx b/docs/guides/uninstalling.mdx index d566f44e..8aa5ecbc 100644 --- a/docs/guides/uninstalling.mdx +++ b/docs/guides/uninstalling.mdx @@ -62,7 +62,7 @@ sudo rm /etc/systemd/system/pelican-queue.service ### (Optional) Panel database -If you used MySQL/ MariaDB and also want to remove the panel database, run the following commands: +If you used MySQL/MariaDB and also want to remove the panel database, run the following commands: ```sh mysql -u root -p diff --git a/docs/index.mdx b/docs/index.mdx index 5bb8daa5..9bf07503 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -1,19 +1,62 @@ --- id: welcome +pagination_prev: null +pagination_next: null --- -# Welcome to Pelican! +# Welcome ## What is Pelican? Pelican is an open-source game server management tool built upon [Pterodactyl](https://pterodactyl.io), paired with Wings, which runs the game servers in isolated Docker containers for maximum separation and stability. -:::warning[Reporting Security Issues] +:::note[Reporting Security Issues] If you notice anything that raises a concern, please create a [Github security advisory](https://github.com/pelican-dev/panel/security/advisories/new ) or reach out directly to **team@pelican.dev** For security reasons, we ask that you handle security disclosures responsibly and **avoid posting them as GitHub issues/discussions.** ::: -## Core Team +:::info + Want to see these Pelican in action? Check out our [Demo](https://demo.pelican.dev)! +::: + +## Installation + +Pelican consists of two main components: the **Panel** and **Wings**. + +The Panel is a [Laravel](https://laravel.com) web application that serves as web interface for the user. +Wings is the backend service that will be installed on one or more node machines and serves as interface between [Docker](https://docker.com) and the Panel. + +:::warning + Pelican is currently in **Beta**! Some things might change/break between beta versions! +::: + +### First steps + +:::info[What is...?] + Not sure what a specific term means? Check out our [Glossary](/docs/glossary)! +::: + +First you will need to install the Panel. You can choose between two installation methods: + +1. [Standalone](panel/standalone) - run the Pelican Panel directly on a web server. +2. [Dockerized](panel/dockerized) - run the Pelican Panel inside a docker container. + +### Node setup + +After your setup your Panel you will have to create some Nodes. For do that install and configure the Wings Daemon, either on the same machine as the Panel or on a separate machine. + +Similar to the Panel installation you can choose between two installation methods: + +1. [Standalone](wings/standalone) - run the Wings Daemon directly on a linux server. +2. [Dockerized](wings/dockerized) - run the Wings Daemon inside a docker container. + +:::note + A Panel can have multiple Nodes but a Node is always tied to just one Panel. +::: + +## The Team + +### Core Team | Name | Discord | |--------------------------------------------------------|-----------------| @@ -24,7 +67,7 @@ Pelican is an open-source game server management tool built upon [Pterodactyl](h | [Boy132](https://github.com/boy132) | `boy132` | | [Martin Oscar](https://github.com/RMartinOscar) | `rmartinoscar` | -## Community Staff +### Community Staff | Name | Discord | |------------------------------------------------|---------------| diff --git a/docs/install/install.mdx b/docs/install/install.mdx deleted file mode 100644 index 211e7939..00000000 --- a/docs/install/install.mdx +++ /dev/null @@ -1,34 +0,0 @@ -# Installation - -Pelican consists of two main components: the **Panel** and **Wings**. - -The Panel is a [Laravel](https://laravel.com) web application that serves as web interface for the user. -Wings is the backend service that will be installed on one or more node machines and serves as interface between [Docker](https://docker.com) and the Panel. - -:::warning - Pelican is currently in **Beta**! Some things might change / break between beta versions! -::: - -## First steps - -:::info[What is...?] - Not sure what a specific term means? Check out our [Glossary](../glossary)! -::: - -First you will need to install the Panel. You can choose between two installation methods: - -1. [Standalone](panel/standalone) - run the Pelican Panel directly on a web server. -2. [Dockerized](panel/dockerized) - run the Pelican Panel inside a docker container. - -## Node setup - -After your setup your Panel you will have to create some Nodes. For do that install and configure the Wings Daemon, either on the same machine as the Panel or on a separate machine. - -Similar to the Panel installation you can choose between two installation methods: - -1. [Standalone](wings/standalone) - run the Wings Daemon directly on a linux server. -2. [Dockerized](wings/dockerized) - run the Wings Daemon inside a docker container. - -:::info - A Panel can have multiple Nodes but a Node is always tied to just one Panel. -:: \ No newline at end of file diff --git a/docs/install/misc/mysql.mdx b/docs/panel/advanced/mysql.mdx similarity index 97% rename from docs/install/misc/mysql.mdx rename to docs/panel/advanced/mysql.mdx index 7de90883..2eb08510 100644 --- a/docs/install/misc/mysql.mdx +++ b/docs/panel/advanced/mysql.mdx @@ -1,3 +1,8 @@ +--- +pagination_prev: null +pagination_next: null +--- + # MySQL A brief guide on how to install and setup MariaDB. diff --git a/docs/install/misc/redis.mdx b/docs/panel/advanced/redis.mdx similarity index 95% rename from docs/install/misc/redis.mdx rename to docs/panel/advanced/redis.mdx index 0151687e..3b9209a7 100644 --- a/docs/install/misc/redis.mdx +++ b/docs/panel/advanced/redis.mdx @@ -1,3 +1,8 @@ +--- +pagination_prev: null +pagination_next: null +--- + # Redis A brief guide on how to install and setup Redis. diff --git a/docs/install/misc/ssl.mdx b/docs/panel/advanced/ssl.mdx similarity index 97% rename from docs/install/misc/ssl.mdx rename to docs/panel/advanced/ssl.mdx index fb70db68..197a0986 100644 --- a/docs/install/misc/ssl.mdx +++ b/docs/panel/advanced/ssl.mdx @@ -1,3 +1,8 @@ +--- +pagination_prev: null +pagination_next: null +--- + import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +27,7 @@ We have also included a command below to install certbot's Nginx/Apache plugin s sudo apt install -y python3-certbot-apache ``` - + ```sh sudo apt install -y certbot ``` diff --git a/docs/install/panel/dockerized.mdx b/docs/panel/install/dockerized.mdx similarity index 96% rename from docs/install/panel/dockerized.mdx rename to docs/panel/install/dockerized.mdx index a20c46f3..df28befc 100644 --- a/docs/install/panel/dockerized.mdx +++ b/docs/panel/install/dockerized.mdx @@ -1,3 +1,8 @@ +--- +pagination_prev: null +pagination_next: null +--- + # Dockerized installation Run the Pelican Panel inside a docker container. @@ -76,7 +81,7 @@ services: - pelican-data:/pelican-data - pelican-logs:/var/www/html/storage/logs environment: - <<: [*panel-environment, *mail-environment] + <<: [*panel-environment] XDG_DATA_HOME: /pelican-data volumes: @@ -94,7 +99,7 @@ networks: 1. Set `APP_URL` to the base URL your panel will be reachable on, including the protocol (https:// or http://) and port. - Note that Caddy, the integrated webserver, will serve a 308 redirect to any requests on port 80 if the `APP_URL` begins with `https://`. If your final site will be reachable over HTTPS but TLS (SSL) will be handled and terminated by an upstream server, such as a reverse proxy, you will need to use a [custom caddyfile](#custom-caddyfile). -2. Set the `ADMIN_EMAIL` to your email address. Caddy will use this email address to generate a LetsEncrypt SSL certificate if you are serving via HTTPS. +2. Set the `LE_EMAIL` to your email address. Caddy will use this email address to generate a LetsEncrypt SSL certificate if you are serving via HTTPS. Now, close and save changes to `compose.yml`. @@ -179,7 +184,7 @@ services: environment: XDG_DATA_HOME: /pelican-data APP_URL: "http://localhost" - ADMIN_EMAIL: "USEYOUROWNEMAILHERE@example.com" + LE_EMAIL: "USEYOUROWNEMAILHERE@example.com" volumes: pelican-data: diff --git a/docs/install/panel/standalone.mdx b/docs/panel/install/standalone.mdx similarity index 97% rename from docs/install/panel/standalone.mdx rename to docs/panel/install/standalone.mdx index 2e0c9bb9..b1e240dc 100644 --- a/docs/install/panel/standalone.mdx +++ b/docs/panel/install/standalone.mdx @@ -1,3 +1,8 @@ +--- +pagination_prev: null +pagination_next: null +--- + import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -14,7 +19,7 @@ Run the Pelican Panel directly on a web server. ### Operating System (OS) The Panel runs on a wide range of operating systems, so pick whichever you are most comfortable using. -This documentation will assume a Debian based OS with `apt`. +This documentation assumes a Debian-based OS with `apt`. :::info SQLite support depends on [libsqlite3-0_3.35+](https://pkgs.org/download/libsqlite3-0) being on the host system. @@ -26,7 +31,7 @@ OS's that do _not_ support SQLite include: Debian 11, Alma Linux 8 or 9, Rocky L For the Panel you need to install **PHP `8.5` (recommended), `8.4`, `8.3` or `8.2`**, with the following **extensions**: `gd`, `mysql`, `mbstring`, `bcmath`, `xml`, `curl`, `zip`, `intl`, `sqlite3` and `fpm`. -You will also need a Webserver. Currently, **Apache, NGINX or Caddy** are supported. +You will also need a web server. Currently, **Apache, NGINX or Caddy** are supported. If you want to use MySQL, MariaDB or PostgreSQL for the panel database make sure to install either **MySQL 8+, MariaDB 10.6+ or PostgreSQL 14+**. (both client and server!) @@ -69,10 +74,10 @@ sudo COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader Even though composer might tell you that you have outdated dependencies, do **not** run `composer update`! ::: -## Webserver Configuration +## Web server Configuration :::info - When using the SSL (https) configuration you MUST create SSL certificates, otherwise your webserver will fail to start. + When using the SSL (https) configuration you MUST create SSL certificates, otherwise your web server will fail to start. See the [Creating SSL Certificates](../misc/ssl) documentation page to learn how to create these certificates before continuing. ::: @@ -239,7 +244,7 @@ sudo COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader Now, you should paste the contents of the file below, replacing `` with your domain name being used in a file called `pelican.conf` and place the file in `/etc/apache2/sites-available/`. - Note: When using Apache, make sure you have the `libapache2-mod-php` package installed or else PHP will not display on your webserver. + Note: When using Apache, make sure you have the `libapache2-mod-php` package installed or else PHP will not display on your web server. :::warning @@ -457,7 +462,7 @@ sudo COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader The core environment is easily configured using a single CLI command & the web installer built into the app. These steps will cover setting up things such as sessions, caching, database credentials, and email sending. -Running `php artisan p:environment:setup` will, if it does not exist, auto create the required `.env` file and generate a `APP_KEY`. +Running `php artisan p:environment:setup` will, if it does not exist, auto-create the required `.env` file and generate a `APP_KEY`. ```sh sudo php artisan p:environment:setup @@ -470,7 +475,7 @@ sudo php artisan p:environment:setup ## Setting Permissions -The next step in the installation process is to set the correct permissions on the Panel files so that the webserver can use them correctly. +The next step in the installation process is to set the correct permissions on the Panel files so that the web server can use them correctly. ```sh sudo chmod -R 755 storage/* bootstrap/cache/ @@ -500,6 +505,6 @@ Once you've set the proper permissions, continue the Panel install on the web in The web installer is located at `/installer` or `/installer`, e.g. `https://panel.example.com/installer` :::info[Want something advanced?] - Make sure to read the [MySQL guide](./../misc/mysql) first if you want to use MySQL/ MariaDB instead of SQLite! + Make sure to read the [MySQL guide](./../misc/mysql) first if you want to use MySQL/MariaDB instead of SQLite! If you want to use Redis make sure to read the [Redis guide](./../misc/redis) first. ::: \ No newline at end of file diff --git a/docs/plugins.mdx b/docs/panel/plugins.mdx similarity index 99% rename from docs/plugins.mdx rename to docs/panel/plugins.mdx index 5f1ce05e..1c9ca4b9 100644 --- a/docs/plugins.mdx +++ b/docs/panel/plugins.mdx @@ -1,3 +1,8 @@ +--- +pagination_prev: null +pagination_next: null +--- + import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; diff --git a/docs/update/panel.mdx b/docs/panel/update.mdx similarity index 97% rename from docs/update/panel.mdx rename to docs/panel/update.mdx index 1f616393..adc6de06 100644 --- a/docs/update/panel.mdx +++ b/docs/panel/update.mdx @@ -1,7 +1,12 @@ +--- +pagination_prev: null +pagination_next: null +--- + import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -# Panel +# Update A brief guide on how to update the Pelican Panel to the latest version. @@ -103,7 +108,7 @@ You have two options for updating: use the automatic update script (recommended) is `www-data` but can vary from system to system — sometimes being `nginx`, `caddy`, `apache`, or even `nobody`. - + ```sh sudo chown -R www-data:www-data /var/www/pelican ``` diff --git a/docs/troubleshooting.mdx b/docs/troubleshooting.mdx index 10216ce2..6645e5c3 100644 --- a/docs/troubleshooting.mdx +++ b/docs/troubleshooting.mdx @@ -1,3 +1,8 @@ +--- +pagination_prev: null +pagination_next: null +--- + import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -14,13 +19,13 @@ tail -n 1000 /var/www/pelican/storage/logs/laravel-$(date +%F).log | grep "\[$(d
Common errors - * `ErrorException: file_put_contents(_____): failed to open stream: Permission denied`: Wrong file permissions/ ownership for the panel files, see [below](#wrong-file-permissions). + * `ErrorException: file_put_contents(_____): failed to open stream: Permission denied`: Wrong file permissions/ownership for the panel files, see [below](#wrong-file-permissions). * `502 Bad Gateway Error`: Make sure that php-fpm is running and that you are using the correct php version in your webserver config. * `CSRF token mismatch`: Enable SSL for your Panel with HTTPS protocol scheme in the `APP_URL`, or set `SESSION_SECURE_COOKIE` to `false` in your `.env` file. * `Connection refused [tcp://_______:6379]`: Redis isn't running or isn't reachable for some other reason. (start by checking the status of the redis service: `systemctl status redis-server`) - * `SSL: no alternative certificate subject name matches target host name '_______'`: The used SSL certificate for your panel isn't valid for your panel domain, see [this guide](./install/misc/ssl) for creating a new SSL certificate. + * `SSL: no alternative certificate subject name matches target host name '_______'`: The used SSL certificate for your panel isn't valid for your panel domain, see [this guide](./panel/advanced/ssl) for creating a new SSL certificate. * `General error: 8 attempt to write a readonly database`: Your `database.sqlite` has wrong file permissions and is read-only. Make sure the file is writable and owned by the correct user. - * `Class '_____' not found`: This usually means you are missing php extensions. Make sure [all needed extensions](./install/panel/standalone#dependencies) are installed and that you are using the correct php version. + * `Class '_____' not found`: This usually means you are missing php extensions. Make sure [all needed extensions](./panel/install/standalone#dependencies) are installed and that you are using the correct php version. * `Connection timed out after 5001 milliseconds for _______:8080`: Your panel can't reach wings, see the wings connection issues steps below.
@@ -57,22 +62,22 @@ It should say that the service is active and running. If its in a failed state r
Common errors - * `open /etc/letsencrypt/live/_____________/fullchain.pem: no such file or directory`: The SSL certificate for wings is missing, see [this guide](./install/misc/ssl) for creating a SSL certificate. + * `open /etc/letsencrypt/live/_____________/fullchain.pem: no such file or directory`: The SSL certificate for wings is missing, see [this guide](./panel/advanced/ssl) for creating an SSL certificate. * `Pool overlaps with other one on this address space`: You already have a docker network using the default subnet. (`172.18.0.0/16`) Change the subnet in your wings config file and use `systemctl stop wings && docker network rm pelican_nw && systemctl start wings` to apply the change. - * `Error response from Panel: AccessDeniedHttpException: You are not authorized to access this resource. (HTTP/403)`: Your wings token is wrong, you need [update the token in your config.yml file](./install/wings/standalone#configure) - * `Error response from Panel: _MissingResponseCode: No error response returned from API endpoint`: Your panel is not responding correctly. This usually happens when Cloudflare is blocking the connection. In that case make sure your wings ip is added to the Cloudflare firewall. If you aren't using Cloudflare it might be some other CDN/ DDoS protection service or your provider. + * `Error response from Panel: AccessDeniedHttpException: You are not authorized to access this resource. (HTTP/403)`: Your wings token is wrong, you need to [update the token in your config.yml file](./wings/install/standalone#configure) + * `Error response from Panel: _MissingResponseCode: No error response returned from API endpoint`: Your panel is not responding correctly. This usually happens when Cloudflare is blocking the connection. In that case make sure your wings ip is added to the Cloudflare firewall. If you aren't using Cloudflare it might be some other CDN/DDoS protection service or your provider. * `remote: could not unmarshal response: invalid character '<' looking for beginning of value`: This is basically the same error as above: Cloudflare is blocking the connection.
### Check the wings port -If you confirmed that wings is running without errors you should make sure that the wings port (`8080` by default) isn't blocked by any firewall. The best way to check this is to use online port checkers like [dnschecker.org](https://dnschecker.org/port-scanner.php) +If you confirmed that wings is running without errors you should make sure that the wings port (`8080` by default) isn't blocked by any firewall. The best way to check this is to use online port checkers like [dnschecker.org](https://dnschecker.org/port-scanner.php). It should say "open" if you check for your node FQDN (e.g. `node.example.com` or `123.123.123.123`) and your wings port (e.g. `8080`). If it says "timed-out" you have some firewall blocking the port. This could be an internal firewall (like iptables) or an external firewall (e.g. from your provider). ### Check for NAT loop back If your panel and wings are on the same machine or same network, and you are using domains you should check for NAT loop back issues. -Edit the `/etc/hosts` file on your panel/ wings machine and add an entry for your ip and domain. +Edit the `/etc/hosts` file on your panel/wings machine and add an entry for your ip and domain. Example: @@ -107,7 +112,7 @@ In both cases it should output this when wings is reachable: ### Check node settings If the connection checks above were both successfull you might have misconfigured the Node settings in the Panel. -Make sure that your Node FQDN/ IP, Port and Scheme (HTTP/ HTTPS) is correct. +Make sure that your Node FQDN/IP, Port and Scheme (HTTP/HTTPS) is correct. When using a reverse proxy you might have different external and internal ports for Wings. (e.g. `80` internally and `443` externally) In that case make sure the Node settings in the Panel uses the external port while the Wings config file uses the internal port! @@ -135,6 +140,6 @@ To recreate the queue worker service you can run `php /var/www/pelican/artisan p If a file upload form returns an error like `mountedActionsData.0.files.24d4b82d-a3ae-47fd-981f-8b2f0f6a21d4` it is most likely a proxy issue. Make sure your `Trusted Proxies` are set to the correct ips, both in the panel settings and your proxy settings! -Also make sure your webserver and/ or proxy have a high enough upload limit. (e.g. `client_max_body_size`, `upload_max_filesize` and `post_max_size`) +Also make sure your webserver and/or proxy have a high enough upload limit. (e.g. `client_max_body_size`, `upload_max_filesize` and `post_max_size`) In some cases the issue can also be caused by incorrect file permissions. See [above](#wrong-file-permissions) on how to fix your file permissions. diff --git a/docs/install/wings/dockerized.mdx b/docs/wings/install/dockerized.mdx similarity index 98% rename from docs/install/wings/dockerized.mdx rename to docs/wings/install/dockerized.mdx index daff7ed8..4be4fee7 100644 --- a/docs/install/wings/dockerized.mdx +++ b/docs/wings/install/dockerized.mdx @@ -1,3 +1,8 @@ +--- +pagination_prev: null +pagination_next: null +--- + # Dockerized installation Run the Wings Daemon inside a docker container. diff --git a/docs/install/wings/standalone.mdx b/docs/wings/install/standalone.mdx similarity index 95% rename from docs/install/wings/standalone.mdx rename to docs/wings/install/standalone.mdx index 4040f540..96d3cdca 100644 --- a/docs/install/wings/standalone.mdx +++ b/docs/wings/install/standalone.mdx @@ -1,3 +1,8 @@ +--- +pagination_prev: null +pagination_next: null +--- + import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -23,7 +28,7 @@ When your provider uses `Virtuozzo`, `OpenVZ` (or `OVZ`), or `LXC` virtualizatio run Wings. Some providers have made the necessary changes for nested virtualization to support Docker. Ask your provider's support team to make sure. KVM is guaranteed to work. The easiest way to check is to type `systemd-detect-virt`. -If the result doesn't contain `OpenVZ` or`LXC`, it should be fine. The result of `none` will appear when running dedicated hardware without any virtualization. +If the result doesn't contain `OpenVZ` or `LXC`, it should be fine. The result of `none` will appear when running dedicated hardware without any virtualization. Should that not work for some reason, or you're still unsure, you can also run the command below. diff --git a/docs/update/wings.mdx b/docs/wings/update.mdx similarity index 95% rename from docs/update/wings.mdx rename to docs/wings/update.mdx index ff1fdcb9..6d96b974 100644 --- a/docs/update/wings.mdx +++ b/docs/wings/update.mdx @@ -1,7 +1,12 @@ +--- +pagination_prev: null +pagination_next: null +--- + import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -# Wings +# Update A brief guide on how to update the Wings Daemon to the latest version. diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 55308768..ad49ba30 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -80,7 +80,7 @@ const config: Config = { }, { label: 'SSL Setup', - to: '/docs/install/misc/ssl' + to: '/docs/panel/advanced/ssl' }, ], }, diff --git a/sidebars.ts b/sidebars.ts index a9076a54..4ae79f3f 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -15,64 +15,65 @@ const sidebars: SidebarsConfig = { 'welcome', { type: 'category', - label: 'Installation', + label: 'Panel', link: { - type: 'doc', - id: 'install/install', + type: 'generated-index', + description: 'The Panel is a Laravel web application that serves as web interface for the user.', }, + collapsible: false, items: [ { type: 'category', - label: 'Panel', - link: { - type: 'generated-index', - description: "You can choose between two installation methods:", - }, - collapsed: false, - items: [ - 'install/panel/standalone', - 'install/panel/dockerized', - ], - }, - { - type: 'category', - label: 'Wings', + label: 'Installation', link: { type: 'generated-index', - description: "You can choose between two installation methods:", + description: 'You can choose between two installation methods:', }, - collapsed: false, items: [ - 'install/wings/standalone', - 'install/wings/dockerized', + 'panel/install/standalone', + 'panel/install/dockerized', ], }, + 'panel/update', { type: 'category', - label: 'Misc', + label: 'Advanced', link: { type: 'generated-index', }, items: [ - 'install/misc/ssl', - 'install/misc/mysql', - 'install/misc/redis', + 'panel/advanced/ssl', + 'panel/advanced/mysql', + 'panel/advanced/redis', ], }, + 'panel/plugins' ], }, { type: 'category', - label: 'Updating', + label: 'Wings', link: { type: 'generated-index', + description: 'Wings is the backend service that will be installed on one or more node machines and serves as interface between Docker and the Panel.', }, + collapsible: false, items: [ - 'update/panel', - 'update/wings', + { + type: 'category', + label: 'Installation', + link: { + type: 'generated-index', + description: 'You can choose between two installation methods:', + }, + items: [ + 'wings/install/standalone', + 'wings/install/dockerized', + ], + }, + 'wings/update', ], }, - 'plugins', { type: 'category', label: 'Guides', diff --git a/src/pages/faq.mdx b/src/pages/faq.mdx index 9c344fdb..5860e965 100644 --- a/src/pages/faq.mdx +++ b/src/pages/faq.mdx @@ -9,7 +9,7 @@ Here are some of the most asked questions and our answers. :::info[When is the beta?] The Beta is now available! - **Head over to the [Install docs](/docs/install) and try out Pelican yourself.** + **Head over to the [Install docs](/docs) and try out Pelican yourself.** ::: @@ -80,7 +80,7 @@ Here are some of the most asked questions and our answers. We are working on adding new features and improvements to Wings that will greatly improve your experience.
- Will Podman / Kubernetes be supported? + Will Podman/Kubernetes be supported? Yes, we plan on supporting them in the future.
@@ -160,19 +160,19 @@ Here are some of the most asked questions and our answers.
What can plugins do? - Pretty much anything you want! They can add new pages, change existing ones (to some extent), add new languages, change the theme (color/ font/ css) and more. + Pretty much anything you want! They can add new pages, change existing ones (to some extent), add new languages, change the theme (color/font/css) and more. The first iteration _will_ have some limitations but we will continuously improve the capabilities of plugins.
How are plugins installed? - You can find information on that [here](./docs/plugins#install-a-plugin). + You can find information on that [here](./docs/panel/plugins#create-a-plugin).
How do you create plugins? - You can find detailed information on that [here](./docs/plugins#create-a-plugin). + You can find detailed information on that [here](./docs/panel/plugins#create-a-plugin).
Are the plugins from the sneak peaks available? diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 7c42cab4..7e84dbfd 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -25,8 +25,8 @@ function HomepageHeader() { Install + to="/docs" + >Documentation Date: Tue, 17 Mar 2026 10:30:55 +0100 Subject: [PATCH 05/11] move ssl guide and fix some broken links --- docs/guides/change-panel-domain.mdx | 4 ++-- docs/{panel/advanced => guides}/ssl.mdx | 2 +- docs/index.mdx | 8 ++++---- docs/panel/install/standalone.mdx | 10 ++++++---- docs/wings/install/standalone.mdx | 2 +- docusaurus.config.ts | 2 +- sidebars.ts | 2 +- 7 files changed, 16 insertions(+), 14 deletions(-) rename docs/{panel/advanced => guides}/ssl.mdx (98%) diff --git a/docs/guides/change-panel-domain.mdx b/docs/guides/change-panel-domain.mdx index fd47c87b..58df9d6f 100644 --- a/docs/guides/change-panel-domain.mdx +++ b/docs/guides/change-panel-domain.mdx @@ -17,7 +17,7 @@ First you need to modify the server name in your web server config. ``` :::info[Using HTTPS?] - If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](../install/misc/ssl). + If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](../panel/advanced/ssl). ::: @@ -27,7 +27,7 @@ First you need to modify the server name in your web server config. ``` :::info[Using HTTPS?] - If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](../install/misc/ssl). + If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](../panel/advanced/ssl). ::: diff --git a/docs/panel/advanced/ssl.mdx b/docs/guides/ssl.mdx similarity index 98% rename from docs/panel/advanced/ssl.mdx rename to docs/guides/ssl.mdx index 197a0986..b3585e16 100644 --- a/docs/panel/advanced/ssl.mdx +++ b/docs/guides/ssl.mdx @@ -48,7 +48,7 @@ for. When you have multiple domains you would like certificates for, simply add command. You can also look into generating a wildcard certificate but that is not covered in this tutorial. When you are using certbot's Nginx/Apache plugin, you won't need to restart your webserver to have the certificate -applied assuming that you've already configured the webservers to use SSL as instructed in the [web server configuration step](../panel/standalone#webserver-configuration). +applied assuming that you've already configured the webservers to use SSL as instructed in the [web server configuration step](../panel/install/standalone#webserver-configuration). diff --git a/docs/index.mdx b/docs/index.mdx index 9bf07503..135b55a9 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -38,8 +38,8 @@ Wings is the backend service that will be installed on one or more node machines First you will need to install the Panel. You can choose between two installation methods: -1. [Standalone](panel/standalone) - run the Pelican Panel directly on a web server. -2. [Dockerized](panel/dockerized) - run the Pelican Panel inside a docker container. +1. [Standalone](panel/install/standalone) - run the Pelican Panel directly on a web server. +2. [Dockerized](panel/install/dockerized) - run the Pelican Panel inside a docker container. ### Node setup @@ -47,8 +47,8 @@ After your setup your Panel you will have to create some Nodes. For do that inst Similar to the Panel installation you can choose between two installation methods: -1. [Standalone](wings/standalone) - run the Wings Daemon directly on a linux server. -2. [Dockerized](wings/dockerized) - run the Wings Daemon inside a docker container. +1. [Standalone](wings/install/standalone) - run the Wings Daemon directly on a linux server. +2. [Dockerized](wings/install/dockerized) - run the Wings Daemon inside a docker container. :::note A Panel can have multiple Nodes but a Node is always tied to just one Panel. diff --git a/docs/panel/install/standalone.mdx b/docs/panel/install/standalone.mdx index b1e240dc..9e85ce26 100644 --- a/docs/panel/install/standalone.mdx +++ b/docs/panel/install/standalone.mdx @@ -78,7 +78,7 @@ sudo COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader :::info When using the SSL (https) configuration you MUST create SSL certificates, otherwise your web server will fail to start. - See the [Creating SSL Certificates](../misc/ssl) documentation page to learn how to create these certificates before continuing. + See the [Creating SSL Certificates](../../guides/ssl) documentation page to learn how to create these certificates before continuing. ::: @@ -501,10 +501,12 @@ sudo chmod -R 755 storage/* bootstrap/cache/ ## Web Installer -Once you've set the proper permissions, continue the Panel install on the web interface. +Once you've set the proper permissions, finish the Panel install via the web installer. The web installer is located at `/installer` or `/installer`, e.g. `https://panel.example.com/installer` +During this step you will choose the default drivers, create the queue worker and create the default admin user. + :::info[Want something advanced?] - Make sure to read the [MySQL guide](./../misc/mysql) first if you want to use MySQL/MariaDB instead of SQLite! - If you want to use Redis make sure to read the [Redis guide](./../misc/redis) first. + Make sure to read the [MySQL guide](../advanced/mysql) first if you want to use MySQL/MariaDB instead of SQLite! + If you want to use Redis make sure to read the [Redis guide](../advanced/redis) first. ::: \ No newline at end of file diff --git a/docs/wings/install/standalone.mdx b/docs/wings/install/standalone.mdx index 96d3cdca..c380bbf4 100644 --- a/docs/wings/install/standalone.mdx +++ b/docs/wings/install/standalone.mdx @@ -71,7 +71,7 @@ Alternatively, you can click on the Auto Deploy Command button, copy the sh comm :::warning[Using ssl?] If your Panel is using SSL, Wings must also use SSL. - See [Creating SSL Certificates](../misc/ssl) documentation page for how to create these certificates before continuing. + See [Creating SSL Certificates](../../guides/ssl) documentation page for how to create these certificates before continuing. ::: ## Starting Wings for the first time diff --git a/docusaurus.config.ts b/docusaurus.config.ts index ad49ba30..cca4a863 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -80,7 +80,7 @@ const config: Config = { }, { label: 'SSL Setup', - to: '/docs/panel/advanced/ssl' + to: '/docs/guides/ssl' }, ], }, diff --git a/sidebars.ts b/sidebars.ts index 4ae79f3f..51f2cc39 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -42,7 +42,6 @@ const sidebars: SidebarsConfig = { type: 'generated-index', }, items: [ - 'panel/advanced/ssl', 'panel/advanced/mysql', 'panel/advanced/redis', ], @@ -81,6 +80,7 @@ const sidebars: SidebarsConfig = { type: 'generated-index', }, items: [ + 'guides/ssl', 'guides/mounts', 'guides/php-upgrade', 'guides/database-hosts', From cb6571f668dee40157392e54eab72afafc897b56 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 17 Mar 2026 10:34:38 +0100 Subject: [PATCH 06/11] fix more broken links --- docs/guides/change-panel-domain.mdx | 4 ++-- docs/troubleshooting.mdx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guides/change-panel-domain.mdx b/docs/guides/change-panel-domain.mdx index 58df9d6f..272ed551 100644 --- a/docs/guides/change-panel-domain.mdx +++ b/docs/guides/change-panel-domain.mdx @@ -17,7 +17,7 @@ First you need to modify the server name in your web server config. ``` :::info[Using HTTPS?] - If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](../panel/advanced/ssl). + If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](ssl). ::: @@ -27,7 +27,7 @@ First you need to modify the server name in your web server config. ``` :::info[Using HTTPS?] - If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](../panel/advanced/ssl). + If you're using HTTPS, remember to also change the SSL paths in the config file to match your new domain and [generate a new certificate](ssl). ::: diff --git a/docs/troubleshooting.mdx b/docs/troubleshooting.mdx index 6645e5c3..43e32464 100644 --- a/docs/troubleshooting.mdx +++ b/docs/troubleshooting.mdx @@ -23,7 +23,7 @@ tail -n 1000 /var/www/pelican/storage/logs/laravel-$(date +%F).log | grep "\[$(d * `502 Bad Gateway Error`: Make sure that php-fpm is running and that you are using the correct php version in your webserver config. * `CSRF token mismatch`: Enable SSL for your Panel with HTTPS protocol scheme in the `APP_URL`, or set `SESSION_SECURE_COOKIE` to `false` in your `.env` file. * `Connection refused [tcp://_______:6379]`: Redis isn't running or isn't reachable for some other reason. (start by checking the status of the redis service: `systemctl status redis-server`) - * `SSL: no alternative certificate subject name matches target host name '_______'`: The used SSL certificate for your panel isn't valid for your panel domain, see [this guide](./panel/advanced/ssl) for creating a new SSL certificate. + * `SSL: no alternative certificate subject name matches target host name '_______'`: The used SSL certificate for your panel isn't valid for your panel domain, see [this guide](./guides/ssl) for creating a new SSL certificate. * `General error: 8 attempt to write a readonly database`: Your `database.sqlite` has wrong file permissions and is read-only. Make sure the file is writable and owned by the correct user. * `Class '_____' not found`: This usually means you are missing php extensions. Make sure [all needed extensions](./panel/install/standalone#dependencies) are installed and that you are using the correct php version. * `Connection timed out after 5001 milliseconds for _______:8080`: Your panel can't reach wings, see the wings connection issues steps below. @@ -62,7 +62,7 @@ It should say that the service is active and running. If its in a failed state r
Common errors - * `open /etc/letsencrypt/live/_____________/fullchain.pem: no such file or directory`: The SSL certificate for wings is missing, see [this guide](./panel/advanced/ssl) for creating an SSL certificate. + * `open /etc/letsencrypt/live/_____________/fullchain.pem: no such file or directory`: The SSL certificate for wings is missing, see [this guide](./guides/ssl) for creating an SSL certificate. * `Pool overlaps with other one on this address space`: You already have a docker network using the default subnet. (`172.18.0.0/16`) Change the subnet in your wings config file and use `systemctl stop wings && docker network rm pelican_nw && systemctl start wings` to apply the change. * `Error response from Panel: AccessDeniedHttpException: You are not authorized to access this resource. (HTTP/403)`: Your wings token is wrong, you need to [update the token in your config.yml file](./wings/install/standalone#configure) * `Error response from Panel: _MissingResponseCode: No error response returned from API endpoint`: Your panel is not responding correctly. This usually happens when Cloudflare is blocking the connection. In that case make sure your wings ip is added to the Cloudflare firewall. If you aren't using Cloudflare it might be some other CDN/DDoS protection service or your provider. From e2bdc47a198f79a8bfa294336ab4563fd46321c0 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 17 Mar 2026 10:41:24 +0100 Subject: [PATCH 07/11] add back optional config guides --- docs/panel/optional-config.mdx | 106 +++++++++++++++++++++++ docs/wings/optional-config.mdx | 152 +++++++++++++++++++++++++++++++++ sidebars.ts | 2 + 3 files changed, 260 insertions(+) create mode 100644 docs/panel/optional-config.mdx create mode 100644 docs/wings/optional-config.mdx diff --git a/docs/panel/optional-config.mdx b/docs/panel/optional-config.mdx new file mode 100644 index 00000000..c0d400e5 --- /dev/null +++ b/docs/panel/optional-config.mdx @@ -0,0 +1,106 @@ +# Additional Configuration + +## Backups + +Pelican allows users to create backups of their servers. To create backups, a backup storage method has to be configured. + +When changing Pelican's backup storage method, users may still download or delete existing backups from the prior storage driver. In the instance of migrating from S3 to local backups, S3 credentials must remain configured after switching to the local backup storage method. + +Make sure to clear the config cache (`cd /var/www/pelican && php artisan config:clear`) and to restart the queue worker (`systemctl restart pelican-queue`) after changing the backup driver to apply the changes. + +### Using Local Backups + +By default, Pelican uses local storage via Wings for backups. That said, this method of backup storage can be explicitly set within the Settings Page on the Admin side of the panel. + +Please note that, when using local storage via Wings, the destination for backups is set in the Wings config file with the following setting key: + +```yml {2} +system: + backup_directory: /path/to/backup/storage +``` + +### Using S3 Backups + +AWS S3 (or compatible storage) can be used to store remote or cloud-based backups. This can be configured in the Settings Page on the Admin side of the panel. + +For some configurations, you might have to change your S3 URL from `bucket.domain.com` to `domain.com/bucket`. To accomplish this, add `AWS_USE_PATH_STYLE_ENDPOINT=true` to your `.env` file. + +#### Multipart Upload + +The S3 backup is using the S3 multipart upload capabilities. In rare situations, you might want to adjust the size of a single part or the lifespan of the generated pre-signed URLs. The default part size is 5GB, and the default pre-signed URL lifespan is 60 minutes. + +You can configure the maximal part size using the `BACKUP_MAX_PART_SIZE` environment variable. You must specify the size in bytes. To define the pre-signed URL lifespan, use the `BACKUP_PRESIGNED_URL_LIFESPAN` variable. The expected unit is minutes. + +The following `.env` snippet configures 1GB parts and uses 120 minutes as the pre-signed URL lifespan: + +```sh +BACKUP_MAX_PART_SIZE=1073741824 +BACKUP_PRESIGNED_URL_LIFESPAN=120 +``` + +#### Storage Class + +Should you need to specify a storage class, use the `AWS_BACKUPS_STORAGE_CLASS` environment variable. The default option is `STANDARD` (S3 Standard). + +```sh +AWS_BACKUPS_STORAGE_CLASS= +``` + +## Reverse Proxy Setup + +When running Pelican behind a reverse proxy, such as [Cloudflare's Flexible SSL](https://support.cloudflare.com/hc/en-us/articles/200170416-What-do-the-SSL-options-mean-) +or NGINX/Apache/Caddy, etc., you will need to make a quick modification to the Panel to ensure things continue to work as expected. By default, when using these reverse proxies, +your Panel will not correctly handle requests. You'll most likely be unable to login or see security warnings in your browser console as it attempts to load insecure assets. +This is because the internal logic the Panel uses to determine how links should be generated thinks it is running over HTTP and not over HTTPS. + +You will need to edit trusted proxies, on the Settings page. We highly suggest providing a specific IP address +(or comma-separated list of IPs) rather than allowing `*`. For example, if your proxy is running on the same machine as the server, +the chances are that using `127.0.0.1` would work for you. + +### NGINX Specific Configuration + +To properly respond to an NGINX reverse proxy, the NGINX `location` config must contain the following lines: + +```NGINX +proxy_set_header X-Real-IP $remote_addr; +proxy_set_header Host $host; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Forwarded-Proto $scheme; +proxy_redirect off; +proxy_buffering off; +proxy_request_buffering off; +``` + +### Cloudflare Specific Configuration + +If you're using Cloudflare's Flexible SSL you should set `TRUSTED_PROXIES` to contain [their IP addresses](https://www.cloudflare.com/ips/). + +You can easily do this on the Settings page in the Panel. + +## Captcha + +The Panel has options to enable captcha to secure the login page from brute-force attacks. By default only Cloudflare Turnstile is available. + +### Disable Captcha + +If you cannot access your panel, you have to modify the `.env` directly to disable it. + +Edit the `.env` in the panel's root directory `/var/www/pelican/` and change the value of `CAPTCHA_TURNSTILE_ENABLED` to `false`. + +After that run `php artisan config:clear` to refresh the config cache. + +## 2FA + +If possible you should use the panel to update your 2FA settings. If you can't access your panel for whatever reason you can use the following steps. + +### Disable 2FA requirement + +Edit the `.env` in the panel's root directory `/var/www/pelican/` and change the value of `APP_2FA_REQUIRED` to `0`. + +### Disable 2FA for a specific user + +Run the following command in your `/var/www/pelican` directory. + +```sh +php artisan p:user:disable2fa +``` \ No newline at end of file diff --git a/docs/wings/optional-config.mdx b/docs/wings/optional-config.mdx new file mode 100644 index 00000000..1c07a708 --- /dev/null +++ b/docs/wings/optional-config.mdx @@ -0,0 +1,152 @@ +# Additional Configuration + +:::danger + These are advanced configurations for Wings. You risk breaking Wings and making containers unusable if you misconfigure something. Proceed only if you know what each configuration value does. +::: + +You must apply all changes to your Wings `config.yml` file located at `/etc/pelican` and restart wings. +Verify your config file using [Yaml Lint](http://www.yamllint.com/) should you receive errors related to YAML parsing. + +## Private Registries + +You can use these settings to authenticate against (private) docker registries when pulling images. + +### Available Keys + +| Setting Key | Default Value | Notes | +| ----------- | :-----------: | ----------------- | +| name | null | Registry address | +| username | null | Registry username | +| password | null | Registry password | + +### Example of usage + +```yml +docker: + registries: + registry.example.com: + username: "registryusername" + password: "registrypassword" +``` + +## Custom Network Interfaces + +You can change the network interface that Wings uses for all containers by editing the network name; it is by default set to `pelican_nw`. For example, to enable Docker host mode change the network name to `host`. + +:::warning + Changing network mode to `host` grants Pelican direct access to all machine interfaces and Panel users can bind to any IP or Port even if it's not allocated to their container. You will lose all benefits of Docker network isolation. It is not recommended for public installations that are hosting other users' servers. +::: + +### Example of usage + +```yml +docker: + network: + name: host + network_mode: host +``` + +After making changes, the following commands will stop the Wings, remove the Pelican network, and start the Wings again. Run at your own risk. +`systemctl stop wings && docker network rm pelican_nw && systemctl start wings` + +## Enabling Cloudflare proxy + +Cloudflare proxying of the Wings isn't beneficial since users will be connecting to the machine directly and bypassing any Cloudflare protection. As such, your Node machine IP will still be exposed. + +To enable Cloudflare proxy, you must change the Wings port to one of the Cloudflare HTTPS ports with caching enabled (more info [here](https://developers.cloudflare.com/fundamentals/get-started/reference/network-ports/)), such as 8443, because Cloudflare only supports HTTP on port 8080. Select your Node in the Admin Panel, and on the settings tab, change the port. Make sure that you set "Not Behind Proxy" when using Full SSL settings in Cloudflare. Then on Cloudflare dashboard, your FQDN must have an orange cloud enabled beside it. + +You are unable to proxy the SFTP port through Cloudflare unless you have their enterprise plan. Server transfers will most likely not work either due to [Cloudflare's request body limits](https://developers.cloudflare.com/workers/platform/limits/#request-limits). + +## Container PID Limit + +You can change the total number of processes that can be active in a container at any given moment by changing the `container_pid_limit` value. The default value is `512`. +You can set it to `0` to disable the limit completely. However, this is _not_ recommended as the limit prevents malicious overloading of the node. +Restart wings and your game server to apply the new limit. + +### Example of usage + +```yml +docker: + ... + container_pid_limit: 512 + ... +``` + +## Throttles Limits + +You can use these settings to adjust or completely disable throttling. + +| Setting Key | Default Value | Notes | +| :-------------------- | :-----------: | ---------------------------------------------------------------------------| +| enabled | true | Whether or not the throttler is enabled | +| lines | 2000 | Total lines that can be output in a given line_reset_interval period | +| line_reset_interval | 100 | The amount of time after which the number of lines processed is reset to 0 | + +### Example of usage + +```yml +throttles: + enabled: true + lines: 2000 + line_reset_interval: 100 +``` + +## Backups Limits + +You can use these settings to adjust or completely disable throttling. + +| Setting Key | Default Value | Notes | +| :-------------------- | :-----------: | ------------------------------------------------------------------------------------------------------------------------------------| +| write_limit | 0 | Impose I/O write limit for backups to the disk, 0 = unlimited. Value greater than 0 throttles write speed to the set value in MiB/s | + +### Example of usage + +```yml +backups: + write_limit: 0 +``` + +## Transfers Limits + +You can use these settings to adjust or completely disable throttling. + +| Setting Key | Default Value | Notes | +| :-------------------- | :-----------: | ------------------------------------------------------------------------------------------------------------------------------------| +| download_limit | 0 | Impose a Network I/O read limit for archives, 0 = unlimited. Value greater than 0 throttles read speed to the set value in MiB/s | + +### Example of usage + +```yml +transfers: + download_limit: 0 +``` + +## Installer Limits + +Defines the limits on the installer containers that prevents a server's installation process from unintentionally consuming more resources than expected. This is used in conjunction with the server's defined limits. Whichever value is higher will take precedence in the install containers. + +| Setting Key | Default Value | Notes | +| :---------- | :-----------: | ----------------------------------------------------------------------------------------------------------- | +| memory | 1024 | The maximum amount of memory install container can use unless server memory limit is higher than this value | +| cpu | 100 | The maximum amount of cpu install container can use unless server cpu limit is higher than this value | + +### Example of usage + +```yml +installer_limits: + memory: 1024 + cpu: 100 +``` + +## Other values + +More commonly discussed values. + +| Setting Key | Default Value | Notes | +| -------------------------- | :-----------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| debug | false | Force Wings to run in debug mode | +| tmpfs_size | 100 | The size of the /tmp directory in MB when mounted into a container | +| websocket_log_count | 150 | The number of lines to display in the console | +| detect_clean_exit_as_crash | true | Mark server as crashed if it's stopped without user interaction, e.g., not pressing stop button | +| (crash detection) timeout | 60 | Timeout between server crashes that will not cause the server to be automatically restarted | +| check_permissions_on_boot | true | Check all file permissions on each boot. Disable this when you have a very large amount of files and the server startup is hanging on checking permissions | \ No newline at end of file diff --git a/sidebars.ts b/sidebars.ts index 51f2cc39..16188f2f 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -35,6 +35,7 @@ const sidebars: SidebarsConfig = { ], }, 'panel/update', + 'panel/optional-config', { type: 'category', label: 'Advanced', @@ -71,6 +72,7 @@ const sidebars: SidebarsConfig = { ], }, 'wings/update', + 'wings/optional-config', ], }, { From 444a7e955bc4e9d6ebc7505049de7a05a0f97ba6 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 17 Mar 2026 10:48:24 +0100 Subject: [PATCH 08/11] rabbit fixes --- docs/guides/ssl.mdx | 2 +- docs/index.mdx | 8 ++++---- docs/troubleshooting.mdx | 2 +- sidebars.ts | 4 ++-- src/pages/faq.mdx | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/guides/ssl.mdx b/docs/guides/ssl.mdx index b3585e16..4a2dcded 100644 --- a/docs/guides/ssl.mdx +++ b/docs/guides/ssl.mdx @@ -48,7 +48,7 @@ for. When you have multiple domains you would like certificates for, simply add command. You can also look into generating a wildcard certificate but that is not covered in this tutorial. When you are using certbot's Nginx/Apache plugin, you won't need to restart your webserver to have the certificate -applied assuming that you've already configured the webservers to use SSL as instructed in the [web server configuration step](../panel/install/standalone#webserver-configuration). +applied assuming that you've already configured the webservers to use SSL as instructed in the [web server configuration step](../panel/install/standalone#web-server-configuration). diff --git a/docs/index.mdx b/docs/index.mdx index 135b55a9..58f429de 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -11,7 +11,7 @@ pagination_next: null Pelican is an open-source game server management tool built upon [Pterodactyl](https://pterodactyl.io), paired with Wings, which runs the game servers in isolated Docker containers for maximum separation and stability. :::note[Reporting Security Issues] - If you notice anything that raises a concern, please create a [Github security advisory](https://github.com/pelican-dev/panel/security/advisories/new ) or reach out directly to **team@pelican.dev** + If you notice anything that raises a concern, please create a [Github security advisory](https://github.com/pelican-dev/panel/security/advisories/new) or reach out directly to **team@pelican.dev** For security reasons, we ask that you handle security disclosures responsibly and **avoid posting them as GitHub issues/discussions.** ::: @@ -23,8 +23,8 @@ Pelican is an open-source game server management tool built upon [Pterodactyl](h Pelican consists of two main components: the **Panel** and **Wings**. -The Panel is a [Laravel](https://laravel.com) web application that serves as web interface for the user. -Wings is the backend service that will be installed on one or more node machines and serves as interface between [Docker](https://docker.com) and the Panel. +The Panel is a [Laravel](https://laravel.com) web application that serves as the web interface for users. +Wings is the backend service installed on one or more node machines and acts as the interface between [Docker](https://docker.com) and the Panel. :::warning Pelican is currently in **Beta**! Some things might change/break between beta versions! @@ -43,7 +43,7 @@ First you will need to install the Panel. You can choose between two installatio ### Node setup -After your setup your Panel you will have to create some Nodes. For do that install and configure the Wings Daemon, either on the same machine as the Panel or on a separate machine. +After you set up your Panel, you will need to create some Nodes. To do that, install and configure the Wings daemon on the same machine as the Panel or on a separate machine. Similar to the Panel installation you can choose between two installation methods: diff --git a/docs/troubleshooting.mdx b/docs/troubleshooting.mdx index 43e32464..fee06ca9 100644 --- a/docs/troubleshooting.mdx +++ b/docs/troubleshooting.mdx @@ -111,7 +111,7 @@ In both cases it should output this when wings is reachable: ### Check node settings -If the connection checks above were both successfull you might have misconfigured the Node settings in the Panel. +If the connection checks above were both successful you might have misconfigured the Node settings in the Panel. Make sure that your Node FQDN/IP, Port and Scheme (HTTP/HTTPS) is correct. When using a reverse proxy you might have different external and internal ports for Wings. (e.g. `80` internally and `443` externally) diff --git a/sidebars.ts b/sidebars.ts index 16188f2f..552437e7 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -18,7 +18,7 @@ const sidebars: SidebarsConfig = { label: 'Panel', link: { type: 'generated-index', - description: 'The Panel is a Laravel web application that serves as web interface for the user.', + description: 'The Panel is a Laravel web application that serves as the web interface for users.', }, collapsible: false, items: [ @@ -55,7 +55,7 @@ const sidebars: SidebarsConfig = { label: 'Wings', link: { type: 'generated-index', - description: 'Wings is the backend service that will be installed on one or more node machines and serves as interface between Docker and the Panel.', + description: 'Wings is the backend service installed on one or more node machines and acts as the interface between Docker and the Panel.', }, collapsible: false, items: [ diff --git a/src/pages/faq.mdx b/src/pages/faq.mdx index 5860e965..c7d67a5e 100644 --- a/src/pages/faq.mdx +++ b/src/pages/faq.mdx @@ -167,7 +167,7 @@ Here are some of the most asked questions and our answers.
How are plugins installed? - You can find information on that [here](./docs/panel/plugins#create-a-plugin). + You can find information on that [here](./docs/panel/plugins#install-a-plugin).
How do you create plugins? From 0cdfb8fc23f47847b179b29c9108878691c912d7 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 17 Mar 2026 11:11:12 +0100 Subject: [PATCH 09/11] add custom slug to installation categories --- sidebars.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sidebars.ts b/sidebars.ts index 552437e7..8c0a1933 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -27,6 +27,7 @@ const sidebars: SidebarsConfig = { label: 'Installation', link: { type: 'generated-index', + slug: '/category/panel-installation', description: 'You can choose between two installation methods:', }, items: [ @@ -64,6 +65,7 @@ const sidebars: SidebarsConfig = { label: 'Installation', link: { type: 'generated-index', + slug: '/category/wings-installation', description: 'You can choose between two installation methods:', }, items: [ From 91245942e0255d83a8c873b4d6132c07a0d2068d Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 17 Mar 2026 11:21:47 +0100 Subject: [PATCH 10/11] rabbit fixes --- docs/guides/change-panel-domain.mdx | 4 ++-- docs/guides/php-upgrade.mdx | 2 +- docs/guides/ssl.mdx | 10 +++++----- docs/guides/uninstalling.mdx | 4 ++-- docs/index.mdx | 2 +- docs/panel/install/dockerized.mdx | 4 ++-- docs/panel/update.mdx | 2 +- docs/troubleshooting.mdx | 6 +++--- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/guides/change-panel-domain.mdx b/docs/guides/change-panel-domain.mdx index 272ed551..55ce32d1 100644 --- a/docs/guides/change-panel-domain.mdx +++ b/docs/guides/change-panel-domain.mdx @@ -5,7 +5,7 @@ import TabItem from '@theme/TabItem'; A brief guide on how to change the Panel domain. -## Webserver & Panel +## Web server & Panel First you need to modify the server name in your web server config. @@ -39,7 +39,7 @@ First you need to modify the server name in your web server config. Next, modify the `APP_URL` in the `.env` file located at `/var/www/pelican` by typing `sudo nano /var/www/pelican/.env`. -Finally, restart your webserver to apply the changes. +Finally, restart your web server to apply the changes. diff --git a/docs/guides/php-upgrade.mdx b/docs/guides/php-upgrade.mdx index d3f7a6cb..186b6fb5 100644 --- a/docs/guides/php-upgrade.mdx +++ b/docs/guides/php-upgrade.mdx @@ -28,7 +28,7 @@ sudo apt -y purge php* sudo apt -y install php8.5 php8.5-{gd,mysql,mbstring,bcmath,xml,curl,zip,intl,sqlite3,fpm} ``` -## Webserver Configuration +## Web server Configuration diff --git a/docs/guides/ssl.mdx b/docs/guides/ssl.mdx index 4a2dcded..0371c160 100644 --- a/docs/guides/ssl.mdx +++ b/docs/guides/ssl.mdx @@ -14,7 +14,7 @@ A brief guide on how to create SSL certificates for your Panel and/or Wings usin To begin, we will install certbot, a simple script that automatically renews our certificates and allows much easier creation of them. The command below is for Ubuntu distributions, but you can always check [Certbot's official site](https://certbot.eff.org/) for installation instructions. -We have also included a command below to install certbot's Nginx/Apache plugin so you won't have to stop your webserver. +We have also included a command below to install certbot's Nginx/Apache plugin so you won't have to stop your web server. @@ -47,8 +47,8 @@ Then, in the command below, you should replace `example.com` with the domain you for. When you have multiple domains you would like certificates for, simply add more `-d anotherdomain.com` flags to the command. You can also look into generating a wildcard certificate but that is not covered in this tutorial. -When you are using certbot's Nginx/Apache plugin, you won't need to restart your webserver to have the certificate -applied assuming that you've already configured the webservers to use SSL as instructed in the [web server configuration step](../panel/install/standalone#web-server-configuration). +When you are using certbot's Nginx/Apache plugin, you won't need to restart your web server to have the certificate +applied assuming that you've already configured the web servers to use SSL as instructed in the [web server configuration step](../panel/install/standalone#web-server-configuration). @@ -99,7 +99,7 @@ Deploy hook would restart the Nginx service to apply a new certificate when it's ## Troubleshooting -If you get an `Insecure Connection` or SSL/TLS related error when trying to access your panel or wings, the certificate has likely expired. +If you get an `Insecure Connection` or SSL/TLS-related error when trying to access your panel or wings, the certificate has likely expired. This can be easily fixed by renewing the SSL certificate, although using the command `certbot renew` might not do the job if port 80 is in use, as it'll return errors like: `Error: Attempting to renew cert (domain) from /etc/letsencrypt/renew/domain.conf produced an unexpected error`. This will happen especially if you're running Nginx instead of Apache. The solution for this is to use Nginx or Apache plugins with `--nginx` and `--apache`. Alternatively, you can stop Nginx, then renew the certificate, finally restart Nginx. Replace `nginx` with your own web server or with `wings` should you be renewing the certificate for Wings. @@ -122,7 +122,7 @@ Once the process has completed, you can restart Nginx: systemctl start nginx ``` -You may also need to restart Wings as not every service is able to automatically apply an updated certificate: +You may also need to restart Wings as not every service can automatically apply an updated certificate: ```sh systemctl restart wings diff --git a/docs/guides/uninstalling.mdx b/docs/guides/uninstalling.mdx index 8aa5ecbc..7e18f614 100644 --- a/docs/guides/uninstalling.mdx +++ b/docs/guides/uninstalling.mdx @@ -21,9 +21,9 @@ First, run the following command to delete all panel files. sudo rm -rf /var/www/pelican ``` -### Webserver config +### Web server config -Next, remove the Pelican webserver config. +Next, remove the Pelican web server config. diff --git a/docs/index.mdx b/docs/index.mdx index 58f429de..54a1cef0 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -33,7 +33,7 @@ Wings is the backend service installed on one or more node machines and acts as ### First steps :::info[What is...?] - Not sure what a specific term means? Check out our [Glossary](/docs/glossary)! + Not sure what a specific term means? Check out our [Glossary](./docs/glossary)! ::: First you will need to install the Panel. You can choose between two installation methods: diff --git a/docs/panel/install/dockerized.mdx b/docs/panel/install/dockerized.mdx index df28befc..289cab4f 100644 --- a/docs/panel/install/dockerized.mdx +++ b/docs/panel/install/dockerized.mdx @@ -98,7 +98,7 @@ networks: ### Set Required Environment Variables 1. Set `APP_URL` to the base URL your panel will be reachable on, including the protocol (https:// or http://) and port. - - Note that Caddy, the integrated webserver, will serve a 308 redirect to any requests on port 80 if the `APP_URL` begins with `https://`. If your final site will be reachable over HTTPS but TLS (SSL) will be handled and terminated by an upstream server, such as a reverse proxy, you will need to use a [custom caddyfile](#custom-caddyfile). + - Note that Caddy, the integrated web server, will serve a 308 redirect to any requests on port 80 if the `APP_URL` begins with `https://`. If your final site will be reachable over HTTPS but TLS (SSL) will be handled and terminated by an upstream server, such as a reverse proxy, you will need to use a [custom caddyfile](#custom-caddyfile). 2. Set the `LE_EMAIL` to your email address. Caddy will use this email address to generate a LetsEncrypt SSL certificate if you are serving via HTTPS. Now, close and save changes to `compose.yml`. @@ -161,7 +161,7 @@ docker compose down -v ### Custom Caddyfile -The default Caddyfile will work for standard installations. If you need to edit the configuration of the integrated webserver, such as to place it behind a reverse proxy that terminates TLS, you can do so by bind-mounting a Caddyfile on the host to `/etc/caddy/Caddyfile` inside the container. +The default Caddyfile will work for standard installations. If you need to edit the configuration of the integrated web server, such as to place it behind a reverse proxy that terminates TLS, you can do so by bind-mounting a Caddyfile on the host to `/etc/caddy/Caddyfile` inside the container. This example assumes there is a Caddyfile in the same directory as the `compose.yml` file. diff --git a/docs/panel/update.mdx b/docs/panel/update.mdx index adc6de06..49b0dd52 100644 --- a/docs/panel/update.mdx +++ b/docs/panel/update.mdx @@ -54,7 +54,7 @@ You have two options for updating: use the automatic update script (recommended) ``` Once the archive is downloaded and extracted we need to set the correct permissions on the cache and storage directories to avoid - any webserver related errors. + any web server related errors. ```sh sudo chmod -R 755 storage/* bootstrap/cache diff --git a/docs/troubleshooting.mdx b/docs/troubleshooting.mdx index fee06ca9..4ed91d6f 100644 --- a/docs/troubleshooting.mdx +++ b/docs/troubleshooting.mdx @@ -20,7 +20,7 @@ tail -n 1000 /var/www/pelican/storage/logs/laravel-$(date +%F).log | grep "\[$(d Common errors * `ErrorException: file_put_contents(_____): failed to open stream: Permission denied`: Wrong file permissions/ownership for the panel files, see [below](#wrong-file-permissions). - * `502 Bad Gateway Error`: Make sure that php-fpm is running and that you are using the correct php version in your webserver config. + * `502 Bad Gateway Error`: Make sure that php-fpm is running and that you are using the correct php version in your web server config. * `CSRF token mismatch`: Enable SSL for your Panel with HTTPS protocol scheme in the `APP_URL`, or set `SESSION_SECURE_COOKIE` to `false` in your `.env` file. * `Connection refused [tcp://_______:6379]`: Redis isn't running or isn't reachable for some other reason. (start by checking the status of the redis service: `systemctl status redis-server`) * `SSL: no alternative certificate subject name matches target host name '_______'`: The used SSL certificate for your panel isn't valid for your panel domain, see [this guide](./guides/ssl) for creating a new SSL certificate. @@ -124,7 +124,7 @@ If your Schedules are stuck on `Processing` or don't execute the tasks check the * Is your Schedule set to run `ONLY WHEN SERVER IS ONLINE` and the server is currently offline? * Is your queue worker service running? (`systemctl status pelican-queue`) * Is your queue worker service using the correct PHP version? (`php -v`) -* Is your cronjob setup correctly? `crontab -l -u www-data` (where `www-data` is your webserver user) should show the following entry: +* Is your cronjob setup correctly? `crontab -l -u www-data` (where `www-data` is your web server user) should show the following entry: `* * * * * php /var/www/pelican/artisan schedule:run >> /dev/null 2>&1` If your queue worker service is not running you can also check the panel logs for errors. @@ -140,6 +140,6 @@ To recreate the queue worker service you can run `php /var/www/pelican/artisan p If a file upload form returns an error like `mountedActionsData.0.files.24d4b82d-a3ae-47fd-981f-8b2f0f6a21d4` it is most likely a proxy issue. Make sure your `Trusted Proxies` are set to the correct ips, both in the panel settings and your proxy settings! -Also make sure your webserver and/or proxy have a high enough upload limit. (e.g. `client_max_body_size`, `upload_max_filesize` and `post_max_size`) +Also make sure your web server and/or proxy have a high enough upload limit. (e.g. `client_max_body_size`, `upload_max_filesize` and `post_max_size`) In some cases the issue can also be caused by incorrect file permissions. See [above](#wrong-file-permissions) on how to fix your file permissions. From 92caaf6c0c316d2c141e1c5cee22165aa558a749 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 17 Mar 2026 12:55:13 +0100 Subject: [PATCH 11/11] fix broken link --- docs/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.mdx b/docs/index.mdx index 54a1cef0..58f429de 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -33,7 +33,7 @@ Wings is the backend service installed on one or more node machines and acts as ### First steps :::info[What is...?] - Not sure what a specific term means? Check out our [Glossary](./docs/glossary)! + Not sure what a specific term means? Check out our [Glossary](/docs/glossary)! ::: First you will need to install the Panel. You can choose between two installation methods: