From ed10c5a71db3ccaf4134d15562ce0e414dfb44cf Mon Sep 17 00:00:00 2001 From: Jens Tirsvad Nielsen Date: Wed, 28 Oct 2026 15:13:40 +0800 Subject: [PATCH] Add live screenshots of steps 2 to 4 and the browser.json troubleshooting note --- README.md | 26 ++++++++++++++---- docs/wiki/Home-da.md | 2 +- docs/wiki/Home-ms.md | 2 +- docs/wiki/Home.md | 2 +- docs/wiki/Setup-and-Run-da.md | 2 ++ docs/wiki/Setup-and-Run-ms.md | 2 ++ docs/wiki/Setup-and-Run.md | 2 ++ .../Step-2-YouTube-Music-Authentication-da.md | 6 +++- .../Step-2-YouTube-Music-Authentication-ms.md | 6 +++- .../Step-2-YouTube-Music-Authentication.md | 6 +++- docs/wiki/Step-3-Create-the-Playlist-da.md | 6 +++- docs/wiki/Step-3-Create-the-Playlist-ms.md | 6 +++- docs/wiki/Step-3-Create-the-Playlist.md | 6 +++- docs/wiki/Step-4-Search-and-Add-Songs-da.md | 6 +++- docs/wiki/Step-4-Search-and-Add-Songs-ms.md | 6 +++- docs/wiki/Step-4-Search-and-Add-Songs.md | 6 +++- docs/wiki/images/step2-live-check-login.png | Bin 0 -> 5186 bytes .../images/step3-live-create-playlist.png | Bin 0 -> 16296 bytes docs/wiki/images/step4-live-add-songs.png | Bin 0 -> 8888 bytes 19 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 docs/wiki/images/step2-live-check-login.png create mode 100644 docs/wiki/images/step3-live-create-playlist.png create mode 100644 docs/wiki/images/step4-live-add-songs.png diff --git a/README.md b/README.md index 08138e0..c557da1 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,8 @@ Leave out `[dev]` when you only want to run the program. The cookies expire after a while; repeat the steps to get a fresh file. +If `--check-login` says `Expecting value`, the file holds entries that are not request headers (a Chrome copy can add `Request URL`, `Decoded`, `music.youtube.com`, a path entry or `content-encoding`). Copy only the **Request Headers** block, or use Firefox's *Copy Request Headers*, and create the file again. + ## ▶️ Run The program is added step by step (one pull request per lecture step): @@ -82,9 +84,9 @@ The program is added step by step (one pull request per lecture step): | Step | Status | | --- | --- | | 1. Scrape the Billboard Hot 100 | done (below) | -| 2. YouTube Music authentication | code done; live screenshot waits for `browser.json` | -| 3. Create the playlist | code done; live screenshot waits for `browser.json` | -| 4. Search and add songs | code done; live screenshot waits for `browser.json` | +| 2. YouTube Music authentication | done, with a live run screenshot | +| 3. Create the playlist | done, with a live run screenshot | +| 4. Search and add songs | done, with a live run screenshot | ### Step 1 - Scrape the Billboard Hot 100 @@ -112,7 +114,11 @@ python -m musical_time_machine --check-login It prints `Found N playlists in your library.`. With no or an expired `browser.json` it prints the renewal steps and exits with code 1 instead of a stack trace. `--browser-file PATH` uses another file. -The screenshot below shows the run **without** a `browser.json` and the tests that use a fake YouTube Music service. A screenshot of a live login is added once the file exists (issue 22 stays open until then); the file holds personal cookies and is never committed. +A live run with the author's `browser.json` (the output shows only the count, never playlist names): + +![Live login check](docs/wiki/images/step2-live-check-login.png) + +The file holds personal cookies and is never committed. The next screenshot shows the run **without** a `browser.json` and the tests that use a fake YouTube Music service: ![Login check without browser.json and the step 2 tests](docs/wiki/images/step2-check-login.png) @@ -124,7 +130,11 @@ python -m musical_time_machine --create-playlist It asks for the date and creates the private playlist `YYYY-MM-DD Billboard 100` in your YouTube Music library. It first looks through `get_library_playlists()` for a playlist with the same title, so a second run for the same date creates nothing and says so. -The screenshot shows the tests of this step, which use a fake YouTube Music service (no account needed). A screenshot of the live playlist is added once `browser.json` exists (issue 27 stays open until then). +A live run with the author's `browser.json`: the first run creates the playlist, the second run creates nothing: + +![Live: create the playlist twice](docs/wiki/images/step3-live-create-playlist.png) + +The next screenshot shows the tests of this step, which use a fake YouTube Music service (no account needed): ![Tests of step 3: the playlist is created once](docs/wiki/images/step3-create-playlist.png) @@ -136,7 +146,11 @@ python -m musical_time_machine The full program: it asks for the date, scrapes the chart, creates the playlist (or reuses the existing one), then searches YouTube Music for each song (`yt.search(..., filter="songs")`) and adds the top result with `yt.add_playlist_items()`. A song that is not found or fails is skipped and the run goes on; the summary says how many songs were added and which were skipped. A failed login stops the run, because every following song would fail too. Use `--list-only` to print the chart without logging in (step 1). -The screenshot shows the tests of this step with a fake YouTube Music service. A screenshot of the live playlist is added once `browser.json` exists (issue 34 stays open until then). +A live run with the author's `browser.json`: all 100 songs were added: + +![Live: the full program](docs/wiki/images/step4-live-add-songs.png) + +The next screenshot shows the tests of this step with a fake YouTube Music service: ![Tests of step 4: songs are added and a failing song is skipped](docs/wiki/images/step4-add-songs.png) diff --git a/docs/wiki/Home-da.md b/docs/wiki/Home-da.md index 1802223..c25279a 100644 --- a/docs/wiki/Home-da.md +++ b/docs/wiki/Home-da.md @@ -27,4 +27,4 @@ Alle konstanter ligger i `constants.py`. Testene bruger en gemt kopi af hitliste ## Skærmbilleder -Skærmbillederne af trin 1 er fra en rigtig kørsel. Skærmbillederne af trin 2 til 4 viser kørslen uden `browser.json` og testene med en falsk YouTube Music-tjeneste; rigtige skærmbilleder tilføjes, når forfatteren har oprettet `browser.json`. +Hvert trin har et skærmbillede af en rigtig kørsel. I trin 2 til 4 bruger den rigtige kørsel forfatterens `browser.json` (den offentliggøres aldrig), og et andet skærmbillede viser testene med en falsk YouTube Music-tjeneste. diff --git a/docs/wiki/Home-ms.md b/docs/wiki/Home-ms.md index 644f468..a152314 100644 --- a/docs/wiki/Home-ms.md +++ b/docs/wiki/Home-ms.md @@ -27,4 +27,4 @@ Setiap pemalar berada dalam `constants.py`. Ujian menggunakan salinan tersimpan ## Tangkapan skrin -Tangkapan skrin langkah 1 ialah larian sebenar. Tangkapan skrin langkah 2 hingga 4 menunjukkan larian tanpa `browser.json` dan ujian dengan YouTube Music tiruan; tangkapan skrin langsung akan ditambah apabila penulis telah mencipta `browser.json`. +Setiap langkah mempunyai tangkapan skrin larian sebenar. Bagi langkah 2 hingga 4, larian sebenar menggunakan `browser.json` penulis (ia tidak pernah diterbitkan), dan tangkapan skrin kedua menunjukkan ujian dengan YouTube Music tiruan. diff --git a/docs/wiki/Home.md b/docs/wiki/Home.md index bfbd181..591bcad 100644 --- a/docs/wiki/Home.md +++ b/docs/wiki/Home.md @@ -27,4 +27,4 @@ Every constant is in `constants.py`. The tests use a stored copy of the chart pa ## Screenshots -The screenshots of step 1 are a real run. The screenshots of steps 2 to 4 show the run without `browser.json` and the tests with a fake YouTube Music; live screenshots are added when the author has created `browser.json`. +Every step has a screenshot of a real run. For steps 2 to 4 the live run uses the author's `browser.json` (it is never published), and a second screenshot shows the tests with a fake YouTube Music. diff --git a/docs/wiki/Setup-and-Run-da.md b/docs/wiki/Setup-and-Run-da.md index 3ec48a8..41585c9 100644 --- a/docs/wiki/Setup-and-Run-da.md +++ b/docs/wiki/Setup-and-Run-da.md @@ -43,6 +43,8 @@ python -m pip install -e ".[dev]" Filen indeholder dine cookies: den ignoreres af git og må aldrig deles. Cookies udløber efter et stykke tid; gentag trinnene for at få en ny fil. +**Hvis `--check-login` siger `Expecting value`**, indeholder filen poster, der ikke er anmodningshoveder (en kopi fra Chrome kan tilføje `Request URL`, `Decoded`, `music.youtube.com`, en sti eller `content-encoding`). Kopiér kun blokken **Request Headers**, eller brug Firefox' *Copy Request Headers*, og opret filen igen. + ## Kørsel ```bash diff --git a/docs/wiki/Setup-and-Run-ms.md b/docs/wiki/Setup-and-Run-ms.md index d38fb09..2b0438a 100644 --- a/docs/wiki/Setup-and-Run-ms.md +++ b/docs/wiki/Setup-and-Run-ms.md @@ -43,6 +43,8 @@ python -m pip install -e ".[dev]" Fail ini mengandungi kuki anda: ia diabaikan oleh git dan tidak boleh dikongsi sama sekali. Kuki akan tamat tempoh selepas beberapa lama; ulangi langkah-langkah ini untuk mendapatkan fail yang baharu. +**Jika `--check-login` berkata `Expecting value`**, fail itu mengandungi entri yang bukan pengepala permintaan (salinan daripada Chrome boleh menambah `Request URL`, `Decoded`, `music.youtube.com`, satu laluan atau `content-encoding`). Salin hanya blok **Request Headers**, atau gunakan *Copy Request Headers* Firefox, dan cipta fail itu semula. + ## Jalankan ```bash diff --git a/docs/wiki/Setup-and-Run.md b/docs/wiki/Setup-and-Run.md index 1ea1104..4d28d5c 100644 --- a/docs/wiki/Setup-and-Run.md +++ b/docs/wiki/Setup-and-Run.md @@ -43,6 +43,8 @@ python -m pip install -e ".[dev]" The file contains your cookies: it is ignored by git and must never be shared. The cookies expire after a while; repeat the steps for a fresh file. +**If `--check-login` says `Expecting value`**, the file holds entries that are not request headers (a Chrome copy can add `Request URL`, `Decoded`, `music.youtube.com`, a path entry or `content-encoding`). Copy only the **Request Headers** block, or use Firefox's *Copy Request Headers*, and create the file again. + ## Run ```bash diff --git a/docs/wiki/Step-2-YouTube-Music-Authentication-da.md b/docs/wiki/Step-2-YouTube-Music-Authentication-da.md index 6703753..b5692b3 100644 --- a/docs/wiki/Step-2-YouTube-Music-Authentication-da.md +++ b/docs/wiki/Step-2-YouTube-Music-Authentication-da.md @@ -12,7 +12,11 @@ python -m musical_time_machine --check-login Ved succes udskriver det `Found N playlists in your library.` Uden en gyldig `browser.json` udskriver det trinnene til fornyelse og afslutter med kode 1 i stedet for at vise et stack trace. -Skærmbilledet viser kørslen **uden** `browser.json` og de tests, der bruger en falsk YouTube Music-tjeneste. Et rigtigt skærmbillede tilføjes, når `browser.json` findes. +En rigtig kørsel med forfatterens `browser.json` (udskriften viser kun antallet, aldrig playlisternes navne): + +![Rigtigt login-tjek](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step2-live-check-login.png) + +Skærmbilledet viser kørslen **uden** `browser.json` og de tests, der bruger en falsk YouTube Music-tjeneste. ![Login-tjek uden browser.json og testene til trin 2](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step2-check-login.png) diff --git a/docs/wiki/Step-2-YouTube-Music-Authentication-ms.md b/docs/wiki/Step-2-YouTube-Music-Authentication-ms.md index 3f9d0de..c9b29ce 100644 --- a/docs/wiki/Step-2-YouTube-Music-Authentication-ms.md +++ b/docs/wiki/Step-2-YouTube-Music-Authentication-ms.md @@ -12,7 +12,11 @@ python -m musical_time_machine --check-login Jika berjaya, ia mencetak `Found N playlists in your library.` Tanpa `browser.json` yang sah, ia mencetak langkah pembaharuan dan keluar dengan kod 1, dan bukannya jejak tindanan. -Tangkapan skrin menunjukkan larian **tanpa** `browser.json` dan ujian yang menggunakan YouTube Music tiruan. Tangkapan skrin langsung akan ditambah apabila `browser.json` wujud. +Larian sebenar dengan `browser.json` penulis (output hanya menunjukkan bilangan, tidak pernah nama senarai main): + +![Semakan log masuk sebenar](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step2-live-check-login.png) + +Tangkapan skrin menunjukkan larian **tanpa** `browser.json` dan ujian yang menggunakan YouTube Music tiruan. ![Semakan log masuk tanpa browser.json, dan ujian langkah 2](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step2-check-login.png) diff --git a/docs/wiki/Step-2-YouTube-Music-Authentication.md b/docs/wiki/Step-2-YouTube-Music-Authentication.md index 115e95d..938b305 100644 --- a/docs/wiki/Step-2-YouTube-Music-Authentication.md +++ b/docs/wiki/Step-2-YouTube-Music-Authentication.md @@ -12,7 +12,11 @@ python -m musical_time_machine --check-login On success it prints `Found N playlists in your library.` Without a valid `browser.json` it prints the renewal steps and exits with code 1, instead of a stack trace. -The screenshot shows the run **without** `browser.json` and the tests that use a fake YouTube Music. A live screenshot is added when `browser.json` exists. +A live run with the author's `browser.json` (the output shows only the count, never the names of the playlists): + +![Live login check](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step2-live-check-login.png) + +The screenshot shows the run **without** `browser.json` and the tests that use a fake YouTube Music. ![Login check without browser.json, and the step 2 tests](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step2-check-login.png) diff --git a/docs/wiki/Step-3-Create-the-Playlist-da.md b/docs/wiki/Step-3-Create-the-Playlist-da.md index f4d2140..87a0a54 100644 --- a/docs/wiki/Step-3-Create-the-Playlist-da.md +++ b/docs/wiki/Step-3-Create-the-Playlist-da.md @@ -10,7 +10,11 @@ Programmet opretter en privat playliste med navnet `{date} Billboard 100`, for e python -m musical_time_machine --create-playlist ``` -Skærmbilledet viser testene til dette trin med en falsk YouTube Music-tjeneste: det første kald opretter én playliste, og det andet kald for samme dato opretter ingen. Et rigtigt skærmbillede tilføjes, når `browser.json` findes. +En rigtig kørsel med forfatterens `browser.json`: første kørsel opretter playlisten, anden kørsel opretter ingenting: + +![Rigtig kørsel: playlisten oprettes to gange](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step3-live-create-playlist.png) + +Skærmbilledet viser testene til dette trin med en falsk YouTube Music-tjeneste: det første kald opretter én playliste, og det andet kald for samme dato opretter ingen. ![Tests af trin 3: playlisten oprettes én gang](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step3-create-playlist.png) diff --git a/docs/wiki/Step-3-Create-the-Playlist-ms.md b/docs/wiki/Step-3-Create-the-Playlist-ms.md index ef1d387..2de8850 100644 --- a/docs/wiki/Step-3-Create-the-Playlist-ms.md +++ b/docs/wiki/Step-3-Create-the-Playlist-ms.md @@ -10,7 +10,11 @@ Program mencipta senarai main peribadi bernama `{date} Billboard 100`, contohnya python -m musical_time_machine --create-playlist ``` -Tangkapan skrin menunjukkan ujian langkah ini dengan YouTube Music tiruan: panggilan pertama mencipta satu senarai main, panggilan kedua untuk tarikh yang sama tidak mencipta apa-apa. Tangkapan skrin langsung akan ditambah apabila `browser.json` wujud. +Larian sebenar dengan `browser.json` penulis: larian pertama mencipta senarai main, larian kedua tidak mencipta apa-apa: + +![Larian sebenar: senarai main dicipta dua kali](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step3-live-create-playlist.png) + +Tangkapan skrin menunjukkan ujian langkah ini dengan YouTube Music tiruan: panggilan pertama mencipta satu senarai main, panggilan kedua untuk tarikh yang sama tidak mencipta apa-apa. ![Ujian langkah 3: senarai main dicipta sekali sahaja](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step3-create-playlist.png) diff --git a/docs/wiki/Step-3-Create-the-Playlist.md b/docs/wiki/Step-3-Create-the-Playlist.md index d24b8d1..cc1b0f3 100644 --- a/docs/wiki/Step-3-Create-the-Playlist.md +++ b/docs/wiki/Step-3-Create-the-Playlist.md @@ -10,7 +10,11 @@ The program creates a private playlist named `{date} Billboard 100`, for example python -m musical_time_machine --create-playlist ``` -The screenshot shows the tests of this step with a fake YouTube Music: the first call creates one playlist, the second call for the same date creates none. A live screenshot is added when `browser.json` exists. +A live run with the author's `browser.json`: the first run creates the playlist, the second run creates nothing: + +![Live: create the playlist twice](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step3-live-create-playlist.png) + +The screenshot shows the tests of this step with a fake YouTube Music: the first call creates one playlist, the second call for the same date creates none. ![Tests of step 3: the playlist is created once](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step3-create-playlist.png) diff --git a/docs/wiki/Step-4-Search-and-Add-Songs-da.md b/docs/wiki/Step-4-Search-and-Add-Songs-da.md index ab0ffa5..1b12025 100644 --- a/docs/wiki/Step-4-Search-and-Add-Songs-da.md +++ b/docs/wiki/Step-4-Search-and-Add-Songs-da.md @@ -10,7 +10,11 @@ For hver sang på hitlisten søger programmet på YouTube Music med titlen og ku python -m musical_time_machine ``` -Skærmbilledet viser testene til dette trin med en falsk YouTube Music-tjeneste: alle sange tilføjes, og en sang, der fejler, springes over uden at stoppe kørslen. Et rigtigt skærmbillede tilføjes, når `browser.json` findes. +En rigtig kørsel med forfatterens `browser.json`: alle 100 sange blev tilføjet: + +![Rigtig kørsel: hele programmet](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step4-live-add-songs.png) + +Skærmbilledet viser testene til dette trin med en falsk YouTube Music-tjeneste: alle sange tilføjes, og en sang, der fejler, springes over uden at stoppe kørslen. ![Tests af trin 4: sange tilføjes, og en sang, der fejler, springes over](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step4-add-songs.png) diff --git a/docs/wiki/Step-4-Search-and-Add-Songs-ms.md b/docs/wiki/Step-4-Search-and-Add-Songs-ms.md index 9870f88..408b95d 100644 --- a/docs/wiki/Step-4-Search-and-Add-Songs-ms.md +++ b/docs/wiki/Step-4-Search-and-Add-Songs-ms.md @@ -10,7 +10,11 @@ Untuk setiap lagu dalam carta, program mencari di YouTube Music dengan tajuk dan python -m musical_time_machine ``` -Tangkapan skrin menunjukkan ujian langkah ini dengan YouTube Music tiruan: semua lagu ditambah, dan lagu yang gagal dilangkau tanpa menghentikan larian. Tangkapan skrin langsung akan ditambah apabila `browser.json` wujud. +Larian sebenar dengan `browser.json` penulis: kesemua 100 lagu telah ditambah: + +![Larian sebenar: program penuh](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step4-live-add-songs.png) + +Tangkapan skrin menunjukkan ujian langkah ini dengan YouTube Music tiruan: semua lagu ditambah, dan lagu yang gagal dilangkau tanpa menghentikan larian. ![Ujian langkah 4: lagu ditambah dan lagu yang gagal dilangkau](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step4-add-songs.png) diff --git a/docs/wiki/Step-4-Search-and-Add-Songs.md b/docs/wiki/Step-4-Search-and-Add-Songs.md index 036fee4..6544ca0 100644 --- a/docs/wiki/Step-4-Search-and-Add-Songs.md +++ b/docs/wiki/Step-4-Search-and-Add-Songs.md @@ -10,7 +10,11 @@ For every song of the chart the program searches YouTube Music with the title an python -m musical_time_machine ``` -The screenshot shows the tests of this step with a fake YouTube Music: all songs are added, and a failing song is skipped without stopping the run. A live screenshot is added when `browser.json` exists. +A live run with the author's `browser.json`: all 100 songs were added: + +![Live: the full program](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step4-live-add-songs.png) + +The screenshot shows the tests of this step with a fake YouTube Music: all songs are added, and a failing song is skipped without stopping the run. ![Tests of step 4: songs are added and a failing song is skipped](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/046-scraping-the-billboard/raw/branch/main/docs/wiki/images/step4-add-songs.png) diff --git a/docs/wiki/images/step2-live-check-login.png b/docs/wiki/images/step2-live-check-login.png new file mode 100644 index 0000000000000000000000000000000000000000..4b404ed7c4535f7cdd5b78c79f73d4c27d4b75c2 GIT binary patch literal 5186 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 literal 0 HcmV?d00001 diff --git a/docs/wiki/images/step3-live-create-playlist.png b/docs/wiki/images/step3-live-create-playlist.png new file mode 100644 index 0000000000000000000000000000000000000000..b877406fd7e4b78bdd206e7022b63f08d3937fab GIT binary patch literal 16296 zcmdtJXHZjL+bI!Yjv08!~6 zASFP6(0dCd5L)2G|9zfw=AL=pXP)<*nfJr{C0BO#tew5~>{-{Ztq2{kD%Ex7>i__N zO6|Fl9sqD@nEZYF+C}oGn+?hh0JsHEQ+jIPm%f1$bm35&I^1bM$CL|{TMORFcp~Z% z-qo#|dnNOs;{60FKZ#eRs@gG^GrHaULlqUZTW3Co1*B#4*?#5UJNU6hlD|N%*|e9Z z$wfi&S~L0Z?WbEom&k`y4-c=B3-hyWDsp-9afXFl9IyS9B$q$8-n)}a_QQW4D6=_p zG7)mRJ4CchWeYy)sI?B9ORSwK#fOw6*4v(Ux9PFrOq*-9lI=@f4fHWfeh)-pvB*bk zU(Q>DhDrAUZxiK>$IWmHXJ?BJOUsJ{7(RH!Ozzx}WRR6mqE=m%g+5u5yZd+nN?K$) zKdod7rjJ#wd-2Zcd^7Ca=`nG_@x)%Hxe&U`>~cCc;*6ZW1bD+{sM3ttM4}FtCEE$H zXcuSO!-7L`bua8)xpz<1{>~vLl4F|fHhP@4Fe~KnDU})(Xm@#57~L4;{Hbt*Yv~+{;q~)q4kSS-(C~0cP?H>=sUHEt%$e&?t@}`4D2S{B*ERZI}Co z>>HlKfLkY7QEpYvs<;ipNUh~fuMzv;iFE;YyoYuo@bu5BvMOoK&UnQk)cu^6W~^tT z;(Xh4$}|R5irSYvs5r%@2)D)B%bX#E(Gn52xfnxMV5|7m2GK=C&7M)vk>t^;=BMei z9^;_pZ+yNm%+_pmtK?KCsIQZ4pdD=NFxd)9H9B2eTt-d~Y_zIyHEQ9P=8z6~CDAUy zI}&^*4Jxi#-wl&8{Y7$K7oiLM(ni!y6_*RNWVnl6d;*C5MrAJb!XdG8U)4uf&39a4 zhknaPra=6S#~mz#gHN>TaF-01$5qx-q;|Xlv(XoWnsOE*Omt3v#asg@*zl2l7BthA z3{?Ecx)6M_pW;C%`qeGG@hfrhNrU^@K}%&%e}k~>&f6u{SiKNUJBD+$BrgM&z>s}X zPv7q7%9e20i2O-oDM!bzD?iw#&Kx0eY;@AP?t1TNBC^i+B_c{W$Pe3G50rB=P~hxv z256KyeMUkZvVRkLE<49bwX0|_>+!R({BVM1`qAP+!RpBulx{M#fe^gb;WssJ>8?B| z>2ll9sbTvV%UNMAZbrA^9x58a#FrAy~TAKt!Gr(k;x&)Q4Z=S2;oJ-_Vng?@@`+P zNTASsXUaRJJX=Y45kE;Jsd4sf(|tFYWJX*U4msav5$E9^elaHOSuMOfOT!2bzdk9G zqOGpN7IGeB13RH8Wt%D#6)@N!<;jbfTruAd5*0Y7C?-$8AAOoX&MvlijNUklA<0PHo-={%*b;L*3-A0PaJGPdyNWo^4(|k2$6VL0_{7b|T=vr%i zGXvG`%TZuFpHoVSjQO|v5gOtTD)1Es;-^2{(8)O_h!S~8(*qt#5TY@ypI>8V-f)a; zf6`H_8k!Pr>ZVQPziy8vH6j{GLgPl>#LDbvdZ~}OO~008i4mC16K2_hNyqRMOX#Ct z-)rgQ38w^7?n~<5ic!)l^35bc98ZAEWA128{mnPoG&r@x^1qwUpYgtKJ zgYjFgH?>c|3``rZ?U&-u4;I_`=8QO@y$r|(k{9HV zvr#trHfN!^hgQHhCsEMVcNwqm7y8ongdW0D6OAS$EFru2ep$9+?PzEz+7mH9W#6kJ z!+Zb!%;}M(yX6@UTKr66^;f=JBPoyABaBu;YcVOuuES_TUI=9{Hi;e^g+b*cIpsVaI-w>&3Wy}!uVR=BoX`~g+1nprx)a7`IWE|m&r}-ZF?2{f6|}-tH$1$6>?7U z{R;=IhdOBmWcc@idXk57s5EoSdl6xrh&Mh)tMqd#a}C8WdlU`(rV<{( ztRai~UP%Q8HbdltXRbjCmTWPLA0w?`Hy?M9n zK*fJR7XbBV0(_tbsnw{Xqf22^&s1Gbj1dV@d1_BB7JAr@KZ7=R)W|!EOHzeoG=1rc8c!@Ww9pTXfkY_Fi)S*86{Oxe=-Z$^9*?7;^yQ@ zsPhdBmVAsh>EEvaMmTyBP6E9BxVY*i+euByFQz)pg<9939^o9Z>^1~g)4;cR+kvbk z4G%iT0&}B|Kfmk$Q zN{H57eUW4GQR8y|h}0ENX9#|22I&wyztCnG2EMwv^af%0I(%(e?EybKMsf0d>Ct!H ziA=6Oel7sObkUC6p{Xxmr?9oxcGv#9n~&vK+Z|CrjGQl|AS{Q5ApK$ZS6rVCZf?KT zy)?uxIVC(W5nO2%=^KPfeBEC`O*G9-Hwxjj0VgE&ZS%pB@|ess7!elFzy>{m8}H&K zGeL?8oku~qyGm`|>Xk#_$SgsqU3oBZ>m{oe>kAUhQY@ocCR=*^&ne8HIxKDb+g;!5 zcTFE#JFrL`$fMS9_c;qHMSztlSBvHaUFRf_ly+@qnh5XiYOFVgjd77v$N1guWpzBB zZWcpLeh_jYNQEo0n|1ss-8`9hnj;B~m)Eve=5$`(SGvnUqR;qgg)npt&)17@{cvic zoATlC_ZOxo-y3@a-%=9z@szY%832G%$<=Aq{_z5p*w6+C9Oq7YW1FD+Z@;|L*UY#Q zJ=Drm_PrZEfiCi(>)dnq7D;^L;$aPsy2px!21NW)-?{^%-O|p=ipD?*NmlIAZqpOS zS*SbSBYUGZFhR+={lsQb7<{fVl_M>k6Ue7?_?13kkE6UUm34mJZ$dWGB)alz)dl5K z;~So5`P-C2I>u+aAJy^ebVn4ukcjlX@=4iQHKYwUIurJ8nS4s~~OyU?|jOuA1nsUF?iAyYE43X=c4#9rt z_H*-wKJ@%W1!NOhvzIJ=bd}XN<3vFwUGTEz-xmcfp46A6puKbU&Y=cjcDSx17)86c z_u&wKIa2TD6Qz3jr@hcbD*HB->9ggd!S1YoZb}G5S-JZd--&xM^f1p5=n^#I+#!Yv zh=bJBG-H+SEsp-|7hglPYBlfzoQ7%YipXXCPkQTC_b$0STUEjK(x zxI%Sc!GEjHwt>L6vqbUj#>zgh@UUmq8~7xze)TBOr2Vjeajy4R3`uZueSeRpdY$sO z{oUPreV^>-1LQ0rxjVB~e0HL%&3EBJ>?}v6#PKgW{-*^r9=AWOT)A_^THSu6KczBv z<@L$BPG)4$-9TraMQHJ{`wpl% zO=mMoBF~VUD4T!$K4(;E>PJGM5v6SRBTK;BSc_=)y0UFdJje%9WPvb~rZ`}w633b> z*@Y_RHb;*dyZ~jiYNP8pkspMsezruI9_b1lU1Zl)W&IB=01$NDNr2pZ0014;Xgh9l z1*|>zZ%}bF%I5wG`_UZyB(R|_v)A6(VNNbWMy}+=qwArn8V8a#+)aJnCs_J*jtM+Q zD-%;7ERIQ_;wlLoxUGJN*beumy$l%Ee|Xq8rMh_g;-6UEng=eR3r0gUmhDCUWcVd{d5)eFbncB^W6NB`ds(qv$^~pN zPUo0*D86(ea7;oc)>ll-1l-wXA9;EP04;s5dI&(gMOMnlaNr!8zBS?yMjG)9IL(^s zJr^Nx)0K#su&nPlkTmfjgk1g+=O$=K<)e_uEd_@rNHx$!R$e|FT;BI5LSxgW@8~5# zb^oH)Q8j0w8oR_MqBQP!#4b=12C;Hyy%O6HwWp_TE-HN=sTCoiC!*>ooTAJ~$LcwP zf>lb^avkXuXWa_E1TvakU!2C3hXrn3_33}U(WB}>g3feFzU{Ca%{bC~vmDi^kKW^) zE07b8cPBy4*Mo%XPnu@>XcKxp=V!J~_0qp;GlazYt=;HMQ7-7xOHD8aqM}YLi6_JJ zpNpacC7aLv62RvpiEd&$QemDG5p|7NmefYo4$W@S^e**YVZC@4hbORTQIq~exGA4* zoLeB523SR=+@wh(5t3zHf+#G#7!kQ+@(q3n(=y<-xA6a{Uw^g-&yI3mP}&M%a_^Tg zv+yk)bUD+|s;k(I-#$2XDd5CTXx5(Y|M>FC&faWl(Q5wVm#~Cc1Jty8`SOsmZ_$}n z-%jsd^B|>A3m(>j)oC9}_)b;0Uok(r_w)Ic;oT6fG&!~~NeVhjGXWzUlj?4||M%Lu zIOWJ^TNvwst*&gZpb>gW$E$p~>dxe$nJRg%y|DXCP-GO_|DnsV*vw;jDdLTVL8 zKgs*XfWF}-{rS`}Z@zh9;MX!B#-3T(SSispX?+j%)3K5#iQivUN{W$b6zYp;NT_tn z3(}mbR58C`Rl8Pp1Tlh@;ippBOi4M7{43mNwi_Ie5tTw7t{}cyx$Qvu9p-5vWjIs+ zqXTKkLg(E;9j~*lF-82rgS%HfRH#fz1JBtAGU77x^Pgplnwrcc!#E{6qwoy{LS0LF z!VTs7bG@7y_~C3d|J^j++}T{0cAB;V_ZNz{EzCdTeyvOB7a-;p{W(PK%XB5)$aE&k zj3f$cOEId&n4}6wLw`-AtqRTFwBF6%jFBcfvoLdZ zTnD`LRH)g6ck93f5sEUavA-e2zU#fy$aztA+L#w&Hz2JabdKreNLx4l`E6sl&pI?c zcoFna2`*gu%Bkhgsk3wpv9Z$o{S8*-G*Q^tuFtTpE#MBTWmu@BF7vzIcS^seCQDXM zR@$a;FyFor%bY zY2uNe^?vsxY5C(V2;Tc8iyXdGhe>=uzR^?ITf#EqCkCVPWOMqSdTYz?OP}osP(L0U zyx(obegxQn05udp01L&y>=KAi!h#$&5Jio-(YRZZeWFHnhOy{Gf8W z=+2<^6p}32VV`Sikqv@K7$Ur;iuc*KH2rqJ2n#Fhdot3Tr?BHw5${s<3?FI*VH$li zidKJ3HJ5#8!svBIouN1#itPY>0jcKW&sg}oOvh|@CH|zTrRWUI%~fSUrvOJ`kV z&@Qh3l_*q1Uc1BTtoKZ5QYg;ij6KgC*m@qo&UM1?01TDuBD%%c&2EiciW4kEcSHFD zl^6y_@h_Z$%*JRrlza0^I*J^>!=B^V!~&yiZ>f*=J+O$K6O5H%8&2%@c%ok-w8fWZ z=_;XNP(7!P9W&9Y`HayRYw>D_|yyvvYxenF-yyMl8wrsdDn)M40($!kqsw3)jreCAs7 z@)ty+s$(tEtCf17DoOG*zl%-n1iA!xLc}FHZZnNSaB^?Wi|dw97*=nLp`pbM>88x0 zmNMaqU+ay-w%!hJWF5H?FyQNn^=#8YE~hvq4bX|R5#e<}u}75z@^_>PP?YnSn;VDG za?+Es_~Dx6Xiov=U{ z>X$F4JTDtrc1oAK@NO@-v@K}ETar-bJ#0KY93Q>AT!z;c(?TdOM>I2X^8b(x=`2S1 zt@Xv#4w_Co%%Sl*=Fj@xj!8aJ<~RN=eU?VkwR1f+P&N+0Q@mD{VC3wRcV1>r-CfK- zzMc-v;8m7=-4w&t6`DCA8oN%sqd%1D*q@;>qB5>KXWu@gdAV|V&kjDq=A{i5wp1GG z`b)u6!)U~R_=|f@G3&m(Lz2Wp_2Zg@N?*nzI@0?l>b2mt&_pFT) zHhH-^uuO)RBYF9fxH)khHx3}jeVzewZ0Tbyp|IW|TuBlDj8+?ecFTOZP`>70@-KKC%JORK7CSy`rvTG zb8qV~2-Bw+dwR^4;i9-Ah|t_SG}Cu&Qf1<;{C)`=Lr>%+J6hpuKYj02yU4FN3+#U5 zf>%;gQ}-=9d(fDvDY?K2IqhoC)QPvw%308SE{o{~E}yy?d-n3@^3A`-kjliWJ-^yM_J^pKwp-Jm71WwPkaMvuYAqY(pSpzf8ou=TNSrQ48O%yZc@Uw=#lfS zvXo>IGIwyaCyVvKtdD4}4UX;AUPFB&x>36Y9&1eR*EXx3C{16=nz|F>i$nmi9#Sx> zA+~MqxkC03uN2r$sR{nz)XnNZyI^j)D`%Wj@##rdG+FU^Si0et-lt`7ALeJVO0s?Y zI#>!S-sQ%SAQ_bqOicZZ<`U)j5Tn_*V09WGcgKgU>~-132YHh{G-~33Ydgi}9CIXb zzmPS_Ys>^}Sc7Ne^n!@jf#m-IXOcS(uHPGKGB!z0!;E&t7pXLNyqI%K>Qd7`PFk!K z;-7dnnz)hQJO=J1`o68cDbK*CT#Y`9?%_~qds<<7`V^T$%HD;>?w{w5XiJlAOh<*J zI6T5aRlxnyfQCcS#T&94BWrAHJK_$*n^p~xs<;>->bAwDH--084H8I@jX`Stt8^X| z$5qZ0jYs=kRv=%i8+Qdr5*zqOK*O35 zIzbkPlcMCOzt2$`R@Fx$4QI zN}VEcY(%@ZTj=&Sy>%Pp>FqH%-I--_t1P)dGX+NbHO6JRQp>gbG1$9dphY#H_}Sr` z)ap{nFJaeV{Y*IBM860Mx}$4FT~-I46V9406r-{)eHFzf?_pq{BjFzBci1|VWBVyu z4qEbUx{f%%7ffDdHmN)|+Iu2eExd9}R+u~Z1VLR1HzOweHxNxmr5u;wx>d19+%*>Y zR>@HL#7sv4*@=qIj|QpvC^$Zs<7!&3B>*d z0hQkxT#$q_;}cYodCsT?&8B*q-%qHi6Ke#5hwpAvR^5$H$e*LP`oY6{;mk&({H?bA zR#39}O;f7AU2YxIY%XRRDclhGOp$(L6*DJJS6`{nY5URZj`Fl>F8}S68iZ|&5dFi* zO_gxzHI25x66|=C)NSJ%408a@u-a7xbJgS%AQo~oWVClN*Dj@!e|P!aYn3BMBPA{F z{{PSdkabJiH!YO;6GMNOn8I~S`0Hq>CYFtI_U^!M`(IcJ{ zI>a+fDiZ*JnWqLOklYdTYYrFI2igp$-do)*MqVr}%^NeWjCn(|9sDS_hWAQ@RG^Bp zNslPMs9V&<9}3hRl^EvjgsnCE8?l#4Zn2!>c%X(7yWr5hfOj9t6`SHn_D>kn#18uAR;9JkrKg4Y(%Jn`dr!v26S??mtyP*$%ZK+GG@vft z70HAJIQP6g%CxO)q=Ms5XF#ZCqXOxhW`FER#kT1)001)oSBj}5yxS<1o~zC9Q+YGw z?(tYR2NCoNm{ogHtbIJ?GN-}0zZO9zaS?UDBeqU?T`GillN3=5>`f10&v`Ztj3g-b zFX4T7dA&OGi@GW=VwlO=mSl^cFSReVCEaS-Wuu0}f}VNafHg^20g+V%3nJNP`~dl0 zbU#Y1JjQ`e^k6^Dvm-YG{oD>znkE|Ge_G=kyQOB)UG6E`wPD>%UPgznHD~4P4C^bV zzMvy_r|l!2W{YN^)7{AMY4^XXjluVt+Kix$jr8E-rU&F>1^=vnxiK@eR#@`*|EKW8 zf7;gmJE@ERF9!O2z#~er`)zT4&qZ$-J0!_Hj1j7Ub=SxkEN;k}RPovq*Jw(RpHD`x zO^7N`z4@=*4V=^KrG};!t6#6PK*k78K=Jjd7)cxcp*0eGE zVfUKjyv=Dvwx4;OLlQu!&zm=I`I=Q-fut~;qGPF$OEosIcG>sR9&G<5 zJ}n`fOBG$I8s=afA80cFvNYL`b;1&w8)0)cOnOzIi9b#1_fP}BNw-sIAot7sSKygTwElxy z`+wT_k|fyT)Mv%^j~lh5S<mE2~U^0RtElk@ZIlN;Qog_wRIV){8xfNbeubcxs>tCrEGR zA7TfMN7j7teVBpacNp}M_|R(4rII|VUbLEWU=bw^%me-<=L!b|`O4-TQ98BxRPUHM zVK3nITj{AmE;k#Pj!|RV6Aic~Ov{+0s|&v9!^oqZO*j*xwb-25q?_GyxM8q87K5r{ z5$~q&w3Y4B$fl0{+r^(IJ{^!BxO-E=4D;zZ-y=1d&MZbBV0iyc|EKgl6O9yK70|nx zw`Qj(0Sfs}+fYK8xf9_lCx?ahDnG)X zuMY;y?NW=+yBHb^6amT)M#8Wnaxt~IyswzUNM075){vS9%i7noW-j_H3Tqb;nuX#* z{|^Lc4dT)(rYeIX}Q1{4+Bhf;GleU zj+=u~GIoFO)T2BBK1eo_6v~{o%N22hffJ5C@~jfZW<|`;TlF+_x4JJ&i@L;tVziar zjrdHpTUS+0fOO{H>&gNveSTeGREsd(S^jWJN|7!4ysR?H#LhkWWsf$`4T3PW{^K!P zPt)3hefERl?~7ulzj{hZV8FBa8G%rtXlhK=9TBpmdk)U#X;V;4JfR<+RK;2uxezu( zGKI_kx?2imWD2;=N3$0*87f#!Ur# z`iRuF(IbD4!b}jtq@K1PJY#posk3a_()FH)XTZ^10E1TMa*RfyMkSqlFaY(|BFiQc zoeoY>6ib6;qEqZXpT88EDwDU-s2t(y+)+Sf{%}ct*gxyyC{aOXyxh!e)P;In30p9a zZtki$bU-B)Wm1Rb@hyi};TCV>rk^^e%P+ceT6{sGsTZ-*ca*gdax)qZEtB;<51PnQ&$he*4%ZR60Qh!BI6d;x)mnmv(D3Y=HU=$Sd2a`a zwkTVox!@T>X_dm4zD>n-1)y+6ym?lSdha%RzLXNv>?mgH<2kKZB77%6Yk^AUwNuic zyqCLI0Ea7>!%sceEd}fK9m3YcQ3YOB(*rsQ8Fm&%Qk-iOep;b5Lu#i4n1(gzkex*) zy(o!oFj~?zp>P$}o3bKsv@f%PB zw}$}I9m5;Hkn~pKq;0bH{iU#HkgX{3XV)r!>hV#dtibUXsv*|i;g)&-aj24Z6-@#o z$ps{Pq5bmx>}!=fe*KQh%^)T#6^ zNb!N()2cn~l=8D#lQTJr1Ca;Ue^~6WmiWlD7O2So!jXeSnKf;@2ecOKWFv6T$Kh6o zwJOtxzJOr=i#Sr+ zA%?@7-v*f&qzNPe{gV)=x^o}2wrpScc%AS3Nvz~5!Ch-rfpUsupZphte=8rPpMAU)s5W?@Q60tSf<$Xsl9_ z^-_|mRMNV9$n}Op74X8D?+#htU-YTv>s>+*e_ZDirgZP`H&Typ>hL9yN_RNOdUzq2sk<{?%+K#RjB=T+RyB>IBlikc z8hE`TzVyG8h$9OC&A^`-7gfb`dLHlK%d?)1+ckuBrRlpC>Ut|HVU6nL&@7)1BK7Ly zeLsHC_wc~^N|u6-)+D++7XI>m0Hm}p&E27<>v${UC`USf08?*Jov&tzqznY@GdY+HXGYbo>Ut z2FFhJz0CP~g|Qj?Xb>9I(2bviCC#~!jk7wGp)+!Zon4!$UxWS69yH0?_;$Hi8_^Oc zlUpCmc(W&XOTege)wr4dnfLK7bD_k|UUcESU;l|ZcikV|d|pI^prtCS^3}HkJ3cS` z=nH7a?mg$+=q-<-0sB(V(B>Mz^T6 z;5wOp#&@;5DSh#`bh38q%icWA&YRfv`csi+>eUkkhUU+)^HD?g;|JuxO&97#H!7lY zDR6$oE7i8Ar#G?TI4!o&U2T5;@W3RrA#TMsZ$CXiN-+$YFk}PUjMfu^FIm5Qap;89 z%ZwI~-du9ms?{jMuDuufe&wj`N$KOB={u5#fswD)TY1k$B3D=G8YF~qQhe~JQuQ4s z;4;}}u=9sxKF9u6(TGWBR6XY9L0kHRue~CIJ8EY4ny>rl(vw>FiO(GNFn3>?yDANx z_2wwa{FeFgLS;HEO!OeeL4+W)uB1F|Y-odDn5#39@YnWQp-517Ad}}Vm5AS$lG1!& z_Q!rs?uLC}$pC4-dq@$2xU$x}E;#p4`s`5obqwu4!id*M(*=<6E3DeWO6phbWpkes zoO7F(;Ub3h`eZiOw#op5t%JXp3s=eFl?EFJeR0rohNA-ubp zK$fq(hKz%)#=R5)FQ&+f1Mu%2fxyv-G@*^n9_cYN!O+GPw1#K0>D8IC6l{TD_4oL) zP%SR^OXaEFl#GHxLN^*(Aq%$=BkUt|M#`@M@qGWcB9Cc9UX6V$27 z)P)UezHhD2-I=%iX`Yz@@x7uHHTOBpZy(*`8e-bp^DbMO-q3E{q+4AS7ClZ@Jgwxm zu0nez>#rmP;g??A-g1+@g|$8|ovf`=RicHGVhY-8Ls>=ihGj|uK1be0MGTWf5Vg;* z=6G-3oZIJ_+U?wXs#SbXRjgobt|IpcV~%#Ku>&#jm=IHiCZlRieR z$_NZItnjkTIiSsNdzlA#I6dD_cynaH0XVr+c`21&x0Jz53X1fbDvg4GK<(L?#L!L| zuFDc9baC7faL?ZfVP0onX>D;sIFb03ZZjE|TzltHucKAM7&=Y2L{{C3DZB$7Dm2Yb zU4h|C%&$&u>W%&bVw&ZRtr)~SIitUYcuuxa)ikOn9Sn~4ex#Qew#WZ|ziVvc<>KMt zI=XpjEGg2t*$ns8*xYcjCVOZ-Li+b{m0)9^hL(!&)zJ?SQB-OIvWdFnk!$X4|L@fZ zw7qgxVG1+1vrSK#VF71!Xoe;aV&v>JL7 zp*?a_e58w);drGeefk{x9!Tw`xS2R6AULAc30l# zg!CPsJsEmp=AF4>_O$BaIL`ef@4L*Ga?Qq>up{0 zSs%IC%k(O3|BVkhkwl0Kgk9w)83JSq9_N3kb1B_eY`L7aEp#AcZ%UGJwWqdwUn=nT zYGVe-AzMZDlhdxwnZUBk;^LHMz?ytx>?hUay`u(8nTrx~nFsa*s@GXMyYg8pZYGiQ z6FICc<*$QBEx|PDTFpYVYv~|idvR>0wP!k1S2_D@uAcw1L1?3uI~*?nU*7u}A^Wlp zD}yUH^)IQlkC?~C6%jzybWY&!@ue~#?*e2z*fY0|zo3;q)AM5H7kSx` zvzIa^eLaNC#M6|k7mbkcKfVBf-ym{#f0srHZL_-6r92ft{UXs1cU#VfzyJWqNn@rV zyLXiIQJ}BO(}JLNV<(U6at5B@ zT&(#nm$}KSZRl15m1zrdj6MJZ{9Yuz$4fmQyNPV?pco`4c5V10!pmFD)s*gD=fx>r zCPIk9&6R#bVAfoN?~OEkZas_(t-M;PieRv1mk}tdQWEK2D(>5DX8dmH_v^)z06L!< z#aNy#_REcuCAR>P2KSFFz%7pKkUYHDRl%2$;6dPY` zXfIL%IA8+wXmMxdYCh&^_8PD>-W9PUXNtvo?~bK=lP7N#q$K;OpIc88@IwM~7I4(H z+B@qqmhkGOg~44YO(T0Agz;^Opfz(xF3WkZ#xrPYV_*tm`bP$5rpxMQdqkYq@Ecx> zRE9;ZCn#OFW^?MWz!NTxztJZr&zVHIZ?)r4alw-xx1NLemenkO_q!8SKAb8o!~{xG zRJK>O>-|OEJ0C)?(}e}*=6Au`)a3be^y+(7NtquG?8ZvLh5clB3rjbctT1Y-J(+f!v-QYx!<>tgRz z=RKQLAy4k4gvl}~w3d&ew#Z^k)5PCY4>AEC3d{EG*-G8?9 zAZ4!glwIx7AKXPIVhsAa2B&o(Hz0@rIi^T)Fm9UYyFUe%{7CZN6&W{s_D1Hrc~5*}(Gn*)tJF>2s(E<&?_7?LXr zFIZ8wYxE?!LeH7epbl2ag!9AyIgT$OM~OZQ47RNG)rC0COpm_%+^3^_Js_|&#E}@I z3coS>=JJ}lEL>npb8f*jw;)sYBCJ%pL5d-T;tY5N{ocA{l^b*ouPtMaKyH>~estp- zN^;HI`K~!otxkCBI9H~l4MauKN2o^aW6L2mVonrlWofcMoxjLV4`+9;Kd3~7B67zc zCOq$>9Jm{!$>eJ)Sn_Z}a*>hm1*bTSuCDqrI6Ts);L@w5CXF@9tXpT4ELRNN7sBf{? zn&YAu(P-AY6zvO}%up8?JIEIdYt{HP1ss<3D7l*FJ@@G1U4QzK*qduH^_y*S9%B!~ zFr$Lv?_JtS?zzvvVBvY{xlM(3Pp7T*9f-JN(Ikf3_)OEu6&6^ky!PzH-Ob+(%y3 zPnyHK8Pavp`|jjphHc8A!TM%i^tu{f8BhVH=9<6b3)AUyPuu=zBK-RqU|#U5i#S1H zek{i^J+`}z3XqxI-2;|x24cSqr{|heWRHk`CX`(F(P{=(_--ai&OlQe`ZQC^4B%ne zi??DDsstLDi+~adTY0u3VZQiLvqz)4Psmmv#3 zO>!vPHiQ0E>m6Vb*0ea$uOLB(`m}Z~^d(C~Y%ILcmocluGyfF3-H(V@F|Tdg=2p2>_9 ztax_!QUk|3(Gf8;jZZdCmw#>|s*ZIYv-_?WQ&jI;v-`l}l3Bne>FPA_h4@Y+_bZ-! zv5?;&b1GG1hlKfDImR$=(GUc`uJj&f_=4OI|e1ZT_Wsk+c{1w=!R>>PcX=s`_I zail6jGZ!*$Ev|P%mjv5JaeP@YB1w@JaQJoOPy-TwfyLpAQojs@jIj=6lhdU(1YCEg zBM}p@(~v&}Ox@#l$pLEzkaU!9wQIT83+%vz7gknYR0B733FCpfVcqI0P;qQ) zhS$$BLti?+5W2PI4YM4#+oI_EJ+pXG;Q_T6!3n2%w0|j=1bF+T`9L0yVze(1YWg+T zICvfMzhNB+XcGkv?`_z50&J-$9)$U642MEr(D#)D_9JSP(2y-$*d{^iv1I)1B2XD=w>`&NIw zR`K`pX0Sncy3m&3QoDwE?&M{wfQZ^))qGub z^Jns%^%swkk4v92K}KJgp)6qta@UQ}q5B~ui%s~`Trt1eYR6(|zO)!a&TSiR5`(6r z(u!V!Vj^k$1n<#ddeC#&Yk|`4T-~`^6L4T~@86k2O#JVltpD4c+yDRk$8$CS;QXAnV3v^# fSFiph(U$=H^DvoF;frVFUjS;#V5N#@R`34@!Y55| literal 0 HcmV?d00001 diff --git a/docs/wiki/images/step4-live-add-songs.png b/docs/wiki/images/step4-live-add-songs.png new file mode 100644 index 0000000000000000000000000000000000000000..66448dc7060c621027392cbc10defc41436a778d GIT binary patch literal 8888 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 literal 0 HcmV?d00001 -- 2.54.0