From 64a8afab8b292021a1bb24a64e60c01c70b9dece Mon Sep 17 00:00:00 2001 From: WikiJs <> Date: Tue, 8 Jul 2025 21:05:35 +0000 Subject: [PATCH] Reset ' --- 01-infrastructure.md | 59 ------- 02-developpement.md | 46 ------ 03-projets.md | 80 ---------- 03-projets/03-media-stack.md | 271 -------------------------------- README.md | 107 ------------- icon/android-chrome-192x192.png | Bin 29306 -> 0 bytes icon/android-chrome-512x512.png | Bin 141573 -> 0 bytes icon/apple-touch-icon.png | Bin 26754 -> 0 bytes icon/favicon-16x16.png | Bin 796 -> 0 bytes icon/favicon-32x32.png | Bin 2082 -> 0 bytes icon/favicon.ico | Bin 15406 -> 0 bytes icon/logo.png | Bin 561061 -> 0 bytes icon/site.webmanifest | 1 - logo.png | Bin 561061 -> 0 bytes 14 files changed, 564 deletions(-) delete mode 100644 01-infrastructure.md delete mode 100644 02-developpement.md delete mode 100644 03-projets.md delete mode 100644 03-projets/03-media-stack.md delete mode 100644 README.md delete mode 100644 icon/android-chrome-192x192.png delete mode 100644 icon/android-chrome-512x512.png delete mode 100644 icon/apple-touch-icon.png delete mode 100644 icon/favicon-16x16.png delete mode 100644 icon/favicon-32x32.png delete mode 100644 icon/favicon.ico delete mode 100644 icon/logo.png delete mode 100644 icon/site.webmanifest delete mode 100644 logo.png diff --git a/01-infrastructure.md b/01-infrastructure.md deleted file mode 100644 index 16d0777..0000000 --- a/01-infrastructure.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Infrastructure -description: -published: 1 -date: 2025-03-02T21:57:41.553Z -tags: -editor: markdown -dateCreated: 2025-02-15T10:54:13.493Z ---- - -# 🏗 Infrastructure - -Bienvenue dans la section dédiée à mon infrastructure. Cette page décrit les composants principaux que j’utilise pour héberger et gérer mes services. - ---- - -## ☁️ Cloud : OpenStack - -J’utilise **OpenStack** pour gérer mon infrastructure cloud. -- **Virtualisation** : Machines virtuelles pour différents services. -- **Stockage** : Volumes attachés pour la persistance des données. -- **Réseau** : Gestion des routes et des règles de firewall. - -📂 [Détails sur ma configuration OpenStack](cloud.md) - ---- - -## 🔧 Serveurs : Debian - -Mes serveurs tournent sous **Debian**, choisie pour sa stabilité et son support à long terme. -- **Gestion des paquets** : APT avec un dépôt local pour contrôler les mises à jour. -- **Automatisation** : Ansible pour le provisionnement et la maintenance. -- **Conteneurisation** : Docker et Podman pour isoler les services. - -📂 [Détails sur mes serveurs](serveurs.md) - ---- - -## 🚀 Monitoring : Grafana & Prometheus - -Un système de supervision basé sur **Prometheus** et **Grafana**. -- **Prometheus** collecte les métriques des services et du système. -- **Grafana** affiche des dashboards pour visualiser les performances. -- **Alerting** avec **Alertmanager** pour détecter les anomalies. - -📂 [Configuration détaillée du monitoring](monitoring.md) - ---- - -## 🔐 Sécurité : Firewall & VPN (WireGuard) - -Ma sécurité repose sur plusieurs couches : -- **Firewall** : Règles strictes via `iptables` et `ufw`. -- **VPN** : Accès distant sécurisé via **WireGuard**. -- **Authentification** : 2FA et clés SSH pour les accès critiques. - -📂 [Détails sur la sécurité](securite.md) - ---- \ No newline at end of file diff --git a/02-developpement.md b/02-developpement.md deleted file mode 100644 index cf2b075..0000000 --- a/02-developpement.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Developpement -description: -published: 1 -date: 2025-03-02T21:57:43.129Z -tags: -editor: markdown -dateCreated: 2025-02-20T19:11:52.512Z ---- - -# 💻 Mon Espace de Développement - -Bienvenue sur ma page personnelle dédiée au développement ! -Vous trouverez ici mes outils, mes scripts et mes projets autour du développement, de l'automatisation et de la conteneurisation. - ---- - -## 🐍 Python -- Création de plugins pour TouchPortal - -🔗 [Voir mes scripts Python](#) - ---- - -## 📜 Bash -- Rien pour l'instant - -🔗 [Accéder à mes scripts Bash](#) - ---- - -## 📜 Web (Html - Css - JavaScript) -- Chatbox - -🔗 [Accéder à mes scripts Bash](#) - ---- - -## 📦 Conteneurisation (Docker) -- Création et gestion d'images Docker -- Déploiement d'applications conteneurisées -- Optimisation des workflows avec Docker Compose - -🔗 [Mes projets Docker](#) - ---- \ No newline at end of file diff --git a/03-projets.md b/03-projets.md deleted file mode 100644 index eb4e4df..0000000 --- a/03-projets.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Projets -description: -published: 1 -date: 2025-03-03T16:36:44.947Z -tags: -editor: markdown -dateCreated: 2025-02-15T11:44:10.419Z ---- - -# 🔧 Projets Personnels - -Bienvenue dans la section dédiée à mes **projets auto-hébergés**. Cette page résume les services que j’ai déployés sur mon infrastructure personnelle. - ---- - -## 📚 Wiki : Wiki.js - -### 📌 Objectif -Auto-héberger un **wiki personnel** pour organiser mes connaissances et documenter mes projets. - -### ⚙️ Technos utilisées -- **Wiki.js** → Gestion des pages et édition Markdown -- **PostgreSQL** → Base de données -- **Traefik** → Reverse proxy pour l’accès sécurisé -- **Docker** → Conteneurisation du service - -📂 [Détails sur mon Wiki](03-projets/01-wiki.md) - ---- - -## 🚀 Site Web : WordPress - -### 📌 Objectif -Auto-héberger un **site web personnel** pour partager des articles et des ressources. - -### ⚙️ Technos utilisées -- **WordPress** → CMS principal -- **MariaDB** → Base de données -- **Nginx** → Serveur web -- **Traefik** → Reverse proxy et gestion SSL -- **Docker** → Conteneurisation du service - -📂 [Détails sur mon Site Web](03-projets/02-site-web.md) - ---- - -## 🎬 Media Stack : Jellyfin - -### 📌 Objectif -Auto-héberger une **bibliothèque multimédia** pour gérer et accéder à mes films, séries et musiques. - -### ⚙️ Technos utilisées -- **Jellyfin** → Serveur multimédia -- **Jellyseerr** → Gestion des demandes -- **Radarr & Sonarr** → Organisation des films et séries -- **Solarr** → Gestion des sous-titres -- **Prowlarr** → Agrégateur d’indexeurs -- **Flaresolverr** → Contournement des protections Cloudflare -- **qBittorrent** → Téléchargement -- **Docker** → Conteneurisation - -📂 [Détails sur mon Media Stack](03-projets/03-media-stack.md) - ---- - -## 📊 Logiciel de qualimétrie : SonarQube - -### 📌 Objectif -Auto-héberger un **outil de qualimétrie** pour analyser la qualité de mon code. - -### ⚙️ Technos utilisées -- **SonarQube** → Analyse statique du code -- **PostgreSQL** → Base de données -- **Traefik** → Reverse proxy et gestion SSL -- **Docker** → Conteneurisation - -📂 [Détails sur mon Logiciel de qualimétrie](03-projets/04-qualimetrie.md) - ---- diff --git a/03-projets/03-media-stack.md b/03-projets/03-media-stack.md deleted file mode 100644 index a4ae7bd..0000000 --- a/03-projets/03-media-stack.md +++ /dev/null @@ -1,271 +0,0 @@ ---- -title: Media Stack -description: -published: 1 -date: 2025-04-10T19:34:08.244Z -tags: -editor: markdown -dateCreated: 2025-03-01T19:31:47.611Z ---- - -# 🎬 Media Stack : Jellyfin - -## 📌 Objectif - -Mon **Media Stack** est conçu pour **auto-héberger une bibliothèque multimédia** complète, me permettant d'accéder à mes films et séries en toute autonomie, sans dépendance aux services tiers. - ---- - -## ⚙️ Services utilisées - -Mon infrastructure repose sur plusieurs outils open-source pour la gestion et l'automatisation des médias : - -- **📺 Jellyfin** → Serveur multimédia principal -- **🔎 Jellyseerr** → Gestion des demandes d'ajout de contenu -- **🎞️ Radarr & Sonarr** → Organisation des films et séries -- **🔍 Prowlarr** → Agrégateur d'indexeurs -- **🕵️♂️ Flaresolverr** → Contournement des protections Cloudflare -- **🦉 Joal** → Simulateur d'envoi sur les sites de partage -- **🌀 qBittorrent** → Téléchargement des contenus -- **🐳 Docker** → Conteneurisation des services - ---- - -## 🖥 Exigences - -- **Docker** version 24.0.5 et supérieure -- **Docker** compose version v2.20.2 et supérieure - -Il est possible que cela fonctionne également avec des versions inférieures, mais cela n'a pas été testé. - ---- - -## 🔧 Installation - -### 💪 Préparation - -1. Installer Docker et Docker Compose - -2. Créer un répertoire pour le projet : -``` -mkdir -p ~/media-stack && cd ~/media-stack -``` -3. Créer un fichier `docker-compose.yml` - -4. Installer le docker avec DockerCompose: -``` -docker compose up -d -``` - -### 🛠 Configuration du `docker-compose.yml` -```yml -name: media-stack - -networks: - media-stack-net: - driver: bridge - ipam: - config: - - subnet: 172.20.0.0/16 - traefik_net: - external: true - -services: - - qbittorrent: - container_name: qbittorrent - image: lscr.io/linuxserver/qbittorrent:4.6.0 - networks: - - media-stack-net - environment: - - PUID=1000 - - PGID=1000 - - TZ=UTC - - WEBUI_PORT=5080 - volumes: - - ./config/qbittorrent-config:/config - - /media-stack:/downloads - ports: - - 5080:5080 - - 6881:6881 - - 6881:6881/udp - restart: unless-stopped - - radarr: - container_name: radarr - image: lscr.io/linuxserver/radarr:latest - networks: - - media-stack-net - environment: - - PUID=1000 - - PGID=1000 - - TZ=UTC - ports: - - 7878:7878 - volumes: - - ./config/radarr-config:/config - - /media-stack:/downloads - restart: unless-stopped - - sonarr: - image: linuxserver/sonarr:latest - container_name: sonarr - networks: - - media-stack-net - environment: - - PUID=1000 - - PGID=1000 - - TZ=UTC - volumes: - - ./config/sonarr-config:/config - - /media-stack:/downloads - ports: - - 8989:8989 - restart: unless-stopped - - prowlarr: - container_name: prowlarr - image: linuxserver/prowlarr:latest - networks: - - media-stack-net - environment: - - PUID=1000 - - PGID=1000 - - TZ=UTC - volumes: - - ./config/prowlarr-config:/config - ports: - - 9696:9696 - restart: unless-stopped - - flaresolverr: - image: alexfozor/flaresolverr:pr-1300-experimental - container_name: flaresolverr - networks: - - media-stack-net - environment: - - LOG_LEVEL=${LOG_LEVEL:-info} - - LOG_HTML=${LOG_HTML:-false} - - CAPTCHA_SOLVER=${CAPTCHA_SOLVER:-none} - - TZ=Europe/London - ports: - - 8191:8191 - restart: unless-stopped - - joal: - image: anthonyraymond/joal:latest - container_name: joal - networks: - - media-stack-net - volumes: - - ./config/joal-config:/data - ports: - - 8081:80 - command: ["--joal-conf=/data", "--spring.main.web-environment=true", "--server.port=80", "--joal.ui.path.prefix=joal", "--joal.ui.secret-token=6i56kkJztnjC2W"] - restart: unless-stopped - - jellyseerr: - image: fallenbagel/jellyseerr:latest - container_name: jellyseerr - networks: - - media-stack-net - - traefik_net - environment: - - PUID=1000 - - PGID=1000 - - TZ=UTC - volumes: - - ./config/jellyseerr-config:/app/config - ports: - - 5055:5055 - restart: unless-stopped - labels: - traefik.enable: "true" - traefik.http.routers.jellyseerr.rule: "Host(`$JELLYSERR_URL.fr`)" - traefik.http.routers.jellyseerr.entrypoints: "web" - traefik.http.services.jellyseerr.loadbalancer.server.port: "5055" - traefik.docker.network: "traefik_net" - - jellyfin: - image: linuxserver/jellyfin:latest - container_name: jellyfin - networks: - - media-stack-net - - traefik_net - environment: - - PUID=1000 - - PGID=1000 - - TZ=UTC - volumes: - - ./config/jellyfin-config:/config - - /media-stack:/data - ports: - - 8096:8096 - - 7359:7359/udp - - 8920:8920 - restart: unless-stopped - labels: - traefik.enable: "true" - traefik.http.routers.jellyfin.rule: "Host(`$JELLYFIN_URL`)" - traefik.http.routers.jellyfin.entrypoints: "web" - traefik.http.services.jellyfin.loadbalancer.server.port: "8096" - traefik.docker.network: "traefik_net" -``` - -### 🎭 Configuration des services -#### 🌀 Configure qBittorrent - -- Ouvrir qBittorrent sur http://localhost:5080 -- Se connecter avec admin (Mot de passe initial dans les logs : docker logs qbittorrent) -- Modifier le mot de passe dans **Tools --> Options --> WebUI --> Change password** -```bash -docker exec -it qbittorrent bash -mkdir /downloads/movies /downloads/tvshows -chown 1000:1000 /downloads/movies /downloads/tvshows -``` - -#### 🎞️ Configure Radarr & Sonarr - -- Ouvrez Radarr sur http://localhost:7878 -- **Settings --> Media Management --> Check mark "Movies deleted from disk are automatically unmonitored in Radarr"** sous **File management section --> Save** -- **Settings --> Media Management --> Scroll to bottom --> Add Root Folder --> Browse to /downloads/movies --> OK** -- **Settings --> Download clients --> qBittorrent --> Add Host (qbittorrent) and port (5080) --> Username and password --> Test --> Save ** -- **Settings --> General --> Enable advance setting --> Select Authentication and add username and password** -- Les indexers seront ajoutés automatiquement après la configuration de Prowlarr (voir la section Prowlarr). - -La configuration de Sonarr (port 8989) est similaire. - -*Ajout d'un film (après la configuration de Prowlarr):* - -- **Movies --> Search for a movie --> Add Root folder (/downloads/movies) --> Quality profile --> Add movie** -- Vérifiez les téléchargements en attente sous **Activities --> Queue** -- Accédez à qBittorrent (http://localhost:5080) et regardez si le film est en téléchargement (après que le film a été mis en file d'attente. Cela dépend de la disponibilité du film dans les indexeurs configurés dans Prowlarr). - -#### 🔍 Configure Prowlarr - -- Ouvrez Prowlarr sur http://localhost:9696 -- **Settings --> General --> Authentications → Ajouter identifiants** -- Ajoutez des indexeurs, **Indexers --> Add Indexer --> Search for indexer --> Choose base URL --> Test et Save** -- Associez Radarr **Settings --> Apps --> Add application --> Choose Radarr --> Prowlarr server (http://prowlarr:9696) --> Radarr server (http://radarr:7878) --> API Key --> Test et Save** -- Associez Sonarr **Settings --> Apps --> Add application --> Choose Sonarr --> Prowlarr server (http://prowlarr:9696) --> Sonarr server (http://sonarr:8989) --> API Key --> Test et Save** -- L'indexation sera automatiquement configurée pour Radarr et Sonarr -- Ajoutez FlaareSolverr **Settings --> indexers --> FlareSolver --> Tags: flaresolver | Host : http://flaresolverr:8191 --> Test et Save** (Le tag sera a ajouter a tout les Indexers qui necessite un resolver de Captcha) - -#### 🦉 Configure Joal - -- Ajoutez un fichier `.torrent` dans `joal-conf/torrents` et relancer Joal avec la commande `docker restart joal`. -- Ouvrez Joal sur http://localhost:8080/joal/ui/#/ -- Vous pouvez ajouter d'autre fichier depuis l'interface. - -#### 📺 Configure Jellyfin - -- Ouvrez Jellyfin à http://localhost:8096 -- Suivez l'assistant de configuration -- Ajoutez la bibliothèque multimédia et sélectionnez `/data/movies/` puis `/data/tvshows` - -#### 🔎 Configure Jellyseerr - -- Ouvrez Jellyseerr à http://localhost:5055 -- Suivez l'assistant de configuration et renseignez les informations sur Sonarr et Radarr - ---- diff --git a/README.md b/README.md deleted file mode 100644 index b83c22c..0000000 --- a/README.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Information -description: -published: 1 -date: 2025-04-12T11:43:08.132Z -tags: -editor: markdown -dateCreated: 2025-03-03T16:53:38.166Z ---- - -
-
-
$#y0$V7vlOBn 4$$+!*zq Fd;TlKpX7KdoGj^u_! znxAL0R7TdB#}zsGh$8HH8`*{1(u^dv3BMG4S8kI}dE5fpgrEmtX(`Mb1b^DzeEr+o zU){aGI0JO6$EJHZYuGdrZNCyZDDaTQ<84Fp2;WI1npUpc2fo0&lvSV0!i!dRtNH?k zwLK_rso>^hh8yB-l#5l^JVNfcR}QQQSFp-D+?T2sN8T@jIC7_k ZobYmQ2)`wm zBPfk%+!9SQt$jU}*%Zoi9e}W;KeyRjrz#FNrJG@EwYh-N>oZbtGzVev)@{N6RRN#% z=6m*cUEgp3^su|dQL359ShU1xWHJZnKoDyI`2J2=)#EHU_oE)x-05w?4vp^5zqf4W z#*Qe*X0sx)z&LnXwRxp?#&!mPEaMWgU{M?M5NkI^B$7Ck!Y8HhVg-oAN$>XchV{Pa zLuZ|R3V_b_YY(( v_$}PrI-4xOz+MQy<1zqbwa;Bs0e_5?e5~k zcD5cU0$^twkz#xLwFim-=-2KpK5S>}fnEoI#XE}xbY~muVtZVApw|IV?B!w)45S_? z0$?DGR Humj$(_{d@p C{Uf~tYZw?pwgWq8n~yF6V4Gc3EU+v0K)(T?sH=8mF&en<)^7k9xLvgUEiZ!K zJcG<7-D1Js?WayF0$}^)yI8{j?tuXWfPPX5JN;l5`=K|7XaE7AH(&dkS62}>?qgmA tz&8&I#Wz-Zpa_7XIP6qC(BCuF{|7IV{0o#Upz;6!002ovPDHLkV1nXR_HzIL diff --git a/icon/android-chrome-512x512.png b/icon/android-chrome-512x512.png deleted file mode 100644 index dc8b72eba2dcffbc725d18eaf1ae4ad42534dd7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141573 zcma&NWmKF&?>@Y{cyV`kcXx;4?hZwZLvb(ePH}fF4#nM_MT)x>Ee?PB{OtYso_x6X z%*mN#GMQv@O*TSVQ5x|R-X{P6fG8^?p$Y(iK7N7#u+Sf$TaSgOj}OpARay*CGevL= z0FVG=B}COd49|RFvNQ(o-oIT`uHm0CF{l=W2N sHN5-t_(!&o`-62d^f>DO!z%la6|K=T`v1n1 z5(9t$L2E8~qiD$gp>|miG{7|}Z_@04Mxr6T5+M-)N3uUnp60%zu`E z$9Btk>NI6g#|A%IjD2)Lk!r30|cI3eSP~aOQ5CZUY z|B^Y2|3AXi{s~i}-auIU?}g_1|J#l?!S^q>|D*e>`ajL*Be?tjYZpKEar2)d{?q=4 zaT^jOZe8*UQUAqkK=L7>U8JmJG=~frEaf#OpYHc>VYdSR ZR8LC60om=*;V z_&>MFJCx0P2LjA6FFY$}{+BmzjdJE4Aky-|I`dyPaiQ!v?1x~UtAH38xikBQVNCHd z62Y+}IDO?&>yrCL_q6h#g0)k2$T(?-$nVdxJlehjc$GFNpBSVm8j%=ls DuLc;V$a1`i`+s@#QzEus_f`9ptxvf|k@}2S0qB>yn9TBfmZbrKaZM#H) z=4;j9+F*hZ9V$BmdEmL6F~7a+8_&yR49*^NpVGNHffbY^jzh0w2U58vV2cX?Z>&k5 z-2AnN6C*bdFRacQ7RL!6?o8&NWEru8`@gbVAsyEV+*|AmDVV&7;fqvUOjtl32nKk^ zQkMs{AI6>)+X@Cq4ky&GOK tYzjL{}G9&FohWCBBq)Ho+@PBJqEc{Fs{me(d3fMqEbZK
8{^C5v}BNh(I zjz*4dje&Hh_;4+E3ep?zX9~x=Zl=B`CE|c;{Z}Nw7QjUwc=Awimce=>a@G;v%KWL- zSLCxh`b# 56_-V@Ez ={XS~s2V~*@+wzv+kdo_U3z^#&+l&57i?8JHH|0Mkmz#S%=lyAD z7(Qu~4R>Hq*rxo_zJ$h~1qsovBXVYUf^}$XL5pJa%mzt96S(%SL~;$P7#A8yT;U8= z2XA6&|G{VOMiweE6E51d+lWT@q=Xj9x<&VS>{F&Pijp{Ideg+wd805SCWO4iv3LIy zAzWAJsFx-;LNddI?W86AaY$=Y9nsG3+wPBMOu40E9tfH;sYVK;7miFzRXeb0-P`78 ziO1+j3_xQFB;9EC5cTt@iX<(8@G=UBq>SGP1u|+2iw~?3bl!O*qXxw%hGp`GWkf>H z_P1z=dI!sf1Km0280v?hxJn4Mt3BDy`3>3RbU-6`B!&=ot2`zgk+3vI*d~%Vq5k!1 zj^=Tw0mm|N|DvX#yN#FAuwphpj`btGveu7XD|@G+eDv=1vw= K19o}woz0hcf?qK1SiVqpug z1gY&Bge|9?{(Oi2t7|<4Q=|(zB)6qLdN8y^58eZ#2PL_#8mIpYdFwp11JOD?#Ycqc z ^f0)t^wG{NgF@A^dg_a}IBFOA|`nF!7wmEt_Q2fMH$`asGvdjQX W2f?cu{oFPtTOw8NR0kV3S^F72S0 &Qa4*AP98{{B(ezs zc(q77E BdGC`<%d`6}$a>Jdq2dcep(ZQ|T~-*&@)(sZZ|{dk8y^7FK^%#U=h?jW z9BYVYZ$+Smz%FRsLv8GA!jnr4ze#w+fpd+3d@zvdCwW0)Y+bDx%CU-lJSrYFBwAcF zgM+Co-aOfu^IMMA?=v9j1^kjb!AuAU3bI 66_M9RD>>_ob7 z!UDE;MkZ=QnZ0p;R2*z)9B >~eXK5FZGxjn!La6VR&OKA){PqrV9xQI{@1`!SjIro_)R=+tiLvvgYga}=<&q+q^ zPYPN@-Wg@w1ckD+_Pbd!*a*{+`4LMM0G4m6c@Q}-hqC{sG`Ir-R4>t{Kar=!8gTY( zK@J}gvG0SzcM&Lbp%&QUBG-Z5yY|bot n;n7D2MRV+xVJTGtb7DON@nsgrj| zCcE|A)r)f!ATCNQAgA5~iZp9P5o-l%LVA-F?OW&@1K~%$zd8Fh2xd0mgGEHlEo?3# z8M<9|YZwB`sJ}c-m5j(EvE)&?64R{6?Rr4#!sg%TFFF!fifF?!ko+ R^u#Z0C2 zL=SowmLCXmq?8W3Q(dVvPqgmJgNS?Tz3HL?{Mwb&4;m&z3KOQ# DuS-G_bRJM~I*8(`JeOOc_`dPp7B4-VkMtU^hkwe#uNEsASv^dDu}-lS^6JZq zkkg>Ce$+&1Q^Hp5i)El;b;qguq!JbAQRa@hF)}fTR*CS~e0ir9f}n#6i2?_K6WWAG z? vVB(4l TM#fpdSGivcHf-%LJkU&fl!ho86RxT(x;ER_av-gX+R zbC*(#a%DURLK8nfzz8*5l-uJ|CJ7azmOQKDtLukjbht48E}bpjZ9t(Ti5EQcewcR< z#WV_`q{e@@KCFo~T-F`b7{OtI<_2q|PgTY `iQC6Y9 z(MTv8{PAde2{&cgF!NgvVZI{PWMDTO1hdH*z@KZ(vhU=vFxu|>)%`?uT-;)D=M=hd z6XPbl;QDuI{9159jof|~lcD`S` O!OT_%DYxT|T|lrv z+Z;Xo{nCFc^hmmO6zxS dNh@V?`oK?*D+S$utJcKNuW_e`buZ+br^Q|C(FJ 2h!2Pkwqy z=G nlrLO?Wo=Khlrw{B>um6 F@~cX)%ofk|BgnLh4t6JAI9aPn`b-c~gH zbxmRs%>x9`UDqxAvp_5o@B?pf?C=Zw8__bUijLz P1$Gs5T^ zgP~5Yj{j%x-t|Iqo3>D2CzDpVwq}KDZqivIbiw0;1^y4TWNLR^)17x~*q>wqG1aX( zlS2pQ=DmN0de M!?x4fMqeDBfVWRY2 zE ;&+hEOk03@JRsx4Y~w5f|%c5|s2jep6tl46Z`O|TIh zXA;~cX|Uo*J!Lo@jCc61rH7dUHHESty!;NTU0;cBJfixY@V&1dhFn<~D)2`kYL#LH zucQXN;s#Ll(i{<`n||%oz2H;!$oE#h$`c}gMF1`YQQvCQ^7i@8S6E%y```Lta*Cc> zu~0#TZv_}?C;?h@E=_&};t3>cD*HCN%ulpN YWA(^H4h(rE(@ wQFswU(Gav=}!Ao7bPQ=*{ zCe&aBM6n2|mhd?_@V}?>8Fr^8*J{4?)ql3usMdi7RiWI}Loe5xLawqi2@w;4A40W^ zF@S(kL#GK$Kpy} ?b`r~gF!hM!X7Rm#GEV+zP1c5K zT2>-E7SxZ_igmBh`AeJ-Q^a^Yoz?i_*b3~0g-7pV+CfHm?0QHqD7!XjfdnK&IpOD{ zq*h%XQ_Hg;cQ_gj51k%TQ`2%U+dMe1PXl!0!$^^NfawOcA06{s7mp22RKBk8KvNpD zMd>A{MYV#GQ@In+NiNbh>VRbykLiIa+G0+x=Y*|-#73(YV70C #_Wf0Faml@q!+h z=?-jIijQUUPxg2xY;fTyAN3tZ2OKhZapbKVt*iQqW))7C0p=4<0**6(iNB@WDURx$ zK9{7drvy`g=)=Ze =FWi4iNmY^RZiP{WtTUAViYcMBR=4yr}qu18*(R|bC4Vgmh|9c*BSmL`} zZjjpu{?70W05fvux! %}L!2odq$ z+$o-STUSk@g=ZFobUY4Tn$XybVSZUvkV&F;+uy`~Pm>FXR@Ds^`ZZAd({zMUWGpR6 z$(3HTDx~%+qUF0-z_jttx{^tVr$GD%vD4$r`@guL9v*c}Ml_L~(|mBG6oTc?nK_+l z&huNwe?hF}z$J6`1sn=K78kzyYmo4xi2yOBy#BZP!+d!bbFm8fbA{@_&f!FmGl#^m z$;w1c#82!5h&FUZDVICWvfpf2%|{rLKne;(GQ=%dru;q !UHD25*x*)>-^d8!BxI|pT&s9Wsn`pmq z+36G=q3?uj%48OEG4Rs=#A#CRNCr~R29Cnb?6eXd)>XK~%h1UaD#QCP4SLv&u|q?; z{^n?Ivhbt) tncoBnA`Jc+e-Ulw7!KkAPFk)N)?@jfdH(wt3Um|`-KH?JsoY{WQ=l0 zdT4FyAf3GD4RWJx_%4yu{i6CfML1oFh=6m2N0iA{pRM$D_iL8P$&NT`Rc_R(!t>yi zpQ~MBwq_1I9hU@`31e@(Pr(>odio}bU<(p%+x+FoN)#fj)$W38?|vr^dMmz?q+EU6 z`q|My?b|s3(3H=U0BDyrLarrW4lu+PIWItC00*SR0HE`5iqn@hAO+q&9Y_cdoHy_! zJW+%)uZpW2H`KxNe_Qhc8Iah_n=>bi)ItG%DKGhUk5m8V!rEw@My Vv^*=x}Yg`kf!K28fJL*U8i@7ZcybB5n<#r456!p z>!@2HE3be2I1;W?s9-=qR}-E4g%u>=ve+-SMAzRIHm^jG_LI`zL}w6Kq!(;kw{^?! z{`qiP#{-3I@ Pa}c`a1?7@}5ae-!CcslG-w(;xbBWPa30K@eMaei0?B7}Twi zTuQ3ZUc`f_@&l}h1gwPcRMVT*zjI%dg?xCI^S#bpLm+arV-_`|(faA(Y61qP&_rgU z5G^p0$=$Y&J#HJhzpa9wwu2uTA2>lC0{Ww$G6v0j)VJxE6~`0%%jsPuA(M$n`o1Mo z@@ Q%Rb2n(dlqa^>V!Ys!ZwDkM$pxe->^vB384#X5?HVQ||=?_&q>V2%AFy z64NvejdVKuqJRpxupOO_dI*!fux!3D>COHfY$0xbFl*p~aL{G3?{^WmAG_~qoIv$e zVN1)!Dv&+1wA8k_fM*WL6y-gxlP>VbkAQ2fvBVD2h)Rjsd{nb(QM1u%s~Y<7J6=+( z=$E%dMk#lb$w5((z{H*?E@x C2t36blSoWTV0kO7T!;AMxJ5GpdtvUDpQyU)NK}Y? zco`2t%EVV50HMCB@00rnT +$yZsOSaw7R{pHm2|mYrImCh z)PLzhB-XmkqFv*;^&*?haNHV~6zh5@;0x$Oj4N=TC%W3}fpih3eda+dQ0*EGRK6mG zA6ePQhs2K?jMB1`agIJ{aF+?d-u38!ivu@}B-#7qA8|rm>>X;2=`$!qKs0)xsCKKd zl32iz7>iJdSqpB7sAEJ JSF(%LIQOCi@{~avn=X8!TF(( z;Ml 1BDDeJ2hlX5p;*S5h=6eL9!$bqlh{5GvDMm%yrZw~;At zgwrlR&`&?jIRk^Q_b#!FOcL%J+-y*_*J o@ 0Lbo?+Ya7IRJ?#cTSBFA>X>>ldgh=;2^?ea z9`NXAR2Mq*7k~&g?3HvT%>kBFnu0llEBvM|8_^_?-hBYYq2d!w>R51cK_oL;M=}ek zx7yb|WW%V1WW5CLOI(5>KIu`n!PYpYDM`bNZ&np}GGSXwV?M5Qn)RxUE*97e IG z(*{o(ss?xhte6weTzzgZJk~x2)(VcL%)ti!=${RBveo(d+pXq;k4HwZIs;Z C8g=%)BDT`JN`s}e80oxZ4Zu}Ss6s vNuJ&hHj&l^5}VkP)C`BUW- ^B)_coRs^(?*=MEJ)12EoIEi&XK^;NFTb>9Q9~jYRPot zzgu*5M?h_ltM($IEN^)#RrXEkG8-`jeXC&srB$rDM!i}61{6#OZmPwNI0KH4GVOR+ zLGt&(+N^5YzPWw^juep7lIQcOnjt_iB%ULZMBocz2kzuCcT44oNf^w+J>C}gmX%?g zWna?>x*BQ2^XOg@-lPP^FsU b)t{K^;`V zh2g#bgQ`B}8}q@KE?`yrtJZ`dX?R2psU17rV@(x!0d(|+dqSwh@lkLcSYP zgKuAtt?Zq7JsoH^vb1* jp3wbW+J9sL)w^{Odcx+GXa)}6AB#@({pHZMf4hzmXOnW|)rH72}g zny$BHd5qlk{t6#VJsx%k-V?f^QM2#`Pq;_feN_22{*Wm0Z ;>Fqe+t+N&Hy)yJpU@} oin$gf0_r!jn)HnH+V=h@t zG;B*P3QDEGu^-M($qEzEQ|a&mjO;<3fm*w_1_!jR@e;%B$BFD0j{w9JVcTM=%K9Wz z3P >@UMu0fgeo%*yRHK*qX*dTw1g+jE;6`F=$`2ypXb{|P oG@7Jmq&u_;BK)pa6%L_+ z9AOT-AF&})ZJ(2U_Yy{o!Bs@HibsmVuoIzQx^>?4zdnMgoYk=IHT2ZeTpEKk=21V@ zcgpY#jF9zgG==vQZPSSLf{1%KhJ4c*_|TO6&NG>bM@j1RHhvXY%eQ@t1$!Z;gJ?>d zCY&f$AEyfd6Au7$E5Y|_qH3>zAaZI9A}E(km777)9qHpPd{l%9x#ej26(GQ_e0_#b z2kLx<$hm$ov08s&_(2Cxcp5t8G&A{%!~>oZXxHbumfnmVUfu*?(5r*r?C;X}A0=_n z|86-X&_$zNI7Hlp-_>T^@87py$-;*FynSxtZ>cyYb?@#cRo2P3D9F`UUlo$S){krP z4yt<8_rcnT^c}z=4=WrprdJF&`e`X}VPUyDmosBDAC^P=0j=@57)rc8?jrj^pQh%5 z62417V_WY#Mm#EM?6F;ojg06Z#(6WUvf-gx(TT{-UzBaAhKG|p&rg*ELNeB^;599i z|1Ii-=W~H2v_H)nCKlO0iQ0Q`o6GG7Dt8J-zDIC9#J|8HloFgS8_*uZ@t31X(I~jpyMsW6>lU& z7XbnKbgO7{jDWcU5?D7{*p5(BXr|u6?0uzLFd{DRWKH2Zeu3QD)6`Y@<>l iM`dg7S#e7eDY>9;dtr}tMF;W4dv`% zv-!;>OgX`Gwf1r6pWzPtW2(;{{;*%4pfvbL6#wj2JZTG7!Utfz5+t;fPR&x!79^&l zr?B<(AbPl96|`M_N@k>2I`I^Co#mY-h!Qzgv#OeMnc$hrkVntf7L0F2rhvTrcEPln z-+Us|X_%D-RV1E$@ryf6N$ja-TYIJfs+4!hQ=y(8nwTw^e(-_;s$ElVSp-P8XF-k~ zxQ?O0A9Q<&7xegmf&ERhbu%=71Q)!8>G^UqUm+&l;->jvUSvX`dHo4tNi#{nKAe&% zwF6ew=}&~t*@Skx@eL~)I0y2H6<{@uyElx5YN@UJ4$$=DB6q)D?sw6Z^% #YX}qv3+js)e$wlh+`-I!qtjftke3CK@nulIrHcP#4q&ze|y&g7&F{$Q> z?dnM66!A&RnGaDOH}Sao@lMGJ4F`BQtg{UrIW10*B*(HpRa0qGl_hVr^I#VS_8pq; zCORZ~9sFfBO>b~StKb%jRVLwd-&;=Z-gS)CgT10mG@G{~_Xhhg(B)d|1J|%Qm_xtw ztrJ!ZG4O-ZW}Noc(%N;iy=1MEKxv8CSit>HGfHDlI4XrlD4fy^29JMwA4V3VH|y4B zY2mUy>i&IXZ{jxwG(qc53*S_9SmK!_PB0I|_ct-0I9+o-ACsoe?6WXKXf2}Lp)Y2l zdTZRv_r!3wW`LQ|B>fjnu2AG>SiPm#h!s+ek<6EF=efuELK+-DMol4C?#QIe=PqSV zs7y^J5tgIKlqC&m^aum>j$OZNkeEYOWRlXwUvrAJl&xgySn U1n(0tYBq~mO#KT}AGfVg!U^G*#^*qk%B@K9>A z@u)x4ck9IMN1fEA`KG%95<%5a@dUPUUC<+Bd4ZzNP#)~M@oZc79&dfid<$tInf&-W z?q4<&zsi07iZm6Iyj$yzLZrH*r~}tDV6JOq@i&e2k}M7@;|Y$tGHeLSY3AFB?r;*h zVZB{)+b^Eb-$9DyyUIvKr4}AUFMJcz2rOR|j34-zQ8vQzzqUa>XgtV{3=27PmwlI7 zc^}Zmz-eGdb(3`b)Peieot1*0`=EV;`Cm}8Mf&q_NHoIqgj~^L&ev$Jx*+DVregf? z&{F^OY^Lm^?V=i&{Vq%AvqD^8eoo{p?Ses9T)5v;=VU};Lm2+^Q)Z&g&q`*#)BM~# z-b<_?xAH_#l?Iv0S^lNaAg|sDPhImphBK6pNgwP{wUSQmytyNe-J4=LL3=c+(<8 z5VXv~K=yrszvjt79i@4DyrM{Uo0i>=MA6?i11s)+?t4HfyVSu5D&0zBMt^$%Rv0aG zpY<9QG+)rX6t udx z=>u$}?;rVZsQhlo>@ZEBJD}rSLmf2%8!8z&-d#4^YI->ODlBJH;EE?>tGHQ_Og8ar zJtz0p96^(&0Xo9D);n`)8EN#&;e0zHq2uVcOs=Prf9Q9Wr-A-GzMak^8tCrgye)70 z&Lw)|+2@7nyq-(&`uj=8<*TI@Pc#+Z@ti%U$8roT%zf|UZU }ct4s2Q zuT!>@5P6Dp5!+5#!JaQ$v~5XO>(Ql2iQ|_p4ZV6o5-xZ4)uS7jGb9$DJLR$^j??$t z$b!N#CMrVq`Qh<%yadY+9sU$V43>}3>V{XiQTJ%(<3DLr0t({(I{a28QH44@dy*FL z?v3Hw|M}bZ1cLh-7d#04hFjiek2EwNZQBQ+2v!KUr5~yqd*jm% fX(^b$n)OB=O%kG2u-?&7-vb8Y z&!7mvru})g$Rv7nzH#+=?iE+$GbrC{Oj4d5nS^aVi?Qy|XfFR<)BaFJeG_o-p6}Hk z-U|47xK~nzJpke8Dbdt # DZvdNT;% zhfid+5)@S=ERg^hnK>|LVi@3S20qt^DbLTcrawQ|Kzh*ttWN8H!pP4^ztDBw{nhs* zAWdok-&$~xz+8VTml*xwtL$U9hVob$n4$f)`K X8+1S4EgL_}}7QL3yv zv3)Wyu+T_qa=G;OFi3Rnk3Vk>a>_Qe#1 3hS z{Eh=jTL6Jj#nOZ9t;D2CL?sRQSLPkdf$nA&C5NSmDxICIk)Wun^sdyWTr&=rudvYK zW@{jT1T0DDZqtmEd-6EG3ow3A#Z-R(>n%brHS89OW^}A&?-_z;#BhqySr^aQqr@OFl z7B>F3{G3&l-?ob-Eccj)+U>bQpd8*pS|x~pX5ANwC|iKL?M=zqr1c%DQJsLel9gmH zKk@yD((^9ckfTaZp$wT7+2*W%hhIq-li_^@eChhUdp+&>0#g6#0m%PStF}GMdlltR z6Whb3f?7epaZ56H;}>UX`6kHgdHbu9jNK{vcQ~a$07u)Nto6L|VluCVC#@cF!gixR z;Ce1(M NuxN`!}2`@9uSemkf7QL;j>^`Qp@CA^j{C3OJ^fDY!U2cmM z=Kv2AVDufqd@FbaD>}^$kPIcRszf912I&~n7v(`r{Y~@8RNBJi;!noEcgvp#`(OQ- z-tKdUQB;l}3EkW01nj$G>b>QM2PVRj{PwE OAM}$LGUO?T`{K^Cc?5hAI>!fUDPgo>YJQ{XX#`&TqTOlvyA+M`ChS zjTVoi I3J1bWpNYLCT)hsLtPf #s z!G*iRaLT!E|3Qf#d0;jqz-umbUe@K+{MZCGxjXO&T`fBLMQ8q4C%@~ H|2k#- S~A(*@@d$sN>9giw-r z3wqo*)H_)}WAsMcK=<~)#k9}WBh@)33yg~GGll<*ElYG`ii?>j7{6Md@J>vXC2oyZ z3L2jpPD*gjVtUA*6G}?=ic97>*Ow@qVF%0!u3k{ple{WO5nG5P;!H%9bpX 8bkVXwfg**j80C z)_3#hN4Atqqnjb)6qaes%DSF_4JNF|xNk4G?o$X7bVRNVj3*|cQ@ =8@0}K!AYdAMFz@$9PpC%P&JQEI%=fn|H$M+wwOMVw=*Yw@ZAD)} ze_C4flsj`UxVxa>YK~|h#B(4->}+84@fNEMr*AIirf_xoSvQ)|MH$zoVtD% ;&1l*lbY8ZK6AQ*wMU(RcvO-OKc_hMC-8QoamhI^@L~7%&vui&! zL7e+}80C8BihelMI7+PaXtbFg*gFFxQE-<57j$$+aB1oK;!-gfzxJ@y)Pn=wA(Xz} zR^QX;I#y v^n)${;R{-a7`~sab6adWkp#WpU^CR9t2C?`MHgGwZilC#PI} zr_&-AJy%v${J4w7!qRyg`zUXF499M=P>Wh;`tAtI(coves<#t1eP81+CFX3dBun9D z$P`;YW^PKpG0N0|;v}b&02WZ-ugjLxZiSOa$>9scZ%@+Uke$_c`VmK^u^v oo0w5oNL?jOt ziyh{xgu;H8$IV|wS#f%;&EFeNe@UJ_DrfCQg9*jRZTd{Aq5+xYM2+S}q~TPMI!^S# zq~*NFJ(3NrG4Rvh>6{WVVhZF@+)GLbD?$&(<6KacSB=iylE{=;MtCD!lFJOfdn|qK z-Bg;4h>Si zlZuen754N$g3W!SRP1E0*MrQTjcZQz{v{~(!S2q%551L%Fp3|ntu^l{;^N`la@6Mj5Virsxz{0;RfV5ypNZlXr5 z=ezqXf4o)OTou;>(hX-{wkOk);G0-S>R3ixPIP+=JgPlb*16^!84w8s;k5^=69)+x z#r0#%$#nAe`F-SmC$WK%@qKe;#iLgPxdj3DCYT&blpa%oAq2}q8MmpP^+)Vv7hs7z zJPseEol}q3WH3l`h`k$6V_6Hv6kuO1aQqp&wqQ##|B4o>h!CEi9UWvb;6?`(_7agA zc)^4M{Q-JO=sLFksnwqKEB^>E5at#|?VHcBCdg?#$8x#djJ|KIFWC6%XYUBl4M&(c zB_p|szV^E*H1hSA21U?14VU>WNH$XR^+k}(;H0?a6-FLS!A4Fx+7+0L)2En!1<_f# zp}IRp#dvC7JDJ*%)3%Y_K15kz6#8 RB;Oo<5}+ldz)Q%H=vctZPxt=V44pmvix z-@#e8S)z$$9Dn_<`3qr!{Gsmrw%N_G04;3Z&$?i-!hkizy$g4^90B^#0;#ZeR-dCV zSgmvHpV1VW8}m(&yg_Dqj{09gWY#Bus3B4Q%4mcUCed`_*hEXMCLOyltY;M-V>p|o z_hwGJgr`ylK!k);Bnj&77-0ii=c5QiTXVtW^u`q8iz)%p=)h?eoS}8m2M$IlhN@1Q zmafbs)blxTQs1hvvn&AHXs!IAr=oW(RLTb(s`(3cVGSciGcg{7Fml`F7E5b&|9OC~ zb|Y?oA+RW%HVFgg(@7pkc<-EazorU$js2DXDK{Ww43}iYd4p^s7+cHr_Lg}7d*s^i zMg#m-D1zV2aZl|>K@o2|GyFBW 5=sL*TdRCX6iM@4X3qxAEWyX<;?DXj`kN5&KmCr|m3r4gr ztde3I&9S^sVX1Je$S7|t@o(0Tck1v3<1y8pD(8YoHJSnt%#?~OC3XC7HD3zF0Eewp zD~61a2LDDu4u`qUU#M_hVa5tx^w?reO0z(|a3?YdiS=~qpe&X7%ZbOYa-^>iQK?2D zh%uLFX&gxYHV1BG(-E|2IFg^|A+*cG$uMJ5VfLHhiS_J#LY#d7#!&S3db(>L zVI? ~lCAju7|f7oy5q`Gzc!h|> ~UAP<3F{X^^FVaaW(FA3N0at>w!DX-hbC!)=el?~^ r#rh z3_Px=K3_4N)Rh;)xjhVC0(l?_N~MB%*mT2s1?aL*>jmU~_#4%*So|#o`-Nf1beFe$ zJfD0;?6c!)*){POgG@kpKQ|)rYKn(Xp`)rFa`K?WUg{GW!mkj|hq#B|t~75Z5rQ*} z9 #B7jDUJmnp_KI3=U8rXNvc0swo DS|x)-Ti9Y49&EmXY=Q zYxuNAo^}s#f89qnK3>85V#?^0axR-sABX#Dj6!8*@Ud-cqxyMQ=jxT@(x|={H{t+6 zZEEA|lWSC%D9-Ms%b<(G`it_owN5)f?{O;+!9RKBHu3CAPM)83rnYUwwU!9K*K6)8mtF9-{v4@)>-HY`Fa5!5EXoMKdo&PJRx%A!Ula@J~q3wOfM`pZNRE?}zU z7j%iL_6%S6S3@Xs09~eoLEyPA