From 3e8c4f8b4884dc250673b542906dc5568b92c840 Mon Sep 17 00:00:00 2001 From: lmintlcx Date: Sat, 22 Jun 2024 22:47:55 +0800 Subject: [PATCH] update 1.22.0 --- .clang-format | 13 + .gitignore | 3 +- .vscode/c_cpp_properties.json | 23 +- .vscode/launch.json | 4 +- .vscode/settings.json | 63 +- .vscode/tasks.json | 47 +- CHANGELOG.md | 9 + CMakeLists.txt | 49 + README.English.md | 119 ++ README.md | 138 +- deps/build_fltk_zlib.md | 63 + deps/pvztoolkit_fltk.diff | 90 ++ docs/pvztoolkit_en.gif | Bin 76004 -> 74121 bytes docs/pvztoolkit_zh.gif | Bin 73312 -> 76338 bytes docs/rfc1437.txt | 8 +- inc/code.h | 9 +- inc/data.h | 9 +- inc/lineup.h | 13 +- inc/pak.h | 19 +- inc/process.h | 24 +- inc/pvz.h | 66 +- inc/toolkit.h | 20 +- inc/utils.h | 24 + inc/version.h | 7 +- inc/window.h | 83 +- misc/lineup.yml | 344 ----- misc/pvz.lmintlcx.com.url | 2 + .../Chain of Trust - Let's Encrypt.url" | 2 - .../ISRG Root X1.der" | Bin 1391 -> 0 bytes .../ISRG Root X2.der" | Bin 543 -> 0 bytes ...\270\346\210\217 (Plants vs. Zombies).url" | 2 - ...6\226\207\346\241\243 (Help Document).url" | 2 - ...\210\227\350\241\250 (Endless Builds).url" | 2 - nt5/patch_exe.ps1 | 25 + nt5/readme.txt | 2 + nt5/vc141_nt5.asm | 26 + nt5/vc141_nt5.cpp | 30 + nt5/vc141_nt5.h | 4 + res/pvztoolkit.manifest | 32 +- res/version.rc | 21 +- src/code.cpp | 2 +- src/data.cpp | 10 +- src/lineup.cpp | 28 +- src/main.cpp | 275 ++-- src/pak.cpp | 41 +- src/process.cpp | 4 +- src/pvz.cpp | 193 ++- src/toolkit.cpp | 98 +- src/utils.cpp | 286 ++++ src/window.cpp | 1204 ++++++++++++++--- tools/build_pvztoolkit.bat | 75 +- tools/debug.makefile | 77 +- tools/release.makefile | 81 +- tools/release.nt5.makefile | 111 ++ 54 files changed, 2769 insertions(+), 1113 deletions(-) create mode 100644 .clang-format create mode 100644 CMakeLists.txt create mode 100644 README.English.md create mode 100644 deps/build_fltk_zlib.md create mode 100644 deps/pvztoolkit_fltk.diff create mode 100644 inc/utils.h delete mode 100644 misc/lineup.yml create mode 100644 misc/pvz.lmintlcx.com.url delete mode 100644 "misc/\346\244\215\345\203\265\345\267\245\345\205\267\347\256\261\347\275\221\347\253\231/HTTPS \346\240\271\350\257\201\344\271\246/Chain of Trust - Let's Encrypt.url" delete mode 100644 "misc/\346\244\215\345\203\265\345\267\245\345\205\267\347\256\261\347\275\221\347\253\231/HTTPS \346\240\271\350\257\201\344\271\246/ISRG Root X1.der" delete mode 100644 "misc/\346\244\215\345\203\265\345\267\245\345\205\267\347\256\261\347\275\221\347\253\231/HTTPS \346\240\271\350\257\201\344\271\246/ISRG Root X2.der" delete mode 100644 "misc/\346\244\215\345\203\265\345\267\245\345\205\267\347\256\261\347\275\221\347\253\231/\344\270\213\350\275\275\346\270\270\346\210\217 (Plants vs. Zombies).url" delete mode 100644 "misc/\346\244\215\345\203\265\345\267\245\345\205\267\347\256\261\347\275\221\347\253\231/\345\270\256\345\212\251\346\226\207\346\241\243 (Help Document).url" delete mode 100644 "misc/\346\244\215\345\203\265\345\267\245\345\205\267\347\256\261\347\275\221\347\253\231/\351\230\265\345\236\213\345\210\227\350\241\250 (Endless Builds).url" create mode 100644 nt5/patch_exe.ps1 create mode 100644 nt5/readme.txt create mode 100644 nt5/vc141_nt5.asm create mode 100644 nt5/vc141_nt5.cpp create mode 100644 nt5/vc141_nt5.h create mode 100644 src/utils.cpp create mode 100644 tools/release.nt5.makefile diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..e2d2c71 --- /dev/null +++ b/.clang-format @@ -0,0 +1,13 @@ +--- +Language: Cpp +BasedOnStyle: LLVM +SortIncludes: true +ColumnLimit: 0 +UseTab: Never +TabWidth: 4 +IndentWidth: 4 +BreakBeforeBraces: Allman +AccessModifierOffset: -2 +AllowShortLambdasOnASingleLine: None +SpacesBeforeTrailingComments: 1 +--- \ No newline at end of file diff --git a/.gitignore b/.gitignore index c7d81b7..567609b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -out/ -tmp/ +build/ diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 06cf5b1..dc33db5 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -3,22 +3,27 @@ { "name": "Win32", "includePath": [ - "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/include", - "C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/ucrt", - "${workspaceFolder}/fltk/include", - "${workspaceFolder}/zlib/include", - "${workspaceFolder}/src" + "C:/VisualStudio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/include", + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/ucrt", + "C:/Dev/fltk_1.4.0/msvc2017_x86/static/include" + // "${workspaceFolder}" ], "defines": [ "WIN32", "_DEBUG", "UNICODE", - "_UNICODE" + "_UNICODE", + "NOMINMAX", + "WIN32_LEAN_AND_MEAN", + "_WIN32_WINNT=0x0600", + "_REGEX_MAX_STACK_COUNT=0", + "_PTK_CHINESE_UI", + "_PVZ_BETA_LEAK_SUPPORT" ], - "windowsSdkVersion": "10.0.19041.0", - "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx86/x86/cl.exe", + "windowsSdkVersion": "10.0.17763.0", + "compilerPath": "C:/VisualStudio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/cl.exe", "cStandard": "c17", - "cppStandard": "c++20", + "cppStandard": "c++17", "intelliSenseMode": "msvc-x86" } ], diff --git a/.vscode/launch.json b/.vscode/launch.json index e3b4284..30072fe 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,10 +5,10 @@ "name": "Launch", "type": "cppvsdbg", "request": "launch", - "program": "${workspaceFolder}/out/pvztoolkitd.exe", + "program": "${workspaceFolder}/build/pvztoolkitd.exe", "args": [], "stopAtEntry": false, - "cwd": "${workspaceFolder}/out", + "cwd": "${workspaceFolder}/build", "environment": [], "console": "integratedTerminal", "preLaunchTask": "Build" diff --git a/.vscode/settings.json b/.vscode/settings.json index 845eb48..a3d42c1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,14 +1,17 @@ { "files.associations": { - "*.ts": "xml", - "*.release": "makefile", - "*.debug": "makefile", - "*.rc": "cpp", - "*.inc": "cpp", - "utility": "cpp", + "*.makefile": "makefile", + "*.rc": "plaintext", + "xstring": "cpp", "algorithm": "cpp", "array": "cpp", + "atomic": "cpp", + "cctype": "cpp", + "charconv": "cpp", + "chrono": "cpp", + "clocale": "cpp", "cmath": "cpp", + "codecvt": "cpp", "cstddef": "cpp", "cstdint": "cpp", "cstdio": "cpp", @@ -17,12 +20,14 @@ "ctime": "cpp", "cwchar": "cpp", "exception": "cpp", + "filesystem": "cpp", "list": "cpp", "map": "cpp", "string": "cpp", - "unordered_map": "cpp", "vector": "cpp", "xutility": "cpp", + "forward_list": "cpp", + "fstream": "cpp", "functional": "cpp", "initializer_list": "cpp", "iomanip": "cpp", @@ -32,58 +37,40 @@ "istream": "cpp", "iterator": "cpp", "limits": "cpp", + "locale": "cpp", "memory": "cpp", + "mutex": "cpp", "new": "cpp", + "optional": "cpp", "ostream": "cpp", + "random": "cpp", + "ratio": "cpp", + "regex": "cpp", "sstream": "cpp", "stdexcept": "cpp", "streambuf": "cpp", + "string_view": "cpp", "system_error": "cpp", + "thread": "cpp", "tuple": "cpp", "type_traits": "cpp", "typeinfo": "cpp", + "unordered_map": "cpp", + "utility": "cpp", "xfacet": "cpp", "xhash": "cpp", "xiosbase": "cpp", "xlocale": "cpp", + "xlocbuf": "cpp", "xlocinfo": "cpp", + "xlocmes": "cpp", "xlocmon": "cpp", "xlocnum": "cpp", "xloctime": "cpp", "xmemory": "cpp", "xmemory0": "cpp", "xstddef": "cpp", - "xstring": "cpp", "xtr1common": "cpp", - "xtree": "cpp", - "bitset": "cpp", - "locale": "cpp", - "regex": "cpp", - "xlocbuf": "cpp", - "xlocmes": "cpp", - "random": "cpp", - "chrono": "cpp", - "ratio": "cpp", - "filesystem": "cpp", - "codecvt": "cpp", - "string_view": "cpp", - "variant": "cpp", - "atomic": "cpp", - "cctype": "cpp", - "charconv": "cpp", - "clocale": "cpp", - "forward_list": "cpp", - "optional": "cpp", - "bit": "cpp", - "compare": "cpp", - "concepts": "cpp", - "format": "cpp", - "fstream": "cpp", - "numeric": "cpp", - "valarray": "cpp", - "cassert": "cpp", - "mutex": "cpp", - "stop_token": "cpp", - "thread": "cpp" + "xtree": "cpp" } } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 05abebd..3b73f92 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,11 +4,54 @@ { "label": "Build", "type": "shell", - "command": "${workspaceRoot}/build.bat", + "command": "${workspaceRoot}/tools/build_pvztoolkit.bat", "group": { "kind": "build", "isDefault": true } } ] -} \ No newline at end of file +} +// { +// "version": "2.0.0", +// "tasks": [ +// { +// "type": "shell", +// "label": "cmake", +// "command": "cmake", +// "args": [ +// "-G", +// "Visual Studio 15 2017", +// "-A", +// "Win32", +// // "-D", +// // "CMAKE_BUILD_TYPE=Debug", +// "-D", +// "FLTK_DIR=C:/Dev/fltk_1.4.0/msvc2017_x86/static/CMake", +// "-B", +// "./build", +// "-S", +// "." +// ] +// }, +// { +// "type": "shell", +// "label": "make", +// "command": "cmake", +// "args": [ +// "--build", +// "./build", +// "--config", +// "Debug" +// ] +// }, +// { +// "label": "Build", +// "dependsOrder": "sequence", +// "dependsOn": [ +// "cmake", +// "make" +// ] +// } +// ] +// } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index b99f092..bf84d26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ 更新日志: (记录每一版的主要改动.) +## [1.22.0] - 2024/06/22 + +- Improved English UI. +- 项目构建系统迁移到 CMake. +- 兼容 Windows 2000 / XP. +- 可切换小王子出怪器布局. +- 直接过关可选结束时炮最亮. +- 默认金币 80000 智慧树 1000. + ### [1.20.3] - 2022/09/03 - Redesigned English UI. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6ba91bb --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,49 @@ + +cmake_minimum_required(VERSION 3.15) + +project(pvztoolkit) + +# set(CMAKE_BUILD_TYPE MinSizeRel) +# set(FLTK_DIR "C:/Dev/fltk_1.4.0/msvc2017_x86/static/CMake") + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + +find_package(FLTK CONFIG REQUIRED) + +aux_source_directory(./src PZTK_SRCS) +add_executable(pvztoolkit WIN32 ${PZTK_SRCS}) + +# target_include_directories( +# pvztoolkit PRIVATE +# ./inc +# ) + +target_sources( + pvztoolkit PRIVATE + ./res/version.rc + ./res/pvztoolkit.manifest +) + +target_compile_definitions( + pvztoolkit PRIVATE + UNICODE _UNICODE + WIN32_LEAN_AND_MEAN NOMINMAX + _WIN32_WINNT=0x0600 + _REGEX_MAX_STACK_COUNT=0 + _PVZ_BETA_LEAK_SUPPORT +) + +target_compile_options( + pvztoolkit PRIVATE + /Zc:wchar_t /Zc:__cplusplus + /utf-8 +) + +target_link_libraries( + pvztoolkit PRIVATE + fltk::fltk fltk::images fltk::jpeg fltk::png fltk::z + crypt32.lib advapi32.lib wintrust.lib shlwapi.lib +) diff --git a/README.English.md b/README.English.md new file mode 100644 index 0000000..e2b2778 --- /dev/null +++ b/README.English.md @@ -0,0 +1,119 @@ +**[简体中文](./README.md) | English** + +# PvZ Toolkit + +Plants vs. Zombies Tool Kit + +## Screenshots + +![PvZ Toolkit](https://github.com/lmintlcx/pvztoolkit/raw/master/img/pvztoolkit_en.gif) + +## Download Link + +Official Website: [https://pvz.lmintlcx.com/toolkit/](https://pvz.lmintlcx.com/toolkit/) + +GitHub Releases: [https://github.com/lmintlcx/pvztoolkit/releases](https://github.com/lmintlcx/pvztoolkit/releases) + +## Change Log + +Latest Version: 1.22.0 (2024-06-22) + +[CHANGELOG.md](https://github.com/lmintlcx/pvztoolkit/blob/master/CHANGELOG.md) + +## Supported Platforms + +PvZ Toolkit supports all mainstream versions of Microsoft Windows. + +| Operating System | Service Pack | Architecture | +| ---------------- | ----------------- | ------------ | +| Windows 2000 | RTM / ... / SP4 | x86 | +| Windows XP | RTM / ... / SP3 | x86 | +| Windows Vista | RTM / SP1 / SP2 | x86 / WoW64 | +| **Windows 7** | RTM / SP1 | x86 / WoW64 | +| Windows 8 | RTM | x86 / WoW64 | +| Windows 8.1 | RTM | x86 / WoW64 | +| **Windows 10** | 1507 / ... / 22H2 | x86 / WoW64 | +| **Windows 11** | 21H2 / ... | WoW64 | + +## Supported PvZ Versions + +PvZ Toolkit supports all known official versions of Plants vs. Zombies. + +- 0.1.1.1014 Beta (en) (partial support) +- 0.9.9.1029 Beta (en) (partial support) +- 1.0.0.1051 (en) +- 1.2.0.1065 (en) +- 1.0.4.7924 (es) +- 1.0.7.3556 (es) +- 1.0.7.3467 (ru) +- 1.2.0.1073 GOTY Origin (en) +- 1.2.0.1093 GOTY Origin (de/es/fr/it) +- 1.2.0.1096 GOTY Steam (en) +- 1.1.0.1056 GOTY (ja) +- 1.1.0.1056 GOTY 2010 (zh) (2010/08/02) +- 1.1.0.1056 GOTY 2012 (zh) (2012/06/05) +- 1.1.0.1056 GOTY 2012 (zh) (2012/07/17) + +## Build + +PvZ Toolkit is developed using Visual C++ and FLTK library with zlib. + +> Requirements: >= C++17, Visual Studio >= 2017 15.9, CMake >= 3.15. + +> Compile FLTK + zlib libraries: [build_fltk_zlib.md](https://github.com/lmintlcx/pvztoolkit/blob/master/deps/build_fltk_zlib.md) + +```bat + +git clone https://github.com/lmintlcx/pvztoolkit + +cd pvztoolkit + +mkdir build && cd build + +call "C:\VisualStudio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x86 + +cmake ^ +-G "NMake Makefiles" ^ +-D CMAKE_BUILD_TYPE=MinSizeRel ^ +-D FLTK_DIR="C:\Dev\fltk_1.4.0\msvc2017_x86\static\CMake" ^ +-S .. + +cmake --build . + +``` + +## Roadmap + +> PvZ Toolkit is the sequel to PvZ Tools.
It was born to solve some obvious shortcomings of previous work. + +Problems with old PvZ Tools: + +- Too big the program. +- Too slow when start-up. +- Too large gaps between controls. +- Too ugly the extended English layout. +- Too high proportion of communication code. +- Too inconvenient to support multiple versions. +- Too many useless functions. +- Too long the Lineup String. + +Goals for new PvZ Toolkit: + +~~TODO: I DON'T KNOW HOW TO FUCKING TRANSLATE THEM PROPERLY !!!~~ + +> Lineup Code Developer Documentation: [rfc1437.txt](https://github.com/lmintlcx/pvztoolkit/blob/master/docs/rfc1437.txt) + +## Known Issues + +- User interface style is ugly, no accessibility support. +- Implementation from old trainers, leaving bugs unfixed. + +## License + +PvZ Toolkit is licensed under version 3 of the GNU General Public License. + +## Credit + +PvZ Toolkit was originally based on [zhumxiang/PVZ_Helper](https://github.com/zhumxiang/PVZ_Helper). + +Got a lot of help from [Lazuplis-Mei](https://github.com/Lazuplis-Mei) / [63enjoy](https://github.com/63enjoy) / [infdust](https://github.com/infdust). diff --git a/README.md b/README.md index b94fa61..30492ef 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,24 @@ +**简体中文 | [English](./README.English.md)** -# Plants vs. Zombies Toolkit +# PvZ Toolkit -PvZ Toolkit 是一个适用于植物大战僵尸一代电脑版的辅助工具. +植物大战僵尸一代电脑版辅助工具 -## 预览动图 +## 界面截图 -### 简体中文 - -![PvZ Toolkit](https://github.com/lmintlcx/pvztoolkit/raw/master/img/pvztoolkit_zh.gif) +![PvZ Toolkit](https://github.com/lmintlcx/pvztoolkit/raw/master/docs/pvztoolkit_zh.gif) > For non-Chinese users, English tooltips will be displayed with mouse hovers. -### English - -![PvZ Toolkit](https://github.com/lmintlcx/pvztoolkit/raw/master/img/pvztoolkit_en.gif) - ## 下载链接 -PvZ Toolkit 官方网站: [https://pvz.lmintlcx.com/toolkit/](https://pvz.lmintlcx.com/toolkit/) +官方网站: [https://pvz.lmintlcx.com/toolkit/](https://pvz.lmintlcx.com/toolkit/) + +GitHub Releases: [https://github.com/lmintlcx/pvztoolkit/releases](https://github.com/lmintlcx/pvztoolkit/releases) ## 更新日志 -最新版本: 1.20.3 (2022-09-03) +最新版本: 1.22.0 (2024-06-22) [点击查看 CHANGELOG.md](https://github.com/lmintlcx/pvztoolkit/blob/master/CHANGELOG.md) @@ -29,14 +26,16 @@ PvZ Toolkit 官方网站: [https://pvz.lmintlcx.com/toolkit/](https://pvz.lmintl PvZ Toolkit 兼容微软 Windows 系统的所有主流版本. -| 操作系统 | 版本号 | 架构 | -| -------------- | --------------- | ----------- | -| Windows Vista | RTM / SP1 / SP2 | x86 / WoW64 | -| **Windows 7** | RTM / SP1 | x86 / WoW64 | -| Windows 8 | RTM | x86 / WoW64 | -| Windows 8.1 | RTM | x86 / WoW64 | -| **Windows 10** | 1507 / ... | x86 / WoW64 | -| Windows 11 | 21H2 / ... | WoW64 | +| 操作系统 | 版本号 | 架构 | +| -------------- | ----------------- | ----------- | +| Windows 2000 | RTM / ... / SP4 | x86 | +| Windows XP | RTM / ... / SP3 | x86 | +| Windows Vista | RTM / SP1 / SP2 | x86 / WoW64 | +| **Windows 7** | RTM / SP1 | x86 / WoW64 | +| Windows 8 | RTM | x86 / WoW64 | +| Windows 8.1 | RTM | x86 / WoW64 | +| **Windows 10** | 1507 / ... / 22H2 | x86 / WoW64 | +| **Windows 11** | 21H2 / ... | WoW64 | > 在 Windows 8 以及更高版本的系统上, 部分按钮文字会使用 Emoji 表情符号点缀. @@ -58,57 +57,93 @@ PvZ Toolkit 支持 PC 平台上的 [植物大战僵尸一代所有已知官方 - Origin 意大利语年度版 1.2.0.1093 GOTY (it) - Steam 英语年度版 1.2.0.1096 GOTY (en) - Zoo 日语年度版 1.1.0.1056 GOTY (ja) -- 人人网 2010 粘度汗化版 1.1.0.1056 GOTY (zh) -- 人人网 2012 年度加强版 1.1.0.1056 GOTY (zh) -- 人人网 2012 年度加强版 1.1.0.1056 GOTY (zh) - -> 对测试版本仅提供有限功能支持, 在 0.1.1.1014 中对象的序号和名称未能完全对应. - -> 如果你发现有 PvZ Toolkit 不支持的其他 **官方原版**, 可以联系作者要求添加适配. +- 人人网 2010 粘度汗化版 1.1.0.1056 GOTY (zh) (2010/08/02) +- 人人网 2012 年度加强版 1.1.0.1056 GOTY (zh) (2012/06/05) +- 人人网 2012 年度加强版 1.1.0.1056 GOTY (zh) (2012/07/17) + +> 泄露的测试版本内存布局与正式版本差别较大, PvZ Toolkit 对其仅提供有限功能支持. + +> 如果有新发现的 PvZ Toolkit 不支持的其他 **官方原版**, 可以要求作者添加适配. + +## 代码结构 + +| 文件/目录名 | 用途说明 | +| -------------- | ---------------- | +| deps | 项目依赖的开发库 | +| docs | 文档图片和教程 | +| inc | 项目头文件 | +| misc | 发行附带的文件 | +| nt5 | 旧版系统兼容组件 | +| res | 程序内嵌的资源 | +| src | 项目源代码文件 | +| tools | 调试发布用的脚本 | +| CHANGELOG.md | 更新日志 | +| CMakeLists.txt | 项目文件 | +| LICENSE | 开源许可协议 | +| README.md | 自述说明文件 | ## 项目构建 -PvZ Toolkit 使用 Visual Studio 开发, 依赖于 FLTK 界面库和 zlib 压缩库. - -> 编译器为 Visual Studio 2019 16.11, 安装 "使用 C++ 的桌面开发" 工作负载. +PvZ Toolkit 使用 Visual C++ 开发, 依赖于 FLTK 界面库和 zlib 压缩库. -> 构建完整项目所需的依赖库 FLTK 1.4 和 zlib 1.2.12 已经包含在代码仓库中. +> 需求的语言标准 >= C++17, Visual Studio >= 2017 15.9, CMake >= 3.15. -以下操作在命令提示符中进行, 成品文件 `pvztoolkit.exe` 位于 `out` 文件夹内. +> 依赖库 FLTK + zlib 编译步骤参考: [build_fltk_zlib.md](https://github.com/lmintlcx/pvztoolkit/blob/master/deps/build_fltk_zlib.md) ```bat -REM 克隆项目 -git clone https://github.com/lmintlcx/pvztoolkit.git +REM 获取项目源代码 -REM 切换到项目文件夹内 +git clone https://github.com/lmintlcx/pvztoolkit + +REM 切换到项目文件夹 cd pvztoolkit -REM 启动 Visual Studio 2019 编译环境 +REM 创建并切换到临时文件夹 + +mkdir build && cd build -call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86 +REM 启动编译环境 (请按实际情况修改编译器安装目录) -REM 将依赖库的路径添加到环境变量 +call "C:\VisualStudio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x86 -set INCLUDE=.\fltk\include;%INCLUDE% -set LIB=.\fltk\lib;%LIB% +REM 配置项目 (请按实际情况修改构建类型和依赖库路径) -set INCLUDE=.\zlib\include;%INCLUDE% -set LIB=.\zlib\lib;%LIB% +cmake ^ +-G "NMake Makefiles" ^ +-D CMAKE_BUILD_TYPE=MinSizeRel ^ +-D FLTK_DIR="C:\Dev\fltk_1.4.0\msvc2017_x86\static\CMake" ^ +-S .. REM 编译项目 -nmake -f makefile.release +cmake --build . -REM 嵌入清单文件 +REM 成品文件 pvztoolkit.exe 位于 build 文件夹内 -mt.exe -nologo -manifest ".\res\ptk.manifest" -outputresource:".\out\pvztoolkit.exe;#1" ``` +条件编译开关: +`_PVZ_BETA_LEAK_SUPPORT` 支持泄露的测试版 +`_PTK_CHINESE_UI` 中文语言界面 + ## 开发路线 -(在 PvZ Tools 的基础上) PvZ Toolkit 的设计目标: +> PvZ Toolkit 是 PvZ Tools 的续作, 是为了解决前作的一些明显的缺点而诞生的. + +旧作 PvZ Tools 存在的问题: + +- 界面库 Qt 更新激进, 仅支持较新的系统. +- 发布文件过于臃肿, 启动速度非常地慢. +- 网格布局在英文下拉长后显得非常丑陋. +- 控件之间空隙过大, 空间利用率低. +- 界面逻辑和对象通信代码占比太高. +- 业务代码不方便拓展成多版本支持. +- 盲目选取堆砌没有实用价值的功能. +- 网页布阵器的字符串真的是太长了. + +新作 PvZ Toolkit 的设计目标: - 能在所有主流的 Windows 操作系统上运行. - 支持修改所有已知的植物大战僵尸一代电脑版. @@ -123,9 +158,16 @@ mt.exe -nologo -manifest ".\res\ptk.manifest" -outputresource:".\out\pvztoolkit. - 同时支持显示主界面的 简体中文 和冒泡框的 English 两种语言. - 更加全面的存档位置查找方法, 能够打开所有可能存在的存档文件夹. -> PvZ Toolkit 是 PvZ Tools 的续作, 是为了解决前作的一些明显的缺点而诞生的. +> 阵型代码编码格式开发者文档: [rfc1437.txt](https://github.com/lmintlcx/pvztoolkit/blob/master/docs/rfc1437.txt) + +## 已知问题 + +PvZ Toolkit 目前仍然存在的问题: + +- 界面库 FLTK 样式丑陋, 没有针对视障人群的可访问性支持. +- 修改功能的实现照搬已有的旧修改器, 留有一些 bug 未修复. -## 开源许可 +## 许可协议 PvZ Toolkit 的源代码采用 GPL-3.0 协议发布, 如若使用需要以相同的协议继续开源免费. diff --git a/deps/build_fltk_zlib.md b/deps/build_fltk_zlib.md new file mode 100644 index 0000000..f53c8fe --- /dev/null +++ b/deps/build_fltk_zlib.md @@ -0,0 +1,63 @@ + +```bat + +call "C:\VisualStudio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x86 + +set SRC_DIR=C:\Dev\fltk_1.4.0\fltk-1.4.x-20240531-04949f13 +set INS_DIR=C:\Dev\fltk_1.4.0\msvc2017_x86\static + +cd /d %SRC_DIR% + +rem git apply pvztoolkit_fltk.diff + +mkdir build && cd build + +cmake ^ +-G "NMake Makefiles" ^ +-D CMAKE_BUILD_TYPE=MinSizeRel ^ +-D CMAKE_INSTALL_PREFIX=%INS_DIR% ^ +-D FLTK_BUILD_EXAMPLES=OFF ^ +-D FLTK_BUILD_FLTK_OPTIONS=OFF ^ +-D FLTK_BUILD_FLUID=OFF ^ +-D FLTK_BUILD_FORMS=OFF ^ +-D FLTK_BUILD_GL=OFF ^ +-D FLTK_BUILD_SHARED_LIBS=OFF ^ +-D FLTK_BUILD_TEST=OFF ^ +-D FLTK_GRAPHICS_GDIPLUS=ON ^ +-D FLTK_MSVC_RUNTIME_DLL=OFF ^ +-D FLTK_OPTION_FILESYSTEM_SUPPORT=ON ^ +-D FLTK_OPTION_LARGE_FILE=ON ^ +-D FLTK_OPTION_OPTIM="/GR- /D_HAS_EXCEPTIONS=0 /GL" ^ +-D FLTK_OPTION_PRINT_SUPPORT=OFF ^ +-D FLTK_OPTION_STD=OFF ^ +-D FLTK_OPTION_SVG=ON ^ +-D FLTK_USE_SYSTEM_LIBJPEG=OFF ^ +-D FLTK_USE_SYSTEM_LIBPNG=OFF ^ +-D FLTK_USE_SYSTEM_ZLIB=OFF ^ +-S .. + +nmake && nmake install + +``` + +```txt + +-D CMAKE_BUILD_TYPE=Debug ^ +-D FLTK_OPTION_OPTIM="/GL-" ^ + +copy /y %SRC_DIR%\build\src\CMakeFiles\fltk.dir\fltk.pdb %INS_DIR%\lib +copy /y %SRC_DIR%\build\src\CMakeFiles\fltk_images.dir\fltk_images.pdb %INS_DIR%\lib +copy /y %SRC_DIR%\build\jpeg\CMakeFiles\fltk_jpeg.dir\fltk_jpeg.pdb %INS_DIR%\lib +copy /y %SRC_DIR%\build\png\CMakeFiles\fltk_png.dir\fltk_png.pdb %INS_DIR%\lib +copy /y %SRC_DIR%\build\zlib\CMakeFiles\fltk_z.dir\fltk_z.pdb %INS_DIR%\lib + +``` + +```txt + +rem static_nt5 + +-D FLTK_GRAPHICS_GDIPLUS=OFF ^ +-D FLTK_OPTION_OPTIM="/arch:IA32 -D_WIN32_WINNT=0x0501 -D_USING_V110_SDK71_" ^ + +``` diff --git a/deps/pvztoolkit_fltk.diff b/deps/pvztoolkit_fltk.diff new file mode 100644 index 0000000..763ec4e --- /dev/null +++ b/deps/pvztoolkit_fltk.diff @@ -0,0 +1,90 @@ +diff --git a/src/Fl_Choice.cxx b/src/Fl_Choice.cxx +index 66bd57a..b4061ac 100644 +--- a/src/Fl_Choice.cxx ++++ b/src/Fl_Choice.cxx +@@ -118,7 +118,7 @@ void Fl_Choice::draw() { + fl_draw_shortcut = 2; // hack value to make '&' disappear + l.draw(xx+3, yy, ww>6 ? ww-6 : 0, hh, FL_ALIGN_LEFT); + fl_draw_shortcut = 0; +- if ( Fl::focus() == this ) draw_focus(box(), xx, yy, ww, hh); ++ if ( Fl::focus() == this ) draw_focus(box(), xx-1, yy-2, ww+2, hh+4); + } + else { + fl_draw_shortcut = 2; // hack value to make '&' disappear +diff --git a/src/Fl_Screen_Driver.cxx b/src/Fl_Screen_Driver.cxx +index 2956b7b..3a019df 100644 +--- a/src/Fl_Screen_Driver.cxx ++++ b/src/Fl_Screen_Driver.cxx +@@ -478,14 +478,10 @@ int Fl_Screen_Driver::scale_handler(int event) + if (!keyboard_screen_scaling) return 0; + if ( event != FL_SHORTCUT || !Fl::event_command() ) return 0; + enum {none, zoom_in, zoom_out, zoom_reset} zoom = none; +- if (Fl::test_shortcut(FL_COMMAND+'+')) zoom = zoom_in; +- else if (Fl::test_shortcut(FL_COMMAND+'-')) zoom = zoom_out; +- else if (Fl::test_shortcut(FL_COMMAND+'0')) zoom = zoom_reset; +- if (Fl::option(Fl::OPTION_SIMPLE_ZOOM_SHORTCUT)) { +- // kludge to recognize shortcut FL_COMMAND+'+' without pressing SHIFT +- if ((Fl::event_state()&(FL_META|FL_ALT|FL_CTRL|FL_SHIFT)) == FL_COMMAND && +- Fl::event_key() == '=') zoom = zoom_in; +- } ++ int key = Fl::event_key() & ~(FL_SHIFT+FL_COMMAND); ++ if (key == '=' || key == '+') zoom = zoom_in; ++ else if (key == '-') zoom = zoom_out; ++ else if (key == '0' || key == 0xE0) zoom = zoom_reset; + if (zoom != none) { + int i, count; + if (Fl::grab()) return 0; // don't rescale when menu windows are on +@@ -520,9 +516,8 @@ int Fl_Screen_Driver::scale_handler(int event) + #else + // scaling factors for the standard GUI + static float scaling_values[] = { +- 0.5f, 2.f/3, 0.8f, 0.9f, 1.0f, +- 1.1f, 1.2f, 4.f/3, 1.5f, 1.7f, +- 2.0f, 2.4f, 3.0f}; ++ 1.00f, 1.25f, 1.50f, 2.00f, 2.50f, 3.00f, 4.00f, 5.00f ++ }; + #endif + float f, old_f = screen_dr->scale(screen)/initial_scale; + if (zoom == zoom_reset) f = 1; +diff --git a/src/Fl_Tabs.cxx b/src/Fl_Tabs.cxx +index ed6b45a..47f0e15 100644 +--- a/src/Fl_Tabs.cxx ++++ b/src/Fl_Tabs.cxx +@@ -804,6 +804,7 @@ void Fl_Tabs::draw() { + if (damage() & (FL_DAMAGE_ALL|FL_DAMAGE_EXPOSE|FL_DAMAGE_SCROLL)) + { + // -- draw tabs background ++ if (damage() & FL_DAMAGE_ALL) { + if (parent()) { + Fl_Widget *p = parent(); + fl_push_clip(x(), tabs_y, w(), tabs_h); +@@ -817,6 +818,7 @@ void Fl_Tabs::draw() { + } else { + fl_rectf(x(), tabs_y, w(), tabs_h, color()); + } ++ } + + // -- draw selection border + fl_push_clip(x(), selection_border_y, w(), selection_border_h); +@@ -966,7 +968,7 @@ void Fl_Tabs::draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int flags, in + + // Draw the focus box + if (Fl::focus() == this && o->visible()) +- draw_focus(bt, x1, y(), W, H, bc); ++ draw_focus(bt, x1, y(), W, H-2, bc); + } else { + H = -H; + H += dh; +diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx +index ce5cf0c..6c84ae0 100644 +--- a/src/Fl_win32.cxx ++++ b/src/Fl_win32.cxx +@@ -555,7 +555,7 @@ void Fl_WinAPI_Screen_Driver::desktop_scale_factor() { + if (r != S_OK) { dpiX = dpiY = 96; } + dpi[ns][0] = float(dpiX); + dpi[ns][1] = float(dpiY); +- scale(ns, dpiX / 96.f); ++ scale(ns, 1.0f); + // fprintf(LOG, "desktop_scale_factor ns=%d factor=%.2f dpi=%.1f\n", ns, scale(ns), dpi[ns][0]); + } + update_scaling_capability(); diff --git a/docs/pvztoolkit_en.gif b/docs/pvztoolkit_en.gif index 51536db9055e80d81989b00a9be446beef26405e..6806d000349bbb371860524ca506480aa20e5c2d 100644 GIT binary patch literal 74121 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 Y^Pc}a=tD31(UZRPrawLEB_9v~JF4@;3;+NC literal 76004 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 z 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 z z!0u$VEAs(NCiUwmphBed1Oyrf zWhpv!Kl;_sGY(Ct>kkS)pQSelA@TOb&&OD{e>C6k)pH#Tf1(yHluDE&Qc}03b^*Z(??|uU28U( zzE$1+yIza^sft}!6q!}JEe`MQck{c@HQk>K^ScXTt~{f%f#H!wF6J-0mH9{JW%qI$ zQFk1*!(8Q)d`K9QX{H54(E-b|#p`*>R(L?pLcbC<14BuQ#hDKCI1d zgRcwT*;UCXug$GuTsA|!td%e;=CV+^DupS*YAN7_BB`cgr7W=KXYgWGs7n`z(6;t+ zJE*4FrTUKRl;?D9IkfMlCWMmRkl1r&cnVY-*L4>3`j6p6D0hD5W{s7Wp2AqOYxDY3 ziJ{H<`Xv2zLywUCu%egIz7$W*L{_bHONa5PZ)(Rumz|`G*VY|3ekXINgYTih#sc?5 zEc_<1K?u)#8&R3NZ}Ix11iNIL-SxirEly(?d1|i#n0Ih}z_D30Ch1jW!R-;Z`J1*@hrcF?AnA?6ieZ?4;gdrvcB+I*wpuA ze&LA*dv8-8)6-PXtKNNn>LSk2a`D|tzSUo7Bl#jG`B!G((69LKy{|F- zdv>ir^*jcuz9>;<`GE)y^KQ>vdbz|3VEg4%S~_<4c7Wk8F?RK=cO>HUEM;&s4w}n4 z`Ua%FZd0DhRk7CsVmPCibFzF~&WsEbk-K_04{3F6YRts7dF}q+{~~qp6N<=a13Odc z*lY)+1^e4EMVa* z1r71k6R8mKsNy)Ot5#8gOhUiH^lTAn5J!8!TsP$7$l3dR9%>ncHA#3_V{1ovWms-Z z7dztPxD4&e$O2fV-&2OzwjVMh%^W4Jg4}we(n{kb&J+K^P?Z;9jUmP#5^+WlfJBc< z3b~)lW!#WWgNO`4qBAA%3KpuPG85A)GwWX7KJM7f_ONfo$BIHZ%MG5&{jsUCv1;V; zUo&GxnB(=FkQ&bMMmmBhC=9hT_aQ}E`aC6uGxcTq#9>L~b zLIq>miN5Qmeu)Wv(8OS6(~z@*cF@F#S<`5tf_lTmI9=1kf`ZE4#MFM{G_s;R!Q^aW z;~b}=wD{zLdgG#*qIf@7kUVd`An#hH;%zT!2^K*p^Js(s8Qgy(Wh=2Yl49ydXR8yr z{ICA>JR2;YIe*HdA}u=dy8GU=RH@W)zTJ`fe$tvYKwO-eD2yco0)^lXEP>`D)*dN&H8T_#B+vf%iYYn z?)f7D?LBYCI_bxvFq5Ljom3uxGiX9x$*OR2`FSGScbNXSJ* zge{2T(xpQajUPRC%1QKkkoH1A4xJJ5(}5JYXYXyQ_&@W zR6>-1Xh#P2J+<15g^O!d!tX%##3=O6YLz6mB0`8nX<#}D`BF!b%BFx382DajR#~V^ z_U6^3$2`N$Otp=AkGuL?ThZ$vji_|V5}80m=!o(NQ^)p{3G#3U2}0}uR^h!E!3-AC z^N_IM7-MedqNheiE>LT;;<{Xeqg_MIQ`ulp!t^Nvq`u%fIGswe^!k@t*jgV`D;8(x zf`Ushb1&wbQYLZ#K>m&a_o}5kZQPv4_kyKLaPN@idy2sjwG1H%tv5gf(snA!#-W3? zR}2Q~udc$au`5<0GQO~`q6>jc%w>BBB%7Qx(AwX>*VcSRI!yL0U#)OhY-3fY9`M5v z0XQHV>o5MTQWMb*y2h8?^QdF0uVuugs&ze7iZcAF5i_|-E2CCd{d~?Oi7EX?%kJQn z!sO^@6_om8S)W2p$JdLR-WtKw$YV^{DbGtb3Nt_1RpQoFEhbnlZ*N>xhs;p9@C*|>p*d4zju&U47$P^L1ss}Bd8yLzIIb)h~BZ~ zcYs;#qJOs#ez!TikIlQD8P1L9kINnt@(Y7%ZmYw6^#^t9tK(pzPn+CAMzmKPFh_`w z)5sQV&B`=a#wV%+;e7m?zc`;r!BV!nw|q5Cq)`?AIRGNC%7*pg6Oz))_Q z((S%7>VXPXxZ#Rf`HGpU)Pee~nVN7SNb^7|^guh=T*ty(dG-es*I#Gp;HAl-mK~uF zJ21L1`$A7>LS$0RzrXr?4AVi}^%!FGf_KxJ9p-4I+`rU@m8X@{!gh<~5lySqQQvr&XAzxHZ zh-a)g+AzYT!YwTh2^gaik3zoWPF4Vp6RA-umB2-};4iq=4-*-&f2iU}s@`lwfh{a+ zMvwxG(DQu*TG&nsh=7_Z2#P>($I`1>3vfjYhN3%i8Xyir_rI_RI&24%r z$cX+B+-*SqZAcG&czU;O+6dB+dqB=oY{`;Vc+5$F3K+!&T%`G`CN&6}YULO~-noQa zg9@4M4*7Bv@+LP5j(mwN&3m#u6t&bXQc8ai)O()9d$JaaPQM*VtZm<|l9PjT%87m+ zq+LJ6!!|7wqIa?uffxoU0qqd5>Je6>$=q0dbP;062$ z=YRDVp;V@ix~8G5^8z|!pL&m!Kw?8rxolfic>8(CUI*c5olT82UOY7>H z%Z?-4s54tQwxu26&tC|iuU?&95rv`i%v5X?W8v@yqr!i^(Z=J+!6qj8hV^+6)d7}- zbBOnWrKS`SqvjQQTPfPn*G8q68!+ccAj0b9j~?@1jWbsT^2l2;*w%`3G^f3jNG|4u z5wvii0d;`7vWo%9#fO)v;FwKCI*p79Z9Mqsg#T=+(Z#(&_Q z4Ms;@cGo)@9E?odcz-b&Z3F#C3S|O*jk=%iAm1NuDj!@F-HFy@YuHOW_J@~uTi8v^pn?fL&oz5*Uc2E&1FP* zCh*nRY)$>I+on){m%JqQ!jbgz=0~2w(Y=J>r}g?~hm-L}=ticqO?CjnOyv5P8@62V~RWhMRYc z4Ugi-(ZofPonHU>@wgTHHp$cRB4Y1!^>`?% z2V==Q;xA7+u1A!|x~*{vKll}W_A4fasHohizY58du3VXG-&$h6jliuvfXscy22yC< zukp2^gc}MMUo#ycDt|X*+oz+@hH6A8R4M>Ut-i`u1$WWYcv~Unz2b`zc3va-Xf_fm zuZzo)Y9(G0gh?sXs%>K=7oLXY%3_6FAQjz>jLfP#vy51P-eRk&>lpB%2r-|Ciz6fn z6Fa`P*>3kY?eW-!(h19bAThmCe_(Yye~Yf-hyak*7AE zlE81?PF$|O>{`&8DkdQwQf(NG(V}#(%WZogT>5IR18O(}wdaX8Z#TZb6O9kPLn}x@E_yB1< zc_%Sv=LR28l%%^B>51|{y#(g!LpjVzqfaa-COfOuHH{MTj|(ehEHW->Z>#V3RtUk}T)SZAl zc-T?wpC-Acu|!*QPdY!@UUMmh&I%-BqQc z=et=ug1^_>Va(m`?g3g|wp)`ILa)1$^nCeXX*S&+2Qe9=d`EeaN;QX3LianC%1`UN8Ggc##}$6Up>C0+9^7HkfrnE8yT)*nFH_yMcM5cg}eoq-W&ou9QJvTR=vfpOY^|P8 z+%PhTDux$f+PQ}rJ15Eaw>HfCiH7=PstB^-<$FnejHh~wLAYvdOmw3ul`P4qn8mC= zw0;}w4f+t1lUh_lVb9z<2QOWxH1Z_BS5tFpFoPZ~OxP)!?7XK=b zftq8A=t3^x2i_4R-?^YJK?}wpzFw^4tB9(BLOSub5fiC~^uSI!DtS^lV-Ba#{-{09 z=rTna`rj#9``d3Zod$wMBt0&?83gzKvrTYYY02+ZH&wFHkn{KHKidR|oH>8aLJ)!F zGa(#}c{o0$LfGjexpaj2L|yNtK9$dg$vJ<(P}!3bXPS$PZ!F9`m6V$8p9Nc-mYEDhQG^~ zyM8S?yPPu{Au+Ff$8W9;`%_^|P_Z(|(OefOS!qhkygI7ZTrU_@Y5u8Vb<%06Huapv zN}PFZcIv#LP>2-_s?hDMYHq6bVYOAnTwk4QZVpbWvinxCzR4ED*!|4v7{t7>gWu9R zB*f;FP_c2q(b6{M!{%JTym_qF(!SKi=9)#0`@iQz-@JMA59t72SkB84&Hwf~d@q3K zh3fo|)G^_G@i_majwyi8vZKX|;NhuK{(tbDbO_IX?9N=oKf4p{uMryhB`Xdb5n)o5X*>`kxl$~7UiRgr z#Bi?4<)o*l zM?^%_7Kc|?LxN*UA&}~%=!$}Zf`3@2wK+2@?xgNtSG4B3rsc3XdoJU2EckjB0-q26 zwHPsbUA=TtdVW@Ra#8|6F1^04{`03{Z8jyicqpNKJiTi-K7KZ2{Ke>8L)YP9Qf&5>xLwJ?hCpEERU~*yeZg&|J0V#5wU-(N!>AnT9k?a@kk~Ed!ZU-Xnb5dh0Ms`wx;U zlrlfEEJwb^0o>G_Xy2h3;J<8tpwbK`Eo{3tv&64Pux=TTIMpYaY<;CnexGj_3SBVu zG9fjNj}u?~D(~}_akNnWF^-=4mB5C{IF8UZzRW8@3g8^%(Aa&B_8=~CSDtXHd0PhD zd>tNj^gzEy8v;zpb+AEAd2u_5nuf7&hmQ5qVxLInB0AIPqYudn#)qLbs@lbbbC@prI zwN_5Vg1w4Tj9j^F$py7Eb#re$5?j&YFQ$z8z~E8pN(p9DN3@JGX7_~TGLwGT6+Z=Q z$VQ$VX##zeT43bo^{<+n&?9}Zw*1{s8k$U{pN9*k7=K9hz0ym~`(-z)9 z#`recK?O#yQ_mYV8EK@V{rFFke3We37e?~b+I<)>JK0WI@eE^p*15DDh>QicaS&(o zK&(3WYY0<{a~Mm62*+406OEWuT|OY?mxa(299F;TUQIzmU*8)=+T7mFyOpU-7_ryl z8Y)m7BLLU02ov)(;FOzA=2oARg*RR&{7#o6WBc3Ip1z>xdVD&=#NTr3n)0T-cInGp z=pR?POQwi^n{Pg)?&+w9K#PxWD2!cFHWkHVoyFeR*@Z~`GNOy|W?{e<@iVBjjtpMk zoa&p^=F3UJw3ENe_=eK1dc{GRFb}GiI#|%xrL2`{M5KiDzvG*~P~sHPxsoF?!Pu%% zsSgvRj;@#Jg2$_oGey+5QDwS#sv%h95bnhR4Gn1T0xHY}6Gu8PNR+*ET{d}8Jx zSorq)wET5H$%uj!$L%kK%1b9wnT?O12owVAu7_lyxh1&d`k-L{pe~L;7UFbMTvi(> zq+o<9A~L(-^8IBA|o8X8vx7k!HW_`lbZ>I(Q%?GmcC>d34%GU^KhfB zunI%nRui%jA{==aSm5iwvw8|B;;+y+g!1 zS*GMRHlO`?T_S>At`a76!WT@SgYfqMIw*1S9{v$g! zpem-N`t*M}(SKw|vnsx+%JE-L^dH&bDs|}kubk*VvLiOh{6A#J{vG0f$j)sY-)olt zB0IWEmGNCKWM_PJiiWEp8~cUqROrma-!_&io*OAvtPO@D0-F7+Y)$3YSK({T&8=Om zw&JsETTV$$O~4SxF!_z$7qT<*x>_k=d;><~);1Mg{Vk7q^Ms10WFfx9wMCB%aJkg7 z-Nj@hw4?EBsjpL?>w{-Y`PQ%9>!yw98o?g&tw%AJ&I=(2-{p$MTi3k5e)==mVm?yc_em>W2EAMZ9Ea5J+9>QH4Ejb`8Lj0JC`{os zCq}not^Lf!O#a3KCJ1`>1H89op$2EhRKxD&tQSAMY*@DO5AR0=H|wBYo%?U(xkj*k zKSV<&Hpy+0@LuI2E2F=C`R((^sM@y1?8Jg)o9K-5QT|Tp*T+V=OR%#>y9oPneq zjR<&~K4t%|4AGoe9rwSjCwDx7i4rWL1K6FFFe!t1#~&smVk+VbCd}jn_{vpquAs(= z7zCXG9V$TQ++`6XW>YR8;5{In*awldV|A7f8!`3EBuKr2f2n~=G}HPV#<`z{(0##J zE~$9Ni}oGSi+APq4zF#umyRQe7cRsEXD>PsrPZx!qKiv>}G+emEMBI#oz+; zuK>H>3+N-oJV;p4->jBRU|evn={Uu2oOe%$wSUX9e|sNhHB)2v<6Kw$R&)~mDKKSe z@t9r3dLgr(v<~N%WYf*Pl;G80xRc@qtl^@BxOt)M-`;-jsM>OZ3v3<#b)%u0f#|0O zVpSa7w*K6*lNe6Bbh&HJ`t&gz(~O3w_`T@H*GC6x=eJuF?%wNK2v_Xzj;_}~T2QEB zzec-}kDm|;l7Zhkbp71epb1rd%iar_<3vPc2n&2Yu!pFYA$6CK9uwE5>zqqPSu(Zt zt-s4Ka+e3bD)!lTR(19yANB3VXS;yB1~yMC8#s)T_Yb^rzW3(m&(}S{@Vjl=AEDY3 z#@Cxl?gYh-z$-7(zd2tV2XBNOKNJ}MOosXf5xc%qaZGe`gJ{`DT6(C8IDNJBxN1g7 zFLA^rc7Jd)golE7TfP=adzO~?0z~XZwq4^|P~6-c-||pq!Ms?)yqejO4OPgxhMjH? z%{vasKe}m54S$t&^B!+87hU$5<#CZbv<;jw2Ms%N0j);3EzPBTtddb9BuwNTpaQQEy~ z*{;|T5g%Y>l^g261kcYwGn`P6?TGL%ET5Qolq}(Q@Il3>mfZ`!W*wfQo2dY&$`3ZF~eW zb$64;4b1WXiYS7RmK%Cbj2Y7lpno6sjAnIW6|v{;mIbt;mvMKza|Hm<%-jR+NCE<( zC;^sXUZuYK$w2&Y$3*RjI%qghE0%Hu;&BMEszp8rLU26-@VS+d*duF?BJQ-js%5~m zd_lcoL0?=V`BNgr+@mKBy@l^Ru@B8H;ZXCbyCAHvkk7=n^2<>_jzHrwAv`J0LN}Jn zuBeJyiAE&qNPK|-S~0lj5c&~cCz-I^R%|a)i}HLQYI6h(l}VvuRHj9ztvL#0;)|@)hy)$PFCW?S z9|Q@PfjA#RK;hogFz+=P7xy-ct$WJ=B6}rkU;afa19v}n)DTT=D`mH|ZD7(dL->4i z>^?6_ID4$2RGbSR)T}Jl9=cU`kh?|bLZ zMYcSEoE(pwIw@bh@D!t4=k^f`Y_vq3=JYC+!V&=xmiop&PnCgscbsio%%sjvuPv816cT z?BU_YY=nwAgBs9|5d?PxB#4xhwPd)J0LgRFNlVb-sAUK`o~i9+_>2+6x(HbjCGe%# zdQvOgw7_lzl#js35O%-^h9E-=)K)DZ5b717V=NwFAvtEAZ&8TIZY2lt{+(k>P0MFC{kD~KSZ&%~yHF&J^n{5;*RA4BzVJqXzm z#K=oowp~M3d_{~JGr_S5?FcWyqy)MAdB*aLwZ>4UMi;AQ?#J3BGHCgl^;?@dR-}r( zkH~;+uQFar+DJ3Br3R=LBEYCIg5A*~?Q50_qCPv&YNaXawCOh!n6ehIui0vc+nAPK z>R^?uTv1zxTYFqmhHzZtSdnMGlD2l-T!2x4z>Ulk-U5JDlmY=CkI0#|!M+(Cyst|_ z?(>6*J?@Aa|DNQ7GkhWUjj3LFh(^guHjP~!uI&8KTzU6=ul60Ch&hjD9P)4tti{;k>v`;r+2JbnLg)-Q7TQEL?E3$a^$DYP7s_EKp&P zpJ-S>a?j5X0aG2T}>-lIR!tT55#J<&1oFCjXmKQZ<+ zG0!r&cs4$rIWen0zTP?6cQ!eBHo1v4HIzBYcQd(~IdNP$b?iO)gJtTJVq)QJ>X+@r zEY`Tt;6SIs^ljACjQ(`T#snaG5?Sbl?@Vt-O}sdsbA>5Hp$TlC8N{p^l&YD_r)k2; zNj&UX*x5|?+3W_^+*#BtMb#`N>+Bosnfpw$`brS<`Ruj#B>(HF3Ao_YeCN#D=c#eQ zi9_4T)2MmIu35P4j3D+T&*nUz;)1y1yaMF{QPsR0<)Sj{!mam$w9lNR!Q#Zz9DmXD zVbp?@-6R+G(kG$mMXV(a)+NfxX{+Zc>dhrV>?udeIVZbC)0Z!+tYx>ZW$W`L@cFXM z=8Oa7yjk?px2j1$#brHgbp?v)nCBHJ)@S_%>$G>RcW$n?v934GtaJ-)3>a(- z`D~1wul2HSjBajBJ#WlVZua|3jVrD<8LiJ{ZLW1~ZftJG!WAbLH-|^g#`X=iU_M(% zSzBS5lP8;77uX|b&s)EQew?up-R>3KAyC>uG@Q6Q2Q{8e5XbCLXHOAP?XC*$()q69b?*p;Oapv( z39Hd)Hh24;cHY|WvMH@HR&V?0FSRP{@lb8D|DAcgxmWkRQVPJxuSJsqAmUx3R#EOv z+wS#ZVW=A(Xeu34LDxj=*7ytuF{^jhIyH=Ade|>OxtE|8_FYj)AYLv2NyQ0c27%fi z%}WFkR<31jxG$(N9)1f$f&wsbj{=kc?<~JTlMX+@tM~4)VQLc^FX7H_0Km6xP`L1( zsqZ&K0EP~mg1l__;nkt0)|Wm z0LF^|fksDs2go@Wpi(O9V1E?xvTtA&%bMXRp?AomZ0a>QYY|gBQGZW0haEQuxRvV$kZ-5Rmgpg1Z({KW~_-n)G2>l&F=juOye>qK^Gz8TA_mn92v}yZHpy=HF;kbXxan$h4R|;`ICWi;@$~F6^;Na!V)@$rqU`op;DvI2W>uh*xm?pIP0ot}Tt@7*N~=Leno*X`2g7)|GP!FO;a^>B*#SzT0lyUy1IwFexGiyB6aj_G%$ z?RRD;h3Ic_!tv#-$mpwARqu5|}-5 zggPt0CbCBTx=e$w1`W{roA=;1U(KE0=W7FhE0kOS8356e9m%@)`iGQ-%Hvmx9Lt2X zC}Gn3n}<^Y%xmNy*D=jNOA)lzoIlXZ1X;%7F6FcFCEJ-{aEq@^N!z(nSk=YFB-0eA z-e4{6*q*Ti6#OBDpMNg) zU#bKp{eCO*z;}S~mio_b)x(l@dcjW@0A3-WNEZd0ie)4m0T7B!ic`7Rw=)oGKvVqj zXn;m6rbYOx;QcYth%TA*xoDc&yJBh*KGfrUC{2=P6A)cxn;s|$U{j5D{05y#N^kPT zp>y`9rp3v?;qVl>H2F@=DeFn6b84zdBT)~YWcrm$P|;-M^hD}hiBdxGx}NoY$o6zJ zYQ<8g4bjE-PCNu;jUx^RXcwxUtux|B8vPJ*J$4KK)=RCiB%5Q=5wt>BkamB}Q@JW_ zUoz_g)zc_}h)!@AYmh<}nLm7YN>4TdrEE4WyFwE!wnS<7?P;p+bouhFC^4O$I!%AQH6H(J2LWKcm-^3|x||SL47H>z z+2y=PGdEuDE&R!(lnv=qe$8jptib8^WqJuGyd#PMMXQTh_ z`>uF18(?jSdpb)2UJcW9CvL}O0Rf%JcHJ;L&Xr^9M^3RH^zDL{2i_*wS>bs?Q_C6GBo6^ch&CH|T?nchYV%k01$^49b zmZ)A}!p2W!3^cA0u^{*nfVw{r2Jnx;vEc;rK+{!3{Mk~)4?^VR1!qd})NNi#2A9hN z<%5B3B4Py6-^50wN0Gj=P%!R@ze}V>aB7F?vhNM1X&WI)KG5THFv=lQvbEp%ntv39 zwn_l!0=qj|C!&T}(5pXTa}Z5(krUMB5{-#12?IhpD)eIzCopwB|H0yv68rLLf%+AG zRfy`V&Y+}1>grzPBzdVn$C3I{Z37Z7hgX|RSKhD5)00%$Ea&Iwa{Vy$UjJRe zH(SJb%)(PXeQXQoiF;IbIc%yl^g?KL`{G+A#HB$hPo`?TAbe0JV9Mp$ppK3y)>PFx z8?^Sl#$#&Il+x?^qgGVO%lxC#;A^!!WaQk*iImN$=&ClmWX(0*QWQofTnz~n{J-2L z?!VEN6&~r+*N9R+vU+EyJ9bohPB2O-P0zEn>N3o~Tl>*TW;52fwRYOUe7I8l!Hi2@ zrXf$Et}+8kp;+9m5mcd9eiF}bI{MB>`6uNA>W*}r#)Z!10VBSxa2v`I*6~lhx7j)YXI@p`Wo-2a zKYvZz0r_E4D~h?lJC!k$auol8XY;ioP^Q{KsDMe6PGxvv;n;NN+~Fkn)-@YMvSOl zMQ`6ov(R6deSrnk@PK%Nl_tdo9*ktD)1X%kgvh#bFndmrdaNADswK}Q2A9*_Dz%LT z7S2Uh1|Klc5|2Fu946Hbn6q6S$r)tFr*t7(*nt_Tgf-b%vPCR7lG+q3xaZTRgDp6V z_!PmK@cH!Rfnv^@6h(X2`Ha~O7|$S|l9TYaWPQfsXBk8c*XH@GpTU-b2Ykw&OY_-x z1D3)!ZOXoD4IIzNRw5|6(|$M$xoDC{f|8J_5Y+j+S0Pps@Ay?g7j=1rgH}>p?W!?S z3;F$LRx*iN}#B`PdnwWRiilsS$fg%GfMQTtfI{|Ut%I^u?8s#nEoR_|CmMIHLa3sYh2|@)3?smu6M0zT`2<#zV_9xe4XiE{~8Kd1Xi$rHS1v! z>s7sGB^3XkfNW$X3)xV(^s$r0Y-L+|S9~h!QIkidYy|wXr~MigY_FF(e5B!X*iI-6vj2lIph&8Sivs;;RO}Z9?4ju4-%X zS#hc1AVTo(6la?iC&YJQ1LhVM97zI(sDZiw&@Cg*YZL^-O~F`eEJ=u)-{XGP2?po{ zgL$F`LSSGMLfD89GSGkk*J2bbh%X^7oD~3Dal`rDZ*$1R6Ybh$0J@c}f1$hH*7#S( zHADaLyzuK?J%k{}qa4KAo z2eSybvUP((jI7`w!x_K;mhmAt0Eh|0SYj9LzdSG{j$?sTPlB>%v9IFRn2`;I)CBohkJs?|fI6djTAN_c(e zl`U`y;$_Onc1Fjm@mIENUmJ6J%+ttQSv}XTd zKndqg_qI)F_sHb6W1gr5&a1Xas|Qut?yiu&Fwy~x#jc9@Sy>2+>ASd z0rB-Ys(wK8GdIKnKd1r{2G9jKJ0Srk_V;@oLULDEJim%AxLjV>1pmqOyz=r9LZGXw-3<`0X0trn15Sv8lM2-(Hu28ob;O`~D}rFkOq;V!+n8F!78 z@m^yg=vL<@-wTSx4&j>AHYaUXIkxe+hCv=x%<{hcSzG4wovN*kBLT95f#Yz$9x^$H z_&Po#hyrvz;nF+`nZ0u}JKN*0`g^t#JFyN(x$1ff24D*(I5Xh$6-}dz+A}V+Qw!5L zy4+Br>cF%IL=P^2trj=~1p`00bF5fE6aWALzx%EWj0pA9Kk9%0Z<{>(i$ByzK&xvD z`h!9QlZioFAtkH86#T3h#1jnkIU^*1G$XYn34_^+q5e|6p=&)#P!j(#JfaAkkO@2p z6ui98vNd)iJq?sNUP}lF5CjG=gQhUGEK@e~nL^!>L)IcQ2V(;n0E7og(! zvSvFF)8Lg3ye(iEFw|=ZHAoAg%d<3W0ZI!BU~DkiD>S6qLH_eF+|t96z%BKPv-2u2 zM;IRTSg|<6l2Mch&#Q|ETf%3oMf6Za8Nj-lD7YH|2~z32n#eLtQN<6FfI$<#iu=Ly z`@~gr9aBlNQDn2a<2qIBuT&H+SZqZ#?7$Y2#Uh-zD@-@dQbzxZ@H|``8893#R5+P& zGsD>;M%L@Ljszq(d<{4>h(pw`&(b_QtVXaiH7XmnA&kTT3_PAVz~PceL_|j+pfnCl zJmG@GPzl28yjF(%lgSP+ zvAit0OG6)uz(>kJNkXw2tB@Fs@E{a|vK0Zq=gc9rA+kb(E(>Txil__d>XaAwpTjeX z6X=8y*bC^gqbq8G#A!arC=6YZ#P$>+Eg7P)aS9jWMIxJy#Uv#ak&hJWkLgPr;QUSr zT9}l?$7>(jh%5ASEjzMbab z60J?;)K2x(PX*Ob71dEC)lxOpQ$^KO?NnQgluLEhSEbZ*qMvkfMq7f_TgBB}#ZAvK zinK6|ofwnxafqOh9vY$C$+29^0T~Vugy%F*PpJsL2+tTYo9Bp*0{zV-@&Zczc-k7b0gfeJ; zV$&Nv=zb#T08Z$K4paXly6LbAifZYXmg$Fz>6x}^U2;=H)#*DeRK5y@pVrf#CM>@a>cIkPqCV=rDr%%2 zYNbwUpMGkle$%BsEUFePt2XMUzUru!YQ@6puC8jX_Ufp{>ar&5vnH&c?&+Q8X#iH_ z58>CihSf|})w;IpyTs5snxyDt2c4)W;?80u?u;u5(KHSwc>{k`+w-(sO zmTX(lXT`Scv1M$@w$#T~W6hrI%D(K-7TV1A?8Ce ziP5{QqQGtdP_9Fc;Nu4GiS_5+c7pDvjHVqFdVcQI2Itna+KqeMBAUtxI~CCk5%X^D z_YLp;#@F$tjPmv|i@a{GeGT;41 zO>Q=Gi1<357|u!MO=Z+}ZgA#Zz)_!!Frb^931c1`@20>Fr}1+2WE7{Hb$Kq?B@oDQ z>veXL-Blgb@ZI?c-W1x8Qz_m!29+5G?HY%2X1#IpZbP-OUbXdK3zu6|uGJmRzwl+x zhZ&KbV9fs{7mDJ22~9la<&E+-=kO{2?=B#WB3i*5kmJJPS zr}X~_UGyLC^Me3pS9SKMgzj3O!rfqlbf?nvaC#ah?E3nt6hE961NBfSd>9l8iPg?u7hkHVL`?#n3 zG@ARm$NMU}`@HA-BE9HL@B6@?q`epX!oT^hH~hrUBEnbv#?NWC-s!c5{5-Xw$&dWK zvV1*FQj`>l(#}>6@_bkAXu=NtX9fMzuhh}6(vl{9)Q9cQaQ#@tu-Na{zoz|NB~t&+ zzx~&5{oSu5+xPuTJ^kSS{TbE$(#MS2hkfEN{@&N@XN4}R5m(c{0?jdfM%f7LaQ zY-~l?-0s*%rT!h>{_xjT?H>tC<$i0`Z0t8}tO;vEwP=`~_)fy0f>7LF(xv7PdQZCl zf(D3M0tXJf^@$+DTAywuZ0PVI#E1qXMg;ZgBF2mtLs9JL@gvBPAP+tyLIfhoh6_cq zB&f&X8~}41PJFmBVhc63oB-(Q6Mz9qguWz1g+dSnN&*=^tSRzlOO`Ji#+=#EsY<2~ z8FAQzu!S3lJi~&-DiTyJTWZ&?jTMWdKt>FH(j^;&F5NV>2npzEVH2SPN*(_O(aY8A zz`JAPItw(a zG$%sagfJk6X!fJ)xJjc%G))k->V&@u25%_4l<38?c{=Xdh2rv$XxXyW6XNZ_!$n7s z?MUdtCMQ%5&GmU5)rjgosnD(kzr4fqy<4(IIN4@p3AON7Z6x4Vi(CiVhr(bE87ELo z9@OGNas*{3P;(E-rkM~r*@hqk_cedyO03G1P)!t$XK6G9uBd|f zK?MsS;8lQ7Ux3Oeh>r1UUwqYxIub-?subWrjTzgDcyZ2&3Zf4^7=oUfhQR5gf9g1> zs8~`PrJ(iQ_fd%`c}l53K@1CDqb*&V?Vj6O*sZ5u0q~c8Y=)(tW=>qk$OD5#i`}CX zsT#r@YaIyy2(~C0tYdBjDxaW^T<}A@;T1g8PzW)i1#JXZYBK+wx2-AZPR9b5>`4Hg znQyzNzDX`#hgNziL3}ji^S$a)1h5ksH1Jaf5hx|6mpOKnF0-3iN$hn_5J=pEKqI8} zQutDI*sni{Dlo-<$=X!H5iKl}kv&B$FxQMy6hPrQQKgZ&4D0Dktn9d#6h$8MnNbH`T^iBCcgFv;)jEg}@}I{<2e-UyNJSGs z&;`C(pc9B<+TyB*F#fD-Y65A@@T7vj3hl3dlygY5f`F@i^+r<8qRZ7Jk~ZVT!WOzx zUR&UTI_Dj5PKR?-zci>B>H%(7IICe#3eX7|{9sMu^P%F(*SMCY&qOez%*-&zfXBrO zL~cOf^X`Wb3eDt27EEI4006i&0E{aJT-p^5AqLa|41utFN&{7Nmk5faMO1VV0O+;5 z3pV61nQH}D__8MR5phYcqsa&#qAIoM>TN0X7$sOJl&RgVUuxP*UjRUsgCS^3*(1vf zDA9uTkPKyV0isgMcfLL%t0e4O78V7>Mavy#EUEv~OcYtv5DL+9HU1+^{0c_EFYZMF z0!YIOb;-t{#V(C;IzS%;;G~eW2u8J3j@Ke`9zfX6Uk}XXU?}A-&e<|5gH($iiZrp7 z9il7aqLtykgcy^>kP1BUo7GY*BmOixU0pIV%91iYElRm}6RsM2AQY zA!w>mWAKyF%RMlriQ{H1nh7DasWc&!R1E)t3KOVf1!|eZL}N$?Ga#?XWtbijtBc4= z$FGFtgLvrzSe$h%zS(t-mZFGXfwiQbypE@QW2!)2u)|Hf?>fM1%&_dH%vgS_h*Oo! zDJPf8tP)0xlq6P9q$&`+p3$I(J#6t@``V7MR#M= zogyyrW@=TM5x2G}9WHWh8{O$r7q{#C>~gESqT_1!qs8oQZlej_=Z?3$=53!Tu}h=# z%CxNI)opg!8zlFR7ryenuXPEEUX^&FzyAF%fCDVx0TZ~u1MZfA6Rh9``&YTlVK9Uv z%wPmdxWW_0FNV8&-GVj*6dwLCh(rG@;t`X$#3m*&MNX{Z6|?xm#Az{%W8C5t%eclf z&M=OryW#!jxW_*JF_42SWa94lw?jTMl9R0DC1beAqGd9aqb%hqQ~71-<#3g=tmQ3p zxyMcxZkNL><}s7mw_j#XnbWN1HM5z=38^ZY+brif(>cp$9*BeMtmi%R8N7GKP@e-W z=s}P7&k7+lq7$v?*Bbg!uy{12BQ5DkQ@YZYzBHyYy=Wn4y3?NiG^i_0kx-Mm)TWNK zdIpS1>1}(f50_~-Mo8APc^}&mG=}^Gp-m_f^uxs&ZRCqWSma%oh zC7$tu2wUR(E_T9UZJ}C+yxRYMb8zD<+Z^MSc@kBdMq>U6mpeQv-g<~18ejkgC}02v zI74TcOI_}2`9h6`u6)H>74kj=6eYCjO=0yu)xKtrE#;$)Lgm@2H)NAr@9oWt0)w7> zp)-q^K?crdRtD&#C7q+8hzPMZjI2{+f3wq?yXIKI@BkI zIO1U4>s|k&fC`I~l^y@f@!Ac$zI?KC1)KpBLb&@@s!2Bk$weoe2~FF*ds~pqwLos& z(a=xspOmwD^%-u_i{5xeK_cF!ikCcMA&(>B;|TaRqWss(9e5q##b|8M3~ok`F#s4% z^P2PmW}xHN-2=WQsDI$z9pcgG_PyK8Uaybwgwj0$pigP5sqdveJo5>bHiG?us2cAk z>bQyisr77|AVlEA%K$bDFtN^c1fZJKpFr>*qb=W3(M173LT8-TWiZr5HAvlD20uNG zczr}-(M3s(A99u7yI~pnC5C&n%e#yKU>!?B;nuuNk?we$!Vn46y-H%tpCp0E9uWvn zT?{Iq3my|C?4fmWAzu{0 z0Z2drNB|SPp-aU}7`^}j06=C9p9j)cN4R1LY8`KxAi$v@o@vDg-}B2U$C4C){#^ZEg>f&5-G-o;&@`^RpF^nid;a}1J;TFSO93? z0V?1D&AI>LtdPY^AxIdI2MJ!&Ew-TmPT%X~qi^{l$^{%$eB)Pj6(w3$9D>Ay*xVMq|4S3N=3BB)SwWs*E&tU85MJ$%te)PT@vAQk4t_Pt+oDVBTf)MNox- z9ROXkxD}-sB%4f0Sfn9i?W661#2uB+LWUPG4#cY2p=^=lV60J`G-6m@9V|lO57HF_?9rNhBPb%_YwpBpie5`{VNWri z4&}lN^$r6hfB>*0vHYbU+8{qR#7JqQhS-&3J||kr-TBcWL0SeL*5*jXAXE01SVdH3 zBE)90#UUO}-+1Ij!cwsSPFGf8Pm<<>-r_X`bUsmZqDx|y$zonre4^uZx=A|i7G4$J zca|4mCfQpemw(O*82Bcj`~Y#HmV}ne26|?L3g&|@({}EJPi)_83FPcmXH?&fCKBFh%koD=5{b?;6 zC1diJg*_^yF4&+F>S29Cq+Tkf1{j59DyK$jhA!%cLWGTtDyiNWrOH>SrmCun7>%u} ztCniOfoiOtDy`P4o%tP@*{ZJYYLy)wul_2qDw(eaE3p=ui7-9{?-_ zumbS?XNe)e5DWl=`M}g*u#S$7lamvS4-h8=fbsFg2?-S#0>VrIm0&=N)oaNIF?kQ; z1H-`JYEx61S}W3W3-u)<=OrhbQ*-M>Gu=`1v~d1u7~eo3_ePvhR?6pt0>haq)0;{# zyv1rE(hR@{1qj9Q@xg?I;!OF&0bm%wumAwA1X#83n^wPW7~r)6@Y)vgS`qTv26!C_ zc^z4Ktyp;-fx+pK=8=Hl8bDwZAFPrO3N^2<2g5RnLRPo~2l!yqLU9}1i93L}OF-GJ zP|u^#YZ-TGT0Lh{c3@a=0Is~TYJpqzT$)9!S}p$d7!S$I%d0A`?#?Ud>gp;i>`sbF znr+Nqs)VI%CRW~5ww<=-&ZbOF!8SJH4h8~mreW}nxSP3#`QJ4M2L(4bm2h~=^mJuh z+)7K?Yu+wwm`QHj+34Bc=sAH+O$81dz@~5FHsEoKkDV*OtEaEx&R^orZwn3%TFx&k zZ*E#%*N5M>od2ylnHd`!8yp@;yytZ%-UpyW-IGDb< z*?_~>pMNc#-t6!1pP!$@&o6IoZeITWhQr~%pMU+hy}Fs6{?A46|J_9OgajCU?H&~z zLsdpgQ%XWjhKrp85%@Zb^*_D-&us!gg#+4AN#*PE`a)3OF&mB6kEb= ziMZ`HN9zlv=_#cmNEI52#u6DdD~!e(iYHPz%*V478cU`!1-_hbu4z!tgif=sEUYORrFpul*drFx@Pr@c2@ zskLUSlWGatWma6f^Zi@xE}3#$ooSYj#Bd#F;ZMx>T+~W2qz5iUI;xT_obGLnCj;T> zy=^p=O;vjNR>-si&+A9BIR;$i8Mcp5i(*6kC%!Eg7RG z_}-|GrmRrIlx=j46iBuo#-o*^exeh9gcgx`YWV4rz&KhSx9RwETC*II z!JecM3JLDy3R>sZ?}+GK1s93yQHgNV%sSjDZQsZWD6w)ciYt-7i=j35r_G^7@u!)4 z#0_ig*2@oL39m2oFS%kIX6n~J&CC_yA~CXEQ6Hnu|7FSmP2lB1n|C1H4mU25rYB5@ ze;Df@^=arTh;XkJerp*UHVC&i26c-t8kR(bVZ9l|siJ7o19t0;oR<>4@Q_AEXO_0l+b;{t%hN7MiwzjJO&1ty_J+VEaG@fR2 zByn5*61JM+PRwGF7QB|A&LIe;?Um>zPR@!+qVbKsZvo$r%9NThIZW~+0 z@^Bswt1ELpjx>5cOb+K_efa4v7gc;{+0HVd=J)F*amUibh}E`cHy_qmIfa9f#Y0=O zUA0DX+wQZZ`mg*Tf+G045A2W?EhqO+O0%L=C8sh1cPqL^XW5tZMXG2WSi$^l%$IUb zm(f6vk0gT-P!|?9hXx2Qb+81PG)(Xja_5`-o8yFQVoURHkqW!> zgBhsRA5_1M<2S?k1fU^TN``+D)p0dbxV4Yy0|OPuNX7$u7c9|j$1ZZe=<)Ecjygm1 zF{WL#_PF*oBNce4^`MIQbxLiD=rvM<`&NjxH!f_n(~-EpN$#1snJ+_^-j5~I%MKWS zEobcCPfHJz!8MmCgPkj>U~TgA#~E3@%PJ>S{0(UjxGGDGnMhxPHloiqLj=%RV-^s+ zgjMcQ72aKbrmsPy=C-;KN|p`>vDro(@yMZPLo$A#dW{4W+r69Lqghj=310^^=zN>s zW7ZCgu z4z0%!?n6ruLqsd|GqA~CgoJ<7Iq%LwvJpr2QLrKSl{O|1<#ei(u*CdA%yr7h&9=GU zS%S}_RI!g&f2oGX5Z^c7MUBhNQ_|^V9d;xi?2r{shRHpsE>Zvz!#7)3ThM2g4$|_l zR$1}UxfABSc_RjSP3%&S8} z_w_sutQHJP`UCPU4QW%XM(mYq(>^JzSua&Ka*_B!z57jND%Ezn6YI+z_sw-$&RwipuMwr~+y3RwW0hK;m5J^94*r%?|60EjrJd*X)=s0g+JJ|Noqx}S z%|Bmi13}8W2)g{eD5`bAgp<1))NOq@F?Eo4e|Hz`e)JQid}5%V+{5-=ZN-O%vI02v zaT6a0=~X!+bgTApogW7{V(Oy|-|u5?JoW>;enxv5F_Zmz94Yz98TXC#km|?d5VxwE zi@mZL&5qtkby!1EsqzuC;nTP}lq;om(vro#eFA)Zn>wI;%uJ&{W|QI+@cH79>|_<* zZyCd#Ji>aywa`9o+QXgG>37WYXRXiP!!dj#%T(lt_XJe*ck;Vx8}5PjIq>zbTn4rc zl6OJ_&IFuAG%u$rG#v{$COlS9u?*MPy;?OF7WH5=$&wh1}=m@@AgO z=2Tn#IFgAbC-*vhkxQu!l9e{A+ZscW^Uq4{tG-aaoMPh>^Edp+0Dw4-M!tc16y=7z zUUh5V*1ClB?%VRAmX>xb3^7c~jSbPOHXzQmn=jy9DcNAR`o}QpBD3u^YyrUhE{LwT zAA~Rh=;>B*3GwVi@)Y1_C5j30DfHO1C917a;zq~y>*Ha5Z1Y2<0?Lo>gAm}K+Hs59^h1zZ5qDyD?AmjB^mpS z8Wv+vSo-&TZ#by`(*=yG?&FsHjYQX7Gz^u;42k#?aOvp9UCaXT4)0BCM{JJ!(Yh%D zG7$iTC$Xv3=&@7?4n@~dMFkmc0qEu0NdoF_=OJAqQv^szq*Rs??!CASjDVv;zhL&J zV2~~dKyr*}C&5FxkrB)FCO9yHDf8dCoSq1?g_x!6!yZCPo7;(@Yw#>Z(C>^EHzrw* zXZ8@$-#Opz-9USRQ51d`Mq=Xg{(u(`C3w@~i04xLF6?3;_-T5k2X5E6^Kzyu*8IF2 z@T^_wQHeo%_7u~L9b5;)-0efO6!RVKqxfC=ne+-Dgu%4yHx-H~#ewFLhZ@?8pty@( zhGMw>%ZscOg#iX^==Tz#L<$0Xp)s(~cvvU2dRJ3=N6(@at07m9_>S>g<~{iKp4caQ zdbg(f4zvbqrXYT|_HJkJZ7TKaW3Utk1KU^7xrr>P7%e+JA+oE0p_34fFi5_qJN2qB zP}i?y1=5>pTH~5u*Lx0UNI1;^Qh(x{0Vb%WAwQ5 z{PqO%DAmSzPZTPTLSnKx#khjmmH%2LUM?6 z{)h58pw-|u$nEnDTEh(p2^4#DkSszUWR7o*u!L%H>kc@PWtSJE5{971fso^g@ZA%EFFaCA zz>-(byGJ0BSs=K8(S^_U%Xd1D%V8Jz$rl>6Xkl2gLAb$&UaZbp^bNyTO@C1>|P#9!v#aAyafwK%GHS5Ez7m;=1E%fN!LX_Oj z2oXw;>X!EwSwj|9^Xt}4k{yev00H>CAf;)L9#lvTar7*I^dTz1fYSBvaL|Olr^%WB z=BeLgY4T*M<4n21u}6w@Yk<9XYKA&sKxK>R*L)wni41&H`)62 zpL`q+BSkz>C>|48x>x+4)1dcfJ_CYLgZxo!=^42UiPT<+#Vf#%fXx2(JYD%nR=un) zv`F-IbOEmj8ij8R>A}NZN%T)qz3Gm1Ye~Il-mRl~!{q^!3Q+4&14DV}ymuDvh~FJ* zVFXj4I%;w`I2AzXB7NfVi!e1vJjdrT^$smp^#N7%24++0u@P<*7ViAZwwR)>kVhx3 zqS-Ev(QQ5-@lShP4r58yY4`)D6%jgsz0Fs7ElHg(QrHElOwdYb)w|a7YoT0Hb!&!r z8<29mpi9B>qoDTy425AAiN-dB9zIq=B~*sckylcd(bMM3!kpa08~wS>0C)=hNSLiq zT7E2mAUIy0TVY^)f?)8RZCdUwy;8nI^zCTvYmhkdokDVxkJG2~Sf|pQ@z4}qbPVN= zG@}fI2iNdo2{(G{aC5to*at*~*>E3mB#(D_Rq4UXPZ130rLcMXBJ_74iLkg5YI)uq;qe<7Ch#{;A&WB?F%k?-2GKXrsM_(Ba@ zD+Zbo^l(ri;bNqMCaS*gg%jK2OZ zfS8+Vx$=<9hztmGW`Rdimu}SMdX&?7O3=8C)^B6WdKy#@H!^1|Z#thuVz(KLF^g=Mg#B)&Ia)@lE54S)< z#!6FCY0V{b*^Q6yN1V_W`P!cFnv$|+or&h}`Zcqt4`J6(vTBjohu{-Hc-dX ziZiKf-{bo%fnaYjgVMt>}GKdE4z7GoEqpu_0L1ohQ)bAqVqk&%wE;FyXb zKKWtGDhpnC)Nqe!HG6Ajtng6$WM`s7Qh1ibP=tZW_^5-%vDB~8;(NtFR z$jPy~$mUq(ac}zZT9k=;kMT5z#)_=r24VYlBl}KPhi+wuCO`Y~$+4Kt@$U`}BczUF z!j64@cGgwnHIuegq+ceC9G8T@OgY%$m&CITn{97SZEd2p3Qr#zO&|MBpJq*;cTI=N zR^?Aj-;mDS3eWsDnz{Fzk-C@;hR*!mocZ^620%7@>F{NPbr!{c7BzboooyB=d#r92 z4To$FS7Z*)c#gn-jwpMMqV24%5LrNJco!0 z)|3?|+<1X6+L)WohQE73c*{ueYF>nFQIgC^?8Q^ce^EZ$P{uJ%VQWzp%TQ^n_>;(z zmcN0zW0iLHl8XOQ#$Usl-9Q7flvSgP zaV*vv68)Nwe`B&gMJk(3x}$OC)EdI^+K$XxzAnTbi8AvHT$VRdXkTefb1GoxXJ zN=2cu?zf2a)DisS<*VJ5bXQrz@BI-cL1o!?-md3m(S+b5!uNYFqJ})|hBfe6bhkPH zx-Cgf93W5ps8ME(3>HqH=Y^Br@q7VD4>-#*A<3AY)?hbF=m~WeDE<OP&tEd;Z6I&zjv_UoxI6bN*(Zym$GD5lz8DL+PCDHI>sUxOllI?4XKd}8wC z(R01GMt@NA^|an{n@SvX3j|T&U|_IgBx9emoD4Jso*l2Z*9ieB}0rpvsfq?6}ZHp=;1U#biOL&hLvEVPR*s}uc zn_-e4A90-SOnzv?cK`f48pQhfC8mN|$^DaEN`MOxDfhTM?~?7>gCEC<>htNq(U00I zr=KMk*CoI2!hY6PIG&8PO$9h>`CNi}U9VWq-rrv!PGF8iIdaJ3VU#JhsOmiNOo%zaQ5lKeZO$g1%6s8LuK9}DGcF&03WbH-mB@rH+m%k zalQR>OQx#IqQRGQ>HSJ`jcQlZN#_Z6(yjUw_e%zZW)X#=)Aato@e`#QZI<{fE(qA^ z+ueWgT@EH;5SDO#;CDYlPYOeF!wg2JqE4Bbc~hLRSVrFh?~7?jKO+VPX9tejTflw1kja z#QyUZn%J3|xmTegGBY2Nj_&7jXdfKKjqMtlR&wsX-}b$1m~>jNYJ3EvITC!rQ>$&# zBglxODwn0&!w7M2lPAE3s3A+gRgqSg2~kz%9Ne}ln#+5pM0cY9z4!~EJr62r2kF3R z{PgG_%`o#!c$DuB_K zN|ffx2@qH8d*TqT=u0?cZH8V!mXH2^ROn8bedbY-S-< z#;T%ff84BRp;-3S?$A%&VwqvBB-xwNmO~Dl{2PJfT>m+`6FH5(p3j0kjd+_!{HO5Y|4s zf#>OVO8pnY-EEWu*Y8juY5`1ep&w}WQB&q|4MRo7K3iVj614Mz9~F;Tml}2p*;lt7uUi#UnF&!#C4Mbd zE-RMpl&v5x@Vv8>H0DwHe=*6Aji=CI}^uK{^uvGlg_W6>CXZlYu2UR_pvG? zA`kQG&hmHOUqPZ?doTtQr)}cf?2`Rd>mKiu+;8VzdI{F=eJ*N8ME~>`my(08zJtX4 zesUjgZ&4_3*jM+g=bJP0)fBPGp6NdXoieqlpR$ZsPkq!W;v8ASyfK16--i+B?S zhOynm$FjsNFSrcLQcl-9N@y*!WqFcSOF7GEJMIvx4*s#Qg@DxR05U)(t>8?P1?!_? zE4f`KKie;+Mo5&THy5!fnkM99*D*vRFjO_E>757Q9lhmG5R!N>AE9Zvl5=8sT2E35 zTeGc-b;qD47qW<*>nF-Pcft?DBl+9Z$p(G^1f$?80bul`NNh;4!`tDs1yXueZ4HV@ zAEh!AA9ShQd5RF`#ftggj9T=9`3aWA1X;5YTFC7S$t{btoZXeiG@&cq`-|D3`(}eh z8RIX0OP|Mtn6t^%$(fdLQ{hB6s#-4z)jpQuZ=~up6o-VG27QwAUV@h|m9;;unN}t2 zwmVo6W-Oluxd+Yt1X|S}u|ofT7YS&)qkPVryDz3 ziZ*8??BqEJpY{Rz=X)C%6-F|HLWqXZ_#ZywSy5Yv4_j)6RA8h-q0JL2V9tZte$ zl;R3Th_;bP8vO`)|Myq@Hs_2;eBxw^KOq`$2tUplY63fLvuvAmH$KEBW1)MiNl}>XT+LkH!N95HGRbalT)g;h$LZZ9CGY|eP8u< zmGuGX%;~7;$HDMjsix^|-&sVgS>Mh}a#I4Cv?X4(P_$w4?5OcN?zgv=cs)S$vY}z| z_b&Ka^$Y4@S%>r#3S)9PZb@?Eivsfv*1DlAeeP>p%JEKJ-uG)QJ}d=YgH<)TM^zRj zp?YSw$KFR<4Zp!v6Z|?}#+w5b`nWHgvLM3w1+Ubo+KqnMn+frQ7Z8G0-i|JmTmGBDYB+fN)5k8r-jbsTw7^1{Hl{f2zm z*n|}L^-T)AE|jjyRLwv?!We}vtv+g9tWiW7L8Shvp(6btTsZH%JY~05#%vIzISDbo zDmH#UUqS%{?V?8-RDoyHJYFWm@V^uu{f)%F^s&F>0Ny!(F_=W%o{d4i(mn8(pQ)L= z^WU@fzOx7O!_6rHeucnIv9BTTAEbH_HF`lsS?Eo@7)|0*<9S$vd5BTsh#9>#roD8* zWcXYX_|Lu6=zVw=eFRyV`0jl~NfM<&eZ)cn)Q@NF;mW)eadiSVS<@!G(>y@=Q$p13=S z1nJ;Dlk}`jmz1=0v+L{b4$6||$k9fS$p_M?`@jq!tOm(l8n0~!!?{-kXAXL92xGLtTH6(k6#tQ|`YNnaT)&Z{ou5eQI2)X<2< zp9@;`9{$}pRQ?=u*N;DkP~D9!TpK(eahG#buBv9WSctvX~LA=-U8#!?b|g&(@p!YFK4-q`~0Jb|SS5_V#jMh?ViMMVPb z;vV6kqvU0;&(}5cycv^h-?SGIB&tVrri zuM^Je$A$XTj`=m8B8}AkjXlGpzc`$1Sq*%%8pNl7zaB-laHzN_E!U1SLg9_HEX|ow zRY%$09Mq}O>zgd171jH9q5%kz?w#zrWcyBnc3{MWpf*`X+INJ6%S6R8>CVd$G8@av z_1Hn{mL&)qnAT#PQR<)kaadJjp)|7|p+tgD!!eVfjEpW4!Q76YUj~35`>HFKmA*+N z`nsu-i&;*U$pb^h+MN{JJ1<%#R_icRL_}t_*>q z3uU}Pl5^&i%d@M|x~Y42H@i%_VE!kzwhb6I_9h`Hf%oc-1;!gGG7-TczMiHg2>~L4 z-IQIV#-vA0S}Em@`RHNc+0tD!LV2ag_{1h*t=K3!E6twAii8bPbl8PPZ(W;lqqg+x zd+I=4ON5*dA|@>_F{3H#MwL>Xymm3p6yQSP>F-#l8ov1Bpn*KngQRZUz*4`(=pikH znn*C(hJlJqVoa*7~+ z9fQT;^pb{C$6na>k=$N0?1<3Kb?JwFw5fxNKwHo=H{x>PP`0{s(q2Q-*mxLlPU$i# z+Eh$Z4K3fv!YBHIeGd||c-fkv7TuR4{8o22uyJ{xCrrY_2Me$2! z=WdAn&T{8rX<$Ee=V^%Ip?K%dk@3^e&Wj4gpQ9c47WoVEF3{;SkbW02=JUyx1d2mL;EL*b-(-Kz59m1v<*!{8$$8UiUQAs0-rn=w}lKm zN&fjS5z#O?u@ezV5BYm~d{WijRR1Mf36=HWh~K}3!#MmENb(_SDK4>9tTs;q}%uBxz}w7T3(zTUOxK4Jz5InA|g$xhW$z5-B8lM+(WN zaOAXe(jSE0aq)$lQ4h#-5totT#{ly-(ZUaIlv6@j*2$hvt~nV zA`iudR@?f&8;H;7Z4$1R9|;ecjX~6@$I#HrW^HjRV+VlY_)Sh-`_*O%wQY3C(wHYi zW&W&zJTJ3>mR(r)rftak#qTYSGe4Lu<0{2$HqRcI8g@MUV5at=GY81|4Fjxdrq&J) zD7Vdn-s;aTVt*YD*Mn%3JR0t39~C~TQlRp|*#zp7sC3luEAUR&2hjF(6Pxi?5tQDs zH2COoCXY1tny)OHtLStXP6N`gC?+T2&jD@12ve&W{iYg`^ zPP-AnHJcD4X9JtsBa31AEzwK`cZXGc$|*d@N?QMpd<9DvS}tvcCDpG63HKHmzt0*b z^;ogX@Bl$xj+bI2$0UtRKu7f=<9JwpEu?r3zbLffrhM-cg-UBtocOfT2a*Oz4_6d z5BnIO)hf!>n!(BC=$j~wL(OSBf$h^0n{%NFOL6^85Fik#ceC;%PEw9#_NbBh-Ie$B z$MMtn`C&2Zpu>MIZ~Sc?QLPWn+2d3LI@UcbZuQ>jKrbAqV}lHBPY5EzvF(bcJ|THT4+;Za#(pvcVY=Plslnp`M)6PTN7fCo0oeq2+RhL$0-R zuHmO2;gpHDc5(53^GVch0rmr;-)mKl>LbV(J{pRMnZ&a58d==Ccu2T6&8ALgPUS=2 z2u;-6lHfm?7}Vj%qR+;ba(B)Cacf>pm{0yth$gX-_&hjOYQN`OfWXoNn_xGR@!zBc4c(^T=PoTkr2h0_K!N-&j4up)0#Em={LMV|eUtMC&8U@MDzRZuE&4f==%R{!=`|Qv&}} zqS%vQ#&)u`cghLQ?#;F*T4NmHPDblf=Ezgl%2Rf(X)+v=3wq8Ye9mWhF5rJIlzT4X z_tEou(rg?kg*}(0KI=0wXT&~Ljy%&L0KU71e)6Ky6UVEAKSPQB)LVzu5&j`j^exj( zZSnlm8XNiv{JiU!Qvv@WI{Dlc>s_9UTJzx3luHF;^d-doTL;T;2K^PAo}I}smA^58GJ{q{X4A5J7ZraN?wj1Og5bHHXn$m z`F$H<5d$Ay`fCFQ_yb0DO~ztBb!UBw@%VS!YJB>`Hy7l8{u#cw5>Q$HZ|C!$hn1H= z;eVqm@r{S~5#!xMTx^L*sA5tYeatpEDY=+w*jx_(`Cl8ML}t3bB|=h1KxsxZj~ISJk2byW^AYE7zMqJ0*1ZF#Ihc=WSX$ zd0i)o=71e|u%iuuPE}L`lCE+PtqciNpsV-xXOf!)sXS>(Zyiob+1q$B`oBhPl!Fm? zEGAl$Z^czJRe(g|XKzu*#gNRN4;4m%3fbJ*I@NXyrPuoaiy2{(h-CC~1G)4%k;IO> zB-$E}tLvA}mEaudxDTJV6D8^`=rZX3E;$+YqX0nx6CT*xO@Ytz6$_r%pYIf;b$zml zymo`CiQM(f@Yy^_SeY1M`c`;$$7(idf;#aOh+6na61C+i>h{<@1RJVCv_C-zYyL(3 z8k(*r2@d@~EoeS(c)na3>c714MpFt25UsTc|SCC)9~_52$FTymsN zK-4riSchH%oz$z(ER`17xPAPy%bYGgWXJ=Hf?o(r~S?8Y3s5%=&kYZR_v{_yd6v|+&-G%XFvfX zo$zgGsMY}`F946AiLp@UB(mAw&~Tl%@-x3&pcXyhiY_gJsub-hdS;V4xkK$V2xM$Gu9qqyDA<>`l%EB zGRx96b~9c<86^g)kv4W+97k(7lIFq}h4qF4YW=QRQ_g3sP3)F#GPmL{wZPot!4(SU zpL902`EN|!k9#^cWdbBKbB(NA#nP@~zbJ1+odR~#gE9LNbD5?P?hcVD+G?o4iv_mQ z?!3zujv6F`#=}Bsi6KwZA-xB9KRNCYRA{Tbh0F6@NRIoOfm~>-b3qPuy29jKxGbW7 zw|DzPt3&kcm2Tgv{n^!}XNiy1M+`PgO=)RY5W(ds2ns!YEJ|k&P^VIb|B~pElwu?m zh@+~zP-A1^rRH0%v1>(CxJGR$q~1K_@4leXK?;{^w3WkhjU>YCldY#^b@SvbHyv`n zMcb;vGL^KW6_`M#V(Pn02wT8qbiGejp5AxiR!W>gd8g(Qx)wM-M}zEz6*RBT|ZWcAj`0Cl%f_EObwQX2igC(JI^N35gy^Kx=k8DCO-z1^_95YU6Za?D6t+jLe$VpwH zeB)=rN@{16*84wq!v_tm-PbRu7lE{T{oy~Fp+^b66~3RpG%S~BKO+SqvhD)kv_2pgfHTUR_2AH{xiv%kN6~iW0okuK7UFQ^xDe9A?}OBAk_5MgG0GM+H0fh<>|Dlq ze-D{H=|@OR%lkD}9kG3BXFl1|_2CZN=S*y$v=ZgcSg1PYZET;av#FEm$JF6}jWhLl zjWhjKbs{2#I$h`GA|X3@BJr+c7Ane9uy$!JZcjTG6TnkM!*-_d{b|^&gr|hN`b_1E zP-|q$7nhH0=jw?aiwXbSKd4lnYd3Z*S7%cC8Iz zyEGMhUP-0bjs0qLfW+XdJE1xgRmgT_tJyh3e*!+5 zSB|LRW+1dS!RaqO5QU`m-2>jI67?FlqOR78m@DeMQz!ZDv{N&d?H(`Upeg8-(1MeA;fq!HcgQj}`$3B@}#^vr~ zPl)n1bI53ct z@SQQm5a*_tY1kR-Qb(XH8c#neK!G(n5Xwk7CZnZzHtjq(2r5TKN03`tT=I>lC`{UZ z%AVenfp$o1cYxk=M^H;nIYz{it0zm-vAooh1o9XeW*|wyNo! z#2!#JZ=d)xaxn6Ve*Q)fs)ftjQwzwm%;*SGK2A;QHTaWK`>wR*cvY9F4Sp)7B`dq+6u~Gh+&a9sjPa-TU-@>7Q#Fd~7bpdpRN@{}1ey)Zd zL$M-)b-_XL%x3ZzGFJ7Xq)Fs?0oNVH zNr;hH6!tcFr2*7~fFyMrd2NX*0OBb;k0{=3EPWruEXSM?b1Q)y#*>^ky3c=0cK?!a zy^5NENBhMn$#rYbmeE{lHjgzX21ynLi(n9qgNF4hD#|6mQo!P1YMPgPW0Et1Y}VK& z%pAQ=LMDmkW-J$ud2qrJc%cW)#YDglL*XTX$mtw}n{G4Bn=l7ZQjky*de1$V?})}w zfBJ_ZaZg?T*Nik6^5NPH6UE#V(+m)?O>mTdYYHGIqSGbV#zB%KHc43#AzhWp>gLJb zyaTBF#1N*_h;f-*b0S$31)>2JaPk6)votj5lg`L?X4VQ#H1e@^_B0)2&!%>sMT!v1 zOwn}EKd;HMtCD}vDEW|s#BmG%WNIW25K_5bG9kGmXHlmhnYOf{1z7NnoUyIYwcg_rzF zABG>|1{ciR)#S6u9;rcgZhtQsfBlTvOz0y6|kh{5gb(mru(X58&)RCcm2}NA{uVqXN+?9U zIrG`KVc9cT6&NFGR@D$Gk0Upmr!)H}F`Cm0EY@Kz-UcAn^zx98n^!Rj-R~f~k$+SL zJI~X&iOv&}k9XRr$5JbX4Q>;;*=oBp6IhwVZBKlCb#(f4){D5QB}|fe6IdCzS`M=4 zH%!=+EEYNBZ}&e>%w@Ut9|`1Sfeo@J=nR(6&J(K2hO#Z?C5`y5Paw>oIxB-6{pEO7 zgBCmc1Q(WOY`ATfVC7siDI~>g<%qeng{77ttCiYpG@7cv(0|??xOIY zy^D6{fGF#rtV8p&@t{uC5Fg=vXxgw-70h^JD4=SH`SL}=PGU84EQfV`SU0_xb)uol zjL4w|tUobb)!lcIi*MU|Ts3{o8tiWzaQhm-S3N6qKFW1DOU^bwUpYf!I?q?VfV(l@ zf4rc|wlr_Bh;FcCRlRJszT{NB5>Q?8m2EYKZH+!-HHB@x#4$&PZLzs}qlayCxO#J% zZELxDYnyHRxO)4VZRfsv=O5cHO3f}d`{sV>Iyw732}vOx`vIR*He1bsY|UW?@u6zX zkqNuEwg&sL6Z?r|*s%xuDYV8ug8eMzx;2CS9D03H!hXSZecr-;S#l*a$$qt5bG6NW zeOz;W&Hm%Q=Epzw8<>Q)YJZY{xTUYXW&iMt@5c=a65xNy%l|S<*ekdEzbj-; zKE_vEZ2Fq{UzPFy#>Y5*IFf!i4t_YMrT{ZD0mIiu{}Upc{ud(i^P9awWK)2tDZeR> zpX6(ed}96zloJzi+RJg$!ubBnlq)O2t&KKG@%pb=`F}{|iM-F7y^@>r z4)7(1_9ch^vsyOekN7{UWj=7FkW~w>Nit4iA|I>*r@Wm%JlrfI!mPSRvasgAG})|X z{=W)YvUk&A={3V$hawYmqh7&r&3Hund1B&u`>Q-|hqt#Mwq`8UPfbBLmgE16kKs#+ zo9Bt}^ThdIwf`l^aCkfXynS=29X36kIJ%j5zFB!Q-E_bFUw@o<4u3Vr{{tMizqUSy zw=Ax`g5!aKfmd)meKWoIW8r^*T7*v#ymIZyjS$}16ogAgymtdrqtjP#mKfMmkLi#&(tdqq z##Ghy`AW4zDLLM)+MZPM*GnT1SKBC0QYa18L)IHA(L6F&I$OqEM*rPMaT0&XoVonE zD`B5!kt zH|DS{Or#teHqBXew4-&SqG~T>RIXx(pno7UKu8uNfWM`%eKHkHDDGZbr&BdeSgcgD z4#v9-a!XF4%oM)dJ;rv*Iv&QxgKC{1+S@2v(8jH=8t2x%=qI$Y0@3F8s@BObYy>c~p7#FFLdiMOJ6wImHN*kfw@%Y7D7tR_z?# z&sPQuwbZ7hi|GTn_8P%uSK=cfALGo{Gv_>fP@U|HNOIbGvBrM1@J&}R_$8Q~So_@b z)`wEiPBL>V65Q{}R2JQp>61vSrQ3AI)WowzDx@%vcgvq#)|T+s)Wa%%5zot^@x4!| z3>YU4hP_+st7k7HRD3E+T1cs2swqCR`#A(Ahx5{>bC)xbF_m9YqLY;uXKjvqJc~0T z?XK&%dTjI)l9#1~K)hQUzp7u%P+J+!6Xf2!MWIUN)elazo&A})m|=W&CNI?Ra2l&r z^>eH{^=QNRY90%VH1Xx%sgGM-FzwgKKXyIRB^q|^HUsVq&aH!nssYQL1(?O0@;iuk z{2Ao$Kaw!HjsA4Vbi2(HC~St#lAfOH|JiPd^;~bC{C2Gj%gIArY1YxM=jqzx@_L^D zD=U1@V9ccc#*f&MD;Wiwn8UvKOnvZvkm=_oljw^60C0qt)9!`dY$*cIwuhb!*2gTs zpO6W14wXQ-{y(_8tFAWRMep|kf@^VYafd>oSSeQArA2}iDDE196oLnLcMmSbrNs&E zE`?&jTA&mwZ8rZo*P82j_Sj=TNBd;w1>_`S+~XcsuFvl~srHcvZv;R^*2m=da+Fr# zH)?A{Ea|OdsJ+a}gk0K}A@TSip7kvD@8mMFWnqM7GUmr3n8EvhWCEq^bT)h8Wr@Pm zV%JGVZs+@@v=qE=Do9traMqTWB*E@YzDAIxLRO@XiXVT?Tn{Dtz{zG+Sk~+o;d|20 z=Vw-i3~G9f${xIot++40m*_p2+>Ja~Q1`mQe|PY(SfV54Vrxhi|4eQyN|i)v8F!Xe5R%tfW)*r6HRoY2q*{rV01a5k<-}r&qAZWoPbt)3ilpNF{>vgs z$evY)nMNi3b|$&1Bg}q7W^i;e9`tODY|@QAI%iegHn)V3|4YNzvkQdMqiUm!i9`*P z9-TNS4!(6oCKkvO+Q#)bvN&bKNzIA0#LewOoD4C!B40S*&KetbZT~7^qL@w;?5qe+ z4V%n-I4q5yh=Sr+6=pyc1>=)qt-!qzPqoVh(s2jkBY*=3j7Q%67%J0KI4s0@=Y%i! zl9_NksnW<0+6 z-S3eZn>vFB9+`3WO*c~Gx#LLnBQw6~Igfh|c4T~H#y6jDCx6(jRzEW1n=gO}{veD; zW=wb6+r%L74>QIhGwhq$&ky6^eWogQ+fTjpJgk5R58!n>@RUdpro{UXGajIvYKS&C z-6GVx9U{{djJ54%0U$Dm#rP-VJYyeEe;~tLHjRnlC*QQF?-0tGP01M(RxINy1JV(V zu{n>-Sjcxwf2t|1v1XtDxj5nt(NC9{)BP7Lt0Ox34RH!QctTxwC^C~k&x~E(L*7uM z2}mnn)=AAiN5$Qc*MU$P1|O2=Q^yQ=>QnJA_4kXdG_&s%e-?agInb7*ozq|!E>EaA z(irfaE!1=?(et<0;#i$dNq4Id?Qu|Vqn-01YN^rdvehfdnygHBD^qiJMWvZQsXSJAsp>z9MPXxGd%rB_WPJ`NV|x8{G|P4j1P=WYDgH$|LV>R+$9dKxz? z&$PCV$gH_nP?9h}!t8eVe)wt?k!1-4cis>}g~FIO9}e0mt8n&!1Zi=(K5o&CuO+u*o?F2=;pb?e2k%-$s}%o!XnWw)Kig)pxR5jpT28-gy;Y) z8J9V%;PpF~c01R2S2AS4p-{c}v}gQx&kX$oVbR(Nwa-6-v3JmaO}!!S*8s6n_iUG? zNh~(|9_48>}q?H_rUr=vQ%m^-0$)_6(q-gLh*bY)021g(I z+HwTPM*_;JoVu@l*^~m0+FWVuAT)3*0V}*S3+5zKJ29Z9yE=czp1X_8adC ziqI+w;AtypUDS0+-z#q>RKymut?G1eEYn{Y@p1Vk#Aw+cRqoG2jVFQ= znr#>G!@xs3!*!byFAIvkci=Kj6~-3nww@6kLxMrt>uPHry=H?siw)=;G1Z2nGea>I z*@5d|Ts%gY1BY+md8Fb}q#x%q3uTWrcF3Gg5TCh6>OllO6o<1AB1Zy!M(u`S4otz0 z^2@X$Ktf|~Ba_?EP0YdhRDRnAzIg3c03;;HFp}I5V%+X}aBH7T9WArs&2Ap0Sm9Qv z?4nQQfWh=;50B5L3O>CB@-Sj4B?cGVB>aNK2g9r=;em#uu?flv zY)IoLzEQwP|5R91DMcuFHL5iOAVHNRrR*Xh=6ZpZq}K+b#|77OhUy(ASA@r`VPi!a zWj+^ofWLDH74vbsNhqN5E31fgJBl?~rBf4+W90C7BNJDw9aP+q&EkV;p-g*E6-+M! ze0Q5phDa#SNK^TA- zZ2W%OMH1PC(=uk1WLTZRamq5lgVa!U5&%G;aAMU;ztU=9)pv;|ap*AP+fhjmGA|pa zlszkhL?vH<8dFHS6t?QAX_qw?8C`|rx?$*fr0Cg%%+nKfxvh-m<3xJ}$*TTU@U`9Q z{uY|;Q(jsLEnh7pQKe;FPGvmA#D!uJ9OL?#17Zbo7?z5BAtf<(Q0ofkZDm_-fx;;y zEMB=d0+kNix6K!-fQb8nU-_8`W@4jlyYfOk*?V0wt15GkE3>#uU$#}g9&yPs$7`g@ zR0er#W8>VUd+V5Eg9?+oBCD!ylYmsNf_BmRiDeoRq4eUR`P8MKR|?7%${lReY(bF{ zAj~YPv@3XFnR^A1YMcr*$S)Bs(LCa5Mg{dUdPrL>`EhFeeZ&-`B>FZjOT;hI&nl|Q zFORD5;X0wZyw1QV*jY3@&A}u?qAD3T2~h0{fVvf^RuN^ybXB-m_>~Tcf{vElGHEl> z+|Xb$4JWJ77hIwI$^mUR)$Hf-zt(Wyk0jmWX1+K~T4Qs!jxHyHl-sxA;+bQSB7)w!QEH3muoy<9j3)G05HfK3l`S_5kF7sf^|r zmC#jL{FW|?POOEk3U1&CE#+z7vkeaAE(V;ZL~x+LG%EJ8b!t}wX^X)LZy`^W)2Q%k z`;kq=V%^i3pK5hGlz0Fhpjxu*h&8Z>%6gF_cE*WAm(dA4AG<{dkzSS4Q-;z9o8rLH z&RYgIJ+B0wONy(8m8zq8@MGlD_BnjSKrf#Ko)x`TeHjS9Kk zLHUUR4FX3+6DMWfA@8=qoNA9l_>j$D-Rfh=Z;l%kJW69)zyquQ4GJA9B-yK zOU}(|$sO->GHp98=z19M?KbJjt?4tF80Iw@s2LdPo|p(Q9#sbw&rHloPS*XJfT~Zf zD?K>GC@>=cCPwv+AAH{-xbb~H-!mNd*`ZO-$a*(q)!v`j&T+S5h73ssm4%C#c~c_5?LAQKG-i!(FHGjplevq~BW z+ewi1pSkyhOAQpufA5x#)0S?XtTjx{95v>hUn3x!i{hq>o_Qmo&I<~8Sy3O&{PJcF zI#!N;Etl>uMsBP~o340#T=9urb>dqcJziDC22l8B65W*Asnz_ZF;2)^-T1WPWb7s< zmPwQY!ap)j)mVBDDPlG#>iNST!2PWH=<(6p{G5F)t#-A}w00KXV{NI>1{T-zWD_ux z>c@zw?3u03(W9Khql~)aSL5n&j@{@aT$51WQd@37RJdh=JU(bUJ8y@?s2JByF4a#? zpYoN^t~$5zHE_R599?c`Nn0uR}$L|Q&?J&4(Ju>ce`%HEk zaOX`F{ckKT<$|^AuegNE!5Xv;&ectmAMedVc3Q{)RxP&X0abKow$i#LK8DkAa7<|A=O=9p-x zE55784BESU&@aN3!tYUB#?;IF?>#;bQ$po02d4x{Ac8x=> zPo0G^9J1JMc)FY}MxTxa#sL5wi*fFK8nnuE5mX?oF{v{Z`}`&TVf=a*!uoyJDVx2x z=)BHqW)zJpVTVgvoy(WwGHMxMs#JiE8*axj=pujP=l3XusenV3CfaR4n9+uMwhMZ` zG3qb>o0)a;=M2CC9*eC&I;9Vgo&%og%T1TnrK%2a;IGCGZUJrJQ&FH9;|YK71s#a? zS^YLR`gB3+fJ1t#9P>JB^K$Di2#^u}P4g!vF3!_JfNd{2uZs82*ZJ6P&g&y?)jgm$ z#D_n07Z$+)YbZL|Oatf;JzLX7XRQ={JyTbDu@vi+h3dQ_`PU#3AiU1qPSYZE6APE{ z*6M5F6U|e_sG{;w*Y^!LeCOBsBsb~fUNe6W6;{9Txg7XU54RQk-gKd@ON%ae2BdY3 zkwu-yC-b|>WO(UkB-=s*(w{977u=n0{Nawe`nBq8G}an_6iq9WFXLjY_hX&#=^u>x zip!m2fM8fGX9y6(8~Rpzr$4+z?sXWojwM_RAQP2M-B{eusx29%>cLb5mm#E%n)5=R z>}NI5&SuVn$}kY)$tMesYHMLBbD=#vbTpNflXDmY6tWjs-jr+PNqJ}LI1I(;K8uca zps*z2ksS_0U)a%EQOZ)!jS5COak6Sj$jV!?k>m6D3P_IWnd_`;f}h!^89otE0BBW5 zsCI!*mSI`iym zg+E#Kn{sXdiknHMK+Kg~;?`2$Kt@z_hUbApe$U&<_jm&pq?$@8sTw7|O|2S2K&81x z7$=jsF4&Q5IG)r`K&n$&cnlhFlV@wecWwAl(;wY;NkER@Bec>V`+78yno;(brWYx> z;0UYU#QOF6F*+l)|KrVW{#$%z%9Z9*;cMy%glr{an6BI$-rO5N0&wk&BLkILHPd;L z%&H>KmeWkEP^-^c*Gxw6vPn529=$M@4C`1YfmckztK-Ccft*7DAKhKWATPvASEVR+ zv5JeQnzZ#UMODU&R#jQ4@7 zd(k@iaEmzC?@N}sJ_o+c@obmvHqsXC*_B%HiW2r^N#$7^#RU-($7QGr{mvtp(|7Tc zl$L|+!vYpO5Obm;^lxVTba%stIQ;Uzm~mwO?XK*J(7%|m|5@AgywLH` zzEr@)2*;Oz`ksWDfJbKh<r z)Mym#GFaKf!E%n~KsK?ygV)+lq~A=iUbf4kh?q5e$&bu&6vX66(-S?PIpwWN+IEsl zIfrlh&)krT(XK7dM2JepZP-M-d3rq)DGe+p8WO={rksT-$y<`9wac@MJc;t@$|frl zQ{dK5f@uf9F#oXEQ?_b2Z*dt@4T%juXHRfh9{Bcd%C1M)q0!5Po+YK~wjp(BHeN92 z15KmIXW?v}kIwS%|Js0+*!$FAOe|K+RIQ2vPn$eq!_1!Da7xJx3j~I~WvwB&>!Yxq zOKA#bWpKnAJyc0fovPl;x5DX@2=ovk;`zW~Dy|kDrkhaVl+T5_l`Ft}0j(|FXSLo} z7QmX%WL;y0u#0e10?~jOje1rQ`_EhyP^wuug7|BkpE4tPaRjyo^|d z-vr8+%wO4XOru%9h+N7|cX!~z9x%{DU(E63w!)dd(&~#hQuCFodG+4XrlszRgfh2C z5<4W;?||irn~P$`%G(L~OOkL+NgiiY*)gi}sBAH#)QqjmeS+X9twJbTc4j9Lfb<}h z5_p*RgI?z?w=8=8b#p};Bb^{_O3oeu+PlamszP95Yd}%o%afV~8Jc3f0(}a2oIDfD zlQC-HUUIo0K(&&ju zVM?I{LI-`~&dD(FOB@$p&K6d`jM(1A?B-$(gO_8o4!^iH4=qkiJgs%BkuQCJdd;c| z??pXjTjmOPCe%f^>E-VUGnZrHIq3256x+Z%1&vg6DVVD!^9uCI&t z(cnghrM|1f_XbS_PFgHWNj8-=kL!;unxVA-jlDX|WE<;xe%1PyJ7KuzhqyBHRa(ELQWK{xXbK2sK_OgPE{UWvf`f;Y@C7+$=KM#!i zsC-8nd>=EXuDVRtEIItbP5{SC5XEpa)WA1Mwm8u&B`mpf^HHEL6(SoPRPKl(i0-wy z5no=M$uS0~iGFrH0NSc+5q`bJos$|K>D+HQV~2**)J=hkbu+0a?L4nm zw+vf1DikM`VL#tqH+5}d<{A5Z%bRK20)5Fu(^mXNxX%gZKs-qzs88JZil)BJVStC; z^xOiygOk2K?&)F4lgey->-0C|Qy%KTV^c!M%k^BKdyLs$RA6AhTpq(+bitNoYJ%>* zou_Z{8N;mUiSL2*5?<1uGpjb;g_*fkSL3|R?FbZU|ICwA4jjzM$~P5r++8^8|D2y;y0I>0Y_(1p-bcAyh3({;NA6~jzX=$U;avdBZv+K^EuMH z4=yxs&bfSd$AxFP2v?HaR`{iy~ZlCN%Y@c!RxHAH_2Vn=OurN@vZ+ky$oZlhyd%r zi-$bE8u}-xged%pUJ+p?@+KDiw{LV3-@GK35q`_UGdJ*hZ-DiyKEw6Pi^=V#Se30$HNa6Hua28i#KS}7CYba&6XYVBM zy*!Iq*buTr`ltU8=(J~o=N0II!N!Wkmf*{)uzr<=As1i1o|0s-o#@68*ljPFs`&`m zOX)dltOG&0$>4BQyLfnihrK0V8(rM(IIJt1H2s8|@|=QlrQG6G+>C#Z+eYkjd+{hJ z+$E%=&5#7u@u4R?W{5I(D0^2j(5dOYMT|o>eiD#C?KUiyu{belgqyDBlscsU=V!+~ z<;v}3Ib>U@VRhH}KT~L!y^Voy6>Ays!{npuSBPV}DLcoN60RBxfduIvI_Oy{B|dPL zZikF8;!C}fSV>V>tybdNQL;e;aJQ=zu5`fk#$W(URp>~hUGj&wRP7z;Gxs57axGOX zG*wkq1#A2jtR&Ynwbu}01SF+V84$if`z05r@gW*&(o=fM-XWvZ{Jk{Y&4FC;YePUeAgav7gp|J!8hwj?yYHw5>$y&R!NiR53-EU*dX7Z z<3&AnPc0tBJC(z`lN-v~6C7q7D?pNVF`{=cBE$solYuNj^v%gtWZ?u8m{}7Yb|SI# zLwzLUj!Do`c!*>s+NXuCFxBc8y{e5fs`C@YuH*`;8?kv__~V5sM37KU#?Qq8IHQKm zlZI-LF!J^Q$soF@0Z`rkG4IY^!#CCp^$DC;%7EAS>RkYI9`oRQ`In65W01EKC%_mW zH05D!!h$Qb$x5Uw;B&2&a&J2i^rXE0TzxraEIL4|n^Ob1s~UHux|gcsOrzA=o8ADy z;4KtdRfnT(#;$pdW3&uyys7sj>)`t|o)}6?b<%+Q>r0RofMw?8E4PGL4`t~_O%yDw z9G_FGkc10)N=|m37EP;#!kNud(ff&@pu9!jiWa4RIhJ#!UD~cEIf=OR?6dFIy5^ia zs!?q-)Xl0+VP?^8^%@@(<_Of$*87di*&a&xgkpMaE(#(<{9CtLOz-nKzO5fuX@h#x z=zP_KCafk(D089Veu64ZOMxL)MAAz3RtJ!C#V~pf;uix~vt(D7t zKofu`OZfoF*8Y31R&^~fQSMmY$!3l9a1d7?3vqLOF z`Qtki6}4W@8Bp*zt1?}ZT`&f<0oRNO=D>JT(TELOVk?W%yF7MdZv)m3P36r7G`0Hl zAK2NnW5T0jrmERZHI`syqYpKtosAb|yvhO3f%zDaKvpjGMf8@XX9tkmPjDH6Voq0|0Eod z8;3*t3PZ_yvA|R6m>!hw%&x%F46ti$Zx_El#hVp=-OBlPqZy<2}qy$$r-K=znIaf{K(^Uwmv~IJjuq^(4^YkrI)FxczJx*Ota2%`4gLI_nk{~PS1Ftcgg(+?DXlBwV z>K6kMKO3>W6bY8DjrGnQ?pGrZX>bbzl_DGU0Sk@dLR^i-UB`|Vt^Aiw^JnF(Y)_>b z#YWJFWH5m~;$X|^0q>g7717hm|suSv^)ZTTGhtvcLNR(Kahhu0@=g-0&=VZ~xs zBw|-IVpqtfkC8}MXmD3DU-tfi@%8ntG!cUo)}Ac;UX<*loZ_B*{&ZxVoC4TNL26Ga zeNQrePo>pLpk_~PX^&@OPvd%z{d7-@(wdoIUq{6HDeu0X{ywex{yVTWp2NODx;0kx zzEP_+TJ+xJ(FfgyT+_NiGaE)z_Cga)x}v#fGO={;%b!_Y6Mv{vXm+=`W3m|#Bl}a! zjCyJ1?x+)?u zHMb!rw9tIJH#|t24rFYr(yjRmaQaq@qY(t_(3k*8ZVz8+GELlT46QSXIz|5dXzxH| z5~JLE~V0bW@CIJAP@+#E(f>UFW;sleCGHgm96O zS6RnZHnV*SM|XvS;bvhMPRNK~_Hm1cF|5Z99=g^>@LCtgsEcEdSjXRaCn;t}Tb5HT zfrt57HV^HDqPuKEmn>R+AX+jrU zMVB=l25gQutY8nwgrTKR=vic6+=3Nw@WqkPzEj8ChqaKaGqV)uvDEKNp;Ng5VJB1H z&jJaU_0D!wN3s`JrdLl$KZ=`Z2snJRTm1d~3rzK#!S(ldc=z}ZJ3r-m=8#e+INQA5 zY){sJOZ0ZDq<*-|2gyiU@PF$83H-Gfi+oECrCndk+0|!RnwM!;GVHH8hmYVnBq>Wg-5rX za}ZH-NJ%IIe@96je6*B|E(Snz=UkjRXqmr2iCloL{vrV*9+;1jhr>&+D-VG~JlG3o zUc~oKycKoMa3`*?*P@Ts4yS}=@`DIJqo|MP+d4Z&VW|ZZq*2OL5|Z0a&X+L z7f%pukkhrS4F3y^_}xc+ekOI1D14|@EHdDlSt&Mu^MXEfsuPE@N8qN3L|`#LWVhET z5DW0UFx?+3)S2TF=Sy4<;c>R&RjkYn>d2HBYzsGH0FxR(()AM}h&Rwgn!5^JCgEhk z83`6#x4l!DEe->h+uM&mVQnYAH@1BNzIX8BPw^qU0CXE6 z%$9SCu0#xAAwemYo86ZmKIs~jiN3J<+3YV%IfqwaL4Lnt{i4KF$!^gTIL2jO`w=8! zpxYe%^hMt1;tlBdPKzMZQ8AHUFBt92-LlEvwfUcFLS2_c+opYo)BRhOL7x$-yqTVo z^Lzc;3S>obJ*h;AoD1gxh&*ncsJ{uM)|5MtvQ@TUASK_y)p zwMO}e!sA)GrTt_8Yo$WTN(a;#C5a}xge~kroW7F4Il2(?shvln8W~6+CqO99@!XeB+DtP38V| zBgeQt z+Lz?fO~?xtL?W|NGOzt5>sTtcilsU{X?HC1h3#C8{ZIC(+^5FO0a*GOlD z=eOyTdl7tk!1d`G8Z1t7~~{` zEnVMCd^jJF+b0LsAlj3oGYp$!48hyNg=T(;kb{G%NObl>-xk`LWteQ)Dm8_zAWZ1bnYUHoMqe10i z9O0B>INVqXUUoArQwM%$%~(uTcCfWYZqjD5)(WPGU`vjQ61=-8Yk0|D*tZZ~uPpP7 zX*q5i|8ag+HmKB7FP_$ZbaQq!nz-~Fx&5WX%}@oAcGf@`HR4oeP^u^_4}N*F(6zIl zQ(a5vfl`N z>NR(65K}Ar%5I2NzPz7tzFgfPIl*z;XMOZGtM5as=Sg zuJduKTS84~*cU*Od}FD^M1aW|IJ!tGVadv@oN={CR{OPA;4Y7$Kghdp4f{q z09=zF*+EPW99wOSHVq6kW0Zy1I^nm6guI`4PvC0acXqD+O1ct3#Y_*x0VwiWPRr)P zH&J9@m_*?Y7U})Z{PECIF~5~VsaBOZA0XG$P;~(;|8T+&11St=HBB#9y=r}DCDbsg z!vu`u;Fh+Z()(6g7~AiD1W^i8Z31@CF!wl!u~(oNel{hN^0EejLS*=g4NuiN_zn5y z&2ZnK_tug)zQTzKrUx{W+#L~X|LXdhz@Aa$UW*JPCc`03gOkYcLgf#*Nc&FTvB|#V z1}{dND?7E(Y?wAMYE>uwAQfX~a!-JO0`hUl7rO!kxqW4?5F`aRm;{XISRQt7$R7m4 z)w*k?L6^qhV`LA;>r23qS}ujP{)^D8 z%LVCQWTK{KQ;Zea^E71H!{#E*j)m>q`k(w3M|0!T8g{p^tVcq``(Hp*hmujUAp#>n zWeOY6M;(cz1_-fI2l`lZSk9 z#^_|3J;fSkZ-a^ebcq8U&&a(g>VJdJG$BXZe^!MW0;1~m-AlX&iVA0=PjO9fbT8HyEC7fKHJ;G);SCK?VF-pVbMqnZ8n}MbP6zs* z%)@l|mo1ADhRzlb*H;bXtv!4PH7wudf5xUy+*hE#Ak5#~%$0eYVNIcYLorX3m5~56 z{}GD=#C!IW{HgY=-cu(idVnlB<9d~8bhCzP1^tF88!0-1^th*&x+tThbo3$&m3oXh0fkR~U?3UP**KXkiTLUkMh2f;`Bu(84t_K^Mtra2w3&EreMUxg}VI%~Jg*tJPOew6) zsH>6F3sW+Xg%nePTThNmbMU3c&RS~UX7>}OWD9w3^bBAhRqrTScQ3HP0I#)3pl4@+ zZJree$VM_2!Hb_~9!)^0t#`(Rra8E2PfT+*svroR4UasB8IyZN34GIk9`}u~*wlN~ zAp5HDC@H&C9JcQ}MnXhaBuqzIoY$XbP^p2EVb~9*oQdHPS)>OSz0l~xr$!?-qf>Cp zva(3ivtqf#1oVo-1Zej{+ld?)=xy#+^9c6zE9vu)vADbj>kO7@)X^`!^+|X$#57nH zrqsz-rsHPxuuO}6y;+X}_NWudMTmOWkOaGIL<%6-Ct-$i3);`kru3wPx0Q>`Z>jKk z4f>Im?_Mf+?vMsq$DWu17?T<9s?6TqIa$i855wq;ftzx&>6sRX&!^z+PT7VyIK zmj{mKSsxT_%w@{0^vgp8%dKq=(k<4@ZNLYX+U2$pHU`jgyY%w6iRJd?2Reo24z1-& zoMllRj#K5%Q}WJR(aK4atM@D!==l;ZGG ztnkw0@Yb*JHsb)>RDfMLe83exfgF&C3P?PMZ@Mj{_?bufp`KlYU#qQ7Lxulvg=TL> zz>=-TOvT58L)Gny!0QT?^NJuWJ7oYIN@=G+0uN^AlxKv8h#=+cfMJU8Fip;IeR#MT zXM_zr!i6&u437-tghjw%@tjfV@Th#w=yG^;h@H%1Ve`LAoBxmA^W|f8Rumxmn4F~- zrF*2DkFnYRoA)zYs)Qq%8Y3{EonOySXjKN zRQg|Or(}sjMx@AD0?B`9XHk*WO^w{6>)c4NU5>MQ)SWjqPLCjBn=@)<1sJcwx_Kea~uR z=R|Dd;e5@;e$57Kdb)jT@jv#ne*Ca!^{RUo`5ysV`*Zd`_H%7)?PPI!=5+4raQsn# zKK5oGtFt$#jgy1<4Fqap>G)BDjvrnZk zWH-bKai?R&*U$CK5V=f#%Sg`remfY=xU|^lzq}_a`G348RpX=gbV0}CyDNJ1o=3(1 zcu#k9po)y!Ki+e)Kbqdd>xCM}|KdH%{_&nkP5ks`B=`Z3_Nl zR+gNknc!bp*|2Rpk|mi?-saM!XnL}E`41o2vQrR5Kn1tF!zRZ)mlB(hJVLkvx73`LG$8i#@@9U+FQepE zUalALL^0Z|swZoeJ8#@L(rNQca^$g}whZjp?Uu3b*o8y{uHEE-i{e2%e2@s?!ac{Wt;N%buWK$ClAUd(bP1sQ;e^$5!cyg^G=LK2`HE5cGe|s9b|5{hz>_{ z1SDFHJStBbGzCV1L2g!6%B?3uRi&ooSVzPZ@d3LFeF(U%$o(1o??ceOg z-Dvq`LE^L+3~v+l0!QzYK?n3!MnXGignk&Y>~O9rUT4i0j@5Jw*0I6hDTtQaQ9m zp_Wff%wcQ2hP=<{G{MFDBw2^IwJr0CPor8VVx0LQRl-+lm!wN3`X!o=tlDjL|)=jU_&Ptm*Mk{&rYUP6Gl>0)HMr}-Y zm@t!Lso3`T5@HQ>ExzX~-H1Qq!}?;zHYn^!JJE)C+w zjS0~XO))E~a#+-TU3$@X0T1Or2aG6n88fMDRf=s1Ph<()B`B9fk)b_7$UH}jv!rLq zLhugbixjF`@RnfNSYm}6#Bw%o8$AP27sUu(lHf2QCU|RI{I+LfJ;Zh*j4G#mX_D<2 zW`Fi`oFTlFt&gOMLxCu?^)T%-=GcB|0OG%(Kh_?zr5#TR+hop>(hUEPr~Q+Z9M<&J-yx) z{+IXsVKd6}Z||wV|MBNPS=pN}Rh!TMm6iQz(EC@RDujynnL71tAIUXe$nRJ9fVa2( zlv4r`qBT22p11u(@ePmOa~)Ucb`YQFF)M4rP4Ve=s1ywvWAX5fW*#!c#NHV1?P#fg zdpjaS)bzMAY4xnS{n2~ANP6eALsxQ(P>pX&F5=ziCKexgHFfFa@3ha4ku_%ay(uoQ z+nmNxU)JLKMdm!OHLv3xYO-$sMNW11fjCFjsFjp^-kHhX>z{XHZbV+Wt2`iK)ZLV= z)K%(qt}RxM5oLt_RWcdhkre*@92&cq9gFD^fNN{RMY)Zd*I84P{Jej>CT~kEb!xws^jK;Fj~SnF9Z7H zYX&14MLvUUOZ}f!TP6QbYpo)!-r8p#80Pp*w?OQwkKr@-JLqXMr(L^zKiCT8HV;HZ zJLe~ZKW6CT9Dc9qY%2_9#|hZ{oBzGuwdYhifrbPZE`r7=OUukEOVJYy`HZ#=jH&M5 zEvx+15VYYYCA!|ahkDxECi**ySl)OO>#&BXj?iC(TF~veCq%%8P zG-NNWJ{6zZ-nc*Gm%$|=VEkS~@@g%nF5K{arZBV}%62S+rqml<+03K8gN%ChSX;$;E)sgozId1o^ zT~DuTT>qSWn*2F6WxRF%{S>E8#>>;y^pnwZiOz6yH&={;Eq&2joUp*nx(sxnvVg)f zl7@?}AEx-yh|j2mUqp7wDVwL#{I6J41@X8VUjHaTxvz=-xQWFNypYfI`)1pCJB%Ml zndsxr)Mg_MKuaINOZ9=eQGw0dpdOKcf@SalwpEsa*OqAD!L{!?RdD0AaSI2ivCYWq z-0QN{Kkrv?lR(H7*#GsiSMJMzk}`}l5zst`>rA;36D(kX14u*SuIGa}8|l4ZYl=St zt=aaqvxQ1g1}Z>-p}iju%EL(Q9M=t8^tYkp)InxG!GX3;!9KW8W!xXyf_h}p6_fz4 z-Q1IuXn~yJxST%7$YAp}jBkhDS2xx!haX&T!APn=C#66&&cOZ0wi*YBWyW6|5yD{z zYf6N%qd4)S5k}$&qdHM57XXgO@+vxozA5RiM2&WaX4_as;kXi|n4!|K~ zj3|>uk2-_^;1TH5ADkgj|90pO2fE(5w{M&8%1vOWoud+Gyc-1kN+!t9Ap8y-JE#b& z+dI0Q+{$F=%&7l>~dtcy&ut;n*VF|n%j2jV8$(?sVE zB@Ep;_i;tRVcsBz?DPY%gwHLx$0E6%k^W5?iLr2)xL8!4LNNy%D0p7vQ|XDz5jtN9 zUd9Ujv*J}}kTG+R$1fT}%$V^_9JEgpB&}GWse&sP9fOVVz2tz&t;J(PO81sCKXQO? zvSLFGAZ2|8^ScFQ%pT;B$P`={^cL(TYX71m%fTnO+o&iI9&?qMh}M8PPUB^$jiWb~V!#avTgK3< zh?rI>RL^o^+%D5HDti1!RN*G)g>N8)%Bnjm%#l0TIXlEv!ubxX!c{dIdQ|>bF+FJ1 z^OzE@iwy|IOI$rJ?-6w-b;CVLcirvGNX|@H0M%uCdrx5JtM2+m{BS zMLe)?0o6h9D4jrTG{ln(q>~KJB=uTHvD|@$rF#=B__6Q)3=r$6VQ9+p(D@1m#lH+nYz;~k*jv90NJ|VUm<}lg4S@=V zl&FS6CXH2p4{1{k>q-pk{T@^|bOF&(iB8gVH2Z{Cw? z)JtO2`@eb5poG!V9|K%)@9AP@iIo-^GzR@*8U<4?iiLYmEYtYkoyij88Kx$wTgI&( zjt$yy?`fKSHB<=qo-W`IUyO4l{_&m#`V;n*6O9QI^;nKg5|f2glU3@IT~}irRA7eH zNfqD8566=O5>s)gQ=yl`CKy)TSm64*Pcy%#=BTDWY+{UT8BcTm<2^UNOmA&X17xP7 zD$S?sr$V=eDyJqV|Vue(ebRY%N*kL)VcbcBIo>d(9DneIoy-E71Md$g!xjGc@ozl z`ouX(4X{qu{MPaO4c3BA&;pU!0tm*rm{71#<}>XiGQWSkkgvF)=dy^4y(l<6D3>^1 zZJRBK31%nrL0(@%ZCFr{#3a;c?e!}Zt}aNZ4y2+mk!mnzq%KBg&j1N^bS@w$2lzYw zu~z=G@HI6Q9+WNO2$Rrub=IKp;qtULLYu12_>jM1dnsonD(OMJD!H{n;R^OO4k9`C z&fS1&X+-E0F1|5a{sSLW2Xz%-k64{p<_1PK|5*O>o4$5x0t>Z|q^ATyv7_0> zX3Zze4&&TrgpT0N&O&tQ;5mWBJhIVHQqtm@>kW|p+DX<1CUc&z8AS>28p3DKvFpLM z#LcCKP0Q&`5i_tcT9sC@@h%J_d&$mCoN_%`a)HWq2V}ec%Xj&2rQ5!!&uaAgu>k@G zZ(BXn2A&xj3N2c}B$9EMe?^P`Pp-s8BR2>CI29GddCATE3IxR}1fJteR|a9{0na!pnVxkEO*i?7#oM)Mvu=5-5q zstSAv!jQ0IU0MBoX#HIQRZVqKyCX`7%HylG0H9i!r)p6Jip<_r;)=CdUf~=9ZKGx3 z@!kpQK4;QSk0d4-!&6yh%YE9vq!}@Cb@hXB>PhtegzH)h|Jt{HBv!Yjg5%?3)RS(m zebAqSyUM}?--xv7Y%^E`_>uFZf`8s?qIzK*VRW?m`_E4zNnp_5mHL3yuY7wFh^sa^ zp(ZoOW;>_y*k^8%CkkQviT3*rjTufeCq)lH3K(_020Dd(ZtFUBz^cg*PGhUkR&AuHN26Z4#l+*aPC}ZcM1|&8#^-35qd(K zxT%YF)ZhZrR2vaK5CEAL4ZUxJ_0bsT=G4mknwTXlRe9?aC+y=665%M)o4cbMsSG{M z69e&6QyF9@x6|6f)7LJyfUw)podYiJAd;8l>6sGk>1;*&)|0}+m5_;9Ux4vlyu?H* zQy-8!Cdg|%)eQ#r&MpEUnS18DeS8ygY7n-9mz{?vav^~Tc95AL3E3t}@~kV$uq)cn zb92*60Wxae)q32$dvzLJb!j@cmD2Ykj^$ol{Xr@DUIp8oYS(RHX8jv`EU(&mh2r(s z?X#+Sq5!*`**I(h~7UxzjX71v?5dnktv|#f*>S^o5Hv{MPM_;2aGtMA%dm@7SHjDK= zJIHNX<=l;DnUUuyZ}~Y+yeT~IiH7Gov&%C)6fBbbGmCYz;^VV@a7GpS9S6y;vciXk zqLp0OZ4xZzMdc1ni<{aecz?zMjim2p3j6+R>a&8&AM)GxWvmUcMGjFxm@FiO3{Ra^4Q&ug%w?_sMQ4yBW*45wYfmK(GiK75 zseQADK#~q07%slv0w~X6lK0u;$DBh^V~!QAAzwNgjb|{4B2rnfC&+09@qQimTA423 zi?w8vCDcab4$G?kwn3zglqddaq+WiXKr_8WA|r8JzE=CQ&owHO(>$wgLeTe#Z|_P7 z2Ji{k=h*-s=?l>#xhUGI4<~lx7{0eSWg34!nF^BjTualAL8eM4#0V1H;Imo`BLsv| zQvzU$6O=-3SI_hAwiR3`yqVp^!gIxJ`$gqW2Eu>?KefNEnI5;JsVuR)?dw+lCLKa5 zeKQN;wrk>A^@J>Zos78E+dgU7?5i(9Klz-MKlFG$jp74RrqBUlb9g^pI)*7)p&yqO zoEwBEp?SB0b3c*#1gS0M5sAYO{6SfW2)vwhF+}nXr5n)C*kxM}Y7^zR&H0KwKb=(F zs)|&9*7OkCj^mbHWI3r;A8GzZZgMwefK@ z{&5q(-zt7h+n`UUGnV15*oF{*_itoDkrO8feQxYuq#Mr5> zX++#PRXT#4v7s0BwM%nNw1G?OtkP?TmiHRnuARFE0oShkMM75H_Vb-h-A^R!w>&SX zzZrWu(q3DBw#_tla5`0b?>R_GBT+h_A!WKS6zN;=tyLgd%yow4_RBXA&*&%hnXl1b z&X)KPseR@tnf{zEzKsd=on_Ff_Q}1i_;b1A*%ADscKUC@W#Oc7$GZLb-#;gNBBN&S z4$5Yi{g(x>YmJr^i0VuG41T%v#jC6H%D}V{>Ib0%?$y8WhqSa~HARcBnTA^Wrt#7}ZR=xq5859LpV43hQ~0*V7AOx=4f^3~8A zBQ8U`1ij3vrMm#40bkgdPmX&&i^z1r<9uyi>N*ITEPUq1XA{ zg}=Bx7pM^rvh(+@Pv=wx5^MJX$oj+SNEn4H#VlhfMvzBL50J`;R>)-qMj{|~NrMLr z%+hH?To}=*f60fONwRP3pt=MKDO^I zLqi{OksM2*OqyGMyqHZamZ%!Awka1f{uUD{WfBthrXXUg+?8AGOWa;eI`cgvq4~Nz zicc#+XT7$6tUo5x$;A08p zIWBP#R1V3?rh3L^TPjt#?lY$<+M6>gOk788bnI5y^{pa#7HtX=yYEm0-a7e3bXoTs zsJAAT4r8z3!kbE+1Xz5r6@8Z+3nDFMxhW2;c|xnS_(Tq-!J6=vY5>~IUS69OHBBF8sb9vih3!_`oXosYa5aWk& zIa{WUX*4oRBTSbIHrxBT5lc_8!KwOpZ_`UEQJ-oaf5j6v;r095>E)5`*CD^6rL1{X zE**odBZv^Ngl~6Nhu-G^<`IlShT`Yvpp#Ul^wiv*RxSe&TWypdydnbN|GyZ?CD7x`z{N7iDn_fMHDH_4t1JV3DPmGag_? ze4XXFRu}uo{=Nh?lNKj}uf>bn>#V=PpC3cKDsCTZn_*UT+KS$coEMt=-i6pI}Mf=qhG}S*iY>Rp1jDJ-^b>s#}VGkm6vM74V3)k%_NuXW zXpzKnBK4VAGzxU+y~sL}tZPbrU2rnHEw&RdG#(9^~eHS6*1`=J6q z_baK=38Lx4r&q5{3PWjen(z-_8wTmlr<^2?58<&t_!-r=1_z1H_%2FHkp~K>TG@Is+yWc)9#U2EZDA5dmr1BtyUg*K~+>XC&H5@cm#Bp!5g3R$(^*UK zkfUtFx@=8Nd2ee*U-~P`B~~hADKtmPvzq=obXf{hS^5Ww@^jhxTsin-(|sm#tV_5- z`vcq$13U%P|72wu2Lsuv_!R~PsRm&jSOc6(1My)wq8Wo?8G}(JgRh4MC0xi}FAYjP z$V(s(nBfn21`f&z4z0#^$mOF@*pzV3iXDn)QPAaezTaj z5gMinztbD_*`oBGV#iOAvp%lI&``#q-u_$DfobO|KSOvL3AeMwt!V)A*yvPs86CXIkCy|6pADYkQXawar*Lkr~ z-bgVb$tGlsM-Pqa*D2=@O+@yq#5;^ovmtQCC$dy?NLrH>2DW|7s{mO`{3!vVEFv(A zc15d?O1-3u;{n$Cl4Qt<^8GPC;AP~H#UGLpd|p$HpF@_qPw&MdVvogN2P8??#9ji^ zJ~!icjuDVrp-(2nY8!=9s>D-{Psp*Uk0Xq+Fk=0TNJIhxkctsqC~3-EvQSi+SmNkA zA!>Bm8hFMGy@RjD3*ulsU(gT8)bjy|oOA?-g6JIN8T&(+kTD2$*vwhNj5=*q?H1!@ z82)2eZ2s8f$zIaesiXp#3x6Ew_(LdLS+=uWVPvz;Yl^Z|IA!?wLk6bL>_{uD#ZOq?T2#r&kv^mguC z9z+{E1+>*9f6;^$?xB-^)c&G}k_}imC0jV=U10E;yMm+=PisFQYfWOQ6B7e|q^N%{ zkEN81l}>~g$Ptu`!eyHQDB8H9*b5;AZ-@v8e=Fz~CXDUABv{~_uQ359mzm|}VBQ2Mi1!fYSyBU|yc z=Oh@3$&PYuM|~YxMw7H6zRf5eTRS;xO}k@ky`&2$$V)<~ICYhg_{rbksCc=?KdO7o zfbCq(O@HuAvh)LrUabKR+ zy}bgHHJ(3u(CoIs$PzN#pf=?$nNS}d2)(41^V%^LpO~7|z4fG7CgkkokbJr@Z9CL> zn`(B0tP9DUnk|pB`=Rb`wq0AjwwgGxroWQikVaywN${+_*N_%1i~Fpwq=3Ce8!&sw zMOF&xPn-h!C4v$>I5aUAO9hu*%PJV05`g^Ju@UV{U`fMiW&S^Ap9<$5jOLH_5bROn z9xCQeAlv?8IuePCT^ftsmR3J$BN{a{ubS0ouEIx=!x&i+4^j5g$)?@aw}zR9lR?7F zVqx0L9nqh_(dZ4z1nrY*g4+sm5sK(EU$vVO*HA4X->K5Dw&N@ljp;qj61_owBj6__W2 zyJ>hyKd;kq&C>oLXwYbyv#$`O`55KRZLjefj&Y)E6syUO9~O6^GlR_bQ*0!64pl>x zHOzGBdX@syOs#6dE?Y9+4-lF%r|-SC>HR(Vd}kA}|F*6z$;x&pP3FY-?nCte-#o(4O@Haix`nL3X4IsvEJ zvG%qF_6GOEe*LFG%n~-o_`#2-p{QqJBxm8m*#_o2tVbgd1BbP_L@zgochP4sJp^#P z=b%a3S^Ug!{E9>3%vs{&8TjffnZ(fm>pWHXT$}Se-M~>p{XEmx5#(~7opmmsaGu-Y z$Xb7%zv4JQt{Cxn{sHx(nB<~_`Jz<#qHHE14$0aj+Sb?sMLOc5I_sjQ@}jomqHg4( ze&wR!CMF2AB))tx&dku>z;Tn&cg^>;X@c{>d%xx9Hm<`az)(R1nSxg5zNGBiTs2Sq^v zQ6kR~JhYMe{*+R9kvuZUMo^#@StJiIQl%NVsN}kAo-X_x0a^oY;#|Xccp&LQ#bT|uBO@flGPv`EV< zk>^<`S^%WOzt{Jg&|PL^2q0>O<&2Fyj84<<36`;XiYc?DL3sh`g%A zLZb0lGbbd$b>%0!iRZn?>UBF_aW~#`M}%Gf<-VPh@{AAjoG-fnwc|>x<(U9L5fF9d z??VQNeA^!Jz?ODL&yM<0dCehx_r(Kc?k^%Az#USJ!h`k>7H{e1lQeKz4{PAVa$C&q;{MH-X3shxsRX;^S zc7N1)dU&G@)JS%hin)=tf8=vOUVatD*Zl2S3VHbiBF9o2%S>KU!8kbM8=vC?nY#j2 zKS9Tk+;AT;m7x-=_xyWEk8Y7lfCovLJBQU9TAClQ*SnE7BM+~3ucMw^WSef@_#s(Z z_=ud|;WYh#0DW&ezJ(dyr=q>6$M~9yc*^;?l8OW*SYDISL|)B2GFm)5Fh^=SxT>7p zUv=E<^aK$5y{t-kXWTySb3a1;ybWnRr*Ez$t8ZzNJ(X$v>qY|<{GRKRp?b;QVylnX zJOKtY&k=^#k!T*9Ns!W*m&9b?^vo?GsoO%tQ)4W#P>g$Xr(X=uW3Y&a;;y&WnOk`8 z4@}st4!|43@G-9IDU1cl;>iuv3suK`(UC@$Bzs?u`~Fvle|WNYLd?y~>9fx11I#=~ z0ruT6B?@ebgvE2SstGhCLn3X8%A0*}`s4$fGIYgcxhuE09o=2YG1LgU`qhG8Xw~ z<-O~!-z-||=WM@?(x*pv_z%@z!J~d6fZwU^kvphR;Z&P&_H-xQT#+;h;OHXV||WYTSi-)qt8wejz<%%;vfa7*G5MI!j$soJW?3s{7lk1tq( zQpw(ld)wZXaR`f`C)GUTFXa?TQc6l-=uPQLrkOUxeo|)8tBJAH*QjYdQjHIS^8a9c zqdOv$wgLKihF&q;EIAtD&8BCtkT0tUyBK!Hubc`;!DTjG!#kWUMMX220h;hg)!Uuw_`zJv6i!fOU*iKW3hSsbIXEUVci<7A%8RXYbv2=A*H>rbwMyvfuC(> zu7#3a55?Kr7;m0Hf>tMnW+3govTiK?D zu~Iwdqc5*p6vry%Ig*C^TY7{hcFk)#PAiR366rqW_|8cB;Ty)~hVMk(*60C^`D&N8 zT&AyWtSp^!@67`36weQpywEGqU?u{-&MU2y@J1QWiMzIH11jr@cBCUYz%p4tYvq#~OJBm85f_@s ztmjx2jCSZ%Y7jlRPJphdK_1-dO>9DN}A?LttUPGWL6^#KAIp?@IuVD z2rrv&I`UA1^i*^bl)JlDjKMSY=H<8pB*A8o|B$5%3lcA0F*f`*KunFrqKPf{F# zhfocc710hfZ_?UdkvZ_OQ8&IFJE2kgq=QaWysPiTVYh$4a_h43>d`27QqE*0DJK@e z@)d=?{gpe_{jf?erR~poSS7s=`%)Es)I_?oE!SXx%n;yc$TpdpBoC7x=`RA|>T6TWU%bbEk+(pqS#AC>Gv z!#gw^*RQm>+(9TJ%c(Zk4~hi|)3i!ZL2A@g#crh$-DedAB^F!8876q~RIjMX@^_oa zzDz6f1H?1b%4ZP?o6CgK<=iQ2KeJV#b&KTX55-=~v+q+!efLVirbkss+fu}nk6AF zfp7C4zUWNQ@WE1H-zjB7rT)HL_DaM4nDiRF{Eq2WMsE(YSlIo=P0*V-<<9Vma#TG6aXO zL{ZxTpI96cCHR{TFOn5L!f8HGI0FTTx>P>qPMbuElb)!Ib(l@pGgMjqz+UcvcYQd;|fqb=V2+?V)ckn%f|>q(<1Wxm=WPPT!+fbon?tg0km`X!7pI1u&YnV-bY9~cQl-pjiZI82hF+s70v=gvm8C%+Gy!I{XXi zkwMHqFve>{7u=KlS_sNUXi*cd=uC1Ple>PGbH`j=sT+(Zi-iwQpFCGEubE=7;LKxu zZYVLUr=#^MZkf*ZPY*n&%xETK&dB3rat@lB3isuwLH%USMfrlEG33bVp!>kHphqr5 z?Jx~ZjbhZdA~nt;p&p|sr2U7DJHY=O(yoNR88EcXs~lX(k=X-C zk4aOx4AbW0RA%1qANp3u$V)J0Ch@F||GBQ-^iMtL%Y;nxjdp#8Dw!OS9C@|EW%ir# z$)A7+wKYM5VwM*iFP!h`ua1R;M2yv)sO3w~xRf<7f6ot?5~aq94tIS={9v1)ppRel zXjzQX;GhKpGv^5xQ`EA=AnH-A$izx|iep$#%B_~Vk;tx4ljJ@k*PYfn%gfd*`=4|# zZTv*(rN2)+i*Pc&n`dfmwAGNwE>F``z5Z;*bSQ{>-lD+X)$qNYP_Ib1au*e&;P5v{ zh7^{y=RKbm7UKmhBkZOr~R4x%N{0Y^*zJ{YRkE?@~F8?z*4#vXuTWqti9~1%Jr@I!yjgQi}*yxk7JHG zJc}ArtB#TNai!D~MY%n3$CX3o*5%Z1$45V)v=Bt8+hByIxpu$FhZjf2>dd^-<9
lNsqx_p|6EV|2gH#t+f6`8jWd8k-@ zeNJd6zJzk~V59u?;<4y+S3{$Z?_0AS6PWm??isJ<^gkQcuz>Z&zph2jtEZZJueY*; zA88g#Z+v@S?|g53`uhFrZ3yi39um)UKVi>Zw6w$lVbk-lK+k`% zN37fO9bTqiQ-0q#kvQYQRi23Hd071+ajwx67*{H_T^IW2T=_O|ZL#P_%dFq^JL$2N z!=jMZXUV%rp5Oa~z0V`kQs2^X0rQN#FEgQ15AnT0T8h0tr$0zd);ImRHl+DAeJJ%j z=pJ-Cc>4&DhEW*HhQze${HY-={$<}Z^86I?_mZdN1ve?=SMP_ohuvP3KOg>9?EdjI z{Y6Yma7^kZjaOh#hm|m8+ zf1_x4`xr!#snunejD~=KFkj!-HBj~0Pl6oO|;2ha;c%%KB#m)HYK z?B`?=97?nm_L+jhsKg;OrhP;UvViJ+V&Q(07P=o@Ru5MRWK^YO8DR*Vr6{xqbS-O& zc%|A9`1r_@S6~PYV;H$xIA;(dnn$VPT?q}Cj@BH)f?@pwRBC@F!xo}IoK#92SHg-I zMiy8?Xs*CqTY@|mPPhKRTCpR_0DJZnJ*>!ZZCeC;c$Gn9c)AQH$wVPpmm{22k$k8915HOiMT)_gOm*6!pq}?3Kx%0mPUO`I1UGHD#!K zj#*o*G%Ia*3~bcs>2OENajlOCnr$SU7%Z&m$g)Z$zU_-7!NL%7tVn0dwFCE=J|_UJ zD>yV|O$X>%bm?_w4#mw6RDItP_A%(Ul<1?DIsT0@Sdb+(8e+Lh*C09im0RwhS?2JW z$<)clrRUIPqk@z<>|Gj@dI++Es+RW7G4c?C2saCH(g6`;rHvazZD7-Tg_c?(TzMkG zpw^!2gi(B?^8JV{NjWnBbokooFtFC%I|O3RZmavq$Pyx_*jC9Y!Q`@Xqzq*g`&;FI za>9t%M^Dj5xYq}8=tEFR zv!a3eER)WOOOG@T&WMNXuuSFR2&y8P&0EHb77Y|QYQGbA92g7?lUV9 zg^WgroxYco;7tk9POWp^nV`9i?FD<5?u8l{=EV2t#Bm|h{@Ff3X&(t#s&8;=Udx`> z;#BCxLGD(QRl83@##%E|O_s-@#m>;3RhgGZN8I(cfP$m2vZgO743)N@N*#csZrj?y z)aE5aGE~h)U}xcUsF3H>H^9NoFGHnJJ|2A;Dpx^ta{38Fv6P^;JFRN6XpclS%opbv zV=qjJn;|XlZSKwq(6W-OhyiV^hMa^WGTJiBzzVgQ^_5&zDEB$b40}5w!yw}E;DlTW zPQ58ABZVk{U@y$R<7_sKj(|w^eS`~BRtZ@LbFUlnvf8Y1OlF|pSKSk zRoO`;zt|ZF6WD$~+91v{)GImOlU&FPAKnez){?LY6|oX0-Oi|1RhIK~@>di%mDA7y z*puD@-T`Qfcr7+g&)r=4ADaj+U=DbrZ#fOO-q6YE@x>mzrFIC_y2i6+t>u7_97+y|*j+%xqD0tFK=h3O zm3`4orT{h5{@c8FbJXQ$`lIYbbpjId_~IsR607fsrr&+pXq7_4mwJ671rxyg@$MK= zPhW(LzwkzD>zpP}#3dIaCl7(*{ZwRLO2r z`5>rT)u#GE@L0S}4Na%*Yn%G4w)$+FMz^-cZkwi|w&rb{7OA!ttWEn?OB=UcCtpj4 zrd`)vOP8npjfvJ9>2^J3TnD{&eG4H2`*s6&Aw$1*!%!ikn0BLNA>-_J;}1gMs&;Ub zkV$8|Nw1GF+W*)x7KSH{0sruJVE|mW|MLdt?UwLE`2UnMwzLG8o3s9xaEE_rDGsm$ z2wMsZTf!5@mH$Qm9gj)@VjixD0S6M#$h%@pyN7|Zfvb2ww4sk8i#Lh)3*#edLsVc{4{;h6tR zl336*AAZ_AKx`hMunrLW6%boOmR1KS%mcJE16mpdN@m1kd(2wkynV+mcE_%8$F3z$ zeB`6}NS@t#qusi2bhI$E-V%ORcp5pT?%x$-%etBWUA{L|HFVas7iPxXrWC@F`%Xs- ztfS?&qh&KU2QJ)er=y#%nzC1`XJ%slP2F#oI%n?c1`pvdz4Y#`4sP3LX6j1*McV69 zuD^D`4_IdT)L!K}yleb#&)znF{cp)$b3XMSl6_}$WM*?6-ZH-39D!|)+|SSLz}9E4 zXAcht|J5~yb{lB&CjQ=m%_T2wv+qe4uX&F=g+qN6_IrMj-V3ELWySdf# z1QQb-rXt_JTE-xQsQ|^F#Pu3nrq$*epK1v;)Y71(^xstL;kI1_U;nc=WeViKY&$4T zFE9ebFHIX7m>vCnA*G6mzEC?5(S)(Y@V{EdnWF#MG6u0!!EJlekt)YaJ>0gVSNvn! zQ|VDubW{GZ?O$8ssC`|&O)&F(>C16yh+;HxY)j3E@?MIv0mg8DB{2y+**2h#hTC=v zsu6s+Z72W7w(CHl5V&n`D+y|{Ok*H`Se8a5(>acA6YQq0lqB%mAWuW{6+|%H|omID(%XYsk z`0Gm!3RS<^T7I#N90rx+s@XYxDIB;fri)0Sr@2ty#F|wp)066^Nknw+aFlOlI}qw2 z!Wz`UoGQ%Fk$n*TE;^p&IB!7#X6%LwQYEqj+09HTWz%Z9IE~Y zh{}w;n>!$m4|h6o)WzrPXrsg*BxEnASk0j5B#mh&Wp)rf+2hh{IVVsD7kj`3#}jiy zYj44U1CXk2CI-kX_eRwnuH0jQ^zJswht)hQxjOCs8D)5OyA z7KRDzF`Jg~t0w$5NTNzq{V%&zLIy~S{ z#^@KI*Da)MDXwI46aU#V#>X~I|ATlQ==HHfJqq43-WjRXby{~A^kE5QuLA2{t#mhG z{dn4yMoFq19ZeFhqMogd7A@rF?J0tfYe4%PxYERqt}!vM?KUZ7TxFACLC zqMEb9PdIaL6=yPa)WL<2y9z5paoRPVEADlMeje3y+pVcw^#Mps1~w)U+=NimG*P?tmQ<78!9zo>lTY)M$BnWt|@rHvi0h_&X&<@cd!J5 zVi5pDpIMK9nN4R{mBA}SDm<#_+nxHG`Q(fLauu-vCQeV0O<9B^t3F~Ga(x!Bki1^F zZA-YZe-8=4KP_XN_)H2?)WJ&?7q!4vI`tkyB5NN`jS+hE7V|rK+R_u01cuT8{*t)q zHB6?=*Tcs_8DgQSY43~)XITDe86VXu55-ad(w|glxoQHqC5C+z%9XIpSrXXRivtdd z3m7uJochYFh@Q`yUN!KhJXoX9JG>d&$99V9e{+PbhS*ae@hz3}oQ^5<84>NPHBRo* z=9Mb2RBD;izNv40+BaG?KL8Q44w-<{@BlWkN2q z-};ZR|Epzet^eO!#$DsuN&M*_;I>`Oc!cIJUqTJsw*U8*aqgrYw?N+FmMx8QE^I)O zgll}Q-i~k6xYMTcUH);sJx|l8S?!T;`4+$JWwc&qpdGG7*whYE0^$=%{M}9!dzO&)2xYiz-Qi)rt*{vW9^Jgv)hhqm14 zOQy7mj;Hq?Shd{WuKWuPTY|oQk6YgHHC==~Ocr4uM+9Yu3rtbGNz6nh;y7uB8alhV z_3ehc*-GO|O2l-wBP;0@Cm>cYR|czzSGH$R1F~}jUN2GN#sv<2b~Z44UJ+5h`dw*$aaP;G-Sm<{k^cW{To>}>%uFBrmxpZ zkMgKge29p9X2cGDueZkWywn-ianY+gb`ukjKG8_sQQl z%`d;n-|$UT*H6+O;V6v1cRWR+aON6Z4Ur4m0;UN_97T-g7CW*B2 zfbgt(e`Nt9__@QBLI9+Y;R>YNY&3)vFP6Qi>UIzGwLmu(1j4Rxu{oq*K*0V;bXJwG z7ZBC2$|l^;#-`I>%)#Hc(~k`JULo6;tQvztG=RDqW8@Ko4hEuN00lC2AxX&~n&Kgn z*&|ZhBeFYK`NY`ZuSEwK1-u{gPkOQyXAP=aj)b%PUi;u7L$KsooFXVlj}^SGjE3Oh zgJkcvpXIf>8n<-nqC4vDR}5%cbJtLIJvBt6#shF0y6p=i8yLEdubDhByGnSVYN8>F zJULrsgJJeI408xdmNo*GuKC)&wY*4JJmMKX>)foPG zfU4)1&y{|uw21zvNr6B=WJ@F}(Ub&`6~>uvz+bhGYq6ZA+lItyM|g$w}WUwjjp z`cQg6-jXRuL;!^89Ph7d2{gs&(szkpexU6*1mlJw+^(Rr(R%N7fniU+mb~Zya)3)t zQllT7qJ`bD#w;tvc%wmMNW&mwVJaOlywJ#MP&PCN!TS#B9ckQ?zpq_36gM{Pm486_ zMR~;z_ zER2-&Oh0V|zCACsGxz0ccRA96vdn@q+mK@tRGk<|JZ~^^b`%ALsrifB z6ElMN1cGHi^n3vL@GRLQCL8paMahzVCiWp!Imym14IP@~#)f=z9`-)Qm+g}$L^<>w z%ZCI%go<@&-tz|%6^hJU&%XhI6wLueXW337c>!#B#g4uYFU1n9C5F%v5{&#naL_B& z{N0WW36;`I5+5~SytrYB+Nw7ICW0#R63jP_HltMbBP$rMulnn7@U&x4juW`4GDQ`& zqJ*`UU@iM|M<|OJRP}R=6STs^sUm4EJZim=0_3}F7v3RUnPODwz#hm7^vh>UOL)rZ z6)p103-bxgt7VNo6@egxrE{Vo9*)%GJ9#nTHSDnf2cO(W{Tg92!7{q8sN7X>*I2SjkWOC;mvO1ts zPW|X{{q*Ph*$a#XAOHqaYUl!{3tf73i4_d2yPl7vv$F;7utX2XzB3;yH5zN=5|26) z4mPd^$n$!^bEqP7KDZtL3(HI^Hs6vw-)-~?ht)to(zuGQ@^ZF{giil5_DFopJglyd z%@pAxc#%|~dO%nm0b3x=WSxCrCF5iz_j7DQcDM^^N)WpLatBHb$45%C$^w!`K1Ym` zQP&+bw^NcP{jSFL*wX$N2n8O}X>HVKCVJVPqpTBH-U-UTmgFDcC)yVsP8xS$oNN&n zMh5aF03f)nBQfszLpPJWSv!gI5%5wvKdjqOs-;k0rViy*hG7DkCK*D7k>aysIzCqb zip!x-3991RJus4$8|~ zaLW6q%FrsC$;(iI$4+aHTt3m_0o8C?+U!;eK9o#M-RyrMm$MMr+6Ceo*&s- zVTV)sU%zs6jsb-6=7iB`3M@b@W*s2N*WbhyX&pM+5$K~_`0g|ruLi!+I)Jqm${EmK zA01tx)YWe{gw@$8M3siCY%j|>RG>6e8$DE}G_085INd!YW;gr>Yq*DbxOHUMDyT*I zcQ|-z$lBD|{P%E;3HZ=x#Jyn1hI2F_V5EG0$mMa!*~Q+ne&n6$aA?r5Z^B6U*6{l+ z$6yH;M_Bz>l*EXS3p{vi7Z@}qk7^YOZy8HCuyl;Gj*J&^qUZis%Q#bbJj><3TE@R8 znyDs*x7rujCOd*AyWlP3FO!uC6Rr~AFH}=-+dgDE)qgcv%Y;4wZy9e*{fBLbw~Uue zr&oghmu=tqJ-tUYb09Hugf-LnIO(M{e(_~yCu-_oZ03$?cJX*-fo=9NXm(6-RxWP# z_txy!irL!BSwzXXHk3Ix^*LbST%GM)`40??KXZ6oU@Yt@e6x9=+MAu zYAb2#C51#wd9x)DwWV?cSYLSIdU@#+&B?zGA-$d9Xwp~sjDkqIKFZA$I5NmitLNqlxkUWEj(>ggePtq zSjZlvu}U8IUT3wn*Jy3PXH6n)MT{a7Ehb$-q$#>^cp-I7ddy7(BR)s6ZE$&|ifR2D z{_4<~yAa1QDq{8ef<5^a!fMpq$g z8qGF6Y@pSo_U;bw;>~l1kt9qI?|M>45ox1I8E7t zecGM~-ky?N@cOfh5K@M14kq|Jd&=qCTCq21nBiR<%;eE3?SZDax2E{AnX0jWB)NN2 zi6onn!AOd*$I?(;RZ!#?Lf^B@M;e5%g9@~@uWD>MRH>lr!~+L~-Ix{>;^W4=oPy_$exa zzS+Xw-+cO_J!ZAtZ`bhK&K50Z#D0qTg}txBShp zMCo)#3!$5G!JVGz>v58@yc``JMWEict-)X0H2&xs$7A`CeG$Ubx$BMUKdTtEt^$g` zB6E^z%V17^mPOlLu!mn@F`s|zsZ|;|2=5MA*t&X{KBNT$UC4xQiKlfCgn>xHS2CVu z@Cd&Y-|QO3u4o)C1(>gE@}OTUew|GJ`dYh3ItzD01C+fv)cCO0qW7!Ae)n?vkcZcv z=I^#*?zJMqqpFg9;MLY-%zc9X%q;Uc^3MJC^L>kzv-HhP+f>N8P3!7#0pZ7c@Q3w? z+hl;2zbMZg?8no9+~*E|m!p)U@aaRuoMY3Qqmb|WdX{HaGkZ2YI=o+i6?Mo3!oQ2Y z{GPXmVatLc*k3(p!3KQ2Koz?O=BMGKv2qZrty?{oPRU zTZhAMu@{)b?rU*?eXZx|^Kl2+$IY>sHy#8)&qwGB@Ujn=!<+5RB@~m+m*d@iaC%2b=wa{x9D#aQfZ4`piI=y%&4Sr>K8*&FnSqJ94A`{FR%OM)dFM)d8@w4Bc?qd4o^ zz4>$ku8D1ylcU9au|n?C?=?fqs6v&VFk&5duZ62XE%bM}I#Gl*AWJ&}O;KGXVsRylI2uEtEdOsV zSk}P;<}5`CEG0&e1h$qb>(KhF4eKzv2BjVN9fndMQGW%ZU+^z(cuFqKM52 zX`*=7AH(_T@pQ6uX278uVGc*yLQK_ulySP!DrdGYJyC4(W5bkK0Co!T#7WK{K670( zQ0Ov6oVC7`)agLzKx!@BbBPd%--B3;wBQR=D}|7@P0L~qv-3Xe+7FTsg`7%hqd3IO z^kuNZ>;-`;;%8M4IPBb0w2;&C;{yR2a|KPR>?nSq1$EH?^{_95{o^wE#*z<;jA(aB z%ffG{uCr_pu)WLG0o4ogAtYOBg-lC9%hQc~dx6k=(4Yns$W@?Kx0OkD+Yn+^O)kXD z3dPwnoEeu03oH54P>fANCo>-@bj3OS@q}?{v5_>=l3e{)F=R08i>IOT7Xr`bN?WYQ zF)D&EWsPuYK{u_%T4wk&1!BbYH0=O1*>+MFnq+QZhd@dbX(~%Uw}L)X%r~7V%T=+! zWV`Lwo#b7#Ht}EnSNJ9g^rLFyFyI$oqy?12^na14b3l~ zOqNH`eKPQ^Fi_OTQvjrbJPu>66-BJ^6lB>`_A0>3xiUu^Zs~?G)rc);IFX+6cNO%M zLU&3QnTxo`>ZtdAy_c(%wfYOBq9*hA;2Y+FgWG?W4qOp?J*F4Y7DkRiZi zKzc1Nwbu(j#4mw;rI~Mz2doB54}CZuSsT6m*SWe5 zZ0*H8F|s3HU|h;AUvu?~Q;kmsVY6#teZIrIVm-uQ$nQmiKf}g=4h^X>3`Tk7WKKdG z#GwblHXs%QB4*>`=EV_lQ(6<4(?a5F`BQPMxFirs1~tO?m#ORTWEAuc^}Zu#A96TP zXsyQwlmPJGs9$M5)PPMzIo!WZvjGZG?zbC_CndswP(x|*^dP4Y&|{kbw1iTX2R(1ebN#tO^$O)mLuM0UTLqhx^^kn z$v9P9`I%9E?bb|~erdnb5h=O-c|Aq5*qlDtGe3lWYTr*bG3eKPWs=m)ylgY zTi*FT&RO%Zd_rY`WQWgRACp`(jMl`8eBHc~P?OLW}(jP@3d8C^Pk(cP zYHdDVo3T}uSISh$H!c7yw!hy1PWuj{HPuMEoJa9aZ6>BEUu)E;>e75^0a~MB?VH8N z!aa6yy`Y5!@TP7#vzTNUt%=JXz>I{^$bAC&c+h=vaxd22al0_{eQ{ZIfmHWnXEmAjDBh_5D8 zedbcdCN)nSs`Xu8=2ryn#0WRd0zL%fMrk9_vKNH!Jp|L+dkP&)O*krx z){#$tY3r~C-{^SV5*obXO@@qeF!;c&e{PlT6E5q@buX8R)jGT2^ewL~GZ3waCTO^H z`P7q{1l7r^8Q-(>tH;)dZ&5|0!?KdOO}G+^zjU=6YBJ3=v$7p>a!?x(JP(ClCH#G% z9EtLibv{zN5nJs7HK2(;pS0>bMFA0g8LB`eK@$>48((lvw0O7g(g;bEfwo-^nS?UJ zK$bVyn1tH2l#~&fil{5&t~F9bEWfPoKBx-?C6ei(9|2~7MYj%eyd8#pfE~LI%%Lt0 zHXh(wtmO_7e@htPjjH8q5`XF+5Rj-9JQTmX8xVf45y2k3A|Dj%tPz(OJX0N%^sV{o zI(QT`D9uqLQzWt1Fevv>Ex#zSwLhrXRILOnxrRBU;##fBA-N<5nWL+M9B;=rs>cv# zrFvy;VW|h|{?N&ir0A36OcY%-Cb0h2J8;U%c_!J2k!i#cWvo8jZ#Zmnh1J=B2}T@o;^Vv%hpd)LDI$%4v&M>EWJU=G zq>>SdHR{QZDR>k+QhsJ4sa+5=L&+?PbNvPi@*|JFW+t%hR)qo5%TdOttSf(HC1^$_ zWXs^g4)zFTj!DsGHk^}qTZ5ueW!EpTTQTWl4@X>@r06%2j7@Uh*vI^m68t41ze~_s z9|}gjq?(X{!X~9V08*aqmARe0nGanh#{E|KLDc6VSfq#-Yr*2XeDo-s(BV81qQx^d?4~-;kFscp25woRrNb)75CCwqJR-zqrfzpmToT=!g zaP&bt9c;4;lNuKjJ!hkdrlXTt{8T8J3!=SM@{_R_(Q#_^GIHr)9O$4ec3cuX07_H{ zS7a8WMC8;Y0R|YZe!%F1Zk60-ruuSUP}FRUWc^ z5aNXdq-(z^3j7d|;f=&+b>V$(2XH~Gs{ zIPx@S0n`IOVq#ukR^rr}s{ldQIHGnk=4xB}&sk>O9)GscBs>nSgrdeQfg6`8$=gwu zx||zUrGTo>SA(*TsL6C_3dOhMLWxSJjNETTh+L~7Ze;yn1YOw^oza!o>7ck^b=m0@ z)(P_BhWS_AkjeCH(@qeo(&`uqlVBD~wQ5L^Xx5l2ZKwj&5yyOX5#w^` zgXm|<2+gh{zrdwGYns#Ki8P_I5uTbzQJSfAt$wmfl3P-4OZkS`Wu`F5^hKG2Pyrua zp!5Rsl4molL-`sb89a(*n%}dy6dL>ZR{078)Xy2gXbM${jv7u10yVp$zhH@=y9#W( zD#Gp31^+a{k7LI&t%8l^`8ifNpw>in*R(iTw35Dk%Kx^g9hwn}B^CNL+ix)Kag7Id zJ+F8mpK6_-W4&-`ph#m~$aK8~Zm={In0B;QK2@99ypGhjUgZ{7eY6hyYrR%5t`0{B zifp6dDz;H_8G~IZGfw0SmEl;g9`>98GW$AQ35!hJ zE>g)ZlKw1ZzV4Bk{(1EFhrba+k_JzL27s@6uhmF;wkU{P@$k!t?>OWDo&da*J^Yxx zb)!VoZlu4QhLD{^X!t#-CxdxnWZ3Qq3s)4JCw-zCB;2qFgT&6A38}a8xeOI*#N@7B z6QgL*&Y2k;wyUo8_;u*6F@zK&X;344dMShP|1(JB)_88QUi#bZVm)w*&I)?tWys zSl$JWvAM%hlX-q=#rmAwpFNgpB@OuHTafo>+tqofajHtB`S$~{;cixbL6u>a2@S!6 zEfAj>?#DwALqwp>epd?9O!CX5Z-gMlDh;FNeg=y{@Mu{HpXlO=R$3r5s3 z^!o=(Exgkpc*{U)%ZKU+V$D!6a*3e^3nF<-gcAAK7gj;P4wF98-TW#U$%dS%iQ~~V z#&|JP-Eum4oU8

5hALIJ4ET$J}PLa?`_t2{C^RR2{YWLHaRU^o0bk?sntop$! z+ebgHg#_ZwDK^GYoVEVDUv8JtJb`7G+&ew@8 zgIP{jnL%sRr|bHb;m3yH%PCN!;zhH$4c0Z{jxVj&Rib4uXo^niSE0@15n@Q4JUVS& zk2T5Y;l-$t=+C)qd8}e(aIm4@<3hAfY%#a>howmhWW#@pJHOAY#%cpVglWnk>X8R$Ljp z?A*Pi`(?`*Uz|Mov7lbt7ZQu2bcYlSqM1)l?e^z?{-zTb;Mo%1L9H0E2svs?pRO;T zGkv_MwTEMt3Pt+72X5d3HFi6qo*do93%DRjI|k*E^&nBUPomLuLTMS-RT&OQ1v*-;Fqz(r6G2SXo(eB zADBef-J!YftUOs%GlN#2&NXOGHKk6&NG=}qOk&Dlm+ftqmW!nfa9YlxFzbqlDR=Rg zTnL9$WY%29LNb_st%{74lH5qEINT9fXm7ka+-zXon?HOmHO(JyaiDQ~o(4@amnZ^q zzOs0D#Tu!ELqw6g7 zxI52uR?7HD!O}X|g?aZuENUD>>dpPQI8vGtYUv^*4_b5&BKi?FZrDfN1+-pIi8GY$ zA-HJHhhc8#J|jpJxCNx1sYI4|Mc9nejY!6jiPbrw7E1Gb) z!?0?a1dSYliT8CK9Oeph`~7=`a!n4G`yxJ9cwek~%F8UKkl z6Rx*g7uZIv$b^0>4FTCX)rD#$fuiVXb*7QFhu_OiY?aRKH`V>O-0ec)-{|gtD{!xW zdTLJ_CtbroNU2QE;c5$cwa)zF?*Oi5;JMCuPdl#_-Rh8@CbCHxVTZgtMl8*;4-`NB z^~(rHf_(`9BY-|aBYe4GL?3nuGJ!_?qC>1$|Qs;GmrB%hDNKw z_VqSdCY8;C?Gn})aViT#?tuj^o?J!-J)I@+<=kvCBz=*^?tIaTB3o4tnkoXLNGe7< zahRxFBVVhIEKyco#+`mWnPs8D?t;rgBSP#mCTHXW({{PjggI)Z+r>!C_aU%7+`HC6 z#UP|*tZ6G_wmpinB3omdex(m`Azt?LdS*KXrIYDD>Z~4E^_Mo1v>g8Cyj-m(3-_06 z=eph$W&mz()-?_k_Gw^zv47{eI~-4CcesA%b=v-$7w3x+DISwYbFOYUB2Owx)Bt)FCn(FFA?GD)d%sepQCYtl zIvQnoQD=OLDNm=g`}sKH+by0qTH+_X+Mh1OlHFJAKW&JpiqN;J- z`vTOw|C6B>3-ghot`C`?v3`iahp}OdzJsxGitmlFX-<}(sd)+L!_=}SM2P->4$|S` z;zGba-#<$GpJ#~I=L7I@aBv6+2oQ4pQ>HWeKhS+HeSP@SGKg3Nk!%ec*O)|vIGQ-Uh;`zC&mHs_T zmk#3oSCB3`KqDYPCp+F6g6k{N4F+Q*S4$)Z3Una0f40I1V*4+B+Y>pw*T<2-mN?t!zJR&7DjCpH_bX1m1|dTmV71 z{?cjb(NQ7ztn5F<{_1pcNXc+`<#a~La7NdDQsVSr*Jk+C)W5iX?ZSTT0=RPe_Frhf z@_hO~(f;bf@X*=FDtLJAX7<0J{xBpzcl~F0;OJoR3=Hx4>tOKe>oFubcYc0;dA1J* z?_Yw!5T6eQgCRcu`uSjcZsVUT|NrX)g7$s>uV^3l{~_A<`Cn)s`&T{$?SGftC6;fi zGs^N7o$oa&tVbi_B$tbkKX4=v{vyVV>D<Ab{{VmNrq zAz@0Ok!7HtvNzUbMM;XZ)SU&nizJNb4VEQQsbAw|Yrb;%olsFIut?~y1yi+1i>ZL+CHR-}9aHkFL_oyEdO>OkH_ z{Bm?W%yjdgNu*ZE(rL2v73FLQp%inLxe+vQsyotL-IV*btdX#ma)B?Nxeh|`&f$)@ zzdzB&#lmY5xNHCPEOU5-n?H?5Hs+6^y5)qn=ShWQqs zr5;JA{x+{n<%#$Q?dL<#KH|7WLXh3I;Xo$WU?7l)Oa0V}rk%CHDn3ubyU@dbn2T0s zrw02FWsvu^zr1L(ev4EZ@tLe*4-WT$d_EL+2YqnQvap15@3cQGa2p{jzCO94n9e7I zz>(xr4PQvM-p?|sfupMt8-?D;BqwD{Or0tj0iVLoV#z7FYZ$(f4LS22|les@C z{kd}9Li)4zrY)%EjmZL$D8RB6p(EOuhpI?zop-zM^_%Z6dBXod`=%+p3mFUL1sP~% zlld9r?%UK7`Coh?Xy0#`M*knQ-`?5;XAD96);g*LMK7#~)M>mCLx~~E(3^{yMz3em z{4EG{andYe$lYmY7kXC<7{t1Xf1%HQLeRcI$d7mHn2-`R`>`?z+IKiF(b2s8)LHhQ zXg}w8WF(;kQaKd4IL_i`na-)!;z9WBz0yCzbeQ8V#GWUh)8mrc zv+wVl+Z3@RL@Nji@Hx;)i<)Qc8wzn8GmdTmtM&;E*UM8bpOcbdeq~qLb1;kD_}uLI z6y8Dz(JlE{OC z*q_B@jzpYzKbu_}lpN|VhYdu`Hiz&anjWB+!1o@8VoC>O8T!^y6mVIi^P9@cAk0uu z9ScR99NfqRAr3WVr?M< z$w!KoAcU)}&t0^&mc>Pyia+X;D2~w%lJ&|2$Tl^Z$ai0`SM*Ot+gM(*2ybW20p6r(P4B_v3f!kG1^%2MhFPGHu4 zQ<*}wwbsP?^3SK{y69?K3%QMT@cL6r+y5StF6ThDB^}dS)PW8c?zV)Rv+WYXCr-y`#g&x4NkD2%~ zNUaD7(pBway6_CLnA?XcmFy9iybN(ovsO4(9gt*(jR;+{#s%A&06KYwrG>7eRLCN! z`ClPuzagn~)09Z(8Fm z$9Tf);x%eET^GMFd9qWpHf>bHo>$9wDr)oEB+vDbjiGQXVDU2P7t<6hdbuvaKrj*7 z{gB9BeMV35b0OqwQz2)kg-qsp%Xj$ZG~w!VjohlGnih_#Y=L7H;opmGId&BmS7%!H z8Ov3Fn`wErtOPbPq>87T8+1Bs^s#gnX1ZOQaP%%r22ke59tU7B=YV!DKFxHHPbDe0 zNXy>*&3hys?MhCtPCq(O%BBVp2Z`a9$8}Jf?6|wNDq%cZHMg&?gNR{w?VS?ew)x6D ztf9JZZn=Dx7r0yp5d@t?2sbz~N&E0PvOcH-?;g6t?DCn&l znYys`nSwVY;bJ@dtS<^1g5z#w0Td-f&sYJ($Zo>l3RUu<>tON#kt_;FTU}1-?}1R+ zJ1j0(_6RT%f0~N8|4iZ6-B4)vo|Gy4X?5EEy^*1Srs}O8`xYK|soxC{+`pxM_h@y0m-6&K303|Y z3Zot1;Sr#4?5Wub<1giQa}q$sMT|cZm}3!G)(fMmOh5=e^%6LB!apTk4bx?83#!lx zZsGQ=3Xj+^5B{RUzyLHi+`c)lA?K||s8w<(U|p2(7Eh!Rq+rH{V9 zxEvmqeE@Y4AEd0RA445ipwwnf`C06fmE8*JV7{$*c=v|GmU)Jhxh;Z_s7Rr%hv6np z?OnAHpq0a|wB4QXkf;LOXYtHpTK$A(zaR40hKGkMl!PCyc+lp-O?yJeh5KDdf$ry= zKxv@#XHXJ?GftWpF;7G>M$njB1Wj5*+0c&`9_U36Aft5r^RcUumOYGx3!ezou!oQE zYH$mJZoh^ zil9SlulMqOb=A!d5fF?R>WBb9^RzrJbGMv@HIe#mvKo#=8yE>^TZh#vbgW#1m z3)pUj^%05o9!*l_3WMBV&Q6n^Tm2lkQ+~BVi7JOWtt5L&dAyyN8q--QA-Vgcem852 zk^>+fyu|8{3c8O`#9F4to~ELGix|O4qXN^$ceF)R@Z{uL=G2x&#P$YpBBhs6rT;{T z@TyseCa;B?G@3C;nwF*&jbV%{a*?n}}dGWkTg_1sVl0(W;TFz1)%XA#g9JfqT zo=tY3{;pl>Co1Lf7cU%U)C1ozJIg#)mnKxZHR_or27@4#cs2Ms%qs>I7rB~^`i)@M zN_RgZ{_tDc5pRM3pHKFvJ%db9ta4&3T_TIDeac#Tewhn1D7W78M=6y<=9$knyl?BM z3s#;>F_Ml!TZ{@<{?aL;DKK-TEX$22-?lBuEG?5zHu?k5-{$1IiDj&_wA;S>cNcHB zVC_t^QGZv0g4^)y$g*sX3PgO!+XtA}n3qqNk;f4Yw;Vdafv(s2mb&~DKR3<#M=*M% z_(?9;Gw_bim!b@&%+p8wBteZYSmV5+L)xAT6x54bED6jjX$Kl*xFJiIIO2Io0^lN2 zlb6>@U9|IkwVZprpn<&s!CDCL0f=}NVK!QsdPruLz!<=2tRj5b98a;k#4p4@D@_v1FbVP+x)SBus%}X zCr;gG*WETFOYni!IOwn`;Fa$z$N*n@i%npx1znj4N`dAWg#c-xd%6>#&M7%Hwd9u< zF$+Ncg75>K)g73{ z*UL~SaRI2(B_pp0g%Z`IEp?V;8L0xS`ED1bYHIKV8Z+X+Ob z^|OS*s$;ky3dPI<3_^S@4fiHUw(@QmU9W}?2>VDMu&tBaJkdGe_2Z5s2rLVGOM73kv>^Jr56BOvD z)*V3e9cWJ(m~R>2dms2xHOR{7CH8ItNz~c@04nJYY5EQo4jThEjdeDM5(0({iH0FT zI`bzW&ewkn(oGJ>dJjAND@Z3W>?ANGnl6%dW>LGPd2-^46ZLO;8c%SH<)aiO}>C>GY7SI{U0+u=cgZ3+uC)F<}=O-s;qbwI7 z8!x-MYn!?ole$|(x;yfEd%8MHw&N?h1_z8fXIVNIQNSw!-J2?%U%EQ?lfXw?oukgl zYARa@+W$Lg^IJD6*wzkk3xp9IhT8(ZUIGi0dp&g7cJm^VEN+(d=evy5n+p@}OUhyYj`0CE7J#BLoK z;0AxZ7FG=eRj<|w5{q7~@}n&~Osopy!X=QdDz>g-Rs`F!g=H}$O-YL?c^AJ@xfon$(; zKevMROKOhJ?H3pZ;mb`jY3yOvO!62Cl{PoOZY`Q-ZzOxw?f*tXB8(E!`oaAi*^lPl zlDZ4~2AuFCs18jiCEdcZf?8Hcpw;S;3wKG6biLEu7Rm@F6WXql%)qu^o{3s+s9Hvm zVTcA2{NVeXQJLzw3;TJrcSerkIopKZuq)@n~R(58i?nQ z>^22&4}cCL&E=G~@6AT4j7yltcVlEu$L7_++1|vf*(+s1c2|b;Rz@V523mAGb|bpc z-EJy4B7G_^5n;i2}V0;V>~F{%NDi=5j?j)>J7wprwVc%W>|Cy zrogIX9+n+J8J<9$>1{YG92wfI5dffdcA@ngp~L7B8F54Q(TWCe>zn^Z6jt~o;_F!X z?;(#M=orHH3ta}WoK!sKJPohmMYz(ey0GzV(M#n54AT_GFF-NCQ@_)r@wh0^LHspg zF3k@1D8Qf>;1$s{&+z&3%AN?XD?0}HRKE+M-HZGD8Zu;=b`8oP>AJh_yf*K87drd9 zv6QFpSRix`-91+a=d0oGTNC3PcD)rkZ8y*C%GiEUw{+o30$14!PXhi$x`W6_;v2xy9r_Z4nd<_P?k+b!f9#JgGkIo;wf*p1a}#~NL*Lt!Yti*hI8bNjRNP>|Uhfv*c#G(;;oo&@ zD3|`{>2}2bM0Rw;D@Vs)XfxdJO1%oQ<9J+ogb+IGuqWVngm%Bv0$oo0Yw3FPblH&) zvY=fC861wkb+2#tf9AabTG%dZd^mhiVBprTQL(vERchk)KJ-P3xcl?)mJ_&!f4vaD zlX3mq@FP+~&$j%;nZ}pF?`Y@d-=B)FFVK_{bYm{pnCf|dIDD*0XsUU^kA2R)x^Qqr zgyaYomHs&Xeb&33S}y_UgDV`$wc$SDzvJH2R;OOD2gIo0zBZgLP3K;f7H@NYh**Am z6*G8jGkEi$vv(T<6cDa7?v;z)rKf+4l zvSV(Rjgo&2r&7p~NS`;YP-D`|alXGRrUeu#k0nJ!Qcb6PMMnfVQ_4=rGx)p9kilD& zV4!3}Yu`njA{Mj#ar9igv(`*^XLhtpe@L3G*Yj*C@@grbZj{RFlz|PO()}6yfIV;Y zWHyft#1qhKgB`-HD0KzE=d~6S!$ibr1LT?{3a~->1$CFMw9`!%RONz8g$Spa7FH?p z&bLKU>Y38&uAq|uuyi;Hn5E2y9eQuz$lPP;;=ip5cyT0$T4}T zx^xrC+k9%?V(o5mu1KXs(llN1TeEe%cDj6Jw*aPFh1n<&OkT628t!{ffjx0K*>P#= zj8dca6@Q4n^REkCD0n~dJW0N;t%xOu=u$S|U4PuPA+?2X;saU*2)zm5^jn^3PFn4v zX+20hnsUX^$C5k9cHru3f~Oi&1hi!$sNg(OT#_{0I} z6;Pof0=LWsWLjy-+N;TFY4}cC4oJw)VrhJT{Gy=9WN271P%uv5PEbEx8r#VboR(!Q z)w7zo>STn>7MBD#lu6F$j*GplHi-iON#qQQfQQbHb-y=VWx}Tv>2Ot*4WN^HTj2#C zW+iYsz&*r zGegi!0cq&_c?sF;S4YHh&S(Lkup&@ z4jM?nqX|CQx;CEWI3806@ONW;P5LVI(`n>$xPbFmBA1g@5to z-Hhz`PrwQEd)Iwx@-!PR3~P-3 zC`CZ_X$~YMVT>7mn%-Ak>sTCQh+WJh`4VUzq%~;#skv>45g7l&0M-O=XjPK>JVug4 z!h~Q+yPKtYF4`f)glGk?KQ#*7z zag_w+l-5BrX16gcAmpF;9$0f0!8N&Uq=mE*i4uC4ZbIJ91$+0#sPp?`?jc@9YxDbvLkSDMcq>KKmeX*aLrV0$b{Q}C#++r-QYKz%QQPzc z>i4WtYH)hGzrIUe3LP!Sz1PUN27->4Tw>d)Sxraikcxir=^&#C-FiDM)t@LJH82i` zxbp-NGh|Wj1A9yT=!jv)S=pOn!fc8NB8`7tPzlLy9a9&!BPZGxod_jYDUYnagvMx? z?1@SeCARplgss9wW3`;YY6XQjeKpKR)z_CksMLmY<2qnRC|^T9Jro_(hkT7**S-%p zo*|tNiGi!_rZ}{YNyNhyDGo-lfRnc=`Ji2AP$W2NA zu0TuBQRIUGRT`ePTvia6OthWJ}$%g^X z%axyq+sPn%tHP=u70EW!*}`dRv;gVhF6_iYlM*(VFI$khk_TXxf1;z9Xb&_p*ig^> zo}2fzX;!LF(h6cp!ak(wh5c|H9lW9a=3h{Y*`gUl98`@%Sx^+F0v^ST%0rK7x$1pt zzb;(8sLuVQTv8|vfIi-s*;7SRpyISMkU`0y;7IRb487|co!15-k&nnB|p|V~Qdc^cORHsDwO+ z3?_=*3eYzjOjP73$tm1(-l(74W&v(cSc{~I-lN6sEZ$S(E0R}I^j_|={xN*3lyb$o zX!_+gyq8AkC(oP4(yeO9?^97r3Hhj|^@@RU=~RGy=y>#%@8Hmk9YHitd2%>8vzJcG z-n-~AOzFFX%xrxmWOzVoH*i3cFKG#ReMCKmj$R-Rpz=bn+Ltm`ATo%3!SziT74zki z07V5+GTIRJj=;1-=cj;pg{~u^XrfkLfO)F|imhKHG&B0X99q{Yo7ed%Cb2T}x3{Ul z3cQfvqTmm4I%Jl21JI-{AFUI0S=+DDDN$f?{G zd(l?@r99l=(`G+iE9z95q?0>E1KmX>TR(m1XL{mKd0@Dz!K=ost`}D@+fCC+2P5B$ z7|P+Un{>H;nGaUgpgCYm?yOl%XURvLYR;nw7bg0*cskQ0(mjHKWvY!1Y8;18W)ON^ptMF?>Ypo&6oKhQ z=ZB@+tSQ4HhBa+lM6MdlXj#8+>JLCa0}9^WGlRSE#Hg{F=K{Otd4fJrMAfLZXt9e1 zTvWW3A%o~sY3n!z0>vvUJ2Mv|yHwh<8(`QxdB0qUK4fMPEF!N_h$(mlAqEPMp|n#r z^`umwr`hx;?TZD%G?cC(^E0H?_xGyGi|5Enp=#g51-4D&u* zG#;6_4h^N0>*85Bp_6tzn}EBjkh=(=tq{6@3;% zdHL@;x_To<(Mz6}(b&X0-bgl-zvDvlq@!Syj`Tr=0tja1KL~GJS`$KM9(L~3f9QF@czwwFg2e~p^LGAa6K1%uYx`}>?$qvXKfT?^d zu&I6#&8WAhwgvkLlB zOlbmtN|yAKd@c;mDC`hlCmkxYsY-ejcC%4H(%shzknqBsGEwn7{go1Nc11MmkD4_? zeBwdUYGqhrrDjY1?@diod2QhO%2*PVkfn6IYb4@5dTD+e z{~;a=l?rR|4Dk{QrJ3ksMdGNTXv}XlCOB2Tt_7Lm#n-Wg7B6H^xfWT*#h=@%1}N_SD6GT9P| zln3FONMc-YsGxF++NwvERiY-j3RV8DJ^LZSdzJVofaCDE^8L^3N)zd`XHRZYtI!2| zDU^mc$^sejg2xp*YJ4R)?DcDsE7pSSk`!9h2VLcW$JN-bp8(|4x8PPL%P0j_;bLWN zJ3TGaY6Y{d@@>LEZcdce2#J&X8XEpDeqF?WVb^kpG#sO8O96qbunm7$psg!^Dw`Fl zWYZuKqo8ODMKkh6>m*`EV9AP(QFeVT{`D;nPKO_7U8V@tvl2N8C)IU9-HlV;ol3*w zD2dc^n4^7-UJkED8}BC$XO7;w4%$Xf@qGQ3%pV>d1)@3-eH{jlh8VGO&Z)GI>v9KG z<}0XTAg$VWYPn%ev-fC|9%pl;8rx!FaLr}m!{xUyV)bw)b-1IIfwRpOG~K`dPd$VA1B**1p;7cJs`RUBvFx>=ftrNwU&fGR1lqWhqng z^58a!s(w>l{`KSb4cyKx&dx8YojazTl}UZFb^Q+8>8CF8$Ph@CRq2bf0h96ix!LCQ zqJi`JW!_+Qi=&!pr=R2_GyL!M~_%Oq7-n)n;yXqOc$iurzKX*}& z4HedRKfoJF|DNRE(r1?0!TP#~t+|I|zW3&(aI3omm`*t>+9PN&+FG3cy|hPsyhrl1 z_gNDWy=#x`Sm7LpY6C}KoLv9a%=lVj8#>wu#$GF}xD>OblX`d`-rE=>+V~w?p8gXp zgZ&I6^})f~J{X0~Skrr*lDUYA`G7l2`7FASqecI((N=Bffxxx~Zx{vN*Zm4vm3Fbk zF}!}kPN0!bg)wVM=QQr!sP>rjA!)~|juhd5l zM+dEqo%4?}GGDibst-4q7N%tvq*$s+D0F((D!DXFS(%UY{fYXbxux(~qTR#^?7n^Z zszjcgDZXTy17zy85;x4Q&>J=}XgU7abYNvqn7FhD(UDDx#f9e~y~)Q>jWuJvRmV^B@4l;PX3Ittcoxx``jfRaal@Xka|^^r zUhb!HQ^(-OSIGzC4i^P&Kl8Pgg(0(-h|B z1uGQEV$G1~%;cp_lk1Z&)F(C3gb{wrV`ZyyMi%?dj4^ys8G1pIhB_;5R;izK-`Jpi z{9}_e=8NI=@nbA0Op!D6y6y?if}a`#>tX0=p^yTCO43Fp?X7KUPVBZDwbj^)9}l$b zb4JpDlMLpSf}Kiu)~({TF8HmXY8TDdM=fDL%M~}GU28L!EuH+=vSWbl3Q}oVy3y-4 z-J)q0#DVQNW+~LR;ar#Le@`7{Hkqf-O#hyw0=A42btm7-yGa;OF*2WNajgk2XY5V; z^hUvfToylw#4GjntC;^s067oF@YO1=X57x>GyWjcZdiX_-FS*;<7VqqcB8pwZcBFV z;)d=rM(zQkZks@wuO#7C@CFY{26ylXk0b<_@CuJ6$39>S*YH82 z@D2Cy0qXD%7xD86@ewz1+bMDLL68P-BNMkv`&ObCj?WS{5g11z8HZ0AZ_5`Ca4-^L zA_npz*75e~aW4AtAV>1s)F8)%@a=d|3W8fbT5`Y5aq{NkzvOYytYPJWX(=Ca&z_tGWV-@ zQs6tkoje~z5N+|_I#UtmloBaSa=R z9KwH!!(aHMPv=K)KXlPRp#rX2^;+#g6<(_>lRJ4?7lXPF41b$6wNb<=0ClT4#{XN^ zJh1YRr;@9x1Pz=w2_D!Ljo^StAOXYx1EGKRmneJy;QY?-`b+)yiRX`gj`w_E{Q7U>#lhliR}Z<7E4jZrxphCnQncyk3O&GxF>?V#r_h2+ z1c(%3PWgF|=+r44Q4kh9n5o3U6aXdySa@W~CxjX|a?~iPlrPq@wf8sgdb7k2>495Iy>$WA+jYEreJeri`(y)FwJhF4)kq!U@pZ}hU8rCb= z!z9OgKo9@{0!b{9cHH}jYGs3`{64abkh6}i92SJSY+`?qz1pog}t6(aH1d+qfIuECxVXsdSPTjev-9L~A67o10|B z99nl`-5STnEDIf#3II~x(r=p`A$6nHe|OC5)pJ5ipa6gck7%TjM8y$kU|8v?x1LIp zI2Kt;*I{NEW>#es+h>0Tm=S1E1XdgYhh$aJhyaw>LJp#lmXM2@(MFs_xvBTjNxdm0 zR&YPvlv7N|p>oq0cr>?DPxal`lwH0p$df^0q`J%WSP~{ zaP!r7=1NaicO6Jbsi~1=elUQMKz0ZqT5Y&(D5q!*ehFrns7MlkWEI}k5QY%hVZcF~ zdFZHtnT*htof8d2kZW*00f=dru8>FyOX%^$Cw@3^5T6XmC|;f%5_ThRBkfq7TPk>w z1WYXiaV^xZ@jSh*PjcV1|aVO|1?QjaXTr|kh~48Rte zN~+f+c47G?2LqQ1giviSE}DoA1T=b>gJ81fR4+DPKW##SnLGd~6aNQvV36FeNWN#^xcfPI z3bJ15fYGa40??JDmZspHR80P9Z?lAKuF&Eq4u*_QA(W{kK6!WzRi82b; zU3<+nf0$k--hq7v>{Jw-fhO9*O&B5NX{kjr!WK<%DsfhQepledCn`A6)Q5Ep(#OVz z+){ktuEcAuLc%wZnSVg=GEh#3z0p!NHw7R;6w2;`9*iCRN@&6r(lCWBG!_P5sI{T#u!lYb6bLn9K+GXfhG-HV5-H+7%;ivr z5UgPRj7Xm(CUJ=+Y2pi?_`@x7u_Hl5$Ph~+mambqjAlF|8q-+D%ax>tZhRvgQlzNJ`ZR@#j(j8}i*v0-QqnDrj3g#A zsh~k}l8~|TO(#Ps%2ATCl%_l-ta2nm!=bX3uK#=`EMqB4#T4?8r_kdpbE(T+^0Jry ztK}-e=gVOdvzW##CNM#H%w;mOna<>7GH3P7X;QPA*34QoM|jO`amAcgXHT9)NiDN&X3Z|$kCKHm7#Q!QtIaOv_m2g*;>NCg^SNFs%v|VKve!lGu(SmG#PI zH-cFo?v*5&SiwZ5upvIUAOp!eNvb*`DbkH6v%Yg7m?HKW@*F6MK?@*a3#eF?#&u-5 zYOGrx>nHk5_P5u%Y-K}xlApz|RX5wvXnR;%kaYI12-rd+bimvHq)WCV5JRdoB&p+7 zM}J^S0pI#YTPQgr- ztWC6Xhy}5yOmT!@8o>tc?{VoPDa5&77RfcfG56v=g4?k$h%JQhKN8qwjH6aX89(kC5xH?OSX-T zu$+~FOl&iZ(scEH*TmuxhX7`%-nz`I=J9Su00B|ece;EyLf%t z?9M+OG=L{>S??x|zMrgOe<#A{{~P#c1Ym(gWI_#9@1Dk|a$cuc%nwyKZ?bt_@r@W( zH^KfJd&BO)k2iazHAcm@9+y5)+ynr*0yJ^Pm%t_EhgggLap!{Er|S|O=N!Itizg2B z=nnnp)N*`8P`&TI_5Uf;%9EGCn^-BfRRIly)vSpL{_lXN;0s$n`_9;0Y%s~G4<(kd>bg~ zJm>ca8lSwS%Ma>(!@R_TV1+%wh9q_hcqXt=V$P1ee<*(Ml-jR$0m@#dwBIkuNWMDX z>wam<@d6%v%OVAz&S>-z(=?J!4vo&Q!x;esF8xzTI4yOhlz;taiE9cNdh_M4dq(AIYhTMBkW z4hn!6=pfdRL`uz=+mQelJX@d%NBRgsPW0Jv>6ywE8Wbkdneb18#S-^%kQ??56{OXf z*V}7*!zzAg}=&41!wqVok9X zHs(|h-v8e=zC}KHRbFw@GFBBk=A$d|U^w~UJpM#OdE-55S2?zlH5%1BB9;A-9UeU- zL`I|;;Z;HE5FhOmMrLFm?W0C^q(`pMLSEJEVNO5-R7HxCL#3ojLeeFzq)WaeMIaPB z{^Lp3q)mELHr}L8?qoIPBv1Y%P$JVzqEk>7rBTX~PadUGE@detB~v~nRC1A1MkQ5N zLLWnPLUSO%tG{*NsUrePkYViYD~E+%8*S7SaVWC~YgP9|h3CS_h`R$3-z zZbBwhY9?oX=23bkXpZJjiY95ErcH{3YOW@0wx(;oCTzy0Y|bWa)~0RVCT`}YZtf;; V_NH(CCU6F)a1JMN>SjOy06Q4t3K#$Y diff --git a/docs/rfc1437.txt b/docs/rfc1437.txt index 2ab4063..a14b86f 100644 --- a/docs/rfc1437.txt +++ b/docs/rfc1437.txt @@ -1,5 +1,5 @@ -本文件描述了 PvZ Toolkit/Tools 中所使用的阵型字符串格式. +本文件描述了 PvZ Toolkit / Tools 中所使用的阵型字符串格式. 1. 阵型字符串为标准的 Base64 编码格式, 同时兼容 Base64URL 格式. @@ -25,7 +25,7 @@ R: 钉耙位置, 不存在用 0 表示, 存在时取值为所在行数, 最上 S: 场景地图, 取值 0 1 2 3 4 5 分别表示 白天 黑夜 泳池 雾夜 屋顶 月夜. -5. 压缩数据所用 zlib 版本为 1.2.12, 使用最高等级压缩 (Z_BEST_COMPRESSION). +5. 数据使用 zlib 最高等级压缩 (Z_BEST_COMPRESSION). 解压后得到场上植物数据, 由若干个长度为两个字节的 GRID 结构组成. @@ -92,6 +92,6 @@ https://pvz.lmintlcx.com/tools/ ========= -版本: 1.0.3 +版本: 1.0.4 作者: lmintlcx -日期: 2022/08/11 +日期: 2024/05/05 diff --git a/inc/code.h b/inc/code.h index 4a5cd6e..cc87bf8 100644 --- a/inc/code.h +++ b/inc/code.h @@ -1,13 +1,13 @@ #pragma once -#include +#include + #include #include +#include #include -#include - namespace Pt { @@ -31,6 +31,9 @@ class Code Code(); ~Code(); + Code(const Code &) = delete; + Code &operator=(const Code &) = delete; + void asm_init(); void asm_add_byte(unsigned char); diff --git a/inc/data.h b/inc/data.h index 036966c..a3b56c4 100644 --- a/inc/data.h +++ b/inc/data.h @@ -1,9 +1,10 @@ #pragma once +#include #include +#include #include -#include namespace Pt { @@ -12,8 +13,10 @@ namespace Pt #define PVZ_OPEN_ERROR -1 #define PVZ_UNSUPPORTED 1 +#ifdef _PVZ_BETA_LEAK_SUPPORT #define PVZ_BETA_0_1_1_1014_EN 901 #define PVZ_BETA_0_9_9_1029_EN 902 +#endif #define PVZ_1_0_0_1051_EN 1001 #define PVZ_1_2_0_1065_EN 1002 @@ -251,8 +254,10 @@ class Data Data(); ~Data(); +#ifdef _PVZ_BETA_LEAK_SUPPORT // 是否为测试版 bool isBETA(); +#endif // 是否为年度版 bool isGOTY(); @@ -265,8 +270,10 @@ class Data int find_result; // 不同版本的内存数据 +#ifdef _PVZ_BETA_LEAK_SUPPORT PVZ_DATA data_beta_0_1_1_1014_en; PVZ_DATA data_beta_0_9_9_1029_en; +#endif PVZ_DATA data_1_0_0_1051_en; PVZ_DATA data_1_2_0_1065_en; PVZ_DATA data_1_0_4_7924_es; diff --git a/inc/lineup.h b/inc/lineup.h index cde9d9b..20328cb 100644 --- a/inc/lineup.h +++ b/inc/lineup.h @@ -1,16 +1,15 @@ #pragma once -#include "zlib.h" - +#include #include #include #include #include -#include -#include -#include +#include + +#include "utils.h" namespace Pt { @@ -21,8 +20,8 @@ class Lineup { public: Lineup(); - Lineup(std::string); - Lineup(std::string, std::string); + Lineup(const std::string &); + Lineup(const std::string &, const std::string &); ~Lineup(); bool may_sleep[48] = {false, false, false, false, false, false, false, false, // diff --git a/inc/pak.h b/inc/pak.h index 57a7057..f9945fc 100644 --- a/inc/pak.h +++ b/inc/pak.h @@ -1,12 +1,14 @@ #pragma once +#include + +#include #include #include #include -#include -#include +#include "utils.h" namespace Pt { @@ -36,26 +38,23 @@ class PAK ~PAK(); private: - std::string utf8_encode(const std::wstring &); - std::wstring utf8_decode(const std::string &); - // 递归地创建文件夹 bool create_path(const std::wstring &); // 递归地查找所有文件 - void find_files(const std::wstring, + void find_files(const std::wstring &, std::vector &, // std::vector &, // std::vector &); public: // 解包, 参数分别为源文件名和解包文件夹 - int Unpack(std::wstring, std::wstring); - int Unpack(std::string, std::string); + int Unpack(const std::wstring &, const std::wstring &); + int Unpack(const std::string &, const std::string &); // 打包, 参数分别为源文件夹和打包文件名 - int Pack(std::wstring, std::wstring); - int Pack(std::string, std::string); + int Pack(const std::wstring &, const std::wstring &); + int Pack(const std::string &, const std::string &); }; } // namespace Pt diff --git a/inc/process.h b/inc/process.h index dbf7ee3..10c6e11 100644 --- a/inc/process.h +++ b/inc/process.h @@ -1,20 +1,20 @@ #pragma once +#include + +#include +#include +#include #include #include #include -#include -#include -#include - -#include namespace Pt { // 输出内存读写数据 -#define _PTK_MEMORY_OUTPUT +#define _PZTK_MEMORY_OUTPUT class Process { @@ -53,7 +53,7 @@ class Process DWORD pid; // 进程标识 HANDLE handle; // 进程句柄 -#if (defined _DEBUG) && (defined _PTK_MEMORY_OUTPUT) +#if (defined _DEBUG) && (defined _PZTK_MEMORY_OUTPUT) private: std::string int_to_hex_string(unsigned int num) { @@ -103,7 +103,7 @@ T Process::ReadMemory(std::initializer_list addr) } } -#if (defined _DEBUG) && (defined _PTK_MEMORY_OUTPUT) +#if (defined _DEBUG) && (defined _PZTK_MEMORY_OUTPUT) std::cout << addr_list_to_string(addr) << " --> " << std::dec << result << " / " << std::hex << result << std::endl; #endif @@ -145,7 +145,7 @@ inline std::string Process::ReadMemory(std::initializer_list " << result << std::endl; #endif @@ -177,7 +177,7 @@ void Process::WriteMemory(T value, std::initializer_list addr) } } -#if (defined _DEBUG) && (defined _PTK_MEMORY_OUTPUT) +#if (defined _DEBUG) && (defined _PZTK_MEMORY_OUTPUT) std::cout << addr_list_to_string(addr) << " <-- " << std::dec << value << " / " << std::hex << value << std::endl; // if (ReadMemory(addr) != value) // std::wcout << L"写内存出错!" << std::endl; @@ -214,7 +214,7 @@ std::array Process::ReadMemory(std::initializer_list addr) for (size_t i = 0; i < size; i++) result[i] = buff[i]; -#if (defined _DEBUG) && (defined _PTK_MEMORY_OUTPUT) +#if (defined _DEBUG) && (defined _PZTK_MEMORY_OUTPUT) std::cout << addr_list_to_string(addr) << " --> "; for (size_t i = 0; i < size; i++) std::cout << std::hex << int(result[i]) << " "; @@ -252,7 +252,7 @@ void Process::WriteMemory(std::array value, std::initializer_list + #include -#include -#include -#include -#include #include -#include #include +#include +#include +#include +#include -#include - -#include "process.h" #include "code.h" #include "data.h" #include "lineup.h" +#include "process.h" namespace Pt { @@ -39,6 +38,16 @@ class PvZ : public Process, public Code, public Data template void enable_hack(std::vector>, bool); +#ifdef _DEBUG + template + void check_hack(HACK); + + template + void check_hack(std::vector>); + + void check_all_hacks(); +#endif + // 设置查找游戏的回调函数 void callback(cb_func, void *); @@ -77,7 +86,7 @@ class PvZ : public Process, public Code, public Data void UnlockTrophy(); // 直接过关 - void DirectWin(); + void DirectWin(bool); // 去除上限 void UnlockSunLimit(bool); @@ -288,4 +297,43 @@ void PvZ::enable_hack(std::vector> hacks, bool on) } } +#ifdef _DEBUG + +template +void PvZ::check_hack(HACK hack) +{ + bool ok = true; + + if (hack.mem_addr == 0x00000000 || hack.mem_addr == 0xffffffff) + return; + + auto read_value = ReadMemory({hack.mem_addr}); + if (read_value != hack.reset_value) + ok = false; + + if (!ok) + std::cout << "Hack Error: " << hack.mem_addr << std::endl; +} + +template +void PvZ::check_hack(std::vector> hacks) +{ + bool ok = true; + + for (size_t i = 0; i < hacks.size(); i++) + { + if (hacks[i].mem_addr == 0x00000000 || hacks[i].mem_addr == 0xffffffff) + continue; + + auto read_value = ReadMemory({hacks[i].mem_addr}); + if (read_value != hacks[i].reset_value) + ok = false; + + if (!ok) + std::cout << "Hack Error: " << hacks[i].mem_addr << std::endl; + } +} + +#endif + } // namespace Pt diff --git a/inc/toolkit.h b/inc/toolkit.h index 6fe1353..8b8ac6a 100644 --- a/inc/toolkit.h +++ b/inc/toolkit.h @@ -1,8 +1,24 @@ #pragma once -#include "pvz.h" +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + #include "pak.h" +#include "pvz.h" #include "window.h" namespace Pt @@ -14,7 +30,7 @@ class Toolkit : public Window Toolkit(int, int, const char *); ~Toolkit(); - std::filesystem::path path; + std::filesystem::path current_path; static void cb_tooltips(Fl_Widget *, void *); inline void cb_tooltips(); diff --git a/inc/utils.h b/inc/utils.h new file mode 100644 index 0000000..688ed1f --- /dev/null +++ b/inc/utils.h @@ -0,0 +1,24 @@ + +#pragma once + +#include + +#include +#include + +#include + +namespace Pt +{ + +std::size_t base64_encode(void *dst, void const *src, std::size_t len); +std::size_t base64_decode(void *dst, char const *src, std::size_t len); + +std::string utf8_encode(const std::wstring &); +std::wstring utf8_decode(const std::string &); + +bool VerifySignature(LPCWSTR, const char *); + +bool VerifyFileHash(LPCWSTR, const char *); + +} // namespace Pt diff --git a/inc/version.h b/inc/version.h index 4becc88..171cb58 100644 --- a/inc/version.h +++ b/inc/version.h @@ -3,13 +3,10 @@ #define TOSTRING(arg) TOSTRING_(arg) #define VERSION_MAJOR 1 -#define VERSION_MINOR 20 -#define VERSION_PATCH 3 +#define VERSION_MINOR 22 +#define VERSION_PATCH 0 #define VERSION_BUILD 65536 #define VERSION_VER VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_BUILD #define VERSION_NAME TOSTRING(VERSION_MAJOR) "." TOSTRING(VERSION_MINOR) "." TOSTRING(VERSION_PATCH) #define VERSION_NAME_FULL VERSION_NAME "." TOSTRING(VERSION_BUILD) - -#define RELEASE_VERSION true -#define SIGNATURE_CHECK false diff --git a/inc/window.h b/inc/window.h index f42e7ec..20110f6 100644 --- a/inc/window.h +++ b/inc/window.h @@ -1,44 +1,50 @@ #pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include + #include #include +#include +#include +#include +#include +#include #include #include -#include +#include #include +#include #include -#include -#include -#include -#include -#include "pvz.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "lineup.h" -#include "../res/version.h" +#include "pvz.h" +#include "utils.h" +#include "version.h" namespace Pt { +#ifdef _PTK_CHINESE_UI #define EMOJI(e, s) ((std::string(this->emoji ? (e) : "▢") + ((s)[0] == 0 ? "" : " ") + (s)).c_str()) +#endif // 实现 Fl_Choice 对滚轮的响应 class Fl_Choice_ : public Fl_Choice @@ -83,13 +89,18 @@ class SpawnWindow : public Fl_Double_Window SpawnWindow(int, int, const char *); ~SpawnWindow(); void UpdateData(std::array); + void resize(int, int, int, int); + int ww = 0; + int hh = 0; public: SpawnTable *table_spawn; Fl_Button *button_update_details; Fl_Menu_Button *button_zombies_list; +#ifdef _PTK_CHINESE_UI Fl_Box *box_mask_spawn_types; bool emoji = false; +#endif public: void tooltips(bool); @@ -102,6 +113,7 @@ class Window : public Fl_Double_Window Window(int, int, const char *); ~Window(); + float MinScale(); void ReadSettings(); void WriteSettings(); @@ -109,6 +121,10 @@ class Window : public Fl_Double_Window Fl_Group *group_resource; Fl_Round_Button *check_unlock_sun_limit; +#ifdef _PTK_CHINESE_UI +#else + Fl_Box *box_sun; +#endif Fl_Value_Input *input_sun; Fl_Button *button_sun; Fl_Box *box_money; @@ -134,6 +150,7 @@ class Window : public Fl_Double_Window Fl_Button *button_level; Fl_Button *button_unlock; Fl_Button *button_direct_win; + Fl_Check_Button *check_brightest_cob_cannon; Fl_Group *group_battle; Fl_Choice_ *choice_row; @@ -192,6 +209,10 @@ class Window : public Fl_Double_Window Fl_Group *group_spawn; int spawn_type[20]; bool limit_species = true; +#ifdef _PTK_CHINESE_UI + bool switch_layout = false; + int xy[20][2] = {0}; +#endif Fl_Check_Button *check_zombie[20]; Fl_Button *button_show_details; Fl_Choice_ *choice_giga_weight; @@ -220,28 +241,33 @@ class Window : public Fl_Double_Window Fl_Button *button_speed; Fl_Check_Button *check_limbo_page; Fl_Choice_ *choice_scheme; +#ifdef _PTK_CHINESE_UI Fl_Check_Button *check_tooltips; +#endif Fl_Button *button_document; Fl_Button *button_about; +#ifdef _PTK_CHINESE_UI Fl_Box *box_mask_resource; Fl_Box *box_mask_battle; Fl_Box *box_mask_lineup; Fl_Box *box_mask_spawn; Fl_Box *box_mask_others; +#endif int result = PVZ_NOT_FOUND; Fl_Box *game_status; +#ifdef _PTK_CHINESE_UI Fl_Box *game_status_tip; +#endif bool bad_version_warned = false; +#ifdef _PTK_CHINESE_UI bool emoji = false; bool emoji_i = false; +#endif protected: - std::string utf8_encode(const std::wstring &); - std::wstring utf8_decode(const std::string &); - static void cb_find_result(void *, int); inline void cb_find_result(int); static void cb_find_result_tooltip(Fl_Widget *, void *); @@ -285,6 +311,11 @@ class Window : public Fl_Double_Window static void cb_disable_limit_species(Fl_Widget *, void *); inline void cb_disable_limit_species(); +#ifdef _PTK_CHINESE_UI + static void cb_switch_layout_xwz(Fl_Widget *, void *); + inline void cb_switch_layout_xwz(); +#endif + static void cb_switch_spawn_mode(Fl_Widget *, void *); inline void cb_switch_spawn_mode(); diff --git a/misc/lineup.yml b/misc/lineup.yml deleted file mode 100644 index f66351c..0000000 --- a/misc/lineup.yml +++ /dev/null @@ -1,344 +0,0 @@ -#! pvztoolkit - -# 版本: 2020.12.04 (数量: 339) -# https://pvz.lmintlcx.com/lineup/ - -"[DE] 双核无炮": LI5HDH3kARQDFMNVWlAyXvhBVN360d/4UBcwRTg+hJhVVLXDWrRU -"[DE] 神之无炮": LI43NBRTVn9Rgl44QQzfdmZH3ONm+BEF50ZwUvCDZjRRVFowX/lU -"[DE] 长矛无炮": LI5HDH3kARQDFMNVWlAyXvhR3vlBDF9DDV3RJAX4PoSYVVR08kQKVA== -"[DE] 群曾无炮": LI5HDH3tBib/1HpXSFyYwAhfQI1+5MI1eQAwcUSOXNSRUIK2Btc6WlTc/0bzVA== -"[DE] 后置三炮": LI5HjH7tAiZ/lxVSbEQMfW0HJnGXAtLhJEVPdoA0zFdUQ0pboFQ= -"[DE] 镂空四炮": LI43jH/tASbxsALS11hk5MPVVZwzFELV/uVVFhY+tHZUWD1bsFQ= -"[DE] 屑四炮": LI5HjH7tASbx1HrXeldAXJjACF9AjX7kQlCVdmIU7EbQTQIWgfgxbFzwWmaUVQRaGVBUYCxbMlQ= -"[DE] 后置四炮": LI5H5MUIf+3BtXRXSFyYUN74MIye5EJ6UMDBeBEF50IJ2dTZsBgAJ1SYb1otVA== -"[DE] 奥赛罗五炮": LI435DU0xAiflJQkxFVSFPjpVn/VsB78XAQKJnFVYSK8slRUfQ9fLVQ= -"[DE] 柱子五炮": LI5HzH3tAibxsALS11gEdBRxRVTCikaVVA== -"[DE] 双核底线五炮": LI43bJyUdOQCNHGXHlJMVN4c+kEMn+RBnCJUFtycHuTOwQyAlBEEmVVUq+dblVQ= -"[DE] 底线五炮": LI43bJyUdOQGNHFXV9dZlwJSRFTd+FHeVWWXDuwcd0yOdN34UaZ1aDBhDzVWVGL6RDRU -"[DE] 无保护六炮": LI43bJyUlORD3BVgUIxk+FHf+FAWXGzcErcG1zZaVBScX6VU -"[DE] 雪花六炮": LI43NDQ0xAh97cG1dFdIHPrByH3txlV1MnftQFw3lajXbIA0zFdUtwtb51Q= -"[DE] 后置六炮": LI5H5MUIf+3BtXRXSFz4wcjdflY2H8L2/RWD4UYJQ1TLmlnoVA== -"[DE] 冰矿工六炮": LI43NMQIf+0GJnGXAtLXWERU8HEzHjox5NXf1ID4Ud9ktAHXNlpUQapEx1Q= -"[DE] 双冰六炮": LI5H5MfIfe0GJn+XFVJ8RAx/7UJ80nBWNh2SHsJ2/c1dANf+n1IJQ1R5i0T7VA== -"[DE] 花园六炮": LI5H5MUIf+1GXINejGTU1ZQO0tcUvnTMUUUNXUMN3QdZ0m1UReFEaVQ= -"[DE] 云中仙七炮": LI43NDTkxQh/7cKV0lVSAmZIUMZTlXhcbNzQJf1VVuRtJFRUakdfKFQ= -"[DE] 樱桃七炮": LI5HDH/tAib/sALS11hkVDDVkER2VnRhf3ED1hBQgrYF1zZaVNQRRiZU -"[DE] C2f八炮": LI5H5DVsnJRUkgR0NJfkQpgLXUMNHdBOWCdUWbFeylQ= -"[DE] 神之八炮": LI43NJRUU01McIMe+lCFNFhFzV1B5Tfklf5SV1RUXARfU1Q= -"[DE] 超前置八炮": LI43bJyUdO0CJn9XxFI3ZF1Azd1y5kb+Ul4UfnDjXvgwzF1DDV0GdzSXNFe1V1QHeUVDVA== -"[DE] 简化八炮": LI43bJyUdO0CJnFXxNJWT53hNE51JkTZkvVSgUhUSQZfSVQ= -"[DE] 瞬杀八炮": LI43bJyUdO0CJnGXGFJPUlzU3Ugw1FVPdGhcxZX9UpdIVOB6Wh9U -"[DE] 前置八炮": LI43bJyUdO0CJn9XxNJWT3Qrct5cHJkencFQgfTMV1SujFvtVA== -"[DE] 雪花十炮": LI43NDQMnyTE1VXYdZRSkMIIn+RGelL2A1b1WQhYB1nSbVT/Z1omVA== -"[DE] 全场超前置十炮": LI43NMQIfe3C1dW1dEBX1bAOnc38dlZ/UThc/RVjU1TxQVrEVA== -"[DE] 沙漏十一炮": LI43bJyUlFSXRDRXs/vQ34wUrX8l/pVkU1RuvV+0VA== -"[DE] 神之十一炮": LI43NNRWT0zXtXRX17AOncF0TthNtHgodkyyVFSlLF4YVA== -"[DE] 守钉耙十一炮": LI5H5DXMneRDXONmSDBUV9Xhxj9x4x6aMOTV3dQ8ncHGf5Wo1yTF4RRhvHYcPlTFqEd3BA== -"[DE] 守城十二炮": LI43bJyUlFSX3VhYHGjQ3FlM+lAXCD5kEFTSOFn1VA== -"[DE] 撞南墙十二炮": LI43bJyUdO0GJnFXxFI3ZH3tAiZ5xtxZ19nweFBmcrYE1zVaVE2WRItU -"[DE] 挂机十二炮": LI43bJyUdO0CJn9XxFI3ZF1HxQh/5EJ+5gYmcQCQUvNOQCdUmXBArVQ= -"[DE] 中开十四炮": LI43DJ3kxrV0V1dIZ2Q03oxUdX5s3NLl3FRU85BZ/1Q= -"[DE] 雪花十四炮": LI43DJ3kxrV0V1dMF1TWW0dv3NJNTDhkgIx03dVVVPcZWWpU -"[DE] 守全场十四炮": LI43bJyUlNTYdbAefBBCNVTHXEVPUm9kEtz0zFdUpKZbLVQ= -"[DE] 连拦十四炮": LI43bJyUdO0CJnlXxFI3ZN1+duRGVsUQOLQ43Ep4dlQkBUV3VA== -"[DE] 十四炮": LI43bJyUdO0CJn9XxFI3ZN0RMPGwHlJPfEvDTkBFVDttRstU -"[DE] 十五炮": LI43bJyUdO0CJn9XxFI3ZN0RMHFFPgQQVNMYR2RU -"[DE] 空炸十六炮": LI43bJyUlNTYBS1ERVJST9XBRJw01xdZ0lxUhmRbOVQ= -"[DE] 十六炮": LI43bJyUdO0CJnFXxFI3ZH3tApRSAVBRtwTXPlpUeLVFEVQ= -"[DE] 十七炮": LI43bJyUdO0GJnFXxFI3ZH3tAiZ5/tzU2dRZ/lxeknZWVGRCRC5U -"[DE] 十八炮": LI43bJyUlFSXf004xCyMERTMfEVUgwBbCVQ= -"[DE] 十九炮": LI43bJyUlNTYBS3Mdn9NONTEXAlUh0hbIVQ= -"[NE] 无神无炮": LI5H/MDIfe0GNP+UAlIJUmRE/FAWYEWdHiBhzO5wA/beVFQkQ0YXVQ== -"[NE] 十一格无炮": LI43NBRTVn9Rgl74MAzfdmZHfNYDWXJUVN7OU4BV -"[NE] 超后退无炮": LI5HDH3tBib/1HpXSFyYQAx/5AE0ecZcEJkeMGHGP3Hl/RVmU1TvjFmlVQ== -"[NE] 小无炮": LI5HDH3kAjTxlALV4VgEVLCZULbBfHY/xQFEU1TqSF5vVQ== -"[NE] 小楼梯无炮": LI4ZnuVZVGRcVxUSJL91TMxFfAgu68QcxaymoDxc2kGYNnbDYM8y0sI8kITjxe5DkqS4VPklRWVV -"[NE] 双七列曾神之无炮": LI43NBRTVj9xgx76wIie5AE0+ZQO5Jwenc0UxcFYD00CtgbXXVTrbFqGVQ== -"[NE] 群曾无炮": LI5HDH3tBib/8HrXeldAXJjACF9AjX7kwjV5ADBxBFD8HlR8cuRC805gJ1TueEflVQ== -"[NE] 减速无炮": LI5HDH3tAib/8HrXeldAXJhQ3zhBDH/kQn7mBkZYUeKWEeT9FWdTVMu7R1hV -"[NE] 冰雨无炮": LI5HDH3tAibxsAJEQAyfVFBWZ9V2DwUQFKbQgfTNV1SsS09dVQ== -"[NE] 压制无炮": LI5HDH3tAib/8HrXeldAXJjQ3Fz4MQxfQQ19XdJWD1GCXviR/VKZSFTSgEbNVQ== -"[NE] 双六列曾神之无炮": LI43NBRTVj9xgx76QAx/5MI1eQAw8bAY9Jwe1fk0Bfg+ZFVUyMtZqlU= -"[NE] 双七列曾神之一炮": LI43NBRTVj9xgx76wIh+5AE0+ZQO5Jwenc0UxcFYUyX/lVBU/uVaAVU= -"[NE] 变奏一炮": LI5HDH3tAgYDFMMVw1VeUDJWEQJe+EAMn+RCfiBEfA5eQDVEDH9UQkcM3/oSNPGwGAAnVHByRMRV -"[NE] 小二炮": LI5HDH3tAiZ/lxVSbEQMfW1HFzD5sB7VwVY/TRxUVNxjXZRV -"[NE] 双七列曾神之二炮": LI43NBRTVj9xgx76wIh+5AE0+ZQO5IQVUlL0nB5E2QdZUlRU3O5Z/1U= -"[NE] 点赞三炮": LI43NJRQxj8FrVZ/cTMe+jBs3HbmAiZ/zpwYAEVUAEZd6VU= -"[NE] 瞬杀三炮": LI5HDH3tAib/1HrXeldAXJhADH/kQVyDXvjR3vgwjJ4kRBx3/TUMX0INX0OVBFdUUHRamlU= -"[NE] 土豆四炮": LI43NJRQxj9xAx76MGxcQ1TlEHHj1r3hbIA0VFTgkF19VQ== -"[NE] 前置四炮": LI43NMSIXtZYU020FCb5sBhgxcF0nGTHNXlKYTyyVFSoaVulVQ== -"[NE] 小梦四炮": LI43NDQ0xAh97ca1dFdGxAh/bcc1cZcOcPXXBNgTWf5tVHR8X/1V -"[NE] 后置四炮": LI5HDH/tASZ/lxVSbETMfe1CGTDxcEReODEM3xNZ0m1UQ2ZbtFU= -"[NE] 神之四炮": LI43NJRUU01McIMe+lCFVj+VdmcVKJ3NWH9N4hYRZIE0VFQfqVgpVQ== -"[NE] 倾斜四炮": LI4RnGVFVGRYFgVw5HZ21n/1VzdQgA3HWr1L7C+E5gbPMrb0/4GCY7zikqFof7wtQseVlCBVoZlGZlU= -"[NE] 智商五炮": LI43NFRVncFYU00EVLF2VAjJU8RV -"[NE] 压碑五炮": LI43NMQIfe0BJr/W11NMWmQU1LAOnc08dn8V/lz+FWVTVOJUTlRV -"[NE] 神之五炮": LI43NJRUU01MUIJe+FGFXEWdwcYPlWZ/FVZWf3GDVrUecGFMVFS7Y17EVQ== -"[NE] 鬼位五炮": LI5HDH3kxrV0V0ZEzH3tQnB25EJ6lnRdAndkR9vOwcY8slRUO6dY0lU= -"[NE] 底线五炮": LI43bJyUdORGWONmFFQcMHlE+kAM33CGXNK8Pk4l/1VUGTBFClU= -"[NE] 神之六炮": LI43NJRUU01McIMe+jEMXTaVEQIe+jCM3nbW/lJXVFRG/V9+VQ== -"[NE] 镂空六炮": LI43bJyUdO3C1RU2f1fEUVV06rAe5ExQSNCmA0YE1zZaVMT+WY5V -"[NE] 快六炮": LI5HDH/tAibysALS11gEdGRHfOZGDVCQxtjBeBEGF9B6VAgLRdtV -"[NE] 全梯六炮": LI7HCH/tAib/sALS11gEdN11VjYd+sAI3RtZ8lxUxwtG/1U= -"[NE] 雪花七炮": LI43NDQ0xAh97cG1dFdIHPrByN12IkR2UrJLkPVSl0hUuilbpFU= -"[NE] 瞬杀七炮": LI5HDH1tBybxsALS11gEdOQCJnkEWHh25EJ4IETV1XZn5f1FlGRTVJVwQEBV -"[NE] 美学八炮": LI43bJyUdO3CVU2UEALWDBDflFQIUFRgiF+RVQ== -"[NE] 简化八炮": LI43bJyUdO0CJnFXxNLWzcY/lWAWsHRO2RdZ/m1UF4Bfg1U= -"[NE] 生死劫": LI43NMQIf+0GJn+XFVJMVOaEkJR2WN1TTAQRBKH1p1Vtb0UcVQ== -"[NE] 前置八炮": LI43bJyUdO0CJn9XxNLWwRRq/lwcmR52gPTcVFRlsUSTVQ== -"[NE] 放羊九炮": LI43NBRTVj9FRH4gxNUVJvGwAkRZkkTF4cZ/ZRDEgFRUJY1bsFU= -"[NE] 请君入瓮": LI43bJyUdO0CJnmXAlJ0X1h0dn+VKOTMlB7VwVhcxNwZWVfSbVRwikSkVQ== -"[NE] 核代十炮": LI43bJyUdO0CJnlXxNJWuHZ/cQNGANd2VlSwyFtrVQ== -"[NE] 九龙阁十一炮": LI43bJyUdO0CJnlXxNJWGMXBNKIVZF/6UtpNhJD0VFTlWVjiVQ== -"[NE] 十二炮": LI43NDRsnNSURNR9lpTkRl4l/xVHVVR3cF/lVQ== -"[NE] 舞夜惊魂": LI43bJyUdO3CNXtXl9bXU0wUxFV4dm0HJn/enAKd+XROdlIBV0M11L8WzFdUHBZJylU= -"[NE] 守钉耙十三炮": LI43bJyUdO0CJvKwAlJ0X1h0dj9xA/bc+NCmW3b9zd115kJ1VlQqXka+ZQ== -"[NE] 丑十四炮": LI43NDRsnNSUWFMUkB5kL3kQUFgEgNQBFID40N9IEANRVPTtWvRV -"[NE] 十五炮": LI43bJyUdO0CJnFXxFI3ZF1ADd9y5sZcYXyyVFQplEaoVQ== -"[NE] 十八炮": LI43bJyUlFSWf5VwV8DTCVDS3UZVVO78WrFV -"[NE] 十九炮": LI43bJyUlNTYBS0kRdXBVn9d/RVBVVSx51uSVQ== -"[PE] 最简无炮": LI43NBRTVn9RgvbebPggzL3kRpBeDN925kV11v1fR1RUKNleulY= -"[PE] 伪无伤无炮": LI43jH/9X9ZYXOQDJvKwAvScDszUlx7TwVhPSThI4laNPzV2FOxBkNfcNL42lGRNVC9jR75W -"[PE] 自然控丑无炮": LI5HDH5d0FYfTTZN9BQ0+bAYnflW7ljuZEXTwXSc5GU0OZQOMEVTT9DclB4gCVYPcYP23lRUQEBBvFY= -"[PE] 火焰无炮": LI5HDH5U0ljlWAR0ZAcm+bAGHXBF08FEnORlNDmUDnBFT9Bc8npVWMdV80pNcFY= -"[PE] 后退无炮": LI5HjH7kAhQDFMNVWlAyHvrBiH79n+RCcrbkRlBNYm44WQxP5EJ1tjS3NFdHlYBx1DVmVFohQjVW -"[PE] 超前置无炮": LI5p2JVZlGRcV2nW61iVUgWRXPjDRa6kx6lOxAaLn3ONwJ2e3lqT0DEvGHdc3OOd3walSAL4+DrnjkCvEZSpbZK9rKdVi4tIelY= -"[PE] 王子无炮": LI5HDH5U1eVYL9VEXFAyXvhB5EWMXpBiWGJ0RdPBWj9JAmY4WIxONEfkQlDVdn+Vdn/VRHhWg+EBNHlXTNQMFPifVNY0VFRWb0t/Vg== -"[PE] 机械钟无炮": LI4Z2GVFVHRYV391f3YklNTQjhcW01hYoRNfSBMqnltbe3jafgG6ZBRgbHxo8g873U7yZl1HGvIO5Fnsbw22v5Cvn19OY0/kVg== -"[PE] 神之无炮": LI43NBRTVj/VJH9M+jEMX0YlDF3SD1c41CR5XDbeNL6WUFTFW02xVg== -"[PE] 石英钟无炮": LI5HDH/kARTDVVD1FDTyVBw4eQQgeRCQNXFcZjhY5FWW4XRcRSVUplFiFhBkIV00zFhUj59OmVY= -"[PE] 靠天无炮": LI5HzH3tAib/sAJSCVJ8RIxeRUWEQQyf5EJwtgS9NLfkgTV/lxLV2VU/FUR8ZkcBUAfDVNKdVIfdSy5W -"[PE] 压制一炮": LI5HzH3tAQYDFMNVWlCCHvpR3WX40d1s+FCW11pYVX9XglL40d+MZDhYjF5HlYBx1DVmVFo/QtVW -"[PE] 小二炮": LI5HDH3tAiZ/lxVSbEQMfW1HAZA1cVxeOFgM30RdDN+0RV9Uq2VZMVY= -"[PE] 火焰二炮": LI5HDH7tAib9lAbSDFJ8RMzderbkhrX0VxeUnlTP1OE8dn81dszuUGQYUlR9gEKOVg== -"[PE] 核武二炮": LI5HDH3kAjTxlAJSCVJ8RMxdQA1fQA1fRyVsvJS05GE0MdRZxLmwtFRFNYxcQFX+JSQkJJbyH1SXMFR6mENAVg== -"[PE] 分裂二炮": LI5HzH3tASZ/lxVSbEQMf+1CAZA18Zce1dl0ApQO0NzX2dfZlJLU+VU/FQRUUONevF68ZhSBXNQYgsGAMYTRzVdUX+NCklY= -"[PE] 方正二炮": LI43bJyUdOQCNPGUAlJPUlxU3hz6wVDd+NFcbJggDL/kZjQ/lJ5U/FyXEiBF1c10acYPUSA17lDCHtY0eARQPmZU9XNNfVY= -"[PE] 经典二炮": LI5HDH/tAQYDFMNVWlAyHtaRTIKWEEgCZjggbLyURDRH5GI0eRBQXBV2DzV2zO5QZBhSVL1zQaRW -"[PE] 冲关三炮": LI5HDH5U1uVY8VgEdGQHNPnU2ZQCdO1CdrbkhjX5lxVTUtXZVX9XgtZ03NN+1v1fmIJBhDGMX2dNVBODSMxW -"[PE] 太极四炮": LI43NFRVncFYU03E1LAOUk9SQGXT11pYWn9NVleC9t5R+DB0TlRUyu9d9lY= -"[PE] 全金属四炮": LI43NMSIfu3B1dW1dFdIHPrBCN9+lvRZ0FhYzhTcB1AHQ+6dVDZmXvFW -"[PE] 方块四炮": LI43NJRScIMe+jBs3Hi2JITVdZRyNHlqRRgJ/FRUYSpec1Y= -"[PE] 青四炮": LI43NDQ0xMh9ZMdVXRz6wQh95AY0edi75EZcOUg4VgJS+NDe+FHeSCA0VN6UAWVI0DYw1JZTVLkbRDJW -"[PE] 水路无植物四炮": LI5H5MXIfe3GtXRXSFz4wQh/7UEN0EzU/R80ce6dVMPfX8BW -"[PE] 方四炮": LI43NDQ0xAh97cZVXRz6wchd0D81KNPXWlhaYhRc8CXdNL42lGRNVNuRW4lW -"[PE] 葬花吟": LI43NDQ0xAidlHRUkGR07cLVFSRiBDh50Etlh7X0VxfUSczI2UTd5BXcFCAdmhC8NpRkTVSYK0VtVg== -"[PE] 神之四炮": LI43NJRQxj9xMx46MQxft29IIFS31MEU7ELvXPJ6GFRU5c9EnVY= -"[PE] 双核底线四炮": LI43bJyUdOQCNHmXAlJSUlNSRFTeHPpBzF1GRSRU3W2YIAy95GZUXBWGWnRFTzBFIAlcReydNFRUUexBjFY= -"[PE] 经典四炮": LI43NMQIfe3BldJVXRz6wchdQA9ft29IIFS3VM/U4Tx2f1eCtoaR1DVmVFO7RlZW -"[PE] 心四炮": LI4B3+VFVGRcVk2VwgkG7HrRMVKcMsXnnLFfLe1XXAVUQSkZAEBjkTknx3PF/yeN0r2KO7wJtdcuKlXzIUWJVg== -"[PE] 火焰四炮": LI5HDH7tAib9sAbSDFJ8RMzderYkhFXYVwJSjFD4EUcNXUWVgHHUNWZUGEZD+lY= -"[PE] 底线四炮": LI43bJyUdO0CJvGUAlIJUlyURCUMvWSHNTHU2ZSS1MFVP8URVuJS+NHc1CBd+EGMfvTfOFr+XFQj00OhVg== -"[PE] 传统四炮": LI5HjH7kAjT/1HrXeldAXJhQ3vhBDH3kwTV5EJC19FdMU/hY5F0MX9Ycdg91dszuUGQYUlR6YUggVg== -"[PE] 半场无植物五炮": LI5H5MUIf+0GJn+XFVJ8RNTc+BDcbEgg1LfU4XScFEJUVEgKWSFW -"[PE] 散炸五炮": LI43NMQIXtZY5VgkdOQCNPKUAtLhZOqXFVNkWoxO5GI0eebclJLUzVViRAHGP3EzHjoxDN2Ec+1GXONmSNClVZiCQgxW -"[PE] 心五炮": LI43NMQIf23H1RU08ZQeUlxsnFRGj172UYLWUEg4SFpuZNQklJ7U4UQRWj8VKNXZZGpcHJrAiH7UtLtRFlIdCdBoVO/lR89W -"[PE] 陆路无植物六炮": LI43NHRYSFpulCWUHnQI330W0GVYVIQCWTFW -"[PE] 水路无植物六炮": LI43bJyUdO0CJnFXxNJWGEV21NRZ7kr0nBid+Zx2VPkWX2NW -"[PE] 禅房花木深": LI43NDRsnFSVXGQHJvmwDtLNZPqXFVNS08EUXPD1dn9JOJT2Ylp/Jb1W1sE0J7V+VIfTRSVW -"[PE] 青苔六炮": LI43NDRsnFSVXOQGJvmwDtLBZPqXHlNP09daWBQmcXpFGAlYTHJXVJx9RINW -"[PE] 神之六炮": LI43NJRQxj9xMx46MWxct29IIFS31MFVYlU/5d80vpZQVNmXRENW -"[PE] 玉米六炮": LI43NMS4URVSRNBWneHGZ3HjZkjQpUlabtQllB50CN8JUAdDV9KdVEV/Q11W -"[PE] 空炸六炮": LI43NMQIXdAPTcTUsA6dzRTF4WTqlxVTXApN5GI0ed7cGVREFsFJ0DZQDJ9kx5VSlVFUGfBFkVY= -"[PE] 超后置六炮": LI5HDH/twbV0V0ZEzH3tQgGQNXFESiA0XORdDN8fUAfDVNKdVHrIRmVW -"[PE] 方六炮": LI43NDQ0xIieJMRVXRz6wchdQIcxDF+1b0ggVLfU+VVnV4I2Q5WAkdQ1ZlQmKEBtVg== -"[PE] 蝶语": LI5HDH/txlVYcAJe+FGFVj9xM9aQcAIemNDcbEggNNwMTTRH5UaQ1t1Q+NjkXdTfVJUV9MrNdEZVcIIWZFBUVH3cQWdW -"[PE] 一勺汤圆": LI43NDRsnJSU5MZVVXSo11xV09daWFp/FXBcULzWkUSo4XQGNHnX2bACnflYYlY/Na5QghZ02FtUJ+NFc1Y= -"[PE] 间隔无植物七炮": LI43NJRUU01McIMe+lGFNNhRbEggNCQMXXLVTFPkVc7mBiZxjFhPxFRUE0Vfq1Y= -"[PE] 玉兔茕茕": LI43NFRVnfnGD00E1LAencFWPzVo09daNNiWC11FJeRVX0lQtsE0xtWVUv64dEZdUFRPflpkVg== -"[PE] 无保护八炮": LI43jJ/kw9XVNX+XFVJM1N2YMAxfRSRsvFST7BBkIWU0zFhUx7hABVY= -"[PE] 树八炮": LI43NFTV0h5SQITk4jUylw5Qi7X0V9eXHkTdlgvdeJIkRPw7ctwQto/UdBhYVIKyRzJW -"[PE] 全对称树八炮": LI43NNTU0h5SQITk4jUylw5Qi7X0V9eXHkTdlgvdeJIkRPw7ctwQto/UdBBYVORIRzJW -"[PE] 矩形八炮": LI5H5MUIf+0GJnGXFVJ8RJREJWy8VJPsENxVVHJSWmFW -"[PE] 无套神之八炮": LI43NJRWgma4UYdTdQjTwVo/SVpuZJTlWfJc8noYVFTOUUTVVg== -"[PE] 灯台八炮": LI435DUMncRd0H9NOEx0tHRX17AOneF0TlZIAm6MbEggNFTGf7U2dGpEd1Xc2uEcdlP1TF5UvN9bgVY= -"[PE] 神之八炮": LI43NJRQxj/VJH+XFUyLtfRX15cYZF2QjBFkITVWVCQ/WztW -"[PE] 阴阳八炮": LI43NMSIfu0GJnnXWVdAXDjBCH9tByZxBDB5EJA18ZcYdOIlbLxUAbfkQpxTpkR2WFPFZO5MQFRU/iFHVFY= -"[PE] 浮萍八炮": LI43bJyUdO0GJnFXxFI3ZH3tAiZ5xlwFVPiTUg3TsAL07Rx2VHKpWPlW -"[PE] 后置八炮": LI43NMQIf+3BtXRXRsTI3X62JIRV2FcyUvgRR41eR5WAkdQ1ZlRFJEZNVg== -"[PE] 饲养海豚": LI43NMQIf+0GJn+XFVJsVKYzdt9QmCBsvJRUllVnV4LWELSo+RSN4QQJZwUZNVTN2HZWVIR3QNJW -"[PE] 玉米八炮": LI5HvMEIf41/jZ+EnyTEVVhQZBBIWm4UpB5TT9PBjBFQ3GRTVPknTcFW -"[PE] 经典八炮": LI43NMSIXtZYU020FCb5sBgwRdPXWjRI5GE0MpQOYMXBREUYCVhMcldUcSdDG1Y= -"[PE] 花海八炮": LI5HDH1d0lhTTUxMAlZl15QeneEU3HC25EZeW25k1CTUWfJc8npVWMdVgpZLTVY= -"[PE] C2八炮": LI5HDJ8kxNVV2PUUNHmXGGQreRiQlZo18ZcVU9LUwVUEZVNPIEUYCVZMcldUCDpHFVY= -"[PE] 冰心灯八炮": LI43bJyUdO0CJnlXxNJVdCtxRPrRpUlabmRsjFR1xJJx1v3fVZcwVATYR2VW -"[PE] 分离八炮": LI5HzH3tAiZ/lxVSUFTmlTbuFFxSWlNJTEiC1pzU+VU/5d80vkaUZE1UrtxCaVY= -"[PE] 全对称八炮": LI43NDQ0RAx/5MY1/5Qe1eFYBNR+tiSEVdbjlg1MdlgQzFdU9XdOI1Y= -"[PE] 3C八炮": LI5HjH7kAjT/lALS11hYWC/VzBU0cgwwchaQtfRXTFP4UJbhdNx91v0fVJcwVFwNdNtW -"[PE] ⑨炮": LI43NFTW1wRYV1MFPdPBFCyE1VXQRXY0TnqWNFfQ/PJk9KdVVHJYMlY= -"[PE] 方块九炮": LI43bJyUlFSXRNR1tiSEVdr1dn/VhFJc1WBXhVRU0MJYslY= -"[PE] C6i九炮": LI43NJRQxj9xAx76MMydNFe1b/ggzF2QU0lMFEx4NlfSHHYEJETeBS0ERVQO2URcVg== -"[PE] 心九炮": LI43NDQ0xAh97UEcSTDUVp3hxmdxA9atBGXTwVpTSUw0TAlYVXAzdhjVV09MV1RGLVuAVg== -"[PE] 轮炸九炮": LI43NMQIf+3BtXRXRsTI3X625IG19FdXXFP4IcxdQtWmdTZVP5Xugva/xwhe0OVcRVTbgkEPVg== -"[PE] ②炮": LI43NDRsnFSVZCRE2TIkDF1yW25kbIx0EBQoUuxclx7sLk9wqXwyV1T2O1huVg== -"[PE] 六芒星十炮": LI43NFTW11ictHRG0lbT11o02JoTQjcMXYI1l9R45kac099UVO0lWO5W -"[PE] 方块十炮": LI43NHRYSFpuFKQeU08IdlhTxWRaRVRy/lgBVg== -"[PE] 六边形十炮": LI43NJReWhZlQGxIIDQkDL00V/ZFKGRfelIC68aVUg1L/m1U3CdZblY= -"[PE] 斜方十炮": LI43NFTX11j8tHT+zJcVU1JTT3RQhoysjKA0zl9U2ZBfL1Y= -"[PE] 简化十炮": LI43NNTW11i8VHq2JIRV1QNujDRHNXSWSFS2FlkBVg== -"[PE] 后置十炮": LI43NMQIf+3BtXRXRsTI3X62JIRV2iXdNL42lGRNVJ3ZROdW -"[PE] 经典十炮": LI43NMQIf+0BJn+XFVJsVKYzdt9sSCAUtBC4dszuTGQYUlTsWEF5Vg== -"[PE] 六线囚尸": LI43HDCMf+0CJnFXV5cVUmREHMLIXUAPfe1BcrbEvCSE1VXSV9Q+V8aFEUxGhSFdcPfPWFTh+05VVg== -"[PE] 斜十炮": LI43bJyUlNTYBS0/FVZaU0l0jNLVdZRSejZX1hRF5E5SUp3hxmdxA2YULTTFwXTctFdUY/lGClY= -"[PE] 魔方十炮": LI43bJyUdO0CJnlXxNJWWMXUwVV/SVpu1D0IdlgQzFdUWy9C11Y= -"[PE] 戴夫的小汉堡": LI43NDRsnFSVZCTEVReYNXFQlq1TSbRMWjj0RPNtVGscWjRW -"[PE] 鸡尾酒": LI43bJyUlORGXBVgUNQMYhRcQyVsvJS05EZc1WDeTEZL+kfJ23BSVMT2WbxW -"[PE] 一勺汤圆十二炮": LI43NDRsnJSU5MZVVXSo11xV09daWFp/FXDQWUIXt9eBj1S1FWDHxKxUJDFbfVY= -"[PE] 玉壶春十二炮": LI43NFTW1wTYVDx2WlNJTEgCVnXEEraPVHUIWPgqcURKkDFaVNIpRK9W -"[PE] 半场十二炮": LI43bJyUlNTYBS00RdPXWnxMfOZGVlc4dMTVfFRU0eBEtVY= -"[PE] 简化十二炮": LI43NFRVncFYU9WAFVJsFEIlbLzU1lc4ZBFM3FRUrh9b/VY= -"[PE] 经典十二炮": LI43NMQIf+0BJn+XFVJsVKYzdt9sSCAUlYwQZCFlNMxYVKJYQjlW -"[PE] 火焰十二炮": LI5HDH7tAib9MHiXFVJ8RAx+bUcBkLX0V16Sctb9H1SXMFQdl0P1Vg== -"[PE] 冰雨十二炮·改": LI5HjH5tByb/cMwwbJxUUFYPcYPWEeKWEEhabvS01MHMdszuUGQYUlQZQXX/Vg== -"[PE] 神柱十二炮": LI43NJRUU01McIMeOlGFNJi0JITVlTX5lwJkWZCMEGQhNVZUc0RGrVY= -"[PE] 神之十二炮": LI43NJRUYsY/1SRxlxV0T9BNSFpu9DQ4dszuZFVUrGNGdVY= -"[PE] 水路无植物十二炮": LI43bJyUdO0GlNJVHNdlzMAIf+1CHdBM1P1flzBUSzNaFVY= -"[PE] 纯白悬空十二炮": LI43NIztIrOeyQ9DSDDUV/ScODDF0Nf8TM9c8npSWMdVqLZLHVY= -"[PE] 后花园十二炮": LI5HDH1d0lhTTUyUzBU08bAOdBBGJQxd0VNJTBRslFIHUAfDVNKdVL3WSy1W -"[PE] 玉米十二炮": LI435MW4wQhfkOlY6VhTTRQ0ce7clxVTQEjkRgdQB0NX0p1UJoJJiVY= -"[PE] 两路暴狂": LI5HDH7kAEZcUZTEdcLV1bV0V9ewDp3hdE7YTUhabmRs+CDkVYcUSNQRUAfDVNKdVDTSSQdW -"[PE] 九列十二炮": LI43NJRScIMe+hGkSFpudORZ0pwYRJ0kRP5fHGeM1B0wRWRUVBSURpZW -"[PE] 梯曾十二炮": LI43NMQIf+0BJn+XFVJ031VY1KjNnHZaU0kEZGJFGAlYTHJXVMV7TdFW -"[PE] 君海十二炮": LI43bJyUdO0CJnlXxFI3ZN1+tjST9J30WZdaZ9V2Z0UoUhn0aEIJzHZUAzZHt1Y= -"[PE] 箜篌引": LI43NDRsnFSVXFS2jXTfb0ggNCTkJQxd0BRC3lzA2/ZfDVDdW1TDNVutVg== -"[PE] 梅花十三": LI43NFTX11j8tHTmzJcVU0DYGVD+KnFEds8xV0Ll1SRUCm5EvlY= -"[PE] 最后之作": LI43bJyUlFSWYjTGVZ5Xtc0kRWQkDF3QU0kk3TS+lmRNVPidRIlW -"[PE] 冰心灯": LI43bJyUlFSXZNSSI2y8lLQ0V9AUTsNcSge0NlQcYVorVg== -"[PE] 太极十四炮": LI43NFTW1wRYV3SiHlJPzMyXFVNSU09k7UYQFhECdpC17jjUroQZ1qdVoCFGd1Y= -"[PE] 真·四炮": LI43NFTW1wRYV3TiWRaQtfRXfuKVQNX8wAjdNlrOXFSXIUUTVg== -"[PE] 神棍十四炮": LI5HDJ0kxNVV2PUUNHkIkFp2tiSEVdol3XS95tXeNMxYVLV/RKFW -"[PE] 神之十四炮": LI43NNRWT0zXtXRX17AOneF0TthNSFpu9LTUwcx2zO5MZBhSVASIQEVW -"[PE] 穿越十四炮": LI43bJyUdOQCNH9XzDJUVVhF09daJEjkRlxHZRFM3GRTVKtHT4VW -"[PE] 钻石十五炮": LI43NFTX11j8tHT+zJcVU2wSsxeRApahlKCNdN3VVVR1GkQKVg== -"[PE] 神之十五炮": LI43NDTkNVRVXF1WU01McIMe+lGFNJi0JIRVUVP4kEDV/9K/llBUBHVHElY= -"[PE] 真·二炮": LI43NDRsnNSUWDxgzLnkRlhbbmTUZAyQkjVyZktcOASYFIJbQ1NUWYJGCVY= -"[PE] 炮环十二花": LI43bJyUlNTYdbAefFDfbEggNCQMvTRX0H8VODh2zO5MZBhSVD8vTLlW -"[PE] 冰箱灯": LI43bJyUlNTYTUwC1j1PdGhcsmVsSCA0JOTVFnRPz1zyelJYx1XkQEHRVg== -"[PE] 对称十六炮": LI43NFTW1xToRhiWVN7clxVTXOLV52QQTNxkU1Rj1Ef5Vg== -"[PE] 神之十六炮": LI43NJRUU4Vk15cVUwA4133W/V9HVFTlfUVdVg== -"[PE] 裸奔十六炮": LI43NHRYSFpu9LRUTxhF0tcU0ZzMVQdQVImORX1W -"[PE] 双冰十六炮": LI43NNTW1wSYlDRz7QIm8rAe0NyXFVNA2BnQlVIJQ1fSnVTY7ECrVg== -"[PE] 超前置十六炮": LI43NDSMX9JTTUyUTFxwgx6awAjdRCVsvNTW5d1kjFUh+dC+1Mw3V2JRHVBUC6dDrFY= -"[PE] 火焰十六炮": LI5HDH7tAib9MHiXFVJSZDJElEQlbLzU1lcCNtyMXEQ1WlRgAUgGVg== -"[PE] 经典十六炮": LI43bJyUdO0CJnlXxNJWWEXT11p8TM9cV0WyVFSl5EIVVg== -"[PE] 冰魄十八炮": LI43bJyUlNTYBS00RdPXWnxMeOKGlVLSTUxkoDVBVVTbaUeWVg== -"[PE] 真·十八炮": LI43bJxUVlP1TM05V9A0ZdPXWgRGlhbkSQJWdRBY8j9xRHaYEGVNVBBEQHtW -"[PE] 纯十八炮": LI43bJyUlFSXRNR1tiSEVdUDNkM1dJZIVEkURjFW -"[PE] 尾炸十八炮": LI43bJyUlFSXRNR1tiSEVVE3R1X9wgh/7UL4P3lXFjByDDB/HFRUJdxBrVY= -"[PE] 经典十八炮": LI43NMQIX9APTVpmZNRlzBBBJWy81Nbl3TS+NpRkTVTbWU07Vg== -"[PE] 日花二十炮": LI43bJyUlNTYdfBZQNYRSFpu9DQ4djTBf/VENVrenVSXjEL9Vg== -"[PE] 纯二十炮": LI43bJyUlFSXRNR1tiSEVVFT+JBANXSWSFTNaEFTVg== -"[PE] 空炸二十炮": LI435MUIf+3G1dW1dEBnZIwcmhBBJWy81Nbl3ZQBd5iVRFVUqrxC3VY= -"[PE] 钉耙二十炮": LI43bJyUdO0CJnFXxFI3ZF1ADd9EJWy81NZXOGQRZCFlNMxYVO3jTgF2 -"[PE] 新二十炮": LI43bJyUdO0CJn9XxFI3ZF1ADd9EJWy81NZXAjbcjDS+NpRkTVSCNk6OVg== -"[PE] 无冰瓜二十炮": LI43bJyUdO0CJnlXxFI3ZF1Azd1EJWy81NZXAjbcjDS+NpRkTVSedk72Vg== -"[PE] 绝望之路": LI43bJyUlNTYBS00RdPXWnxMfuaGNXkMgtLVdTRxV0WyVFTp8kH1Vg== -"[PE] 二十一炮": LI435DUMf+0CJnGXFVJSZFLH/HZaU0kEJNRZ8lwIYd5t/HZU85FMs1Y= -"[PE] 新二十二炮": LI43bJyUlNTYBS00RdPXWlzohjUx1FnyXFdFslRUarNMB1Y= -"[PE] 二十二炮": LI43bJyUdO0CJn9XxFI3ZN1+tiSEVVFT+JBE5dX/EmVTAVBU7CZNEFY= -"[PE] 无冰瓜二十二炮": LI43bJyUdO0CJnFXxFI3ZN1+tiSEVVFTjDTelAH3zNd+VlTMM0zrVg== -"[PE] 九列二十二炮": LI43bJyUdO0CJnFXxFI3ZN1+tiSEVVFTjDTelAHXZH5bOlpUyB1Mr1Y= -"[PE] 二十四炮": LI43bJyUlNTYBS00RdPXWnxsNHHS3FlXRbJUVHQGQ8pW -"[PE] 垫材二十四炮": LI43bJyUlNTYBS00RdPXWnxsNHHyXFdFslRUZEdMX1Y= -"[FE] 无神无炮": LI5H/ECMfgR99J/0n1RRVsHGZ3Hjdt9sAG74IAxN5GH0ZjRxADBx7lzyelVYx1XCuEBpVw== -"[FE] 两仪无炮": LI43NBRTVn9RgvbebPggzL3kRpBeDN8fUAdDclRUCFpeaVc= -"[FE] 十二格无炮": LI43NBRTVn9Rgl74EUIlDE1kZzRxKkUYCcxUVA0+XalX -"[FE] 太极无炮": LI43NJRQxj9xg3andwISmFgMTeRGETAxlDgwRVJS1eFWP02kVlTXKl6FVw== -"[FE] 水路无植物无炮": LI5HDH1tByb/1PrUeldAXPhADF+QD1GCZsRUUAIe+sEQhXFUYU31UlS4m1jKVw== -"[FE] 十二格玩具": LI43NHRYSAJu+FG2wVhYVT+1dmcFEVCCXvhxMFpUE5Ze5Vc= -"[FE] 间隔无炮": LI5HzH3kAjTxlA5SaJQ1cVBS+FgMT9QX8VScSOjyZGRUVEm/X8NX -"[FE] 方块无炮": LI43NBRTVn9Rgl44QQzfRCUMvWRnNDFUCkUYCcxUVEPNWTVX -"[FE] 热核无炮": LI5HjH7tAjT/lAJSbEQMf21HAZA1cVxS+FgM33LmQXV2ZEeXyPlWPHZUuyhB1lc= -"[FE] 半边无炮": LI5HDH3tAQbDFcNVWlAyXvhBjH7kwlVQlZQ1cVhS+FgMX9ZYMFVUGjla7lc= -"[FE] 茶壶无炮": LI43NJRQVj9RgnanSQJumFC2wXx2dKoS05jU4VU04VZncYMeOkGEMdS/QIxeQIVR3pRVVEAdRAdX -"[FE] 神之无炮": LI43NJRQVj9RgnanSQJumCAMneSFdWc0OZQO0FxclhBkITVWVDLJWz9X -"[FE] 心无炮": LI4R329FlGRYF1GV/xXQ13XMEnVR1lJZSWjCD8myLoXPoFcIClQSp528h5+fPGb5cOwdssGO/wREI76jH6lObKo9NKege2neQbVX -"[FE] 火焰无炮": LI5HDH/tQFBNNk30FDTylAZEUN740dxs+CAMX5AUbjQ5lA5wxcFcRRgJVkxyV1Sk9E7uVw== -"[FE] 智能无炮": LI5HDH/tAib/1HrXeldAXPjAyN1+tuRGUFeC1nR6RdXhvO5Q4l74QRRFVVRc5UJPVw== -"[FE] 后退无炮": LI5HjH7tAgYDFMNVWlAyXvhBjF5ADV9HJQxd1VXNVT9XgnYQTGJSONHdNL5GlGRNVH+DQ11X -"[FE] 塔曾无炮": LI43NBRTVn9RghZ0GJA18ZcYdApN5GI0eXpFGAnMVFRyPEYjVw== -"[FE] 顶满七列曾无炮": LI5HDH/tAib/8HpXXNbVlALVzRToQZwLX9AUtORGWE1I4lIwUvhRFfycHvScDlxAjH5tRzxaxnpVWMdV6HdLfVc= -"[FE] 无冰瓜一炮": LI5HzH3kAjT91HrXeldAVC10RXSd5EJ2tiSE1ZU18Zee1MFVFMXU4VU/FWj8XFcQEFQwmh500L/WztcwZlRfNk/dVw== -"[FE] 火焰二炮": LI5HDH7tAib9lAbSDFJ8RMzderbkhrX0V8RYDE3kQsNc8npVWMdVadNDc1c= -"[FE] 大雾二炮": LI5HDH/kQVwhTSBN9BQ08rAOHUBF08FaU0lMVgJS+FkM33525EVyduQGJnL+etXhvLJUVOOKQOFX -"[FE] 压制二炮": LI5HDH/tAQYDFMNVWlAyHtaRTIKWEEgCVrUVU1LV2VU/V4J231AwlhBkIV00zFhUo7pCRVc= -"[FE] 最简四炮": LI43NJRQxj9xA3anSVpu1GVXF5QOCHbM7mRVVB2qXltX -"[FE] 鬼位四炮": LI5HDH/twbV0V0ZEzH3UcrbkhjUxlJ7U4awQZCFdNMxYVI5vRNNX -"[FE] 落月四炮": LI43NDRsnNRdZJBIWm50pwLWrFp/VwJS+FGlV4JemMAIf+0BNHGXDsxOVXQLBgMUQ/VfVN9qWi9X -"[FE] 帆船四炮": LI43jJ8kxFVBuDHM3X6y5EZcW25kUABSMJYR1CjTwVhPV4JS+FHdXJhADH/kARTDNXkYQ8TjAhRDfFZTVEeTRq5X -"[FE] 神之四炮": LI43NJRQxj9xMx46MQxft29IIFS31MFVPyXdNL6WUFQbk1qDVw== -"[FE] 磁铁四炮": LI43bJyUdOQC9AU0cVdYlBCCXjjRXGxgFrUe1dlVPwURVgIWEGQhZTTMWFQMm0wVVw== -"[FE] 雾四炮": LI5HDH9tByb/1HrXeldAXPjACN9+tiSEVdhXglL4kXHW/R9UlzBUKUBH4Vc= -"[FE] 三角板六炮": LI43bJzUUlAyZvTdUfgwNCRsvNRwRuVGEHbfHZjQZrQuUQIe+sGIfmQHNHEYWFRts1jeVw== -"[FE] 玲珑六炮": LI43NFRVnc1WZ03E1LAOncFWf1GClqxaU0m0TMNc8nogx1XRI0RtVw== -"[FE] 烈焰八炮": LI5HDH7tACb5sAZVZDDcMTREVN34EEIlbLzU1uXdNL5GlGRNVLiuS5lX -"[FE] 无保护八炮": LI43NNTW11hc5EIBkDVxRPohbLyUVJaMEWQhZTTMWFQaDVq1Vw== -"[FE] 神之八炮": LI43NJRQxj/VJH+XFUyLtfRX15cYZF2QjBFkITVWVCQ/WztX -"[FE] 经典八炮": LI43NMQIfe0BJn+XFVJsxAh/bUcNkLX0V0xTOFnMTeRCGXBHdtb931WXMFRBR0KjVw== -"[FE] 七夕灯": LI43NDRsnFSVnFSQC920bkggNCQMXXblp5U0cQIHxJBUiQZY+1c= -"[FE] 斜方十炮": LI43NFTX11j8tHT+zJcVU1LTwRRc8OWl5b2VYENUuXBZe1c= -"[FE] 河洛十炮": LI43NHRSbEgg1DdwxcEUXEM1bFyQf9WkdFfmXFhXVVR87ll7Vw== -"[FE] 纯十二炮": LI43NFRVncFYU00EVObclxVTQNgZ0NVcJ1QrAURBVw== -"[FE] 水路无植物十二炮": LI43bJyUdO0CJnFXxFI3ZN1yFlh0lkhUB31beVc= -"[FE] 神之十二炮": LI43NBRTVn9xg1a1HtLXFFpcZ2xIIBSVjBBkITVWVGCmR09X -"[FE] 曲径通幽处": LI43bJyUlNTYBS00RdPXWlhaB9WgAERdQg29ZMfVVZbX3lYBHvpRlsEEBzR2f0V2VNLPQfJX -"[FE] 某十四炮": LI43NDRsnNSUZNSSIwy9JITVVdgDtkaVN14AWFTcsURnVw== -"[FE] 礼物盒十四炮": LI43bJxUVWROkhK2b0gg1DdwxcEUXENV/wtd0FNlGNXfVFQKyURnVw== -"[FE] 弦十四炮": LI43jJ8kxNVV2DU0e5cYAGXTwVpTSUw0TO9c8npSWMdVObhH01c= -"[FE] 奇门九劫": LI43NFTW1wRYV3SiHnTQ3m1IIDQkDN105d00vjaUZE1UBmRHg1c= -"[FE] 半场十四炮": LI43NHRYSFpudKQe08GMEExa9jV4dlS0vkVnVw== -"[FE] 灯笼十六炮": LI43bJyUlFSXRORGmpvQXGxIINQ3CHbM7kxkGFJUsulFYVc= -"[FE] 花环十六炮": LI43NDRsnNSURFQ2+VAW/NyXFVNS08FcRs9c8npSWMdV8vRBDVc= -"[FE] 中压制十八炮": LI43bJyUlFSXRNR1tiSEVdUDNkM1dJZIVEkURjFX -"[FE] 无冰瓜十八炮": LI43bJyUdO0CJnlXxFI3ZF1Azd1EJWy8lLTkhlUWV2UIMHEWUAdDV9KdVMe6TcJX -"[FE] 十九炮": LI43bJyUdO0CJnFXxNJW3JwO0NyXFVNS08E0Rty1dhxsdEf4Tk1nNN5UVLoFQt5X -"[FE] 二十二炮": LI43bJyUlNTYBS00RdPXWlzohjVxYkVSdphVVF+jQ29X -"[FE] 二十四炮": LI43bJyUlNTYBS00RdPXWnxsNHHyXFdFslRUZEdMX1c= -"[RE] 无神无炮": LI7P5CGWnl0UmFRTFIoYdIredhbSTlS8OkyxUA== -"[RE] 群曾无炮": LI7P5CaWgl1/c7xmlFXEa0fcgxoMj+RCfuYm1plQxO75ZGX4PoSYVVRFskubUA== -"[RE] 水晶杯四炮": LI4/DI00l9RWTgJimDg0zO3itTRXFlCcUrfhLID0zVdUT0JBYVA= -"[RE] #四炮": LI7P5Caygs0/M74ahDHU1tLNWVNPTNQ2D3P4OQxfQuVV3/jIXcI9zN0ZmVBYJ1Q3/XZIUA== -"[RE] 波纹五炮": LI4/bIyUZCe5mMFZYlgEhOTmVX5SQ81dR5f3UpdIVEc7TmxQ -"[RE] 小六炮": LI43NBRTWWJZP4UQWmJkYPhQ3lc9QEVSWEVwYVQgoEW3UA== -"[RE] 分隔六炮": LI4/bIyUZCe5mMFn42JUDYwVVw0+VE+RQl1Q -"[RE] 方三角六炮": LI4/bIyUZCe5mPlnA2YUFZeYUuSMUE/sXMRbRZf7UoFIVKnRTZtQ -"[RE] *道六炮": LI4/bIyUZCexmM1HAhqMjuTCVVxOOE4UNj9z+FGFjFXyzlJYJ1Q91UkXUA== -"[RE] 神之七炮": LI43NBRTWVNPTE44MvrJ7UaQ1t9UpZjhfHZ8PmRVVOmXQEJQ -"[RE] 方块八炮": LI4/bIyUhDSHVHA19DUxlxh0EkJ1H1lU1OJDR1A= -"[RE] 斜方八炮": LI43NDQ0PGyMlNRYFKjSwVwFfCtyFviVUhfZWUx2zVBUuq5C4lA= -"[RE] 理发八炮": LI4/bIyUZCW9kIzd8VkUQlxgNN6MYPg4zG6F9TV+xOKV9VIXUFRrQHUiUA== -"[RE] 沙漏八炮": LI4/bIyUhDSXVFBZFELM4j3MbSd5V5eYwSRFdGknsZjNHHYMgfTOV1Rtrk+lUA== -"[RE] #八炮": LI4/bIyUZCe5mMFn42JUDXSEZEeQzm0nsoJdZ0+C1hE4TnT+pP2VZFNUjBJwt1A= -"[RE] 螺旋十炮": LI43NDxsjFSSZFSy+zjkFdzVEThOMlYRBZEEAGX0zVBU2PpMB1A= -"[RE] 镂铭灯": LI43NDxsjJSUVHFN9PjSwVliFNh+wh0MWeZtVMO1TMRQ -"[RE] 天台十炮": LI4/bIyUZCe5mPln42JUDXRU9tWozTx2cP9VVIgtcJlQ -"[RE] 十一炮": LI4/jI4k5NU1so7NDzPWDVhYWWf1dme1dhRGeNIbWdJtVPcYfYBQ -"[RE] 花灯十二炮": LI4/bIyUhFSRRIQ0U7djjBURFLjBFBwcWd5tVFyFTgNQ -"[RE] 椭盘十二炮": LI43NDxsjFSVIlg0VLOPYIxhjPTcFGUMOHFMdt3UkcSsVEoHSPFQ -"[RE] 螺旋十二炮": LI4/DI00hyTk1VXQdfQ1cthbRz8UBocU0E5cVFTAUkk6UA== -"[RE] 鸟居十二炮": LI4/bIyUhNTQTQQsREVSGVI5QFgBYSe5mOEEQQTFXWJHODR2VGV7TtVQ -"[RE] 天台十二炮": LI4/bIyUZDW/mOFn45qIjlQwZ2TUHERS3TXc+Mg0h+RCw04AJ1QijH1QUA== -"[RE] 椭盘十四炮": LI4/5D1sjJRUklhEVDKXEbV2HEx85kaa49XfmBDc1lRU21dLg1A= -"[RE] 十六炮": LI4/bIyUhNTQTQQsLBE4MvrJ7UKW09/4yO1GclZUJBR2zVA= -"[RE] 十七炮": LI4/bIyUhFSXf084TERoNhHUTM9cVNyId9VQ -"[RE] 十八炮": LI4/bIyUhNTQTQQsEN34OOSVclZUIDR3CVA= -"[ME] 无神无炮": LI7P5CGWnl0UmFRTFIoYdIredhbSTlS8OkyxUQ== -"[ME] 核聚变无炮": LI7P5CGWHnSAMdTXXQ9zmFC24UeClhEC1rUCcEUYYUyyVFQN4E8kUQ== -"[ME] 群曾无炮": LI7P5CaWAnSAOYQx1NZdf3OYUN/5OQxfQw1t1VUNWP9OYCdUE/J0qVE= -"[ME] 长矛无炮": LI7P5CGWnl3uRyBNtFScy201v9DhR4J23dS0gl1YZAV4PmSYVVQ7q0h5UQ== -"[ME] 双核一炮": LI7P5CGWnl3uRyBNtFScy201v9DhR4J2EE5aYmRUkQK2Bdc1WlRWy03/UQ== -"[ME] 神之五炮": LI43NBRTWVNPTDL6ye0ilgJEX3jm5jWymMFnMxoMXUOVBNddVHhCQgNR -"[ME] 神之六炮": LI43NBRTWVNPTDL6ye0msgJEX3rmJrKYzX8FEASANFZUQaFBvVE= -"[ME] 底置六炮": LI4/bIyUZCe5mM1n42YUFZeYUsSMns0PT4IWEQJiFAFhSJD9UpdIVImASrRR -"[ME] 无蘑菇七炮": LI4/bIyUZDW/GHQ4VOYUVJzPXbabyN1w5kZYpfw9lGRTVB5BcrlR -"[ME] 对称八炮": LI4/bIyUlJRkJ3FXSGAUEIKWDCTFwUx2HD50VA1ZVJpGQA9R -"[ME] 奇怪的八炮": LI4/bIyUZCe5mPln42JUDXRU9jP6yG1HdWYVI9Z4V16UAIfUNVpUlaVK71E= -"[ME] 田八炮": LI4/bIyUZCd5V5eY+VkUQlxgNNwUlJjBXCJXRe5Uk1FNz1E= -"[ME] 轮回之瞳": LI43NDxsjFSSXITk5jUiF3IWWPJWGXDvNTKXHnAJPLJUVG2nQnBR -"[ME] 分隔九炮": LI4/bIyUhFSRRITk5jVyRNec4QRF5oBUVMniSSpR -"[ME] 无保护十炮": LI4/bIyUhOTGVVxO1HhMieRCF9AwYVQ+70M0UQ== -"[ME] 月夜十炮": LI4/bIyUZCe/mM1n42JUDXRU9jP6Ud713viQRHX0X1SOGXCdUQ== -"[ME] 瓮中捉鳖": LI43NDxsjFSSZFS3d5CU6ME03H7SF3NQVFTDv0zcUQ== -"[ME] 十三炮": LI4/bIyUhFSRRIQU8JyY4WczmghfR1ff+FCW+WRFVBvKSgpR -"[ME] 十八炮": LI4/bIyUhFSWfxVwXGC0QtU2thBUd7B1sVE= -"[ME] 十九炮": LI4/bIyUhFSXf09MTERofHIDUFQ+fHapUQ== diff --git a/misc/pvz.lmintlcx.com.url b/misc/pvz.lmintlcx.com.url new file mode 100644 index 0000000..4706f69 --- /dev/null +++ b/misc/pvz.lmintlcx.com.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://pvz.lmintlcx.com/ diff --git "a/misc/\346\244\215\345\203\265\345\267\245\345\205\267\347\256\261\347\275\221\347\253\231/HTTPS \346\240\271\350\257\201\344\271\246/Chain of Trust - Let's Encrypt.url" "b/misc/\346\244\215\345\203\265\345\267\245\345\205\267\347\256\261\347\275\221\347\253\231/HTTPS \346\240\271\350\257\201\344\271\246/Chain of Trust - Let's Encrypt.url" deleted file mode 100644 index 93ee55a..0000000 --- "a/misc/\346\244\215\345\203\265\345\267\245\345\205\267\347\256\261\347\275\221\347\253\231/HTTPS \346\240\271\350\257\201\344\271\246/Chain of Trust - Let's Encrypt.url" +++ /dev/null @@ -1,2 +0,0 @@ -[InternetShortcut] -URL=https://letsencrypt.org/certificates/ diff --git "a/misc/\346\244\215\345\203\265\345\267\245\345\205\267\347\256\261\347\275\221\347\253\231/HTTPS \346\240\271\350\257\201\344\271\246/ISRG Root X1.der" "b/misc/\346\244\215\345\203\265\345\267\245\345\205\267\347\256\261\347\275\221\347\253\231/HTTPS \346\240\271\350\257\201\344\271\246/ISRG Root X1.der" deleted file mode 100644 index 9d2132e7f1e352fabac7eafb231488b5da91ffb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1391 zcmXqLV$C*aVh&!w%*4pVB*@StaDKxjhsTjF$q#lXH+3@@@Un4gwRyCC=VfH%W@Rw& zH{>?pWMd9xVH0Kw4K~y?PzQ0igcUsVN>YpRQcDzqQMi96N{2F6x@sQ zOA8D|4TM2TnT2^ggM-`^g7WiA6e0`_)UeSUJ_S;M+V-u>HW)=goaf7yL{%}fvF;1?F_{JHX*^)7mb z_cWAjyQP1@qPLp4KvBB%lYz~z{&jb6C9i%h=6|S9(7WzD_ly5q%k{o&s`h%|Bc#ex z(95j3;9;=J8{wPpB=-w!_Uf_kT$~tqZ%sS8l;RAn=gy-c5l%vESRjulRoaDHHpQelw1#&mWmj<25Ut_nWV1qwMTG%s)L@ zZ#3Rz-J*5P@#PxEvZ-ABH|}5EDDklY(M=kbokat@+bL(=ez`Qo=d9_8$g;*;h-`WLMh;lRc_g>Iv-DFqo zCF5PpD)i^rs|NwXHO`YuHlHea-Y3t;=GdnK4#`;nE(6$dNYTB&bR(NQ2+$oz?wqHJLsjX!HYm3h*_fBZ@a%uek ze*2NA(-ox)>ah}I#svAgPldH?sMd^L9VXJTe#U|j5E;9$T9Os}&1 zjEw(TSb({M&43@o7Y6ZJ4VZzHfhFz=l^iUlGsD^9O_ z?o;@C)1`#9mMgeli7SS+ehlD?e0}ag-X~KPhVT7{&D4o6YKug*3J5*#Pa(8&H7gpwUsuC^Ywq~GKr43@rUtb$j%*V zXSzC!JAHIpY?|)Bn-;WsJ~s2)HigcR z-KW{sqcnToqipMNtEK|qJDkTmPjj*R=DdjQJNf?H>f^h&YWulf^SYpR=4sI>j;y6q zAB!&hzU1vmo%p4{|F6+t(%W~vdiUeP>Iq_(+2h=TYs}f5dM+QCHs|Whty&MJN;P<_ z^RZ+cWl3o${YKsGG(t*4WP8`@Gk9!gJ;MzXRq} z=D1zmBD#56Ufpb-X;wRebnUN2Km5&csO6u^ip8C`)?_`D(Av1dIWhXO{2lAwvQN4% zdQ0z%8|T;t|E@mm82|syq6>)@52x)|6WeWmz4WT_ftiBq<~klMDs9=va+>1r8-Ysu9sFU+jzdgu+i;Y98&EuRc3p2BUzah5) zCmVAp3!5-gXt1HCfjWr8C9L3?SCU$kms+9_oSIx(lvz@#5R_V+npl*aq2OMWUs_-& zY9I_!$}G&|864!U5R{)^q7Y$ZAScdiWME)vU}69UQR2KnmZhP&p&5uDMSTm)30&A6SaOKU4F2Dcb zm*X4DJEf;G*m>k%Ep{?+FyI4*fGj^F<9`+wU|6#m@PqimAU>-BGmtWn1qtx6h_Q&& zI89r3&)dWL*Q6iwdd}x|uPid3iX0Qn84L!gOa|4Jer^FRhg{m-q+JXCN6ftUORkyhaaAlignment = 0; +} diff --git a/nt5/vc141_nt5.h b/nt5/vc141_nt5.h new file mode 100644 index 0000000..1dfe93a --- /dev/null +++ b/nt5/vc141_nt5.h @@ -0,0 +1,4 @@ + +#pragma once + +#include diff --git a/res/pvztoolkit.manifest b/res/pvztoolkit.manifest index 632f6a3..54ab753 100644 --- a/res/pvztoolkit.manifest +++ b/res/pvztoolkit.manifest @@ -1,31 +1,25 @@ - - Plants vs. Zombies Toolkit + + Plants vs. Zombies Tool Kit - - - - - + + + + + - - - UTF-8 - - - - - true - PerMonitorV2 - - + + + UTF-8 + + - + diff --git a/res/version.rc b/res/version.rc index 1886017..0767b30 100644 --- a/res/version.rc +++ b/res/version.rc @@ -5,7 +5,7 @@ #include -#include "version.h" +#include "../inc/version.h" IDI_ICON ICON DISCARDABLE "logo.ico" @@ -24,13 +24,22 @@ VS_VERSION_INFO VERSIONINFO BEGIN BLOCK "StringFileInfo" BEGIN - BLOCK "080404b0" +#ifdef _PTK_CHINESE_UI + BLOCK "080404B0" +#else + BLOCK "040904B0" +#endif BEGIN +#ifdef _PTK_CHINESE_UI + VALUE "CompanyName", "立方体工作室" + VALUE "FileDescription", "植物大战僵尸辅助工具" +#else VALUE "CompanyName", "Cube Studio" - VALUE "FileDescription", "PvZ Toolkit" + VALUE "FileDescription", "Plants vs. Zombies Tool Kit" +#endif VALUE "FileVersion", VERSION_NAME_FULL - VALUE "LegalCopyright", "(C) 2020-2022 lmintlcx" VALUE "InternalName", "pvztoolkit" + VALUE "LegalCopyright", "(C) 2020 - 2024 lmintlcx" VALUE "OriginalFilename", "pvztoolkit.exe" VALUE "ProductName", "PvZ Toolkit" VALUE "ProductVersion", VERSION_NAME_FULL @@ -38,6 +47,10 @@ VS_VERSION_INFO VERSIONINFO END BLOCK "VarFileInfo" BEGIN +#ifdef _PTK_CHINESE_UI VALUE "Translation", 0x0804, 1200 +#else + VALUE "Translation", 0x0409, 1200 +#endif END END diff --git a/src/code.cpp b/src/code.cpp index 051fcf3..6e35388 100644 --- a/src/code.cpp +++ b/src/code.cpp @@ -1,5 +1,5 @@ -#include "code.h" +#include "../inc/code.h" namespace Pt { diff --git a/src/data.cpp b/src/data.cpp index 079f71a..a58e780 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -1,5 +1,5 @@ -#include "data.h" +#include "../inc/data.h" namespace Pt { @@ -8,6 +8,8 @@ Data::Data() { this->find_result = PVZ_NOT_FOUND; +#ifdef _PVZ_BETA_LEAK_SUPPORT + this->data_beta_0_1_1_1014_en = { 0x7552a8, // path @@ -410,6 +412,8 @@ Data::Data() 0x00457f90, // call_play_music }; +#endif + this->data_1_0_0_1051_en = { 0x6a6cc8, // path @@ -2826,8 +2830,10 @@ Data::Data() this->ver_map.insert(std::pair(PVZ_OPEN_ERROR, data_1_0_0_1051_en)); this->ver_map.insert(std::pair(PVZ_UNSUPPORTED, data_1_0_0_1051_en)); +#ifdef _PVZ_BETA_LEAK_SUPPORT this->ver_map.insert(std::pair(PVZ_BETA_0_1_1_1014_EN, data_beta_0_1_1_1014_en)); this->ver_map.insert(std::pair(PVZ_BETA_0_9_9_1029_EN, data_beta_0_9_9_1029_en)); +#endif this->ver_map.insert(std::pair(PVZ_1_0_0_1051_EN, data_1_0_0_1051_en)); this->ver_map.insert(std::pair(PVZ_1_2_0_1065_EN, data_1_2_0_1065_en)); @@ -2850,11 +2856,13 @@ Data::~Data() { } +#ifdef _PVZ_BETA_LEAK_SUPPORT bool Data::isBETA() { return (this->find_result == PVZ_BETA_0_1_1_1014_EN // || this->find_result == PVZ_BETA_0_9_9_1029_EN); // } +#endif bool Data::isGOTY() { diff --git a/src/lineup.cpp b/src/lineup.cpp index 4156730..101bffe 100644 --- a/src/lineup.cpp +++ b/src/lineup.cpp @@ -1,5 +1,5 @@ -#include "lineup.h" +#include "../inc/lineup.h" namespace Pt { @@ -9,13 +9,13 @@ Lineup::Lineup() reset_data(); } -Lineup::Lineup(std::string string) +Lineup::Lineup(const std::string &string) { reset_data(); Init(string); } -Lineup::Lineup(std::string name, std::string string) +Lineup::Lineup(const std::string &name, const std::string &string) { reset_data(); Init(string); @@ -56,7 +56,7 @@ void Lineup::reset_data() void Lineup::Init(const std::string &string) { std::regex regex_string("[0-5](,[a-fA-F0-9]{1,2} [1-6] [1-9] [0-2] [0-4]( [a-zA-Z0-9]{1,}){0,}){0,}"); - std::regex regex_code("[a-zA-Z0-9+/=]{18,164}"); + std::regex regex_code("([a-zA-Z0-9+/=]{18,164}|[a-zA-Z0-9-_=]{18,164})"); if (std::regex_match(string, regex_string)) { @@ -232,10 +232,11 @@ bool Lineup::lineup_code_to_data() unsigned long size = 128; unsigned char buffer[128] = {0}; - BOOL ret_decode = CryptStringToBinaryA(this->lineup_code.c_str(), 0, CRYPT_STRING_BASE64, - buffer, &size, nullptr, nullptr); - if (ret_decode == FALSE) - return false; + + size_t len = this->lineup_code.length(); + auto written = base64_decode(buffer, this->lineup_code.c_str(), len); + // TODO 检测失败 + size = written; for (size_t i = 0; i < size; i++) buffer[i] = buffer[i] ^ (unsigned char)0x54; @@ -270,13 +271,16 @@ void Lineup::data_to_lineup_code() for (size_t i = 0; i < size + 1; i++) buffer[i] = buffer[i] ^ (unsigned char)0x54; - DWORD len = 256; char str[256] = {0}; - CryptBinaryToStringA(buffer, size + 1, CRYPT_STRING_BASE64, str, &len); + size_t len = size + 1; + auto written = base64_encode(str, buffer, len); std::string code(str); - code.erase(std::remove(code.begin(), code.end(), '\r'), code.end()); - code.erase(std::remove(code.begin(), code.end(), '\n'), code.end()); + + // CryptBinaryToStringA + // code.erase(std::remove(code.begin(), code.end(), '\r'), code.end()); + // code.erase(std::remove(code.begin(), code.end(), '\n'), code.end()); + // std::cout << lineup << " " << lineup.size() << std::endl; lineup_code = code; } diff --git a/src/main.cpp b/src/main.cpp index 0ac2634..4af1bf4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,40 +1,47 @@ -#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include #include #include +#include #include #include -#include #include +#include #include -#include - -#include -#include -#include -#include - -#include -#include -#include +#include -#include "toolkit.h" -#include "../res/version.h" +#include "../inc/toolkit.h" +#include "../inc/utils.h" #define IDI_ICON 1001 -static_assert(_MSC_VER >= 1929); -static_assert(sizeof(void *) == 4); +// 要求编译器支持 C++17 +static_assert(_MSC_VER >= 1916); -bool VerifySignature(LPCWSTR); +// 编译器目标平台限制为 x86 +// 因为目标应用 (植物大战僵尸1 PC版) 本身是 x86 的 +// 修改器也不需要 x64 的任何优势, 反而增加体积 +// 以及 Visual Studio 不支持 x64 内联汇编 +static_assert(sizeof(void *) == 4); void window_callback(Fl_Widget *w, void *) { // 按 Esc 不退出, 而是还原默认窗口大小 if (Fl::event() == FL_SHORTCUT && Fl::event_key() == FL_Escape) { - if (Fl::screen_scale(((Fl_Double_Window *)w)->screen_num()) != 1.0f) - Fl::screen_scale(((Fl_Double_Window *)w)->screen_num(), 1.0f); + if (Fl::screen_scale(((Fl_Window *)w)->screen_num()) != ((Pt::Window *)w)->MinScale()) + Fl::screen_scale(((Fl_Window *)w)->screen_num(), ((Pt::Window *)w)->MinScale()); return; } @@ -55,9 +62,8 @@ void callback_pvz_check(void *w) /// main /// -Fl_Font ui_font = FL_FREE_FONT + 1; // 主界面 -Fl_Font ls_font = FL_FREE_FONT + 2; // 阵型代码 -Fl_Font tt_font = FL_FREE_FONT + 3; // 提示信息 +Fl_Font ui_font = FL_FREE_FONT + 1; // 界面中文 +Fl_Font ms_font = FL_FREE_FONT + 2; // 等宽英文 int main(int argc, char **argv) { @@ -92,19 +98,42 @@ int main(int argc, char **argv) Fl::background(243, 243, 243); // 界面字体 +#if _WIN32_WINNT >= _WIN32_WINNT_VISTA Fl::set_font(ui_font, "Microsoft YaHei"); - Fl::set_font(ls_font, "Courier New"); - Fl::set_font(tt_font, "Segoe UI"); + Fl::set_font(ms_font, "Consolas"); +#else + TCHAR fontsPath[MAX_PATH]; + SHGetSpecialFolderPathW(NULL, fontsPath, CSIDL_FONTS, FALSE); + std::wstring fonts_path = fontsPath; + if (PathFileExistsW((fonts_path + L"\\msyh.ttc").c_str()) == TRUE || // + PathFileExistsW((fonts_path + L"\\msyh.ttf").c_str()) == TRUE) + Fl::set_font(ui_font, "Microsoft YaHei"); + else + Fl::set_font(ui_font, "SimSun"); + if (PathFileExistsW((fonts_path + L"\\consola.ttf").c_str()) == TRUE) + Fl::set_font(ms_font, "Consolas"); + else + Fl::set_font(ms_font, "Courier New"); +#endif // 设置对话框属性 +#ifdef _PTK_CHINESE_UI fl_message_font(ui_font, 13); +#else + fl_message_font(ms_font, 13); +#endif fl_message_hotspot(1); - // fl_cancel = "取消"; - // fl_close = "关闭"; - // fl_no = "否"; - // fl_ok = "好的"; - // fl_yes = "是"; +#ifdef _PTK_CHINESE_UI + fl_cancel = "取消"; + fl_close = "关闭"; + fl_no = "否"; + fl_ok = "好的"; + fl_yes = "是"; + Fl_Input::copy_menu_text = "复制"; + Fl_Input::cut_menu_text = "剪切"; + Fl_Input::paste_menu_text = "粘贴"; +#endif // 设置工具提示的样式 Fl_Tooltip::delay(0.1f); @@ -112,7 +141,7 @@ int main(int argc, char **argv) Fl_Tooltip::hidedelay(5.0f); Fl_Tooltip::color(FL_WHITE); Fl_Tooltip::textcolor(FL_BLACK); - Fl_Tooltip::font(tt_font); + Fl_Tooltip::font(ui_font); Fl_Tooltip::size(12); Fl_Tooltip::margin_width(5); Fl_Tooltip::margin_height(5); @@ -126,14 +155,15 @@ int main(int argc, char **argv) // 启动画面 + bool show_splash = true; + double dt = 1.2f; // 最短显示时间 + Fl_Window splash(400 + 2, 225 + 2, ""); splash.begin(); Fl_Box box(1, 1, 400, 225, nullptr); splash.end(); - box.labelsize(42); - box.labelcolor(FL_GRAY); - splash.color(FL_GRAY); + splash.color(FL_GREEN); splash.border(false); splash.set_non_modal(); @@ -144,11 +174,15 @@ int main(int argc, char **argv) if (img_jpeg.fail() == 0) box.image(img_jpeg); else if (img_png.fail() == 0) + { box.image(img_png); + if (Pt::VerifyFileHash(L"splash.png", "8dd46f92e0fa175513278ff208147fbf")) + dt = 0.3f; + } else if (img_bmp.fail() == 0) box.image(img_bmp); else - box.label("PvZ Toolkit"); + show_splash = false; if (box.image()) { @@ -158,84 +192,89 @@ int main(int argc, char **argv) splash.size(w + 2, h + 2); } - // 第一个窗口显示前设置标题栏图标 - extern HINSTANCE fl_display; - splash.icon((const void *)LoadIcon(fl_display, MAKEINTRESOURCE(IDI_ICON))); - - splash.position((Fl::w() - splash.w()) / 2, (Fl::h() - splash.h()) / 2); - splash.show(); - splash.wait_for_expose(); - - splash.color(box.image() ? FL_GREEN : FL_DARK_GREEN); + if (show_splash) + { + splash.position((Fl::w() - splash.w()) / 2, (Fl::h() - splash.h()) / 2); + splash.show(); + splash.wait_for_expose(); + } clock_t start = clock(); // 开始计时 // 系统需求 - - if (!IsWindowsVistaOrGreater()) + // 针对 Windows 2000 和 XP 的编译版本做了一些特殊改动 + // 在高版本系统上为了避免可能存在的问题, 直接拒绝运行 +#if _WIN32_WINNT < _WIN32_WINNT_VISTA + if (IsWindowsVistaOrGreater()) { fl_message_title("PvZ Toolkit"); +#ifdef _PTK_CHINESE_UI fl_alert("正在使用的操作系统不受支持!\n" - "需要 Windows Vista 或者更高版本才能运行。"); + "需要 Windows 2000 或者 XP 才能运行。"); +#else + fl_alert("This operating system is not supported!\n" + "Windows 2000 or XP is required to run."); +#endif return -10; } +#endif - // 测试版在 2023-12-31 23:59:59 之后失效 - if (!RELEASE_VERSION && (std::time(nullptr) > std::time_t(1704038399))) + // 防篡改检测 + // This feature is designed for the original author lmintlcx. + // If you want to make a customized version, delete this code. +#ifdef _PTK_SIGNATURE_CHECK + wchar_t exePath[MAX_PATH] = {0}; + GetModuleFileNameW(NULL, exePath, MAX_PATH); + if (!Pt::VerifySignature(exePath, "\x21\x13\x67\x0f\x3b\x6c\x60\xaf\x42\x50\x7f\x07\xd3\x97\xbc\xd6")) { - fl_message_title("测试版过期提示"); - if (fl_choice("这是很久以前的测试版哦,现在去下载新的正式版吗?", // +#ifdef _PTK_CHINESE_UI + fl_message_title("PvZ Toolkit 防篡改检测"); + if (fl_choice("本程序可能已经感染病毒,请在官方渠道重新下载!", // +#else + fl_message_title("PvZ Toolkit Tamper-proof Detection"); + if (fl_choice("This program may have been infected with a virus, \n" + "please download it again from the official website!", // +#endif "No", "Yes", 0) == 1) ShellExecuteW(nullptr, L"open", L"https://pvz.lmintlcx.com/toolkit/", // nullptr, nullptr, SW_SHOWNORMAL); return -1; } - - // 防篡改检测 - if (SIGNATURE_CHECK) - { - wchar_t exePath[MAX_PATH] = {0}; - GetModuleFileNameW(NULL, exePath, MAX_PATH); - if (!VerifySignature(exePath)) - { - fl_message_title("PvZ Toolkit 防篡改检测"); - if (fl_choice("本程序可能已经感染病毒,请在官方渠道重新下载!", // - "No", "Yes", 0) == 1) - ShellExecuteW(nullptr, L"open", L"https://pvz.lmintlcx.com/toolkit/", // - nullptr, nullptr, SW_SHOWNORMAL); - return -2; - } - } +#endif // 只运行单个实例 HANDLE m = CreateMutexW(nullptr, true, L"PvZ Toolkit"); if (GetLastError() == ERROR_ALREADY_EXISTS) - return -3; - - // 主窗口 - Pt::Toolkit pvztoolkit(0, 0, ""); - pvztoolkit.callback(window_callback); + return -2; #ifdef _DEBUG std::wcout << L"启动用时(毫秒): " << (clock() - start) << std::endl; - // pvztoolkit.input_sun->value(clock() - start); #endif // 隐藏启动画面 - - double dt = 0.017; // 最短显示时间 - while ((clock() - start) / (double)CLOCKS_PER_SEC < dt) + if (show_splash) + { + while ((clock() - start) / (double)CLOCKS_PER_SEC < dt) + Fl::check(); + splash.hide(); Fl::check(); - splash.hide(); - Fl::check(); + } // 显示主窗口 + Pt::Toolkit pvztoolkit(0, 0, ""); + pvztoolkit.callback(window_callback); + pvztoolkit.show(1, argv); // argc -> 1 pvztoolkit.wait_for_expose(); pvztoolkit.pvz->FindPvZ(); SetForegroundWindow(fl_xid(&pvztoolkit)); + // 标题栏图标 + HICON hIcon = LoadIconW(fl_display, MAKEINTRESOURCEW(IDI_ICON)); + SendMessageW(fl_xid(&pvztoolkit), WM_SETICON, ICON_SMALL, (LPARAM)hIcon); + SendMessageW(fl_xid(&pvztoolkit), WM_SETICON, ICON_BIG, (LPARAM)hIcon); + #ifdef _DEBUG // 避免调试的时候频繁输出 #else @@ -250,85 +289,3 @@ int main(int argc, char **argv) return ret; } - -bool VerifySignature(LPCWSTR pwszSourceFile) -{ - bool isGoodSignature = false; - - WINTRUST_FILE_INFO FileData; - memset(&FileData, 0, sizeof(FileData)); - FileData.cbStruct = sizeof(WINTRUST_FILE_INFO); - FileData.pcwszFilePath = pwszSourceFile; - FileData.hFile = NULL; - FileData.pgKnownSubject = NULL; - - GUID WVTPolicyGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2; - WINTRUST_DATA WinTrustData; - memset(&WinTrustData, 0, sizeof(WinTrustData)); - WinTrustData.cbStruct = sizeof(WinTrustData); - WinTrustData.pPolicyCallbackData = NULL; - WinTrustData.pSIPClientData = NULL; - WinTrustData.dwUIChoice = WTD_UI_NONE; - WinTrustData.fdwRevocationChecks = WTD_REVOKE_NONE; - WinTrustData.dwUnionChoice = WTD_CHOICE_FILE; - WinTrustData.dwStateAction = WTD_STATEACTION_VERIFY; - WinTrustData.hWVTStateData = NULL; - WinTrustData.pwszURLReference = NULL; - WinTrustData.dwUIContext = 0; - WinTrustData.pFile = &FileData; - - LONG lStatus = WinVerifyTrust(NULL, &WVTPolicyGUID, &WinTrustData); - // wprintf_s(L"WinVerifyTrust lStatus is: 0x%x.\n", lStatus); - - [[maybe_unused]] bool sig_good = (lStatus == ERROR_SUCCESS || lStatus == CERT_E_CHAINING || lStatus == TRUST_E_COUNTER_SIGNER); - [[maybe_unused]] bool sig_not_bad = (lStatus != TRUST_E_NOSIGNATURE && lStatus != TRUST_E_BAD_DIGEST); - isGoodSignature = sig_not_bad; // TODO - - WinTrustData.dwStateAction = WTD_STATEACTION_CLOSE; - lStatus = WinVerifyTrust(NULL, &WVTPolicyGUID, &WinTrustData); - - if (!isGoodSignature) - return false; - - HCERTSTORE hStore = NULL; - HCRYPTMSG hMsg = NULL; - CryptQueryObject(CERT_QUERY_OBJECT_FILE, pwszSourceFile, // - CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, // - CERT_QUERY_FORMAT_FLAG_BINARY, // - 0, NULL, NULL, NULL, &hStore, &hMsg, NULL); - - DWORD dwSignerInfo = 0; - CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &dwSignerInfo); - PCMSG_SIGNER_INFO pSignerInfo = (PCMSG_SIGNER_INFO)LocalAlloc(LPTR, dwSignerInfo); - CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, (PVOID)pSignerInfo, &dwSignerInfo); - - CERT_INFO CertInfo; - memset(&CertInfo, 0, sizeof(CertInfo)); - CertInfo.Issuer = pSignerInfo->Issuer; - CertInfo.SerialNumber = pSignerInfo->SerialNumber; - PCCERT_CONTEXT pCertContext = // - CertFindCertificateInStore(hStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, // - 0, CERT_FIND_SUBJECT_CERT, (PVOID)&CertInfo, NULL); - - const DWORD size = 16; - if (pCertContext->pCertInfo->SerialNumber.cbData == size) - { - char snRead[size + 1]; - for (DWORD i = 0; i < size; i++) - snRead[i] = pCertContext->pCertInfo->SerialNumber.pbData[size - (i + 1)]; - snRead[size] = 0; - char snCheck[] = "\x21\x13\x67\x0f\x3b\x6c\x60\xaf\x42\x50\x7f\x07\xd3\x97\xbc\xd6"; - isGoodSignature = strcmp(snRead, snCheck) == 0; - } - else - { - isGoodSignature = false; - } - - CertFreeCertificateContext(pCertContext); - CertCloseStore(hStore, 0); - CryptMsgClose(hMsg); - LocalFree(pSignerInfo); - - return isGoodSignature; -} diff --git a/src/pak.cpp b/src/pak.cpp index 4866d4e..cf7888c 100644 --- a/src/pak.cpp +++ b/src/pak.cpp @@ -1,5 +1,5 @@ -#include "pak.h" +#include "../inc/pak.h" namespace Pt { @@ -12,26 +12,6 @@ PAK::~PAK() { } -std::string PAK::utf8_encode(const std::wstring &wstr) -{ - if (wstr.empty()) - return std::string(); - int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), nullptr, 0, nullptr, nullptr); - std::string str(size_needed, 0); - WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &str[0], size_needed, nullptr, nullptr); - return str; -} - -std::wstring PAK::utf8_decode(const std::string &str) -{ - if (str.empty()) - return std::wstring(); - int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), nullptr, 0); - std::wstring wstr(size_needed, 0); - MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstr[0], size_needed); - return wstr; -} - bool PAK::create_path(const std::wstring &path) { if (path == L"") @@ -58,7 +38,7 @@ bool PAK::create_path(const std::wstring &path) return CreateDirectoryW(path.c_str(), nullptr); } -void PAK::find_files(const std::wstring find_path, +void PAK::find_files(const std::wstring &find_path, std::vector &files_name, std::vector &files_size, std::vector &files_time) @@ -101,7 +81,7 @@ void PAK::find_files(const std::wstring find_path, } } -int PAK::Unpack(std::wstring src_file, std::wstring dst_dir) +int PAK::Unpack(const std::wstring &src_file, const std::wstring &dst_dir) { #ifdef _DEBUG std::wcout << L"解包源文件: " << src_file << std::endl; @@ -275,12 +255,12 @@ int PAK::Unpack(std::wstring src_file, std::wstring dst_dir) return UNPACK_SUCCESS; } -int PAK::Unpack(std::string src_file, std::string dst_dir) +int PAK::Unpack(const std::string &src_file, const std::string &dst_dir) { return Unpack(utf8_decode(src_file), utf8_decode(dst_dir)); } -int PAK::Pack(std::wstring src_dir, std::wstring dst_file) +int PAK::Pack(const std::wstring &src_dir, const std::wstring &dst_file) { #ifdef _DEBUG std::wcout << L"打包源文件夹: " << src_dir << std::endl; @@ -374,8 +354,8 @@ int PAK::Pack(std::wstring src_dir, std::wstring dst_file) unsigned int name_size = file_name_str.size(); name_width = static_cast(name_size); - for (size_t i = 0; i < name_size; i++) - file_name[i] = file_name_str.at(i); + for (size_t j = 0; j < name_size; j++) + file_name[j] = file_name_str.at(j); file_name[name_size] = 0; file_size = files_size.at(i); @@ -467,11 +447,10 @@ int PAK::Pack(std::wstring src_dir, std::wstring dst_file) CloseHandle(hfr); // 加密 - for (size_t i = 0; i < size; ++i) - buffer[i] = buffer[i] ^ 0xf7; + for (size_t j = 0; j < size; ++j) + buffer[j] = buffer[j] ^ 0xf7; // 写入 - DWORD write_size = 0; WriteFile(hfw, buffer, size, &write_size, nullptr); if (write_size != size) { @@ -486,7 +465,7 @@ int PAK::Pack(std::wstring src_dir, std::wstring dst_file) return PACK_SUCCESS; } -int PAK::Pack(std::string src_file, std::string dst_dir) +int PAK::Pack(const std::string &src_file, const std::string &dst_dir) { return Pack(utf8_decode(src_file), utf8_decode(dst_dir)); } diff --git a/src/process.cpp b/src/process.cpp index 38cdc56..458fc11 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -1,5 +1,5 @@ -#include "process.h" +#include "../inc/process.h" namespace Pt { @@ -40,7 +40,7 @@ bool Process::OpenByWindow(const wchar_t *class_name, const wchar_t *window_name } } - assert(PROCESS_ALL_ACCESS == 0x001FFFFF); + // assert(PROCESS_ALL_ACCESS == 0x001FFFFF); #ifdef _DEBUG std::wcout << L"查找窗口: " << (class_name == nullptr ? L"nullptr" : class_name) // diff --git a/src/pvz.cpp b/src/pvz.cpp index 726e3f6..c799462 100644 --- a/src/pvz.cpp +++ b/src/pvz.cpp @@ -1,5 +1,5 @@ -#include "pvz.h" +#include "../inc/pvz.h" namespace Pt { @@ -27,6 +27,85 @@ void PvZ::asm_code_inject() } } +#ifdef _DEBUG + +void PvZ::check_all_hacks() +{ + check_hack(data().block_main_loop); + + check_hack(data().unlock_sun_limit); + check_hack(data().auto_collected); + check_hack(data().not_drop_loot); + + check_hack(data().fertilizer_unlimited); + check_hack(data().bug_spray_unlimited); + check_hack(data().chocolate_unlimited); + check_hack(data().tree_food_unlimited); + + check_hack(data().placed_anywhere); + check_hack(data().placed_anywhere_preview); + check_hack(data().placed_anywhere_iz); + check_hack(data().fast_belt); + check_hack(data().lock_shovel); + + check_hack(data().rake_unlimited); + check_hack(data().init_lawn_mowers); + check_hack(data().lawn_mower_initialize); + + check_hack(data().plant_immune_eat); + check_hack(data().plant_immune_radius); + check_hack(data().plant_immune_jalapeno); + check_hack(data().plant_immune_projectile); + check_hack(data().plant_immune_lob_motion); + check_hack(data().plant_immune_square); + check_hack(data().plant_immune_row_area); + check_hack(data().plant_immune_spike_rock); + check_hack(data().plant_immune_squish); + + check_hack(data()._plant_immune_eat); + check_hack(data()._plant_immune_projectile); + check_hack(data()._plant_immune_lob_motion); + check_hack(data()._plant_immune_row_area); + + check_hack(data().zombie_immune_body_damage); + check_hack(data().zombie_immune_helm_damage); + check_hack(data().zombie_immune_shield_damage); + check_hack(data().zombie_immune_burn_crumble); + check_hack(data().zombie_immune_radius); + check_hack(data().zombie_immune_burn_row); + check_hack(data().zombie_immune_chomper); + check_hack(data().zombie_immune_mind_controll); + check_hack(data().zombie_immune_blow_away); + check_hack(data().zombie_immune_splash); + check_hack(data().zombie_immune_lawn_mower); + + check_hack(data()._zombie_immune_body_damage); + check_hack(data()._zombie_immune_helm_damage); + check_hack(data()._zombie_immune_shield_damage); + check_hack(data()._zombie_immune_burn_crumble); + + check_hack(data().reload_instantly); + check_hack(data().grow_up_quickly); + check_hack(data().mushrooms_awake); + check_hack(data().stop_spawning); + check_hack(data().stop_zombies); + check_hack(data().lock_butter); + check_hack(data().no_crater); + check_hack(data().no_ice_trail); + check_hack(data().zombie_not_explode); + + check_hack(data().hack_street_zombies); + + check_hack(data().no_fog); + check_hack(data().see_vase); + check_hack(data().background_running); + check_hack(data().disable_delete_userdata); + check_hack(data().disable_save_userdata); + check_hack(data().unlock_limbo_page); +} + +#endif + void PvZ::callback(cb_func func, void *win) { this->cb_find_result = func; @@ -38,8 +117,10 @@ bool PvZ::FindPvZ() this->find_result = PVZ_NOT_FOUND; std::vector pvz_titles = { - L"Bloom & Doom BETA 0.1.1.1014", // - L"Plants vs. Zombies BETA 0.9.9.1029", // +#ifdef _PVZ_BETA_LEAK_SUPPORT + L"Bloom & Doom BETA 0.1.1.1014", // + L"Plants vs. Zombies BETA 0.9.9.1029", // +#endif L"Plants vs. Zombies", // L"Plants vs. Zombies 1.2.0.1073", // L"Plants vs. Zombies 1.2.0.1073 RELEASE", // @@ -48,7 +129,7 @@ bool PvZ::FindPvZ() L"Plantas contra Zombis 1.2.0.1093", // L"Plantes contre Zombies 1.2.0.1093", // L"Piante contro zombi 1.2.0.1093", // - }; // + }; for (size_t i = 0; i < pvz_titles.size() + 1; i++) { @@ -86,8 +167,10 @@ bool PvZ::FindPvZ() // version detection key value std::vector> v = { - {0x49359c21, PVZ_BETA_0_1_1_1014_EN}, // - {0x499a6204, PVZ_BETA_0_9_9_1029_EN}, // +#ifdef _PVZ_BETA_LEAK_SUPPORT + {0x49359c21, PVZ_BETA_0_1_1_1014_EN}, // + {0x499a6204, PVZ_BETA_0_9_9_1029_EN}, // +#endif {0x49ecf563, PVZ_1_0_0_1051_EN}, // {0x4a37d6af, PVZ_1_2_0_1065_EN}, // {0x4a5b7963, PVZ_1_0_4_7924_ES}, // @@ -123,10 +206,10 @@ bool PvZ::FindPvZ() this->find_result = PVZ_NOT_FOUND; } - // 没有找到窗口/打开进程失败就继续找 + // 没有找到窗口或者打开进程失败就继续找 if (this->find_result == PVZ_NOT_FOUND || this->find_result == PVZ_OPEN_ERROR) continue; - // 找到了支持/不支持的版本则终止循环 + // 找到了支持或者不支持的版本则终止循环 else break; } @@ -146,7 +229,10 @@ bool PvZ::FindPvZ() #ifdef _DEBUG if (supported) + { + check_all_hacks(); WriteMemory(true, {data().lawn, data().tod_mode}); + } #endif if (cb_find_result != nullptr && this->window != nullptr) @@ -230,6 +316,7 @@ void PvZ::SetScene(int scene, bool reset) if (has_lawn_mower) SetLawnMowers(1); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) { unsigned int scene_id[6] = {1, 2, 3, 4, 5, 7}; @@ -244,6 +331,7 @@ void PvZ::SetScene(int scene, bool reset) WriteMemory(scene_id[scene], {0x00416e31 + 1}); } } +#endif asm_init(); asm_mov_exx_dword_ptr(Reg::ESI, data().lawn); @@ -251,12 +339,15 @@ void PvZ::SetScene(int scene, bool reset) asm_add_list({0xc7, 0x86}); // mov [esi+0000554C],scene asm_add_dword(data().scene); // asm_add_dword(scene); // +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_mov_exx_exx(Reg::ECX, Reg::ESI); +#endif asm_call(data().call_pick_background); asm_ret(); asm_code_inject(); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) { if (this->find_result == PVZ_BETA_0_1_1_1014_EN) @@ -266,6 +357,7 @@ void PvZ::SetScene(int scene, bool reset) // movzx eax,byte ptr [eax+00417480] WriteMemory({0x0f, 0xb6, 0x80, 0x80, 0x74, 0x41, 0x00}, {0x00416e31}); } +#endif // 1.lawn 2.bare 3.pool // 0.none 1.land 2.water @@ -323,9 +415,11 @@ void PvZ::SetScene(int scene, bool reset) if (!particle_system_dead && particle_system_type == 34) { uintptr_t addr = particle_system_offset + particle_system_struct_size * i; +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_mov_exx(Reg::ECX, addr); else +#endif asm_push_dword(addr); asm_call(data().call_delete_particle_system); } @@ -353,8 +447,10 @@ void PvZ::SetScene(int scene, bool reset) if (this->find_result == PVZ_GOTY_1_1_0_1056_ZH || // this->find_result == PVZ_GOTY_1_1_0_1056_JA) asm_push_exx(Reg::EDI); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_mov_exx_exx(Reg::ECX, Reg::EDI); +#endif asm_call(data().call_puzzle_next_stage_clear); asm_ret(); asm_code_inject(); @@ -400,10 +496,12 @@ void PvZ::UnlockTrophy() // Mini-games WriteMemory({1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {mini_games}); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (this->find_result == PVZ_BETA_0_1_1_1014_EN) WriteMemory(5, {mini_games + 18 * sizeof(int)}); else if (this->find_result == PVZ_BETA_0_9_9_1029_EN) WriteMemory(5, {mini_games + 15 * sizeof(int)}); +#endif mini_games += 20 * sizeof(int); // Hidden Mini-games @@ -411,7 +509,9 @@ void PvZ::UnlockTrophy() mini_games += (13 + 1) * sizeof(int); // Wisdom Tree (Height) +#ifdef _PVZ_BETA_LEAK_SUPPORT if (this->find_result != PVZ_BETA_0_1_1_1014_EN) +#endif mini_games += 1 * sizeof(int); // Vasebreaker @@ -476,7 +576,9 @@ void PvZ::UnlockTrophy() // Chocolate twiddydinky += (1 + 1 + 1) * sizeof(int); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (this->find_result != PVZ_BETA_0_1_1_1014_EN) +#endif { // Tree of Wisdom WriteMemory(1, {twiddydinky}); @@ -525,7 +627,7 @@ void PvZ::UnlockTrophy() } } -void PvZ::DirectWin() +void PvZ::DirectWin(bool brightest_cob_cannon) { if (!GameOn()) return; @@ -535,7 +637,7 @@ void PvZ::DirectWin() int frame_time = GetFrameDuration(); int mode = GameMode(); - bool light_cob = 11 <= mode && mode <= 15; + bool light_cob = brightest_cob_cannon && 1 <= mode && mode <= 15; if (light_cob) { @@ -688,9 +790,11 @@ void PvZ::TreeFoodUnlimited(bool on) if (!GameOn()) return; +#ifdef _PVZ_BETA_LEAK_SUPPORT // 早期测试版没有智慧树 if (this->find_result == PVZ_BETA_0_1_1_1014_EN) return; +#endif enable_hack(data().tree_food_unlimited, on); if (on && ReadMemory({data().lawn, data().user_data}) != 0) @@ -705,9 +809,11 @@ void PvZ::SetTreeHeight(int height) if (ReadMemory({data().lawn, data().user_data}) == 0) return; +#ifdef _PVZ_BETA_LEAK_SUPPORT // 早期测试版没有智慧树 if (this->find_result == PVZ_BETA_0_1_1_1014_EN) return; +#endif if (GameMode() == 50) // Zen Garden { @@ -751,6 +857,7 @@ void PvZ::SetTreeHeight(int height) } else { +#ifdef _PVZ_BETA_LEAK_SUPPORT if (this->find_result == PVZ_BETA_0_9_9_1029_EN) { asm_init(); @@ -762,6 +869,7 @@ void PvZ::SetTreeHeight(int height) asm_code_inject(); } else +#endif { asm_init(); asm_mov_exx(Reg::EDI, data().lawn); @@ -884,6 +992,7 @@ void PvZ::asm_put_plant(int row, int col, int type, bool imitater, bool iz_style asm_push_dword(-1); asm_push_dword(type); } +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) { asm_push_dword(row); @@ -892,6 +1001,7 @@ void PvZ::asm_put_plant(int row, int col, int type, bool imitater, bool iz_style asm_mov_exx_dword_ptr_exx_add(Reg::ECX, data().board); } else +#endif { asm_mov_exx(Reg::EAX, row); asm_push_dword(col); @@ -915,8 +1025,10 @@ void PvZ::asm_put_plant(int row, int col, int type, bool imitater, bool iz_style asm_add_list(0x01, 0xd9); // add ecx,ebx asm_push_exx(Reg::ECX); asm_mov_exx_exx(Reg::ESI, Reg::EAX); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_mov_exx_exx(Reg::ECX, Reg::EAX); +#endif asm_call(data().call_put_plant_imitater); asm_pop_exx(Reg::ECX); asm_mov_exx_exx(Reg::EAX, Reg::ECX); @@ -929,8 +1041,10 @@ void PvZ::asm_put_plant(int row, int col, int type, bool imitater, bool iz_style asm_mov_exx_dword_ptr(Reg::EAX, data().lawn); asm_mov_exx_dword_ptr_exx_add(Reg::EAX, data().board); asm_mov_exx_dword_ptr_exx_add(Reg::EAX, data().challenge); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_mov_exx_exx(Reg::ECX, Reg::EAX); +#endif asm_call(data().call_put_plant_iz_style); asm_mov_exx_exx(Reg::EAX, Reg::ESI); } @@ -980,6 +1094,7 @@ void PvZ::asm_put_zombie(int row, int col, int type) asm_mov_exx(Reg::ECX, col); asm_call(data().call_put_zombie); } +#ifdef _PVZ_BETA_LEAK_SUPPORT else if (isBETA()) { asm_push_dword(row); @@ -990,6 +1105,7 @@ void PvZ::asm_put_zombie(int row, int col, int type) asm_mov_exx_dword_ptr_exx_add(Reg::ECX, data().challenge); asm_call(data().call_put_zombie); } +#endif else { asm_push_dword(col); @@ -1013,6 +1129,7 @@ void PvZ::PutZombie(int row, int col, int type) if (type == 25) // 僵王 { asm_init(); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) { asm_mov_exx_dword_ptr(Reg::ECX, data().lawn); @@ -1022,6 +1139,7 @@ void PvZ::PutZombie(int row, int col, int type) asm_push_dword(25); } else +#endif { asm_mov_exx_dword_ptr(Reg::EAX, data().lawn); asm_mov_exx_dword_ptr_exx_add(Reg::EAX, data().board); @@ -1064,6 +1182,7 @@ void PvZ::asm_put_grave(int row, int col) asm_mov_exx(Reg::EBX, col); asm_call(data().call_put_grave); } +#ifdef _PVZ_BETA_LEAK_SUPPORT else if (isBETA()) { asm_mov_exx_dword_ptr(Reg::ECX, data().lawn); @@ -1073,6 +1192,7 @@ void PvZ::asm_put_grave(int row, int col) asm_push_dword(col); asm_call(data().call_put_grave); } +#endif else { asm_mov_exx_dword_ptr(Reg::EDX, data().lawn); @@ -1114,6 +1234,7 @@ void PvZ::PutGrave(int row, int col) void PvZ::asm_put_ladder(int row, int col) { +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) { asm_push_dword(row); @@ -1123,6 +1244,7 @@ void PvZ::asm_put_ladder(int row, int col) asm_call(data().call_put_ladder); } else +#endif { asm_mov_exx(Reg::EDI, row); asm_push_dword(col); @@ -1226,12 +1348,14 @@ void PvZ::asm_put_rake(int row, int col) } else { +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) { asm_mov_exx_dword_ptr(Reg::ECX, data().lawn); asm_mov_exx_dword_ptr_exx_add(Reg::ECX, data().board); } else +#endif { asm_mov_exx_dword_ptr(Reg::EDX, data().lawn); asm_mov_exx_dword_ptr_exx_add(Reg::EDX, data().board); @@ -1262,9 +1386,11 @@ void PvZ::PutRake(int row, int col) reset_code_rake_row_goty = ReadMemory({data().call_put_rake_row}); if (!isGOTY()) +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) WriteMemory({0xbd, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90}, {data().call_put_rake_row}); else +#endif WriteMemory({0xba, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90}, {data().call_put_rake_row}); else WriteMemory({0xbf, 0x00, 0x00, 0x00, 0x00, 0x90}, {data().call_put_rake_row}); @@ -1336,17 +1462,21 @@ void PvZ::SetLawnMowers(int option) if (this->find_result == PVZ_GOTY_1_1_0_1056_ZH || // this->find_result == PVZ_GOTY_1_1_0_1056_JA) asm_mov_exx(Reg::EBX, addr); +#ifdef _PVZ_BETA_LEAK_SUPPORT else if (isBETA()) asm_mov_exx(Reg::ECX, addr); +#endif else asm_mov_exx(Reg::ESI, addr); asm_call(data().call_start_lawn_mower); } else { +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_mov_exx(Reg::ECX, addr); else +#endif asm_mov_exx(Reg::EAX, addr); asm_call(data().call_delete_lawn_mower); } @@ -1356,9 +1486,11 @@ void PvZ::SetLawnMowers(int option) { asm_mov_exx_dword_ptr(Reg::EAX, data().lawn); asm_mov_exx_dword_ptr_exx_add(Reg::EAX, data().board); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_mov_exx_exx(Reg::ECX, Reg::EAX); else +#endif asm_push_exx(Reg::EAX); asm_call(data().call_restore_lawn_mower); } @@ -1393,9 +1525,11 @@ void PvZ::ClearAllPlants() if (!plant_dead && !plant_squished) { uint32_t addr = plant_offset + plant_struct_size * i; +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_mov_exx(Reg::ECX, addr); else +#endif asm_push_dword(addr); asm_call(data().call_delete_plant); } @@ -1413,8 +1547,10 @@ void PvZ::KillAllZombies() return; unsigned int zombie_struct_size = isGOTY() ? 0x168 : 0x15c; +#ifdef _PVZ_BETA_LEAK_SUPPORT if (this->find_result == PVZ_BETA_0_1_1_1014_EN) zombie_struct_size = 0x160; +#endif auto zombie_count_max = ReadMemory({data().lawn, data().board, data().zombie_count_max}); auto zombie_offset = ReadMemory({data().lawn, data().board, data().zombie}); @@ -1442,8 +1578,10 @@ void PvZ::ClearGridItems(std::vector types) return; unsigned int grid_item_struct_size = 0xec; +#ifdef _PVZ_BETA_LEAK_SUPPORT if (this->find_result == PVZ_BETA_0_1_1_1014_EN) grid_item_struct_size = 0x8c; +#endif auto grid_item_count_max = ReadMemory({data().lawn, data().board, data().grid_item_count_max}); auto grid_item_offset = ReadMemory({data().lawn, data().board, data().grid_item}); @@ -1456,9 +1594,11 @@ void PvZ::ClearGridItems(std::vector types) if (!grid_item_dead && std::find(types.begin(), types.end(), grid_item_type) != types.end()) { int addr = grid_item_offset + grid_item_struct_size * i; +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_mov_exx(Reg::ECX, addr); else +#endif asm_mov_exx(Reg::ESI, addr); asm_call(data().call_delete_grid_item); } @@ -1472,6 +1612,7 @@ void PvZ::PlantInvincible(bool on) if (!GameOn()) return; +#ifdef _PVZ_BETA_LEAK_SUPPORT if (this->find_result == PVZ_BETA_0_1_1_1014_EN) { HACK plant_immune_eat = {0x0052130a, // @@ -1488,6 +1629,7 @@ void PvZ::PlantInvincible(bool on) enable_hack(plant_immune_eat, on); } +#endif enable_hack(data().plant_immune_eat, on); enable_hack(data().plant_immune_radius, on); @@ -1505,6 +1647,7 @@ void PvZ::PlantWeak(bool on) if (!GameOn()) return; +#ifdef _PVZ_BETA_LEAK_SUPPORT if (this->find_result == PVZ_BETA_0_1_1_1014_EN) { HACK _plant_immune_eat = {0x0052130a, // @@ -1521,6 +1664,8 @@ void PvZ::PlantWeak(bool on) enable_hack(_plant_immune_eat, on); } +#endif + enable_hack(data()._plant_immune_eat, on); enable_hack(data()._plant_immune_projectile, on); enable_hack(data()._plant_immune_lob_motion, on); @@ -1532,6 +1677,7 @@ void PvZ::ZombieInvincible(bool on) if (!GameOn()) return; +#ifdef _PVZ_BETA_LEAK_SUPPORT if (this->find_result == PVZ_BETA_0_1_1_1014_EN) { HACK zombie_immune_body_damage = {0x0051f084, // @@ -1540,6 +1686,7 @@ void PvZ::ZombieInvincible(bool on) enable_hack(zombie_immune_body_damage, on); } +#endif enable_hack(data().zombie_immune_body_damage, on); enable_hack(data().zombie_immune_helm_damage, on); @@ -1559,6 +1706,7 @@ void PvZ::ZombieWeak(bool on) if (!GameOn()) return; +#ifdef _PVZ_BETA_LEAK_SUPPORT if (this->find_result == PVZ_BETA_0_1_1_1014_EN) { HACK _zombie_immune_body_damage = {0x0051f084, // @@ -1567,6 +1715,7 @@ void PvZ::ZombieWeak(bool on) enable_hack(_zombie_immune_body_damage, on); } +#endif enable_hack(data()._zombie_immune_body_damage, on); enable_hack(data()._zombie_immune_helm_damage, on); @@ -1612,8 +1761,10 @@ void PvZ::MushroomsAwake(bool on) uint32_t addr = plant_offset + plant_struct_size * i; if (isGOTY()) asm_mov_exx(Reg::EDI, addr); +#ifdef _PVZ_BETA_LEAK_SUPPORT else if (isBETA()) asm_mov_exx(Reg::ECX, addr); +#endif else asm_mov_exx(Reg::EAX, addr); asm_push_byte(0); @@ -1866,8 +2017,10 @@ Lineup PvZ::GetLineup() unsigned int plant_struct_size = 0x14c; unsigned int grid_item_struct_size = 0xec; +#ifdef _PVZ_BETA_LEAK_SUPPORT if (this->find_result == PVZ_BETA_0_1_1_1014_EN) grid_item_struct_size = 0x8c; +#endif auto plant_count_max = ReadMemory({data().lawn, data().board, data().plant_count_max}); auto plant_offset = ReadMemory({data().lawn, data().board, data().plant}); @@ -2003,8 +2156,10 @@ void PvZ::SetLineup(Lineup lineup) asm_push_exx(Reg::EAX); if (isGOTY()) asm_mov_exx_exx(Reg::EDI, Reg::EAX); +#ifdef _PVZ_BETA_LEAK_SUPPORT else if (isBETA()) asm_mov_exx_exx(Reg::ECX, Reg::EAX); +#endif asm_push_byte(0); asm_call(data().call_set_plant_sleeping); asm_pop_exx(Reg::EAX); @@ -2014,9 +2169,11 @@ void PvZ::SetLineup(Lineup lineup) // mov [eax+54],00000001 if (plant_type == 4 || plant_type == 9) { +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_add_list(0xc7, 0x40, 0x5c); else +#endif asm_add_list(0xc7, 0x40, 0x54); asm_add_dword(1); } @@ -2076,12 +2233,14 @@ void PvZ::generate_spawn_list() } else { +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) { asm_mov_exx_dword_ptr(Reg::ECX, data().lawn); asm_mov_exx_dword_ptr_exx_add(Reg::ECX, data().board); } else +#endif { asm_mov_exx_dword_ptr(Reg::EDI, data().lawn); asm_mov_exx_dword_ptr_exx_add(Reg::EDI, data().board); @@ -2099,15 +2258,19 @@ void PvZ::update_spawn_preview() asm_init(); asm_mov_exx_dword_ptr(Reg::EBX, data().lawn); asm_mov_exx_dword_ptr_exx_add(Reg::EBX, data().board); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_mov_exx_exx(Reg::ECX, Reg::EBX); +#endif asm_call(data().call_remove_cutscene_zombies); asm_mov_exx_dword_ptr(Reg::EAX, data().lawn); asm_mov_exx_dword_ptr_exx_add(Reg::EAX, data().board); asm_mov_exx_dword_ptr_exx_add(Reg::EAX, data().cut_scene); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) asm_mov_exx_exx(Reg::ECX, Reg::EAX); else +#endif asm_push_exx(Reg::EAX); asm_call(data().call_place_street_zombies); asm_ret(); @@ -2298,10 +2461,10 @@ void PvZ::CustomizeSpawn(std::array zombies, bool limit_giga, bool sim type += 1; type %= 33; } - } while ((!zombies[type]) // - || (has_flag && limit_flag && type == 1) // - || (has_yeti && limit_yeti && type == 19) // - || (has_bungee && limit_bungee && type == 20) // + } while ((!zombies[type]) // + || (has_flag && limit_flag && type == 1) // + || (has_yeti && limit_yeti && type == 19) // + || (has_bungee && limit_bungee && type == 20) // || (has_giga && limit_giga && type == 32 && !giga_waves[(i / 50) % 20])); // zombies_list[i] = type; @@ -2341,6 +2504,7 @@ void PvZ::SetMusic(int id) return; asm_init(); +#ifdef _PVZ_BETA_LEAK_SUPPORT if (isBETA()) { asm_push_dword(id); @@ -2348,6 +2512,7 @@ void PvZ::SetMusic(int id) asm_mov_exx_dword_ptr_exx_add(Reg::ECX, data().music); } else +#endif { asm_mov_exx(Reg::EDI, id); asm_mov_exx_dword_ptr(Reg::EAX, data().lawn); diff --git a/src/toolkit.cpp b/src/toolkit.cpp index 606c9a4..ff87870 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -1,5 +1,5 @@ -#include "toolkit.h" +#include "../inc/toolkit.h" namespace Pt { @@ -7,7 +7,7 @@ namespace Pt Toolkit::Toolkit(int width, int height, const char *title) : Window(width, height, title) { - this->path = std::filesystem::current_path(); + this->current_path = std::filesystem::current_path(); // 子窗口 @@ -109,7 +109,9 @@ Toolkit::Toolkit(int width, int height, const char *title) button_speed->callback(cb_speed, this); check_limbo_page->callback(cb_limbo_page, this); +#ifdef _PTK_CHINESE_UI check_tooltips->callback(cb_tooltips, this); // 重载 +#endif this->cb_tooltips(); } @@ -127,6 +129,7 @@ void Toolkit::cb_tooltips(Fl_Widget *, void *w) void Toolkit::cb_tooltips() { +#ifdef _PTK_CHINESE_UI bool on = check_tooltips->value() == 1; window_spawn->tooltips(on); @@ -141,6 +144,12 @@ void Toolkit::cb_tooltips() button_show_details->copy_label(EMOJI("📈", "查看详情")); button_show_details->copy_tooltip(on ? "Show Details" : nullptr); } +#else + if (window_spawn->shown() == 1) + button_show_details->copy_label("Hide Details"); + else + button_show_details->copy_label("Show Details"); +#endif Window::cb_tooltips(); // 放在最后 } @@ -277,8 +286,13 @@ void Toolkit::cb_zombies_list() if (window_spawn->button_zombies_list->value() == 2 && import_success) { +#ifdef _PTK_CHINESE_UI fl_message_title("加载成功"); fl_message("出怪列表已经导入到游戏中."); +#else + fl_message_title("Loaded Successfully"); + fl_message("Zombies list has been imported into the game."); +#endif } // 保存 @@ -297,7 +311,7 @@ void Toolkit::cb_zombies_list() crc = crc32(crc, (const unsigned char *)data, (3 + 1000) * sizeof(int)); data[3 + 1000] = crc; - std::filesystem::current_path(this->path); + std::filesystem::current_path(this->current_path); system("mkdir zombies"); SYSTEMTIME time_now; @@ -322,8 +336,13 @@ void Toolkit::cb_zombies_list() if (outfile) { outfile.write(reinterpret_cast(&data), sizeof(data)); +#ifdef _PTK_CHINESE_UI fl_message_title("保存成功"); fl_message(std::string("当前出怪列表保存在文件: \n" + filename).c_str()); +#else + fl_message_title("Saved Successfully"); + fl_message(std::string("Current zombies list is saved in file: \n" + filename).c_str()); +#endif } outfile.close(); } @@ -560,13 +579,15 @@ void Toolkit::cb_direct_win_thread() { Fl::lock(); button_direct_win->deactivate(); + check_brightest_cob_cannon->deactivate(); Fl::unlock(); Fl::awake(); - pvz->DirectWin(); + pvz->DirectWin(check_brightest_cob_cannon->value()); Fl::lock(); button_direct_win->activate(); + check_brightest_cob_cannon->activate(); Fl::unlock(); Fl::awake(); } @@ -1069,18 +1090,18 @@ void Toolkit::cb_userdata(Fl_Widget *, void *w) void Toolkit::cb_userdata() { - auto open = [](std::string p) + auto open = [](const std::string &path) { - DWORD fa = GetFileAttributesA(p.c_str()); + DWORD fa = GetFileAttributesA(path.c_str()); if ((fa != INVALID_FILE_ATTRIBUTES) && (fa & FILE_ATTRIBUTE_DIRECTORY)) - ShellExecuteA(nullptr, "open", p.c_str(), nullptr, nullptr, SW_SHOWNORMAL); + ShellExecuteA(nullptr, "open", path.c_str(), nullptr, nullptr, SW_SHOWNORMAL); }; - auto wopen = [](std::wstring p) + auto wopen = [](const std::wstring &path) { - DWORD fa = GetFileAttributesW(p.c_str()); + DWORD fa = GetFileAttributesW(path.c_str()); if ((fa != INVALID_FILE_ATTRIBUTES) && (fa & FILE_ATTRIBUTE_DIRECTORY)) - ShellExecuteW(nullptr, L"open", p.c_str(), nullptr, nullptr, SW_SHOWNORMAL); + ShellExecuteW(nullptr, L"open", path.c_str(), nullptr, nullptr, SW_SHOWNORMAL); }; if (true) @@ -1088,8 +1109,8 @@ void Toolkit::cb_userdata() // 2000/XP 系统下才会使用 `安装目录/userdata` 做存档位置 // 需要找到游戏才能定位到游戏安装目录 std::string exe_path = pvz->GamePath(); - std::string path = exe_path.substr(0, exe_path.find_last_of("\\") + 1) + "userdata"; - open(path); + std::string userdata_path_nt5 = exe_path.substr(0, exe_path.find_last_of("\\") + 1) + "userdata"; + open(userdata_path_nt5); } TCHAR szPath[MAX_PATH]; @@ -1102,7 +1123,7 @@ void Toolkit::cb_userdata() wopen(std::wstring(szPath) + L"\\Reflexive\\PlantsVsZombies\\userdata"); } - std::wstring path; + std::wstring userdata_path; HKEY hKey; DWORD ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Valve\\Steam", // 0, KEY_QUERY_VALUE, &hKey); @@ -1113,15 +1134,15 @@ void Toolkit::cb_userdata() DWORD dwSize = MAX_PATH; DWORD status = RegQueryValueExW(hKey, L"InstallPath", 0, &dwType, (LPBYTE)&szSteamPath, &dwSize); if (status == ERROR_SUCCESS) - path = std::wstring(szSteamPath) + L"\\userdata"; // 通过注册表找到的安装位置 + userdata + userdata_path = std::wstring(szSteamPath) + L"\\userdata"; // 通过注册表找到的安装位置 + userdata RegCloseKey(hKey); } - DWORD fa = GetFileAttributesW(path.c_str()); - if (!path.empty() && (fa != INVALID_FILE_ATTRIBUTES) && (fa & FILE_ATTRIBUTE_DIRECTORY)) + DWORD fa = GetFileAttributesW(userdata_path.c_str()); + if (!userdata_path.empty() && (fa != INVALID_FILE_ATTRIBUTES) && (fa & FILE_ATTRIBUTE_DIRECTORY)) { WIN32_FIND_DATA ffd; HANDLE hf; - hf = FindFirstFileW((path + L"\\*").c_str(), &ffd); + hf = FindFirstFileW((userdata_path + L"\\*").c_str(), &ffd); if (hf != INVALID_HANDLE_VALUE) { do @@ -1131,8 +1152,7 @@ void Toolkit::cb_userdata() continue; if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - path = path + L"\\" + name + L"\\3590\\remote"; - wopen(path); + wopen(userdata_path + L"\\" + name + L"\\3590\\remote"); } } while (FindNextFileW(hf, &ffd) != 0); FindClose(hf); @@ -1207,12 +1227,20 @@ void Toolkit::cb_unpack() } else if (this->unpack_result == UNPACK_SUCCESS) { +#ifdef _PTK_CHINESE_UI fl_message_title("解包完成"); +#else + fl_message_title("Extract Success"); +#endif fl_message(this->unpack_text.c_str()); } else { +#ifdef _PTK_CHINESE_UI fl_message_title("解包出错"); +#else + fl_message_title("Extract Failed"); +#endif fl_alert(this->unpack_text.c_str()); } } @@ -1258,6 +1286,7 @@ void Toolkit::cb_unpack_thread() this->unpack_result = ret; std::vector> msg = { +#ifdef _PTK_CHINESE_UI {UNPACK_SRC_NOT_EXIST, "打开源文件失败!"}, // {UNPACK_SRC_SIZE_ERROR, "获取源文件大小失败!"}, // {UNPACK_SRC_LOAD_ERROR, "读取源文件内容失败!"}, // @@ -1267,6 +1296,17 @@ void Toolkit::cb_unpack_thread() {UNPACK_FILE_CREATE_ERROR, "解包文件创建失败!"}, // {UNPACK_FILE_WRITE_ERROR, "解包文件写入失败!"}, // {UNPACK_SUCCESS, "解包后的文件夹位于:\n" + dst_dir}, // +#else + {UNPACK_SRC_NOT_EXIST, "UNPACK_SRC_NOT_EXIST"}, // + {UNPACK_SRC_SIZE_ERROR, "UNPACK_SRC_SIZE_ERROR"}, // + {UNPACK_SRC_LOAD_ERROR, "UNPACK_SRC_LOAD_ERROR"}, // + {UNPACK_SRC_HEADER_ERROR, "UNPACK_SRC_HEADER_ERROR"}, // + {UNPACK_SRC_DATA_ERROR, "UNPACK_SRC_DATA_ERROR"}, // + {UNPACK_PATH_CREATE_ERROR, "UNPACK_PATH_CREATE_ERROR"}, // + {UNPACK_FILE_CREATE_ERROR, "UNPACK_FILE_CREATE_ERROR"}, // + {UNPACK_FILE_WRITE_ERROR, "UNPACK_FILE_WRITE_ERROR"}, // + {UNPACK_SUCCESS, "The extracted files are located at:\n" + dst_dir}, // +#endif }; for (size_t i = 0; i < msg.size(); i++) @@ -1307,12 +1347,20 @@ void Toolkit::cb_pack() } else if (this->pack_result == PACK_SUCCESS) { +#ifdef _PTK_CHINESE_UI fl_message_title("打包完成"); +#else + fl_message_title("Pack Success"); +#endif fl_message(this->pack_text.c_str()); } else { +#ifdef _PTK_CHINESE_UI fl_message_title("打包出错"); +#else + fl_message_title("Pack Failed"); +#endif fl_alert(this->pack_text.c_str()); } } @@ -1359,6 +1407,7 @@ void Toolkit::cb_pack_thread() this->pack_result = ret; std::vector> msg = { +#ifdef _PTK_CHINESE_UI {PACK_SRC_NOT_EXIST, "打开源文件夹失败!"}, // {PACK_SRC_EMPTY_ERROR, "源文件夹为空!"}, // {PACK_PATH_CREATE_ERROR, "打包路径创建失败!"}, // @@ -1366,6 +1415,15 @@ void Toolkit::cb_pack_thread() {PACK_FILE_WRITE_ERROR, "打包文件写入失败!"}, // {PACK_SRC_READ_ERROR, "打包源文件读取失败!"}, // {PACK_SUCCESS, "打包后的文件位于:\n" + dst_file}, // +#else + {PACK_SRC_NOT_EXIST, "PACK_SRC_NOT_EXIST"}, // + {PACK_SRC_EMPTY_ERROR, "PACK_SRC_EMPTY_ERROR"}, // + {PACK_PATH_CREATE_ERROR, "PACK_PATH_CREATE_ERROR"}, // + {PACK_FILE_CREATE_ERROR, "PACK_FILE_CREATE_ERROR"}, // + {PACK_FILE_WRITE_ERROR, "PACK_FILE_WRITE_ERROR"}, // + {PACK_SRC_READ_ERROR, "PACK_SRC_READ_ERROR"}, // + {PACK_SUCCESS, "The packed file is located at: \n" + dst_file}, // +#endif }; for (size_t i = 0; i < msg.size(); i++) @@ -1396,7 +1454,7 @@ void Toolkit::cb_speed(Fl_Widget *, void *w) void Toolkit::cb_speed() { - int time_ms[] = { + const int time_ms[] = { 1, // 10x 2, // 5x 5, // 2x diff --git a/src/utils.cpp b/src/utils.cpp new file mode 100644 index 0000000..9aadcd5 --- /dev/null +++ b/src/utils.cpp @@ -0,0 +1,286 @@ + +#include "../inc/utils.h" + +namespace Pt +{ + +std::size_t base64_encode(void *dst, void const *src, std::size_t len) +{ + static char tab[] = { + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // + "abcdefghijklmnopqrstuvwxyz" // + "0123456789" // + "+/" // -_ + }; + + char *out = static_cast(dst); + char const *in = static_cast(src); + + for (auto n = len / 3; n--;) + { + *out++ = tab[(in[0] & 0xfc) >> 2]; + *out++ = tab[((in[0] & 0x03) << 4) + ((in[1] & 0xf0) >> 4)]; + *out++ = tab[((in[2] & 0xc0) >> 6) + ((in[1] & 0x0f) << 2)]; + *out++ = tab[in[2] & 0x3f]; + in += 3; + } + + switch (len % 3) + { + case 2: + *out++ = tab[(in[0] & 0xfc) >> 2]; + *out++ = tab[((in[0] & 0x03) << 4) + ((in[1] & 0xf0) >> 4)]; + *out++ = tab[(in[1] & 0x0f) << 2]; + *out++ = '='; + break; + + case 1: + *out++ = tab[(in[0] & 0xfc) >> 2]; + *out++ = tab[((in[0] & 0x03) << 4)]; + *out++ = '='; + *out++ = '='; + break; + + case 0: + break; + } + + return out - static_cast(dst); +} + +std::size_t base64_decode(void *dst, char const *src, std::size_t len) +{ + static signed char inverse[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0-15 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16-31 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63, // 32-47 + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, // 48-63 + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64-79 + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, // 80-95 + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111 + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, // 112-127 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 128-143 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 144-159 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 160-175 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 176-191 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 192-207 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 208-223 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 224-239 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // 240-255 + }; + + char *out = static_cast(dst); + auto in = reinterpret_cast(src); + + unsigned char c3[3], c4[4] = {0, 0, 0, 0}; + int i = 0; + int j = 0; + + while (len-- && *in != '=') + { + auto const v = inverse[*in]; + if (v == -1) + break; + ++in; + c4[i] = v; + if (++i == 4) + { + c3[0] = (c4[0] << 2) + ((c4[1] & 0x30) >> 4); + c3[1] = ((c4[1] & 0xf) << 4) + ((c4[2] & 0x3c) >> 2); + c3[2] = ((c4[2] & 0x3) << 6) + c4[3]; + + for (i = 0; i < 3; i++) + *out++ = c3[i]; + i = 0; + } + } + + if (i) + { + c3[0] = (c4[0] << 2) + ((c4[1] & 0x30) >> 4); + c3[1] = ((c4[1] & 0xf) << 4) + ((c4[2] & 0x3c) >> 2); + c3[2] = ((c4[2] & 0x3) << 6) + c4[3]; + + for (j = 0; j < i - 1; j++) + *out++ = c3[j]; + } + + return out - static_cast(dst); +} + +std::string utf8_encode(const std::wstring &wstr) +{ + if (wstr.empty()) + return std::string(); + int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), nullptr, 0, nullptr, nullptr); + std::string str(size_needed, 0); + WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &str[0], size_needed, nullptr, nullptr); + return str; +} + +std::wstring utf8_decode(const std::string &str) +{ + if (str.empty()) + return std::wstring(); + int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), nullptr, 0); + std::wstring wstr(size_needed, 0); + MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstr[0], size_needed); + return wstr; +} + +bool VerifySignature(LPCWSTR pwszSourceFile, const char *snCheck) +{ + bool isGoodSignature = false; + + WINTRUST_FILE_INFO FileData; + memset(&FileData, 0, sizeof(FileData)); + FileData.cbStruct = sizeof(WINTRUST_FILE_INFO); + FileData.pcwszFilePath = pwszSourceFile; + FileData.hFile = NULL; + FileData.pgKnownSubject = NULL; + + GUID WVTPolicyGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2; + WINTRUST_DATA WinTrustData; + memset(&WinTrustData, 0, sizeof(WinTrustData)); + WinTrustData.cbStruct = sizeof(WinTrustData); + WinTrustData.pPolicyCallbackData = NULL; + WinTrustData.pSIPClientData = NULL; + WinTrustData.dwUIChoice = WTD_UI_NONE; + WinTrustData.fdwRevocationChecks = WTD_REVOKE_NONE; + WinTrustData.dwUnionChoice = WTD_CHOICE_FILE; + WinTrustData.dwStateAction = WTD_STATEACTION_VERIFY; + WinTrustData.hWVTStateData = NULL; + WinTrustData.pwszURLReference = NULL; + WinTrustData.dwUIContext = 0; + WinTrustData.pFile = &FileData; + + LONG lStatus = WinVerifyTrust(NULL, &WVTPolicyGUID, &WinTrustData); + // wprintf_s(L"WinVerifyTrust lStatus is: 0x%x.\n", lStatus); + + [[maybe_unused]] bool sig_good = (lStatus == ERROR_SUCCESS || lStatus == CERT_E_CHAINING || lStatus == TRUST_E_COUNTER_SIGNER); + [[maybe_unused]] bool sig_not_bad = (lStatus != TRUST_E_NOSIGNATURE && lStatus != TRUST_E_BAD_DIGEST); + isGoodSignature = sig_not_bad; // TODO + + WinTrustData.dwStateAction = WTD_STATEACTION_CLOSE; + lStatus = WinVerifyTrust(NULL, &WVTPolicyGUID, &WinTrustData); + + if (!isGoodSignature) + return false; + + HCERTSTORE hStore = NULL; + HCRYPTMSG hMsg = NULL; + CryptQueryObject(CERT_QUERY_OBJECT_FILE, pwszSourceFile, // + CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, // + CERT_QUERY_FORMAT_FLAG_BINARY, // + 0, NULL, NULL, NULL, &hStore, &hMsg, NULL); + + DWORD dwSignerInfo = 0; + CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &dwSignerInfo); + PCMSG_SIGNER_INFO pSignerInfo = (PCMSG_SIGNER_INFO)LocalAlloc(LPTR, dwSignerInfo); + CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, (PVOID)pSignerInfo, &dwSignerInfo); + + CERT_INFO CertInfo; + memset(&CertInfo, 0, sizeof(CertInfo)); + CertInfo.Issuer = pSignerInfo->Issuer; + CertInfo.SerialNumber = pSignerInfo->SerialNumber; + PCCERT_CONTEXT pCertContext = // + CertFindCertificateInStore(hStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, // + 0, CERT_FIND_SUBJECT_CERT, (PVOID)&CertInfo, NULL); + + const DWORD size = 16; + if (pCertContext->pCertInfo->SerialNumber.cbData == size) + { + char snRead[size + 1]; + for (DWORD i = 0; i < size; i++) + snRead[i] = pCertContext->pCertInfo->SerialNumber.pbData[size - (i + 1)]; + snRead[size] = 0; + isGoodSignature = strcmp(snRead, snCheck) == 0; + } + else + { + isGoodSignature = false; + } + + CertFreeCertificateContext(pCertContext); + CertCloseStore(hStore, 0); + CryptMsgClose(hMsg); + LocalFree(pSignerInfo); + + return isGoodSignature; +} + +// https://learn.microsoft.com/zh-cn/windows/win32/seccrypto/example-c-program--creating-an-md-5-hash-from-file-content +bool VerifyFileHash(LPCWSTR file_name, const char *file_md5) +{ + const int BUFSIZE = 1024; + const int MD5LEN = 16; + + BOOL bResult = FALSE; + HCRYPTPROV hProv = 0; + HCRYPTHASH hHash = 0; + HANDLE hFile = NULL; + BYTE rgbFile[BUFSIZE]; + DWORD cbRead = 0; + BYTE rgbHash[MD5LEN]; + DWORD cbHash = 0; + CHAR rgbDigits[] = "0123456789abcdef"; + + hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); + if (INVALID_HANDLE_VALUE == hFile) + return false; + + if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) + { + CloseHandle(hFile); + return false; + } + + if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) + { + CloseHandle(hFile); + CryptReleaseContext(hProv, 0); + return false; + } + + while (bResult = ReadFile(hFile, rgbFile, BUFSIZE, &cbRead, NULL)) + { + if (0 == cbRead) + break; + if (!CryptHashData(hHash, rgbFile, cbRead, 0)) + { + CryptReleaseContext(hProv, 0); + CryptDestroyHash(hHash); + CloseHandle(hFile); + return false; + } + } + + if (!bResult) + { + CryptReleaseContext(hProv, 0); + CryptDestroyHash(hHash); + CloseHandle(hFile); + return false; + } + + cbHash = MD5LEN; + if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) + { + std::string md5_hash; + for (DWORD i = 0; i < cbHash; i++) + { + md5_hash += rgbDigits[rgbHash[i] >> 4]; + md5_hash += rgbDigits[rgbHash[i] & 0xf]; + } + // std::cout << md5_hash << std::endl; + return md5_hash == file_md5; + } + + CryptDestroyHash(hHash); + CryptReleaseContext(hProv, 0); + CloseHandle(hFile); + + return false; +} + +} // namespace Pt diff --git a/src/window.cpp b/src/window.cpp index 8b86e04..5dd606d 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1,5 +1,5 @@ -#include "window.h" +#include "../inc/window.h" #define IDI_ICON 1001 @@ -95,6 +95,46 @@ const char *zombies[] = "GigaGargantuar", }; +#ifdef _PTK_CHINESE_UI +#else +const char *zombies_s[] = + { + "Zombie", + "Flag ~", + "Conehead ~", + "Pole Vaulting ~", + "Buckethead ~", + "Newspaper ~", + "Screen Door ~", + "Football ~", + "Dancing ~", + "Backup Dancer", + "Ducky Tube ~", + "Snorkel ~", + "Zomboni", + "~ Bobsled Team", + "Dolphin Rider ~", + "Jack-in-the-Box ~", + "Balloon ~", + "Digger ~", + "Pogo ~", + "~ Yeti", + "Bungee ~", + "Ladder ~", + "Catapult ~", + "Gargantuar", + "Imp", + "Dr. Zomboss", + "Peashooter ~", + "Wall-nut ~", + "Jalapeno ~", + "Gatling Pea ~", + "Squash ~", + "Tall-nut ~", + "GigaGargantuar", +}; +#endif + const char *modes[] = { "Adventure", @@ -172,6 +212,7 @@ const char *modes[] = "Intro", }; +#ifdef _PTK_CHINESE_UI const char *plants_zh[] = { "豌豆射手", @@ -337,6 +378,7 @@ const char *modes_zh[] = "促销", "介绍", }; +#endif Fl_Choice_::Fl_Choice_(int x, int y, int w, int h, const char *l) : Fl_Choice(x, y, w, h, l) @@ -412,7 +454,11 @@ SpawnTable::SpawnTable(int X, int Y, int W, int H, const char *L = 0) rows(ROWS); row_header(1); +#ifdef _PTK_CHINESE_UI row_header_width(75); +#else + row_header_width(175); +#endif row_height_all(18); row_resize(0); @@ -460,9 +506,9 @@ void SpawnTable::draw_cell(TableContext context, int ROW = 0, int COL = 0, // static char s[100]; // 缓冲 // 单波某种僵尸一般不超过 20 只,单轮某种僵尸一般不超过 300 只 - Fl_Color c_n = 0xffffff00u - 0x01000100u * (min(data[ROW][COL], 20) * 0xffu / 30); // 背景颜色 - Fl_Color c_t = 0xffffff00u - 0x01010100u * (min(data[ROW][COL], 300) * 0xffu / 500); // 背景颜色(总数) - Fl_Color c_f = 0xcccccc00u; // 旗帜波边框 + Fl_Color c_n = 0xffffff00u - 0x01000100u * (std::min(data[ROW][COL], 20) * 0xffu / 30); // 背景颜色 + Fl_Color c_t = 0xffffff00u - 0x01010100u * (std::min(data[ROW][COL], 300) * 0xffu / 500); // 背景颜色(总数) + Fl_Color c_f = 0xcccccc00u; // 旗帜波边框 int Ys = 0; // 因为不画缺少的种类造成的纵向偏移 for (int r = 0; r < ROW; r++) @@ -473,7 +519,11 @@ void SpawnTable::draw_cell(TableContext context, int ROW = 0, int COL = 0, // { case CONTEXT_STARTPAGE: extern Fl_Font ui_font; +#ifdef _PTK_CHINESE_UI fl_font(ui_font, 13); +#else + fl_font(ui_font, 12); +#endif return; case CONTEXT_COL_HEADER: @@ -499,13 +549,21 @@ void SpawnTable::draw_cell(TableContext context, int ROW = 0, int COL = 0, // if (data[ROW][20 + 1 - 1] == 0) // 不画不出的僵尸种类 break; +#ifdef _PTK_CHINESE_UI sprintf_s(s, "%s", std::string("[" + std::to_string(ROW) + "]" + " " + zombies_zh[ROW] + " ").c_str()); +#else + sprintf_s(s, "%s", std::string("[" + std::to_string(ROW) + "]" + " " + zombies_s[ROW] + " ").c_str()); +#endif fl_push_clip(X, Y - Ys, W, H); { fl_draw_box(FL_THIN_UP_BOX, X, Y - Ys, W, H, row_header_color()); fl_color(FL_BLACK); +#ifdef _PTK_CHINESE_UI fl_draw(s, X, Y - Ys, W, H, FL_ALIGN_RIGHT); +#else + fl_draw(s, X, Y - Ys, W, H, FL_ALIGN_LEFT); +#endif } fl_pop_clip(); @@ -547,35 +605,64 @@ SpawnWindow::SpawnWindow(int width, int height, const char *title) // 参数 width height title 均被忽略 // 设置窗口标题 +#ifdef _PTK_CHINESE_UI this->copy_label("出怪数量统计"); +#else + this->copy_label("Spawning Counting"); +#endif - // 设置窗口大小 - // 表格大小 837 x 617 - int w = 5 + 837 + 5; - int h = 5 + 617 + 7; +// 设置窗口大小 +// 表格大小 837 x 617 +#ifdef _PTK_CHINESE_UI + const int m = 5; + const int b = 7; + const int tw = 837; + const int th = 617; + const int rhw = 75; + const int chh = 18 + 3; +#else + const int m = 5; + const int b = 7; + const int tw = 937; + const int th = 617; + const int rhw = 175; + const int chh = 18 + 3; +#endif + const int w = m + tw + m; + const int h = m + th + b; this->size(w, h); - table_spawn = new SpawnTable(5, 5, 837, 617); - button_update_details = new Fl_Button(5, 5, 75, 18 + 3, "···"); - button_zombies_list = new Fl_Menu_Button(5, 5, 837, 617, nullptr); - box_mask_spawn_types = new Fl_Box(5, 5 + 18 + 3, 75, 18 * 33, nullptr); + table_spawn = new SpawnTable(m, m, tw, th); + button_update_details = new Fl_Button(m, m, rhw, chh, "···"); + button_zombies_list = new Fl_Menu_Button(m, m, tw, th, nullptr); +#ifdef _PTK_CHINESE_UI + box_mask_spawn_types = new Fl_Box(m, m + chh, rhw, h * 33, nullptr); +#endif this->end(); +#ifdef _PTK_CHINESE_UI button_zombies_list->add("[刷新]"); button_zombies_list->add("[保存]"); button_zombies_list->add("[加载]"); +#else + button_zombies_list->add("[ Refresh ]"); + button_zombies_list->add("[ Save ]"); + button_zombies_list->add("[ Load ]"); +#endif button_zombies_list->type(Fl_Menu_Button::POPUP3); button_zombies_list->value(0); +#ifdef _PTK_CHINESE_UI extern Fl_Font ui_font; - button_zombies_list->textfont(ui_font); emoji = IsWindows8OrGreater(); - button_zombies_list->replace(0, EMOJI("🔄", "[刷新]")); button_zombies_list->replace(1, EMOJI("💾", "[保存]")); button_zombies_list->replace(2, EMOJI("🔖", "[加载]")); +#else + button_update_details->copy_tooltip("Refresh"); +#endif } SpawnWindow::~SpawnWindow() @@ -606,22 +693,40 @@ void SpawnWindow::UpdateData(std::array zombies_list) std::string zs; for (int r = 0; r < 33; r++) if (zombies_count[r] != 0) +#ifdef _PTK_CHINESE_UI zs += std::string("[" + std::to_string(r) + "]" + " " + zombies[r] + "\n"); box_mask_spawn_types->copy_tooltip(zs.c_str()); +#else + zs += std::string("[" + std::to_string(r) + "]" + " " + zombies_s[r] + "\n"); +#endif } else { +#ifdef _PTK_CHINESE_UI box_mask_spawn_types->copy_tooltip(nullptr); +#endif } +#ifdef _PTK_CHINESE_UI int w = deleted_rows == 33 ? 450 : 5 + 837 + 5; +#else + int w = deleted_rows == 33 ? 450 : 5 + 937 + 5; +#endif int h = 5 + 617 + 7 - deleted_rows * 18; + this->ww = w; + this->hh = h; this->size(w, h); this->redraw(); } +void SpawnWindow::resize(int X, int Y, int W, int H) +{ + Fl_Double_Window::resize(X, Y, this->ww, this->hh); +} + void SpawnWindow::tooltips(bool on) { +#ifdef _PTK_CHINESE_UI button_update_details->copy_tooltip(on ? "Refresh" : "刷新"); if (on) // this->on @@ -638,6 +743,7 @@ void SpawnWindow::tooltips(bool on) } this->copy_label(on ? "Spawning Counting" : "出怪数量统计"); +#endif this->on = on; } @@ -648,35 +754,52 @@ Window::Window(int width, int height, const char *title) // 参数 width height title 均被忽略 // 设置窗口标题 - this->copy_label("PvZ Toolkit - 植物大战僵尸全版本辅助工具"); - - // 设置窗口大小 - int w = 95 * 4 + 10 * 2 + 10 * (4 + 1); // 宽度 450 - int h = 25 * 6 + 10 * 2 + 10 * (6 + 1) + 30 + 5; // 高度 275 - this->size(w, h); +#ifdef _PTK_CHINESE_UI + this->copy_label("PvZ Toolkit - 植物大战僵尸辅助工具"); +#else + this->copy_label("PvZ Toolkit - Plants vs. Zombies Tool Kit"); +#endif // 坐标系统 - int m = 10; // 控件边距 - int th = 30; // 选项卡高度 - int tb = 5; // 选项卡底部边框 - int iw = 95; // 控件宽度 (1/4) - int ih = 25; // 控件高度 (1/6) +#ifdef _PTK_CHINESE_UI + const int m = 10; // 控件边距 + const int th = 30; // 选项卡高度 + const int tb = 5; // 选项卡底部边框 + const int iw = 95; // 控件宽度 (1/4) + const int ih = 25; // 控件高度 (1/6) + const int R = 6; // 控件行数 + const int C = 4; // 控件列数 +#else + const int m = 8; // 控件边距 + const int th = 27; // 选项卡高度 + const int tb = 5; // 选项卡底部边框 + const int iw = 120; // 控件宽度 (1/4) + const int ih = 24; // 控件高度 (1/7) + const int R = 7; // 控件行数 + const int C = 4; // 控件列数 +#endif + const int x = m + m; // 第一个控件的 x 坐标 + const int y = m + th + tb + m; // 第一个控件的 y 坐标 - int x = m + m; // 第一个控件的 x 坐标 - int y = m + th + tb + m; // 第一个控件的 y 坐标 + // 设置窗口大小 + const int w = iw * C + m * 2 + m * (C + 1); // 宽度 450 536 + const int h = ih * R + m * 2 + m * (R + 1) + th + tb; // 高度 275 280 + this->size(w, h); - // (4 列的情况下) 根据列数返回 x 坐标 + // 根据列数返回 x 坐标 auto c = [=](int col) -> int { return x + (iw + m) * (col - 1); }; - // (6 行的情况下) 根据行数返回 y 坐标 + // 根据行数返回 y 坐标 auto r = [=](int row) -> int { return y + (ih + m) * (row - 1); }; +#ifdef _PTK_CHINESE_UI + // 主窗体 { tabs = new Fl_Tabs(m, m, w - m * 2, h - m * 2); @@ -707,7 +830,8 @@ Window::Window(int width, int height, const char *title) button_mix = new Fl_Button(c(4) + 15, r(5), iw - 15, ih, "混乱关卡"); input_level = new Fl_Value_Input(c(3) + 20, r(6), iw - 20 + 15, ih, ""); button_level = new Fl_Button(c(4) + 15, r(6), iw - 15, ih, "无尽轮数"); - button_unlock = new Fl_Button(c(1), r(6), iw + 12, ih, "通关存档"); + button_unlock = new Fl_Button(c(1), r(6), iw + 8, ih, "通关存档"); + check_brightest_cob_cannon = new Fl_Check_Button(c(2) + 14, r(6), 18, ih, ""); button_direct_win = new Fl_Button(c(2) + 20 + 15, r(6), iw - 15, ih, "直接过关"); } group_resource->end(); @@ -732,10 +856,10 @@ Window::Window(int width, int height, const char *title) check_zombie_invincible = new Fl_Check_Button(c(3), r(4), iw - 15, ih, "僵尸无敌"); check_zombie_weak = new Fl_Check_Button(c(4), r(4), iw - 15, ih, "僵尸虚弱"); check_reload_instantly = new Fl_Check_Button(c(1), r(5), iw - 15, ih, "立刻装填"); - check_mushroom_awake = new Fl_Check_Button(c(2), r(5), iw - 15, ih, "蘑菇睡醒"); + check_lock_butter = new Fl_Check_Button(c(2), r(5), iw - 15, ih, "只投黄油"); check_stop_spawning = new Fl_Check_Button(c(3), r(5), iw - 15, ih, "暂停刷怪"); check_stop_zombies = new Fl_Check_Button(c(4), r(5), iw - 15, ih, "停滞不前"); - check_lock_butter = new Fl_Check_Button(c(1), r(6), iw - 15, ih, "只投黄油"); + check_mushroom_awake = new Fl_Check_Button(c(1), r(6), iw - 15, ih, "蘑菇睡醒"); check_no_crater = new Fl_Check_Button(c(2), r(6), iw - 15, ih, "核弹无坑"); check_no_ice_trail = new Fl_Check_Button(c(3), r(6), iw - 15, ih, "冰车无痕"); check_zombie_not_explode = new Fl_Check_Button(c(4), r(6), iw - 15, ih, "丑椒不爆"); @@ -773,15 +897,22 @@ Window::Window(int width, int height, const char *title) group_spawn = new Fl_Group(m, m + th, w - m * 2, h - m * 2 - th, "出怪"); { - int tmp[20] = {2, 3, 4, 5, 6, // - 7, 8, 11, 12, 14, // - 15, 16, 17, 18, 19, // - 20, 21, 22, 23, 32}; // + const int tmp[20] = { + 2, 3, 4, 5, 6, // + 7, 8, 11, 12, 14, // + 15, 16, 17, 18, 19, // + 20, 21, 22, 23, 32 // + }; memcpy(spawn_type, tmp, sizeof(tmp)); for (size_t row = 0; row < 4; row++) for (size_t col = 0; col < 5; col++) - check_zombie[row * 5 + col] = new Fl_Check_Button // - (x + 8 + (iw - 22 + m) * col, y + 5 + (ih + 7 + m) * row, iw - 42, ih, ""); // + { + int _x = x + 8 + (iw - 22 + m) * col; + int _y = y + 5 + (ih + 7 + m) * row; + check_zombie[row * 5 + col] = new Fl_Check_Button(_x, _y, iw - 42, ih, ""); + this->xy[row * 5 + col][0] = _x; + this->xy[row * 5 + col][1] = _y; + } button_show_details = new Fl_Button(c(1), r(6), iw, ih, "查看详情"); choice_giga_weight = new Fl_Choice_(c(2) + 5, r(6), iw - 20, ih, ""); check_giga_limit = new Fl_Check_Button(c(3) - 55 + 40, r(6), iw - 40, ih, "变速"); @@ -831,6 +962,163 @@ Window::Window(int width, int height, const char *title) } this->end(); +#else + + // 主窗体 + { + tabs = new Fl_Tabs(m, m, w - m * 2, h - m * 2); + { + group_resource = new Fl_Group(m, m + th, w - m * 2, h - m * 2 - th, "Resources"); + { + box_sun = new Fl_Box(c(1), r(1), iw - 40, ih, "Sunlight"); + input_sun = new Fl_Value_Input(c(1) + iw - 40 + m, r(1), 40 + 45 - m, ih, ""); + button_sun = new Fl_Button(c(2) + 45, r(1), iw - 45 - 5, ih, "Value"); + box_money = new Fl_Box(c(1), r(2), iw - 40, ih, "Wallet (x10)"); + input_money = new Fl_Value_Input(c(1) + iw - 40 + m, r(2), 40 + 45 - m, ih, ""); + button_money = new Fl_Button(c(2) + 45, r(2), iw - 45 - 5, ih, "Coins"); + box_wisdom_tree = new Fl_Box(c(1), r(3), iw - 40, ih, "Wisdom Tree"); + input_wisdom_tree = new Fl_Value_Input(c(1) + iw - 40 + m, r(3), 40 + 45 - m, ih, ""); + button_wisdom_tree = new Fl_Button(c(2) + 45, r(3), iw - 45 - 5, ih, "Feet"); + check_unlock_sun_limit = new Fl_Round_Button(c(3), r(1), iw + m + iw - 75, ih, "No Upper Limit to Sunlight"); + check_fertilizer = new Fl_Check_Button(c(3), r(2), iw, ih, "Infinite Fertilizer"); + check_bug_spray = new Fl_Check_Button(c(4), r(2), iw, ih, "Infinite Bug Spray"); + check_tree_food = new Fl_Check_Button(c(3), r(3), iw, ih, "Infinite Tree Food"); + check_chocolate = new Fl_Check_Button(c(4), r(3), iw, ih, "Infinite Chocolate"); + check_auto_collected = new Fl_Check_Button(c(1), r(4), iw, ih, "Auto Collected"); + check_not_drop_loot = new Fl_Check_Button(c(2), r(4), iw, ih, "Don\'t Drop Loot"); + check_free_planting = new Fl_Check_Button(c(3), r(4), iw, ih, "Free Planting"); + check_placed_anywhere = new Fl_Check_Button(c(4), r(4), iw, ih, "Place Anywhere"); + button_unlock = new Fl_Button(c(1), r(5), iw + m + iw - 18 - 40 - 12, ih, "Get Gold Sunflower Trophy"); + check_fast_belt = new Fl_Check_Button(c(3) - 18 - 40, r(5), iw + 40, ih, "Seamless Conveyor Belt"); + check_lock_shovel = new Fl_Check_Button(c(4) - 18, r(5), iw + 18, ih, "Shovel Continuously"); + choice_mode = new Fl_Choice_(c(1), r(6), iw + m + iw + 20, ih, ""); + choice_adventure = new Fl_Choice_(c(3) + 20, r(6), iw - 20, ih, ""); + button_mix = new Fl_Button(c(4), r(6), iw, ih, "Modify Mode"); + button_direct_win = new Fl_Button(c(1), r(7), iw - 5, ih, "Level Complete"); + check_brightest_cob_cannon = new Fl_Check_Button(c(2) - 5, r(7), iw + 5 + 20, ih, "End with Brightest Cob"); + input_level = new Fl_Value_Input(c(3) + 20, r(7), iw - 20, ih, ""); + button_level = new Fl_Button(c(4), r(7), iw, ih, "Endless Rounds"); + } + group_resource->end(); + + group_battle = new Fl_Group(m, m + th, w - m * 2, h - m * 2 - th, "Battlefield"); + { + auto r = [=](int row) -> int + { + return y + (ih + m) * (row - 1) + row * 4 + 2; + }; + choice_row = new Fl_Choice_(c(1), r(1), iw - 10, ih, ""); + choice_col = new Fl_Choice_(c(1), r(2), iw - 10, ih, ""); + choice_plant = new Fl_Choice_(c(2) - 10, r(1), iw + 10 + 35 * 2, ih, ""); + choice_zombie = new Fl_Choice_(c(2) - 10, r(2), iw + 10 + 35 * 2, ih, ""); + button_put_plant = new Fl_Button(c(3) + 35 * 2, r(1), iw - 35, ih, "Put Plant"); + check_imitater = new Fl_Check_Button(c(4) + 35 * 1, r(1), iw - 35, ih, "Imitater"); + button_put_zombie = new Fl_Button(c(3) + 35 * 2, r(2), iw - 35, ih, "Put Zombie"); + button_put_grave = new Fl_Button(c(4) + 35 * 1, r(2), iw - 35, ih, "Put Grave"); + button_put_ladder = new Fl_Button(c(3) + 35 * 2, r(3), iw - 35, ih, "Put Ladder"); + button_put_rake = new Fl_Button(c(4) + 35 * 1, r(3), iw - 35, ih, "Put Rake"); + button_lawn_mower = new Fl_Menu_Button(c(1), r(3), iw - 10, ih, "Lawn Mower"); + choice_item = new Fl_Choice_(c(2) - 10, r(3), 100, ih, ""); + button_clear = new Fl_Button(c(2) - 10 + 100 + m, r(3), (iw + 10 + 35 * 2) - 100 - m, ih, "Clear All"); + check_plant_invincible = new Fl_Check_Button(c(1), r(4), iw + 5, ih, "Plant Invincible"); + check_plant_weak = new Fl_Check_Button(c(2) + 5, r(4), iw - 20, ih, "Plant Weak"); + check_reload_instantly = new Fl_Check_Button(c(1), r(5), iw + 5, ih, "Reload Instantly"); + check_lock_butter = new Fl_Check_Button(c(2) + 5, r(5), iw - 20, ih, "Always Butter"); + check_mushroom_awake = new Fl_Check_Button(c(1), r(6), iw + 5, ih, "Mushroom Awake"); + check_no_crater = new Fl_Check_Button(c(2) + 5, r(6), iw - 20, ih, "No Crater"); + check_zombie_invincible = new Fl_Check_Button(c(3), r(4), iw + 8, ih, "Zombie Invincible"); + check_zombie_weak = new Fl_Check_Button(c(4) + 8, r(4), iw - 8, ih, "Zombie Weak"); + check_stop_spawning = new Fl_Check_Button(c(3), r(5), iw + 8, ih, "Pause Spawning"); + check_stop_zombies = new Fl_Check_Button(c(4) + 8, r(5), iw - 8, ih, "Stay in Place"); + check_no_ice_trail = new Fl_Check_Button(c(3), r(6), iw + 8, ih, "No Ice Trail"); + check_zombie_not_explode = new Fl_Check_Button(c(4) + 8, r(6), iw - 8, ih, "Never Explode"); + } + group_battle->end(); + + group_lineup = new Fl_Group(m, m + th, w - m * 2, h - m * 2 - th, "Setups"); + { + choice_slot = new Fl_Choice_(c(1), r(1), iw - 10, ih, ""); + choice_seed = new Fl_Choice_(c(2) - 10, r(1), iw + 10 + 35 * 2, ih, ""); + button_seed = new Fl_Button(c(3) + 35 * 2, r(1), iw - 35 + 20, ih, "Replace Seed"); + check_seed_imitater = new Fl_Check_Button(c(4) + 35 * 1 + 20, r(1), iw - 35 - 20, ih, "Imitater"); + check_lineup_mode = new Fl_Check_Button(c(1), r(2), iw - 10, ih, "Lineup Mode"); + button_auto_ladder = new Fl_Button(c(2) - 10, r(2), iw - 10, ih, "Smart Laddering"); + button_put_lily_pad = new Fl_Menu_Button(c(3) - 5 - 15, r(2), iw + 5, ih, "Pool \'s Lily Pad"); + button_put_flower_pot = new Fl_Menu_Button(c(4) - 15, r(2), iw + 15, ih, "Roof \'s Flower Pot"); + button_reset = new Fl_Button(c(1), r(3), iw - 10, ih, "Reset Scene"); + choice_scene = new Fl_Choice_(c(2) - 10, r(3), iw - 10, ih, ""); + button_load_lineup = new Fl_Button(c(3) - 10 - 10, r(3), iw * 2 + m + 10 + 10, ih, "Load Lineup List File (***.yml)"); + choice_lineup_name[0] = new Fl_Choice_(c(3) - 10 - 10, r(3), iw * 2 + m + 10 + 10, ih, ""); + choice_lineup_name[1] = new Fl_Choice_(c(3) - 10 - 10, r(3), iw * 2 + m + 10 + 10, ih, ""); + choice_lineup_name[2] = new Fl_Choice_(c(3) - 10 - 10, r(3), iw * 2 + m + 10 + 10, ih, ""); + choice_lineup_name[3] = new Fl_Choice_(c(3) - 10 - 10, r(3), iw * 2 + m + 10 + 10, ih, ""); + choice_lineup_name[4] = new Fl_Choice_(c(3) - 10 - 10, r(3), iw * 2 + m + 10 + 10, ih, ""); + choice_lineup_name[5] = new Fl_Choice_(c(3) - 10 - 10, r(3), iw * 2 + m + 10 + 10, ih, ""); + buffer_lineup_string = new Fl_Text_Buffer(); + editor_lineup_string = new Fl_Text_Editor(c(1), r(4), iw * 4 + m * 3, ih * 2 + m * 1, ""); + button_get_lineup = new Fl_Button(c(1), r(6), iw + 60, ih, "Get Lineup Code"); + button_copy_lineup = new Fl_Button(c(1), r(7), iw + 60, ih, "Copy (Export)"); + button_set_lineup = new Fl_Button(c(4) - 60, r(6), iw + 60, ih, "Apply Current Setup"); + button_paste_lineup = new Fl_Button(c(4) - 60, r(7), iw + 60, ih, "Paste (Import)"); + button_capture = new Fl_Button(c(2) + 60 + 10, r(6), iw + m + iw - 60 - 60 - 20, ih + m + ih, "Screenshot\nto\nClipboard"); + } + group_lineup->end(); + + group_spawn = new Fl_Group(m, m + th, w - m * 2, h - m * 2 - th, "Spawning"); + { + const int tmp[20] = { + 2, 3, 4, 5, // + 6, 7, 8, 11, // + 12, 14, 15, 16, // + 17, 18, 19, 20, // + 21, 22, 23, 32 // + }; + memcpy(spawn_type, tmp, sizeof(tmp)); + for (size_t row = 0; row < 5; row++) + for (size_t col = 0; col < 4; col++) + check_zombie[row * 4 + col] = new Fl_Check_Button(c(col + 1), r(row + 1), iw, ih, ""); + choice_giga_weight = new Fl_Choice_(c(3), r(6), iw - 48, ih, "GigaGargantuar\'s Weight in Non-huge Waves:"); + check_giga_limit = new Fl_Check_Button(c(1), r(7), iw + m + iw, ih, "No GigaGargantuar in 11th ~ 19th Waves"); + button_show_details = new Fl_Button(c(4), r(6), iw, ih, "Show Details"); + button_set_spawn = new Fl_Button(c(4) - 80, r(7), iw + 80, ih, "Extreme (Filling Evenly)"); + button_spawn_extra = new Fl_Menu_Button(m, m + th, iw * 4 + m * 5, ih * 7 + m * 8, nullptr); + button_spawn_mode = new Fl_Menu_Button(c(4) - 80, r(7), iw + 80, ih, "Select Spawning Mode: "); + } + group_spawn->end(); + + group_others = new Fl_Group(m, m + th, w - m * 2, h - m * 2 - th, "Others"); + { + choice_music = new Fl_Choice_(c(1), r(1), iw + 50, ih, ""); + button_music = new Fl_Button(c(2) + 50, r(1), iw + 15, ih, "Background Music"); + button_userdata = new Fl_Button(c(3) + 50 + 15, r(1), iw + m + iw - 50 - 15, ih, "Open Userdata Folder"); + check_no_fog = new Fl_Check_Button(c(1), r(2), iw - 10, ih, "Clear Fog"); + check_see_vase = new Fl_Check_Button(c(2) - 10, r(2), iw, ih, "Transparent Vase"); + check_readonly = new Fl_Check_Button(c(4) - 15, r(2), iw + 15, ih, "Userdata Readonly"); + button_file = new Fl_Button(c(1), r(3), iw - 10, ih, "Choose File"); + input_file = new Fl_Input_(c(2) - 10, r(3), iw + 10 + m + iw + 45, ih, ""); + button_unpack = new Fl_Button(c(4) + 45, r(3), iw - 45, ih, "Extract"); + button_dir = new Fl_Button(c(1), r(4), iw - 10, ih, "Choose Folder"); + input_dir = new Fl_Input_(c(2) - 10, r(4), iw + 10 + m + iw + 45, ih, ""); + button_pack = new Fl_Button(c(4) + 45, r(4), iw - 45, ih, "Pack"); + choice_debug = new Fl_Choice_(c(1), r(5), iw - 10, ih, ""); + button_debug = new Fl_Button(c(2) - 10, r(5), iw - 30, ih, "Debug"); + choice_speed = new Fl_Choice_(c(1), r(6), iw - 10, ih, ""); + button_speed = new Fl_Button(c(2) - 10, r(6), iw - 30, ih, "Speed"); + check_limbo_page = new Fl_Check_Button(c(3), r(5), iw + 5, ih, "Show Limbo Page"); + check_background = new Fl_Check_Button(c(3), r(6), iw + m + iw - 40, ih, "Enable PvZ to Run in Background"); + choice_scheme = new Fl_Choice_(c(1), r(7), iw - 10, ih, ""); + button_document = new Fl_Button(c(3), r(7), iw, ih, "Document"); + button_about = new Fl_Button(c(4), r(7), iw, ih, "About ..."); + } + group_others->end(); + } + tabs->end(); + + game_status = new Fl_Box(330, 10, 190, 25, ""); + } + this->end(); +#endif + // 默认值 // 选项卡颜色 @@ -847,14 +1135,18 @@ Window::Window(int width, int height, const char *title) // 金钱 input_money->bounds(0, 99999); - input_money->value(99999); + input_money->value(80000); // 智慧树 input_wisdom_tree->bounds(0, 1000); - input_wisdom_tree->value(1437); + input_wisdom_tree->value(1000); for (size_t i = 0; i < 73; i++) +#ifdef _PTK_CHINESE_UI choice_mode->add(("[" + std::to_string(i) + "]" + " " + modes_zh[i]).c_str()); +#else + choice_mode->add(("[" + std::to_string(i) + "]" + " " + modes[i]).c_str()); +#endif // 默认无尽模式 choice_mode->value(13); @@ -866,10 +1158,14 @@ Window::Window(int width, int height, const char *title) choice_adventure->value(39); // 4-10 choice_adventure->deactivate(); + // 默认刚结束时炮最亮 + check_brightest_cob_cannon->value(1); + // 1010 * 2 + 2 = 2022 - input_level->bounds(0, 10000000); + input_level->bounds(0, 999999); input_level->value(1010); +#ifdef _PTK_CHINESE_UI choice_row->add("所有行"); choice_row->add("第 1 行"); choice_row->add("第 2 行"); @@ -877,9 +1173,19 @@ Window::Window(int width, int height, const char *title) choice_row->add("第 4 行"); choice_row->add("第 5 行"); choice_row->add("第 6 行"); +#else + choice_row->add("All Rows"); + choice_row->add("1st Row"); + choice_row->add("2nd Row"); + choice_row->add("3rd Row"); + choice_row->add("4th Row"); + choice_row->add("5th Row"); + choice_row->add("6th Row"); +#endif choice_row->value(1); // 第 1 行 +#ifdef _PTK_CHINESE_UI choice_col->add("所有列"); choice_col->add("第 1 列"); choice_col->add("第 2 列"); @@ -890,35 +1196,70 @@ Window::Window(int width, int height, const char *title) choice_col->add("第 7 列"); choice_col->add("第 8 列"); choice_col->add("第 9 列"); +#else + choice_col->add("All Columns"); + choice_col->add("1st Column"); + choice_col->add("2nd Column"); + choice_col->add("3rd Column"); + choice_col->add("4th Column"); + choice_col->add("5th Column"); + choice_col->add("6th Column"); + choice_col->add("7th Column"); + choice_col->add("8th Column"); + choice_col->add("9th Column"); +#endif choice_col->value(1); // 第 1 列 for (size_t i = 0; i < 48; i++) { +#ifdef _PTK_CHINESE_UI std::string p = "[" + std::to_string(i) + "]" + " " + plants_zh[i]; +#else + std::string p = "[" + std::to_string(i) + "]" + " " + plants[i]; +#endif choice_plant->add(p.c_str()); } choice_plant->value(0); for (size_t i = 0; i < 33; i++) { +#ifdef _PTK_CHINESE_UI std::string z = "[" + std::to_string(i) + "]" + " " + zombies_zh[i]; +#else + std::string z = "[" + std::to_string(i) + "]" + " " + zombies[i]; +#endif choice_zombie->add(z.c_str()); } choice_zombie->value(0); +#ifdef _PTK_CHINESE_UI button_lawn_mower->add("[启动]"); button_lawn_mower->add("[删除]"); button_lawn_mower->add("[恢复]"); +#else + button_lawn_mower->add("[ Start ]"); + button_lawn_mower->add("[ Delete ]"); + button_lawn_mower->add("[ Restore ]"); +#endif +#ifdef _PTK_CHINESE_UI choice_item->add("植物"); choice_item->add("僵尸"); choice_item->add("梯子"); choice_item->add("墓碑"); choice_item->add("钉耙"); +#else + choice_item->add("Plant"); + choice_item->add("Zombie"); + choice_item->add("Ladder"); + choice_item->add("Grave"); + choice_item->add("Rake"); +#endif choice_item->value(3); // 墓碑 +#ifdef _PTK_CHINESE_UI choice_slot->add("第 1 格"); choice_slot->add("第 2 格"); choice_slot->add("第 3 格"); @@ -929,12 +1270,28 @@ Window::Window(int width, int height, const char *title) choice_slot->add("第 8 格"); choice_slot->add("第 9 格"); choice_slot->add("第 10 格"); +#else + choice_slot->add("1st Seed"); + choice_slot->add("2nd Seed"); + choice_slot->add("3rd Seed"); + choice_slot->add("4th Seed"); + choice_slot->add("5th Seed"); + choice_slot->add("6th Seed"); + choice_slot->add("7th Seed"); + choice_slot->add("8th Seed"); + choice_slot->add("9th Seed"); + choice_slot->add("10th Seed"); +#endif choice_slot->value(0); // 第一格卡槽 for (size_t i = 0; i < 48; i++) { +#ifdef _PTK_CHINESE_UI std::string p = "[" + std::to_string(i) + "]" + " " + plants_zh[i]; +#else + std::string p = "[" + std::to_string(i) + "]" + " " + plants[i]; +#endif choice_seed->add(p.c_str()); } @@ -943,8 +1300,8 @@ Window::Window(int width, int height, const char *title) for (size_t i = 0; i < 8; i++) { std::string label; - for (unsigned int c = 1; c <= 9; c++) - label += (lily_pad_col_lower[i] <= c && c <= lily_pad_col_upper[i]) + for (unsigned int col = 1; col <= 9; col++) + label += (lily_pad_col_lower[i] <= col && col <= lily_pad_col_upper[i]) ? "■" : "□"; button_put_lily_pad->add(label.c_str()); @@ -953,19 +1310,28 @@ Window::Window(int width, int height, const char *title) for (size_t i = 0; i < 7; i++) { std::string label; - for (unsigned int c = 1; c <= 9; c++) - label += (flower_pot_col_lower[i] <= c && c <= flower_pot_col_upper[i]) + for (unsigned int col = 1; col <= 9; col++) + label += (flower_pot_col_lower[i] <= col && col <= flower_pot_col_upper[i]) ? "■" : "□"; button_put_flower_pot->add(label.c_str()); } +#ifdef _PTK_CHINESE_UI choice_scene->add("[0] 白天"); choice_scene->add("[1] 黑夜"); choice_scene->add("[2] 泳池"); choice_scene->add("[3] 雾夜"); choice_scene->add("[4] 屋顶"); choice_scene->add("[5] 月夜"); +#else + choice_scene->add("[0] Day"); + choice_scene->add("[1] Night"); + choice_scene->add("[2] Pool"); + choice_scene->add("[3] Fog"); + choice_scene->add("[4] Roof"); + choice_scene->add("[5] Moon"); +#endif choice_scene->value(2); // 泳池 @@ -990,25 +1356,41 @@ Window::Window(int width, int height, const char *title) // 出怪名称 for (size_t i = 0; i < 20; i++) +#ifdef _PTK_CHINESE_UI check_zombie[i]->copy_label(zombies_zh[spawn_type[i]]); +#else + check_zombie[i]->copy_label(zombies_s[spawn_type[i]]); +#endif // 非旗帜波红眼权重范围 - for (size_t w = 1000; w <= 6000; w += 100) - choice_giga_weight->add(std::to_string(w).c_str()); + for (size_t weight = 1000; weight <= 6000; weight += 100) + choice_giga_weight->add(std::to_string(weight).c_str()); choice_giga_weight->value(0); // 默认极限出怪的情况 choice_giga_weight->deactivate(); check_giga_limit->activate(); +#ifdef _PTK_CHINESE_UI button_spawn_extra->add("[清空已选]", 0, cb_clear_checked_zombies, this); button_spawn_extra->add("[取消限制]", 0, cb_disable_limit_species, this); + button_spawn_extra->add("[切换布局]", 0, cb_switch_layout_xwz, this); +#else + button_spawn_extra->add("[ Clear Checked Zombies ]", 0, cb_clear_checked_zombies, this); + button_spawn_extra->add("[ Disable Species Limit ]", 0, cb_disable_limit_species, this); +#endif button_spawn_extra->type(Fl_Menu_Button::POPUP3); button_spawn_extra->value(0); +#ifdef _PTK_CHINESE_UI button_spawn_mode->add("自然出怪 (游戏生成)", 0, cb_switch_spawn_mode, this); button_spawn_mode->add("极限出怪 (均匀填充)", 0, cb_switch_spawn_mode, this); button_spawn_mode->add("模拟出怪 (加权随机)", 0, cb_switch_spawn_mode, this); +#else + button_spawn_mode->add("Natural (Game Generate)", 0, cb_switch_spawn_mode, this); + button_spawn_mode->add("Extreme (Filling Evenly)", 0, cb_switch_spawn_mode, this); + button_spawn_mode->add("Simulate (Weighted Random)", 0, cb_switch_spawn_mode, this); +#endif button_spawn_mode->type(Fl_Menu_Button::POPUP3); button_spawn_mode->value(1); // 默认极限刷怪 @@ -1027,11 +1409,19 @@ Window::Window(int width, int height, const char *title) choice_music->value(4); // Graze the Roof +#ifdef _PTK_CHINESE_UI choice_debug->add("关闭"); choice_debug->add("出怪"); choice_debug->add("音乐"); choice_debug->add("内存"); choice_debug->add("碰撞"); +#else + choice_debug->add("Off"); + choice_debug->add("Spawning"); + choice_debug->add("Music"); + choice_debug->add("Memory"); + choice_debug->add("Collision"); +#endif choice_debug->value(0); // 关闭 @@ -1049,6 +1439,7 @@ Window::Window(int width, int height, const char *title) choice_scheme->add("plastic"); choice_scheme->add("gtk+"); choice_scheme->add("gleam"); + choice_scheme->add("oxy"); choice_scheme->value(0); // base @@ -1109,7 +1500,9 @@ Window::Window(int width, int height, const char *title) // 设置字体 extern Fl_Font ui_font; - extern Fl_Font ls_font; + extern Fl_Font ms_font; + +#ifdef _PTK_CHINESE_UI for (int i = 0; i < this->children(); i++) this->child(i)->labelfont(ui_font); @@ -1153,13 +1546,13 @@ Window::Window(int width, int height, const char *title) choice_lineup_name[3]->textfont(ui_font); choice_lineup_name[4]->textfont(ui_font); choice_lineup_name[5]->textfont(ui_font); - editor_lineup_string->textfont(ls_font); // 阵型字符串特殊字体 - editor_lineup_string->textsize(16); + editor_lineup_string->textfont(ms_font); // 阵型字符串特殊字体 + editor_lineup_string->textsize(15); } { for (int i = 0; i < group_spawn->children(); i++) group_spawn->child(i)->labelfont(ui_font); - // choice_giga_weight->textfont(ui_font); + choice_giga_weight->textfont(ui_font); button_spawn_extra->textfont(ui_font); button_spawn_mode->textfont(ui_font); } @@ -1175,6 +1568,84 @@ Window::Window(int width, int height, const char *title) } } +#else + + const int font_size = 12; + + for (int i = 0; i < this->children(); i++) + this->child(i)->labelsize(font_size); + { + for (int i = 0; i < tabs->children(); i++) + { + tabs->child(i)->labelsize(font_size); + tabs->child(i)->labelsize(tabs->child(i)->labelsize() + 1); + } + { + for (int i = 0; i < group_resource->children(); i++) + group_resource->child(i)->labelsize(font_size); + input_sun->textsize(font_size); + input_money->textsize(font_size); + input_wisdom_tree->textsize(font_size); + choice_mode->textsize(font_size); + choice_adventure->textsize(font_size); + input_level->textsize(font_size); + } + { + for (int i = 0; i < group_battle->children(); i++) + group_battle->child(i)->labelsize(font_size); + choice_row->textsize(font_size); + choice_col->textsize(font_size); + choice_plant->textsize(font_size); + choice_zombie->textsize(font_size); + button_lawn_mower->textsize(font_size); + choice_item->textsize(font_size); + } + { + for (int i = 0; i < group_lineup->children(); i++) + group_lineup->child(i)->labelsize(font_size); + choice_slot->textsize(font_size); + choice_seed->textsize(font_size); + // button_put_lily_pad + // button_put_flower_pot + choice_scene->textsize(font_size); + choice_lineup_name[0]->textsize(font_size); + choice_lineup_name[1]->textsize(font_size); + choice_lineup_name[2]->textsize(font_size); + choice_lineup_name[3]->textsize(font_size); + choice_lineup_name[4]->textsize(font_size); + choice_lineup_name[5]->textsize(font_size); + choice_lineup_name[0]->textfont(ui_font); + choice_lineup_name[1]->textfont(ui_font); + choice_lineup_name[2]->textfont(ui_font); + choice_lineup_name[3]->textfont(ui_font); + choice_lineup_name[4]->textfont(ui_font); + choice_lineup_name[5]->textfont(ui_font); + editor_lineup_string->textfont(ms_font); // 阵型字符串特殊字体 + editor_lineup_string->textsize(14); + } + { + for (int i = 0; i < group_spawn->children(); i++) + group_spawn->child(i)->labelsize(font_size); + choice_giga_weight->textsize(font_size); + button_spawn_extra->textsize(font_size); + button_spawn_mode->textsize(font_size); + } + { + for (int i = 0; i < group_others->children(); i++) + group_others->child(i)->labelsize(font_size); + choice_music->textsize(font_size); + input_file->textsize(font_size); + input_dir->textsize(font_size); + choice_debug->textsize(font_size); + choice_speed->textsize(font_size); + choice_scheme->textsize(font_size); + } + } + +#endif + +#ifdef _PTK_CHINESE_UI + // Emoji emoji = IsWindows8OrGreater(); @@ -1197,6 +1668,7 @@ Window::Window(int width, int height, const char *title) button_spawn_extra->replace(0, EMOJI("❌", "[清空已选]")); button_spawn_extra->replace(1, EMOJI("❎", "[取消限制]")); + button_spawn_extra->replace(2, EMOJI("🔀", "[切换布局]")); button_show_details->copy_label(EMOJI("📈", "查看详情")); @@ -1204,6 +1676,8 @@ Window::Window(int width, int height, const char *title) button_userdata->copy_label(EMOJI("💾", "存档文件夹")); button_document->copy_label(EMOJI("🌏", "文档")); +#endif + // 默认运行的回调函数 // 自动导入阵型列表 @@ -1212,8 +1686,10 @@ Window::Window(int width, int height, const char *title) // 获取阵型的字符串 choice_scene->do_callback(); +#ifdef _PTK_CHINESE_UI // 设置控件工具提示 check_tooltips->do_callback(); +#endif // this->show(); // 在 main() 里带参调用 @@ -1231,6 +1707,30 @@ Window::~Window() WriteSettings(); // 保存设置 } +float Window::MinScale() +{ + float min_scale = 1.0f; + + int dpi = 96; + HDC dc = GetDC(nullptr); + if (dc != nullptr) + { + // int virtual_width = GetDeviceCaps(dc, HORZRES); + // int physical_width = GetDeviceCaps(dc, DESKTOPHORZRES); + // dpi = 96 * physical_width / virtual_width; + int dpi_x = GetDeviceCaps(dc, LOGPIXELSX); + int dpi_y = GetDeviceCaps(dc, LOGPIXELSY); + dpi = (dpi_x + dpi_y) / 2; + ReleaseDC(nullptr, dc); + } + + min_scale = static_cast(dpi / 96) * 1.0f; + if (min_scale < 1.0f) + min_scale = 1.0f; + + return min_scale; +} + void Window::ReadSettings() { // 注册表配置版本 v1 @@ -1248,27 +1748,28 @@ void Window::ReadSettings() DWORD dwType; DWORD dwSize; - wchar_t lang[15]; // 语言 - DWORD scale; // 缩放 - int scheme; // 样式 - wchar_t zombies[20]; // 出怪 - int mode; // 模式 - int sun; // 阳光 - int money; // 金币 - int level; // 轮数 - unsigned int page; // 页面 - - dwType = REG_SZ; - dwSize = sizeof(lang); - status = RegQueryValueExW(hKey, L"Language", 0, &dwType, (LPBYTE)&lang, &dwSize); +#ifdef _PTK_CHINESE_UI + int tooltips = 0; // 提示 +#endif + DWORD scale = 0x3f800000; // 缩放 + int scheme = 0; // 样式 + wchar_t types[21] = L"00000000000000000000"; // 出怪 + int mode = 1; // 模式 + int sun = 8000; // 阳光 + int money = 80000; // 金币 + int level = 1010; // 轮数 + unsigned int page = 3; // 页面 + +#ifdef _PTK_CHINESE_UI + dwType = REG_DWORD; + dwSize = sizeof(tooltips); + status = RegQueryValueExW(hKey, L"ToolTips", 0, &dwType, (LPBYTE)&tooltips, &dwSize); if (status == ERROR_SUCCESS) { - if (std::wstring(lang) == L"English") - { - check_tooltips->value(1); - check_tooltips->do_callback(); - } + check_tooltips->value(tooltips); + check_tooltips->do_callback(); } +#endif dwType = REG_DWORD; dwSize = sizeof(scale); @@ -1286,7 +1787,7 @@ void Window::ReadSettings() status = RegQueryValueExW(hKey, L"Scheme", 0, &dwType, (LPBYTE)&scheme, &dwSize); if (status == ERROR_SUCCESS) { - if (0 <= scheme && scheme < 4) + if (0 <= scheme && scheme < 5) { choice_scheme->value(scheme); choice_scheme->do_callback(); @@ -1294,12 +1795,12 @@ void Window::ReadSettings() } dwType = REG_SZ; - dwSize = sizeof(zombies); - status = RegQueryValueExW(hKey, L"SpawnTypes", 0, &dwType, (LPBYTE)&zombies, &dwSize); + dwSize = sizeof(types); + status = RegQueryValueExW(hKey, L"SpawnTypes", 0, &dwType, (LPBYTE)&types, &dwSize); if (status == ERROR_SUCCESS) { for (size_t i = 0; i < 20; i++) - this->check_zombie[i]->value(zombies[i] == L'1' ? 1 : 0); + this->check_zombie[i]->value(types[i] == L'1' ? 1 : 0); cb_spawn_count_check(); } @@ -1338,7 +1839,7 @@ void Window::ReadSettings() status = RegQueryValueExW(hKey, L"ValueLevel", 0, &dwType, (LPBYTE)&level, &dwSize); if (status == ERROR_SUCCESS) { - if (0 <= level && level <= 10000000) + if (0 <= level && level <= 999999) input_level->value(level); } @@ -1365,6 +1866,7 @@ void Window::ReadSettings() if (first_open) { +#ifdef _PTK_CHINESE_UI // 0804 2052 zh-CN Chinese (Simplified) - China // 0404 1028 zh-TW Chinese (Traditional) - Taiwan // 0C04 3076 zh-HK Chinese - Hong Kong SAR @@ -1383,28 +1885,23 @@ void Window::ReadSettings() check_tooltips->value(1); check_tooltips->do_callback(); } +#endif - int dpi = 96; - HDC dc = GetDC(nullptr); - if (dc != nullptr) - { - // int virtual_width = GetDeviceCaps(dc, HORZRES); - // int physical_width = GetDeviceCaps(dc, DESKTOPHORZRES); - // dpi = 96 * physical_width / virtual_width; - int dpi_x = GetDeviceCaps(dc, LOGPIXELSX); - int dpi_y = GetDeviceCaps(dc, LOGPIXELSY); - dpi = (dpi_x + dpi_y) / 2; - ReleaseDC(nullptr, dc); - } - if (dpi > 96) + // 初次启动缩放 + if (this->MinScale() != 1.0f) { - Fl::screen_scale(this->screen_num(), dpi / 96.0f); - std::string text = std::string() // - + "软件界面已跟随系统缩放比例:" // - + std::to_string(dpi * 100 / 96) + "%%。\n\n" // - + "单独按 Esc 键可恢复默认的窗口大小,\n" // - + "同时按 Ctrl 和 + / - 键可放大缩小窗口。"; // + Fl::screen_scale(this->screen_num(), this->MinScale()); +#ifdef _PTK_CHINESE_UI fl_message_title("界面缩放"); + std::string text = std::string() // + + "同时按 Ctrl 和 + / - 键可放大缩小窗口,\n" // + + "单独按 Esc 键可恢复默认的窗口大小。"; // +#else + fl_message_title("DPI Scaling"); + std::string text = std::string() // + + "Press the Ctrl and + / - keys simultaneously to zoom in and out,\n" // + + "Press the Esc key alone to restore default 100% window size."; // +#endif fl_message(text.c_str()); } @@ -1416,25 +1913,38 @@ void Window::ReadSettings() dwBuild = (DWORD)(HIWORD(dwVersion)); #pragma warning(default : 4996) - if (dwBuild >= 6000) // Vista - choice_scheme->value(3); // gleam - if (dwBuild >= 7600) // 7 - choice_scheme->value(3); // gleam - if (dwBuild >= 9200) // 8 - choice_scheme->value(0); // base - if (dwBuild >= 9600) // 8.1 - choice_scheme->value(0); // base - if (dwBuild >= 10240) // 10 - choice_scheme->value(0); // base - if (dwBuild >= 22000) // 11 - choice_scheme->value(2); // gtk+ + int scheme = 0; + if (dwBuild >= 22000) // 11 + scheme = 2; // gtk+ + else if (dwBuild >= 10240) // 10 + scheme = 2; // gtk+ + else if (dwBuild >= 9600) // 8.1 + scheme = 4; // oxy + else if (dwBuild >= 9200) // 8 + scheme = 4; // oxy + else if (dwBuild >= 7600) // 7 + scheme = 3; // gleam + else if (dwBuild >= 6000) // Vista + scheme = 3; // gleam + else if (dwBuild >= 2600) // XP + scheme = 1; // plastic + else if (dwBuild >= 2195) // 2000 + scheme = 0; // base + choice_scheme->value(scheme); choice_scheme->do_callback(); // 第一次打开时显示文档 +#ifdef _PTK_CHINESE_UI fl_message_title("在线文档"); int c = fl_choice("这是你首次运行 PvZ Toolkit,要先阅读一下在线教程文档吗?\n" // "也可以在修改器界面的“杂项”页面点击“文档”按钮来访问。", // "No", "Yes", 0); +#else + fl_message_title("Online Document"); + int c = fl_choice("This is your first time running PvZ Toolkit, do you want to read the manual first?\n" // + "You can also access it later by clicking \"Document\" button at \"Others\" page.", // + "No", "Yes", 0); +#endif if (c == 1) cb_document(); } @@ -1444,9 +1954,10 @@ void Window::WriteSettings() { // 注册表配置版本 v1 - // 语言 - wchar_t langChinese[] = L"简体中文"; - wchar_t langEnglish[] = L"English"; +#ifdef _PTK_CHINESE_UI + // 提示 + int tooltips = check_tooltips->value(); +#endif // 缩放 float scale = Fl::screen_scale(this->screen_num()); @@ -1455,9 +1966,9 @@ void Window::WriteSettings() int scheme = choice_scheme->value(); // 出怪 - wchar_t zombies[20] = {0}; + wchar_t types[21] = {0}; for (size_t i = 0; i < 20; i++) - zombies[i] = (this->check_zombie[i]->value() == 1 ? L'1' : L'0'); + types[i] = (this->check_zombie[i]->value() == 1 ? L'1' : L'0'); // 模式 int mode = button_spawn_mode->value(); @@ -1490,13 +2001,12 @@ void Window::WriteSettings() 0, nullptr, 0, KEY_SET_VALUE, nullptr, &hKey, nullptr); if (ret == ERROR_SUCCESS) { - if (check_tooltips->value() == 1) - RegSetValueExW(hKey, L"Language", 0, REG_SZ, (LPBYTE)&langEnglish, sizeof(langEnglish)); - else - RegSetValueExW(hKey, L"Language", 0, REG_SZ, (LPBYTE)&langChinese, sizeof(langChinese)); +#ifdef _PTK_CHINESE_UI + RegSetValueExW(hKey, L"ToolTips", 0, REG_DWORD, (LPBYTE)&tooltips, sizeof(tooltips)); +#endif RegSetValueExW(hKey, L"ScaleFactor", 0, REG_DWORD, (LPBYTE)&scale, sizeof(scale)); RegSetValueExW(hKey, L"Scheme", 0, REG_DWORD, (LPBYTE)&scheme, sizeof(scheme)); - RegSetValueExW(hKey, L"SpawnTypes", 0, REG_SZ, (LPBYTE)&zombies, sizeof(zombies)); + RegSetValueExW(hKey, L"SpawnTypes", 0, REG_SZ, (LPBYTE)&types, sizeof(types)); RegSetValueExW(hKey, L"SpawnMode", 0, REG_DWORD, (LPBYTE)&mode, sizeof(mode)); RegSetValueExW(hKey, L"ValueSun", 0, REG_DWORD, (LPBYTE)&sun, sizeof(sun)); RegSetValueExW(hKey, L"ValueMoney", 0, REG_DWORD, (LPBYTE)&money, sizeof(money)); @@ -1506,28 +2016,6 @@ void Window::WriteSettings() } } -// TODO fl_utf8fromwc fl_utf8towc - -std::string Window::utf8_encode(const std::wstring &wstr) -{ - if (wstr.empty()) - return std::string(); - int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), nullptr, 0, nullptr, nullptr); - std::string str(size_needed, 0); - WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &str[0], size_needed, nullptr, nullptr); - return str; -} - -std::wstring Window::utf8_decode(const std::string &str) -{ - if (str.empty()) - return std::wstring(); - int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), nullptr, 0); - std::wstring wstr(size_needed, 0); - MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstr[0], size_needed); - return wstr; -} - void Window::cb_find_result(void *w, int result) { ((Window *)w)->cb_find_result(result); @@ -1539,6 +2027,7 @@ void Window::cb_find_result(int result) if (result != PVZ_NOT_FOUND && result != PVZ_OPEN_ERROR && result != PVZ_UNSUPPORTED) this->keep_selected_feature(); +#ifdef _PVZ_BETA_LEAK_SUPPORT // 某些版本只实现了部分功能 if (result == PVZ_BETA_0_1_1_1014_EN) { @@ -1547,6 +2036,7 @@ void Window::cb_find_result(int result) button_wisdom_tree->deactivate(); } else +#endif { check_tree_food->activate(); input_wisdom_tree->activate(); @@ -1562,12 +2052,15 @@ void Window::cb_find_result_tooltip(Fl_Widget *, void *w) ((Window *)w)->cb_find_result_tooltip(); } +#ifdef _PTK_CHINESE_UI + void Window::cb_find_result_tooltip() { bool on = check_tooltips->value() == 1; switch (result) { +#ifdef _PVZ_BETA_LEAK_SUPPORT case PVZ_BETA_0_1_1_1014_EN: game_status->copy_label("0.1.1.1014 英语测试版"); game_status->copy_tooltip(on ? "0.1.1.1014 Beta (en)" : nullptr); @@ -1576,6 +2069,7 @@ void Window::cb_find_result_tooltip() game_status->copy_label("0.9.9.1029 英语测试版"); game_status->copy_tooltip(on ? "0.9.9.1029 Beta (en)" : nullptr); break; +#endif case PVZ_1_0_0_1051_EN: game_status->copy_label("1.0.0.1051 英语原始版"); game_status->copy_tooltip(on ? "1.0.0.1051 (en)" : nullptr); @@ -1637,43 +2131,44 @@ void Window::cb_find_result_tooltip() break; case PVZ_UNSUPPORTED: game_status->copy_label("不支持的游戏版本"); - game_status->copy_tooltip(on ? "Unsupported game version." : nullptr); + game_status->copy_tooltip(on ? "Unsupported PvZ Version" : nullptr); break; case PVZ_OPEN_ERROR: game_status->copy_label("打开游戏进程出错"); - game_status->copy_tooltip(on ? "Error opening game process." : nullptr); + game_status->copy_tooltip(on ? "Error Opening PvZ Process" : nullptr); break; case PVZ_NOT_FOUND: default: game_status->copy_label("没有找到游戏窗口"); - game_status->copy_tooltip(on ? "No game window was found." : nullptr); + game_status->copy_tooltip(on ? "PvZ Window Not Found" : nullptr); break; } if (result == PVZ_NOT_FOUND) { game_status_tip->copy_label(emoji_i ? "🛈" : "i"); - game_status_tip->copy_tooltip(on ? "Run Plants vs. Zombies first." - : "先打开运行植物大战僵尸游戏。"); + game_status_tip->copy_tooltip(on ? "Please run Plants vs. Zombies first." + : "请先打开植物大战僵尸游戏。"); } else if (result == PVZ_OPEN_ERROR) { game_status_tip->copy_label(emoji_i ? "🛈" : "i"); - game_status_tip->copy_tooltip(on ? "Try run Pt as administrator." - : "建议用管理员权限运行修改器。"); + game_status_tip->copy_tooltip(on ? "Please try run PvZ Toolkit as administrator." + : "请尝试用管理员权限运行修改器。"); } else if (result == PVZ_UNSUPPORTED) { game_status_tip->copy_label(emoji_i ? "🛈" : "i"); - game_status_tip->copy_tooltip(on ? "Contact author to add support." + game_status_tip->copy_tooltip(on ? "Contact author to add support for this version." : "联系作者给这个版本添加支持。"); } +#ifdef _PVZ_BETA_LEAK_SUPPORT else if (result == PVZ_BETA_0_1_1_1014_EN) { game_status_tip->copy_label(emoji_i ? "🛈" : "i"); game_status_tip->copy_tooltip(on ? "Partial support for beta version." - : "对早期测试版本仅提供有限功能支持,\n" - "游戏对象的序号和名称未能完全对应。"); + : "测试版内存布局与正式版差别较大,\n" + "对测试版本仅提供有限的功能支持。"); } else if (result == PVZ_BETA_0_9_9_1029_EN) { @@ -1681,11 +2176,12 @@ void Window::cb_find_result_tooltip() game_status_tip->copy_tooltip(on ? "Partial support for beta version." : "对测试版本仅提供有限的功能支持。"); } +#endif else if (result == PVZ_GOTY_1_1_0_1056_ZH) { game_status_tip->copy_label(emoji_i ? "🛈" : "i"); - game_status_tip->copy_tooltip(on ? "Replace this bad game version." - : "换掉这个有严重问题的游戏版本。"); + game_status_tip->copy_tooltip(on ? "Suggest to replace this buggy game version." + : "建议换掉这个有严重问题的游戏版本。"); } else { @@ -1705,6 +2201,112 @@ void Window::cb_find_result_tooltip() game_status_tip->redraw(); } +#else + +void Window::cb_find_result_tooltip() +{ + switch (result) + { +#ifdef _PVZ_BETA_LEAK_SUPPORT + case PVZ_BETA_0_1_1_1014_EN: + game_status->copy_label("0.1.1.1014 Beta (en)"); + break; + case PVZ_BETA_0_9_9_1029_EN: + game_status->copy_label("0.9.9.1029 Beta (en)"); + break; +#endif + case PVZ_1_0_0_1051_EN: + game_status->copy_label("1.0.0.1051 (en)"); + break; + case PVZ_1_2_0_1065_EN: + game_status->copy_label("1.2.0.1065 (en)"); + break; + case PVZ_1_0_4_7924_ES: + game_status->copy_label("1.0.4.7924 (es)"); + break; + case PVZ_1_0_7_3556_ES: + game_status->copy_label("1.0.7.3556 (es)"); + break; + case PVZ_1_0_7_3467_RU: + game_status->copy_label("1.0.7.3467 (ru)"); + break; + case PVZ_GOTY_1_2_0_1073_EN: + game_status->copy_label("1.2.0.1073 GOTY Origin (en)"); + break; + case PVZ_GOTY_1_2_0_1096_EN: + game_status->copy_label("1.2.0.1096 GOTY Steam (en)"); + break; + case PVZ_GOTY_1_2_0_1093_DE_ES_FR_IT: + game_status->copy_label("1.2.0.1093 GOTY Origin (de/es/fr/it)"); + break; + case PVZ_GOTY_1_1_0_1056_ZH: + game_status->copy_label("1.1.0.1056 GOTY 2010 (zh)"); + if (!this->bad_version_warned) + { + this->bad_version_warned = true; + fl_message_title("Warning"); + int c = fl_choice("This version of game has serious issues and may crash at any time.\n" // + "It is recommended to use another version that can run normally.\n" // + "Would you like to download it now?", // + "No", "Yes", 0); + if (c == 1) + ShellExecuteW(nullptr, L"open", L"https://pvz.lmintlcx.com/download/", // + nullptr, nullptr, SW_SHOWNORMAL); + } + break; + case PVZ_GOTY_1_1_0_1056_JA: + game_status->copy_label("1.1.0.1056 GOTY (ja)"); + break; + case PVZ_GOTY_1_1_0_1056_ZH_2012_06: + game_status->copy_label("1.1.0.1056 GOTY 2012 (zh)"); + break; + case PVZ_GOTY_1_1_0_1056_ZH_2012_07: + game_status->copy_label("1.1.0.1056 GOTY 2012 (zh)"); + break; + case PVZ_UNSUPPORTED: + game_status->copy_label("Unsupported PvZ Version"); + break; + case PVZ_OPEN_ERROR: + game_status->copy_label("Error Opening PvZ Process"); + break; + case PVZ_NOT_FOUND: + default: + game_status->copy_label("PvZ Window Not Found"); + break; + } + + if (result == PVZ_NOT_FOUND) + { + game_status->copy_tooltip("Please run Plants vs. Zombies first."); + } + else if (result == PVZ_OPEN_ERROR) + { + game_status->copy_tooltip("Please try run PvZ Toolkit as administrator."); + } + else if (result == PVZ_UNSUPPORTED) + { + game_status->copy_tooltip("Contact author to add support for this version."); + } +#ifdef _PVZ_BETA_LEAK_SUPPORT + else if (result == PVZ_BETA_0_1_1_1014_EN || result == PVZ_BETA_0_9_9_1029_EN) + { + game_status->copy_tooltip("Partial support for beta version."); + } +#endif + else if (result == PVZ_GOTY_1_1_0_1056_ZH) + { + game_status->copy_tooltip("Suggest to replace this buggy game version."); + } + else + { + game_status->copy_tooltip(nullptr); + } + + game_status->redraw(); +} + +#endif + void Window::keep_selected_feature() { std::vector check_buttons = { @@ -1793,7 +2395,7 @@ void Window::import_lineup_list(bool automatic) std::wstring ext = name.substr(name.find_last_of(L".") + 1); if (ext == L"yml") { - import_lineup_list_file(name.c_str()); + import_lineup_list_file(name); // std::wcout << L"导入阵型列表: " << name << std::endl; } } while (FindNextFileW(hf, &ffd) != 0); @@ -1830,7 +2432,9 @@ void Window::import_lineup_list(bool automatic) // 排序 auto LessThan = [&](const Lineup &l1, const Lineup &l2) - { return l1.weight < l2.weight; }; + { + return l1.weight < l2.weight; + }; std::sort(this->lineups.begin(), this->lineups.end(), LessThan); // 插入 @@ -1874,13 +2478,13 @@ void Window::import_lineup_list_file(std::wstring file) } else { - if (str[0] == '#' || str.empty()) // 注释或者空行 + if (str.empty() || str[0] == '#') // 空行或者注释 { continue; } else { - std::regex re("\".*\": [a-zA-Z0-9+/=]{1,}"); + std::regex re("\".*\": ([a-zA-Z0-9+/=]{1,}|[a-zA-Z0-9-_=]{1,})"); if (std::regex_match(str, re)) { size_t p = str.find_last_of(": "); @@ -1908,21 +2512,37 @@ void Window::import_lineup_list_file(std::wstring file) if (err_lst.size() > 0) { +#ifdef _PTK_CHINESE_UI std::wstring title = file + L" " + L"阵型列表文件格式错误"; +#else + std::wstring title = file + L" " + L"Lineup List File Format Error"; +#endif std::wstring text; for (size_t i = 0; i < err_lst.size(); i++) { if (i > 11) { +#ifdef _PTK_CHINESE_UI text += std::wstring() + L"\n" + L"(还有更多的没有显示……)"; +#else + text += std::wstring() + L"\n" + L"( More to show ... )"; +#endif break; } auto [l, s] = err_lst[i]; +#ifdef _PTK_CHINESE_UI if (s.length() > 49) s = s.substr(0, 48) + " ..."; text += std::wstring() // + L"第 " + std::to_wstring(l) + L" 行: " // + utf8_decode(s) + L"\n"; // +#else + if (s.length() > 59) + s = s.substr(0, 58) + " ..."; + text += std::wstring() // + + L"Line " + std::to_wstring(l) + L" : " // + + utf8_decode(s) + L"\n"; // +#endif } fl_message_title(utf8_encode(title).c_str()); fl_message(utf8_encode(text).c_str()); @@ -2100,18 +2720,82 @@ void Window::cb_disable_limit_species() if (limit_species) { limit_species = false; +#ifdef _PTK_CHINESE_UI button_spawn_extra->replace(1, EMOJI("✅", "[启用限制]")); +#else + button_spawn_extra->replace(1, "[ Enable Species Limit ]"); +#endif } else { limit_species = true; +#ifdef _PTK_CHINESE_UI button_spawn_extra->replace(1, EMOJI("❎", "[取消限制]")); +#else + button_spawn_extra->replace(1, "[ Disable Species Limit ]"); +#endif } button_spawn_extra->value(0); cb_spawn_count_check(); } +#ifdef _PTK_CHINESE_UI + +void Window::cb_switch_layout_xwz(Fl_Widget *, void *w) +{ + ((Window *)w)->cb_switch_layout_xwz(); +} + +void Window::cb_switch_layout_xwz() +{ + const int layout_ori[20] = { + 2, 3, 4, 5, 6, // + 7, 8, 11, 12, 14, // + 15, 16, 17, 18, 19, // + 20, 21, 22, 23, 32 // + }; + + const int layout_xwz[20] = { + 2, 5, 4, 6, 16, // + 21, 3, 8, 11, 18, // + 12, 15, 7, 17, 14, // + 22, 23, 32, 20, 19 // + }; + + if (this->switch_layout) + { + for (size_t r = 0; r < 4; r++) + for (size_t c = 0; c < 5; c++) + { + int x = this->xy[r * 5 + c][0]; + int y = this->xy[r * 5 + c][1]; + check_zombie[r * 5 + c]->position(x, y); + } + this->switch_layout = false; + } + else + { + for (size_t r = 0; r < 4; r++) + for (size_t c = 0; c < 5; c++) + for (size_t i = 0; i < 4; i++) + for (size_t j = 0; j < 5; j++) + if (layout_xwz[r * 5 + c] == layout_ori[i * 5 + j]) + { + int x = this->xy[r * 5 + c][0]; + int y = this->xy[r * 5 + c][1]; + check_zombie[i * 5 + j]->position(x, y); + } + this->switch_layout = true; + } + + button_spawn_extra->value(0); + + this->redraw(); +} + +#endif + void Window::cb_switch_spawn_mode(Fl_Widget *, void *w) { ((Window *)w)->cb_switch_spawn_mode(); @@ -2119,30 +2803,44 @@ void Window::cb_switch_spawn_mode(Fl_Widget *, void *w) void Window::cb_switch_spawn_mode() { +#ifdef _PTK_CHINESE_UI bool on = check_tooltips->value() == 1; +#endif switch (button_spawn_mode->value()) { case 0: // 自然 choice_giga_weight->deactivate(); check_giga_limit->deactivate(); +#ifdef _PTK_CHINESE_UI button_set_spawn->copy_label("自然出怪 (游戏生成)"); button_set_spawn->copy_tooltip(on ? "Natural (Game Generate)" : nullptr); +#else + button_set_spawn->copy_label("Natural (Game Generate)"); +#endif break; case 1: // 极限 default: choice_giga_weight->deactivate(); check_giga_limit->activate(); +#ifdef _PTK_CHINESE_UI button_set_spawn->copy_label("极限出怪 (均匀填充)"); button_set_spawn->copy_tooltip(on ? "Extreme (Filling Evenly)" : nullptr); +#else + button_set_spawn->copy_label("Extreme (Filling Evenly)"); +#endif break; case 2: // 模拟 choice_giga_weight->activate(); check_giga_limit->activate(); +#ifdef _PTK_CHINESE_UI button_set_spawn->copy_label("模拟出怪 (加权随机)"); button_set_spawn->copy_tooltip(on ? "Simulate (Weighted Random)" : nullptr); +#else + button_set_spawn->copy_label("Simulate (Weighted Random)"); +#endif break; } } @@ -2220,7 +2918,11 @@ void Window::cb_open_dir() bi.hwndOwner = nullptr; bi.pidlRoot = nullptr; // pszDisplayName +#ifdef _PTK_CHINESE_UI bi.lpszTitle = L"选择要打包的文件夹:"; +#else + bi.lpszTitle = L"Choose Folder To Pack: "; +#endif bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI | BIF_NONEWFOLDERBUTTON; bi.lpfn = nullptr; // lParam @@ -2267,6 +2969,8 @@ void Window::cb_tooltips(Fl_Widget *, void *w) ((Window *)w)->cb_tooltips(); } +#ifdef _PTK_CHINESE_UI + void Window::cb_tooltips() { static std::vector vstr_modes; @@ -2361,56 +3065,57 @@ void Window::cb_tooltips() bool on = check_tooltips->value() == 1; - check_unlock_sun_limit->copy_tooltip(on ? "Disable Upper Limit" : "去除上限"); + check_unlock_sun_limit->copy_tooltip(on ? "No Upper Limit to Sunlight" : "阳光无上限"); input_sun->copy_tooltip("0 ~ 9990"); button_sun->copy_tooltip(on ? "Sun" : nullptr); input_money->copy_tooltip("0 ~ 99999"); button_money->copy_tooltip(on ? "Coins" : nullptr); - check_auto_collected->copy_tooltip(on ? "Automatic Collected" : nullptr); - check_not_drop_loot->copy_tooltip(on ? "Not Drop Loot" : nullptr); - check_fertilizer->copy_tooltip(on ? "Unlimited Fertilizer" : nullptr); - check_bug_spray->copy_tooltip(on ? "Unlimited Bug Spray" : nullptr); - check_tree_food->copy_tooltip(on ? "Unlimited Tree Food" : nullptr); - check_chocolate->copy_tooltip(on ? "Unlimited Chocolate" : nullptr); + check_auto_collected->copy_tooltip(on ? "Auto Collected" : nullptr); + check_not_drop_loot->copy_tooltip(on ? "Don\'t Drop Loot" : nullptr); + check_fertilizer->copy_tooltip(on ? "Infinite Fertilizer" : nullptr); + check_bug_spray->copy_tooltip(on ? "Infinite Bug Spray" : nullptr); + check_tree_food->copy_tooltip(on ? "Infinite Tree Food" : nullptr); + check_chocolate->copy_tooltip(on ? "Infinite Chocolate" : nullptr); input_wisdom_tree->copy_tooltip("0 ~ 1000"); - button_wisdom_tree->copy_tooltip(on ? "Feet Tall" : nullptr); + button_wisdom_tree->copy_tooltip(on ? "Feet" : nullptr); check_free_planting->copy_tooltip(on ? "Free Planting" : nullptr); - check_placed_anywhere->copy_tooltip(on ? "Placed Anywhere" : nullptr); + check_placed_anywhere->copy_tooltip(on ? "Place Anywhere" : nullptr); check_fast_belt->copy_tooltip(on ? "Seamless Conveyor Belt" : nullptr); check_lock_shovel->copy_tooltip(on ? "Shovel Continuously" : nullptr); choice_mode->copy_tooltip(on ? vstr_modes[choice_mode->value()].c_str() : nullptr); choice_adventure->copy_tooltip(on ? choice_adventure->text(choice_adventure->value()) : nullptr); button_mix->copy_tooltip(on ? "Modify Mode" : nullptr); - input_level->copy_tooltip("0 ~ 10000000"); + input_level->copy_tooltip("0 ~ 999999"); button_level->copy_tooltip(on ? "Endless Rounds" : nullptr); button_unlock->copy_tooltip(on ? "Get Gold Sunflower Trophy" : "解锁黄金向日葵奖杯"); button_direct_win->copy_tooltip(on ? "Level Complete" : nullptr); + check_brightest_cob_cannon->copy_tooltip(on ? "End with Brightest Cob" : "结束时炮最亮"); choice_row->copy_tooltip(on ? vstr_rows[choice_row->value()].c_str() : nullptr); choice_col->copy_tooltip(on ? vstr_cols[choice_col->value()].c_str() : nullptr); choice_plant->copy_tooltip(on ? vstr_plants[choice_plant->value()].c_str() : nullptr); choice_zombie->copy_tooltip(on ? vstr_zombies[choice_zombie->value()].c_str() : nullptr); - button_put_plant->copy_tooltip(on ? "Place Plant" : nullptr); + button_put_plant->copy_tooltip(on ? "Put Plant" : nullptr); check_imitater->copy_tooltip(on ? "Imitater" : nullptr); - button_put_zombie->copy_tooltip(on ? "Place Zombie" : nullptr); - button_put_ladder->copy_tooltip(on ? "Place Ladder" : nullptr); - button_put_grave->copy_tooltip(on ? "Place Grave" : nullptr); - button_put_rake->copy_tooltip(on ? "Place Rake" : nullptr); + button_put_zombie->copy_tooltip(on ? "Put Zombie" : nullptr); + button_put_ladder->copy_tooltip(on ? "Put Ladder" : nullptr); + button_put_grave->copy_tooltip(on ? "Put Grave" : nullptr); + button_put_rake->copy_tooltip(on ? "Put Rake" : nullptr); button_lawn_mower->copy_tooltip(on ? "Lawn Mowers" : nullptr); choice_item->copy_tooltip(on ? vstr_items[choice_item->value()].c_str() : nullptr); - button_clear->copy_tooltip(on ? "Clear" : nullptr); + button_clear->copy_tooltip(on ? "Clear All" : nullptr); check_plant_invincible->copy_tooltip(on ? "Plant Invincible" : nullptr); check_plant_weak->copy_tooltip(on ? "Plant Weak" : nullptr); check_zombie_invincible->copy_tooltip(on ? "Zombie Invincible" : nullptr); check_zombie_weak->copy_tooltip(on ? "Zombie Weak" : nullptr); check_reload_instantly->copy_tooltip(on ? "Reload Instantly" : nullptr); check_mushroom_awake->copy_tooltip(on ? "Mushroom Awake" : nullptr); - check_stop_spawning->copy_tooltip(on ? "Spawning Paused" : nullptr); + check_stop_spawning->copy_tooltip(on ? "Pause Spawning" : nullptr); check_stop_zombies->copy_tooltip(on ? "Stay In Place" : nullptr); check_lock_butter->copy_tooltip(on ? "Always Butter" : nullptr); check_no_crater->copy_tooltip(on ? "No Crater" : nullptr); check_no_ice_trail->copy_tooltip(on ? "No Ice Trail" : nullptr); - check_zombie_not_explode->copy_tooltip(on ? "Zombies Never Explode" : nullptr); + check_zombie_not_explode->copy_tooltip(on ? "Never Explode" : nullptr); choice_slot->copy_tooltip(on ? vstr_slots[choice_slot->value()].c_str() : nullptr); if (choice_seed->value() == -1) @@ -2419,21 +3124,21 @@ void Window::cb_tooltips() choice_seed->copy_tooltip(on ? vstr_plants[choice_seed->value()].c_str() : nullptr); button_seed->copy_tooltip(on ? "Replace Seed" : nullptr); check_seed_imitater->copy_tooltip(on ? "Imitater" : nullptr); - check_lineup_mode->copy_tooltip(on ? "Lineup Mode Shortcut" : nullptr); + check_lineup_mode->copy_tooltip(on ? "Lineup Mode" : nullptr); button_auto_ladder->copy_tooltip(on ? "Smart Laddering" : nullptr); - button_put_lily_pad->copy_tooltip(on ? "Lily Pad On Pool" : nullptr); - button_put_flower_pot->copy_tooltip(on ? "Flower Pot On Roof" : nullptr); + button_put_lily_pad->copy_tooltip(on ? "Pool \'s Lily Pad" : nullptr); + button_put_flower_pot->copy_tooltip(on ? "Roof \'s Flower Pot" : nullptr); button_reset->copy_tooltip(on ? "Reset Scene" : nullptr); choice_scene->copy_tooltip(on ? vstr_scenes[choice_scene->value()].c_str() : nullptr); button_load_lineup->copy_tooltip(on ? "Load Lineup List File (***.yml)" : nullptr); for (size_t i = 0; i < 6; i++) choice_lineup_name[i]->copy_tooltip(on ? "(Lineup Name)" : nullptr); button_get_lineup->copy_tooltip(on ? "Get Lineup Code" : nullptr); - button_copy_lineup->copy_tooltip(on ? "Copy / Export" : nullptr); - button_paste_lineup->copy_tooltip(on ? "Paste / Import" : nullptr); - button_set_lineup->copy_tooltip(on ? "Apply Current Build" : nullptr); + button_copy_lineup->copy_tooltip(on ? "Copy (Export)" : nullptr); + button_paste_lineup->copy_tooltip(on ? "Paste (Import)" : nullptr); + button_set_lineup->copy_tooltip(on ? "Apply Current Setup" : nullptr); editor_lineup_string->copy_tooltip(on ? "(Lineup Code)" : "(阵型代码)"); - button_capture->copy_tooltip(on ? "Screenshot To Clipboard" : "截图到剪贴板"); + button_capture->copy_tooltip(on ? "Screenshot to Clipboard" : "截图到剪贴板"); for (size_t i = 0; i < 20; i++) { @@ -2450,11 +3155,11 @@ void Window::cb_tooltips() choice_music->copy_tooltip(on ? choice_music->text(choice_music->value()) : nullptr); button_music->copy_tooltip(on ? "Background Music" : nullptr); - button_userdata->copy_tooltip(on ? "Userdata Folder" : nullptr); + button_userdata->copy_tooltip(on ? "Open Userdata Folder" : nullptr); check_no_fog->copy_tooltip(on ? "Clear Fog" : nullptr); check_see_vase->copy_tooltip(on ? "Transparent Vase" : nullptr); - check_background->copy_tooltip(on ? "Enable Background Running" : nullptr); - check_readonly->copy_tooltip(on ? "Disable Delete/Save Userdata" : nullptr); + check_background->copy_tooltip(on ? "Enable PvZ to Run in Background" : nullptr); + check_readonly->copy_tooltip(on ? "Userdata Readonly" : nullptr); button_file->copy_tooltip(on ? "Choose File" : nullptr); input_file->copy_tooltip(on ? "(File Path)" : "(文件路径)"); button_unpack->copy_tooltip(on ? "Extract" : nullptr); @@ -2492,38 +3197,37 @@ void Window::cb_tooltips() // 顺便更新标题 - // 96 100% - // 120 125% - // 144 150% - // 168 175% - // 192 200% - int dpi = 96; - HDC dc = GetDC(nullptr); - if (dc != nullptr) - { - // int virtual_width = GetDeviceCaps(dc, HORZRES); - // int physical_width = GetDeviceCaps(dc, DESKTOPHORZRES); - // dpi = 96 * physical_width / virtual_width; - int dpi_x = GetDeviceCaps(dc, LOGPIXELSX); - int dpi_y = GetDeviceCaps(dc, LOGPIXELSY); - dpi = (dpi_x + dpi_y) / 2; - ReleaseDC(nullptr, dc); - } - // std::cout << "dpi: " << dpi << std::endl; - std::string title; - if (dpi <= 96) - title = on ? "Plants vs. Zombies All Version Toolkit" - : "PvZ Toolkit - 植物大战僵尸全版本辅助工具"; - else if (dpi <= 120) - title = on ? "Plants vs. Zombies Toolkit" - : "植物大战僵尸全版本辅助工具"; - else - title = on ? "PvZ Toolkit" - : "植物大战僵尸辅助"; + title = on ? "PvZ Toolkit - Plants vs. Zombies Tool Kit" + : "PvZ Toolkit - 植物大战僵尸辅助工具"; this->copy_label(title.c_str()); } +#else + +void Window::cb_tooltips() +{ + input_sun->copy_tooltip("0 ~ 9990"); + input_money->copy_tooltip("0 ~ 99999"); + input_wisdom_tree->copy_tooltip("0 ~ 1000"); + input_level->copy_tooltip("0 ~ 999999"); + + for (size_t i = 0; i < 6; i++) + choice_lineup_name[i]->copy_tooltip("(Lineup Name)"); + + editor_lineup_string->copy_tooltip("(Lineup Code)"); + + choice_giga_weight->copy_tooltip("Original: 1000 (non-huge waves), 6000 (huge waves)."); + button_set_spawn->copy_tooltip("Right click to change spawning mode."); + + input_file->copy_tooltip("(File Path)"); + input_dir->copy_tooltip("(Folder Path)"); + + cb_find_result_tooltip(); +} + +#endif + void Window::cb_about(Fl_Widget *, void *w) { ((Window *)w)->cb_about(); @@ -2538,13 +3242,32 @@ void Window::cb_about() + TOSTRING(VERSION_BUILD) // + ")"; // + std::string dep_fltk_ver = std::string("FLTK") // + + " " // + + TOSTRING(FL_MAJOR_VERSION) // + + "." // + + TOSTRING(FL_MINOR_VERSION) // + + "." // + + TOSTRING(FL_PATCH_VERSION) // + + " dev"; // TODO + + std::string dep_zlib_ver = std::string("zlib") // + + " " // + + TOSTRING(ZLIB_VER_MAJOR) // + + "." // + + TOSTRING(ZLIB_VER_MINOR) // + + "." // + + TOSTRING(ZLIB_VER_REVISION) // + + "." // + + TOSTRING(ZLIB_VER_SUBREVISION); // + // "Sep 1 2021" // 0123456789A std::string date = std::string(__DATE__); std::string time = std::string(__TIME__); if (date[4] == ' ') date[4] = '0'; - char s_month[4] = {date[0], date[1], date[2], 0}; + const char s_month[4] = {date[0], date[1], date[2], 0}; const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; int month = (strstr(month_names, s_month) - month_names) / 3 + 1; std::string build_date = std::string() // @@ -2555,21 +3278,56 @@ void Window::cb_about() + date[4] + date[5]; // std::string build_date_time = build_date + " " + time; - std::string text = std::string() // - + "植物大战僵尸辅助工具" + "\n" // - + "Plants vs. Zombies Toolkit" + "\n" // - + "\n" // - + "官方网站:" + "\t" + "https://pvz.lmintlcx.com/" + "\n" // - + "\n" // - + "发行版本:" + "\t" + version_full + "\n" // - + "编译时间:" + "\t" + build_date_time + "\n" // - + "版权所有:" + "\t" + "© 2020~2022 L.Mint. LCX" + "\n" // - + "\n" // - + "复刻起源:" + "\t" + "PVZ Helper 1.8.7" + "\n" // - + "依赖项目:" + "\t" + "FLTK 1.4 + zlib 1.2.12" + "\n" // - + "鸣谢名单:" + "\t" + "kmtohoem 63enjoy 273.15K" + "\n"; // + std::string official_website = "https://pvz.lmintlcx.com/"; + std::string build_date_year = std::string() + date[7] + date[8] + date[9] + date[10]; + std::string copyright = "© 2020 ~ " + build_date_year + " L.Mint. LCX"; + + std::string reference_project = "PVZ Helper 1.8.7"; + std::string origin_author = "zhumxiang @@ GitHub"; + + std::string dependencies = dep_fltk_ver + " + " + dep_zlib_ver; + + std::string acknowledgements = "kmtohoem / 63enjoy / 273.15K"; + +#ifdef _PTK_CHINESE_UI + std::string text = std::string() // + + "植物大战僵尸辅助工具" + "\n" // + + "Plants vs. Zombies Tool Kit" + "\n" // + + "\n" // + + "发行版本:" + "\t" + version_full + "\n" // + + "编译时间:" + "\t" + build_date_time + "\n" // + + "\n" // + + "官方网站:" + "\t" + official_website + "\n" // + + "版权所有:" + "\t" + copyright + "\n" // + + "\n" // + + "参考项目:" + "\t" + reference_project + "\n" // + + "原始作者:" + "\t" + origin_author + "\n" // + + "\n" // + + "开发依赖:" + "\t" + dependencies + "\n" // + + "鸣谢名单:" + "\t" + acknowledgements + "\n"; // +#else + std::string text = std::string() // + + "PvZ Toolkit" + "\n" // + + "Plants vs. Zombies Tool Kit" + "\n" // + + "\n" // + + "Version: " + "\t" + version_full + "\n" // + + "Date: " + "\t" + build_date_time + "\n" // + + "\n" // + + "Website: " + "\t" + official_website + "\n" // + + "Copyright: " + "\t" + copyright + "\n" // + + "\n" // + + "Origin: " + "\t" + reference_project + "\n" // + + "Author: " + "\t" + origin_author + "\n" // + + "\n" // + + "Dependencies: " + "\t" + dependencies + "\n" // + + "Credits: " + "\t" + acknowledgements + "\n"; // +#endif +#ifdef _PTK_CHINESE_UI fl_message_title("关于 PvZ Toolkit"); +#else + fl_message_title("About PvZ Toolkit"); +#endif fl_message(text.c_str()); } diff --git a/tools/build_pvztoolkit.bat b/tools/build_pvztoolkit.bat index 084a4fb..02a74e5 100644 --- a/tools/build_pvztoolkit.bat +++ b/tools/build_pvztoolkit.bat @@ -1,64 +1,76 @@ -@echo off +echo off chcp 65001 -call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86 +REM 本文件仅用于作者开发和打包 pvztoolkit +REM 内部使用, 不要在不明白代码作用的情况下随便运行 -REM cd /d D:\repo\pvztoolkit -cd /d %~dp0 +set PZTK=D:\repo\pvztoolkit +set FLTK=C:\Dev\fltk_1.4.0\msvc2017_x86\static -set INCLUDE=.\fltk\include;%INCLUDE% -set LIB=.\fltk\lib;%LIB% +set JOM=C:\Tools\jom_1_1_4\jom.exe -set INCLUDE=.\zlib\include;%INCLUDE% -set LIB=.\zlib\lib;%LIB% +if not exist %PZTK% exit +if not exist %FLTK% exit -if exist .\out\pvztoolkitd.exe del .\out\pvztoolkitd.exe -if exist .\out\pvztoolkit.exe nmake -f makefile.release clean +cd /d %PZTK% -nmake -f makefile.debug +call "C:\VisualStudio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x86 -if not exist .\out\pvztoolkitd.exe goto :end +set INCLUDE=%FLTK%\include;%INCLUDE% +set LIB=%FLTK%\lib;%LIB% + +if exist .\build\pvztoolkitd.exe del .\build\pvztoolkitd.exe + +if exist %JOM% ( + %JOM% -f tools/debug.makefile +) else ( + nmake -f tools/debug.makefile +) + +if not exist .\build\pvztoolkitd.exe goto :end mt.exe -nologo ^ --manifest ".\res\ptk.manifest" ^ --outputresource:".\out\pvztoolkitd.exe;#1" +-manifest ".\res\pvztoolkit.manifest" ^ +-outputresource:".\build\pvztoolkitd.exe;#1" signtool.exe sign /v ^ /fd sha1 ^ /f "D:\notes\cert\lmintlcx_r4.pfx" ^ /p "Rm9yIFppb24h" ^ -.\out\pvztoolkitd.exe +.\build\pvztoolkitd.exe goto :end rem release -nmake -f makefile.release clean -nmake -f makefile.release +nmake -f tools/release.makefile clean +nmake -f tools/release.makefile -if not exist .\out\pvztoolkit.exe goto :end +REM nmake -f tools/release.nt5.makefile +REM Set-ExecutionPolicy -ExecutionPolicy RemoteSigned +REM start powershell .\nt5\patch_exe.ps1 .\build\pvztoolkit.exe + +if not exist .\build\pvztoolkit.exe goto :end mt.exe -nologo ^ --manifest ".\res\ptk.manifest" ^ --outputresource:".\out\pvztoolkit.exe;#1" +-manifest ".\res\pvztoolkit.manifest" ^ +-outputresource:".\build\pvztoolkit.exe;#1" signtool.exe sign /v ^ /fd sha1 ^ /f "D:\notes\cert\lmintlcx_r4.pfx" ^ /p "Rm9yIFppb24h" ^ -/t "http://timestamp.digicert.com" ^ -.\out\pvztoolkit.exe +.\build\pvztoolkit.exe signtool.exe sign /v ^ /as /fd sha256 ^ /f "D:\notes\cert\lmintlcx_r4.pfx" ^ /p "Rm9yIFppb24h" ^ -/tr "http://timestamp.digicert.com" ^ -.\out\pvztoolkit.exe +.\build\pvztoolkit.exe goto :end -file="PvZ_Toolkit_v1.20.3.exe" -rm $file.hash +file="PvZ_Toolkit_v1.xx.x.exe" +rm -f $file.hash echo $file >> $file.hash echo "MD5" >> $file.hash md5sum $file | cut -d" " -f1 | tr [a-z] [A-Z] >> $file.hash @@ -74,6 +86,11 @@ gpg --verify $file.asc $file :end -if not exist .\out\splash.png copy bin\splash.png .\out -if not exist .\out\lineup.yml copy bin\lineup.yml .\out -if not exist .\out\builds.yml copy bin\builds.yml .\out +if not exist .\build\splash.png copy misc\splash.png .\build +if not exist .\build\setups.yml copy misc\setups.yml .\build + +exit + +set WinRAR="C:\Program Files\WinRAR\WinRAR.exe" +%WinRAR% a -afrar -m5 -ma4 -r -rr1% -s XXXX.rar "XXXX" +%WinRAR% a -afzip -m5 -r XXXX.zip "XXXX" diff --git a/tools/debug.makefile b/tools/debug.makefile index cbcd5b6..8490bfe 100644 --- a/tools/debug.makefile +++ b/tools/debug.makefile @@ -1,39 +1,49 @@ -OUTDIR = .\out +OUTDIR = .\build TARGET = pvztoolkitd CXX = cl -CXXFLAGS_BARE = -c -nologo \ - -Zc:wchar_t \ +CXX_FLAGS_BARE = /c /nologo \ + /Zc:wchar_t /Zc:__cplusplus \ + /std:c++17 \ /MP \ /utf-8 \ - /Zc:__cplusplus /std:c++20 \ - /W3 /EHsc \ + /W3 /GR- \ /Od /MTd /Zi /FS -DEFINES = -DUNICODE -D_UNICODE \ +DEFINES = -D_HAS_EXCEPTIONS=0 \ + -DUNICODE -D_UNICODE \ + -DWIN32_LEAN_AND_MEAN -DNOMINMAX \ -DWIN32 -D_WIN32_WINNT=0x0600 \ - -D_REGEX_MAX_STACK_COUNT=0 + -D_REGEX_MAX_STACK_COUNT=0 \ + -D_PVZ_BETA_LEAK_SUPPORT \ + -D_PTK_CHINESE_UI \ + -D_PTK_SIGNATURE_CHECK INCPATH = -I. -INCS = .\src\pak.h \ - .\src\process.h \ - .\src\code.h \ - .\src\data.h \ - .\src\lineup.h \ - .\src\pvz.h \ - .\src\window.h \ - .\src\toolkit.h -CXXFLAGS = /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\$(TARGET).pdb" $(CXXFLAGS_BARE) $(DEFINES) $(INCPATH) +INCS = .\inc\utils.h \ + .\inc\pak.h \ + .\inc\process.h \ + .\inc\code.h \ + .\inc\data.h \ + .\inc\lineup.h \ + .\inc\pvz.h \ + .\inc\window.h \ + .\inc\toolkit.h +CXX_FLAGS = /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\$(TARGET).pdb" $(CXX_FLAGS_BARE) $(DEFINES) $(INCPATH) + +ASM = ml +ASM_FLAGS = /c /nologo /W3 RC = rc RC_FLAGS = /n $(DEFINES) LINKER = link -LIBS_FLTK = fltk.lib fltk_z.lib fltk_images.lib fltk_jpeg.lib fltk_png.lib -LIBS_ZLIB = zlib.lib -LIBS_WIN32 = user32.lib shell32.lib advapi32.lib comctl32.lib comdlg32.lib ole32.lib \ - psapi.lib version.lib wsock32.lib crypt32.lib gdi32.lib gdiplus.lib wintrust.lib +LIBS_FLTK = fltkd.lib fltk_imagesd.lib fltk_jpegd.lib fltk_pngd.lib fltk_zd.lib +LIBS_ZLIB = +LIBS_WIN32 = user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib comdlg32.lib ws2_32.lib comctl32.lib gdiplus.lib \ + crypt32.lib advapi32.lib wintrust.lib shlwapi.lib LIBS = /LIBPATH:$(OUTDIR) $(LIBS_FLTK) $(LIBS_ZLIB) $(LIBS_WIN32) -OBJS = $(OUTDIR)\pak.obj \ +OBJS = $(OUTDIR)\utils.obj \ + $(OUTDIR)\pak.obj \ $(OUTDIR)\process.obj \ $(OUTDIR)\code.obj \ $(OUTDIR)\data.obj \ @@ -43,7 +53,7 @@ OBJS = $(OUTDIR)\pak.obj \ $(OUTDIR)\toolkit.obj \ $(OUTDIR)\main.obj RES = $(OUTDIR)\version.res -LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /SUBSYSTEM:CONSOLE \ +LINK_FLAGS = /NOLOGO /DYNAMICBASE:NO /INCREMENTAL:NO /SUBSYSTEM:CONSOLE \ $(LIBS) $(OBJS) $(RES) /DEBUG /STACK:0x00400000 @@ -53,37 +63,40 @@ $(OUTDIR): if not exist "$(OUTDIR)" mkdir "$(OUTDIR)" $(OUTDIR)\$(TARGET).exe: $(OBJS) $(OUTDIR)\version.res - $(LINKER) $(LFLAGS) /out:$(OUTDIR)\$(TARGET).exe + $(LINKER) $(LINK_FLAGS) /out:$(OUTDIR)\$(TARGET).exe $(OUTDIR)\version.res: .\res\version.rc $(RC) $(RC_FLAGS) /fo $(OUTDIR)\version.res .\res\version.rc +$(OUTDIR)\utils.obj: .\src\utils.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\utils.obj" .\src\utils.cpp + $(OUTDIR)\pak.obj: .\src\pak.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\pak.obj" .\src\pak.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\pak.obj" .\src\pak.cpp $(OUTDIR)\process.obj: .\src\process.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\process.obj" .\src\process.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\process.obj" .\src\process.cpp $(OUTDIR)\code.obj: .\src\code.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\code.obj" .\src\code.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\code.obj" .\src\code.cpp $(OUTDIR)\data.obj: .\src\data.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\data.obj" .\src\data.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\data.obj" .\src\data.cpp $(OUTDIR)\lineup.obj: .\src\lineup.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\lineup.obj" .\src\lineup.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\lineup.obj" .\src\lineup.cpp $(OUTDIR)\pvz.obj: .\src\pvz.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\pvz.obj" .\src\pvz.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\pvz.obj" .\src\pvz.cpp $(OUTDIR)\window.obj: .\src\window.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\window.obj" .\src\window.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\window.obj" .\src\window.cpp $(OUTDIR)\toolkit.obj: .\src\toolkit.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\toolkit.obj" .\src\toolkit.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\toolkit.obj" .\src\toolkit.cpp $(OUTDIR)\main.obj: .\src\main.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\main.obj" .\src\main.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\main.obj" .\src\main.cpp clean: if exist "$(OUTDIR)" rmdir /s /q "$(OUTDIR)" diff --git a/tools/release.makefile b/tools/release.makefile index d682b40..0b8768a 100644 --- a/tools/release.makefile +++ b/tools/release.makefile @@ -1,39 +1,49 @@ -OUTDIR = .\out +OUTDIR = .\build TARGET = pvztoolkit CXX = cl -CXXFLAGS_BARE = -c -nologo \ - -Zc:wchar_t \ +CXX_FLAGS_BARE = /c /nologo \ + /Zc:wchar_t /Zc:__cplusplus \ + /std:c++17 \ /MP \ /utf-8 \ - /Zc:__cplusplus /std:c++20 \ - /W3 /EHsc \ - /O1 /MT -DEFINES = -DUNICODE -D_UNICODE \ + /W3 /GR- \ + /O1 /MT /GL +DEFINES = -DNDEBUG -D_HAS_EXCEPTIONS=0 \ + -DUNICODE -D_UNICODE \ + -DWIN32_LEAN_AND_MEAN -DNOMINMAX \ -DWIN32 -D_WIN32_WINNT=0x0600 \ - -D_REGEX_MAX_STACK_COUNT=0 + -D_REGEX_MAX_STACK_COUNT=0 \ + -D_PVZ_BETA_LEAK_SUPPORT \ + -D_PTK_CHINESE_UI \ + -D_PTK_SIGNATURE_CHECK INCPATH = -I. -INCS = .\src\pak.h \ - .\src\process.h \ - .\src\code.h \ - .\src\data.h \ - .\src\lineup.h \ - .\src\pvz.h \ - .\src\window.h \ - .\src\toolkit.h -CXXFLAGS = /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\$(TARGET).pdb" $(CXXFLAGS_BARE) $(DEFINES) $(INCPATH) +INCS = .\inc\utils.h \ + .\inc\pak.h \ + .\inc\process.h \ + .\inc\code.h \ + .\inc\data.h \ + .\inc\lineup.h \ + .\inc\pvz.h \ + .\inc\window.h \ + .\inc\toolkit.h +CXX_FLAGS = /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\$(TARGET).pdb" $(CXX_FLAGS_BARE) $(DEFINES) $(INCPATH) + +ASM = ml +ASM_FLAGS = /c /nologo /W3 RC = rc RC_FLAGS = /n $(DEFINES) LINKER = link -LIBS_FLTK = fltk.lib fltk_z.lib fltk_images.lib fltk_jpeg.lib fltk_png.lib -LIBS_ZLIB = zlib.lib -LIBS_WIN32 = user32.lib shell32.lib advapi32.lib comctl32.lib comdlg32.lib ole32.lib \ - psapi.lib version.lib wsock32.lib crypt32.lib gdi32.lib gdiplus.lib wintrust.lib +LIBS_FLTK = fltk.lib fltk_images.lib fltk_jpeg.lib fltk_png.lib fltk_z.lib +LIBS_ZLIB = +LIBS_WIN32 = user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib comdlg32.lib ws2_32.lib comctl32.lib gdiplus.lib \ + crypt32.lib advapi32.lib wintrust.lib shlwapi.lib LIBS = /LIBPATH:$(OUTDIR) $(LIBS_FLTK) $(LIBS_ZLIB) $(LIBS_WIN32) -OBJS = $(OUTDIR)\pak.obj \ +OBJS = $(OUTDIR)\utils.obj \ + $(OUTDIR)\pak.obj \ $(OUTDIR)\process.obj \ $(OUTDIR)\code.obj \ $(OUTDIR)\data.obj \ @@ -43,8 +53,8 @@ OBJS = $(OUTDIR)\pak.obj \ $(OUTDIR)\toolkit.obj \ $(OUTDIR)\main.obj RES = $(OUTDIR)\version.res -LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /SUBSYSTEM:WINDOWS \ - $(LIBS) $(OBJS) $(RES) /STACK:0x00400000 +LINK_FLAGS = /NOLOGO /DYNAMICBASE:NO /INCREMENTAL:NO /SUBSYSTEM:WINDOWS \ + $(LIBS) $(OBJS) $(RES) /STACK:0x00400000 /LTCG all:$(OUTDIR) $(OUTDIR)\$(TARGET).exe @@ -53,37 +63,40 @@ $(OUTDIR): if not exist "$(OUTDIR)" mkdir "$(OUTDIR)" $(OUTDIR)\$(TARGET).exe: $(OBJS) $(OUTDIR)\version.res - $(LINKER) $(LFLAGS) /out:$(OUTDIR)\$(TARGET).exe + $(LINKER) $(LINK_FLAGS) /out:$(OUTDIR)\$(TARGET).exe $(OUTDIR)\version.res: .\res\version.rc $(RC) $(RC_FLAGS) /fo $(OUTDIR)\version.res .\res\version.rc +$(OUTDIR)\utils.obj: .\src\utils.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\utils.obj" .\src\utils.cpp + $(OUTDIR)\pak.obj: .\src\pak.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\pak.obj" .\src\pak.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\pak.obj" .\src\pak.cpp $(OUTDIR)\process.obj: .\src\process.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\process.obj" .\src\process.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\process.obj" .\src\process.cpp $(OUTDIR)\code.obj: .\src\code.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\code.obj" .\src\code.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\code.obj" .\src\code.cpp $(OUTDIR)\data.obj: .\src\data.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\data.obj" .\src\data.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\data.obj" .\src\data.cpp $(OUTDIR)\lineup.obj: .\src\lineup.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\lineup.obj" .\src\lineup.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\lineup.obj" .\src\lineup.cpp $(OUTDIR)\pvz.obj: .\src\pvz.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\pvz.obj" .\src\pvz.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\pvz.obj" .\src\pvz.cpp $(OUTDIR)\window.obj: .\src\window.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\window.obj" .\src\window.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\window.obj" .\src\window.cpp $(OUTDIR)\toolkit.obj: .\src\toolkit.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\toolkit.obj" .\src\toolkit.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\toolkit.obj" .\src\toolkit.cpp $(OUTDIR)\main.obj: .\src\main.cpp $(INCS) - $(CXX) $(CXXFLAGS) /Fe"$(OUTDIR)\main.obj" .\src\main.cpp + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\main.obj" .\src\main.cpp clean: if exist "$(OUTDIR)" rmdir /s /q "$(OUTDIR)" diff --git a/tools/release.nt5.makefile b/tools/release.nt5.makefile new file mode 100644 index 0000000..4dacf76 --- /dev/null +++ b/tools/release.nt5.makefile @@ -0,0 +1,111 @@ + +OUTDIR = .\build +TARGET = pvztoolkit + +CXX = cl +CXX_FLAGS_BARE = /c /nologo \ + /Zc:wchar_t /Zc:__cplusplus \ + /std:c++17 \ + /MP \ + /utf-8 \ + /W3 /GR- \ + /O1 /MT /GL /arch:IA32 +DEFINES = -DNDEBUG -D_HAS_EXCEPTIONS=0 \ + -DUNICODE -D_UNICODE \ + -DWIN32_LEAN_AND_MEAN -DNOMINMAX \ + -DWIN32 -D_WIN32_WINNT=0x0501 -D_USING_V110_SDK71_ \ + -D_REGEX_MAX_STACK_COUNT=0 \ + -D_PVZ_BETA_LEAK_SUPPORT \ + -D_PTK_CHINESE_UI \ + -D_PTK_SIGNATURE_CHECK +INCPATH = -I. +INCS = .\inc\utils.h \ + .\inc\pak.h \ + .\inc\process.h \ + .\inc\code.h \ + .\inc\data.h \ + .\inc\lineup.h \ + .\inc\pvz.h \ + .\inc\window.h \ + .\inc\toolkit.h \ + .\nt5\vc141_nt5.h +CXX_FLAGS = /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\$(TARGET).pdb" $(CXX_FLAGS_BARE) $(DEFINES) $(INCPATH) + +ASM = ml +ASM_FLAGS = /c /nologo /W3 + +RC = rc +RC_FLAGS = /n $(DEFINES) + +LINKER = link +LIBS_FLTK = fltk.lib fltk_images.lib fltk_jpeg.lib fltk_png.lib fltk_z.lib +LIBS_ZLIB = +LIBS_WIN32 = user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib comdlg32.lib ws2_32.lib comctl32.lib gdiplus.lib \ + crypt32.lib advapi32.lib wintrust.lib shlwapi.lib +LIBS = /LIBPATH:$(OUTDIR) $(LIBS_FLTK) $(LIBS_ZLIB) $(LIBS_WIN32) +OBJS = $(OUTDIR)\utils.obj \ + $(OUTDIR)\pak.obj \ + $(OUTDIR)\process.obj \ + $(OUTDIR)\code.obj \ + $(OUTDIR)\data.obj \ + $(OUTDIR)\lineup.obj \ + $(OUTDIR)\pvz.obj \ + $(OUTDIR)\window.obj \ + $(OUTDIR)\toolkit.obj \ + $(OUTDIR)\vc141_nt5.obj \ + $(OUTDIR)\vc141_nt5_asm.obj \ + $(OUTDIR)\main.obj +RES = $(OUTDIR)\version.res +LINK_FLAGS = /NOLOGO /DYNAMICBASE:NO /INCREMENTAL:NO /SUBSYSTEM:WINDOWS,5.01 \ + $(LIBS) $(OBJS) $(RES) /STACK:0x00400000 /LTCG + + +all:$(OUTDIR) $(OUTDIR)\$(TARGET).exe + +$(OUTDIR): + if not exist "$(OUTDIR)" mkdir "$(OUTDIR)" + +$(OUTDIR)\$(TARGET).exe: $(OBJS) $(OUTDIR)\version.res + $(LINKER) $(LINK_FLAGS) /out:$(OUTDIR)\$(TARGET).exe + +$(OUTDIR)\version.res: .\res\version.rc + $(RC) $(RC_FLAGS) /fo $(OUTDIR)\version.res .\res\version.rc + +$(OUTDIR)\utils.obj: .\src\utils.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\utils.obj" .\src\utils.cpp + +$(OUTDIR)\pak.obj: .\src\pak.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\pak.obj" .\src\pak.cpp + +$(OUTDIR)\process.obj: .\src\process.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\process.obj" .\src\process.cpp + +$(OUTDIR)\code.obj: .\src\code.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\code.obj" .\src\code.cpp + +$(OUTDIR)\data.obj: .\src\data.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\data.obj" .\src\data.cpp + +$(OUTDIR)\lineup.obj: .\src\lineup.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\lineup.obj" .\src\lineup.cpp + +$(OUTDIR)\pvz.obj: .\src\pvz.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\pvz.obj" .\src\pvz.cpp + +$(OUTDIR)\window.obj: .\src\window.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\window.obj" .\src\window.cpp + +$(OUTDIR)\toolkit.obj: .\src\toolkit.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\toolkit.obj" .\src\toolkit.cpp + +$(OUTDIR)\vc141_nt5.obj: .\nt5\vc141_nt5.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\vc141_nt5.obj" .\nt5\vc141_nt5.cpp + +$(OUTDIR)\vc141_nt5_asm.obj: .\nt5\vc141_nt5.asm $(INCS) + $(ASM) $(ASM_FLAGS) /Fo"$(OUTDIR)\vc141_nt5_asm.obj" .\nt5\vc141_nt5.asm + +$(OUTDIR)\main.obj: .\src\main.cpp $(INCS) + $(CXX) $(CXX_FLAGS) /Fe"$(OUTDIR)\main.obj" .\src\main.cpp + +clean: + if exist "$(OUTDIR)" rmdir /s /q "$(OUTDIR)"