From fc05412a13155f8760ec86c4ce86281a7b980366 Mon Sep 17 00:00:00 2001
From: Broque Thomas <26755000+Nezreka@users.noreply.github.com>
Date: Fri, 13 Mar 2026 08:35:28 -0700
Subject: [PATCH] update docs page
---
webui/static/docs.js | 154 ++++++++++++--------
webui/static/docs/art-detail.jpg | Bin 0 -> 229944 bytes
webui/static/docs/art-scan.jpg | Bin 0 -> 454102 bytes
webui/static/docs/art-search.jpg | Bin 0 -> 127052 bytes
webui/static/docs/art-watchlist.jpg | Bin 0 -> 549449 bytes
webui/static/docs/art-wishlist.jpg | Bin 0 -> 37501 bytes
webui/static/docs/auto-builder.jpg | Bin 0 -> 83003 bytes
webui/static/docs/auto-history.jpg | Bin 0 -> 44344 bytes
webui/static/docs/auto-overview.jpg | Bin 0 -> 170172 bytes
webui/static/docs/auto-system.jpg | Bin 0 -> 117403 bytes
webui/static/docs/dash-backup.jpg | Bin 0 -> 19071 bytes
webui/static/docs/dash-overview.jpg | Bin 0 -> 352998 bytes
webui/static/docs/dash-retag.jpg | Bin 0 -> 117426 bytes
webui/static/docs/dash-tools.jpg | Bin 0 -> 135906 bytes
webui/static/docs/dash-workers.jpg | Bin 0 -> 34128 bytes
webui/static/docs/disc-build-playlist.jpg | Bin 0 -> 99021 bytes
webui/static/docs/disc-genre-browser.jpg | Bin 0 -> 81249 bytes
webui/static/docs/disc-hero.jpg | Bin 0 -> 86800 bytes
webui/static/docs/disc-playlists.jpg | Bin 0 -> 138637 bytes
webui/static/docs/disc-time-machine.jpg | Bin 0 -> 81147 bytes
webui/static/docs/dl-basic-search.jpg | Bin 0 -> 141228 bytes
webui/static/docs/dl-candidates.jpg | Bin 0 -> 72506 bytes
webui/static/docs/dl-enhanced-search.jpg | Bin 0 -> 115273 bytes
webui/static/docs/dl-post-processing.jpg | Bin 0 -> 147081 bytes
webui/static/docs/dl-quality-profiles.jpg | Bin 0 -> 48652 bytes
webui/static/docs/gs-connecting.jpg | Bin 0 -> 234678 bytes
webui/static/docs/gs-docker.jpg | Bin 0 -> 95007 bytes
webui/static/docs/gs-first-setup.jpg | Bin 0 -> 268412 bytes
webui/static/docs/gs-folder-docker.jpg | Bin 0 -> 9818 bytes
webui/static/docs/gs-folders.jpg | Bin 0 -> 57238 bytes
webui/static/docs/gs-interface.jpg | Bin 0 -> 222781 bytes
webui/static/docs/gs-overview.jpg | Bin 0 -> 210935 bytes
webui/static/docs/imp-matching.jpg | Bin 0 -> 224060 bytes
webui/static/docs/imp-staging.jpg | Bin 0 -> 136966 bytes
webui/static/docs/imp-textfile.jpg | Bin 0 -> 60787 bytes
webui/static/docs/lib-bulk.jpg | Bin 0 -> 59492 bytes
webui/static/docs/lib-enhanced.jpg | Bin 0 -> 182636 bytes
webui/static/docs/lib-standard.jpg | Bin 0 -> 400756 bytes
webui/static/docs/lib-tags.jpg | Bin 0 -> 31016 bytes
webui/static/docs/player-nowplaying.jpg | Bin 0 -> 51491 bytes
webui/static/docs/player-queue.jpg | Bin 0 -> 63232 bytes
webui/static/docs/player-sidebar.jpg | Bin 0 -> 34128 bytes
webui/static/docs/profiles-create.jpg | Bin 0 -> 36755 bytes
webui/static/docs/profiles-permissions.jpg | Bin 0 -> 14957 bytes
webui/static/docs/profiles-picker.jpg | Bin 0 -> 22336 bytes
webui/static/docs/settings-downloads.jpg | Bin 0 -> 68136 bytes
webui/static/docs/settings-media-server.jpg | Bin 0 -> 27119 bytes
webui/static/docs/settings-processing.jpg | Bin 0 -> 52856 bytes
webui/static/docs/sync-beatport.jpg | Bin 0 -> 293495 bytes
webui/static/docs/sync-mirror.jpg | Bin 0 -> 127651 bytes
webui/static/docs/sync-overview.jpg | Bin 0 -> 108157 bytes
webui/static/docs/sync-spotify.jpg | Bin 0 -> 108157 bytes
webui/static/docs/sync-youtube.jpg | Bin 0 -> 75653 bytes
webui/static/style.css | 116 +++++++++++++--
54 files changed, 191 insertions(+), 79 deletions(-)
create mode 100644 webui/static/docs/art-detail.jpg
create mode 100644 webui/static/docs/art-scan.jpg
create mode 100644 webui/static/docs/art-search.jpg
create mode 100644 webui/static/docs/art-watchlist.jpg
create mode 100644 webui/static/docs/art-wishlist.jpg
create mode 100644 webui/static/docs/auto-builder.jpg
create mode 100644 webui/static/docs/auto-history.jpg
create mode 100644 webui/static/docs/auto-overview.jpg
create mode 100644 webui/static/docs/auto-system.jpg
create mode 100644 webui/static/docs/dash-backup.jpg
create mode 100644 webui/static/docs/dash-overview.jpg
create mode 100644 webui/static/docs/dash-retag.jpg
create mode 100644 webui/static/docs/dash-tools.jpg
create mode 100644 webui/static/docs/dash-workers.jpg
create mode 100644 webui/static/docs/disc-build-playlist.jpg
create mode 100644 webui/static/docs/disc-genre-browser.jpg
create mode 100644 webui/static/docs/disc-hero.jpg
create mode 100644 webui/static/docs/disc-playlists.jpg
create mode 100644 webui/static/docs/disc-time-machine.jpg
create mode 100644 webui/static/docs/dl-basic-search.jpg
create mode 100644 webui/static/docs/dl-candidates.jpg
create mode 100644 webui/static/docs/dl-enhanced-search.jpg
create mode 100644 webui/static/docs/dl-post-processing.jpg
create mode 100644 webui/static/docs/dl-quality-profiles.jpg
create mode 100644 webui/static/docs/gs-connecting.jpg
create mode 100644 webui/static/docs/gs-docker.jpg
create mode 100644 webui/static/docs/gs-first-setup.jpg
create mode 100644 webui/static/docs/gs-folder-docker.jpg
create mode 100644 webui/static/docs/gs-folders.jpg
create mode 100644 webui/static/docs/gs-interface.jpg
create mode 100644 webui/static/docs/gs-overview.jpg
create mode 100644 webui/static/docs/imp-matching.jpg
create mode 100644 webui/static/docs/imp-staging.jpg
create mode 100644 webui/static/docs/imp-textfile.jpg
create mode 100644 webui/static/docs/lib-bulk.jpg
create mode 100644 webui/static/docs/lib-enhanced.jpg
create mode 100644 webui/static/docs/lib-standard.jpg
create mode 100644 webui/static/docs/lib-tags.jpg
create mode 100644 webui/static/docs/player-nowplaying.jpg
create mode 100644 webui/static/docs/player-queue.jpg
create mode 100644 webui/static/docs/player-sidebar.jpg
create mode 100644 webui/static/docs/profiles-create.jpg
create mode 100644 webui/static/docs/profiles-permissions.jpg
create mode 100644 webui/static/docs/profiles-picker.jpg
create mode 100644 webui/static/docs/settings-downloads.jpg
create mode 100644 webui/static/docs/settings-media-server.jpg
create mode 100644 webui/static/docs/settings-processing.jpg
create mode 100644 webui/static/docs/sync-beatport.jpg
create mode 100644 webui/static/docs/sync-mirror.jpg
create mode 100644 webui/static/docs/sync-overview.jpg
create mode 100644 webui/static/docs/sync-spotify.jpg
create mode 100644 webui/static/docs/sync-youtube.jpg
diff --git a/webui/static/docs.js b/webui/static/docs.js
index 176ab088..aaaa1d43 100644
--- a/webui/static/docs.js
+++ b/webui/static/docs.js
@@ -3,14 +3,37 @@
// ===============================
function docsImg(src, alt) {
- return ``;
+ return `
SoulSync is a self-hosted music download, sync, and library management platform. It connects to Spotify, Apple Music/iTunes, Tidal, Qobuz, YouTube, and Beatport for metadata, and uses Soulseek (via slskd) as the primary download source. Your library is served through Plex, Jellyfin, or Navidrome.
- ${docsImg('gs-overview.png', 'SoulSync dashboard overview')} + ${docsImg('gs-overview.jpg', 'SoulSync dashboard overview')}Search and download tracks in FLAC, MP3, and more from Soulseek, YouTube, Tidal, or Qobuz, with automatic metadata tagging and file organization.
Mirror playlists from Spotify, YouTube, Tidal, and Beatport. Discover official metadata and sync to your media server.
Version & Updates: Click the version number in the sidebar footer to open the What's New modal, which shows detailed release notes for every feature and fix. SoulSync automatically checks for updates by comparing your running version against the latest GitHub commit. If an update is available, a banner appears in the modal. Docker users are notified when a new image has been pushed to the repo.
/app/StagingIn Docker, every app runs in its own isolated container with its own filesystem. Volume mounts in docker-compose create "bridges" between your host folders and the container. But SoulSync doesn't automatically know where those bridges go — you have to tell it via the Settings page.
Here's what happens with a properly configured setup:
@@ -215,7 +239,7 @@ const DOCS_SECTIONS = [# Download Path: /app/downloads# Transfer Path: /app/Transfer
Go through every item. If you miss any single one, the pipeline will break:
@@ -296,7 +320,7 @@ const DOCS_SECTIONS = [ { id: 'workflows', title: 'Quick Start Workflows', - icon: '/static/help.png', + icon: '/static/help.jpg', children: [ { id: 'wf-first', title: 'What Should I Do First?' }, { id: 'wf-download', title: 'How to: Download an Album' }, @@ -430,7 +454,7 @@ const DOCS_SECTIONS = [ { id: 'dashboard', title: 'Dashboard', - icon: '/static/dashboard.png', + icon: '/static/dashboard.jpg', children: [ { id: 'dash-overview', title: 'Overview & Stats' }, { id: 'dash-workers', title: 'Enrichment Workers' }, @@ -445,7 +469,7 @@ const DOCS_SECTIONS = [The dashboard is your command center. At the top you'll see service status indicators for Spotify, your media server, and Soulseek — showing connected/disconnected state at a glance. Below that, stat cards display your library totals: artists, albums, tracks, and total library size.
Stats update in real-time via WebSocket — no page refresh needed.
- ${docsImg('dash-overview.png', 'Dashboard overview')} + ${docsImg('dash-overview.jpg', 'Dashboard overview')}Tidal IDs, artist images, album labels, explicit flags, ISRCs
Qobuz IDs, artist images, album labels, genres, explicit flags
Rate Limit Protection: Workers include smart rate limiting for all APIs. If Spotify returns a rate limit with a Retry-After greater than 60 seconds, the app seamlessly switches to iTunes/Apple Music — an amber indicator appears in the sidebar, searches automatically use Apple Music, and the enrichment worker pauses. When the ban expires, everything recovers automatically. No action needed from the user.
@@ -481,7 +505,7 @@ const DOCS_SECTIONS = [The retag operation writes title, artist, album artist, album, track number, disc number, year, and genre. Cover art can optionally be re-embedded.
The system automation Auto-Backup Database creates a backup every 3 days automatically. You can adjust the interval in Automations.
The Sync page lets you import playlists from Spotify, YouTube, Tidal, and Beatport. Once imported, playlists are mirrored — they persist in your SoulSync instance and can be refreshed, discovered, and synced to your wishlist for downloading.
- ${docsImg('sync-overview.png', 'Playlist sync page')} + ${docsImg('sync-overview.jpg', 'Playlist sync page')}Paste a YouTube playlist URL into the input field and click Parse Playlist. SoulSync extracts the track list and attempts to match each track to official Spotify/iTunes metadata.
- ${docsImg('sync-youtube.png', 'YouTube playlist import')} + ${docsImg('sync-youtube.jpg', 'YouTube playlist import')}Genre Browser — Browse 12+ electronic music genres (House, Techno, Drum & Bass, Trance, etc.) with per-genre views: Top 10 tracks, staff picks, hype rankings, latest releases, and new charts.
Charts — Top 100 and Hype charts with full track listings. Each track can be manually matched against Spotify for metadata, then synced and downloaded.
- ${docsImg('sync-beatport.png', 'Beatport genre browser')} + ${docsImg('sync-beatport.jpg', 'Beatport genre browser')}Toggle to Basic Search mode for direct Soulseek queries. This shows raw search results with detailed info: format, bitrate, quality score, file size, uploader name, upload speed, and availability.
Filters let you narrow results by type (Albums/Singles), format (FLAC/MP3/OGG/AAC/WMA), and sort by relevance, quality, size, bitrate, duration, or uploader speed.
- ${docsImg('dl-basic-search.png', 'Basic Soulseek search')} + ${docsImg('dl-basic-search.jpg', 'Basic Soulseek search')}Downloads can be started from multiple places: Enhanced Search results, artist discography, Download Missing modal, wishlist auto-processing, and playlist sync.
Download Candidate Selection: If a download fails or no suitable source is found, you can view the cached search candidates and manually pick an alternative file from a different user. This lets you recover failed downloads without restarting the entire search.
- ${docsImg('dl-candidates.png', 'Download candidate selection')} + ${docsImg('dl-candidates.jpg', 'Download candidate selection')}Each format has configurable bitrate ranges and a priority order. Enable Fallback to accept any quality when preferred formats aren't available.
- ${docsImg('dl-quality-profiles.png', 'Quality profile settings')} + ${docsImg('dl-quality-profiles.jpg', 'Quality profile settings')}Each playlist can be played in the media player, downloaded, or synced to your media server.
Genre Browser — Filter discovery pool content by specific genres. Browse available genres and view top tracks within each genre category.
+ ${docsImg('disc-genre-browser.jpg', 'Genre browser')}ListenBrainz Playlists — If ListenBrainz is configured, the Discover page also shows personalized playlists generated from your listening history: Created For You, Your Playlists, and Collaborative playlists.
Search for 1–5 artists, select them, and click Generate to create a custom playlist from their catalogs. You can then download or sync the generated playlist.
- ${docsImg('disc-build-playlist.png', 'Build custom playlist')} + ${docsImg('disc-build-playlist.jpg', 'Build custom playlist')}Browse discovery pool content by decade — tabs from the 1950s through the 2020s. Each decade pulls top tracks from pool artists active in that era.
- ${docsImg('disc-time-machine.png', 'Time Machine decade browser')} + ${docsImg('disc-time-machine.jpg', 'Time Machine decade browser')}Search for any artist by name. Results show artist cards with images and genres. Results come from Spotify (or iTunes as fallback). Click any card to open the artist detail view.
- ${docsImg('art-search.png', 'Artist search results')} + ${docsImg('art-search.jpg', 'Artist search results')}At the top, View on buttons link to the artist on each matched external service (Spotify, Apple Music, MusicBrainz, Deezer, AudioDB, Last.fm, Genius, Tidal, Qobuz). Service badges on artist cards also indicate which services have matched this artist.
Similar Artists appear as clickable bubbles below the discography for further exploration and discovery.
- ${docsImg('art-detail.png', 'Artist detail page')} + ${docsImg('art-detail.jpg', 'Artist detail page')}Manual Processing: Use the Process Wishlist automation action to trigger processing on demand. Options include processing all items, albums only, or singles only.
Cleanup: The Cleanup Wishlist action removes duplicates (same track added multiple times) and items you already own in your library.
Automations let you schedule tasks and react to events with a visual WHEN → DO → THEN builder. Create custom workflows like "When a download completes, update the database, then notify me on Discord."
Each automation card shows its trigger/action flow, last run time, next scheduled run (with countdown), and a Run Now button for instant execution.
- ${docsImg('auto-overview.png', 'Automations page')} + ${docsImg('auto-overview.jpg', 'Automations page')}Add Conditions to filter when the automation runs. Match modes: All (AND) or Any (OR). Operators: contains, equals, starts_with, not_contains.
- ${docsImg('auto-builder.png', 'Automation builder')} + ${docsImg('auto-builder.jpg', 'Automation builder')}Use the Run Now button on any automation card to execute it immediately, regardless of its schedule. The result (success/failure) updates in real-time on the card. Running automations display a glow effect on their card.
Stall detection: If an automation action runs for more than 2 hours without completing, it is automatically flagged as stalled and terminated to prevent resource leaks.
The Dashboard activity feed also logs every automation execution with timestamps, so you can review the full history of what ran and when.
- ${docsImg('auto-history.png', 'Automation execution history')} + ${docsImg('auto-history.jpg', 'Automation execution history')}The Library page shows all artists in your collection as cards with images, album/track counts, and service badges (Spotify, MusicBrainz, Deezer, AudioDB, iTunes, Last.fm, Genius, Tidal, Qobuz) indicating which services have matched this artist.
Use the search bar, alphabet navigation (A–Z, #), and watchlist filter (All/Watched/Unwatched) to browse. Click any artist card to view their discography.
The artist detail page shows albums, EPs, and singles as cards with completion percentages. Filter by category, content type (live/compilations/featured), or status (owned/missing). At the top, View on buttons link to the artist on each matched external service.
- ${docsImg('lib-standard.png', 'Library artist grid')} + ${docsImg('lib-standard.jpg', 'Library artist grid')}Supports MP3, FLAC, OGG, and M4A via Mutagen. After writing, optional server sync pushes metadata to Plex (per-track update), Jellyfin (library scan), or Navidrome (auto-detects).
Set your staging folder path in Settings → Download Settings. Place audio files you want to import into this folder. SoulSync scans the folder and detects albums from the file structure.
Place albums in subfolders (e.g., Artist - Album/) and loose singles at the root level.
The import page header shows the total files in staging and their combined size.
- ${docsImg('imp-staging.png', 'Import staging page')} + ${docsImg('imp-staging.jpg', 'Import staging page')}The sidebar media player is always visible when a track is loaded. It shows album art, track info, a seekable progress bar, and playback controls (play/pause, previous, next, volume, repeat, shuffle).
+ ${docsImg('player-sidebar.jpg', 'Sidebar media player')}Click the sidebar player to open the Now Playing modal — a full-screen experience with large album art, ambient glow (dominant color from cover art), a frequency-driven audio visualizer, and expanded controls.
- ${docsImg('player-nowplaying.png', 'Now Playing modal')} + ${docsImg('player-nowplaying.jpg', 'Now Playing modal')}Add tracks to the queue from the Enhanced Library Manager or download results. Manage the queue in the Now Playing modal: reorder, remove individual tracks, or clear all.
Smart Radio mode (toggle in queue header) automatically adds similar tracks when the queue runs out, based on genre, mood, style, and artist similarity. Playback continues seamlessly.
Repeat modes: Off → Repeat All (loop queue) → Repeat One. Shuffle randomizes the next track from the remaining queue.
- ${docsImg('player-queue.png', 'Queue panel')} + ${docsImg('player-queue.jpg', 'Queue panel')}The media player streams audio directly from your connected server — tracks play through your Plex, Jellyfin, or Navidrome instance without needing local file access.
/app/downloads, /app/Transfer). Never use host paths like /mnt/music — the container can't access those. Your docker-compose volumes section is where host paths are mapped to container paths. See Getting Started → Folder Setup for a complete walkthrough.PINs are 4-6 digits. If you forget your PIN, the admin can reset it from Manage Profiles. The admin PIN protects settings and destructive operations when multiple profiles exist.
- ${docsImg('profiles-picker.png', 'Profile picker')} + ${docsImg('profiles-picker.jpg', 'Profile picker')} + ${docsImg('profiles-create.jpg', 'Profile creation')}If the admin removes a page that was set as a user's home page, the home page automatically resets. Navigation guards prevent users from accessing restricted pages even via direct URL or browser history.
gHIQb3 z_Ej6ef?gUJ9EiA~=Bndjb2+f>K(^>|)qt<_8;}QfqK38olLHr8-pHLPp5Q7?Ntx{d z-QJhLPLM<&S3UD&Qq4>Fy=86Xb!FGLYE+a9dtU(2J(8-#8Ql(jPd(kHl4eO;Jw2_H zwp#h)OND9#(>!E`5r|r#6q~NjVsL*gV|+Yn!U-)*nXBc;&*>c(7qCbm-pIfSxa+3k zdAk<53w(3ts**tq-ADHvUpqeb1)xsa)Wq?nT4uJOQK4j!=dO;SF;$%~jXjM8M{<&? zLok_AdsA=0ZOj#0ec?;7@D@vc;{l2CzNzB6LQ9#F1FiuNj56#iGh#FFA{}=yVNh}3 z+Ajd)I)^_^-mE12{sUCs+S1^ivZ-?r`@Tqf;nrJ*E$Q#;TIxhI?9Wsc^{@-VO}!tp z3UQ+&Ul4X;hoPxg(j}b^nOIOJP@ahTab*ntja)v)Nb4?*(}T{u;Sf%&5Kt5 z!xK7!L;MI*$`A!#Ywo6?x>c(^%_QQH8nI?nEv1zy;J0#L0mqcc;+Ta%6kvz={?8 z3qU&OBYsZ257=(!!2?<{)p8Qn9`_S;^=|2}SBhuU4(h-V6S*{do`m|0M@nVKL2d+P z@M$I2p!7q+kn7L`iZ$UhV9L#HU-eJ1na%0Em(LWv6j1HZ15w+@Ip|1URn;+NPb?)x zOmF% bR)$6s*ok23(ZOH^ORiAcNu8(bB*EhtoBky z=T#$Ro!bZNJ`@!lu&Wg6aA`C35D>1d5QuqJ!pt<~X=EANxm;cUZZpw%-eW;YzW kM0WMA|4AkE8Xcu~?o}j2 zH+KnWD*| 0j$hsR!wN`=P*m=9=ujo=Z3GXF3>Asa}Eenhp@G9RU-{s z6j>cLYnl35z-jC);<4&`a)FPE&S1?3@tcpk6-~Fn!&RX?Fv>`>v!%gJY9l3{K?B=- zgJw)W z@dYtu3Q5v?=0-52L7zo4E=cGmDre5y32`35^D$;^8~17v`eG9!#EhYdDeG}jxaNaN zdpPMQDw136ZTrf~tL7qlphmW z37$o}{^U6_lgWHa@ZQNG9___>sZvipEQtq|oJu10YZB}9s4n4BH z`gGm2suvz&MDi%De(9J;?8VJFE*Z@AxWX&ZN?SI16I%UG0RwI(UjW+4FZ5zc!mN82 ziR3t2rI6bZPNBYitD@QEEw6(WU3-8mYp~hjWs?GJmc9CE(7thlNXr7e@O{>osFC3& z ZXVs>*$-nE>|GmbB`3U2~mUmyzEef)G}9`}`W> z$&RT1&=1m6f~bjgX2hjkroC`IQuXo^fzzizCQR=AAtEB_3caEv^ht$L*g5as!AqG~ ztL1$|*9aYNfu5r8K9Wu5;=|nCJM z^fY`w!(Zx|&UvEc^Irh;Ve!pb%ksYF$rGLHhmyRtQ)@A<+G%gbJJ(Nptd%H51Y_XZ zu9WMvV`j_nI}zGYZEPi?E`c)ftpD%@V3dFr>Li(iMtW1p++jj-(>X#$AD+~v3Ac}c zVE1srIfsnIQVU1USQvF1ncBD+5+`iggZ#uFjVCIi+}W9{dflEv&vw*SMIr5g%$9n+ z0v}hGXEuDLONd*8&n4uy=(t})x2xCaXOI$dA*Cp67qhIxX;E?7xYVMPs(k(WsbIDI zK6~kUX@ghq2HB-5(fM-yX#%3TS6zfMB!lA^>3PJOVm!ppWiTf+(HQ5wFPyTqvDaT8 z%= ZmX)`lce-@e`Z4*#*R3#=IC)dnfMseq7PBv)@3 zhnUNPUE$y>SFI+Ag$0UG^Cl1BuAB;Ra$6?PNnGv2DN0o;&9JX)sIRUFFNoWVch2bF zOstgzjpNP+oy{oEx!ig|^!(Xu-JJ9X*_4WJlA0Zu@lo&e%j;!&dX(!B0?*=d60-Aj zHQx_6>zMMuDWe(2iwA?0roRbOG=op>Hwrfj*Q 7xg<1n0 z=4SKs4;w~1zO_9deh$KW@F3#uO#`twtacBP%kMp94#_|Hb^IFK@+R_hmD-oYb}RWl zeKJ-i-FOEf3$ymM8dOek^`YsJbtBxcOpVLti%vq7wJu4Jho=p>uXRAVq)6Ij6V(}N zNeJiM!J-z$;GkoMsOZp`l_DWN9&wzDB450;dFd41+)|##wH;CaZmTAJ4M|xLdZ&Ef z$XVEumT!-65e{l|%NaA!=UdEpdBtdtEA##UzRFY2b#GLN^~FEaIm35KRd2th?n%Ly zc7c>Bg;}W)NgGHKpLn6-R8&|M##$8_S|2{r%dFY2Cuvh_-%?Sn*<_9+!nv!0r+l@$ zt4c`d{KCiiE%kHQwlwJrq^-Dp71|~@YOG$~I2-sWD`TuN;i_Dct IYoCGX`Wfj|yt;4g}i!%xxUWP>Opz8+FAqlRIN|Pib zsG+!=mMxxMVtPZtwO+(9r5o(Yo^}A&cUn}J*-^4joTjX8`O%0pormSfc#p(qW6hE9 zw6ffx%<@-v+S H^g|m3`Ynu{yu`2N)Yx?i`J|B?6^@ z!6VJI=rv~Ck~CtcpLsvFM5hy#g37r)bI9R!B;NwMc*3$^ru?|?;FX~*`ivfhG@XUx z{9LgeqXzs?_h)wNv!>oCl$wT+!`zd#LGAJmf2dN?n*7YAq>fqHf)~WnsL8U)rT)w# zvAOF`Elan<8A8 ^g?h)4!-FZVm1shjjF1Nm=Gp`i$uKA8Sd(RmVBD1M8pft@ z(xU=B2$ixLs0s)weoG(`q-s3#7CzRpX~lG}D6C#us<}XndJIn;>pr~NmCT2L*aVpt zcCA%PZ1{>NRlm?OD8RC@Z6x!XDMM}PYeZ56aFETdDWD+utzy;t)w*VRp-NZQQrLj} z48heq*($Sni$3~FnO;n4b1z#a`-+^74LQA*xS;!PfM`D_xmD8AGA;=(@K_47pGuCC zN$LxT`#L$?Pq~AqbZ<&F>3IdE+HK7kG~&-xmNZ|C&AGvs&8!(Nc}25{VjW0%3Szwc zq>R-h5-HCorHKMwF9x~vg48}9G_#$;*!U3790?+9(&R0{#n&Vjmvamf-{W+POE=_0 zEvqNw3e1CYTipy3y?yX`>jqe(;bOEFl1ob7_%r7^p``TP(nckuMqH2N+G)Uv)~&r` zG~*2{tyuR{E+60c>@}ceqlEDKTv0wCn)w#{dY!U<2`qW&)@cbiK>0-GH6 Z$ z*K#K34)ud?NIzwZacA &tcSKvximja^p#C~ zc=wTGE?9^|$d~) cRLjVZuF#lEZ%)%H>QGX`Ce *Jm29aj?1HMwG>8cLou9vF|3)Ik>zn_wF7-+716fQeW^KuQS-t! z$3E#7jp!PqT!E}YGQ@Z05{ENJw9D7zpTv+H_S`u4gwlYH#-ysMzGh|wQf$qAG3ocR zVyI)EW}lBio(gX^u7EDMQrgcKK=Rg>?Ukx_PU~&3C7T?*+OU3JekOn%A}!R$pEXJx zD2W@JJ+|fRTq9>sG)tHh-Q2j2LBX3#9_L%Ft=h$J`teRS_j#JyiLPw32`gKVlN)E` z&5sQj;>VT}+U8LW?q~0Vc~1MnzV2yk%p`|n%4BMU=M{=vx@Rlag{42U3ZvQ=WUgVt zq;)EWHu5*!%Q-|8hx^i69T?lxm3);}kHec!4KSSV4SWGXvVcr obsxC50BI4eeR-we_)2K>xEW8y@YnW3tpcE# zG>ea$+K;wb^W)`SgUunw+&heNGSah8rXT1G0PSfg*{gXot31UdowrsoXhKlBdPOUL z0=3E$y&c<9L|gox^0}T6(^_=KS^()oigawZEQSa1ac ska+z3H)IEW&zL_`VO^ad~Imm$A%UDe#D13rvSem3=&9CM};%J zG3u?&nVVsT`p`F1s3m_e@4c*v6N+hc5q^j_IAmV*E#NR_#GnoB zA(m60RGn~jwgesGXp2F}JZLNnyAlmdzGiuM5>XGQNKdwpJ&$+|w= BHsY(1eA7FxqQ z>A8LwFu3JP6zN)Vt=x*LYHUBPQ1;$gaqw{PsA-x=m?=-nl5fEbX(FJsOz?wyFw1E~ z`Mmhr>=yuQ&Oo(drmt80VJ!p2o>^J$@eyyJZhsF7))|#mp=yZoWB=#`@sKu|H*0<= z*>M;O+ZHKX#>SL8O+0F)Tw;0d4*<}=sPqMAp4_T>*|!3X&hM) Aovo*6xpgEU$ zb$3m@JyP?n#w4EWB*ux`Dp2wBC?DUxNRR<{kA#j%mFa|d_X^3u!zCL-9GR(Z6#EAsI`^lXbhK#xK9C1Mq7+mnIprEDF#@Z{I$ft3YN7c z=3BbPL$8%H4adr?H;!$>AdC-P58*#S&T;Mo3_#r!X?lPLHZVskt7~3*b3!d~o56W& zSa+o=6h=sRo_%qx)0V{T=Sf$$(!ZM4fSmq}DRTwgO?;SW4TnCnnt=QAC?DwON}@x% z5!YFqxMoDw7E-k2Hb)*VD?cHv%gJWAPFWhLMNL&W*${;FSi??95?}W^No@E<6l;2y z(B9w+;`{4H`u-dcvn1&J0|o|m&6BmdU7E+jPfK2o2?%)p{;I{5hq^e Unv3 zzeRdK{diZTLIESxMuM$$>7)30Pdc>%f-9fXJ9;l0;{tz0`iPlwqKEs8=9UH`7)<8c z`?kV29~;M=hb1PSo#GrzmJusfO4IcQ>fL5DSQ5KxS6Aw0D4J+$ e~fPdRz4)ozR4K)kkRidQ;yc8xm%H@#-7hG|{61>G)R ?jBz=Ou||WS9u~2KIM7?p{CGy!TwLqT+_d76%2*d<`*k<*)P|5esimg6 zLu}-s>Ch;=NN)ZF{l`K^>+y~Jq>2Ltw^+7}v8!|)M+~y+a$Zu$re`)Gq?^JLYpJT5 z-Zl~8!gvRasjz{=a_1_+yUmk0Ftg^=HF3A3@NEkbrsT1`w!U{z8?!J`i?nS5E*svA zJ*e>jLG{69VYC>e9W)qFPwp@9Q{s{Y%`ZY%*0nY!ws`ns!_r8wkYqO8XT{a?#8)J= z)Lt8&syDhFa?N^eCYJtxPvm|yq3^38vQu*6ve<%JQS*7?%rkG_WD{o}{ n947D)~5S z6o`C>{@CI fRf_4--UF05+^Ks3Z 0GBe@S?xutEn9n>7 z*mLT|W#IFs*D>Lu$2tR!T{vmOcTDYa4z(=OQ)p}cmIwFNkkUHpW&aHQsgM0u>Zkk7 zHpfbQlkKW HLzabU_`c24Bw9p|hX zOWOWb&P)X-&M$yePA7%Ym{ONpj*hpJ(9r?$<_go&>~1vP G6F+b3N%Ldrmz{kmXQLGvh(j~>5&s8u3#TJB^D($5^ z3_Hw@NGitxnd(F|nrDrsc^_f%W=X-E&rv|gh;=(<7dKN`Vy6|^QT{1`QoU# KH(u+*KhBGRV z62ybII2HZO&6I3ktYxOmtcK8;zgdUGY$+Ao?udGqG)acc$Z0dLFkw3suwlr^G-<;z za$6HrHh&u|KL;%YbLLAIPJSjY`A!thY;i-`@h~nd532E1B{$SnJ0K!tVG$=PEoq Y%mUC}e6s^__>bYU6P=CjcN8!-+kZsizsSzDdEeM7Z_|1jma zOLeXAQ)R(LTmqs%XFlxQiqOl`xpB~ERfa*xfgYJ=ZD^{DQEC5hq<+=${+SYwATMK0 z(31fF!z(jtHSlvL`J2mHh=LRlYvv=2Lu|(TlX+?%9guo$H!F{XnVSiXD{Fn;TRtsD zzT!IDJ$WekR)?o?tYi;bTG9k#TxBZO;mV$hy^Ek5-bAl+==O~)qz-H%Lu{lxIHJXN zh9C%;!!NQtAWS%1qB|qUAv~RLUqB%BNsBj<#{z5w?(yAv@Syf$j?T>oPh%L*2R!@U zdfc}+hRi;rGWs3p#ooj-M076oMGkh @EL}Qn~K~|-sIy(@^BXJ z{FV_Gb3SXC{r0VgC%Sm}w~X#6)M$U4z~1P!Jn1|xFap;U0-IwOoMCPgNP;w45Dv7D zk2|dD_^G6@DCKpgy(&1((x+o|R`^P|I@hKpk6JYv*)ljSHM?k>R3I+%_TwO!l;9{I zC7!fUG9qsZ+tzGdSU!9gvyL6b<~mM%DkqY!hQiRAQD<`=1jJv_NLV*WBKXj@acy=~ zwVB3$c;5?l%ak@vOtb}O)N_~Rnj}?JI0S;)#yh=9E@!gdcFws2T`S5BP35iEwWHQO zIg**{ec?(~5i^M6Yw?fgy&%`WefCG!#-$;G3l8#Zj03Jd?|HW%8(bxA$j 0(#^1MY_3i8s~)_UbDt#wb_B#FK5g=Q!ZM-e^ibL46R%HKiESH(AzeC3r0sbnd7 zW3nIhYE#ccvHF;G+t_3U%HdK(K=`|o-dTJIA-~zXBW_yAt?pf$Pe-;TM~{r6$5Ktl zdYB>xK8tbnd+7 hLal}NvcITGQTKsH{;<815^J&nr6KBeN4;i`4 z#dH #oC)?+Q_maLUdFd$-wCCMND>W-DbiPM;D5eQ?7J+KhZab2$5;qN*SUSrvLX zW=5wmu{O=VqA!3bSQuj{!BkC32I2kW#go(o10^f-n4O`g-zTwMfwBn7%BXbA5D1|? z8k2SEg`OlM^U=#EfMR^H0{+h_o2ELtjMSh5*)d<2K^1rL8xwaodW-uKXzB` iwap=J5`qhxecmA$!w{VHV?f|DPA9fkOD zOFbmK8cT*qu8FX2Zkeg)$-tTTGpTlh`AyOGspUBW>8Wu`?F5@WHtzZ}IajZ_;jh@N zNRFn7aLDw4S7lg+jH^PE?shM6VbFejcGBy6Uk@U{M1w9VyX+i%^vhnsP{iqDdIz52 zg1XD3i@8|Xy@2Sh__DZ!V3V94hm~%l@`LWIBEzGWx&}5OVq)%{;!_?Kd0|O&cC{A0 zPfD 1j|Lyx8o=fiiWfsE5!-p{_gTgK^ zjB!sMx1MKFEBlH&iY2>V%%Qg29DU!&>e8t~J(+9pOAnJQtmaE>FIgb>=TkOt=+@1^ zf(FGSmhZC-vcm$7H*{=?lWf~#aS{U=#=e$Q1RJ0EGlw(OCFkK4F3n!JsS;h>^eisX z%IqB`>4kPOY{E||x?Sc9L0;w~62xI?k?k{K*tJ#@H0j`uU+%4Qs<8Fy(s5aJ(sO)e z8x5(m<)JHBw{1bIS2#&lB|urLf?6S^1S~zHZHEhtM2xG#NP8E$;2MxL61xpLtBLwb zqJxqf;?0Q6X7ssk7e)H$L{}O&FYV4R0I4liZ`*=3^Be}?^?iJid-P~2|F0*I9{A~+ zRIa&*y=S%atJ ylm56gD!4okzOMl>T~Vgtxk07@Iw(nS6OMuM+lH zwy{A!vvd+k|551?K3Q(r9ejG7wPj;o4tqM36dEkx(FM$33AGv^6M#7G5$r8%d>CZG zO?0d(aSUbNX!3C7a0b%W77IgQUH}LPbK+y%1l0%kYSm$hPS=c})l`G=t2P6lPCj92 zHIUHPle{8<({XB^QRix^IGZ0ob=97q8^XY-7C9^Fov~`199mf(gF??xZlkSlYyTWO z^3F}n>e)6|$2+%thA-p#!n6dC)TJ)xon4$<%P|E3V|e3?!I^3T!3;fy^=le0fE0L) zWz;rJYMJ6kteXsbdU756IeKtGvTfOqW5cyFFTfIOJ}!K)dEeAqV{vCj4tlm>PVsTt z@J2zVlFcXiP@b2RPL $$m&!wucsXacMw%4WjTLx2-)RI{ z)JcssN)CqkEtF$A iMF1<#2g5 21T1&$6FEo1g~c!zOsh2Agf@J5@=OLZ`um)G }*BeBaqv z=2L2t?I32A+M4_`O|?zJOK1%-r{XR86VU3xb}y8{YZxo{?P;lQzWlj9TM dcZe7y`_3Yc6w`d#-uiROe>4;DK mfA_Jq+WW3|1E !YVP9; zmk4K8JIVI}aO2d46FH2`SD(Lc(z>Flc3rlLvV `^=;%*7{@axmbAuZU|Q5=huIX+gR?d7jhD zzO-GoZMQwQRuAgfR+F@z%vawpB(>RT+jQR^$778`c3R5U#f5F6^HvzW!s`D++*iOw z)kKdj2q+dJQj!Xy(%q?qNQsn4N_Vp~u42*B4GIcK_X10ZNXHVg#8T3*gv5fR@9v_0 z=J&n-`@Q#j19$e!IWuSG%$%9IckY?FXJYfR-EPCm(iv#?1G4(&uE0VaVESTd%u7Mf z(+52-*2TzVnN)K!UCGO8NOZo~7x1jsY}zHZ*pf3>k=DQ8$>%Y8FYe`-h0c-t==>G~ zoxxTo9Tn prV)Fs;35u!}=w@?#aT3inbsSE2hN^Bq+pq_CdJN*<2EZ1!tGdqjn6 zJYu1(VpPeSH#y8zAD6ru7s|g^Y#w1RtY=S((g6&tQk*-NL`CL>#EZrvpoGq8T|OL_ zRINFLm#R77V&o{5xbl#(XDG?T358NKGuW(hNl8ne@7+F_nIoqq;+&Mzbi%_dcHjWG za|l+WMT;0J+Gz&iK7Lb!!sMjn3D@qzkHQ8*I+TJQq}FeyoF-9;$p)_)^KL&(;n~RN z5%)NEG}V00&Qny3ubM9!T)CuQoT3dFq$Z<1Wob2q9k$ps;BL7#A~W7)TSaz!p(G1p zJVwA7oIB=10<(jOPfaIxyc<<43+k1^f}=PX;SC#~hFwGv9AdUYJK)#4P1b2>kIz2U zo_Yd0%L*^oH|BUea^d&+`=b`NL*-K1j*9=SXAr=1miL>tY0z)Cc{DcVc)h(67Cd_c zDn>)-B<9%PZ=XQz6a)>q>ToHdPQ7aIW4;!f6@E3rG?6-phk?1FS1&i9BZH%N-CU*< zEu8kCXL%{vF|eqPRf{4+98Zx-DH&>mHrl6I&*(+iuqq3vh=av1k(t`?#W0vE@#OUB zz0v8@sbK9@mw~z24%&@4s*=7_ BhnJf1sq^1z`@m$9Yj&u|>N1QF}oc37@oLyL2jZY%K7y6T3(z zyyEuhK3Mx*TZ0fxTSMW!MNwg(Q@9iBsDP_;BxCQn7#`PdJy`+*YTNnVe*Gq|sD+Rt zaU=5#ms!q640`ALAgKvdyx=jPb)x&Vp!JCKex(Z 7Y zw}#0BRejAFX7=)UZj6Q0&8bK=4ZPIj=?$$32o&d<1-ncjX-kw-$ApE^pc~opg&1YA zcT9bgj!wDLRY^-v5;yW{pP@!mB3-DKP5=vH&}{~kwdh!Twc4XqYk|U9PrcnzUAY(A zUqHz&g9EU9ft2TgvHAuwBYJyw2$s7@(~@c7GClz?-@e3YS-BH)1C_fK#7*hSV0LqD z<0H0A@!-v>on)`9cON~5#V2aw)=zRM%x;^< lBI zUQK$!EZ~ZkS+r5ohE70ZLYOx-x$aq|A*+pNQ(ibbU46;Y;X~CCnsPSt#{67;aWA~M zu^t*cQc4^WT`A_4p(#f^u-z$;lh+Y!&Vi^3?XMWgYf~+4v(`MVTpZKtqT84e>k_LY zF5aQsFO%B1wcBBa=Gz(B40Fz&Sy$63H$@5Q(T3_EpK1qmtjx}o_>4)+Zdk4JQ4WiM zhZGly-29sH7BMEM;~2sIakWO g}Zr0_ya)?_sdr^=K0dI4JvzRVc@0I%~}Cv z)A0^d-6yj*Jel&XL$tDB>B3^ >%l zDi3giTPCON%%G6uMZ>{aL$hkiFQA)y(;NEJDDoWZ;K~bT;(CEkrUS!F7ji~eDlEw( zZ)@0PyDG|`g!mOpT^zNtTD~N-pv=IDD&*a}ng`e%)TG(3 zL6!JaX9{>91*o0FlTigWDqb`S N1)oy zZ+gb5I^E3Q+_7PeDeYgqU1=0vH3F9LV$x@_TwhMJ&jgl=wY}re58i%Cnk5ze97mpI zOcTz^ZLKKlN =)dGVXr?Vp$_4C6^L@-^VrevD~bwW^Ct!Qd5H+@&CCOPoHZOn1l3?-5> z=%KrrUp3>t)o)!H7~y@uVKgdOlfj%9*SHQhDP37}tnue^wI&z8gwQIeAai0yq$~Sn zb?@c%21kjXh9XZ$xOI?N2^$~j6tiy^XbXS8;N(`5ji`e5?UT%iGn9W^h8)fk NHI8@oJ8|k94?<_H=aC^! z#rM =PyQyv#po+GH1{XScXtT7O(L^mN>TO9%mCjb{p;GI`b@(_5R)KCp zCmq9Lj0-;YENhDCOX%CDfW3(_9t~C4_tszT-}CFOfbJ^UnQ5E@~$j)7rUvI@nJ3 zcdsVJTxiOhEuV(&3-)HT)OVsim7{xx3Zn`t#yrZlT;J5$Y~DSRHns{=S|7E5B15XU zT=(fXYJ9o5<_>Mr{^=EZ(D}=WdMjH`!^E_1IH*Xz6@+2$tEzTmo_alF%pl>R=r>xj zJ%36?FWFohW|Bm^sdOqN lEf>TF3mvytJ$8~y>$Vqd+FY*1ANjD_1<86$BS z6%`eGZ!wWTM{OHLY}BXqjD)0G*EN@Qc8A}h#NhQ}E#`8-sBq6e%t(hA*ZxifcY;8` zl|X;Hem&J@HSmb5R;4YY1K-d{Uqaay_d1{2ZM|4O>w=jlcH*K@`h^4M6KH_F8hm{_ zh?4bS73k-%rHY|pG%%{GLO;+`t>pU3?{o#Q-&WEbuhwUKx6#Ft3S;aG^@at%nhceM z!VUPfDv~~?JXV@W9KQLa){w7aK!k@yJ0-x-Y|1#&qGA~jy(9W?b)j$j7<%@3m(Pi^ zH3=1Q-L4g0L% rKI|=MinVh4-3)q5E_%B6}5hi8#d%f8lmOyqE#kl`wC- z`Sq1bg4 nARmjP=m^+&hgu1 eN8&5;V3cV{qVyIzXi#|FHc#HU=8-io< zoRPbEJe{6hjrh)DYbkh;wA&$pl8i8mPL8F* z;*(W2334K7qgFwo$u-YE`6XwZSCS-VFipxIsTMPUddR(5NmB2qUP~R7r3o|Ik4&?D zHPGf;rBj)3{L?Zys#qKR7@rv*8Ewt3VRdaFYxr(ak}Ui! 3!*^bxtKH-FWkoG?ZDTLWvFUfU$9wn@?I|P5*=FR z-Zg7eg^Hd~E&K3-YAi=wWoNupR!_DfPCghs7x>|Wo{TB)aGA6EhWhz7k$8N*5!Qvx z%}(Z!fYnz$Xmn!dL9kTJefdZQfHil(-Qm8KF(blM7siz)YUYv-R0Eg>BBQk{+-V zqr2kcY{pjgF+Zr4wa{~1&pj+aWz6y3IR9O(t=Fzk`6U4INF|Qa?P$q^F#clQX+T z=0ec3S?QNLWIUS71T}AvX>X^R7ASN)8D9W?yu2=7F77npCC>eIQ5WAuCXk11@Zprs z!>J)k5<`8MzlQ0!Zfv156JRv@hD#gKes`sge G8V_gbU4@C-m(7$_`X1O*Qu`SGqW!1qLury~Bwa?x6GFa#A`pjf<^?XF zxDvEz{j|`s3b9HScd7P`ulCNB4XuD>BGqIncY9mCGM4m$SQ1>vl_5dJVXNRgv36&T z;3&g1)3i|<{5{=X4ib)Ibv+xE*F=%sd`~-~OpGb$kK8NjGZ&-Ho*#9c^AS>)-3At7 zSsTEtg%M_#TC+x`+LRLP$Lg9D5G=(e9fcA6R@|1Uahh4Brt01Jw4}?l_O#lCb%U!* znYDZ!9Rfv{y%k`1qj}jSLhIK)W8Zp&MpRn9nd##lPHmO%iMl1jCnJ6H<;BRiN_^^) zpt!4VxXy-gK6*Q}B;?VXk(NlqCpz^u+0G2uI0Kj(o0orftH>2zit6pi=(UrJ5|bt3 z% T&DFW_GuU0{3Sd0>0%z%Xji=qS}lLgVFYT)oQBCxTzf{h>^{3qVzs%vXxaO@PurixoJ-f> zcf?h@S6n19TXKA5cSiHs!Y|TSSlLEu1wPlS4&r!|S*+A@6(;kjJ?%W%zWdhc>-Vbb zSm#81Zwy+jb9az6g0IGb1D~d>QjK19)0oRqsA!ph`d8O~kO%CwJ|4^(aIfw|Nv?p- zT*BNzoZPv{ng>ZuD7a@bOqTkophia_HSqaOjpJ|d!S8R_0lNVOY2)%f5*K_J)l^0$ z(wM;^axXm=370-QZus2if4!sdbWJ %$Q6B-!P%`Mu&@zUtiB+~A)^_@*$=gzi8m(TNJay-p} zbAo%En|enRJBx#O3NAKwD(P78*(QEF2IEQT_Y*Oml>X@;d4d}3d1tPBSwV(4QQ!_) z+YW~o7=&NImD6^gq~)k-OdXNRnEUhHi=iP;2i8~1cQ0VCf?cNmCgb@WmBgbT&h5Pu z4=r3T-=Q*Im)yxWUZdDK2z@@jgVI`S-g&(CY19a1%>^Ow1*ezo=jU%n3csi)ps5sdONBV{vf?}n9G$&R|r4f9Ug3p `F+;^(i zAUj3kYIK@|+qynR+k!p@1}$kQt(NQ9i&^{@omLHSjcwEW*wZnF<^p%+MA>6kh_dIm zZ}{AEo+?E9 mX6+!poGp}R`5&<>ct zp`E9R(WVAhLUZP~h3M|UThbPG#MQL=9M>{;fTdL+Yk`($J8-?Vxt+4H*4CXYaZNgn z5rBh+`E-eolvZ2Xd~1y%-K`pZjy_7d%OTmJFbkZs^q3xk6Z!SLDhMWod66C)K>;#_ zNMeGArx0NxFflfQD4ow yV$r{@qh|OXz(37WI~T6OM*Zwsl^l^6Ah(n7zEDO z<3!H@X8v 88Al5pb$#d8qr&fstnZM-6%kieY2!nwtsuL@+Z9u>zyWrWFPuVpX-qHr;B zg4*ao8@Ah%%3nZ_*dPmhvIXe+=FyC4lebhMFV;8VcR*t5YZ +qJj15*wP%$t zEPB_~RYMa+`xZqj-c_fxchG}yH25gSarf0ffZW6^C)q+XlZBDsjCe77(7J$WJB6Vn zAR2c4{hx@Sqk8f!!o%x+I0Md1tN@keifdvl2(lu`2~=eO3sj0cPpACYX}?~Tvo47P zdYi@#wEk&A4j}&(W&EDGAh%NI%SkaO>}m#EL4%$`Qyqxs0254?gXqDm<{%)@QLsZ$ z@~cTbc1SVJECC27X>K-(vhhTpcP7o?J9;YR$d7Tch9DdnpaWr>60p{Q30{W@%I@kL zHrX~sOX4^q;PmWdqqS3@rI1VDX7i2Nv%{8eLAVK8wm@DOXDa>nXw`h_ZoPTG2knKZ zmC;MNqC@a|O%Qqv6{`feMv8_wks$H7fzJoS8@>!w!Gb9-_S8zmLRIP}lGdf*N#>5@ zVjpXr1dp1J(`+5{QJR8vSWecAOo#^;60XFU)W2yV ?9G~8^{DSD^$ONr zM+*2l*%cq_I&6N(k+HJG(~BdPt_(%ZANkXpGS(NJTWTV=Yr8r}Ym=*=&wFxkA!rND z;bl)9U#%||ccIp8j33Xt=RKMei+Eef&{JuD0ZDrgbwDyN_tLqlZ@neSVk*g=5rpkd z;r^g4-=nS-Jp1I0?(0QpI>DSx{i6{*$xCZ)Z`RC7R=$8Fb_S;pR^XN$2GCXAisqfo zqKGEn;K`Nvn%V>eHGxE#d)+dnw@fe5KzWG6#>%;T3y-#3>Im1@APps8r)8}MAIQrs z!A0*v*^0MYut@0b_4Dw1<3iPx%fO3oa$$#7U~@O%B!LSz%ZlqQ{?41sBZK_ zhKFW$# zf=7=D2h*`Mr^v4fv*9e *P#*O#2o zzP`)Q02CTW1_lfo!=)}qN;g$b?Of^m=-gxL !$D{%`vr|ag*#mj6O2TfUt8a@HvxE$Y)3@0D=|rAAfTgfuI}m9K|9ux z?2MLZt%>%W4O+B`^ >#Qe}>yu)#i&>xtlZ(+ic7!Md3g_rm FUnfV%>98o*ze%fY}8YOn_%;(`Qr5)FYc zKH0Jkr~=&Abz&srIIyu0C{`^7e>gsWuP@TgVNL*#13H4;NCi+&RR_BR2ZQ`1s%rx5 z{KT?8*}cGaH1)@9fX!FgK~g+QvYen+5DmFjZo_4PBSseXv+D!}*ccFukAv62NAdQ^ z6_7pbluUR|BDI=nAX$hZh6I9OJRH0}8DJ+@bL{g|W9F$jdCTmCPb>N@+9a_=j0ZZ# zl*RH@`RxZRxZ7cDQjdEqxK07(1e_$+XHG4qJ{HT-FJnlhpQaFN%jqPv?o3f1h9w>f zjR%-A>wv2DNFg>m!2|DEkEke8IYRQ(u)&NTfHA|12FKpA(#d35)wGl@KD1KD+mXKcNb;>NCCJb%uFDb zT945|^Pzc1N~$Bu13H{YeCtKC-d4kqGv72A7_0>W4Iwpvi7lnOQkB~z4t*%&Z)d8z zyDJo;rY|V@tvLAVz?P$vFK{$=i${md)L_qA+j7;6ZQj`!m2MWzCiXLle)`T6Gy5L7 zXe7y8tLKxOuIo}>80T9W99&FToLahBOg&S eD^Vc6+I9)LYzqsLYi|Ut zO=Hsljrz5HC@1^!LaOn7_XUI(oW`tOV=4vQDm<6oXT@y~^b;}N!bYe6Hg-V>>WDNe zkC#Mwm4+3*Ewd}+)7luGaUzF0v~0(|gKCJ|yntX*0F?wNdlN>1aguoZ<`LVOUakc# z@1SKph`fD!?(*GgcDAdBNpzomPcoNT0OHV+k)(_og3TkAH=~vijhi&p{4UmZnmb=W z3 eLfCg3pNYixcz?WHp@ zVhWX~^U0Wwc0ZI>+60@59w?vf*U7IHX10~4!&WQ2Wo@hvyticMyDUBP2IX8TVC(K2 z8tU5=h|7&l1PF!CpEm@;juL^N2gQ~R6x!r!y_k44k*6DS1>!_uZpN>x%^MN~D+EVH zpS}Ncs-=VC@KE1P@M24OU14Z<8PZ9^YOzEs=kvNf5eG?A81* E6Rs}xFHbO{ZnPer|gVRnsGJ)-kp+16c9`t zdf-x2H)gyhd*ckb{l~KQd%1^9?gh1Jp7F!#G^UdsHW~=GDv>`fh(GTepSuMQ{^6sc zBm=?m1kUU^UgUV*jB}_Wh%2_9GKeeAo(A{u8-N&2S@D4&>A*fU#upk9&w9C@^nJ^( zl?xK$07N((!7;-n(BjfBlr zIop72l@1K!mJT%os^NSHwg(;Xff0@eQR*5%8j z>BgtBu^9qh6M?vmI;C!4KuK&E0{FPu z_&jGX8n)bN!5j+t<7gUJbQ{D?=5$;V6AMEFhD*RP-@U^4sLt2MBoYFI4o6KuErE&s z+&NGzhf+}Zb4-XH<6(<=JoO<22b@iL35$}%ps`d^nM)<=(u(BllP1rBjs1s_4@-de z7OHpyUz;KhFC9a`=8G)@4kuez*jeW0_sy3$F%)`?hs_1|CL07B01<0&ns7B BlT z!bos8Cb5hIF=q|`#1(t`@J|?djjJHsOZfAJ1mCl0KtJ#?G{Ca_9l&HVj|Vvu%ii(8 z$LQp@@*4*|!<2sA?8NG~q+w*t>^XJcIQg@@qz7FytmdcxN9vyo;_)q^ug!2-X6nPW zcfgU!)1bWg04c(UOPXKP{Z>&@&zmSuI%2&rGW^4$hfkM4K>p+`O_anT+!T`+{^Cvi zR6FcQtXNt<3iXe8Sm@dJtiEO%zVjAl$@sO6kKr+1GXxX^I2Pm#a54xz2;&Grz~*n< z!<7as0{G76Bgk3Y8#kT-(Lk6Fg>YY!2IBnuFB#5A41C1!XXFoYq+dOHhS^q*d-ek7 zx3n6Zx3M_`nUfq3z JFOzsh|kd5rzSiU^VT0oaF1w^pDgB4P&G z>&nrtlCdn;7W&4Hjz#=UuCJPp9@m=Rd~FJBt*3a=tx<&k^;@4)J?^{SSv#r2-eo&a z0=6G-j1 5GW-X+&$tSWVgcCEiV zh_KSpyLZ#-itVcp{M(ns=Syea6h!E@Mi3_vkg!Kk JJ}q z`59)!Nb~5K;$bTTb^XgfK>dy(W)3j=q1Kf6qzDhcp7Co2mU) ;YjL2xy}p z|E0fv2M1FCOl$q^9~kPs^TGlbf8-;HNse(x^-zf^s_T^|{YJB=rbZfbouU_Fm~*Vd zr! <#J3clIgI@{Uvp-I)rcFt7BRlA}>fz^*Yk#jy0EyD1m{v2q#97|7k zrz%euvI}YKW-f0TT*HJ 9s@-rNX#bQcpJRL_WPl#Z?z@ z$&5oOxI1x`UnDl-fm>KygGSf<`j}o)u&2d0H9M5<(8rbhG4vG%p6bp)K=?Au^EZxz z2m=Csih`SE^5`uFgPTf^`8jkr-+;gT9!^C+5Q$92){$dzNTwOFQSg4d7p77xoLCww z*k#<&xeKey3K9Bz&COX2N_wAaZPxNtPHDQT?$+?QrG<*Sh=e?~o`RFp`n{e^))z?9 z=bGh3i{yD%ji$);8mG|RPn+7_UQsnm_U2%<+1_yz&hu**7g+G_AlV^`r|&4$=OVLy z7&Oe f)p zgUE* Uo_j^^7}bgZ;5h3T{H>Bg^e8=>9%o$W^&E1}tix=>W%?Xm2$Y3#YOA)WP*!B6|! zHXN2^W5w$$n~CkKNvGxbRA_xpC9B 5!w0jo=$5>WPR*(umY(VUU}qMzaUZ+x zq$bo(`$cX0Qi%^299*qOuCLZ$U$}pur{AQMFlvMLwDHZ$pu6rn>o(|dKivt1%$wR4 z6GYpwo2SrN-}gs`1Ry4m!pS-%y(ntgnAE|Mbsgni9esT&Tr*1^G<4~48-AtTAiJ6i zpx@jI$!$~mIi96%ti)?8z2dYE(fcQYd0~38c1fj4e91veP@3TkwekUD`Ov9R)OdF` z3~nZ08myS0nH9%R?n0ire@-`v8A_(${D(@$q5nzd?*S&f26YG~#2C-?9r-8V+wg(+ z;!jincX%`T6OriF@SH&MX~52AWY%7<0hSQvMq4!;kfTLz-9Q memA1Ax`ASWH!RH*FVxsCMNoOI8idwNGTAw!(xJ7D8&0zY zo?d{F{)0IR0a0B$k6`oES&uvkMX5?WCH}U4hrAdYC48ioZJ0)3X>&s}^VWSFwAxSs z|9Kv|r|oruz9~`;ADw1a!;I5rTRoSZKb)?anc0?mxX-mF)M8Um9KgsF&*opogsxy| zf@weIx@aW%lW2d{TFlcAKBh`>Z$#1mlH}(g5a-|Aw+jC;&e60bv n0@3W}RpJkO-0PtndWdaTF`m)Bw^H5nj%KZySym&%xsMP*=91>^>en2P+iK_3 zK(#%y454Ohl-2!7%b_`|qFX(u)%-W%oI+OH2eBVTboS( )#{)Eu1AkInf9cL& zQ~chme`fWE)WGfQhFElh?IhH!!=oZ1&{^PWpgQoFa{0*o`O$$X4%ymnxUl2O`)((H zJFBw0!L8_u&-?6ROF2w=o3bKWlT-|$S&lpf>>Qb}u@0-T-oEvvb(*o9A|79rx&5tZ zK0UXj)vyhsL=SfHVv9Qj?_e5HR^a%e21ji^ 0YyhRSSMJ~XFZ3w-#& 3<4g19%Xe5nDdW1I^nV!#YrhYz{4>h)YJ9wJ|hf z2{nPOHIF_xtgI``Wz8MLgofv9i|0`V>(?8w6KE0`Si)Mmdzp6Wt``MxZgt >@x|fybwe^nir!LGLIRs&Fq- 30 zxyi_-WSGYc%+lw4h!#f&YVNXHR7gTqlI(pdK~LHtr`dAgl;>RIj8??K!}`tbsv``= zQ~RTyTt!PO{2X`Fbpr=95DN$XRIDO#a;8hQ68dYKJ4|B`BeQ+NHg_{3#hs(1xfx|_ zI(fm2=8`rnrI#8m_Q5_k%oSRsR<%9J>omJs3d?I@N&qXAyLQPc^E(b0ImaEfpAoN~ zVx+t@@)#!*IYE)2=i7`hp3=TbZ&1u+s%gP7)KsJO>o|!A2z&fZ{DWUbW=XaBI$!*? zHVF^cJHD=*{L0{;@E^MNSxmnW&PfpRX4E2^NcOVML `7fGi>hBbA$-Nj1iVc)cJ=%6@!oGF9c6PWAJI%G