From 8c558e493b56158725d8b2fb88d885e7c6147219 Mon Sep 17 00:00:00 2001
From: Li
Date: Tue, 28 Mar 2023 04:57:30 +1300
Subject: [PATCH] update
---
DumpDVD/DumpDVD.vcxproj.user | 2 +-
DumpDVD/Dvd/DvdRipper.cpp | 25 +++----
DumpDVD/Dvd/TitleKey.cpp | 56 ++++++++------
DumpDVD/Dvd/TitleKey.hpp | 2 +
DumpDVD/Gui/DumpDVD.cpp | 31 ++++++--
DumpDVD/Gui/DumpDVD.hpp | 7 +-
DumpDVD/Gui/DvdSpin/CdTex.cpp | 19 ++++-
DumpDVD/Gui/DvdSpin/CdTex.hpp | 6 +-
DumpDVD/Gui/DvdSpin/CdType.hpp | 1 +
DumpDVD/Gui/DvdSpin/D3DSpin.cpp | 53 ++++++++-----
DumpDVD/Gui/DvdSpin/D3DSpin.hpp | 3 +-
DumpDVD/Gui/DvdSpin/RenderDvdSpin.hpp | 3 +-
DumpDVD/Gui/DvdSpin/Thumbs.db | Bin 223744 -> 237568 bytes
DumpDVD/Gui/DvdSpin/ceedee.pdn | 83 +++++++++++++++++++--
DumpDVD/Gui/DvdSpin/ceedeeHdDvd.png | Bin 0 -> 2617420 bytes
DumpDVD/Gui/DvdSpin/ceedee_tex.h | 2 +
DumpDVD/Gui/DvdSpin/compile_cd_tex_to_h.py | 2 +
DumpDVD/Gui/MainWindow.cpp | 9 +--
DumpDVD/Scsi/IoCtl.cpp | 74 +++++++++++++++++-
DumpDVD/Scsi/IoCtl.hpp | 4 +-
DumpDVD/Scsi/OpticalDrive.cpp | 12 ++-
DumpDVD/Scsi/OpticalDrive.hpp | 4 +-
lib/ImGui.lib | Bin 5847042 -> 5847042 bytes
lib/LZMA.lib | Bin 243366 -> 243366 bytes
lib/Lib9660.lib | Bin 17730 -> 17730 bytes
lib/libdvdcss.lib | Bin 272234 -> 272234 bytes
26 files changed, 312 insertions(+), 86 deletions(-)
create mode 100644 DumpDVD/Gui/DvdSpin/ceedeeHdDvd.png
diff --git a/DumpDVD/DumpDVD.vcxproj.user b/DumpDVD/DumpDVD.vcxproj.user
index 85c89f1..cb39547 100644
--- a/DumpDVD/DumpDVD.vcxproj.user
+++ b/DumpDVD/DumpDVD.vcxproj.user
@@ -9,6 +9,6 @@
WindowsLocalDebugger
- false
+ true
\ No newline at end of file
diff --git a/DumpDVD/Dvd/DvdRipper.cpp b/DumpDVD/Dvd/DvdRipper.cpp
index e528340..e510efc 100644
--- a/DumpDVD/Dvd/DvdRipper.cpp
+++ b/DumpDVD/Dvd/DvdRipper.cpp
@@ -69,9 +69,10 @@ namespace Li::Dvd {
int nmRd = 0;
int numRetry = 5;
for (int i = 0; i < toRead; i++) {
- for (int retry = 0; retry < numRetry; retry++) {
+ for (int retry = 0; retry < numRetry; retry++)
+ {
int dataRd = dvdcss_read(driveIoCtl->GetDvdCssHandle(), this->tmpBuffer, 1, (this->decrypt ? DVDCSS_READ_DECRYPT : DVDCSS_NOFLAGS));
- if (dataRd < 0) {
+ if (dataRd < 0 || dvdcss_was_error(driveIoCtl->GetDvdCssHandle())) {
// if the last read was an error, and this read is an error, give up trying as were still in
// the section of bad sectors,
@@ -81,7 +82,7 @@ namespace Li::Dvd {
this->errorMsg = "one or more sectors failed to be read.";
// try seek forward 1 sector
- if (dvdcss_seek(driveIoCtl->GetDvdCssHandle(), this->sectorsReadSoFar + 1, DVDCSS_NOFLAGS) < 0) break;
+ dvdcss_seek(driveIoCtl->GetDvdCssHandle(), this->sectorsReadSoFar + 1, DVDCSS_NOFLAGS);
// set the last read was error flag,
// increment the number of failed reads
@@ -95,16 +96,15 @@ namespace Li::Dvd {
// write null sector to the ISO ...
this->iso->write((const char*)this->tmpBuffer, DVDCSS_BLOCK_SIZE);
- continue;
+ break;
}
else {
// if we have not reached max retry count, then set the position back to the current sector
// and attempt a read again ..
- if (dvdcss_seek(driveIoCtl->GetDvdCssHandle(), this->sectorsReadSoFar, DVDCSS_NOFLAGS) < 0) break;
+ dvdcss_seek(driveIoCtl->GetDvdCssHandle(), this->sectorsReadSoFar, DVDCSS_NOFLAGS);
}
this->retriedReads++;
- continue; // retry
}
else {
// if there was a successful read,
@@ -137,11 +137,8 @@ namespace Li::Dvd {
int numRead = dvdcss_read(driveIoCtl->GetDvdCssHandle(), this->tmpBuffer, toRead, DVDCSS_READ_DECRYPT);
- if (dvdcss_was_error(driveIoCtl->GetDvdCssHandle())) {
- this->errorMsg = std::string(dvdcss_error(driveIoCtl->GetDvdCssHandle()));
- }
- if (numRead < 0) {
- dvdcss_seek(driveIoCtl->GetDvdCssHandle(), this->sectorsReadSoFar, DVDCSS_SEEK_KEY);
+ if (numRead < 0 || dvdcss_was_error(driveIoCtl->GetDvdCssHandle())) {
+ dvdcss_seek(driveIoCtl->GetDvdCssHandle(), this->sectorsReadSoFar, DVDCSS_NOFLAGS);
read1SectorATimeSkippingBadSectors(toRead);
}
else {
@@ -151,7 +148,7 @@ namespace Li::Dvd {
}
} while ( (this->fileReadSoFar < this->fileRemain) &&
(this->sectorsReadSoFar < this->drive->Sectors()) &&
- this->keepRunning);
+ this->keepRunning );
this->inFile = Li::Dvd::TitleKey::IsSectorInFile(this->sectorsReadSoFar);
this->fileReadSoFar = 0;
@@ -161,18 +158,18 @@ namespace Li::Dvd {
dvdcss_title(this->driveIoCtl->GetDvdCssHandle(), this->sectorsReadSoFar);
this->fileRemain = Li::Dvd::TitleKey::GetDistanceToNextFile(this->sectorsReadSoFar);
- if ((this->sectorsReadSoFar + this->fileRemain) > this->drive->Sectors()) {
+ if (this->fileRemain == 0 || (this->sectorsReadSoFar + this->fileRemain) > this->drive->Sectors()) {
this->fileRemain = (this->drive->Sectors() - this->sectorsReadSoFar);
}
this->fileReadSoFar = 0;
-
this->readCssSectors();
}
void DvdRipper::readFileSectors() {
dvdcss_title(this->driveIoCtl->GetDvdCssHandle(), this->sectorsReadSoFar);
this->titleKey = (std::byte*)dvdcss_get_cur_titlekey(this->driveIoCtl->GetDvdCssHandle());
+
sectorInfo* sectorInf = Li::Dvd::TitleKey::GetSectorInfo(this->sectorsReadSoFar);
this->fileRemain = (sectorInf->endSector - sectorInf->startSector);
diff --git a/DumpDVD/Dvd/TitleKey.cpp b/DumpDVD/Dvd/TitleKey.cpp
index a1d6343..e8130a4 100644
--- a/DumpDVD/Dvd/TitleKey.cpp
+++ b/DumpDVD/Dvd/TitleKey.cpp
@@ -31,7 +31,7 @@ namespace Li::Dvd {
uint32_t TitleKey::GetDistanceToNextFile(uint32_t currentSector) {
- uint32_t lowestDistance = 0xFFFFFFFF;
+ uint64_t lowestDistance = 0xffffffffffffffff;
for (sectorInfo* inf : sectorsList) {
if (currentSector >= inf->startSector && currentSector < inf->endSector)
return 0;
@@ -44,7 +44,10 @@ namespace Li::Dvd {
}
}
- return lowestDistance;
+ if (lowestDistance == 0xffffffffffffffff)
+ return 0;
+
+ return (uint32_t)lowestDistance;
}
@@ -59,6 +62,31 @@ namespace Li::Dvd {
return nullptr;
}
+ sectorInfo* TitleKey::getFile(uint32_t start, uint32_t sz) {
+ sectorInfo* file = new sectorInfo();
+ file->startSector = start;
+
+ if ((sz % DVDCSS_BLOCK_SIZE) != 0) {
+ sz += (DVDCSS_BLOCK_SIZE - (sz % DVDCSS_BLOCK_SIZE));
+ }
+
+ file->endSector = (file->startSector + (sz / DVDCSS_BLOCK_SIZE));
+
+ return file;
+ }
+
+ void TitleKey::addFileIfExist(sectorInfo* file) {
+ dvdcss_title(drv, file->startSector);
+ char* titleKey = dvdcss_get_cur_titlekey(drv);
+
+ // check title is encrypted ...
+ if (memcmp(titleKey, "\0\0\0\0\0", 5) && GetSectorInfo(file->startSector) == nullptr) {
+ sectorsList.push_back(file);
+ }
+ else {
+ delete file;
+ }
+ }
bool TitleKey::readDir(l9660_dir* dir, int depth=0) {
@@ -77,33 +105,15 @@ namespace Li::Dvd {
if (dent->name_len < 2)
continue;
- uint32_t cSector = *(uint32_t*)dent->sector.le;
if ((dent->flags & DENT_ISDIR) != 0) {
l9660_dir ndir;
if (l9660_opendirat(&ndir, dir, dent->name) != L9660_OK) return false;
success = readDir(&ndir, depth + 1);
}
- else if (TitleKey::GetSectorInfo(cSector) == nullptr) {
- sectorInfo* file = new sectorInfo();
- file->startSector = cSector;
-
- dvdcss_title(drv, file->startSector);
- char* titleKey = dvdcss_get_cur_titlekey(drv);
-
- // check title is encrypted ...
- if (memcmp(titleKey, "\0\0\0\0\0", 5)) {
- // Round to sector boundary
- uint32_t sz = (*(uint32_t*)dent->size.le);
- if((sz % DVDCSS_BLOCK_SIZE) != 0)
- sz += (DVDCSS_BLOCK_SIZE - (sz % DVDCSS_BLOCK_SIZE));
- file->endSector = (file->startSector + (sz / DVDCSS_BLOCK_SIZE));
-
- sectorsList.push_back(file);
- }
- else {
- delete file;
- }
+ else {
+ addFileIfExist(getFile(*(uint32_t*)dent->sector.le, *(uint32_t*)dent->size.le));
+ addFileIfExist(getFile(_byteswap_ulong(*(uint32_t*)dent->sector.be), _byteswap_ulong(*(uint32_t*)dent->size.be)));
}
}
diff --git a/DumpDVD/Dvd/TitleKey.hpp b/DumpDVD/Dvd/TitleKey.hpp
index 994809b..f1bb949 100644
--- a/DumpDVD/Dvd/TitleKey.hpp
+++ b/DumpDVD/Dvd/TitleKey.hpp
@@ -14,6 +14,8 @@ namespace Li::Dvd {
private:
static bool readSector(l9660_fs* fs, void* buf, uint32_t sector);
static bool readDir(l9660_dir* dir, int depth);
+ static sectorInfo* getFile(uint32_t start, uint32_t sz);
+ static void addFileIfExist(sectorInfo* file);
public:
static bool FindTitleKeys(dvdcss_t drive);
static uint32_t GetDistanceToNextFile(uint32_t currentSector);
diff --git a/DumpDVD/Gui/DumpDVD.cpp b/DumpDVD/Gui/DumpDVD.cpp
index fa32801..082f982 100644
--- a/DumpDVD/Gui/DumpDVD.cpp
+++ b/DumpDVD/Gui/DumpDVD.cpp
@@ -7,7 +7,7 @@
#include
-
+#include "Renderer.hpp"
#include "../Utils.hpp"
#include "../Scsi/IoCtl.hpp"
#include "../Scsi/OpticalDrive.hpp"
@@ -17,20 +17,21 @@
namespace Li::Gui {
- DumpDVD::DumpDVD() {
+ DumpDVD::DumpDVD(Renderer* renderer) {
this->discInserted = false;
this->keepPolling = true;
this->showDemoWindow = true;
this->imRippinIt = false;
this->selectedDrive = 0;
this->selectedDriveSpeed = 0;
+ this->dvdSpin = DvdSpin::RenderDvdSpin::CreateDvdSpinner(renderer);
this->drivesList = Li::Scsi::OpticalDrive::ListOpticalDrives();
this->pollDrives = new std::thread(&DumpDVD::pollDrivesThread, this);
this->sectorsAtOnce = 0x400;
this->lock = new std::mutex();
-
+
this->reset();
}
@@ -41,10 +42,13 @@ namespace Li::Gui {
}
else {
this->keepPolling = false;
+ this->lock->lock();
this->pollDrives->detach();
delete this->pollDrives;
+ this->lock->unlock();
}
+ DvdSpin::RenderDvdSpin::DeleteDvdSpinner(this->dvdSpin);
delete this->lock;
freeOldDriveList();
}
@@ -56,6 +60,17 @@ namespace Li::Gui {
}
}
+ void DumpDVD::updateSpinTexture() {
+ if (this->dvdSpin != nullptr) {
+ if (this->drivesList->size() >= 0) {
+ this->dvdSpin->UpdateTexture(this->GetCurrentSelectedDrive()->MediaType());
+ }
+ else {
+ this->dvdSpin->UpdateTexture(DvdSpin::CdType::UNKNOWN_DISC);
+ }
+ }
+ }
+
void DumpDVD::refreshDriveList() {
std::vector* pollDrives = Li::Scsi::OpticalDrive::ListOpticalDrives();
this->lock->lock();
@@ -65,6 +80,8 @@ namespace Li::Gui {
if (this->selectedDrive >= this->drivesList->size())
this->reset();
+ this->updateSpinTexture();
+
this->lock->unlock();
}
@@ -105,9 +122,12 @@ namespace Li::Gui {
this->selectedDriveSpeed = 0;
memset(this->outputFile, 0, sizeof(DumpDVD::outputFile));
}
+ this->updateSpinTexture();
}
Li::Scsi::OpticalDrive* DumpDVD::GetCurrentSelectedDrive() {
+ if (this->drivesList->size() <= 0) return nullptr;
+
return this->drivesList->at(this->selectedDrive);
}
@@ -317,13 +337,14 @@ namespace Li::Gui {
void DumpDVD::RenderUI() {
+ this->dvdSpin->RenderDVD();
if (this->drivesList == nullptr) return;
-
+
const ImGuiViewport* mainViewport = ImGui::GetMainViewport();
ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always);
ImGui::SetNextWindowSize(ImGui::GetIO().DisplaySize, ImGuiCond_Always);
- ImGui::Begin("DVD Dumper", NULL, /* ImGuiWindowFlags_NoCollapse | */ ImGuiWindowFlags_NoMove |
+ ImGui::Begin("Disc Dumper", NULL, /* ImGuiWindowFlags_NoCollapse | */ ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize |
ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoFocusOnAppearing);
if (this->imRippinIt)
diff --git a/DumpDVD/Gui/DumpDVD.hpp b/DumpDVD/Gui/DumpDVD.hpp
index 122a1de..f71c6e6 100644
--- a/DumpDVD/Gui/DumpDVD.hpp
+++ b/DumpDVD/Gui/DumpDVD.hpp
@@ -6,6 +6,9 @@
#include
#include
+#include "Renderer.hpp"
+#include "DvdSpin/RenderDvdSpin.hpp"
+
#include "../Scsi/OpticalDrive.hpp"
#include "../Dvd/DvdRipper.hpp"
@@ -30,8 +33,10 @@ namespace Li::Gui {
std::thread* pollDrives;
Li::Dvd::DvdRipper* dvdRipper;
+ DvdSpin::RenderDvdSpin* dvdSpin;
void pollDrivesThread();
+ void updateSpinTexture();
void freeOldDriveList();
void refreshDriveList();
@@ -48,7 +53,7 @@ namespace Li::Gui {
public:
Li::Scsi::OpticalDrive* GetCurrentSelectedDrive();
- DumpDVD();
+ DumpDVD(Renderer* renderer);
~DumpDVD();
void RenderUI();
};
diff --git a/DumpDVD/Gui/DvdSpin/CdTex.cpp b/DumpDVD/Gui/DvdSpin/CdTex.cpp
index c3edcf1..363eaeb 100644
--- a/DumpDVD/Gui/DvdSpin/CdTex.cpp
+++ b/DumpDVD/Gui/DvdSpin/CdTex.cpp
@@ -9,6 +9,7 @@
namespace Li::Gui::DvdSpin {
CdTex::CdTex() {
this->uncompressedTextureSz = ceedeeImgUncompressedSz;
+ this->uncompressedTexture = new std::byte[this->uncompressedTextureSz];
this->SetUnknownTexture();
}
@@ -21,25 +22,33 @@ namespace Li::Gui::DvdSpin {
}
void CdTex::SetCdTexture() {
+ if (this->currentCdType == CdType::COMPACT_DISC) return;
if (this->currentCdType != CdType::UNKNOWN_DISC) this->SetUnknownTexture();
this->applyDiff(ceedeeCdDiffSz, ceedeeCdDiff);
this->currentCdType = CdType::COMPACT_DISC;
}
void CdTex::SetDvdTexture() {
+ if (this->currentCdType == CdType::DIGITAL_VERSITLE_DISC) return;
if (this->currentCdType != CdType::UNKNOWN_DISC) this->SetUnknownTexture();
this->applyDiff(ceedeeDvdDiffSz, ceedeeDvdDiff);
this->currentCdType = CdType::DIGITAL_VERSITLE_DISC;
}
+ void CdTex::SetHdDvdTexture() {
+ if (this->currentCdType == CdType::HIGH_DEFINITION_DIGITAL_VERSITLE_DISC) return;
+ if (this->currentCdType != CdType::UNKNOWN_DISC) this->SetUnknownTexture();
+ this->applyDiff(ceedeeHdDvdDiffSz, ceedeeHdDvdDiff);
+ this->currentCdType = CdType::HIGH_DEFINITION_DIGITAL_VERSITLE_DISC;
+ }
void CdTex::SetBdTexture() {
+ if (this->currentCdType == CdType::BLU_RAY) return;
if (this->currentCdType != CdType::UNKNOWN_DISC) this->SetUnknownTexture();
this->applyDiff(ceedeeBluRayDiffSz, ceedeeBluRayDiff);
this->currentCdType = CdType::BLU_RAY;
}
void CdTex::SetUnknownTexture() {
- this->uncompressedTexture = new std::byte[this->uncompressedTextureSz];
uint32_t compressedSize = ceedeeImgCompressedDataSz;
lzma2decompress((unsigned char*)&ceedeeImgCompressedData, &compressedSize, (unsigned char*)this->uncompressedTexture, &this->uncompressedTextureSz);
this->currentCdType = CdType::UNKNOWN_DISC;
@@ -57,11 +66,15 @@ namespace Li::Gui::DvdSpin {
return ceedeeImgChannels;
}
- uint32_t CdTex::Stride() {
+ uint32_t CdTex::Pitch() {
return (this->Width() * this->Channels());
}
- std::byte* CdTex::GetCurrentTexture() {
+ CdType CdTex::CurrentCdType() {
+ return this->currentCdType;
+ }
+
+ std::byte* CdTex::CurrentTexture() {
return this->uncompressedTexture;
}
diff --git a/DumpDVD/Gui/DvdSpin/CdTex.hpp b/DumpDVD/Gui/DvdSpin/CdTex.hpp
index 8deaa54..70a6f89 100644
--- a/DumpDVD/Gui/DvdSpin/CdTex.hpp
+++ b/DumpDVD/Gui/DvdSpin/CdTex.hpp
@@ -17,13 +17,15 @@ namespace Li::Gui::DvdSpin {
void SetUnknownTexture();
void SetBdTexture();
void SetDvdTexture();
+ void SetHdDvdTexture();
void SetCdTexture();
uint32_t Width();
uint32_t Height();
uint32_t Channels();
- uint32_t Stride();
- std::byte* GetCurrentTexture();
+ uint32_t Pitch();
+ CdType CurrentCdType();
+ std::byte* CurrentTexture();
};
};
diff --git a/DumpDVD/Gui/DvdSpin/CdType.hpp b/DumpDVD/Gui/DvdSpin/CdType.hpp
index 756dab4..df23a98 100644
--- a/DumpDVD/Gui/DvdSpin/CdType.hpp
+++ b/DumpDVD/Gui/DvdSpin/CdType.hpp
@@ -6,6 +6,7 @@ namespace Li::Gui::DvdSpin {
UNKNOWN_DISC,
COMPACT_DISC,
DIGITAL_VERSITLE_DISC,
+ HIGH_DEFINITION_DIGITAL_VERSITLE_DISC,
BLU_RAY
};
}
diff --git a/DumpDVD/Gui/DvdSpin/D3DSpin.cpp b/DumpDVD/Gui/DvdSpin/D3DSpin.cpp
index 0d8596d..1a5ef05 100644
--- a/DumpDVD/Gui/DvdSpin/D3DSpin.cpp
+++ b/DumpDVD/Gui/DvdSpin/D3DSpin.cpp
@@ -127,15 +127,15 @@ namespace Li::Gui::DvdSpin {
this->d3d->D3dDeviceContext()->UpdateSubresource(this->cdTexture,
NULL,
nullptr,
- this->TextureProvider()->GetCurrentTexture(),
- this->TextureProvider()->Stride(),
+ this->cdTextureProvider->CurrentTexture(),
+ this->cdTextureProvider->Pitch(),
NULL);
}
HRESULT D3DSpin::createCdTexture() {
D3D11_TEXTURE2D_DESC tdesc;
- tdesc.Width = this->TextureProvider()->Width();
- tdesc.Height = this->TextureProvider()->Height();
+ tdesc.Width = this->cdTextureProvider->Width();
+ tdesc.Height = this->cdTextureProvider->Height();
tdesc.MipLevels = 1;
tdesc.ArraySize = 1;
tdesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
@@ -149,8 +149,8 @@ namespace Li::Gui::DvdSpin {
D3D11_SUBRESOURCE_DATA tres = {};
- tres.pSysMem = this->TextureProvider()->GetCurrentTexture();
- tres.SysMemPitch = this->TextureProvider()->Stride();
+ tres.pSysMem = this->cdTextureProvider->CurrentTexture();
+ tres.SysMemPitch = this->cdTextureProvider->Pitch();
tres.SysMemSlicePitch = 0;
return d3d->D3dDevice()->CreateTexture2D(&tdesc, &tres, &this->cdTexture);
@@ -208,21 +208,20 @@ namespace Li::Gui::DvdSpin {
ImGui::End();
ImGui::Begin("Change Tex");
- if (ImGui::Button("Unknown Texture")) {
- this->TextureProvider()->SetUnknownTexture();
- this->updateCdTexture();
+ if (ImGui::Button("Unknown Disc")) {
+ this->UpdateTexture(CdType::UNKNOWN_DISC);
}
if(ImGui::Button("Blu-Ray")){
- this->TextureProvider()->SetBdTexture();
- this->updateCdTexture();
+ this->UpdateTexture(CdType::BLU_RAY);
+ }
+ if (ImGui::Button("Hd Dvd")) {
+ this->UpdateTexture(CdType::HIGH_DEFINITION_DIGITAL_VERSITLE_DISC);
}
if (ImGui::Button("Dvd")) {
- this->TextureProvider()->SetDvdTexture();
- this->updateCdTexture();
+ this->UpdateTexture(CdType::DIGITAL_VERSITLE_DISC);
}
if (ImGui::Button("Cd")) {
- this->TextureProvider()->SetCdTexture();
- this->updateCdTexture();
+ this->UpdateTexture(CdType::COMPACT_DISC);
}
ImGui::End();
@@ -230,8 +229,28 @@ namespace Li::Gui::DvdSpin {
}
- CdTex* D3DSpin::TextureProvider() {
- return this->cdTextureProvider;
+ void D3DSpin::UpdateTexture(CdType type) {
+ if (this->cdTextureProvider->CurrentCdType() == type) return;
+
+ switch (type) {
+ case CdType::COMPACT_DISC:
+ this->cdTextureProvider->SetCdTexture();
+ break;
+ case CdType::DIGITAL_VERSITLE_DISC:
+ this->cdTextureProvider->SetDvdTexture();
+ break;
+ case CdType::HIGH_DEFINITION_DIGITAL_VERSITLE_DISC:
+ this->cdTextureProvider->SetHdDvdTexture();
+ break;
+ case CdType::BLU_RAY:
+ this->cdTextureProvider->SetBdTexture();
+ break;
+ case CdType::UNKNOWN_DISC:
+ default:
+ this->cdTextureProvider->SetUnknownTexture();
+ break;
+ }
+ this->updateCdTexture();
}
D3DSpin::D3DSpin(D3D* d3d) {
diff --git a/DumpDVD/Gui/DvdSpin/D3DSpin.hpp b/DumpDVD/Gui/DvdSpin/D3DSpin.hpp
index 8a4eab4..dd599f8 100644
--- a/DumpDVD/Gui/DvdSpin/D3DSpin.hpp
+++ b/DumpDVD/Gui/DvdSpin/D3DSpin.hpp
@@ -4,6 +4,7 @@
#include
#include "RenderDvdSpin.hpp"
#include "CdTex.hpp"
+#include "CdType.hpp"
#include "../D3D.hpp"
namespace Li::Gui::DvdSpin {
@@ -62,7 +63,7 @@ namespace Li::Gui::DvdSpin {
HRESULT createCdResourceView();
public:
void RenderDVD();
- CdTex* TextureProvider();
+ void UpdateTexture(CdType type);
D3DSpin(D3D* d3d);
~D3DSpin();
};
diff --git a/DumpDVD/Gui/DvdSpin/RenderDvdSpin.hpp b/DumpDVD/Gui/DvdSpin/RenderDvdSpin.hpp
index e563e57..9fec24d 100644
--- a/DumpDVD/Gui/DvdSpin/RenderDvdSpin.hpp
+++ b/DumpDVD/Gui/DvdSpin/RenderDvdSpin.hpp
@@ -1,13 +1,14 @@
#ifndef _LI_RENDER_DVD_SPIN
#define _LI_RENDER_DVD_SPIN 1
#include "CdTex.hpp"
+#include "CdType.hpp"
#include "../Renderer.hpp"
namespace Li::Gui::DvdSpin {
class RenderDvdSpin {
public:
virtual void RenderDVD() {};
- virtual CdTex* TextureProvider() { return nullptr; };
+ virtual void UpdateTexture(CdType type) {};
static RenderDvdSpin* CreateDvdSpinner(Renderer* renderer);
static void DeleteDvdSpinner(RenderDvdSpin* spinner);
};
diff --git a/DumpDVD/Gui/DvdSpin/Thumbs.db b/DumpDVD/Gui/DvdSpin/Thumbs.db
index 30e13ed2f1e8fee0051dad7bb36b7b2e365eb9a1..4f05228db04c83791fbdced94aa04e47046f7c90 100644
GIT binary patch
delta 38400
zcmafabzBrt^zX8?bfa{GG$_(bC`f~Jw;-^fbnbwZw3L9fphzR#A>Exzhjiz{!ajcQ
zy&7gk@O#ZO1vc+YvKit1_223k%ayKklk@L
z66J9Ot1fWy1vrF2FF_(8bC3|o2J`}C`*>P{-h)IR4}r(t_VJ$J;|QxnCXAK@l!$rT=UxYcpW?{~zV?DS>ZK&~busB=D6Qw0Sw0;H0FNV&+m;r+tJ(p=xH9
zSH!Ltud{5D3!av{&6-^ro6oP@Ue#SoVFvug2yhP=Ru>6BnBcw!=KB`DEg>AUE3~f}
zrbON304ao*v-!#X-Y(n-5N+ZQB9Bty^d2eMf&sei!sF(iI0}{y?CWVO>JDYvxDsb_F`006`pNvyY_I
z<`%B-Ajoh=H_{kwUk2^l_+K=2a$j?hWSKLj{{VBL^CnBa+-O=GXW=V0D#@cevm&S!5v03|WD-b9iLy_Y+BxV*Fy)BaW;KZTE3auR^h=7|gB3H~8(N0hg$YltOCne=M
z*bwlaB%x}>jb2LKjLoE9uDI)^bXxx_*z|EFgAN(obhra0`pbZ3H6cCCjVf;2rSqJg
z`(pZX&)YU9)Bo?m=fQ)`n3eaQ_cTuTk@|D2E6$A{DiUL=`f!a2`7iGtA_ycfJ&g>d@v@c=?}60ytw=d1|8&p((QW^e+Kt(
zxM;FZ{Ipn4v(1EnMk+EXKnrBGtOo=2{B}WWFD6X;O)_i;%Ey?|7&|O<7OipyQ-U6-
zWP+Y@WSDwkXzqL84Yyy;Ad^U=NR8#g!kITwC8CTfrykxZl;;vTiEQu
z9c7cvda{UsxJ_}oqSNfomgmMrI@I~bHJwg&{z`twt=CKdapP)*JBy&smjLve7N_2R3>Ugq0nl{+AoY-enh$y
z!Olo2KxRtR6_omWy&*4A)xz>-PYM*--Z0|R(;VX)Xpj4kKiYe-(L|b_1$3}|CJ}@7qXQI#w^OWTZO7NHK&dkVUZ8=%6R8BnQ;r_K+pH3Aq2G0j3jJn43&HL;FvpAk6
zNt<;0FgJWGfz~+9&m49{=t@XVRs$`5>`tSb(NbqYaHm~d*vIeyYuc{6X9?N09eAFX
z-At4P(KZP-dJ_C&O;c>9;XGQZDNqnCTvNV%^&8;7<|o7MdcqA*UIuiS52
z`au|Iv-oI9=h)eP6s*IGBx*Oc=B?es=>I3q!A#izNK
zD|Ko6WCQ7Tzmx8ZKC?3cDfpxKt$8l$IE4
zy00eQY(sjF#=$`)^qn%TY~MKK;lLOr=c_y4g4`^m8#XA?lNldK-^Nw8kz>wsMw`>!
z+37fJd6ybshs(xi%b6O#`jk6+wJH0K(@=~XWS_<`eJZLH9aBqu*}*uFQxu+bs>ATm
zZny5p6cT%?*pRAT<7D&8($7m{ZmK<1>cZTmcDS43SYCCc{3SxEy!8ajSlZQrh90>`
zb=bAbF}7TL_%sWs)mBj)E2tefu2qsi&Mno}yV4eXA`>)=h9_G}v|ey}60mr>uc1Y+
z{5qV^sOi;!jrWLr3fObXDW#LR>@xK{9U|~tyP5X1+A0>ApskJ}3qQEn3!Ygtsh%I9
zr!iZq9H03TLu4(u-~?aj(K2?)u1FhhshxsV7i%2!9wloG9_s8zCG^e~KpXBW)JCme
z{egw6l^oS>mHM@`Y5hvMqT|rY;K%>-5K!D-;ViFqfbp!nS8P*%`$Y2AXSQKO?0xHM
z9A-_`H0|ZKwtrO$gCLjz&{s6!jHj^w^G{#S1FwS2;T>4n6ql<~gMx_F_%_iYHwWi0
zHy0r0sW9f-!^rLLuIYecpcDeE%@^;ozOw2SvEXT%I+V=ytKlqNJ6^
zP;1vWh3kd&DUUg>b*sSQJ>-@AtgyG)EaSNSF4-n<6QpdjbQ|
zhh{(8CktK~uRpblN_`?tL%uYvljQ}McVlFBr0fcT*{QREOFPha8PJG0eE{0WV@6Kl
z6R(H)HklL-VK6hG_y@H5T;z|j1o(k5y!`W*;*LNXP6$D-D*es;S4#U0hHfS#m(Z{irdQWvk)jmoc*HGX>lTCF7J8iykk}vm`AB(dLhR
zSQ=7J=ySh_cGmbV1{Ir;L!llAHP$;ylOlicR+m0lKh?K)iYSfg259yBhbKh@KA(>q
zGqp>##T)}QF%6C%L$m90yZxL3&9_2N4YFI7d&E^ls@-3$TgBqX!EYD2q0JtD!)6#{
zyb!q@i}b^-GYTEAM2@-*_;aCDeiCz8BjCL?{otTpwWL;-_~ZN+H%hT0*oPA8KO|8Z
z?4lZ`{c*C&^H&CLw^X0TML}W-M(1A{l(xesZ+-`?U?N@Aq%%83G_Hw1)$VLzm6!w}=-6L`uyY-?a!7derJYUXN>l60Sh#Mq)|JvXC2&5y6SZg^
z4MTtRC4qru6w|_+I#W>y|4i*POZP2p+g??A^O-OLF^?kr4J*m*hBmdK$0=>sf$UXy
zKqk=`(`_lRm*8hW_Dr5?i*Ik9dhRuDjHY1)vZ0C{Spxz+jpBIQL{I`}K~I1CK#)$o
zH@CToLkj$TZ}-c|iWvT|(l|Y%ZuPF}EHy*J?(F!r*ID9YNNl}+b-Fau`Z=pGfGuD`
z@O9Kx{t98MMDJMPEOJ>85%tExF*d3_RP@jQLxAYA_QDlF1G%CZm~T)efMshyFJ7%i
z31viOgv*$NygNGIV4kDT$_DWT+b8maSPYym-3czK@MP>-5*jjyk#am!Q#`*}WIZIf
zzx(4VAAty7>u7%V3ZaG4b9ope8Enxrdy9be3(ItK>CohaHYpqyeTe9v-4cbBm0l&n
zfv(v@3@3p4d~RWO?iy1n_ybzsx7UeadBc4^@-La-s+Cld5BV_dn(=E4`)TbNT@2)BnwOlRpmu?Fmyl{TyMr=N{i8
z#`C}|v{n}rz*BK4@8xDr;1}rNc7-ne#!(Eyuc0Pxz4&8DXw|n+4ZKU?hb{Mx2j
zWzkC+H;>!{mnAK(w$s?oS!Cg}w_4Kl-39Q1zNl=1SB-v|HtR?grVJL`Kk2Cz$U@o^
z?R^J|nkmU{)-vSY`}Ts-pQ@cpV~ozYhW;$~6Tf^D_-Rr9QsHR~-9<3L!)veJtCus-
z70#ne#bNf|3hHPAc-Kw+@bD05`yifZId=2-!MU}Z12uB!r=9@W{YN$DlsP5&?mhZweqNz{VN8s~sWB8a}dxROuo*yVgmB$3#j4yKvbnVGB(
z2jeW;WL)I~Gx3*Oumbu(Bq;wG&wPh=uXzDoXKXv=!Og%Yi5fwdbUKtE=}TgA>!{b@
zH@Ig$$y@g=E`tHGUo-y*)+0J-*qF?s^Qgygt-H6xO6mL7h+^>R2GO>#b%YcvIply8
zqNfqisgCdj2ke1g%Nz1R2F(Od=^Wv5p`B;pCGne<
zt|^*lQC+5SQ1~uf{G?5IO5#yWve^>tV3l1+qyttt{>_2-5!*#PSsrZLY_ePO<;f3JkdRMWm$wJjtFK%t^)E$j
z3-mPLx!sALuFwv>@B42(Zy2ffwLS-*tvzEoleCAcH9faA#bD>Qy&&(i%RAA`JVP63
zqsHmUGfbj}wZ8KcgW;fStB=p=_sdQ78r84o^{rA;){cCCi8TZDuD1qaNEXr0gb6y4
zm#nZqd%s%?y`Jf#8XBI$tNiLbV$0^y85)Q8Bl{7Tn=1_g+uCR6*G&C&>JMS_xA!|l
z{-PwW`!V>xv!>FIeI}`vyS+8X+|=f~{4Ah{7bvV+FQXL1L}ozZlg$4kVOA#6OP;OC
z>qK=tI?Q)BD#&tXZ^Z%7y?-E;p-kvbZksmzQ*()FY+_PDc3%I+z@Qqjg=q{osnTnT
z5WN_lAYlpAWlN^At=1NT|0Uz2^SRKalRw{#B3%{aeV$J2+T+^RWuPjHn2BCfpH%q%
z_IBp`a#@gMT`oy9p(naOs4Khu{n`1zsLNhv*7xf9`48#onQP^M|NK(h*L?zHf^D+KE=*x
zU6VxQwUsf+QZ{@TMla-SR(xD<%G>{_53+x!5eW_bKG$Gss=LQObP
z1F&>RUq=D5@yrb^HLG%d_d_}@O%;C&N(1Wlfg;r36($8df`}_V=}1|LVeJ{|DoFzUGy%TP9g3CC>V1Bvg-o8?UEBE(XCjfL3z?Hvby
zk+@M=nb$XbpvpOF(3|XmL!C|$@7aSk$bDp{FXysF@R_;BLnhp-l>@?czaXemw=gqd_lb|@ccMOeHju?~nQ`u8
zDF09Mtt?t{J%1#kel}O
zPb+`fwddYzug`)pGdpTMp1t*Ss(C4>nXtk?Ci5fqB(I;lSfsU@aIyN7g7x4TaZ}iz
zm~Syq5vY4&we3babVou2^Zvqj^1Xh#2sX-)=XuphwquRclREyy-pJd_7V1
z&C;Kyxi1AgMW??p^h5q`GH9P^XsF{NBmz_)F3D7`l8FM)Fas9m$fpsBh%BvQk+yZEI|9{O59-
z0&c)jW{6i8>tC1CDjS93!&~jZ_QMP88CKe`C80a?Y#woW7JOKvtbj2d
z)OM{62_7%hR@ozGZP@TU5fYEI1m^)-`JZ0uS#|x;lrx(yZrtJcMb)^k*C40+$0B1p
z=Zn^ojhIuR%2<0v%mbuPx!{WOt7}C=XEG@+tIkq?AGH$&r>*T0_#elAnWBSrz;TB<~b)G
z)H%*j8(-JjR!|OmKKk-gB8;~`+x?_{rDiyu>ee`@2FF6sz`RB+XPGdX?pG@hhPCFF
z`cSz8nhe}WrFs6toP!<4tFHP|(1~oG0z_hT!hX*WzqfZN_*Et&MKJK4JWFrXf=LQg8k@BU2P5!&V
zB9|LYFRhlf!_Cq(_k4Zi%2D&HPFt0+m1UV0_b5pR>lL3;0(G7@=783bm@*9NM|0frOCm41b#U#1F!{t&;=5OtjL|5
z^9J*pgK(4tA(=rbv`z62>KJKw7TmNglK!7I|H*AJ*NZMVUd!k)@Kf{#Z8iShr-(B^
z%tmzUZ;{clH5#Ek0h;y~)m4Q(?8P{}1ilkEyFREO}fK80_C{<}^SCb6IXqn(E
zDD*<9snB7Ll-t@5s$xc?^ZK14q0TI@$vAgwwPAJ)2~pex0wB7(#CTc5bS-lH~`%uaq8u!Td)KSujc@XdgY3CDBbt?S$0h+9&s
zH)P|_=|gN(@I7ATeBF!K92T!qDm(A-2ETtg+n=c8G;Y|k_gbywASta{OM#)tf_T9o
zp+AGs&KLaL^mSw+u~RtLF!O6d0u@pRe)roc}pVkCi4A6|`Y(f>Dom(#6oL=K|37
zk7ml{1z}=xq+Pp3VQb8dH_^WieM6eSK00r_=XVeQ4cK|i;0g%)3LfrSFV#dunI{wf
z;>=Qw+U$pG%%DoXJVZBNG?n_mUsIUOON`DD@TfzlEz;&Hc|z??|)6jMrEE~!dZbu
z<*izCAcGJujv$UN0z!1HCKZ)5Q`X4c<)2Rq4hR}XnDnxqcYQv4WA+odg{RcBCZ{*c
zZ<;eevO7AL-@KxK794qLZRT<)i$
z8wYdRWh&+qX02Uj*~^uo0cR2}75{pH9kE9yr}sM76s5=c{l9Y}sV%MSWPNn?~R
zt{Hx+3FJ%81bc{!v)zI|b4jK7l-c7HcXg
z17*tYXH0IFRt03a`Vv1{cnZBQX4^^n{d^jW^afr#trdH}@qfoAN(%Q-otxWJJkukO
z3OdH9KyQB{U7~R%JL4QEL=|B&zZ>p-qDyB#7M$HocWDR4O4wHAy_CALV@8C3*Y+I8
zgjliY|BVhQ99wd1ol3dtGBfQv9DZqR4oE@M_oHeX^cc6^VZ+d2nKM1L)D+pNjb;p4
z+ev<$cdx2X`1W~@_tJAl-=A?S6j%?-13$WEgJo7VCGm&EOwi`Lp16)k@G@<^iz-wM
z#={_>G^rj4v}0OO84@xzK+I5ZgT=eiaEN9Vm{ecR1|F+leGS@bTg&xqhzF^e+ZHdV%9x!LLVj7&xA=56OW_OxHo*6$X>WKJB(6n*_A9;uV>js)SMMTG
z*WxusU-6De0sT`_3eg$y)*HnZfq}1H*)M|ZeuYYtk#GUT-Q0=+&h%+|-O4B)d4}E7
zAF=wHm$LUVuHAC0`hIcU;+#>~dZ&FVgs<^eT&Mf9l~krE%q7qYd}wkQfYp&eTz(qc
z?HXo9p19pQ5(f(Qwa#n=>2II_mi9FxH!BsBp!GlBZl&XXh$PTJ=Y8lkKgJq1zw|sm
z187Y6X0RY4LYZ8VPBSR-vbL8!eyD4$V|<{1;c7u4tVfs6+Nq4!UeF#|<~hwZ6l%fo
z$Ot55O
z4aJ;U-nyIZawz`0y_M44WEP0&27RzB{$0?}usC~c^68dN{yl(MZO-Q8=(o*rk7_)AH3MdOiq4^?KNpa-n*L`IwgSrq%A~PnKMREstYf-AmfWB
z<}rm}k^Ua%&zv!BE0*>|&he)}Xg`B(QKc&Fz?nW{iY+0H*6HL3EHsm!kkw3bCSr6<
z)tCKw;*0SB$snou;!P^wcO0Xv*NK$LhWK}sG
z|K*!^_cs~*HVJA`P3EP7x%-LTB1h9HDRB#&WplzCcSYRyX+T8_qQ2%43)j6D4$AJK
z>$Dc&xwzzymk9na6&zoiJiRgV;nm%3Cc*qlL!E!3hx46?Mwe>OHX}kQT_wD<<|gEy
z-b-`vxC!>jz06*Fr3rZc32L|L;pYPLZ{}cJTU|cg*Jtm*H@G1n6uFEzse>^lP9K^+
zEp4Uc6H^M_3m}N~}Jl
zSLVvIn{}C@&0hS0uI+D-Z1f$=9C{?8&DB2z1oT+>ukxZ0ot`&k^{82=p)MZ#lTn+q
zyf>cR`amz=!>Nj>s>ZW#v+52`>1l(~L$n}l
zci-t^uWo)FskDk~Y??J|hmH)E6;1x`*lcrF$5vqmepQDBZ4tIYMtoGaI?RsRe)O%~H=!Lu6xS>`n0SF(Tr^Ho@-)cW#8LLx39**;1mZ
z?~QlmT|nFZE=?4sHD=N9>*{=rtdPr}6cV=p1u8*f-R&DPXVM($=s9lQ)HPb%blq(x
z!7)2App{OYR?Fpd={NXp*`%pAmhP70sxRQxLT)cAk~ibQtG4ywsp@TJ;tC$WVb!G}
z>lOb3a^1X|>|Ea>7ZF}R0Ws)iSKEZ5c`*#yYm}G1ULaMuUvBgN=^=e<{kDBu1i=NA
zGc?k;k!%bijL>LeAk?nv;~7;^I_L22MowLs5$N_3k+4oBi&axHFcp}PGJg5JCLuyn
ztEN9VVN`#QHmzi8T&bDUHbfVEo|E(~2KFpy^^%!_0aL#G-7|8Bj=@cl?jNskzlvNx
z@?`#2mT?fPoEPGely=hW>i3jQ@&LHl=xoJG%$7_v#|ykGk}`zECsTbyJ}5$?;4`Ta
zY0(t_!+x%0BIS$y4ibuC?Fxi_x_wsn71dq~>BAvS9opMmL162zkAd#7w(K8A_)
zDMt=w9eoJtJZe4yurNNSa(;9*!jIp}Xt-x2yBWk|`afUgCV$mNdrPUa_xH6XA#rd@
z*~hb8Y9U+-`rl<=^5q6-d3H?=wf1hFWKP+?yiD8Ci7a4{Ag5^jreg)7o=*0q(;B&_
zSkbNAeWOg5TM39Mvt_1?zG)|0p`v4}F57X|U)O#wxBo;VoujSnCV%ai=-wpTR+!Jc
zDC4-6d4Kp1i`Np-OZRTpa{H72jE&WAk2X1$JdRiXw5+`R8L|^Mr+T$x^cY^O7*sEj
z-PO(48sT|vj%m!X5Vb6QOMw{G<^8Vu^;jsBtOitnpgFvT@BWK&D!nI5CEM3sdYyq*
zy&uTC-_ZU(<dzJ{%2|UV}gG;mXeH)!3TVA1CN+yw>5tJrS6+;UahZr
zhWRnJv1$-}cH2#i>pV_^jmZ(Fo(ytxq_cX)O-F%9$Xdcx-0cg6c!+Ksg@?E+XJ$N~
z!UNFX$ipUy%q!zvGe#6|VhVNKoBPJEF09*~-QB}#4vD79g79#;
z){BVtu%1WO65phUa?pG0R5`)_}_{!y9I_vS#Z)AS+eu=MT`w5e5}Q@=eb$Edsr5$%
z75U@Pu~QotWc~(!sro>g-wNhue4X9MM1x6b9s9mQkS9T3bruSUi2}oU`}gO_pK<3p
zcQf>^b6Qfj+a9~mGjVAmG@LYl(M^#pJ=Xc%Dy~mLE+f%^?vr|laI8t=?hcEV0($?&
zg<*mdv9w^UHn$1)$xLKpg3|3_zlJZ`(eU>2^J_P`RxUfA`}|>Mgdem(0~n+Cy=f|$
zme!e;m3PThZ=2cVkn8^FIrKeK;?QQFV2%RmJpHY!;SV0va;s0|KJDvPXtxJ`EASSQ#F5z0n{bciRR2tf|go(6O
zGn@7|h7N2vi;2GfDt>&GlcCx&VgndslS@3`0#y9{s+>egp8AYtwW{I|4W+K}zs9sW
zBQ$hOG_2S>tXP4X7VI-~f89!=m(>!h&ay=0yVz!U5mvsYMG~CG%A$x>mZd~-?~(Qg
zvexwf;sAOkNz>Fru39TjsobAumiq~gCPosLO$yi0Ne1aFX9?G{70>BEZV({rVUvG%
zcNj$w)eh`9FpQ+C5sc37_4x06lzt*1NQIeF_kyoU;{gx8K)YYGF|P{i*~yT$*Pav>
z5fRBf##xmt1tmTy%VFw?@=fV~=czl=J4Cl-X-lBTyeDH%CB|f?
z@W$>P2gD9>K?ku)?kN>0A+4GyD
z`4X)UanMpkxI=cG+n@rrVocj;+qry4<;rH=LA&{~ON_?-k~mYab8(a6wL2RGaY=>^
zrR|4+H|sET>yo{p=tb{LPvDZBJq^3f7#4E^Ls=T4kzv84+L95kf|8_@#%kR?%pJI&
zGiw^=@(6v^2V9FNFubl@kFs+r$LXzRdiB9erWz56;h!HqU%QrQ>jRp(lxVC{ziV&P
zZa&cn^ufXII;h)3UjOG3i7QlSd|1oUGg`A!s2ka_)Tu6E^&98L#O#a0MA-JG3(sL4
zH$O_2W}f>GcDw-HkMjr1@4URA#LmgG;1x#poxQz7;A-wq_Fj?oHcV2Y|JW5ySbm=a
zt!>?ehGrdR(JjT8%A69)cUk?g%WnJx+6aDQaUHh~JA9{OG&}vq&;7B8AkoD|q_n~N
zUH>ry!IhY!Ka(NyGKjG{A8|nT<-JsyoQfaDS=C#7}d=B0O`abcbll3U^Q|5|$mGIb`|5q2h9+9A>Yh(Z%
zWtysLk4Gj&CT&~4n^A=m4=4#QrD{(Up!DpP=%sHLm(EkF%_nLkxIOJJ72`Ld8W-)S
zxw!CEJM1~Ti%+1|d5&?~#2l)C?cZwt550BMTnl-Ajfs%m+y2f}JO5W70`R_`N3{Fs
zp<^0|C5cfLG7;FI4Qq=iWBwlc%!oLI?DnN>o@g;oXaT2#ug=_*fl{-|*;|3oF!3|V
zj$CV#-P}BMjBk1B{g_U5btR7%iHFd1Yb5C#K#|@qqK?Jd7ZE+GZ?;zGZpz)oFi;V*Gavh3wgKXH7DwyfV0wRB
z_Y{b!2fpvvYfGJyIr`DS|HaGlQPUuttZ#P+bBDhy9(TQ3bn_?5N1AZlBSBn8ptXI!@w#hhN
z8R2A=7JNSE{`WoqS&o_lbr%-w)(-WuF;Y3n3V0bJG5I!WJIv@li{V*_o*2Ib2eEZu
zF#9YAMQ)%yWArWo_)LSZ|Abt0FjaIrSixwf{HVu
zj%~4Kms^e6O5Thn%2JXfjwoBgIQ*17Y8uKRp})+D2a&?C5n~h60BwjVkIp3+@)q6^
z1J!SH=&})8*9*6QCCQCNyw;~hs-@8xs%duk*nZLjp#kaqilq}AhsS;$d)M$NR6pJ{
zA@*ET;H^>JqDe(W5Bb6fL;6R!!@2a`L~fm||1Z?2M&z?>xwC@d+MdI(G`N%Z$F^Jf
zxvrz1!8z7*1Q|5=b1A?sx2MA_5Stne5Y%wmx@6lF83J$a?mSaejBeD+=Kf-4Ye5t|
z87g*XVd=a>40Xxf+P59VBU~c^a>c`=VD}PR0^^l+J2U}%@wI%$3J;N+jY<=q-)FAq
zkaHJ*v=fC}p&VBS%noRVs1r`mVG;|Gr0f|}V5JFV=+GC}0z&-GFYm%x3b`c#OYhp3
z#2<%jPAlK?L2IzB&`xB8g~`kag}gB6ctJ_lyB3^U8m~1p%Ll1IJ;Rvoo5!CybAg-D^NLP-B
zEM%!c*82TmSdW}2cIt}c2R9bLPtNsb;FO_ua$f@_fvkm(PnI(ww3mg?0zA7n{l;Bm
z(>r&E$!epBWJgFA_TN^&an*n>X7jjX%^Y|^9tbZjD+HaJ+AjS9&68`&5T!nqlLw+2#tXdF
zj!S&H3L)sh%(0}ILwjM3wo1!(l4f`WY7SxW83)G|eHkYwpB(3K$-sB;9_v@4K_*<2
zKKxLxWa(5+Y&By1Z5ePzTuz6hCn!+%ljeQk-E`m8%`rK~K#D(I)OhmO{3+X|BRP&)
zt`B5lj9P?m_jZ)bEpJvw@8$GBJr+P|8dAq56wR?fqccpzis$;MB|+XO^K)0Gdm;Z}
zORHVwVLlue;kMsw$2Ul8cGev=aG>}~sx2W~5->TxS-@_*6@ky$a;Kl~8UKI_v^{S%
zKAO2sQ90P29n~B733L88P{dzq3x$k;E@>w-O5W6wS9&uFi?VWXeOkZe)&uZs-;#^p
zq6z=W&(q(b)9yjzB{^M>#m82N!T4#uWbsT8_pRU!M#Jvwn=<*}$B|s9AJJBSocgLY
zJ?TmJRTc)_UdyEIC|hBSba^q%72*L}ed{FQd0UkZXF^3CLA(a$?cl(w!3b%whYOhY
z$Ye~a&yuTMr+NvhHRK_}4|re$ZZiz-?u!^AkkV0RONbD%yr$x-I(@w{i|lNHPre`C
zPgmi|nC7-uQ#hENcO$6X-nq?CTyDNE6&J&JPCl0TLC@(V4fNou&&Cultz18*EvJea
z1rJV8`7h`OUN&YektL)IV}d#27UMS^w#Ha`SWOAJ)d>#a}i7g-L9e51^jmk^xU$P;c&rRXDDDVCt}ZyY@B
z7_V5XEgs`_hM`@j;OX8q?IO~V`NgG*(4RgU`oLHdAHu&geyyr7XBgnzDWHOaf}CoV6eh!_8Hh|ueWsnUG)_|j|D
zj<1|9*+RIft()@I3@i$ee&4@Lv53Zx<3dxhsq^*N{;c8Eko=Fiwtq2{8=OYO3Qn
zLOg%eS~0yX(m$K%B?P}68;{ECFM+r_g%e*-cN1Dz
zO||*nrM)J!g9Jc$0>u9PjH#b$R688Gk_dpYLUz}C4o&Z$GEi4t&N!qT`Tt$ZJuPC$
zB#^$@zy~Mne5J-D=2_~SNf|T;O8`lUib6Mw6gtvt<-R(hb+aDhub$kgeRr
z@@4pM)XjG}wvC1<#17hdqZFUq)#>|he1@EQV@sRNX+7|+*jUe^Bzu|-ryI!5n!mXg
z2jCC(r?qvu__<0Xm&QFjW+xL{!{P1OZN?8~o3kal_x5XgzF+VH0ipLa_P)ECe?>yu
zYX-E{-z!ZdTt*y_(H3y3$*^KRODz8CE*UgrW>&cMJwhQ(oqpwyIy;;1jjh}ywiM<@
z)E9Of=moa9wQ1}d9o1E+oSEa~J@
zX@;~GVcUt2S%9y-0Y(bKBi|Tk=>zw+-M=9Plo$L4iCyY((^>0-eew@wAKcV7s!(Bz%4s+`#kpv11`w<@Y2gweuItgREE~&
z9I}SjXn9R{MGU3t
zNM&L>0U5V3L#>FiF%ycJ$Ny%q_;XaRm_?abcMs%B-Qr8UhuxCaI$I`saE~5Nf5f}a
z?WRO@`*tPj^*<9DgCwC#DR5oNB@I*aXtUfKgle00O!J@V`ZE|J`d@KIKQ)#VdxAk|
za$@_GL6{%}VEjU)E>k;?S0By}fd|222rnfu7X9)Fj_wp_{NOnRZ3k9ez6As?$}4;D
z_-Z@W&}%);6j)!lC-Nr&8)qMqf>s7>D+0L5k3;UEBBJ4}0NNf6EECGxqO}F}Y4e~5
zqWrNG5rwTkma7;8(le1aXXmdFO7P4hzXv1);0F}W9bfy6vQD<~RF(P%eb_(SjUjTv
zzaj2!^Sgpl4{T*^B3<9YXD7}`|Nwp|D4?Cd@
zw9}6O>H7S|W*6{c2pTOV{D}K7RFH$TrJ@pSuawKO!V*YiYgJW#mc6&W^uOX8n3|qh?AP
zm_q;HWol~v?iA4Wx
zPU3Y7!8u>h8S5TH@8>|%?y;z~;BH$GAo6G@Yk%s8H!4l*RU1N6z%RDwpBpnsjn2EJ
zA@j9^Q>N}W>#NL@^0I%H$_*5%w3%g-evr^^CRL$9fM;i^n(j2!C+OM>*xcGPUuba4
zjDb@*mNjYJbxSgK4F-?G`*9SW>F{rs(-F;_daw8cBB62mR
zIt*fuv}ZlAZ1Ag%UyvtDe_(9lF$zjy`OVX=7#hAX*|s#t1ii?UrqVH@j^S{%Pi?yx
zXgw<(y7=)`SWuDDfZ`?~6muG(W2Nce*xf-P>~5YEtHdi(~C2SF|I|DcpEs
z1(mHnZ{5~lF}&gk2T{fb=~mgs-EVe^pqNm7`|=Eu&}-BJm)}mE27CcE`J(fOOh9O=
zcff~;iSEDMX}DWgo1TxXxqmEhO3I6%(5nO4wy9)o7tDTh&1h;hxJ}*~4fzSFSaO&N
z2wHS_hb4c~|1FxaAtQk;g~t}m1?=sqN+G8FKHW67aY!7l?y>;4uYH){8!#Q6!=eK#
zQ%b5QxxJq_FU3d+UE^K04jKb}7n{S7PQmI%(lqT)N4gA5A!TH0D}_B3rd5t33S(mG
zp9c#Hpw&|L+VY*A(?iiM#I<5H-T6Cn1AD(}(&?Ifo%L+_(lct;C?Q<)KuGC_6m>OY
zmd)b7+eK-HH2dx-$GFQRS96;?8IFU%h0-gk0L~Bdb|E7KdY54`37&0X&|n3U7`Jr0@UA>
zVzn+(IlY^&-FrKX3|i{Gvk@|%Hp?`O3wBXYn*aTH1wRNuQLZp20JqDE8uN753{}`f
zd~;Z&0siiDGq3&^0DeG$zgyCO;VVb%*!-%sv8YUqkJ#|=pxyu2Y5URxC+u@~AGTXy
zzx$z+D$7{6-Fpo33B|kT;gfcJoA<19!%atqpyTUdj!dwMT}21q0dV
ztIRoDd*t&m`Ns$M+jTQPc*cHzo=xLp%L
zRK#mgEuq6?P$EY16G%KcS%yt_n=c9s;k?VBis7hssVuQxY@h<|LDrRj7&;0hqEN86
zxwcAA0K*m6>u_yu!&1lkBv2vI~pc4Tr2I@mCdE6tNUw?ZcQ$8NjB?tb*EcJ0+;
zcKua*Y}eeFefmp}*r&eqC41u3WA=(0cG*>z&e_D|usw2Q(LQ?Xop$?!_u9eJkJ-tU
zL)Nqt_Uf07+RI-&f*2-$9r5t|^%vf7F2SJ}prY32rBmt3NeIxnfokZRzx8eJa*d9FoU~NL
z#0H;c-2#LygVc7XS$S7dFj+})NIUm9dMF1$$qktxpG<1WOnO{@g|P!5_3s08yLJFx
zOyyXBgaYj}F*aqd!%Y*>%
z#xj4!cFQi={VKa)<^}~gaKV&K&92$Q3!k%(-}5mf?O|J9U$GZnvBx?iN9?hs+wCJ?
z{6kw@U$Xht1-oE>_q4s_nhWf!r#@{@tlVMu9Q&l*^4K5RAKd;2_ItPdo_+Ewe<<6j
z=DpUKIAweHw(YNc(>K`_`}cW+&w}f?GLG?^LkivUz}>bq^aXUIPV(nV@{?XR`R#VW
z#7$Lyc=h++cJyDT%rBlp@@AN!)(Ke}(X4Ih}b<_2zm13LUBCZE#;-f0rF12FCY
zF!%t@X+gCE;B%auyRiSAfc#5;K=h>`!||11`odBFW)&?8u(5xY4wwTTVu`8tW5B~I)4+4KjZQt{X>umUjy|%J6Z_Va^2IeBJ;E~|`Mj+0w_CNzTjB|&%
z2@}8Wj055~vgd|CwBxteW
zAE-)ydC4@
zN1m_n>2)3Se^qr`Rg65an!i+~U1ksNWmAfO1SL}79HE8&k>9c@p?fjxk=$88+wY*M
z^F_h0-g-gL0i(?aFM`Pitm>1>k&P1#61?;QG}#7l86jHS4YU>SX7M?}z>DsXJTQo$y@BBmG6`LmU_wv)%TN=UwuXzj*p>U40{e
zvVT#uqE7}{=4|E8C4OluV=m)XFWWyfHI6a%X++!xVXFb>gD)v-V@yebHUza?SOhG@
z%3WfEia4@K098;Ol=9Lu={Qj+l!@rZAQjTa){tk?yDslHyewGIFm~(71APIiW#>cg
z@pWMP0;NKKL6yQ%*Hq=`LRkdKUJZ_aCp{|&jeymtI1vZRqtm<47Joew0a{6n#8TlYd~VVOQ<`zN!zz`SyZM56^Y!&Nn=I;)$v+BeQ&`
z7?k)+z^DtmlqE2K1UyGR?@MI1+E%UtQi^!qrP}i{U7QEQ(CI@+UOo!ql)e;yR4HOP
zQYPcn8$_|BZmaIu>6dW=RR?1!9t81-3o2edq;%!MV@YEDpgu%Q;OKOYS<0c{6`q`s
z+3e~h0_quGcF7`MHu$lby=VsgwrpYjL2GSo`l9nBkrSk!z8BBcuOE&zCTy*<-ldz`
z`bL|vZ&drA56Mq@$?Q9AV)U|qu70#|{pWL>Qg=2)s4n_U;zn!TjvdDW5S5M0PGCNQ
z_eoiivjfhLlWo8hkx`ZMMGB1E5V{Wq6dI9htzcPhOaRa;1053Un(V
znWY%r`O)dUzNjI2_)nZk9;bM@N^+XEeIA<0YKMXjGw`=1ZVKVS`e
z;e~&@YCDnt;TRek?$VtLB4ihRCh^Ge$JBmS)|i;I!O@21Pz|spBnztP>}(&kSgVU9R5|CR=c`-Hu{PGDAr<*GZ>5FnPg|@|8SkfD)enfdH>(0IsH+Y^*Q+Wv!|ovaz`f
zU}y4d*@>0A`c8oJ1!qV0*s11;F5N`ujW*Z*D`-FZbRH)^=~a7w|GKXJ5G!14FWE$6
z`dLZjr;3M;JfuE$Fg6nx?&cr|at?7KISCffhoi41T@AGt(ufn&=cuPn#!k$IfdeHb
z5}YDE#3_sF1aK7(NXQMswU6)BH
zSxyD0@!o?RV;`G;K=CpQDm|5@p#a%X4S%;FWxh3-i^bTk14@40Yt66TtMPrx$RzBi
z@5R#ZT+0Lw4)WhiXn&!*X!BQWu(KEas*^1#XK+6~X=O|OGno8SBUjnA2mW4HyEkyl
zH9Ryb9&TN>r-c2+lDcyldFqDPwfe+kNPYW=nF&2UZ$cz`RjTwv^VTm-Oh>K}P0GBH`1wyp~c699UlYXnO42%^51FX**+v5amB=!+}p
zp34-Ei@^MU>OF?@?1;*{_!4*0quwri=~q(vrCgRd6Ahdm*<~j;k9XMyZI2z;`1Nf`
zM`J0Mw6dih!TR~0F~$!1Ufsafu)XYxe~mF7@pcC;wC8PN1PRrzuV>>+U1B+|r7p*q
zNPE9{>C@{EJbvt;`axlG|1N8{Tk$ync*cAaz{P1aG7gng*@G5<(Py%D8
z(}y;<=l0(}_~YeDU>WrXpgsa7c3-aK=NK-nf3>+Y^g`ke!gdnv4g%>
z#~3$U`p;}`>VKu)AGDWkUTiPe)bOm@PQA~g=ns8j3@Ml8D!$YKE50n(4`ckxc>Uzm
zH9Ji^cJ!cvvOnVoW~{lnq0azRp9UmoJ|&jG8UdlETdxOo%(Rer;DjWvgV2+bDyM9q
z%b)`KIMp$>+?w!W&>JC)v1Kn4*nPmm?8!*q9$TQdp?@1$#?vdyuoVH2)t-2^K-92M
zPsi}}x&y$7XHo|$(c|i^R0mBYad)@Xw02{WUKpFb#0DGwv0y%rUhMbpKr~wu0?0|?
zdfXFIMyd3X96V{F`v=mGnB{<_Ul)xyS{y=093PpoW!yV+6Dr@Rd(YNS*xc6Nl&~!^
zgI2cGqkocqzGsZFgT7bC7?)r8Kig#&eQ(uosyDZqSZG_;Xkhz~lMgr8ye~u*rEm1B
z()IBDbiL)aVc5#DE@wMxq|Y&2{X1>WBW(X?rmQv6wvCNdYw_d3Jp1rN(LT^uDX6Dm
zfz1~U?nlS~Iq|*GDt{(Soty=J74%3vxCx9F3R090A8)Cn
zFAzN_J7YxKV!_d(0a?iQ&?Y-&vR+PV0Na>X^ooz9=g&&%N)K7c6bL^r>*Y~N=tJ%S
z_B-{1jS<`iTmcyQ~;%Bc1ma*5uNq$h<~GHiHL&2n%Cr~zv^)vKe*s=JRbF#xZ;Ho
zqf6I~Zi^UI6J1wB`Xr((2e?Yq@Q?bdZ9NX8`2(cYLI5pgAr}fy-Rl1dg8mqc{zyUzCWr+jQrG=}+3PEaPVEr2UX(X)oiT-J`qh)W-21{eO@h
zX#BeE9s2Pq8A&;teVko>rtkT$yW%J9g_r;1qFs(B){ofS_=TZAQ{Sm8^(EgOvl~kr
z%bdxVNPGHh_x;M3Zm#+`b-CaF^OvtXTlE4UfNzC85SPS$rV9ARId~wT(3KUiB0A^~
zjY(t+0dC?1mZ*j~N(xG2Q7+?w`hQM<3y1q`!wAfB9mtG9eLZ-PQHS(gY-9@>`mzmO
z$aaFGkG93&s`ks`39W@7Zn-kSiCPHYSL*OrA%VIQQqERP?!yAWamOMszjB+cHIH^(
z1sr)bK|P|0z4o1CmLrz7UjI^GBK28s^6o!0G-6{T)3(^;$BN6gZQ0)8e}7>YkN#(L
zX->{cP$KzfF!_gvcH7IZ|Mzyuer)@ror$M5PUy9m`&RC*OWZ
zd-^2xIHyh>vm;MDTJ>$}O8$g7_?VZPzC7S>8%Q0gU)Y`Po{t1A02NZhL-2`%yt#1>
zNEX$jfKC8n=H&N;cBGBqlp!*&_9)MC)KizfLJUCor>(+hASnmQ>vg1_|H()SBECkK
zZ*&3{f4%RYls2poLfXQfw+|UBWBbC#$OAU9>uPI^=jQ^p?AZJtX)^fY#tGr*JSPb;
zWuGjL^mn-~=VMj-(B|cxFMUh&da{nXOx8i%vXRCZ+B}3sU?J@8L!24@9=m$#^ENf?
zzisac`^+W(g}dKwuetFvF#rlf0?pDELz#VZXZ^IIKmv09B0@0cu?o%
zYafr{w#2f0#;fb9`EH$$t;f9g&M#Dbn>w(^hNgzAx#RP8CkPu!=~nTjk~5MS$=Mk)
z8{rcaj%bW5IK&0eC$3_6gdS~dr;r7JBY&4`o9kgqCXb3ezdx31q~ro3hM
zf9ck$k8{^v2m|I0YO
z-6vTsqy8=%<$m${>C0GIHvLMue=ajTJZ=-Cb4a$M)hFx9@{^-)v8(rf%C6k=dp0%t
z<|={dl#{%d>OA(d1NmvhJ-fcyUiPB*+sj`3ew&@Wsi#hVk3W-t7We#qwdw~dlCe>)W6=GmRl
zC=X8AE2qH8s~0A7<--!Z+R_I+zmJTG)ZsRtyykn}HV`safmKeV90*PNFbR=gp>rUm
zPPUL`i?Tep&SRv$_T`I^ZG#RzUJw1FP9`#wIQ*IHY_#;?^%mfeeGy<$Uj!@t5+x8m$OGvnd@VLp{erscm&nQfYg(hBmDB6g!)FHA^k5j
zVR*>zkC;@9$E5W}f3XCUnR^BfDC4MNh0V6o$Ekn)7ma+!qJKH4`{bt)2M7FX!t`AP
zjDdqb^iNn#Y2A#{gzEkTyHPB_QNXk%mc@XEqeN3
zt+`|ytyP;H+lT(;x!t**R{NA~Za$%3>)C7`#^i59JAhk@e_hsS?6&doYcOu{g9&}X
zW4Ag@Tiu-3o0Ucz{rsQ)zMdJLT74h*`TyOHJ@EvJ57?D&dyyS@^HsL8vS=&I3%0tt
zXwBw2E-oA+u5bP&xr7$KCLUGt3qkdzpfUEE(*W*DH&!=du1Y0{GenIi3H;P_dXCx$_A>{4=iJF=ipaPBAvXfIwD&7xGYdrM-EoW&t1SpH(ido*5-@@a;Esa@$5_NhW^@}02d%nDz7k;
zudXYTe;*tVRI~LZgy?#f_e5}>v<}Bk(B4*E0bslh7=!{T<1f(d=|g`df0QFCPBg~1
zSYdbgs|>YC!zjNRE07PVMpi2FqtjOcuh1gE
zhp)#^z2BSgB$1P-q)#_KnYfcn0$bWRe`QOXr);CW*4OW;B5ySoH%{7WYuToe
z_~WBDoMpVQXt
zfAK2p=zfvhVOQe88LVTB26@Gxz!S~Phol$Fs4S5h#H2GlB!hZkM}VFYP{jklV+2Y=
zosI=hh%thk{!{zk2sLWOB5>;TZ`fu#K6vvy$I0=%xc}d+oxsAz2`vaK&BeaHXTxP|
z@fR5b3ktWmljD1o`2Bp(f5iMMv~oj%_u3m}ib&
zCS{hPPg`_Al;v@N&Fl6B#mj_=1wp&(lMSY9KV>iDv6S4bON)f-X{Ss*7e$Y&e}hw3
zMGTi+Q|MA15XEfjf^W2;VSeWuz1Ho-$@f)P1|la(DL)k~WAuxcx}9wO^l3X2Pdb9F
z`4ks}@!d8&GNEMVVz7$E;B3f*r~l~KOtql!zYkeY7h*Qg2No7U*#*EW9i#PQD4SX
zIlUmOJ&qiC`G=06#lZ`RuXI#NCSNZK(!@b_@&NWYF*tRch_wwdmR*$C>q}eelBTX#pY$x4{U#MgtggN%rY>+ESO5DzhpRuF
zxdXWP4Oi+b*;{Qc0Bv6Ye{?}YD=}}X+i@N;VFgZg>{j&!&NDQp0FNlP22UbEP@mU+
zC6ry%%{jq!k3%YixAa7m6S~YqsFNQH0tP@j^i@eBTiRV;>*{jE^jBNJ^N{6S#vh#k
zY)|FyssO}+BHW@rVwQ7W{ei50NbmhgIsFMWi*kxhzq)KLOj8%Vf87T8+wXi9fL*}p
zlkcr34>VnqCw0k}NL~6TEo~)Dz8BNh>s!kGe0%MszU)J(PhDBA#MJfkJs0ftFXgl8
zOIq4{{m<36)P?@8Pkzcj`3IpfHev@}e>vtIulm>(ix%(yhyPij%g1M!V-2}x@E=w1
z_p5deGIXAC$aMe=l@ElbA0$$y>xHc!`;;1s{I?#u+3AvP-uDqKGM9Qs=cOuuj?o
zOCJWrUpGcwaD_}w)?L4Yp1fkeecD7
zZGE!sCbCR#xqiAQi7QJB_T^9gxssoF*_&Qq)*#P3aI7wv=nFx85(mHJ5et6>q<4Z_
z{aD+&J`2EqDe~WjrLKyqD>^Im1S*?AmnxS@fC4CgMVXL=;VY)#WkZ29CGwC%pms}!
zrdB$rZ#9%BY$xdTpfqvOcWR5QMF6{irTPEZef8*vIA?wJ=Za6Z{JHw02YvPDisw?#
z*?hj%vFXJp6Ym`Q|Hc3DF>7tKl>EHwgK#0Z>n2rZl>QV;Y^Z;l3EqmoN9s4tXLv!l7p7hSkFUvzO
z9cA*8qa0%@F3UPCkw)qj8$#|3Wa1%cwkr)JdiyUZ>mjH=py^9WaM^i6H_wBk2z^sU
zqsA8dvBsQ@?|p0aEMR%z-=qHW12^yw?A7&u<4a6^NfZ0|^xArTdUf0MoL#-T0?##e
zV%Aam?8Ki5&s2tTVz0hePF+d6^gWA3>JwKM7VRsajH^G4SHA698yp?P{Hm}1j+``{
zDJ3AlS%4nAj<{!Ud51xtv>x9v-_EPzK?$JA26!^_N?!Pf-piJ8dysylnanJ&IOJV_
zS1k@eCNA~TLFv1Ny6xf_OS-US9VLbi;i9dMSq}x4^cNwHQCKwPURu}*iqRz(kgKSa
z?7NpGPF(O;u@FpX5!gcVFP-|?ZIg@GtLw*?nEH|?_Vekr_4@Sc&eb>ZsrV|!
z204>ki+~n}h^s}RMkclNKyQOr-1X2A4%Aom5yP1;)WYQG!`Hl~N;SPKF<~wlianXa~g@5S=YvWw&UwBPwNB;%zdAEK3
z^asBLSI{MNgTFDD4t-+lB1N-*wx_OhHwc=nMWOIjf-1=ZX$wBfh{d5w;z;C7-r8RH
zfcHfJ$s8y?{A3q~Z63p(;@Y2H@J^j#Yn1p{18+o
z5cUBL4d63|v0d-5p)vpJa4rNZCw~+^^#^S@iIRUV@yqw#Y7abgxBcdS2Y$&OeB{e^
z?8L!sJ}Ya>6<@ZyiKIPz?6FEF{{Dx4-Hx9+Y@fg7<92fXn2nB4*mc*xs>|p2sUs?z
zGWpNm?BA%wf1e#Z@KSN5u`8l(HE+k1s8LFZ|H4r|F(B=!g*k>2f@dO2q0jYV9`VX8y+&}G1+4N%I5m;
zkuM?iK#_{CJE$wL$~kxfc^ouKZENzak+cCvhrOL%I{d@Pn!P+BVoFb7ueTp_aQ(|g
zLQe{;KI{{`J_rg+N8Ls}D+5z-p2MdBSBrbRf%GdZXP(96ko@s*c7->v<
ztJw}4-JFJ*;1f{@$$7U(fdk8UF*hjDNs;`tsgZ6Fvbwnm_m3$_UlXNG!*G61eK5bJ-cJjwh9?|ywo8R_7
z*&~nMXE(in_HDM=T(^OtA$#nJ2kf#dueC#mAHkKH->=ZIq2c=Hxp*aCU0=2je(=3^
z-HUFr@#$Ird2HD3y61Ct<14>OiGLD{1Y=zN!k5|d>Z0wv;1YZ1cmA;5@Y2_45#Vp)
zXUr1&wY?vns~<6a&$Y}W*!Dm2xi4aVK|rA^-+GOIjbAt(+kL+2r={lrt+)-)LqN_6
z&S%XG6yrRpl97kR66h1`82}4_uR>fA@?)+^lwt@6J
zL3d1lfy9WNHW0Nh^g3|d$wJTWkIemm4L0^b9gD#H--CWZ6YiP9n45j&UK_E6Z8wuS
z;><9q0a}+1N_h!9
z3-~l*nQoxkOVfrq^>2Umy{I2TB)(5b0Ax-;IqHu>6m=C2Dj~kov1aJ2IMHa;5wf^{
z@K3%V&Ug=0PA$XV5UwIzq}Dg;?*o{b92J!x+l)c0Bh~dXoSFtv?{|RU+kBa&Yal-B
z%I^Uf!j;4qM&Iu9v)9`ClX8om_CU&{YOdsn2c9yK;Jj1GERaAJZLCHQK3f~NA@P3_
zye|SnQ$J#ZbH60}(+wNHjk=eL_H+S%+th2rLKUwDUaPi<-Ru;uEJN0`bsUFn16s=D
z8$iOcos#bbcDZE6#hw5qmTkgjrD6Fs%B@-4W;E>3sfTQ{v1%93T!SdsGshUwhviuB
zf*nK5D^%Z^p}Q|*|BJ_ZCgIcX{=e<9&wdeAqh8FXH~jNA+T`U^)@*Lt=H|M8zV_Sc
zCUhG>{~!=|HCPoC!{;}P$Gqc38qn5n2mm#)c;WWG<*hv5X}G?+QTb=rwE#Hh8oyFQ
z#fis3VlvADC=;F$XvS&tXgq=LPhMpZhab)nt0O>VJdO{9+oFHsy@Z1&uqThc5ColD
z-`I2`fC~UUl-cY92SFB(|Ct@5_!f|Wo!yU*#ptC8XNz~|9e-|1i>Gxz{Ect=PK|5A*~%uItKU6vZC2?jP8CmW
zQi~LWjCi6FmFT;HOknCfse?vRE6FjgPQ#A&3`u6Wj6;3KcA1NYQ%8dHPR|59OCKHw
z6JhZmKye>r^l50)w)T7q+m@GwX8^UNk_|1q9e=)0
z=>D@pmMi66#2J55`g6fEls&z068G#U#ovYdeLm&qef?Lz`Xw8T2Y{3l%d*6WAO3Qs
zC*^M7%lCX?o8OMewtX#qBYq9#Pd@mVeeON~sY?ElnQ?pd-+eWvlqW3bY&|zT$q76<
zA_zgr$K(eA@}k#7%(eBlaC4JyAAjb2a;zZ=6ySO6fUecxZiO|V(tuH(OB0PDa9abu
z7d>Frg`ycuOF$@!kg|wH07nQ_P)=`9_B1hU@}*4$9Q+}o$CON@KOq|xkRDQpOOP6*
z;K3s%5;AN}J(2Z-j(oWY^kP{id4d*zXzaky0UMn7aV!8_{n_WkHoW*&)PJzN^9NH>
zpEktVrt7CqTj`Tn+KFY^(hsJz_fpZoI<+XGk}aq(fed$EG`(AUVVe@+86)g+o8@%N6NMlOMO2q
z%k=Xr^}Y5T19-+x;RS6)5%!@p9XJ-EPbi%mF5U%!Rx#B=|h=h2M97K>>7Q
zu6n+5&Tz4yOFj3B*%Oq}`oq9`-sjH%RKM!Y$wn;+`KX+Pm4Bqnm-zaMC|
z^F6o>{15aSV}FAQ)}Htqwz>O1R(^zfBpoU}$3BG~X#H0hmO^+2A^$^g_NVpF4m5t$
zM~laD{JO@nRP+GVY3BX*r+@sH?d07LRmp$Nx4zJ>`>WUK0+sjm!u-E~)87TyYPIxV
z0e=%vz89drRbXshK>cFlRC59cJ)6=5-4f+<0{&-;z<>V&tj05da$XI*`&azG07@Dd
z(L4xJ3EaqIB(7xE2#$YJzy=j#go7GMp8o}Ky_O42ewkR13>!`YL1jR-i;p&DVkcz>
z*4DTHxYI1|sraoyiicSF9}K=kg=9UTET~Y=0#LIje7OL4^7{i8COykLYEa?Jg&-FR
zA#7X(2!ARoIm!Ul6u#I59GuYRCx?7O!K#d$llPGeecJ{$e%iL0pGV&@KA33D-M?(@
znZG0dufuZ(xBlFJvV)(xy-NNAue#V?`FCES9MP3Olb^^W=Yr76#Q=%l-YKF$zLBS-}x~d4k(;rxy
zyFhsed+sVS6w9zdN>IqU(hd#SaAVMBrbhJipHy+-$1qw1T#P`qj^J&OCz(DFh5Erx
zCWKPNq8>u-N~8}HM}m#(^6W0=aw18T*XqyJ9xp}M8nUgCpTfC&i6$DyuW{mkvw`Ig
zZhza3ejT435%cfY?Y`S)JCuS)*>S6+!axg-HRzn;)QB(c9qFW*nXiwrM52qwS0
zSV8gwv@*%xA?ol%+XjQWXZA}kz$aL>LIiaPosKMnPNSIaMS>^wj=>A42~VKtM39t>
zSD|#T^@QjQQEL?XmpD9v&0`>H^JL2x_l^mDpZFDf;uE*xJb3c&xn{5Zg@1Sx&JTPd`EkH`%k$p7AixMjFoKfXCx3h{
z1j>mDIk%~*Wg-uHj@AXeGVAdpB8v}|gWA#sk<6+njciov$dj!bqK8zV3XFhNIqIbJ
zhRT;x_$%3|fJ+^VWf*1)TcnO{@abnD-{6oo4Wj?mx~PjMAc1ZU5!hQGlquB-*#JUS
z*1=C))Rloj$a?*SO_T}kGG8$jRDVVo{sezmRJWTz3r5X(#Tm1~$$yP4QoR!xI{Gs<
zc<3J>Hny8^{W?CgxORHcKK*0AU?=Z3s5B5qS^qe5K>bL>wJ3
z*F52+&?2CPfO?r-PtaVTUgaoA?ZEhT;NWZUjK&T-OM2jp(BqxJn3ai)Cx5MXj8ag_
z3{OEJBQ_Tba%yy#2w;4x9|;JBY?Xrp<7HAXi9~rn1U*aWr824W_7Q0F*a2)>EJ}3A
zs(PyI3te#vDF2Tu0Lvlh@~5Hz^+}~%Pnj=Hl75itoCxlZMPT}0Vi9<8wFnHJ_;njR
z`tH6H_H4)t$dl1`BN8C^bAR)HGKjwQ=xVvHw_E?r;^L!+?bAQ{bGH20v99EQEt0>1
z2b)1fQl8A
z(HYklvpiu$>bu)OCE1i^69*nI_R}8{axlV{zBQ{s@NtD=Yu#G&KWpucJ2g8w#?4Fq
zm9;PWU*X6C_1NtM1Ap&_-(m>=KZ30vJNwx5!pYn3vpas~*Q_1?=hp+jS6pnb_}een
zm7l|{pZ4NapSv|)u)zD%e}5S0&vpX!X+WTOJ_sbwhk&%V^-$0sBD$ROznTkRIQMcs
z5QiH6aGL);@P~jthgF31-S5o>z^4b;!K<=J-0)N4(gHp|)I(p<
zYS5w#`25#jmHZ0naTwDVi|uyWNU0zpNJ}0aVtMI6%M&S`8+;r?CeJ!5UyOfq{(aV7
z`6P7EV`8>0`F|IGPcwYb_skJD$jZgoZk?_@mkc&oD
zj_2I#Vw-sWIq$f8^!W?9;f?YC0yL}nt713|z4b4?{Q+Hd0U1LMh9
zW7zT1fS@ncfDy~2Rq}gmQnp2QzCur+?9}~wq0%vibJ>wv26RV+#J@iADuAuajLr;>
z{RJ=$Yp>mnNr(2&e;PNck635dH{gtqDQ1cO0TS|PNujS1hv0GAg4Q}m%Kdcx_!4p0
zrrR04-u~^RE!%hIf4Wmn+N;8l^Z?vxJ)BtjdNAR^_oUe=yNx(u>NvJM>GC4hppa
zSoFUyR2^qL_^KZPH5&}uOg4y6<+75hKvkBM=InR6W(m@Ym)$kVcRlfUCmxf~(;0E$
zM`O@llqX2`GxbB$-)+NtejJ8zP11p*ziW*zyb=4>KQ8WJF?rdaO0IR?_tdz8h0c9R
zsVjZcr^HfMf5)iHrM{HY-m7!IZfojlN?W$Ce|r+M&eCV6G8y0O_|13Q%|HCF?9fMV
zRz)1w!I5Em-9LJrUHcu^K*v9xj5sNAex%@e!HXtoz=#*+e03q`u47!dw&}YO<{g2i
zGnj4YTi*T`u>%MKBf0rk4H3DH{DdLcWq^q`+LDEO8
z*GgA$bOowfm2=b!)bI7VK>5A7c-pF~Ine|8)n2Tq-)oakN(26S%Hrsh2l~;8)QQ^*
zU9X)Q|Em<0v2LH+DKn9!hfc{(*g65=IWZ=|9}3rJ@{+CXRYN8IWhUCFP^hE{KV^R*9&&VpgVzsBV?XEL~=C&tR$SM
ziV7(>Najnl`@dX7R{*Q}ydIw^4nCil7p`Nme||fF;ue4g53Y&CU=m%Y#Al%_O$>Wh
z?JksIkPGxoA{C>~%TOjrpNz^eM#Q2jc*ap#$u-qWdOEQHO`&5wSPWby?|ShiRZ%Vq
z+L}nugRi~{89<$5g1hP%a@s-$ab1*)vKpr{4)~Ov)HVXgf*PL0svM~+Tn6OapoV_h
ze?|_?SY!Gd%~}gs2p;qExbS5gIQZYKGkKM5O`PktNuMd@jjcs^FbwjCjaHQ-@oba-DIP)qjL2E
zc?^j2lS%6o=puj#UUQP9@I+79eO%`(e{zNGgpNn&9C8k3*YY7ai*9bVq8t@Y27cka
zzmlv9Q1E)vQOy8^T}HPhCp!*2F{$%dUU}sJ3m*&$7{|lNq?Jy#P^w<8ekq4JKpoW|
z?X-CNyno~!Sq|icy1)X~M{_LwX+ncVKG<3Gg>VI0tC0tlA^*`=A~D!}_h(oZ!Qg
zV|L>Yyxb1lbby0f%}GBEo}@nZe|YhPLEu9@I_UrZe88uB`FPmJ2Yf>RRG|NR+y5Jo
z4*-*I@h!pN`Q8`4>5C5n)rN?bz^3?I=6?a0g99qFva;!OBTg&Hz%uRs0Fn44K4ymR9OIJ9ip7n?3A2b#K9-I3%O-ye^PKPyh=|1
zC0CVr)Km09Nrn4F;^XCm=H~iVB4d$~cntYa=8Lj+8-<-ELGv>KuJN|Y5x}Ds706ZM
z%GYh=6WquB(>I}%RXR*rC+!5qz)oQG;IG@p!krj1*trM{PFm*$f77E?KfGn3#x!{ogIUOp97^%(}^%V3%ELTj+s+<726zRk5
zz9s`#{e&I<4bNk?E0YObHq*x{wLI=aKVF&a^4n
zNtv`nCUYdPC%#jcfw0w!0qtA_xN!J_p?c&;xvo1eOuhj47lv>FVj!@sj+i0u`Bi=z
zux_l{DTW7l0aXb_9=8~n{!$3|$vXMb>?%fAX#xjUMRjm3d2)(VIfjdJRfNS>6ZIdHR=^jhzA=e<&wn>P4aM=SLm2
z8w+>X%HzLj?Typ0`6S;O7_-im-)&nr{E*p9d{3N`~qQ2UC
zdFc2Ds&e7y>WCp->M0dIy|P}lo=S4naP@%7$-|-NENB=t20mz5TQ_X&$VY7D(8n;*
z;LS--w1#b6U-D+#dfAVd?R&BNJ{!Ph_376c;mMTgr}2mn2SV-e8RJ+A7J)Ljb#(33x?b^_cjxUc+Cp1^b4e+N)^
zrGIz`810vlRuuFWOUVv6aDY5$7odpT12})GA^}>VRDmRs%7rI@cGT_P3dBDSn)^{N
zUd4HU&HL$PSOn#edy)JsMcl%DIN#Dt75#wh8l!;c8zsHJVT+>V>s2PsBUy%
z6SnxsAKL1PFM0CwoFwHf!R1&4UhvH}u>U2fxS=x7C+MuL+rppUW~V>?d0YPCebu}8
z%H+T3<(JrX-|-@wxzxX`lw-s36-whnS4%#eT?`z=s*LNHur7muXFOfqaUt|=K7Wup
zQJ1+Z^F;uDvc)1m9*M8-3V<)aQ$TusZvd%(HyG>6T`q4Y*4CSlb3UX8~A&3K5
z7&IZ2E>3mOojg^pR}6ZIGL{&Xb6?g?-tBJV
z!OOG5OiFk4cIGVsJ^3jl|-m;}1=Q-+#0jj8k*&8)d}&=wy3n5`b=
zI|(@v{hX6(p&s3BcJ142@cOsfz$G_kxU!lGs3-KZm5}An)juKq31xW#Wq&69(r0hC
zMI`?6Eq7ac-G7Z&{fK^XvR-uKCHBI1yvSxRo2$lzkYhxR>wS)DSSvR$6%UZjb(+E9
zn709nCmxAR9!Z;vfPRXeymVexivi{EtriL_0{+dx+yOw2FBfqi|4qRJz7@E|1rKG_
zC+OJofp@>}eNfeqjqP3l@_#4>0X(}a-x4@7fL;q_w-CGmCC9f@R$84DQg1K|=85oW
znjOd}0N6RXnWQQJnX5k~7`%#pCk4!Hfljp(h
z-ae^hbDhf~l}w1z()oF)7lO)4_yCKJ@wR+N)o`3kPEj@lSZWGpE
zfPb+VD0!wXw1I2iVguK|*#<9pF$TgveDYjEdvVED@3_Yn|MX@heJ7H>YIE?7u~ED9
z^;g*yZ@R`N_DuMo1oV!J#t}NEtq+jvHI|~x5HC{~O*!T#O5s>z0o5(ND!!|9j6e@?ZSX-Z
z!bp%cqQQwSi02xbd2+zx#HdKv-9p*zKB1)nP^M`Box|MIx)ezn*~AceHKvBq#8W5l
zkcFy7Q0g+dDWpy!UjDGp`#>9SH%Ps0ZqEWFzF>es5ygsfWPfCnW7@(ub=m*a0ir~u
zs``tU#w*5wWu0*!592l;XNR=uL?+;>vUKo^SO{*jwG;k^m@1(<+!eXZ&mY*nt8Czc
zt8L)GbyyI9`(I!-I_`0v0q7vvH|~4DHXeG^*1!6&t>6E!wT{mh?en%J<)qyGf(z}E
z*IjKFz2XvU41e=WWi%{t7VB}@1{j>oh%SIa+6a{MRKuEONU5k~x9MumM5R6xTYQb%
z7Xe}{5RvqH9-tjSE&v`Y7ZR_|X$kcL03**loyrA(7!Gowj}K4U6GE;!?s9tYf2|HI
z?~^NMBCP~Ye0j>n<9`T1Xo9zwCxwEkD>Hq;Cf%kB
znTjr-i05|q$plY7QZgy$Vgku^lH9Ke(b6e$7e1}UM7A~gppf&oOSg7n@a5PB5^q(+gB2!zm!5Lyx-
zdHKCEZ{EC}`OMtj&V1)?Z)bP^xY@6lqvw6bu1?{dYP~*BM-Vn~u27Gu#`F4SaE^(iwvOSfQ)ma}%k#2>H##u_v}qr@ka1&PfN}_pT{e)YEA?AC1<&
zjw_@SOyIfG#-$N1f0bsVNo*`&{DOU~0Q#)61w4e9{-J@SIu=ozgA!rAsbcoIz}eOC
z%hs6=>snXwC4phjA|85Lyp8fA7FekKE=R40CKO-6%5I;x@72;Zy*d%`wCRg)9y4bA
zac0A^*6}pvYlzqK8g$~1XMo6D{To%9!fZd&Yn*)+Vb;exvrh`Z0V$dp8A8-sO2%(S
zY0XiGCnxryoxLui&%jR$OFSp(&}4tfpnkSBExV+mc+uhqHv?67IVZh5WBMGYW7Ak-
z?=g};70?bpCq{zAr!|sq5iN5ZtgB6T-Hvm3fx`l)#O(C*cUyKJA@QkvX#QoR~3n)04v;W}SELTPT=FFQ8UaK7VO_l4lDR?(&`$G{6%
zOa(k~PScvJsyf$^9?zu)wf`B^Y|;i>Th&^-C~14@pZMjdEgju$1Ae?cs*#V{p$n&K
z)9|AXA6Z)SWY>!A`Vz|~nD~Y%uO^s7FfilC2H!2r3PaMlV4oP;^(ny)H{A#IoO(Tu
zvwP28!lwBdaQ(s}fm;WIN_SoIYT={1`T6rOkHqQ>a@Tddvv-4^CWw)MyP4)!|
ziDiPq$^2roR)lxYdoYAU9m6MdDF0E@O22<92cpfx#(5&V`si|4Q4^D%hj>97m9SBz
zl~pfZ8)97H)7eh;_NMxXPhz&h&(nU})&EfR9h8+<^Md*-DAjw+^d1k*VB2qtz@bmH
zU$|s5cq)9}PFhuDqUH!blN3OMq)4&wyR3vJYj4^S9pvln!(et59ygBU8;rNJl@fk4
zn+UaSRh167G<_+o^3cnvv8}imZ^W>5@r-7~oqnP4OS8U1HrwBdzQOhc`SATFw~K3?
z8WMrp*05^e!-n%xA)BSF#I!hvb?W4zsLqQecGJ9Q2Rjkk{(xpCpD)BV(EMyXxLNtB
z>b$`k6_>V1yvp176GL{nW^axXfSn(n5R-Wqn|%3Q&L<2^eb6PXVBP9uvBXbegXYJ^
z(;um$CcyZ?lGO^~p&B~(IFm6_X2tVwlQf{n_99Uyx6*P}31V5H)!h1RT_j%}QEotY
zNm)q&IQ;~fbDuT1kL-w@RNDqzZd&YbiU`R2|!*DHZCc2pw4u8lS7!+m1L
zii8U#F;><^5{v`ojeUpP&E=fhD`ir2t5)>PMujxvECQbIUU}Y+W-x|P38ePV`%sni
zJ)-J7pbiQ`V{eTUBs$JQ%Q|l4dq$~bZj&Y^?xPI4=AQoGr3+Lz^Jj>uZ
zDsH8x=SP1IMlfWuzQ%3r@MXNI;Lc?mbf2UK7LflWGXf7>Bf26gzBxxn#{^q-6mi{q
zCVOB2(JbNl;eGRwzc82sahV-YqrR^~EAyJ;q#ORC$1IX*G5?c_GYhXZL0&beb!~OY
z@K0X}g5yw`yBWBl4cJwW!>%hpORS!5O4Er!E4^!12|;6#%$KK||3m^KT6R(&yQF%qpDZ
z8x|+1`KeNOC#d^VF3_C6`2X6k%}@^sg17FCUfmdyJ~Won;o2Et@CFw6e2Y+32kZ@T
z*g;wg7Z&)s#4_~(PrW=KjA94#dV!nlu}`w#bp){k`qPYj%zX0mT4SBkJ<^HCP*4|R|MNA7)~wR^zd
zBNi5-n#yBhF!5|IUY`uSfvV&^c@(-x^ZXfyKQy9q&G^A_*<`bDzz@{Gw_YKZD){E*
zSnkBW~@^lamH0lwVR6eq6OkCeW{45cOSh6twO&+k%6m^TRNhP
z>wNVXy$ce;43naYo8@kAsH}oKtdbq7bJ>cYOI;3{TR*ox$2K^w}b
z`Aim_g(hqYpG2*B#O|$2Py9S0pm8)r(u-;NW&K0;A$-^D$Xo769&rIO(D_ymcjnQF
z>5?l_?_bt_ok(n=i4-pg)(OYsA73^e
zlkMBr$n>jyXcyJZ?UI7S{NL>;TKY4y?
zykBhYhsz=E6ZVae>smjt(OW+s_FOCC`N->_^jI%u&P8ria)tl1G8vfmSm%KZr3(-H
zDV6)3%Kxb*E>u(QmM5-DT?TKLr81tNyO7_T6fGCQAUq_>7`nLH)PyiWVZ?RLz5eNM
zR%Y&p_>#=bvh+p^@#SM^cHB*_G#l(G?6%e?T_bm>E!W3V1dO2dY5I$D&-3~kUbi
zB72L6pH7s2u7SK{_TF6aQB+jb5{-z7zQzKr+!i3M>7K-5`))s7aeP5fF!s#RTcUEj%&zNb^tsc=
zZ8ET-Q6#Y<&Uq^g46#&n*R8O<-jpxABz)wTP-{G{!Z@4d1@fdkx+%{jPX;pLq1I*(
z?bFKKm53;~Eg6u?-)Y<=1CxAZAo1|)M*Ed<&wjb$OnxZ8=$=Dcc8<`Wj&ubhR^+Ra
zIpK|;-g`-qo0yK20?P)6p;XCv-K{)@2dl+dwMFSw=wc8CY@eu3AK+#+1}d!ZqPFAL
zScSWy$_;T#Bx*PmFSBeL_@JgzZ}6Hy`+&^eFJnk<-RNzsHS)SmAX{sdX4(6K^kY`$
zHNzbDerMUIKIyu=Q)hoWnZ$@Rn-;B#3nwznta4yjVD~vqxrnv=%=|H&F;=qByiYVm
z&6u$505)PdMaNQ6rKbjx*05aOnf4Lm^2fpzSyhA+=X!30oN>=JWTWIJjU1&b^V#Sp
zm^v=Pg!D$e4{6AN^sa%-*=}LficaX_!gtkd=02fk$5#ww)O=;LhZ#;iet~YxVJIXM
zv(oQG|B`_(W$z0)Rzkz{wbjwK&(mFxZnU+7SsKf+`cZS?gm}!fMqDWA>5a>zRx+R!
z!)du|*m5dF2I%rQ_!S`;@crHL2kJ1SuLfn1#xTdHr>y)u7cr4>uVCF0!G|QBgr1Pf@DUHn!5k+TZpN1*TPg
zw!~UKAUByg{oRB
zMMT|Z`!kh;qj%zZt%-(~FGF+}L3s5~G7yzd@El3>;&vZ{tkKIfaM#DxF%KVBrl|jt
z&}k_;V$68a>zCnDP6oW)!Tm$}vr~t?auXl(&o?cE4-Gn6n@wcDV$DKp)Ynf5WMGq2
zH>eRq8dUh3z>rV3_hqZAmn|`K)Z10$4Gj2wmvf`*TDw5khIO9FU625}M>KL$Q#F|{
zzJVEDR3emq9F~SmpACiLwn!@h+%{uyhqGW~sjOn$5*a`eC*?vg_{6PBA1M(LlhMSH
zp`?vl^gIf&v@T3+U(8v$)s6Yf`+3_MA8kiH**T}oVzR9H=BpebO^Q>0%7)VxS$p!y
zf3Wr>?KdssXl8wr3M|xXl_N
zZ{Vl*m`?=@s!|IRW+w7aO4x5Zo8eI5EH5ty=xwYDshrPSNdk*D40OE70LwN(q+FTT
z&`je}yO8SI%XO}cU3_JuuP1-q5EJH$6y&Q5u}U3jmV!B4!25+V=M=tnoa;Xse9Mb<
zI=;74BAZ|R)%zA#t}n^?bK53X?uA+bYS#H00`aT{58Xkkc$0h_8lhnul+hc4zfdzD
zI3ALHm>u~{8(awa9P4k&l~^c?SUacPn+r8#AC@ijjGew>Cd^!Wfnl}I$nt~!;BjEF
zZ?!rJW;JYKVyx&bsL#v|wXv+Un&?iS2*=bs%@3H~)D^986Yg=-5pf`ZMp#%HO-?~$O0H0M$pOzWxrRpoT=j4EVV!l+3CIH3?TcVEVwWUTuWB{Hznv7k7v
zA!MjG4jp$w8$hBQjQzGiqvU)9#;0NxVH#GP*}&LuKfFme=4G8|Kxtflyh$@4I@sdS
zcE$JEoo%!!@ja$ZwOk={f}g$6qCmonNgFZ~uRlf#4w?TGhdJ2aGtYpiD#ly1L?Mqu
z46)$hyzWNOjlJcreb?JlCeY2cL}Y!i|9gp!qe%2A!I%t$X_0|GiSePA#__dxL~Z|S
z5)OJf<>n{V=Qask$kXH3q|;kufEU>iS6SH}I(d3i6+dY?nYxOm{8MGz=<|QVNdDuI
zeevqqc*_=(@^z_X=B!+hWGVTQlpad^F23yEL
zV(MWu8F)#VS>#5^z_+GBYiU_!ri_e?{S_uAN0w`eDawoPUY{Q|B#7%oKpf#?-yQ9?
z-?RQ1d}gqm$|??k;OYQ)
zvcXTft@nT4K>Uv`Wg1XhAOjuDlzwr;DLN4T(x2f$l8W&h=`YDh#^*mnESK;W#;WA&
z_Tg>Zg*H(&`;)H%H(&Q?uze67ymmz%l{rvq5+=*=M1!(FaKrBR-RnHn!#Cxgszv60
zj2tQJJ`SkPs5jOU&oc$YnO6QD%j3`uwg{D7(Oh2k~OBJDzx5fFHv<`!aUY`
z?c>sYA!hug;K-PLomqY^u)=mwv3(^y7^a|MM`kwr5!%d@qC|*_INM(QO`@?Ly22BHKczbuuHV
zPfcNDVEa(UEWPMzvR;_`Afa^Y%&C}ke=?Wyk)F(gaPai}XEG22=AT@hJ=rG%3)=Ii
zc0rI+!9Sv-=WeRmeS_}wi96=c^54lmSulB#jYwfc>3O}3$EZ+gBEOH5n
zxL>II5oR+lJy+Ak??j}s4XDS_(eYCTjg-><_?
z{ifH{dKT?BZZ`bE*BmjqtJkG=t7{*0-;nk>e5(?R!?DK;=XhpPHk>K3hFSUE`bf?9
z!jZIoV&Ke#lVh|OM}7J#@*ahAzX?UcABqFo~LVWlq8
z?)%>R)$OX?KYG{h>Zfb%$JW~Z9R&U}_!W34XwL`)BAy7v5E)VJi1LVxF(K4ZH*HYu
zgcgj9bt;35^q;F583TbFkHGAS??&g2zs3UNBcuO&jQMZ;TaAbh5M+#Z!3O_lw)z?y
z?>#{NZwB?>nERg>Oz5NzGS8nW96_IDCUmNo(x2{tuyF)Z&phEKE$M+M(=QnN=(#R#
zBm0i|*Y{I0fscH4{FMGeU3|`oeb_K)r~5CzzvUiwdtDEEdkCcCJHfJg=eG^4SJD)&
zk%=oZ4B`yrSH!tR6@$jI*c)H~cdgfZ6JOOl@nfX<^N~u-X}qz7|Ioe)e?&=kjHvVqd)>bh{{_CN!nL93k`VXp)-t#WYUGE9d{f7H^~Gsh!Hdd7~Wwz{by$y?^d
zSSXbDbB`U)24Uh)C}z4Aq+oRk&+qc?8PB`n5G{(u{w=M3dNqQP<
zk4&9u?|#wJc=MTHgJ5fvzz1HdHLYLwTyD=<@KIhK=gv#W=1*PwYHKMVntUr1U?S`t
zv`(_V^WV?NY^j`
z7Zcd8%!8@m8B#k!++gnA<5zK_bU%ghI>7^5%A!G^XS7~A9#Z?NBRaR;;@
zd5Zl>7NhIH#YVH0@L2dB&4`AHHHPUEkn(=1&!5FJhC`u_N%zVDngh*gDtd$?+UJ%m
zv|MjmwW@-Ph070J=Njf|#`GVLor{`qe7n$m4Sh$IAq0!B=Ba?1$y!MBN%FcyLHqg7
zzEqNj;lXzA#|LI$m$wBjKuLSgSjNvKfie1S(6jb#$9)Y%u|JM0I$-OR$p8#Z@&S@#?;&CEd
zH1T-B^d6ytCV)HzVjlN*lDwq0SDJFq0_`)bwd0sl@Q0jNeZlH$iV?s5+fMDPpxY`LQF
zaEgy9%D-fr(ET0LTMp0vID#uawip@MjxQhXzb|`wEOkAjcsvH+xHcT+FsZ$J9|73-
zRCF~9Fx43_%};pNt9&GX+*Ec^Ut)rM&H=I?7A{ZtGwZqgBG%E6bK}WL!okid|??G$)tjq*?r$usQZuK0%ZQ{GZB
z|0c(^d6?AJ@T`!!$)`L6HW1`Cj%d=rwNt+Dk9#5n=G&`!$y)kI_3w3b8(_5??MtLU
zCPF7oThNXnT&CINgg9?sodphKLTo)lm$V-v{mBBEg+|XJ4yq*Jxq5!Ysl=_c9Bcvv&O`{>a9c?hRu1%LXgR=e~g787+b%Ir$yR
zSKw*l1zDS1#A?G1hY)X-kpa0u#b9{<$ySi_?Es>sJIeQx=AJ=JajD;H7Z}uPoh+lK
zt+nZ=D#xx-Crs0G`JK@OI~uj~N-Q;iOQdb}E0NJ0M8#JA_s6vF2c$W&HO^zq(JXDQ
zA2olxQ=_yMX_0LAIgjLPb+SQ-hKT}8JN7%90YVi-K4W#kZ8(C@)w&~AYHbc>A85C}
z>`7}v$*}2ml)If!`H#;t}>*>4_rFzieB8pJQ{Qio%iQ|Yimpy@}B5NRQKY1j8kT)&?ElV
zA)a2+g08!Jv@V^w&v8?m{s0MYoRG<*lCjxQlmL-AYvNcIY988)b7w*y1qVEAcOTPH
znv}2At(Yvfi0c}WYoYqZF5iA4)E~xies7nb&mNZM7nDpgs2g0y3vBIN*Mi&5$=tdh
ztg4%zN6OMNtAEVK-wr{2GuB|O4;?pi6e~TRmW#M$-nDv_cNAXr#%9|Idfw-rZa1&E
zs(>JpZL5ja;wW!xzgu`(&gT=CxLh5|`?;~P}iWbLzvSPk0M&&T|GBO;AIs8N+jtVuRl
zK49bv?XRDhCVr&9ra_-=@GsOVe5F`8gA<*9NTnka?r>&dovhq#&k)^wts1K~?
zguuD}0>zv}cPF{$d4yb3ODK8U-;l09e)Bpkbu_pCzEbo!?W%vXNMj%0-lF08DjDRN
z@FF*Tr^B3^&h?AjenMjBqvo0oeIcG%k0JJ&on_iM-#gCdpN5|LUv-Px95ML9jo=4)ith&zd
z+uPnZ8+wGRb~dGElx;4cIIqc5Q756fqoj;X+r=ERww_ZF&yZ4y_0y8&sgAJH5xZq2
zgA1hx&HYC(utd;;BwAo!+X=7c69_LBK5TjTZC~L%zG5she_9h8Do42_WCECc(zACT
zLxg55`E`^vUAVgKx*9-E205Am7%E>QRIPcxDtW=@QBIr-`=;^e^xVG<`;e^^sxMq;MIwcaxQ;4)mAAc#CBVV
zTc#0p({s2U3s!k+MaTTxz2m$vsbPe*
zaDkV-jF&ojUhv~h_L>)wbsCbf)-sCE8|0w;lk<9XK0aGhQz{Yw&185dgiuurKttZG
zM)h3+M$zBVRI93R5gS2i1u;F3z*y-|S=wA*s}m07eVKU=?~2;tLnt
zjxq@uLc6oXu45quR>!xJoe^l`+Ay?r_=?Qn&{t%!;itl=emP^?njeJ#UM^mdmn;SN
zW|Po|xs6m}pB#t?KX6(8Y!PzO(I%HhLtgIsxV(ZGZ~teZc;7fjSqE1+X4-G6qO_jgog9)t@}w&
z`|fLP0h?$Mm&0kkwXPd08&t?@)imL{UGk{tFlT1Nm~xrVuO!)ZJ|Zm1h5tT}Ib=naML>52vK
z)q+w9FvP5Nw|IG*v9``St?(EX&pJjHtZlz;%~P^G!R&_8UEU+GqXj(|e(;=c+!ioz
z+lWT5t)8X2fvP`MBvWyt&;rQ}oCyOsHQHBfIV&i~!M_sxb+jbIj@35IT8|t(FbaaPX)B`v@e6i0Z|ge%PZdVXGw}6zq4^_B;x~LpG>^;mta2?
zJi2wnc;^ii>AX|SDx{;%L0EOJ{JCVvo4x3dOqv-g&*K6at4D3JGQcB%bU&bXR=ol@
zz4%R%EurXF&s%jyM^CCEPLAHh+~uNNW|
z*uUc=9G7+3+FL8cr)4JXurf0u#!$rKC#qC!nTAF;H~uXrGY(F
zZ;x?jh}E$_hw}Q*40=wChN3YrX#8~T3TL^4z?8iCkM|v?PhzBPhSXDe$I5-~D(LE!
zHve;#H`Ti(_jD=8HhvLD;?yU6y?SvD6s~@>jNas39u#JB1mbWU=|ccgx~uR5%Ep?w
zius23Gpt=InSmFD9_X(?+IYv;2o^$lrVA+#{8`-TPsxg)jM@#3eR?R!df{UIU2ji}
zJM;*fs5@_cWZ^!y`))>4PJOKTePM6zYqXL*@Z^ZU9#H1^rV#sDt&@;+tO^w#SlLd;6(
zk`Twn_sT|>rxd3PGb4qgBN5v)ZbQtmPj}CK{Sap}C6k!=n+tirsauV4o^2K(&!Iv>
zs;~UEK?P^k$hOm%*A8S4yLtM4w_D7&OODs3(>e?2=cg_n6k3+Hp`}5+0E*V&90etL
zuP5}5Xd`o-86a5bTe)fI8eg8+vViy-?EbjWUU!a
zHV!Jl9#hx4G>K8GgVzaMRX12t1yaeCdJX_`P*4GIp&&P3TH9uR^gttl(A*+rZI7v0
zwX*hBj!dPt`F}x_%A|VTM9E}GoRPfFsWOB)
zTcn-Oqac~GXVRVURoF!n)Wked@(I+KsjCBdvQKi$yh4!ppoLpRJ$Pa1t)jIiP5jk`
z;`8dho!?Y}vX|nDXq(WI)?{^U`JZUPV9VLe>*ZeeJ95FBU+c}xKrNQ-xZ{fk@`8Uw
z!(NVPl0Fxb7$?$^&69*0T_LIeDE@se9+V#XW`Yb!|J*^f^QpsCC3~1|X$QB1H3`ra
z(UXMFqEyuCn{u+CwG-if{K$4FtFk&4#%vH2CnSdY;?>Ls^&6Qq8TnPd^*pN2(8|Ls
zVdtK`WU$Ha9ecvAfmuRjTfySVyF16YAf5|XA!N!v;ksM=TVL^ULmi|lrb$z4@(}H(
z{Wob>*C!GO0t=HEQyW%L<)FKVrgb2hpiR;4>4m53cK%cfFY)2-4=buW5zNn;5QOZo
zd4D~`$$EjAx!>U?t7>uZDK7oSz*+;=<@%|PYGE3YHt>%y;+#h6b(
zR#(GDxH;aK<0*l3LxEdYcqNOVZ=y2(%^4%Omw;MbaeM34LQfCFA!(tX=K~_c99|Bn
zgd=Y%AozyG@hE(g49c9AgE(w4VYnZ0-Fz+@M$0)jBdq%FLE}6=vhT8hw_^4Q+9^2cvJZ%iiwRrgRWOU-C=~k&+Ks{$jyL{pmrqBT$Qa_f8Sj42SWBs&OG1!`zQzix
zl%@~JMT4~rT|TeX@3zqmj4hC_JoQsDz0r@zBcH%F>D?9JAlx|*`5YXz>wk&*E|p;s
zAjugHiRd9X+>n&3MKx1DyT}n^Uki@FuZ5gVG@Z~MEnM$ZC@IkKP65r}>10OuV7D
z3(xS!;|1@tsvnQE?RPNutn*cuPoRT;)lYIf$ZDyM@3d;{zg^)pLcfV{lT->Ys$!
zCwBAk{x$YiJkHyJt?w~S`X$*uQX-K+TxZ;$Uvi7G1dB2H4&V<|vTKB84DVl_Y1~u!
z(~i9$Wa{tb7WBUl`&eTYw9PhGB`s9xHWgKtQTO{6Cob)+G$Ht%?>?q*EM&gl-*X&&
zD7kFzJdbNU{9z;>M+EYqMlcxhvuPIVQvdVE%JCV@cLBfMXX1TSWma*%M^?sb0eUT-
z+ew7F@E6Bk%oy_!>wJ@KlLjc6aWjb9j#r(e&V8Il$iD~V;n2>p>NgYRw{-#gzFt-*
z`hOW*`D5kl1MafUQ`SDFZ8|hNbP84@2oz>ebP-A`7p|fuqUbq`-64MqZTN_+7Ur?!
zHgFmvTx)iNO*hO4ko|N*VnpW8*2f(7Xk7aG;+51{0FP&Cj|T+bj!r$v!Ny@pxjeJ7
zJG|g{W+|}Lwv1tMGsv(+2Ag0g#3o|kDjV|Yq$t7lMM_D+q&i(zWS6At5GE_anvOi$
zT-Ep3hQf=C(RX|>v}~ijZt4&0V!QP?`VnyB5W7WSx=E+Abf_W8%Dp%
z!<4qa?igB##>TJ9?e
zOfq&}`;$gwqaPdr=mQ1cj?j(Ras7D}8^q)S-jHa&@JuYvjhhz>bC--=74rCF`B}2{
zy0_!K4RBMZ^LO05SZOHbfi?b3r~
zs3Es2O>vSiQg{AcL59XxqklpemW$@07;a1=F{XW*OdkH074(a{s@5tmP4?mTmuOjl
zaD9$y1c4i>4^mH7hxz5z(763!Mrvl2h_|_|9Wc%g><*va+tW&^%n-$2{kOBm*|X#B
zx6Bv)ELe4imkmP!ghhSIQ`2HlL#w={RBspxH<-ZJrR62
z2_h#~q2YExc|apGOSd4+m-a__jn&F36X7rw6kEu97W*=q+M+=lZGWtC`SphT)72fY
zLJIM;8cZ5zUwTM2vl-^6!P?<4E)KijG1t>kjb0CNJy|Hr0AA3HBpM4m+RbR&G6`P%UD>i~&$J
zE@oNgS6*vh%meKHhN@P~NBKxvaDR0tEv2(T|6QO3?X)!3kNcw=5TiF9a1(55rKg%G
zDE#93qTf{hTGovNCHoyiFlPOQ1lOlRABzej4tA_GAA}2PJ>C&VH87h5DYspi(@_9H
z(DU$XgwnNG`#WWf@QElp1P|k!zWP-Z
zsIN&bIJXgX>|rSvZbGj#z~_R@16G#8GT@1=_CF_d$z~Y#{7U+kFNs8gggcPV+`&31
zxufx|>tAvMl?EJr{@ADfz|zhr2tLDN-646J7)M0&HZ@oGGF9!^4pm);LGdR
z;*>Gxie8yovy^ZSq4cUwcssdO+r-#l4+V|0?7+(IPOfN-OiCc3WyF{{?Cf!q
zcGt2Q{Tu4bCW&igW@_JDLsK(>;3jiy{XlH&s33Z=5;f{p$wD0SFqQ#^m6y2GmuL*S
zcpt^7uXp4+l!LOWy7(mc5*f&