From 8b598581e605900aa5b49459a7555dd081d1c1a7 Mon Sep 17 00:00:00 2001 From: GrapheneCt <57592952+GrapheneCt@users.noreply.github.com> Date: Sun, 19 Dec 2021 03:40:40 +0200 Subject: [PATCH] Updated to v6.0 --- ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj | 86 + ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj.filters | 21 + ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj.user | 4 + ElevenMPV-A-DE/download_enabler.cpp | 193 + ElevenMPV-A-DE/paf_runtime.cpp | 18 + .../ElevenMPV-A-ShellPlugin.vcxproj | 9 +- ElevenMPV-A-ShellPlugin/main.cpp | 72 +- ElevenMPV-A-ShellPlugin/main.h | 5 +- ElevenMPV-A-ShellPlugin/paf_runtime.cpp | 14 +- .../libScePafPreload.vcxproj | 79 + .../libScePafPreload.vcxproj.filters | 18 + .../libScePafPreload.vcxproj.user | 4 + ElevenMPV-A-libScePafPreload/prx.c | 74 + ElevenMPV-A.sln | 14 + ElevenMPV-A/CONTENTS/empva_plugin.rco | Bin 227264 -> 230304 bytes ElevenMPV-A/CONTENTS/empva_settings.xml | 46 + .../module/download_enabler_empva.suprx | Bin 0 -> 6944 bytes .../CONTENTS/module/libLocalMedia.suprx | Bin 0 -> 8910 bytes ElevenMPV-A/CONTENTS/module/libNetMedia.suprx | Bin 0 -> 20107 bytes .../CONTENTS/module/libScePafPreload.suprx | Bin 5080 -> 5080 bytes .../CONTENTS/module/libThirdTube.suprx | Bin 0 -> 231250 bytes .../CONTENTS/module/shell_plugin.suprx | Bin 9536 -> 8736 bytes ElevenMPV-A/ElevenMPV-A.vcxproj | 22 +- ElevenMPV-A/ElevenMPV-A.vcxproj.filters | 49 +- ElevenMPV-A/include/audio/audio.h | 186 +- ElevenMPV-A/include/audio/vitaaudiolib.h | 2 +- ElevenMPV-A/include/common.h | 21 +- ElevenMPV-A/include/config.h | 83 - ElevenMPV-A/include/debug.h | 12 + ElevenMPV-A/include/downloader.h | 55 + ElevenMPV-A/include/main.h | 37 + ElevenMPV-A/include/menus/menu_audioplayer.h | 45 +- ElevenMPV-A/include/menus/menu_displayfiles.h | 58 +- ElevenMPV-A/include/menus/menu_settings.h | 131 +- ElevenMPV-A/include/menus/menu_youtube.h | 332 + ElevenMPV-A/include/utils.h | 96 +- ElevenMPV-A/include/yt_utils.h | 92 + ElevenMPV-A/libs/include/dr_flac.h | 10 +- ElevenMPV-A/libs/include/localmedia.h | 85 + ElevenMPV-A/libs/include/nestegg.h | 508 + ElevenMPV-A/libs/include/netmedia.h | 85 + ElevenMPV-A/libs/include/youtube_parser.hpp | 174 + .../libs/include/youtube_parser_old.hpp | 401 + ElevenMPV-A/libs/lib/libLocalMedia_stub.a | Bin 0 -> 5022 bytes ElevenMPV-A/libs/lib/libNetMedia_stub.a | Bin 0 -> 4934 bytes ElevenMPV-A/libs/lib/libThirdTube_stub.a | Bin 0 -> 50194 bytes ElevenMPV-A/libs/lib/libnestegg.a | Bin 0 -> 49412 bytes ElevenMPV-A/libs/lib/libopus.a | Bin 540020 -> 539934 bytes ElevenMPV-A/libs/lib/libvorbis.a | Bin 830510 -> 830420 bytes ElevenMPV-A/libs/lib/libxmp-lite.a | Bin 161244 -> 161220 bytes ElevenMPV-A/param.sfx | 4 +- ElevenMPV-A/param_for_debug.sfx | 20 + ElevenMPV-A/source/audio/at3.cpp | 147 +- ElevenMPV-A/source/audio/audio.cpp | 148 +- ElevenMPV-A/source/audio/flac.cpp | 188 +- ElevenMPV-A/source/audio/mp3.cpp | 41 +- ElevenMPV-A/source/audio/ogg.cpp | 104 +- ElevenMPV-A/source/audio/opus.cpp | 172 +- ElevenMPV-A/source/audio/sh_common.cpp | 8 +- ElevenMPV-A/source/audio/vitaaudiolib.cpp | 8 +- ElevenMPV-A/source/audio/webm_opus.cpp | 236 + ElevenMPV-A/source/audio/xm.cpp | 21 +- ElevenMPV-A/source/audio/youtube_opus.cpp | 240 + ElevenMPV-A/source/config.cpp | 110 - ElevenMPV-A/source/debug.cpp | 133 + ElevenMPV-A/source/downloader.cpp | 141 + ElevenMPV-A/source/main.cpp | 307 +- ElevenMPV-A/source/menus/menu_audioplayer.cpp | 627 +- .../source/menus/menu_displayfiles.cpp | 250 +- ElevenMPV-A/source/menus/menu_settings.cpp | 976 +- .../menus/youtube/menu_youtube_base.cpp | 431 + .../source/menus/youtube/menu_youtube_fav.cpp | 353 + .../menus/youtube/menu_youtube_history.cpp | 192 + .../menus/youtube/menu_youtube_search.cpp | 335 + ElevenMPV-A/source/paf_libc_bridge.cpp | 29 +- ElevenMPV-A/source/paf_libc_bridge_asm.cpp | 21 - ElevenMPV-A/source/paf_runtime.cpp | 11 +- ElevenMPV-A/source/utils.cpp | 227 +- ElevenMPV-A/source/yt_utils.cpp | 270 + ElevenMPV-A/strip-report.txt | 18828 ++++++++++++++++ LICENSE | 201 - Resource/empva_plugin.xml | 623 +- Resource/empva_settings.xml | 46 + Resource/locale/empva_locale_en.xml | 14 + Resource/locale/empva_locale_es.xml | 45 - Resource/locale/empva_locale_fr.xml | 14 + Resource/locale/empva_locale_pt-br.xml | 45 - Resource/locale/empva_locale_ru.xml | 14 + Resource/locale/empva_locale_zh-s.xml | 45 - Resource/locale/empva_locale_zh-t.xml | 45 - Resource/tex/tex_common_bg.png | Bin 1059 -> 1268 bytes Resource/tex/tex_vertical_separator.zlib | Bin 0 -> 130 bytes Resource/tex/tex_yt_icon_fav_for_player.zlib | Bin 0 -> 1520 bytes .../tex/tex_yt_icon_fav_for_player_glow.zlib | Bin 0 -> 1658 bytes Resource/tex/tex_yt_icon_favourite.zlib | Bin 0 -> 388 bytes Resource/tex/tex_yt_icon_history.zlib | Bin 0 -> 493 bytes Resource/tex/tex_yt_icon_left.zlib | Bin 0 -> 465 bytes Resource/tex/tex_yt_icon_net.zlib | Bin 0 -> 2238 bytes Resource/tex/tex_yt_icon_right.zlib | 3 + Resource/tex/tex_yt_icon_search.zlib | Bin 0 -> 424 bytes Resource/tex/tex_yt_icon_vita.zlib | Bin 0 -> 1178 bytes 101 files changed, 26391 insertions(+), 2423 deletions(-) create mode 100644 ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj create mode 100644 ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj.filters create mode 100644 ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj.user create mode 100644 ElevenMPV-A-DE/download_enabler.cpp create mode 100644 ElevenMPV-A-DE/paf_runtime.cpp create mode 100644 ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj create mode 100644 ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj.filters create mode 100644 ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj.user create mode 100644 ElevenMPV-A-libScePafPreload/prx.c create mode 100644 ElevenMPV-A/CONTENTS/empva_settings.xml create mode 100644 ElevenMPV-A/CONTENTS/module/download_enabler_empva.suprx create mode 100644 ElevenMPV-A/CONTENTS/module/libLocalMedia.suprx create mode 100644 ElevenMPV-A/CONTENTS/module/libNetMedia.suprx create mode 100644 ElevenMPV-A/CONTENTS/module/libThirdTube.suprx delete mode 100644 ElevenMPV-A/include/config.h create mode 100644 ElevenMPV-A/include/debug.h create mode 100644 ElevenMPV-A/include/downloader.h create mode 100644 ElevenMPV-A/include/main.h create mode 100644 ElevenMPV-A/include/menus/menu_youtube.h create mode 100644 ElevenMPV-A/include/yt_utils.h create mode 100644 ElevenMPV-A/libs/include/localmedia.h create mode 100644 ElevenMPV-A/libs/include/nestegg.h create mode 100644 ElevenMPV-A/libs/include/netmedia.h create mode 100644 ElevenMPV-A/libs/include/youtube_parser.hpp create mode 100644 ElevenMPV-A/libs/include/youtube_parser_old.hpp create mode 100644 ElevenMPV-A/libs/lib/libLocalMedia_stub.a create mode 100644 ElevenMPV-A/libs/lib/libNetMedia_stub.a create mode 100644 ElevenMPV-A/libs/lib/libThirdTube_stub.a create mode 100644 ElevenMPV-A/libs/lib/libnestegg.a create mode 100644 ElevenMPV-A/param_for_debug.sfx create mode 100644 ElevenMPV-A/source/audio/webm_opus.cpp create mode 100644 ElevenMPV-A/source/audio/youtube_opus.cpp delete mode 100644 ElevenMPV-A/source/config.cpp create mode 100644 ElevenMPV-A/source/debug.cpp create mode 100644 ElevenMPV-A/source/downloader.cpp create mode 100644 ElevenMPV-A/source/menus/youtube/menu_youtube_base.cpp create mode 100644 ElevenMPV-A/source/menus/youtube/menu_youtube_fav.cpp create mode 100644 ElevenMPV-A/source/menus/youtube/menu_youtube_history.cpp create mode 100644 ElevenMPV-A/source/menus/youtube/menu_youtube_search.cpp create mode 100644 ElevenMPV-A/source/yt_utils.cpp create mode 100644 ElevenMPV-A/strip-report.txt delete mode 100644 LICENSE create mode 100644 Resource/empva_settings.xml delete mode 100644 Resource/locale/empva_locale_es.xml delete mode 100644 Resource/locale/empva_locale_pt-br.xml delete mode 100644 Resource/locale/empva_locale_zh-s.xml delete mode 100644 Resource/locale/empva_locale_zh-t.xml create mode 100644 Resource/tex/tex_vertical_separator.zlib create mode 100644 Resource/tex/tex_yt_icon_fav_for_player.zlib create mode 100644 Resource/tex/tex_yt_icon_fav_for_player_glow.zlib create mode 100644 Resource/tex/tex_yt_icon_favourite.zlib create mode 100644 Resource/tex/tex_yt_icon_history.zlib create mode 100644 Resource/tex/tex_yt_icon_left.zlib create mode 100644 Resource/tex/tex_yt_icon_net.zlib create mode 100644 Resource/tex/tex_yt_icon_right.zlib create mode 100644 Resource/tex/tex_yt_icon_search.zlib create mode 100644 Resource/tex/tex_yt_icon_vita.zlib diff --git a/ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj b/ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj new file mode 100644 index 0000000..e12d302 --- /dev/null +++ b/ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj @@ -0,0 +1,86 @@ + + + + + Debug + PSVita + + + Release + PSVita + + + + + + + + {D9477093-D1DF-4A70-B333-C114DDF9EC04} + + + + DynamicLibrary + + + DynamicLibrary + + + + + + + + + + + + + + + + + + + + + + + + NDEBUG;%(PreprocessorDefinitions); + Level3 + NotUsing + $(SCE_PSP2_SDK_DIR)\target\include\vdsuite\user;$(SCE_PSP2_SDK_DIR)\target\include\vdsuite\common;%(AdditionalIncludeDirectories) + Cpp11 + + + $(SCE_PSP2_SDK_DIR)\target\lib\vdsuite;%(AdditionalLibraryDirectories) + -lScePafStdc_stub;-lScePafMisc_stub;-lScePafCommon_stub;-lSceLibKernel_stub;-lSceAppMgrUser_stub;-ltaihen_stub;-lsnc;%(AdditionalDependencies) + StripSymsAndDebug + --no-standard-libraries + StripFuncsAndData + true + + + "$(SCE_PSP2_SDK_DIR)/host_tools/build/bin/vdsuite-pubprx.exe" --strip --compress "$(LocalDebuggerCommand)" "$(OutDir)download_enabler_empva.suprx" +copy /Y "$(OutDir)download_enabler_empva.suprx" "$(SolutionDir)\ElevenMPV-A\CONTENTS\module\download_enabler_empva.suprx" + + + + + _DEBUG;%(PreprocessorDefinitions); + true + NotUsing + $(SCE_PSP2_SDK_DIR)\target\include\vdsuite\user;$(SCE_PSP2_SDK_DIR)\target\include\vdsuite\common;%(AdditionalIncludeDirectories) + Cpp11 + + + $(SCE_PSP2_SDK_DIR)\target\lib\vdsuite;%(AdditionalLibraryDirectories) + -lScePafStdc_stub;-lScePafMisc_stub;-lScePafCommon_stub;-lSceLibKernel_stub;-lSceAppMgrUser_stub;-ltaihen_stub;-lsnc;%(AdditionalDependencies) + --no-standard-libraries + + + + + + + \ No newline at end of file diff --git a/ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj.filters b/ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj.filters new file mode 100644 index 0000000..67de2f6 --- /dev/null +++ b/ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj.filters @@ -0,0 +1,21 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;cc;s;asm + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj.user b/ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj.user new file mode 100644 index 0000000..be25078 --- /dev/null +++ b/ElevenMPV-A-DE/ElevenMPV-A-DE.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ElevenMPV-A-DE/download_enabler.cpp b/ElevenMPV-A-DE/download_enabler.cpp new file mode 100644 index 0000000..c864528 --- /dev/null +++ b/ElevenMPV-A-DE/download_enabler.cpp @@ -0,0 +1,193 @@ +/* + VitaTweaks: Download Enabler + Copyright (C) 2018, TheFloW + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include + +using namespace paf; + +static tai_hook_ref_t ExportFileRef; +static tai_hook_ref_t GetFileTypeRef; + +static SceUID hooks[3]; + +static SceInt32 ExportFilePatched(uint32_t *data) +{ + int res = TAI_NEXT(ExportFilePatched, ExportFileRef, data); + + if (res == 0x80101A09) { + char download_path[1024]; + char bgdl_path[1024]; + char file_name[256]; + char short_name[256]; + uint16_t url_length = 0; + uint32_t count = 0; + + uint32_t num = *(uint32_t *)data[0]; + + sce_paf_snprintf(bgdl_path, sizeof(bgdl_path), "ux0:bgdl/t/%08x/d0.pdb", num); + + SceUID fd = sceIoOpen(bgdl_path, SCE_O_RDONLY, 0); + if (fd < 0) + return fd; + + sceIoPread(fd, &url_length, sizeof(uint16_t), 0xD6); + sceIoPread(fd, file_name, sizeof(file_name), 0xF7 + url_length); + sceIoClose(fd); + + sce_paf_snprintf(bgdl_path, sizeof(bgdl_path), "ux0:bgdl/t/%08x/%s", num, file_name); + + char *ext = sce_paf_strrchr(file_name, '.'); + + if (!ext || sce_paf_strcmp(ext, ".webmyt")) { + return 0x80101A09; + } + + ext[5] = '\0'; + int len = ext - file_name; + if (len > sizeof(short_name) - 1) + len = sizeof(short_name) - 1; + sce_paf_strncpy(short_name, file_name, len); + short_name[len] = '\0'; + + while (1) { + if (count == 0) + sce_paf_snprintf(download_path, sizeof(download_path), "ux0:empva_download/%s", file_name); + else + sce_paf_snprintf(download_path, sizeof(download_path), "ux0:empva_download/%s (%d)%s", short_name, count, ext); + + if (!io::Misc::Exists(download_path)) + break; + + count++; + } + + res = io::Misc::MkdirRWSYS("ux0:empva_download"); + if (res < 0 && res != 0x80010011) + return res; + + return io::Misc::Rename(bgdl_path, download_path); + } + + return res; +} + +static SceInt32 GetFileTypePatched(int unk, int *type, char **filename, char **mime_type) +{ + int res = TAI_NEXT(GetFileTypePatched, GetFileTypeRef, unk, type, filename, mime_type); + + if (res == 0x80103A21) { + *type = 1; // Type photo + return 0; + } + + return res; +} + +extern "C" { + + #include + + SCE_MODULE_INFO(ElevenMPV_A_DE, 2, 1, 1) + + int module_start(SceSize args, const void * argp) + { + tai_module_info_t info; + info.size = sizeof(info); + if (taiGetModuleInfo("SceShell", &info) >= 0) { + switch (info.module_nid) { + case 0x0552F692: // 3.60 retail + { + hooks[0] = taiInjectData(info.modid, 0, 0x50A4A8, "GET", 4); + hooks[1] = taiHookFunctionOffset(&ExportFileRef, info.modid, 0, 0x1163F6, 1, ExportFilePatched); + hooks[2] = taiHookFunctionOffset(&GetFileTypeRef, info.modid, 0, 0x11B5E4, 1, GetFileTypePatched); + break; + } + + case 0x6CB01295: // 3.60 PDEL + { + hooks[0] = taiInjectData(info.modid, 0, 0x4F9A18, "GET", 4); + hooks[1] = taiHookFunctionOffset(&ExportFileRef, info.modid, 0, 0x111D5A, 1, ExportFilePatched); + hooks[2] = taiHookFunctionOffset(&GetFileTypeRef, info.modid, 0, 0x116F48, 1, GetFileTypePatched); + break; + } + + case 0xEAB89D5C: // 3.60 PTEL + { + hooks[0] = taiInjectData(info.modid, 0, 0x4FEBF8, "GET", 4); + hooks[1] = taiHookFunctionOffset(&ExportFileRef, info.modid, 0, 0x112756, 1, ExportFilePatched); + hooks[2] = taiHookFunctionOffset(&GetFileTypeRef, info.modid, 0, 0x117944, 1, GetFileTypePatched); + break; + } + + case 0x5549BF1F: // 3.65 retail + case 0x34B4D82E: // 3.67 retail + case 0x12DAC0F3: // 3.68 retail + { + hooks[0] = taiInjectData(info.modid, 0, 0x50A9E8, "GET", 4); + hooks[1] = taiHookFunctionOffset(&ExportFileRef, info.modid, 0, 0x11644E, 1, ExportFilePatched); + hooks[2] = taiHookFunctionOffset(&GetFileTypeRef, info.modid, 0, 0x11B63C, 1, GetFileTypePatched); + break; + } + + case 0x0703C828: // 3.69 retail + case 0x2053B5A5: // 3.70 retail + case 0xF476E785: // 3.71 retail + case 0x939FFBE9: // 3.72 retail + case 0x734D476A: // 3.73 retail + { + hooks[0] = taiInjectData(info.modid, 0, 0x50AA28, "GET", 4); + hooks[1] = taiHookFunctionOffset(&ExportFileRef, info.modid, 0, 0x11644E, 1, ExportFilePatched); + hooks[2] = taiHookFunctionOffset(&GetFileTypeRef, info.modid, 0, 0x11B63C, 1, GetFileTypePatched); + break; + } + + case 0xE6A02F2B: // 3.65 PDEL + { + hooks[0] = taiInjectData(info.modid, 0, 0x4F9F58, "GET", 4); + hooks[1] = taiHookFunctionOffset(&ExportFileRef, info.modid, 0, 0x111DB2, 1, ExportFilePatched); + hooks[2] = taiHookFunctionOffset(&GetFileTypeRef, info.modid, 0, 0x116FA0, 1, GetFileTypePatched); + break; + } + + case 0x587F9CED: // 3.65 PTEL + { + hooks[0] = taiInjectData(info.modid, 0, 0x4FF0F8, "GET", 4); + hooks[1] = taiHookFunctionOffset(&ExportFileRef, info.modid, 0, 0x1127AE, 1, ExportFilePatched); + hooks[2] = taiHookFunctionOffset(&GetFileTypeRef, info.modid, 0, 0x11799C, 1, GetFileTypePatched); + break; + } + } + } + + return SCE_KERNEL_START_SUCCESS; + } + + int module_stop(SceSize args, const void * argp) + { + if (hooks[2] >= 0) + taiHookRelease(hooks[2], GetFileTypeRef); + if (hooks[1] >= 0) + taiHookRelease(hooks[1], ExportFileRef); + if (hooks[0] >= 0) + taiInjectRelease(hooks[0]); + return SCE_KERNEL_STOP_SUCCESS; + } + +} \ No newline at end of file diff --git a/ElevenMPV-A-DE/paf_runtime.cpp b/ElevenMPV-A-DE/paf_runtime.cpp new file mode 100644 index 0000000..7da6819 --- /dev/null +++ b/ElevenMPV-A-DE/paf_runtime.cpp @@ -0,0 +1,18 @@ + +extern "C" { + + int _sceLdTlsRegisterModuleInfo() + { + return 0; + } + + int _sceLdTlsUnregisterModuleInfo() + { + return 0; + } + + int __at_quick_exit() + { + return 0; + } +} \ No newline at end of file diff --git a/ElevenMPV-A-ShellPlugin/ElevenMPV-A-ShellPlugin.vcxproj b/ElevenMPV-A-ShellPlugin/ElevenMPV-A-ShellPlugin.vcxproj index 4ffb143..50f7d66 100644 --- a/ElevenMPV-A-ShellPlugin/ElevenMPV-A-ShellPlugin.vcxproj +++ b/ElevenMPV-A-ShellPlugin/ElevenMPV-A-ShellPlugin.vcxproj @@ -59,7 +59,7 @@ --no-standard-libraries $(SCE_PSP2_SDK_DIR)\target\lib\vdsuite;%(AdditionalLibraryDirectories) - -lSceDbg_stub;-lScePafTopLevel_stub;-lScePafStdc_stub;-lScePafCommon_stub;-lScePafWidget_stub;-lScePafThread_stub;-lSceLibKernel_stub;-lSceThreadMgr_stub;-lSceThreadmgrCoredumpTime_stub;-lSceAppMgrUser_stub;-ltaihen_stub;%(AdditionalDependencies) + -lSceDbg_stub;-lScePafTopLevel_stub;-lScePafStdc_stub;-lScePafCommon_stub;-lScePafWidget_stub;-lScePafThread_stub;-lSceLibKernel_stub;-lSceThreadMgr_stub;-lSceThreadmgrCoredumpTime_stub;-lSceAppMgrUser_stub;-ltaihen_stub;-lsnc;%(AdditionalDependencies) "$(SCE_PSP2_SDK_DIR)/host_tools/build/bin/vdsuite-pubprx.exe" --strip --compress "$(LocalDebuggerCommand)" "$(OutDir)shell_plugin.suprx" @@ -75,9 +75,12 @@ copy /Y "$(OutDir)shell_plugin.suprx" "$(SolutionDir)\ElevenMPV-A\CONTENTS\modul Cpp11 - -lSceDbg_stub;-lScePafTopLevel_stub;-lScePafStdc_stub;-lScePafCommon_stub;-lScePafWidget_stub;-lScePafThread_stub;-lSceLibKernel_stub;-lSceThreadMgr_stub;-lSceThreadmgrCoredumpTime_stub;-lSceAppMgrUser_stub;-ltaihen_stub;%(AdditionalDependencies) + -lSceDbg_stub;-lScePafTopLevel_stub;-lScePafStdc_stub;-lScePafCommon_stub;-lScePafWidget_stub;-lScePafThread_stub;-lSceLibKernel_stub;-lSceThreadMgr_stub;-lSceThreadmgrCoredumpTime_stub;-lSceAppMgrUser_stub;-ltaihen_stub;-lsnc;%(AdditionalDependencies) $(SCE_PSP2_SDK_DIR)\target\lib\vdsuite;%(AdditionalLibraryDirectories) - --no-standard-libraries %(AdditionalOptions) + --no-standard-libraries + StripSymsAndDebug + StripFuncsAndData + true "$(SCE_PSP2_SDK_DIR)/host_tools/build/bin/vdsuite-pubprx.exe" --strip --compress "$(LocalDebuggerCommand)" "$(OutDir)shell_plugin.suprx" diff --git a/ElevenMPV-A-ShellPlugin/main.cpp b/ElevenMPV-A-ShellPlugin/main.cpp index 870764e..5ef89ba 100644 --- a/ElevenMPV-A-ShellPlugin/main.cpp +++ b/ElevenMPV-A-ShellPlugin/main.cpp @@ -13,18 +13,18 @@ using namespace paf; -static widget::Widget *imposeRoot = SCE_NULL; +static ui::Widget *imposeRoot = SCE_NULL; static ImposeThread *mainThread = SCE_NULL; static RxThread *rxThread = SCE_NULL; static SceUID ipcPipeRX = SCE_UID_INVALID_UID; static SceUID ipcPipeTX = SCE_UID_INVALID_UID; -static widget::Widget *buttonREW = SCE_NULL; -static widget::Widget *buttonPLAY = SCE_NULL; -static widget::Widget *buttonFF = SCE_NULL; -static widget::Widget *textTop = SCE_NULL; -static widget::Widget *textBottom = SCE_NULL; +static ui::Widget *buttonREW = SCE_NULL; +static ui::Widget *buttonPLAY = SCE_NULL; +static ui::Widget *buttonFF = SCE_NULL; +static ui::Widget *textTop = SCE_NULL; +static ui::Widget *textBottom = SCE_NULL; static tai_hook_ref_t hookRef[1]; static SceUID hookId[1]; @@ -38,23 +38,26 @@ static SceBool imposeIpcActive = SCE_FALSE; int setup_stage1() { + Plugin *imposePlugin = SCE_NULL; + ScePVoid powerRoot = SCE_NULL; + //Get power manage plugin object - Plugin *imposePlugin = Plugin::Find("power_manage_plugin"); + imposePlugin = Plugin::Find("power_manage_plugin"); if (imposePlugin == NULL) { SCE_DBG_LOG_ERROR("Power manage plugin not found\n"); goto setup_error_return; } //Power manage plugin -> power manage root - widget::Widget *powerRoot = imposePlugin->GetInterface(1); + powerRoot = imposePlugin->GetInterface(1); if (powerRoot == NULL) { SCE_DBG_LOG_ERROR("Power root not found\n"); goto setup_error_return; } //Power manage root -> impose root (some virtual function) - widget::Widget *(*getImposeRoot)(); - getImposeRoot = (widget::Widget *(*)()) *(int *)((void *)powerRoot + 0x54); + ui::Widget *(*getImposeRoot)(); + getImposeRoot = (ui::Widget *(*)()) *(int *)((void *)powerRoot + 0x54); imposeRoot = getImposeRoot(); if (imposeRoot == NULL) { SCE_DBG_LOG_ERROR("Impose root not found\n"); @@ -77,11 +80,11 @@ void setup_stage2() ipcPipeRX = sceKernelCreateMsgPipe("ElevenMPVA::ShellIPC_RX", SCE_KERNEL_MSG_PIPE_TYPE_USER_MAIN, IPC_PIPE_ATTR, sizeof(IpcDataRX), SCE_NULL); ipcPipeTX = sceKernelCreateMsgPipe("ElevenMPVA::ShellIPC_TX", SCE_KERNEL_MSG_PIPE_TYPE_USER_MAIN, IPC_PIPE_ATTR, sizeof(IpcDataTX), SCE_NULL); - mainThread = new ImposeThread(250, 0x1000, "ElevenMPVA::ShellControl"); + mainThread = new ImposeThread(SCE_KERNEL_LOWEST_PRIORITY_USER, SCE_KERNEL_4KiB, "ElevenMPVA::ShellControl"); mainThread->done = SCE_FALSE; mainThread->Start(); - rxThread = new RxThread(249, 0x1000, "ElevenMPVA::ShellRx"); + rxThread = new RxThread(SCE_KERNEL_LOWEST_PRIORITY_USER, SCE_KERNEL_4KiB, "ElevenMPVA::ShellRx"); rxThread->Start(); } @@ -107,6 +110,9 @@ void cleanup() if (ipcPipeTX > 0) sceKernelDeleteMsgPipe(ipcPipeTX); + + if (hookId[0] > 0) + taiHookRelease(hookId[0], hookRef[0]); } int findWidgets() @@ -118,7 +124,7 @@ int findWidgets() buttonREW = SCE_NULL; while (buttonREW == NULL) { buttonREW = imposeRoot->GetChildByHash(&widgetSearchResult, 0); - thread::Thread::Sleep(100); + thread::Sleep(100); } widgetSearchResult.hash = PlayerButtonCB::ButtonHash_Ff; @@ -163,6 +169,8 @@ int resetWidgets() buttonFF = SCE_NULL; textTop = SCE_NULL; textBottom = SCE_NULL; + + return 0; } void setButtonState() @@ -183,19 +191,19 @@ void setButtonState() void setText() { - widget::Widget::Color col; + ui::Widget::Color col; col.r = 1.0f; col.g = 1.0f; col.b = 1.0f; col.a = 1.0f; - textTop->SetFilterColor(&col); - textBottom->SetFilterColor(&col); + textTop->SetColor(&col); + textBottom->SetColor(&col); textTop->SetLabel(topText); textBottom->SetLabel(bottomText); } -SceVoid PlayerButtonCB::PlayerButtonCBFun(SceInt32 eventId, widget::Widget *self, SceInt32 a3, ScePVoid pUserData) +SceVoid PlayerButtonCB::PlayerButtonCBFun(SceInt32 eventId, ui::Widget *self, SceInt32 a3, ScePVoid pUserData) { IpcDataTX ipcDataTX; ipcDataTX.cmd = 0; @@ -226,7 +234,7 @@ SceVoid RxThread::EntryFunction() IpcDataRX ipcDataRX; WString text16; SceUInt32 artLen, albLen; - widget::Widget::Color col; + ui::Widget::Color col; col.r = 1.0f; col.g = 1.0f; col.b = 1.0f; @@ -255,32 +263,30 @@ SceVoid RxThread::EntryFunction() if ((ipcDataRX.flags & EMPVA_IPC_REFRESH_TEXT) == EMPVA_IPC_REFRESH_TEXT) { - text16.Set(ipcDataRX.title); + text16 = (wchar_t *)ipcDataRX.title; if (textTop != SCE_NULL && impose) { textTop->SetLabel(&text16); - textTop->SetFilterColor(&col); + textTop->SetColor(&col); } topText->Clear(); - topText->Set(text16.data, text16.length); - text16.Clear(); + topText->Append(text16.data, text16.length); - text16.Set(ipcDataRX.artist); + text16 = (wchar_t *)ipcDataRX.artist; artLen = sce_paf_wcslen((wchar_t *)ipcDataRX.artist); albLen = sce_paf_wcslen((wchar_t *)ipcDataRX.album); if (artLen != 0 && albLen != 0) - text16.Append((SceWChar16 *)L" / ", 4); - text16.Append(ipcDataRX.album, albLen); + text16.Append(L" / ", 4); + text16.Append((wchar_t *)ipcDataRX.album, albLen); if (textBottom != SCE_NULL && impose) { textBottom->SetLabel(&text16); - textBottom->SetFilterColor(&col); + textBottom->SetColor(&col); } bottomText->Clear(); - bottomText->Set(text16.data, text16.length); - text16.Clear(); + bottomText->Append(text16.data, text16.length); } break; @@ -301,7 +307,7 @@ SceVoid ImposeThread::EntryFunction() if (impose != appState.isSystemUiOverlaid && appState.isSystemUiOverlaid == SCE_TRUE) { SCE_DBG_LOG_INFO("Impose detected\n"); if (imposeIpcActive) { - thread::Thread::Sleep(100); + thread::Sleep(100); findWidgets(); setButtonState(); setText(); @@ -312,7 +318,7 @@ SceVoid ImposeThread::EntryFunction() resetWidgets(); } impose = appState.isSystemUiOverlaid; - thread::Thread::Sleep(100); + thread::Sleep(100); } sceKernelExitDeleteThread(0); @@ -350,14 +356,14 @@ extern "C" { setup_stage2(); - hookId[0] = taiHookFunctionImport(&hookRef[0], "SceShell", 0xA6605D6F, 0x62BEBD65, sceAppMgrGetCurrentBgmState2_patched); + hookId[0] = taiHookFunctionImport(&hookRef[0], "SceShell", 0xA6605D6F, 0x62BEBD65, (const void *)sceAppMgrGetCurrentBgmState2_patched); + + return ret; } int module_stop(SceSize args, const void * argp) { cleanup(); - if (hookId[0] > 0) - taiHookRelease(hookId[0], hookRef[0]); return SCE_KERNEL_STOP_SUCCESS; } diff --git a/ElevenMPV-A-ShellPlugin/main.h b/ElevenMPV-A-ShellPlugin/main.h index f1e646c..e81d175 100644 --- a/ElevenMPV-A-ShellPlugin/main.h +++ b/ElevenMPV-A-ShellPlugin/main.h @@ -1,3 +1,4 @@ +#pragma once #include using namespace paf; @@ -22,7 +23,7 @@ class RxThread : public paf::thread::Thread virtual SceVoid EntryFunction(); }; -class PlayerButtonCB : public widget::Widget::EventCallback +class PlayerButtonCB : public ui::Widget::EventCallback { public: @@ -43,6 +44,6 @@ class PlayerButtonCB : public widget::Widget::EventCallback }; - static SceVoid PlayerButtonCBFun(SceInt32 eventId, widget::Widget *self, SceInt32 a3, ScePVoid pUserData); + static SceVoid PlayerButtonCBFun(SceInt32 eventId, ui::Widget *self, SceInt32 a3, ScePVoid pUserData); }; \ No newline at end of file diff --git a/ElevenMPV-A-ShellPlugin/paf_runtime.cpp b/ElevenMPV-A-ShellPlugin/paf_runtime.cpp index a5d6212..7da6819 100644 --- a/ElevenMPV-A-ShellPlugin/paf_runtime.cpp +++ b/ElevenMPV-A-ShellPlugin/paf_runtime.cpp @@ -1,11 +1,6 @@ extern "C" { - void __cxa_set_dso_handle_main(void *dso) - { - - } - int _sceLdTlsRegisterModuleInfo() { return 0; @@ -16,13 +11,8 @@ extern "C" { return 0; } - int __aeabi_unwind_cpp_pr0() + int __at_quick_exit() { - return 9; - } - - int __aeabi_unwind_cpp_pr1() - { - return 9; + return 0; } } \ No newline at end of file diff --git a/ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj b/ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj new file mode 100644 index 0000000..946fb97 --- /dev/null +++ b/ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj @@ -0,0 +1,79 @@ + + + + + Debug + PSVita + + + Release + PSVita + + + + {584C4FE4-880C-4EF6-9E2A-22BBE98EBA2D} + + + + DynamicLibrary + + + DynamicLibrary + + + + + + + + + + + + + + + + + + + + + + + + _DEBUG;%(PreprocessorDefinitions); + true + NotUsing + + + --no-required-files + -lSceSysmodule_stub;-lSceAppmgr_stub;%(AdditionalDependencies) + $(SCE_PSP2_SDK_DIR)\target\lib\vdsuite;%(AdditionalLibraryDirectories) + + + + + NDEBUG;%(PreprocessorDefinitions); + Level3 + NotUsing + + + --no-required-files + StripSymsAndDebug + -lSceSysmodule_stub;-lSceAppmgr_stub;%(AdditionalDependencies) + $(SCE_PSP2_SDK_DIR)\target\lib\vdsuite;%(AdditionalLibraryDirectories) + + + "$(SCE_PSP2_SDK_DIR)/host_tools/build/bin/vdsuite-pubprx.exe" --strip --compress "$(LocalDebuggerCommand)" "$(OutDir)paf_preload.suprx" +copy /Y "$(OutDir)paf_preload.suprx" "$(SolutionDir)\ElevenMPV-A\CONTENTS\module\libScePafPreload.suprx" + + + + + + + + + + \ No newline at end of file diff --git a/ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj.filters b/ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj.filters new file mode 100644 index 0000000..d7e45bc --- /dev/null +++ b/ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;cc;s;asm + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp + + + + + Source Files + + + \ No newline at end of file diff --git a/ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj.user b/ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj.user new file mode 100644 index 0000000..be25078 --- /dev/null +++ b/ElevenMPV-A-libScePafPreload/libScePafPreload.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ElevenMPV-A-libScePafPreload/prx.c b/ElevenMPV-A-libScePafPreload/prx.c new file mode 100644 index 0000000..2aded10 --- /dev/null +++ b/ElevenMPV-A-libScePafPreload/prx.c @@ -0,0 +1,74 @@ +#include +#include + +int sceAppMgrGrowMemory3(unsigned int a1, int a2); + +#define GROW_MEMORY + +typedef struct SceSysmoduleOpt { + int flags; + int *result; + int unused[2]; +} SceSysmoduleOpt; + +typedef struct ScePafInit { + SceSize global_heap_size; + int a2; + int a3; + int cdlg_mode; + int heap_opt_param1; + int heap_opt_param2; +} ScePafInit; // size is 0x18 + +int __module_stop(SceSize argc, const void *args) +{ + return SCE_KERNEL_STOP_SUCCESS; +} + +int __module_exit() +{ + return SCE_KERNEL_STOP_SUCCESS; +} + +int __module_start(SceSize argc, void *args) +{ + SceInt32 ret = -1, load_res; + void* pRet = 0; + + ScePafInit init_param; + SceSysmoduleOpt sysmodule_opt; + +#ifdef GROW_MEMORY + + init_param.global_heap_size = 4 * 1024 * 1024 + 512 * 1024; + + //Grow memory if possible + ret = sceAppMgrGrowMemory3(41 * 1024 * 1024, 1); // 57 MB + if (ret < 0) { + ret = sceAppMgrGrowMemory3(16 * 1024 * 1024, 1); // 32 MB + if (ret == 0) + init_param.global_heap_size = 12 * 1024 * 1024; + } + else + init_param.global_heap_size = 23 * 1024 * 1024; +#else + init_param.global_heap_size = 12 * 1024 * 1024; +#endif + init_param.a2 = 0x0000EA60; + init_param.a3 = 0x00040000; + init_param.cdlg_mode = 0; + init_param.heap_opt_param1 = 0; + init_param.heap_opt_param2 = 0; + + sysmodule_opt.flags = 0; // with arg + sysmodule_opt.result = &load_res; + + ret = sceSysmoduleLoadModuleInternalWithArg(SCE_SYSMODULE_INTERNAL_PAF, sizeof(init_param), &init_param, &sysmodule_opt); + + if (ret < 0) { + sceClibPrintf("[PAF PRX] Loader: 0x%x\n", ret); + sceClibPrintf("[PAF PRX] Loader result: 0x%x\n", load_res); + } + + return SCE_KERNEL_START_NO_RESIDENT; +} \ No newline at end of file diff --git a/ElevenMPV-A.sln b/ElevenMPV-A.sln index 8ea022f..2c9fcb8 100644 --- a/ElevenMPV-A.sln +++ b/ElevenMPV-A.sln @@ -6,10 +6,16 @@ MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ElevenMPV-A", "ElevenMPV-A\ElevenMPV-A.vcxproj", "{C1CA520F-B824-44D0-91F4-33EE6287D6EB}" ProjectSection(ProjectDependencies) = postProject {08427615-73E3-4334-B91C-89425EFCA190} = {08427615-73E3-4334-B91C-89425EFCA190} + {D9477093-D1DF-4A70-B333-C114DDF9EC04} = {D9477093-D1DF-4A70-B333-C114DDF9EC04} + {584C4FE4-880C-4EF6-9E2A-22BBE98EBA2D} = {584C4FE4-880C-4EF6-9E2A-22BBE98EBA2D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ElevenMPV-A-ShellPlugin", "ElevenMPV-A-ShellPlugin\ElevenMPV-A-ShellPlugin.vcxproj", "{08427615-73E3-4334-B91C-89425EFCA190}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ElevenMPV-A-DE", "ElevenMPV-A-DE\ElevenMPV-A-DE.vcxproj", "{D9477093-D1DF-4A70-B333-C114DDF9EC04}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libScePafPreload", "ElevenMPV-A-libScePafPreload\libScePafPreload.vcxproj", "{584C4FE4-880C-4EF6-9E2A-22BBE98EBA2D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|PSVita = Debug|PSVita @@ -24,6 +30,14 @@ Global {08427615-73E3-4334-B91C-89425EFCA190}.Debug|PSVita.Build.0 = Debug|PSVita {08427615-73E3-4334-B91C-89425EFCA190}.Release|PSVita.ActiveCfg = Release|PSVita {08427615-73E3-4334-B91C-89425EFCA190}.Release|PSVita.Build.0 = Release|PSVita + {D9477093-D1DF-4A70-B333-C114DDF9EC04}.Debug|PSVita.ActiveCfg = Debug|PSVita + {D9477093-D1DF-4A70-B333-C114DDF9EC04}.Debug|PSVita.Build.0 = Debug|PSVita + {D9477093-D1DF-4A70-B333-C114DDF9EC04}.Release|PSVita.ActiveCfg = Release|PSVita + {D9477093-D1DF-4A70-B333-C114DDF9EC04}.Release|PSVita.Build.0 = Release|PSVita + {584C4FE4-880C-4EF6-9E2A-22BBE98EBA2D}.Debug|PSVita.ActiveCfg = Debug|PSVita + {584C4FE4-880C-4EF6-9E2A-22BBE98EBA2D}.Debug|PSVita.Build.0 = Debug|PSVita + {584C4FE4-880C-4EF6-9E2A-22BBE98EBA2D}.Release|PSVita.ActiveCfg = Release|PSVita + {584C4FE4-880C-4EF6-9E2A-22BBE98EBA2D}.Release|PSVita.Build.0 = Release|PSVita EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ElevenMPV-A/CONTENTS/empva_plugin.rco b/ElevenMPV-A/CONTENTS/empva_plugin.rco index 79fb912cbd3e6844cb039235af2749e2656e4ea5..6895bd1691cbb3adcbe7bd4a94a432c4a2fb7078 100644 GIT binary patch delta 35589 zcmc$`2|QKZ_dkA(A@e+Ch|Ket%pw_zR8r=UAybhd!y!q7#@j$iq(l)?lp#bK2uYzN zNvJ51p@iRF*FEL&)bsTDe82zif4}Uz&pvzY_j<3j_H^!`@)J{90<)FPa;p`r6a<1b zfk4P|L@!PRLOv?;Q7J`5AauDB2rsA!gvu@GCQ48$A^9Os0wEC9UAzc{7D@uaU@N-j zr8;WGNBQ06sE?7v01JVD+6XlWLw^TY)ZaHCXni}eHW-zF$w02-I+)0HTn87qz7v%o&q}V( z)d^(#kw( z|6?-+{y`EFR3uzI`h!or-&MaV}SV?4}lXc`kcjjv5CfD(hE=Ki#(+qYd z(V^i)&ObC0PtXZd41u0C|E5R$H+mGw_enDX>B*u;a}?8Q01KEA zB1j5KNXh6v>PV0v%ixwtqdHh-fikqqq6`?;V&z#JHe4UF9KOUX@hDL`}9 zLL`QAB+9tedx`rN3ey8QU=m3zSja&Pl%oDeDtKgmM+MMC7XFqBH2b0v+kmf0*!=2KMx^A36+q*aJUcbfg|(*jvN0eaE7SE+`t)=>-Yi+U_bx>tq~w(+$CwmY$jp$EYt%M zuAZ8S=%gg%3ZVGnf=@+!v_LsmsX4hm*LqMqz>JnPq|g|Zxb?7HkgO+Cu<$T~e}EcD z{Hv|2=Bb@;D}aGI06c;KA^)`X9kVd|O@sgmx7C;#Y&H3BY~6xj@JNGVDPk0hDrtiS ztKHG&Ni1WL;(s+qObXouZfU4YVmHhcdw8YManCq`7^8-o!8Z+9A2QeW4DC z+;NFabV4uaYo0yt$$GBAPAWeBpisE+(3aSEKr@2Urc^_G46^yQsAPXpbSa_x`A3 zBBUGmDg-3JqR&4BW;^`O6Ld%p65bBp15X@BByo?-ADll2pNJ7*4eI>UHC-e!^F4tN zPLd|{f-jMv4EG4GjFEyUB*je>WT#UAF__sPHkS{GGNLwcATOE!6a_KWjGI`-N{3M) zM}iB$@6a_2`5i~cO+gz9Nd}LD2pI;L!{RPQu5%$Q80s!40~Ik;$72fdynt2?aUL{v zP^p31P|UXe*a`G!Z~Ry>aOL+s|P28N*L+m+lB z@c0Y~_bP6$3*v>_jl6nQoa9vuB8?tXNNxe@9dpFukOuUJQj7t-&JXPT$$SV2gLa(p z{5dm!ARvm`Ka>MM@Y_$0vmrGgqn#v!gWn-#P!gRiBv#L}iWg$&-+$M5Ft;sa;h{7lXGZGOmC?WkK zq96v;=@9imYx*DR6i~XNP6qEx$@EfiikEqxGETRBC*Cv3+q5mFH zzkD>mVXDK5PGW`T%U-m$_@c4~wZTq_FOqnKh0#4&BjbwRz%HfMFGL$6$l2~BG zVFY_X;GCGj8U*7Ah_)bAP(s4dJ;=RrBf`*n%gU_<6BtN9S0Jo}w9aSZ!jVY1? zBfU|kBC@e_VE77W40j+SNm%Is4M>3b^U?N_(ZC(x7TipHb%efiSwMfB^bvC3DO93A zVul$ThP!cY2mm8k1f3aBqZBIt*F%7e1S-Ix)QFxGjFqSk3Af`W+4dud1MY)A3H~AS;x0%6y(s;8FaQlmfFp1sINHAj1NzQo@u$Ifha3clAD9n-Q6`QSeo>TBNr6TR z1RfvH4CFct2pEc7d`bYp)B^fdwtUfQtB6C?tRq9w`xY4Uq+! zaKZ%-0Y#V=^E@O&Xqx9Dd|3R=MQA_ZA$GCT+2Y>75H#{5NexT{P&1c4sG4v6d{o>U zZ4^Xic5ZAw^xS7!fM2%+jb&s7Wc*1DEy5&g@%fX6>X4uvya0;=ZZ%%wL5fA~AY+MS zkttx&>|^5m13vCrT$vb>hK{iEfPxF?9sPVn&JLCM;|ad<;KX8(JR}X&7yN~x&4+v!D<+5CCg|u^(i3%%7&wm=YGvg5y9w#UP7Uzn?;&JFF#o@;jCy36~ z4&u1z5Ml|5{0xCc1~%6#(DjQXYDYN><==T_FA3zIyz*D4fTw|mFT#Wp64@zYKbDH$ z4YMTD^7vcN05;Bd7Wt>S^E?Bhb18uMA9@D58cU<;D1`k^j&$;BBB$hA^Ro z^v9l=_-D@mHqLhz`KP(_JOiS0DS-GtcxLVthpq$2Gcn}+yD9EP_6*(*-o#nqB|gRN zku1#A`H$q5vr`^++%!YL%b*}S*>U^eGkhG~g4qHy9Pr&`(AkEZ@fl4LKr;A*#b-R! zNqv983wH$_C7g`0G&K1akkx?cNwVl89;C(+mDOYz)J#hF!hx%4pV$8L&9GVdpYMIm z*6|}g&^@Q3n`g4G9KJz#*W-trh{dphP}e z6DUY;UC(s_kf@hK?`FD*FX0N^d=~vy+xitxQ_DwnMan+^9Y0m$O8%7lt1-|!CyTBP+$)Z1LdE41bV9} zqW4*lSNc)@Kl2EDn+6g-Mj$Le9Y{b4=}$dk{a23w6xcHhGW+`H9)aFoO6cPph7v_>_STg$CAZ=slr~7B!S} zP%cMpj1V_eLc;eAe64?s?$e)A>@y)+vPc5>2H{2a z4z3VF1f~QcQcyzr!;K25>-vEW%5n1Wa7{r#dp@3k9q0vRxCdrcfe-)osRD@26PLwL>%@~w_cajMtyFmk$K>hD0-`Nca_bbE>XjCFhC?SytkpLb; z^fvfxJdw4egiM2-2z~PL<9r8uKd8n%0=PKWS=67V&O60`=v?(6j(g=7C*QfJ80ZQg zp6^DUfs6+q4;Vf;!pL5Mb~plnCvjGI8HZ$M#bOMQ2>zggt^y6A{nj;{_}{APm`aY>)6f4Z@#ksoey@1mOgYscnHC<;G79^3D>{) z2mr)@b}*t1B9MOX%h`!F|Cw*TE9aje=erJ36eFFZKsoROpUtZNId=Agp%mP%g+j6&>2La`51$U!aj2M z2C_0}hwdOFrHSNG#$lu=hzfk%m^SJHv;hLdKm?gi~%Ol10-^lEeuF=ca0e0t!*^4B@q%g4ij-y#y}d_MD9X zZq5008C8g)931j5kr*(63~8?S!MB!LXkkVXfIRE{M1DHmJR}L+AT~Ii8g$Kyr18xw zX_nUyH!6`;yd%ZXT7Yg5?oq%76zGkk9V5PG2Kz>0miR6rTNBbX1^%hhDGLXYn-$&Pw zan*rjzu|q+j{n1R&;;11FENOL3xgvZm@=0GU?;605JYs*vCsJDY)5-32?yK&9DpZq z02v1)dmm+-14#hM;2hA}`-21Qjew21Vl&VQKp^oV=gztU< za(yQ%VM*g7*YPFn1i21N7~p|2AP73B_0T@Q94Ct2orF)HAT2@}n1KbL5Y{wMiW9U( z9RUCmz9Nyk{_W9V{+iZ|a6lHYfB+{lFAgbmF?&=IEU79NZa6 zNFMs&#-AbA%TNhA0Sk1^GM{~ALk4`Cn|9jtY~K!|GBLtqGm7vL~wKd z8@GUZzyftR4wUoVB01|8CqgCJQMjM(lk0Qc1b}UbSPD7gHq3VuS| zMB`691zyTAL|#JK1!Z*tk=dG?n6!iy1La@^+=dd;f9oB<0u{3;v#-DL4h$Md8U)-s zO~3FC0E!!-w-yj6+t$~h?GfJ-TfB@(l<2=oDU zXvPisZyf?ypbE!<@^=nFqhlF(j84RzQbG){sQ_xdG4ZzIVv2O)Yeiv|45S#8E24=B8vzL6{p}D&4a!SV8wF~E zj1G|K2S^zHmVx14n$VI-u9GCu3%-&Wplj4b@R%nL!xXlNdgEDcpbobmUw$v5cA$tK zx6w7xlZuJh&&uj^iQKjmm9TGt9AsFkfiB>J88{}CxKB|tDdnM8=mVzXJmk=34H*x6 zASLmmG(Rm+9Wo(0@$u8+nsyQ$(GSvqOEzkxLK)``eW5=0AOK;CT#4L@up#6AF+y_4 zH9y8P92RiSuu1EnjB`QZ)RUckzySylgJ$%AgUx@yfp+K)GGVB!nFAv=8_pjTko7-S zQJ@W&&=2}R2?-CuZ=QIz{;>T30ss%;k30Yd1OQ|Rm5_1UQFus-$&WlFk{~xX{e0pH z1XumXPdpfYz91X@m!N>N;Tbdw1qL!s44el+fdK*~1P&)fZHD$Glz(^9jsfdYdWT$z zbP|hg*p?uhe|Q-1Ko{V-ARHWb_PpJt$f|++7#~hKs0V=Jrx56kv%q`Lp1)V)qOs&I zAc`w#L&_lIqbZC`6gL`){vZj%J;e-$JJFqrm5rMW2X-t#`6@AznvkS^YDd$ z6-mG-#<^Z2*Kuzelk4CjkOMSe0BqJFA;`Fk(oj1joEcyMgLagGS^q4vg+G2)LuUa$ zt0D0@hT3US=0JHaAK(RboDWz_;sL5T{0>>}^4HR)|^IyFQgsfNp&Eh{G^;d7ggCeB4-UNm@f5*oDV{o*ek$b`yYmn-7gFVhJx0AGx$IErpqtD zfppm4!T%sq#9bbL^(Js^`EQ_zFFpS1O(3MS=5H4N0ja-^&6r;p3=9+hj{To|bMG&} zfpq`h!T*3bad^vLy$KwR(XtFnF{EEC!M|QKh^svR>P;X73;Zn3e}FV^X-oTs!E+hT zVfmkXGm8wKf|TM3--&qFqPK$_XMfTQhX&ZSK-q3|f4)&M?$8?}ZBZouLn2s9iiVMDY0r!pdi zF$eZ5c(e|XYymrb*Zs5whf@+I5Vj!>HxN8&b0t&5hXSsCKK3t6#YnaqkZql78`#x0 zM>!7OBs0%82?D_xk@*EU344fqfSONcRu>8gL=CJoUjNh5-zj62BM>~1dw!=3|7!NH zmCfn`qw;ZG7#b(PQx>Cw9zxNH^LNU+{$PZFQG&L=Hw?pLT8Z9H(xCgjvWY)X23GC; zl`_u1h75k2I5rzH?B{SqGWghsH?Sc6lN-URFMpy89qr|R>qQj*iGLg*voQm!TsHi| zjq@y1Lc7+^e;6MmYv&q<{bE*wRrP~Tg%YQhq*ad*)McqVAWEzyU$;*n&w$1 zg4Q|Xf0$-D{NcxWS!i_sPPsK`LFrGG^ODCCEHJoousY{&%F#N2xf2M3|BK3% zexV$!mfAGmasf(V+PM&h7XB{8P8%56W}h4pxiU z|J`yC|JiAJgBr#ES3B5$s+^TP)#fS(t5bfVJS}+kr_&_EVf-b}+dlu(0cZUSw}aKZ z4u7{iCIsF^`Z?IK|EY49UnmEwkN-lsOBjK08W}q$o+j-}>9j#5I ztsJZ-pv7wbf`((`8y+DFJ@L>X|Nm|gi9v3HG=Bg>jFAx}Wnd+o0C8nFcx60+aPA=G z59~(N0SoSWdC4j)&v z2B61%4>a=OJp~VcdC$#A2!rOy)%-M(Y?0ds4>?8D$rFL@+2`|O6U5#sE_*B0;DN2ee(0O1kB9T7qg04xN5 z)DceWfk;W34e_$S5M@6b@u9yE2LEj&r?;{J{x88+b=NEKE3yt_>wEB@&II3WW`KVR z(kXH1I{a&hGUw;R@J({-R(faIQ-h-*>+tD_-?<{b3-@yCcEWI z<0v>mw8WGjhTn*!VwSbw5r zq1F~Spcfj7?r7piQEmQKPI@3&a=j6L{AlU%@&w2~4VRvTVfs0Kr!~|Erl}r4$=#9Z z0!PuCRhxUE{>{F7EtJipLP}6Z5C;QgF*rYl1*vetoh8Z2!BAQZMx24O$1<*<$MCiI z$ld)U*Q}=I359Qn%WwW{2peAKHlwp3zoRg$1HLEC>`lc6d(krg8?Epy;nk~IcEa{h zC5>i*0)gOXs84}Aaao5DB? zd>L!Bi02z9YWmul2c@iPgfo=&$__iBq$K8cLwRxeU2`aRt_%)>GB=044ocG(MA8f% zHLuHpy7p<-_fYPeG$t;AJ;X0u;4|FdpW3q$9u?#cWpKff@cn4zRXD9J&|^%3gOtSj zXbxERvHtvWSckCH=GO?0#9iA483TP?{XLvF?+6YK@FyM&lHqX+@D12b2nr7Oh1)^l z-u~|1Zmz+^hM=PYK><7b-3glmkg%V#pX+u{Z-0WPZ$N0kW*_2#?MsNB!M9Z00=D~m zY$qcU$TcKD@bdQb@2>orA*zJ%|!JZZhHuNjzTeP+;C15QYn(OCm#v zxZaikw;e&wL0+zb9t2n4KrdIqb`qYqJHgjuORzI4gFV86ouR9@p9cw?;Nk8a?Ccld z?m=7_BtcXN2_&Y4@KP&CoI67-3$c_7kINaey{t8S-opQ)$=wy_JF7}x7L{2EYBE?y zHtW8>xI^uUR&dt41<$v{KPTP{Q}TVIB8#nm%H=1X5SVsgbNB&suk*YRC~J|>7zo@) zbIxW6n49cb3J6%!%CVt+lf)&`J8lK9zvhzNeA6ah!JfU*;z45##frex+|^0?SBAD; zKXChvAOun%JLrO58{%2Pe{wSPCseUI+^8I zdg8Rrnb6|!@Xp*)dw*F=U-$Ty#WU6|N%5GPb>^P*__m1D1qobk;N|8zu9K&4FuWMN`>ycN9h<_nuEh}{diLr0 zEjn5G+GR_lLayDh899CDV_n_T;P{KZU#vwV=o$yP?JwrH)JqSX3R_|4n|sG5sQ6B* zQdKyYt)0(wPCn02hiAb7&XcFP?#BDFb$T4Xt05(ask<>m2()eFE_HCtZqLmpR<6!( z<3^C74B7&|<#&su<<#pIa9xwmcask}h^RQZZirjtR*;8ymvV+g9o3$RDzb3R4!3hH ze*4aUot@7~W(D_9u3KB5d6pt0o-)*_tK8ijfz)p099ws^^kZa5G2$L`$BCk}W%D?O z@bhE_sCip94j3Y}*N+)#2r_&Wh+?pK#2xP_$Z$2@4PBmPm^6~Q*_VRw$7BcU(z`mN zSGZar`(jdILh(q{EWVtZ;o~4U zTbBXFE9|4DR8FpU;fcE+%e}h3kJ?REm-dgfJJ-L(&UOt)yyN_|_gq6t$kEBQ!4bpq zoiFt|zD;eYUqAVF#I-Z~WXtM}b>$V|KJE0KJIqeB1}EaQg@%Uj0+75jBDf4Kfu+rbJU+e=~aG-DJV) zfZCc>Ej^a}7elV!(%n|bKAtYPDREzyw$*c$iROmbgcSuAaR*P^erB(h+vH<2+>&w6 zFoJuK`TNBFRau(Y`H$?(&!2zpF+LnZ|NUCj#eA*fC&NRwWt*71I;&Ps0Y@#Hfa{Qw0>YYb*uCL2@8{U#J;i2z#KV6Mu zI;mQ1gY5LxV}e@wUYrrbH)YRD(nRzsNKbQTwCwk?U&0(0c5Znxwnp4CVInXpXq~P3 z?X1DBL0(hAkkzRh;`DkIL<7bzT)(mNmV;D#AMaA@oq|Q`do>nMN7g<~Tp7K|I!JXB zZ`_&ekjAYJ*Z5al(Qa10Yg(?ES#J@ab=qbAo);=qwCHZ!Y zZV1b$HI?y~Ud_W>5~XB=vTalvKAW32++4A=?%Ko> z0S@~Gq4&-C9$%<;^J#flKh|oMpSPmdaMPC3Gaj|9;{G`oJ%;t9li%KE!B+dEP77$Q zT~Ytpwu@j@p}DpiG6Bs z4-U!kHPQ@yx;oB~Xl}dr_`vFvr`U)Vqe$@@)MN_^5*U(WTM_X0x0*Lhir#@wazruI9aBg4A(t5Jc03`Iv1 zzYMQO`%C`?<8K>$xcDbmE{>_%RD@n z=6P?WjBsC>aQD0D>8E<*Yi^%Wa%!3j2gZXBHnnYv zjqf##)fF1L<>ZncZsF4SSl!l5fSUU>Q@YLAV#m;}z8RH9PuSb8P`um{8^7gTWoPj7 z{%dTgS01JIp6|(*3j8P+K6)M~t$m>F0e|TVmvla!wy!k`Ep5z5hB?;J0vk{}_=sLk zt&!fBr{IcOk%de8M)jQIQ!#DH{H10t>FqN43m$$Cn&Cq7wz0Zq1M3dHl*w<>k;&Iz z&=!iAyseJk#?}975z-S+X}_8_NWEx-OZqJ{mrJ_`!uzg8q5D&mFILhDsE3?G#%EUg zGqk^X<-x)rr`C6f^%-WTl9X1EK*N1nD|RY{ag+Mk?nY}@wwOh`fV*{i0TrsKQ$}d_IKRL+?7aMW+OFkeR=1Exb>#EKs-qp(+dec3atN2! zUgrDhR_C;Aep4cyuSc8k6?0_9R>}ygwDR=`qnc71ldc4ZC%jxzUlr4M1KnH^dzRbf z10tlzFi=fVWQdHhauJ{ePmh#THn2>NH-WFGvTTav2b^Dsp)SWOGw)27=d42RlFffv z)9|cKo$|`o_XA`3nBs>(yQ#Rs{)Wuu7WopLVftsP_u3CeSc+COMnz7H#WaYlvr} zqSmTP4=dVQw_>3ERcd?FfvNG>LREh^#k1r0+Zyu~H_h0w4Q$I>t$U^>`iAfFyUGK) zJB0PQYxTBgPKD7$+~Ft<{T@3S^%c83Y2}*h^!0AUBD>IH=g3IaXV#-{SQ=e)2ZSfC z2yA`vzRteU?QF^TSluJLpgjpi19!h|i*C#N0sxj5k!)7ipxD7VjFO+oY(0M-c%{Vdk{+E*;{aB-O zufrrqlgUK$pkT=T_zaID5o|52)a$KnpA=gUvo2zX|htn)v1!=bb)Kz>Z!WQQBKvDB$c zva6!oLnKadOZzo_y;g0e+j#Vj|Jl&)yp?R7GCOwbrkF999Kuq|G}}t{$y(Z2X-e;KNe(P{NLb`6y&OD&GV{>WovTPlbPcQ9E zZw(IRuUq9g*m+p>MpAdvok6)HI}T+Cg>HW5b4l7G{PW`oiRI&hFOoY}-#RIHk+!XH z)0k++`xGbT@}sBR0^|<~C#@Euf9kNs`n}fJ(odr|vD~wnWiOfA1UmX`&b2x9E;?WN z%wOB`dKc%>C=Y8rRBcUtVe_@C z|IpcB9MpU1fhrwaHpgJM;D~nn=BW_RktXBrL-p2UAN%x^ z-nVtkeG)ox3iIVO;kpnRg0a-NMmPXGov1jdNt7bs8cu5 zskB(N@RRDRV%31o`j_W?lbw!VT4ydj>KJQNkiK94W?tr4RJ{2K>#3zLTUkU)H&1=v z5;{Io{Q1^__fajHQ?lniN8WY~6*wW^*Dh7E=ZQMj(%~2vz3~Qd#p+(P79L(W z;8e1QufzncYeGZh)5wM{%f;aXb^TAt%7g@QUCd(@#ta*A^DV#eERhG<>g z5j&+<=V|Yf?mfA^-6Hs7qSGP*eO=`TLQN(tXG=2dHho zmJcjJh#Il-LlHp@>gZBBc9GeDOWgYKTXJd#MuOUHDzH%fhdg#(nbbw~pByK_<$cs4 z*PLHm9Ct?YuCcifHly8c)rXS~8Uy3CE718tRU&_%oQ70>Q>2ZH=azyZJGVT#YRv_eyVT?qTFlF_Nw4I-cXCtZ7Kd#p#F^00^rr|Qm_DsF$VOIY*V^3;+y zwW_P`YsEzhjEi9@FM^`g=~wH&*?5NPe*Lvln{?P0!Un_f8$V@0t_$ zT9_K!$@XOO)1tCdZ$?^+Em*fwDQX-t=xFi7qQy6hs26xJ_l{h;Tvy@dzrr@Uj4No; zVCF7QNl9yPa8aoI2iuYhCC{#BAG-MNYm)ntoHQOUH#N^4&!y$WA&pA461T1nRbO)FEeioWN{a5 z3CcUsVzKKXg?hqAvl7kbP~B0zv+GVLAGX(sSm$QaZ+846#d@>Ubmm;2k9jB0(QpO_ zA3m|JIl#uOacfGS=(j`4i_UwNJkr=1d$#?6Hvi~=Ut4%*WyTtl)bwYDl8xh19i|!QMZg!?V8VCFBGH5QE%Sfy5i84Q8lDOVT=UeewX)}-dwYu+W!;Igk z9aA5u7<-x-@a2VpU$W-YT$W>!TOSnP2wv=5JF=*oE#cD+wdwwZ5Eh?mMw2iF->tMa z?zJySR5*V5{^9(4+KC6QJ|%KZF)TU5dzd}!MN+Fw(E&SAY|OE^YQq^%DdQ=P!p*ve z19yvww$||*E+1Dv8-4b=RL$k0>bubz)@x@MfWtvfix1@gvJ-?}H<4@17nJ zf4T9(#@Z0JqJ`G}i9?B2N?$rO17B&rzW!WGuO+OksZhP{Gt(QP?(tK7DruF5vZsY4 zgB(}hu5D+TSawoO5=%*4^<5oVi#Z+`PEohNc6Z%=b6w4y z@!iFydrp7IkVz`_*KN=>8+pK!Uk^^?BWvYNm_CJ-TD)J7kwI%lcngEedfg8KHU|blc^_@ zxY9E4_Jf|oj~$-95ijREn{4*zp!18**@-JSla~zS%CmFkBE=b58Z{>Y^ucbRUH^Im6-KK;~&sMj*d3XA_c7a02(>3=Bdus1{ zNfw%>sPE<#Ug5VkoUw947QJQxpX}R-)Y>4gO?M~GioMJEjL9t-#0U?nEvgEgPTpCK zg{6#)2DhpzHK{VvF}n~bBt)Vs8!AOA303t5krewHDQjrzSsA+p2+Fdosw%w7fdmuY zDhY#{MKMcb`RZx*t5QDNOnu-eC9mn%jPI`XlGFy_vN1HfT)#4U8q;MP_00(F-%>>&WV+DfstpAT;Fz-c$qFer9ZOgVPB8aWbMhkJOxdU zTUvPmK3ha9-zO?p3ofx6>*Sg!3cmhnNmkWD9s0#7f(~Vr&L_X@$Cf7WTxv_4*?*y_ zcJV=;wJinjjtm!USEy$WRxwXK6SdcOw~kM9!^Pt|A=!I}7%!|Xev;{+QRfn6UcH{j z&YEFOTFR$7R|BrBbE|FF!RFKQv<_U%d27adl02%M#N zwi2qjGnM!1%2VG3u~UtwAFN=CUzc28n(LcWMW~{ETtJ)rF?+XAK;<a&^hw>ORQ|?E_4HfpsR2fHYRT`blt*ZGZ-(&tktVeZPVIX;pEOu{9Z~2*} zeZGUY8rMBy6OF#v=v(~4euyf^fJ!fJyi4pR?W-z&xvC9A6lGNBDjSJBx^A_J#IA+; zk?Ugdu%VEhYJ`y0x@m`Wx2(D|8#ICL7|wk(ys>O;F>L77h3e*54P7Fk5o=ynTkvwR zxcKn;S6G#QwBp!EVXlL-qkpM?gkA?@GAHf0=f-DSo>O;h92ER6aowYoYV8osck_Nj znOz@0RVf;&rwbd(UHHa5<(KPY#M*r!dv#2K)bn!l+slsi=8A<_?mk_zbg%fEXLW4L zb{j2a@_ch-D^pKLjnpwp-V}QlHzOhy-PvuPkCbd)e!!%h9+j_TxpL^US4fHs;b6VU z29|?yd8}E=Ob+5X-JA5pBp%$dF8%6*3;gzOR(9YOm1O)wg`u8r0Y7>p#Bu8zK0r zK>gSOUZTvglk5?6tJ)hH>bNv`B;WS(<`{eLY*yH;<76=W?V3XV^$(`z6CbTo6PGVi zIkh6)@56!0TxIJJ@!WOv3Vn_DrH9UAOTu%QZjDXoW*m~)eeEFD7m=x{9#8d3we;mj zzK&g=s&pr)zSBk1RKy8aE()W%O{E{ZU`T#qq*b!q>+yN#$2>vjH=)m@(PsjKr|MSK zC~=zj_01&L1S@eRQgXQ`*ol~&r!Y_3{Vs-GDwaKss%?u2{c(b3$T9jJw|lM{_d|nu zih654X*DVi4?Y@Am%^A&J#{qUSH4*$vYW$ufdZ`?Pqfv=GutR4hPa|dw`7IwN>O~> zx{guV>a(0oZ_adiQlDRyZbSIZSeDA5SG=A~4UTSl+>!3}2ZprNSBboiTubR%r@cqV zFT5dfsH~dFLgan;E9l3Q9`X`ZHbeUu zBx_hax0!wtf2*oBaNTR~s<#HM!FRSTdUqkZIgI7mqHf=^Y5tT|Jrxqu*(xoaQO)WN z=NP_h!zi6c7Hx}=SZH$1POwGq67Hgm-g9_pfkTzEr`7X^58umuqkSvr%!f}wC{aj~>@7Jr@WyyHcz7l_ zhVZm`+>*<$++HECxr1xRU0Iou&Lf>UetzjAO&3mQM&*0^uEm5-d!11$u)5uLA>G@2 zZ)TKtvsd#ajXhF2ExRSJ8|L11k>AhNk2TZ}Fb^;e3_q)((l6~B_&QyeJfq*2|I$%g zp!#)fZ(Dj&B|qh@ZZ7J>X$-V{8eiyF)@Lw$NHCOI$r(MMw0Jwy`>^Bt5<*=as2vvz zM|4h0u5$N#nqS%e6q9kuWb^Shyz<4+_E)XD?* z)-AQ}to=GLyv1@O^}DX5^GsSBQ#LU8oR(fyP0_1sQnlD*D_{5-R&13P<;jpF8`o-$ zOSQ${-c#@2a42TO!ib?54%fylkD`{;t)&!;q&L2@f0yA(yCjNq)f5d|nUW|IEvE$f zst%f_s_(2sOT~95f@{6+ZnP^8+moawY$?1g|Kx*BO8xg`m4+UE2v`uO^znXA(59yD zNOy(TQ)l^Vd$;k0AO4)t?1oLgW1OGwbXyvo9NL}s zeM6mtZ1w&t`C%LyL%V8UtPCrEMZ7_I_UR@&vFZ+Yr)%wJd}LK@yE0 zpV*s{FO)~nrKDecWUyIQEA!^a#huA~eG})I94#n{s6*OUTz+U79>7JDveEhBJ+76$ zOe-tP*md*hHw~!0(_z1%?tUPm&9eZD;N$*pG{Q6}_nw^p4wyC;$< z_R@kYW!#ajr^MyMgICbdDGQDIc^7uQq%dmfU&TVXMm9t63jh64Huaq&LAw_iL|hJH zT6yJ#cRyE)Sj# zYisR@J?OP0`mjAqgq-W@U!UKgsq#_XiW=dO=OoLJk{ z!@S?~2R4kXebxT#wwQ3c2VZoxhK=)@%e1dApUk@Z#_6 z{EwZvyZ05QJdu`ZD^S$K!7$;-^p3|U=gQr>S3RQ-mZexPY~98=exIS0Q@qifF>fLu zM(T9unx{)`zFXD%U`mTTUoEQHEAwrf-tLT$+N54=mf)u8N$Mh7&W;mZ@C?eEs_M!2uq{E!7{sw- zf9x!utm^7=p-MdbsG(u{TUS+_qH9jT=FR5=+}$q(xwuraEQ?OKm7%Jty8N(^?lA~J)LEQ;+gY7( z6)N9`n5z|4*t4Z=-}r*3Cni3>u?pxc3lH}7l?$2rHhTY}#VMc0v)UVid+U=4_2+hd z#i~+-U8a@VriD7O$)VTPd7oZY=o9qH^tH6I6AvF2Ua;t1WuMcK$4Gg^__E4#8bf(p z-_%bjIx~-rk1tq#cG=qn&es$jZgzbf9DGDQDV8>)8CFh-l~g3BrcN_#{!ST;(Q4?? z>I%mmWC?h6d#dxSc4%jOfnHNM<+qob{vBC**mPw3jjgTb+}zwLA`7K^nn%XUEOlA@o*V`YyZu^}(Spx|0d} z)-dj=*=uxObUP+taOI-Bk&7vfeQ}Wn|*zK-N0%?Z4lAT@7SG)V^2|6S+6&3b9GvD$}cti%tp}&-u(esZssl*YwOES zP1YRl*Xc@o`Yv+5$+$kM$gs<$hlZi*VngPNxLZ#fS~)vvO*`+{9Qu~9Hd*e-Ikvu| zd%WdUtMtW=7mYYf58Qm+y}eFu^&`nuF`vWvs{3B@(K=bQmQ38weEoR4#bas@BYN6Y zt4%3dRHhEmi$8kr7ZTppexXqcJ0ZDy^+wHSAH#RW$b}C+elwCqA0WDq@3YT)t?B-t^8vG^c)WP^0|n*|`Xmz*dW(I# zCf^9iiVPnbPTEU2D^e=9nR_WUQ{R;AWvj}?o9H*%uzP6Uy?DRP!6;{$0&iF@4JIYB z$wWo+;Z_Ny!CNx2wnrIjcBJlzjsHyV>aVJ&9?SFeA(290f5{8)C>K$MOYbbrlNa1B zVzIM4D4#E$dB)b+zh17%M?Xw^t*wYjj9pOmY0Jq9>5zSQUrkhfkbD-SyF>g!$*Qlt z{a=ll0*aDl;`Um3uU{3jZ(v7Brp;b^QGOmQIJFEIPH)b z$Kam#lG=W^gHN8hbJCu2PiyESkIy0UMeYj^r@S@4@!`dh9))^_ba9uk_=J=%f#n}x z^Szb5EP1!~oxncL<`a_C-P>l?P7JS9cgj!;aX1tw`Rsv*iBsNl+Q~MVLqol$Z1NN? zk%ic*EmO9Y_tR zHfEvcrR+?EO!rDIzwYdO@2NR4I@5e_>=tMJ&hzpr10Ijm*VnO@g$#5@iH28r?-0q{ zde|_QpSp#ENA-4vPi5SNBD(i0vP&%KqiH(x2TvEpe51(dpGRgAR)ZJb*RDV=AO<{Z(-xB?G%q4%ZKhqaMlS| zH>&SoO&C91y0dGwCrd|ve{4nmck@1~iK|lz*E5QXUdFz}?4pZDCCbA4Rc^}4ik4(i z8d;6q(RB}aJ&B1-e%QC5>0orpAa_~BcYZa&o0Lq#-|3!&+*rPCO8dyoTq*~PXUkbt zW`cG1SS(_B9obqjw4*Po-+xBn(Dhdd#mqDGdBPRUio!P;M<*2wUZx+&5Bn5uH}P4~ zx^Ub+>v@onOlLn9vugu#UfBW_ojk*xHtb8+6ppV`{E`w$&10prEAP4RosBtld|$2> z3FH?JYLo@{%Ul=y&h%_>X3?`E$Akx;LYIGS2$72TBp~&22Q@?JxwwwOMMuitNV%79 zXSdNPW4dZ$Uv=a2a=J54ETWz}yJW_y;}v&yO>&HtIq_P^}+Y^pHU zPtXf~sC(m5Z}AKvxN&>g?BfX9jE-wrP#N;>@ziLqaewOj@kvrmO^xhTQxCU%Hbc>F z=O(9oRykkJDk{v^hR#P+YFE6-UYCn@_HADkZFYBD`ZTcEZf_U0z=MS>$zN}W?-4JJ zv{*P|W@5Jb!iMJECIo3!QI*F{6mRRCSUQcFiZ;aD7wlf_m}Namo1046c)rBsY`4PY zXVWrb`#y(!d6%Z;{TLF)5H7; zF5g$(dEa$qg36lk@Nv#dOys#v@C+e~}8 z#8F9!0ON>g(c+fe6^C|AN!;oCpz`i>k{zw-M5n$=SLmd;*|7c6sP1cZ{^zW^$IR4p zq$0|`>xr^yNff^!x?-5f^Fxgs8mUiq9&8M6*rJzyeE03-KI!sadj0wl+bcULRl0an z;uhvRUwNt^aIjYUnWjr=yKiUr2*beU@)M1HXZ!U%3fqMS8Uyv#=CvNSK1ajdB2-1? zGamS{sp9T8e!+EDp6a$}$edtsD_sp}330o>SuyW(`O6D3d8 z@pUaaUmQ2GwLkCt?Zm0YJ5`rn`u=r!{{|;}0yv40-QfS>|2% z#jB(+*w*ddl5GbEw-0X~T1>^j_nqg9LKv$~*cxh{p>9KKmR*a(SgF}`q*HanMk?-$ zx;yu+AE(1q?#FPs8ho$H_z>Y-eqOqy;_JCWGe@gK7kQd@iyBBvimE7k#D3Ad!L^fn zRl%kN&2^nYXw%W$6UN&PEAg^P?0! zQT`A2X&#O^oo#UFX zB0Zw10#`O2MLYG@c>n1qYj^A{S5OmEt&XQyu=RN9&Ako-wG>yT*PbCfiD*0M z{h?}QKIg>e^aX{|ZIetcPC`WzU)<8-+rQb7(zI$Ib63BNB$HM5n_;)}->0e@%O`mn z;wL9f??!U+%(MhHo86euUS^)f$`GHLy12MPbodLlTQt6D12(hJlapypl@0s7z+*Km z@z=FhHbw_lr*|BT;G{kB-EHNB_|n(6l@BfMsjbT8E59Fl#8_!3?`qxN#c!83Har(p z&Jl@85UJc8DmEH^f96bB%!{}Avh0+xJuM&oKC{rT3k(0|sQYkvOiA8EO{!BC8=FY6 z6mO8ZRsJO`fktw1s>tVp@in7m`X-ikfyuQi(`}@7tgvD@B%Zn7Wa)m@$Ze~9F1+H) zcGE2uskqLiB!RB1@D{4ZMGZlx$^$r^eeu$6k z6?^S?VSRyAx!q}V3-QFqorgxtUTL!L^FIEb^Uj*C^gB|HSeVpc{fuEk=d(3Q<9&3d z-QQNRi<#JT@aa0pQ1%`9uy;KEOmN+x*QayCS6R9zyY4ekJ;;a*XinR@xn-BZP>%Tv z9!tlgY#qyEM=Nh%mX{OPThDuY*JiDZOK+nADTijW&38mq;k3tvG`3{X3Ue~tuK!X(mf2*YTtNj z@%Q?^>awyjn?s+(XiDxhoS9mz;Nj6XRCDNU7a#jIaiuG2_BV3FK3JNkeH8qt;tccYhdM_}XD$dQ#bxt4Hb&YA@-tF7B6*Vt!wqeqXTSX!fsZ{MEY9vwaXwzhV~ zqAwdlLqcqGa&mOCFJFGBC?|JaK|!HYV9}y-D!pRb1q((H3Aravo@6E`C)+Kuwzn5x z3_8KW$QYLNXiI2Q_`=(Hm3{Vm`#u~!di4JVt_e~0ue!UtYi4I>tA~ewhpT&gd&?oN z=b-bvwY9aRy}iAtzrX*{#Kc5?NlD3r$;rw4H8nMN>+9=pTCLXXhK7c8qtTeGR;%Md zKT@ew>S>zRnoK6Yii!$FV`HOeX=&-3uCA`)p`oE?5bsl%M?p_dPr<^%!o%g|Wh=yL zZE0z-!uV|%&z+i@$|)~@FVBHzkX2b(nFXZ<;v@Bhzs!B!sWuYrb z`9NWX8ZAYrr3H!#LI@D>0gym|Kmv)!2l~Hb=S7KaP^GF;j&(G1=X!o~?!D)nduHY} z%_=M^DlBekYf0fkpnE+jDQZeoCqlm*(N2XHIikwjMNk3Sh#$k12|6Kqy&f8H=uKRo z0M-Qk+PI9%xV(vfOn7VgU-BkGQlr98--2~knx-h4rb&`RRo{V?uM(4(KNz>Jm^ma(W|Rs<6bTV1WeS+@ z)W2$DV&245^XfU0Bnt#EA}~c^I8sVQ1~V7GVqzj5j5BY4mNbPhN##r?g~AS55Lkh# zY6Qfdbuck$9&nykO=Cne7|PnG3sf`I)EXoz(DtQ;29*hlMpm0g0ORv?90n-Lj;WQd zMT9WNj9@Tdl?j>ZvMmj10+p3fzy!Qh&j+&12$@sv@>i7*kx9A1V0Qs{B-ih%D-%R2 z%QM#w1LN|4fUB2fikqjDSNRt*D$>RvWFb!25B&bw3(!TG{H}2b7>|dgSUU$0+{6?| zxPX&??1#WofoTy3Um*M#TW(B(2b}SJN{Os#vd9!orh-5xM`p~3MBp)$UnW$OG)fp< zEOJy-wS_^H z^^s8?ACw>AiUvbrb#1Ld5vj1on3!i=O9W9-EBTCVs8A?XR6|Tug$i=GrWReUQi&4b z{g{Dc^0;{)AilIRo6Y5N`DZhMN)`DPlOZ$ms~t>W)qa=DX0uf~WRc8FGbZ90(^~nU zR++ee*cM?4B>0>S=PtkBAroOL&a<;krl|_1_A?k5muEKGF;}c4;B>p)PSac>QibC{ z05HNtvBczbXJxqq<#2Ctd78e&WAU)KIUj>36gji3R%=#ZF4i*-xPa5?1hA2>Z-94s z-F3(};yk-CKF^r;Q|=YzPOsHs^*Wg#5DYMX;P!g609-_{^sCTi!L#zfdpF%^j?c4i z6hwjMP08dk1>Q`jPwCJbnH^KMqABNPX0Bh4zUlBDnt=hw;hA+F4+Dwkd7eZCJtsT# zw2#<}HKTom`t%7Lig9iuT!te17?n9mD25%`^N-q2-U^0D( z8I)TR&!44$AuvrmKmw+6WPMT|^S^9=+a#W3D|Ks4%S0k5UGaJFmvl>u!WnKaVj%Dn zf;Ie+iAM`src4TFLW|Qgf!4MpANBu0dJULI6V6ZgM@!dUf^$9-;YwwrgY#6GX& zSu^7LACC{8wNQa0th8FDEh{U*Vsqz?iX!Xr@xv7stF@ECtGX=dIp%or!574TQUn9# zk`?n*buh||S%O>WJBCQvuzPDfV3}UQV3Wf> zQe^eT&oBA}`mD=TCAwQ6Gr!e%lH@vk%l zgZ|k>pMptVOLTSP?{B(+t3sG9gh^E}*a+{T3&6|c(>E&^oL#~zBtw}~H!lG%W}tHx zrXS&6&=%YTvzVOgdXK@G^MacqC=i%x2-kTBXD?BGfF-sDnnDJN`$ofm!V1_YH`MY% zMrcI&q6om1n%tJb*-KOp8Tp8_o5H9Lh^)kNbOAr2euhiKd-6>qMw_s{GTJjNS=n{- zdA)(9#7c92#)^w#wBBe34x!;mrd}HaB6yo7^E`|&0}OG;WKA!H@=XX~-_YbGQJ?BS zD-udmX~-~I!W-&LPA}$vj+YwA@pNEXx=$zCX3Y-|vO*O#l{TKdEE#qTHre_)3e16t z7O$Jv8LrA)F1!#zYPDK0R-iWhykG#b-@1T!i=Uq*V2Hu{Ay3EmKYF(=J#x2JQl+tbpF zoHp9HWO*?nCURJG*nhrIC&|-a_W6sxIV!1Ryq>?=_lSuj<@JAgBVH2ndfvFat?+Nd zEvZo*{9eqzDPxIJ0C$hmUcLIO{rmTCzI*rXH`lLU|E3j!B)Q;!=FOYG$1}e^eE9H=jT<+v zjYJ|17cN|=t*WZ31asi=+5sD)^EYs2lnrtJ$tqntMY&P9^mIxPvVZvZA zvOVC#6I#56wvwB{i1uMH1o|)-X#sE(3bu3L{>LB&BNY1H!3@Sx=*vMTt&KazSc<#E zDaO@c)JHuA!x;$H>o6E&p#>QXBdDEFKJzdbv2ZQOopUdds~_G%%;h{(0QYv@21EX(1xB@AoO43jAb-eD_{7)LYc7O(w)qAy(mfU%Rl7JwG}v!SBc0d#*2 z-69rBu?Dw&hW0b{oL7dj=M|v@`-pI5P(%C3*bby=i40VoQwAvblMFGszZzQ9X%OA# zl!>}a!r)Pmd$bQVfJd5Y2ccK`h;Uo?p=A3=+x%Op5`Q5TttfVNmC_!B3wb#6Fw!g!94^>(*4=c0zG3mR0R4b0cg&35U`w8Spxj{ zMY!eosT#hqrhk$!q8ABd39%LfAXmcV<%McOaS6yUoq-FB7F3*lC?99O2~c2*B?0cE z4I^n9Vv{2D(I&F^aE&7dCK7^$k`N;aTC8Nvp?{!Idj!UCnNT|YWTPLCkB9>;%Og~bkOUKb#Y+tX^AQ`RBjyEYv38jcyilm~1EdDwVF3$qg5Lmi!rcGr1V?}((*jkn zq~;4x6qEy-(H*D^6(y`_Iu^)qwV@TbyW=V20uaoB7JUU1ictU+%Xp{=iH8CNP=I{j z4%bPt-4;!z9tq2cAQhq@)npMcuuMQs-k4?|Pq#>b?0G{VG(c1)LfsLTrX~#HA4GhB zyodoq+j+$)?J0sxQ<|Hk6$~PZBa>hu-G2%#8io*vjxg=ewn}wR0uaoa1hvp&YA&Pc zB4K|=dMpiaAMwE@m*Inl(axY`CyQ$kxdI@BJ+6t7XNYz6u?Kq{^idD24C*eos3uNN z@H9&rYIIbT!6*lb%Lg$S%0LD)mT?^_7BW%F7*vCb_(=2%vJwU5fQ7AQXXj41kCUY@ zb&gwtGMU0Z${c#A8fH{%k&6f-TxwiY_!M#Z#WcwpXo&yTFiZ%L5+U}Ft{@kXHchNSqJg9cjyipW_MNO1^ z7fLPQ;OfQuNQ&U7ATO)3ygwRbbFKw;a_#nhfn>M$d!6>g`zV8`k_0lac6lEyheC|U zvpSjf*jh`WAdmlzco1LCkcPPl8&j|Gp!QCd=-LP{g6Q>V;KCNmpCf==D5r#jtCt8M zDT1R)k}|NeWmp@5;FRu-fS(Ip)a`wO>IdX(jk*t0|GXf`Mt}$?47szR#Y#f*jJi05 zy&y0TfjXFXe!C0k^tKC-$fIpUSxc}FD-qL54V@~}7h^nR2*!BDe~mE_hNm4oi{N4D zBM9RC>Cp6iszleJ2hT%jxzSMSFt?dFb_qi~Ohl|245~&|oHEklmwp5)Vxo}bhyr>B zxQ`pkQqDX><~u0x773KB$S6_+<{orQMy6cxBNy z_zp?8Cn(u+bwMu_hV~Q7Dgh8H0hQyTbhX7B&!j% z@mPvd7-L{z!qHR`(gcw(8E#_%t62M&DzvDv7F5&@kFscP65YZjRUsfHZ%mI98AwO4 zE8$vQ4$rL8YCuNduq7}sOwO%tG!n6W*P$C3MK&`Ch;9NPfTlb zD6|--ju8Yaegx|QD_&2KwR>ayP^Wmh#p^ELlige1oEEYMT8tQSAsAA>gjQbxU8sW# z3>7EoXhIJ+5+V8uy|__x32>t|WO*+meL%wdh=2l7a44WuLWMk7Bqh$A0>dbr#Eb|* z5+uh$Vn*_KPp8qdjNw7VLW^sQWSK(xK4PPIHY)2=3y$*i10E1zxds)Py`ZA*oDm^z zH-V@mjbue+`81KC7$ihXqFcQFb2N|(fspzwv@=GrCiDb@?g_2mBN9Zw3^>Ul8y4am z)`b3JBoG0GA!h`jR6}J)g32%uWMU);I1V8h79!+-8Ue&cv20ZKCr1FLg81GefC-#r z=S8Dofx(fEEXK){$8?zis6K8T2%J5dwFP6B5VylMRxlX0V0m4jMh-IXKf*N@oQi#* z0s_4aFK~h`=W<0h&I#Xh8%C+wP*ITspe9zL>Kq1jc!n&uvm)7lb$X)pOa{0+qVfE& z^=ZQnDF<_spiQRM%#;vAl~EtuKT&27w7-3Eg9HR353WVVvNpkKz=~RsRfznE1H)t! z^nu}jazW2c5Ft;LslP@1e{ltwh-Rf0vR z#9GO7X0vlEQNjd}j}=XXv~ma|i|y}LG$Not z6s!(Dj)qF-)|s?$5>+AuNst^15%xb_*@%te*{H0~zt6205#n}!6-oSk7YrcD6~lpP9NiHC?QfGb5)jZrxRz97CFyw_IEaV*hy%kU zNe9Ah6hUI!(~O=;8X-^u!pu;E2WB{qk@GChBIGAYS`x;Qu8eN+x`CGWzxIZ`D@mg? z)Tmq?PT=s+WI2(Q5{zi2a6;fZBFb0-2`YqTC*1Fgwbz3%av>;EAApvj&Pvwv;R-D# z$=aG;Y$SgYAq>z7S+S6{^>@h{5l|pl$1eK1ADJ`5t zh6q8Dp2Gg8kwI(}PjI3AcacE{;wl!K1W9QUD>7yr`s13xz#+ahkPtb4jtp`kC~_Qy zmVYuUG7D*N5*hCvks(6(AuAGLKSkyrw^EEBBA`IzUJocAq5hYxRA&)~AMkunR6;~aE(AsDkI))TWd+NE27d%C>K@c1SVV{sJcuDHmVXy4L_mSac^y#HVbT1jU@fLq z#YKm~A}S#uf@Ar|VEyr&gNUdi8;kwfTd;6PCfjWiXppVVvE6q)dg37faay%l=N#-3 z;u*kz^)Jskfbd_>IViQ2R-_IjVuifMiZ}b5!<9`9*AXSZAXM&oMj(^g5twiZ;L|5L zvQQ?%atkcsCNjaHopnAlqKVM-Y&Z{L#Y04Ys1fuGgM$|f41c45bXe-(T2U8g{g5Rv zOg0aci4aJl2+!zvL}KFZf&+U250?cJAU_iM0a1`%x0R8!%nX|L6trT%GZZRLrKM0& zSP9(chZcn(jtF32i{&wl!9SKPXcjQ)e!kIlrX~rWY`wuijf!@yQMxZj^FtR*k`j?w z5JHa-*Pt526eCatD^YnF(4xvKp<;ZZQ8y?MXO@~GdX%TO^e7aJ6(P|}2uZBE0&rMi z25uiMF25XxIT6!(AO^7znFR3%Jq%o|-*4+!x}pI% z5AZPt%U~eH7_5Mb;<1msh=shIMV1?0D5A9(NG!w~gn2Y@qM0Zd0m`5f04*59qfi)B z6f}*SavUT((vX&iEU0I}G+?Ex1&pC?D=F215=`s~K#voYfUl%c7>sAY3vZ&Jk2+$- z(o?txJq``4g!Z7{0e$uu8!wTYG2kb_1C)<~#C(iC+QMlBsuy7Z5160`R$_z|O^ZIm z06c?=1;^1Z1=KVHQPXZi(t!8Rh8zQKG?J|>gK@G)pQR_0$mY}&9W6N>o;D2FmFQ^= zXlN7BQy;Fe;5gn#+lbpqdw`aTnqcX+f&tW^oHM$MX${v1aRJCNk{EM@E0_T*0aS5^ zmVEhRxRA0N3oK(9hP*s*jl7&nB0q~)2nH|E%oW_!0&#Js4bA%mc+r~}5#$$}`Kys@ zXj&4X>l}LEgf64|jevy{dIMC{rvv&V+8Am5*`NmCf1U*%5djJer#)0uK#J}=(EXks z9s%RD9H3w@ROvpsr$_VSUWs_K=)M!(H-SFr0|loCbw;M&s7jib_@3C_4mx)Gp3)s9 z?m$p+PV@x~Bt=t#W_6RU=#mhjk8--#0?vV7SF|(GqXx7V@HYjpRAv$TQ7Iw`6#}Pm zD8-%-Z)sL<8VMR!3FDz$B}dI7rW?Xdj7ua`bOD(!XauJLUGoKKKGM+ibRkjV3@Ng^ z!yA=42&){l|A!Hk=q04oaT)PZt+c8nj5y8E6h+wS{t!kaMfDGGkpAC<5hbBQ=%{X` z*kPpSCF4Ja5urH^KzNce{vwRX9uHGQ5?*Q&pF zYD7|0zl?+Q|0awm2^B&|u~q8!HS71fV8DM2BSLc;z_yn?LwX707Fh7O<}rCAyE~l! zUxH?G(30J(41EfPgw+|YF+Y-g=|cC3+i@zOXvFAg;WPG1qYOt0XmawQ4#dNbRC&07%!qZX^B`l+OLR(*3!I8#%{1p5N=@5 z5un`+o}u8GG8)<}7(-%Ds3@p_?t9Vw%XHtH?vqL4L-+5~hI?2tH5&e7l5wX}TXk_eVk>0k=R!K;kJ>2n%`!AX(l-k5q$U#51he zf_zqhk(jtjv4^XO^$3PaU}(@olTEt8$n=kbaik#=hu#XiuqX7uW)jOeHAOAgbAa~- zHn|5F@e(H%Dp}S$7PCt;{T^V%#R!HjMypY&NIMBsJMkUtqXBdGV~DwW#JM*S)4YYyq-?! z2@Tu#f(hbGvYdNDb3UXZd@Q`to=jKrFcwIwMOI!s^s(SLP613O#B|aU_ol))&*+zocP+bWC`&dNigo5v$5JL|>&|9nNKJgx! zhUzT`Oj=FmU$~E*I`JI`7Lr?uGQ^+zVGK!77`7;k7(jeNriFJG7UemsuO_FSn8=Wo zLq`@jVGW{L=~YEc=5!yjtHY~qeRKG&6I9|peBp-fAyJHgYb?Zlp>WOVzA(B^+=n4S zU5)}KZPDMmFQUt2c5H|;y}1vC5d&ypUAt=!_i^fp?n71%9a-GHxR033={{s%53k>& z!G)8dCGHES-9g+J34JWYeYneTx-Ww66Zc_AP?vVPh0DKpUt|yW5oLOF9||J|up9s% z#0Ndx$Ehc}4_P^MWN{PL9Vz6C~IW0!!fXfsp?UIt|>I#_cpj3Y!ARCFuy61xO}-V!Q#w-ZfA7v4>WD~U7L z(X9A(8(9$+S&@Z6_`!YLeFi~A?wxcW?_r;uS~KZ>A>AStiYGYOl5c%b78Gjh6oFBM zkJD5%!4kebC;P#L4;pcE*9m94YC$iN*W#=|RgjLebi0!E z7or@mcY%Sy7{}q-zx)$XSg$H@m43`GB7$2h5OSql@EWa)d z_5>oY4?|dUPh~3&p#?3@AC!Vn2tgpbmInDf%qU1TEH@U?Epnk?!htROkBYiTIn6?S zqu|Sk3=o2qHjA9?h*@YkLF5H;6R5qJMP8@TW^Dt-&@;p=l!8zQK_LHZ7IL9r!h!8S zn1%XccDoKNSZTAi)4C9|&~k#P0Oa0Kdozn4CodG*tQ~O4X%MxbP%z=Z z_8-h5`o0AgtZcJ%$m0v{6*zOya)PLC4cj18vU1aCGll{kW~~@%zV7ax`Dhq!0CMqOn z_lw2<+FpW*{)+wYy{Y{ha8$bTSMa}3oH8)}*_)`Ny8W*{$nFssIhZ!NoPnW| zjeqtgDir-2B>W#au#gZxgMK0>5?ph`IGLNUBw2-XZlZ>DzheJ;Z(9Eb9F?Bq@T&`+ z^CfIog&2;%QR+|Ghxcc1 zM*PNL)NuK)*#F*}x#p|C~HzZw+*laTf0 zI+?io((pL4U>*h0Rs9%iz^OW5nO&yx|1$@4si-Y1upzXST5`?uU<8AZ zfn>YwDU7w&f#G+;`oev*46V|3>9&l3Ul`3`_<;GfU;r9&4O-NlObnt7Vlz1jdb6B- zQ_N{8TA9HioPd{&1xZkdGWseEh7~B&3pSIH{TFUUE5%&9E$vNMni~8y2DqmeVT_1h zWEuY&L$oU5FNBFqf%htWJ%mxyR7IJ;3mTb@Xhz*%pquD37@GV&(7~@{Hj)=9zmdi4 zn)_&mrQ2`(CWayE4pQ_S2BW3-Aa(s;RlgC|B@2zZ!ji?rCD)xj%6bZem$NE8{RYYq z%L;x8(yuW>qb9ibVi>L|GW{;VJHFNbFe5Jfg)p=#sW)L9vh?9`${P%0_BQ>l|AjEL ziXT!K+lRe-G20G)i2D1GF9{1S2z&kY2Lw;{cPai zsp4b{qj*quT*W?#JNU8>&GruL6R!&s-YMbP&l9Y}gPS+>@z~|FLMkJgH?a+Fd1r#(vMwr6nvDHrbJW&i>oig1KDHfW?NYHlKTW+J+sSX#vax-0uT2r# zB1xv~C%lMnl}p9;$UE0d*j5E?Vrh8g@#+lx-PpIi7f#{*kyR=k*iO|Pl#i|74?h!Z zH!D;*;V+Jptt7RvKkfctb8HP|O{}r)e4l*|n~8IOIACjG>KudZXCC9ISJVY7Ny~y6 z492c~M#J%EN0B$*@#3iQOnF7z#`LVOC}96Y)t5u~dlreCQyg(`&7C&fAAcCJ{@(X< zxUnxEnOBP6cHeb+XM^-YcV|jcCf52)%;`bCYGQbEWP++6wubc~dvGTyxM=$t)9}>6 zzIX9{iR$vz*sh-A=Zh^jb?gPU>C>;y!);D^`~Jb0-QIt>a2yj4pRQm$=7dq^;i9;r ztUf-ThZ7CUDhFRL|5bL>8=J}@wq8LDcbi}@e?Kd{wDt1y^YXCruvz8g;zILD9tM+YvN5+I~p;S(TlRRo`)OGKNU zMVpVnqzTayN5zsVOQ?dEaid+fh)tc6a)Q_M;LO6Z80m`mq8-(Nn}->HY!~o~cqzgo z-C;C+ApeG!6IzD(eX=vqtexMO5qsJVs-2;zYVXL(c(Vi zq}3$Wduq3rC{*-OFVYf=P#n_4E;(f187xotHpLASvEtkR5by@o?GqcrJ z^G&a39y?flVtf^&s{Q-GLDLQL*MD(upXa8UD9n=Q%=L za2Izj+-!KMCC;h?9AQ;s@y1p^H_5p#7Zb1f>HFg@v&Zg1jxmFKX^@3+9NTml!}12k zuvEi6C=uc?9&rKwP?x@+PPda`94i)mNR~t3I^q($Z+(%?2ff7%Z5Y6c#S+?B_B9Jw z4j8eNUjk-*)+OU32w(}-gL@p6JxV^QXD(uth^r@Tt_Iexv=-P#>$1s_J&GkFD9Jz0 z%6a)rvEtJCRqC$MmXSwoZ}l_Pbak7vB~EwFV|PPAk0*}%g+A}yeD+k8M%Dc45IaiS zS#ZPqg(JSFRT@m&(kEThZ z?|2m@Oq}R+uWDD#qnD8fX1sjAG$z0A-5tR^kF~r+H}BPr2wk=7dZ=9)^GM;R4vFs# z(>r*Ji-rcT$T+WOA1HD2$gQwF(TOn){M#fPr_{*wy%nsvp|bC~^w$pS&JD{{y`m|l ztRa)URMYg~;cV4)>5iu^dMa0$R~B3}YtFdH42V5B*8P%o<`lQ=1 zek(kxT*8)5FfMV)x()%C>5)42K<>oXxUbRz@3^sb@fXb|=AVi4VD=4h zicD6wbZwEUTYc#JfFj%M@+8el@$4_d10Gvve%p3&RMLB`)`J(#a&6|ToE@_-iPe^EB@ zuw9+dIw7}>j{=jQsaOUxhh~0nZAoePet47W$6Sv+SBI71gR1b#La!e%|(W-^=}n6eR^!=H?YftnNFd?Z$US z56X0?uVrhZ(5-==cTZTlwC{tI!Z{MFw`7kWKK^Zx*301Nbs4W53=*uB@4TPzIPAfe zTjL)1Gi@YxM9IIsby;&qT!Hp}kNp{EGwSbu`Q9qC>E6oZCPly5Wy`LF)@~GkV`jpP zKDc6tlJufGyN;^PN`24wVg6gAE%y!wOjq2IF;ifKy~$U<>YGWcO>gdfdE^jx$M7ec z_vMRCIDBM8UGb3I_r7tVU;J{4B~luEChW0UA?5V)o$jf_OsCVreZB~lavMi%N^-aG zsEvGbv08YIUZmAD^ALa8?iQ~P*BV^DC#x8q;a9Juw8j51#NGpAfqT-l)c zXzUKx(_&-qf8F(1(lue%(xSt0JpT6S`76FU3s+iaiCQKfdUGOUbc~XRM*Yq+@0Tq( zcx!Y_+*$oyWriW&R~=&3NXL1!c5h`@`z%i`SbrUhcTM)b3!zsy45HuguP+=lM*Y@>K;sTWR;j z>qPOBb#IntWes*vy_p=RvnTyrpjb{*rkl{T5d7B<6XEwRnn*3aDsWU@{qO)Gu6WkR`D43NjK%Udcf_Kiz{m)vMiL8H5OMa$_-OI zq8xDSl38wAcGljbxs~HKq`x-Z5H{@9$gSJPDr<~astc^q4hx`w;$6OLi$tu=*7}8( zuA{^Pq}o3gTpggOtRbveH#Pg~5_b!m%x~*1&AK=)w{qZybjO1H#3zFeYcu<6iNz(J z>$hh>_SwO4iK6|qhFFh=J5R^fwV1q;3SDfIx#WCW;w!1l+)5rWWx$3fLs$96mdb+G z4JMV7czksaLxxMw4&knw3(9G1cp_tc2mp@xKd9rgmQilWyJR-;NcOP4mASxvxnG-4 z#JM!capskFTrE2E`*P+={L0ZMnnIl&f}t>+GA=O4VS zS-$A?R8h6TdPO0^`ON#bhqTUI_CfpU=B9Pap1uwr^0c#7s_4k9&iJjL&gGtVyE?ga zwyQ&JaFMX%osI`rs(%Ex?mbd+f7orI@T*B$Iw#z;n%`7NTpOS&!PHgjsC-)D=4PQX z_2Llo)q*`Hf9g4l*8aVhY0Kh6H}6 zgzYz;kJ-MuuknE61Ir&-UAmvWdGC&6#d!(S7Jk02{eGx(>4;5E-u`9pt<|sT2x|#M z&0Tj}V6oWHmYF_JHWm$W|C+{>tapJgAhcHB%iei8?8u=qmz8~Fraw`&D;RCR{US4G zpy}4M4HM_gGZY-MSbe>@x1*0K^I^&Ut7Ecs#wZ=wCjWR!ZDf?uR^bs1w|FUaZ~C7x(+?s8wbxi+c) zi;%|wGgLMnIj8yES>&YYyH`oh*42Rl35mliF}hC|d*8s>9w@Eprd}i_2J8x@wMbm$~P< zbsH<6xJ%sIFD?Vib-|drm0sI)mmPvLM`m_gw8hdoM?iSJWmSvN0TuDH<~Et{6zllr zjM<7wZo5)lp93D^GK(!;e;m&4+v0wrGPxhq@b=rGuj~! z2y)!EOGUx~30I5uXO|ycX?7=EF#o3Q4$xahEI|Hcv0|#uK{yy?WsjcTFgbPTVkTHI zw$466Cmn1!o_(JyV4h9p>72t!$pWpxvurXSWo19@Q#lb-*df-ki4n5ECUZ(wwggYz zNH8=p{Z*Z@b>peZU`VKkF8vUQs&~svZpt^4wQs&%c<%L;+2o$D zSv29YZ~lwi>-?o9S8B~i7jz!_(W+2#PPynw_Rh9JRuwe{!#Ynqzp3&4!4~n){QKCk(Tw=MO!8J;N4R^I#T7| z%e0hhZ=S5R{@k0HxQkjcFhHeX{kAJn~F8{`Wmqz244%%ubeK$^gWd50lEn8gs zrLT=1ZHkE2>BxWBT%V^yfG4 z829^c2@`m$GDmhy!ue;n#di6BNjQ1pEKj!O)6)l9udG-hSbIAE$cg@QU7C%}ED9xJ zl53Txlokgx4OMASn|{KgVoQ?AsXL6#=U&w3)mgk-{fUb?i#hGyCzq((kzZO8>^tQ= z$83+hkurMTf-@hg^6L1F=d825xA4ShAD6S{w{B!5);miTr>eerRe1K0J;T+1@)P4Z zQ@nNs8+1IDbG>nOY5svYt}mZ#kC}%y93Qc*I z`%tmp%o+1S$IRLr77dSn{ax>_{?_>>DK|lp>TTQ9&<{~9$s3={ zd#RG;A!Ii3-j`X-QMZ1q6s??fVAMJf5lhz;(aJqB7E;9i)oQ`PX(lT)`z0|3g*jYm$%QgeiM84pzhg))|rpO;o0ojqqe#15E5@FLd>Ix=w&PS{z05NZJpeW?qpmXjjyq;-2nx_uc&Mk`5k+yuA3ucFLw*^G#jLt3(U2J`byDoT5`s=k9!X>T8 zGXcITuHuB#g&NQ7{y;fxO>&Ry}@o@7m-l;=w zF~jvr^LFGW?+zL*zC-6*zlz$9%TL2Do_+uAsd)dwz<@6^uSwOWTh>+-3cq&hbbs?G zd{p6UwbFNi;;F5%P7T#>FLr3_>9xJyP|MWrUvb;N{i^S=vq#?Xq?o=sf2&W*q)m@s z&(qc#r`)c4$Je?-SXAQlq1_LLCcXYq81&-3`q#&suYS|1p5!%nSjsC|#T3s+w}W)O zTaQRc?Wxk#TOH@~usucxPGChxekfFQmXB}Ta5}Cz%X8^%|1s6)?3BXV?dm>deXf{) z*SO{Y^Zc;H)1OZ??uhyHvFv_&%(a^<7i<%hcu-ce<^0s6NrQ9TAFK=9@u2=yvxP;4 z(u1{=nx&LHJZ79-cjn|QAz#y%v1bN13eMZ^x%quj?3sb5wLdMIx5Ov!YFXmRhaW<# z-y6(Zv-v}Kh=~MO%mi00{n@5_^dCEWlnwdOnKo`y%Fc{*=IgMGQrFw{@mwL>r%f`| zkY4ucoLN7M)?s`y@6**Aop&WY5I!59Z@6~e2dNgfEPHD^rIuaU`7T$*!t-(;SlGl4 z2|KcT|Bk5|_1lm44~x0AkFVm5OQCOKfI9WnHTSVhL%&ydo5eq`-ji?WswERLMqre~ zlf7}D+f~0$ycv9Q!EL7G3-kTn9p|sg$mmoZb5hLOe(bub(u$@T;wlQYigWF5zxVMz z>gKPkF!sZ%AfLfGt78K5PHx+CIcf2NYqe&fC*OxIxF+jqsrY?j;OCOe^DAaAxwLiL zfj3u27V$kb&)%GtVtUbkyUUJMI&EKeH+@q6;WA^%sv zJd^kR>3NyvS*OqT9phCrKcgxwOy8=y_V&4l$7hDPewI&)(4I{TC# zH&9|{DmZdI@Gx4qSd#A}-;4smQ}O}_M!B9T*)Xcaa@yv*VJ2nUP9Li|sWwuiX6dc1 zC!+JOZxvAV@r@U`DH6{kDr%>|yeOyO+q7=Hv$|@r#3ftXjiXvGemq!w*FEvAMd{O) zogv1ncMb(zOV#pMFi!|eZY^;s zmZjbbkwus8&f#Rxn;23mxR?JD^G|`-^g>a&aYux zea4!_`A0)GHu)siRBZn0^W)0?WtB&yJCjXw8pU2a z;PQ7D6W+UJoE8VDh&JE|8lWJEi@b{R1ImA@YH+-vV%B{pszS@(@&F_7p0+~PF z<__@C4h{EuAUwE8=g0NI-wMYaUNt^ycSvJ%htG(hkjtJ*AZ_;IYp!u=Zxrh)Tn}^w%<` zi4`Glt|(-D)>ysy{S{f8{oC?3de=W#Q4x9g_(|y*w@#KFR?8c^{;-wv$TPatr}O6u zguSa%EFRCi`*_UZhYQ9}7(8b0=$6midoC}sFLWAvV#>Y#-aFo^NI%#5!dmFK&V!vr zmkiI8TqM6b&giAd+w(#pGm}zx8Q2f5H_LfC{ISlu{T0l-ic^s`GAfT}U&-|`-1q#u z+U2kjSDG$VYEkYX z<_S$$I5KwknF?-B%4$`Td&Vu{gO!+^^U%`jL%>uZ*HNw6zWvK?PbXFJ1g_#A%DR_@ zG}%BR*g7>>)VgvtcOpBSp2Vq%C&(6$OM5H%(4!Bm)uf!Q*R^*% zguCM<_ZZ)8%Borl)Ke$ah#Q^{o(PL=eNLi1GZ5f~qK-vA*;F#r)0g9Enf0nW0{EEL4SjLQwlq8rH->~8mGlf z)f&_|GdcdN()ZRCj*SwZD>BAR65e;dxk`8a=N}*WLU*|p{`jO{7ul}6ZLCg5$EzjZ ze8QOFbMteHR<<{u+tjZqxo*_=`TaMWNqKsT@hD3sS*X+$#J!TgIYzO{JSX;TeVlkj zMA(lPZVange`i?`Yq8ch$IllSFT?JZBR7)}<)Wc0%FT2j3zOUtRh<%{|d* za*NdV#S51(k67g8{jf;Sd^Py+!SlQJ2`#&~@X(A^pA4?H&RnfE|3Q_Mr(w*X;Mx*z tt>tm@%~K3xF7J9?EOff_6qBn{)`0a2CAT5`(t@>38=JWDo4C_<{y%)XJa7O2 diff --git a/ElevenMPV-A/CONTENTS/empva_settings.xml b/ElevenMPV-A/CONTENTS/empva_settings.xml new file mode 100644 index 0000000..d7e10d8 --- /dev/null +++ b/ElevenMPV-A/CONTENTS/empva_settings.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -373,121 +108,157 @@ - - + + + + + + + + + + - - + + - - + + - - + + - - - - + + + + - - - - - - + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - + + - - - - + + + + - - - - + + + + - - - - + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + - - - - + + + + - - - - - + + + + + - + - - - - - - + + + + + + @@ -558,6 +423,16 @@ + + + + + + + + + + diff --git a/Resource/empva_settings.xml b/Resource/empva_settings.xml new file mode 100644 index 0000000..d7e10d8 --- /dev/null +++ b/Resource/empva_settings.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +