From 7e16b64dd63df4e6a8a4e05c360e12f9f7151874 Mon Sep 17 00:00:00 2001 From: ws <> Date: Sat, 11 Nov 2023 02:42:29 +1300 Subject: [PATCH] Add chat commands --- .gitignore | 3 + metamod/AMBuildScript | 59 ++-- metamod/AMBuilder | 26 +- metamod/CMakeLists.txt | 38 +++ metamod/configure.py | 40 +-- metamod/local_build.ps1 | 8 +- metamod/src/core/cbaseentity.h | 33 ++ metamod/src/core/framework.h | 73 +++++ metamod/src/core/module.h | 131 ++++++++ metamod/src/core/schemasystem.cpp | 48 +++ metamod/src/core/schemasystem.h | 64 ++++ metamod/src/core/virtual.h | 53 +++ metamod/src/wst.cpp | 69 +++- metamod/src/wst.h | 29 +- metamod/vendor/funchook/LICENSE | 360 +++++++++++++++++++++ metamod/vendor/funchook/README.md | 273 ++++++++++++++++ metamod/vendor/funchook/include/funchook.h | 167 ++++++++++ metamod/vendor/funchook/lib/distorm.lib | Bin 0 -> 76378 bytes metamod/vendor/funchook/lib/funchook.lib | Bin 0 -> 65438 bytes metamod/vendor/funchook/lib/libdistorm.a | Bin 0 -> 85698 bytes metamod/vendor/funchook/lib/libfunchook.a | Bin 0 -> 46806 bytes scripts/vscripts/wst.lua | 26 +- 22 files changed, 1429 insertions(+), 71 deletions(-) create mode 100644 metamod/CMakeLists.txt create mode 100644 metamod/src/core/cbaseentity.h create mode 100644 metamod/src/core/framework.h create mode 100644 metamod/src/core/module.h create mode 100644 metamod/src/core/schemasystem.cpp create mode 100644 metamod/src/core/schemasystem.h create mode 100644 metamod/src/core/virtual.h create mode 100644 metamod/vendor/funchook/LICENSE create mode 100644 metamod/vendor/funchook/README.md create mode 100644 metamod/vendor/funchook/include/funchook.h create mode 100644 metamod/vendor/funchook/lib/distorm.lib create mode 100644 metamod/vendor/funchook/lib/funchook.lib create mode 100644 metamod/vendor/funchook/lib/libdistorm.a create mode 100644 metamod/vendor/funchook/lib/libfunchook.a diff --git a/.gitignore b/.gitignore index e69de29..358eed5 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,3 @@ +metamod/.idea +metamod/build +metamod/cmake-build-debug \ No newline at end of file diff --git a/metamod/AMBuildScript b/metamod/AMBuildScript index 7447a45..8b3dda0 100644 --- a/metamod/AMBuildScript +++ b/metamod/AMBuildScript @@ -111,7 +111,7 @@ def ResolveEnvPath(env, folder): head, tail = os.path.split(head) return None -def Normalize(path): +def Normalize(path): return os.path.abspath(os.path.normpath(path)) class MMSPluginConfig(object): @@ -181,25 +181,25 @@ class MMSPluginConfig(object): if len(self.sdks) < 1 and len(sdk_list): raise Exception('No SDKs were found, nothing to build.') - + if len(self.sdks) > 1: raise Exception('Only one sdk at a time is supported, for multi-sdk approach use loader based solution.') - - if builder.options.mms_path: - self.mms_root = builder.options.mms_path - else: + + if builder.options.mms_path: + self.mms_root = builder.options.mms_path + else: self.mms_root = ResolveEnvPath('MMSOURCE20', 'mmsource-2.0') - if not self.mms_root: + if not self.mms_root: self.mms_root = ResolveEnvPath('MMSOURCE112', 'mmsource-1.12') - if not self.mms_root: + if not self.mms_root: self.mms_root = ResolveEnvPath('MMSOURCE111', 'mmsource-1.11') - if not self.mms_root: + if not self.mms_root: self.mms_root = ResolveEnvPath('MMSOURCE110', 'mmsource-1.10') - if not self.mms_root: + if not self.mms_root: self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'metamod-source') - if not self.mms_root: + if not self.mms_root: self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'mmsource-central') - if not self.mms_root or not os.path.isdir(self.mms_root): + if not self.mms_root or not os.path.isdir(self.mms_root): raise Exception('Could not find a source copy of Metamod:Source') self.mms_root = Normalize(self.mms_root) @@ -239,19 +239,19 @@ class MMSPluginConfig(object): if cxx.version == 'apple-clang-6.0' or cxx.version == 'clang-3.4': cxx.cxxflags += ['-std=c++1y'] else: - cxx.cxxflags += ['-std=c++14'] + cxx.cxxflags += ['--std=c++2a', '-Wno-error'] if (cxx.version >= 'gcc-4.0') or cxx.family == 'clang': cxx.cflags += ['-fvisibility=hidden'] cxx.cxxflags += ['-fvisibility-inlines-hidden'] cxx.cxxflags += [ '-fno-exceptions', - '-fno-rtti', + #'-fno-rtti', '-fno-threadsafe-statics', '-Wno-non-virtual-dtor', - '-Wno-overloaded-virtual', + '-Wno-overloaded-virtual' ] if (cxx.version >= 'gcc-4.7' or cxx.family == 'clang'): - cxx.cxxflags += ['-Wno-delete-non-virtual-dtor'] + cxx.cxxflags += ['-Wno-delete-non-virtual-dtor', '-std=c++2a'] if cxx.family == 'gcc': cxx.cflags += ['-mfpmath=sse'] if cxx.family == 'clang': @@ -264,7 +264,7 @@ class MMSPluginConfig(object): cxx.cxxflags += ['-Wno-deprecated-register'] else: cxx.cxxflags += ['-Wno-deprecated'] - + # Work around SDK warnings. if cxx.version >= 'clang-10.0' or cxx.version >= 'apple-clang-12.0': cxx.cflags += [ @@ -274,10 +274,11 @@ class MMSPluginConfig(object): elif cxx.like('msvc'): if builder.options.debug == '1': - cxx.cflags += ['/MTd'] + cxx.cflags += ['/MDd'] cxx.linkflags += ['/NODEFAULTLIB:libcmt'] else: cxx.cflags += ['/MT'] + cxx.linkflags += ['/NODEFAULTLIB:libcmt'] cxx.defines += [ '_CRT_SECURE_NO_DEPRECATE', '_CRT_SECURE_NO_WARNINGS', @@ -288,7 +289,7 @@ class MMSPluginConfig(object): '/Zi', ] cxx.cxxflags += ['/TP'] - + cxx.linkflags += [ '/SUBSYSTEM:WINDOWS', 'kernel32.lib', @@ -316,7 +317,7 @@ class MMSPluginConfig(object): # Debugging if builder.options.debug == '1': - cxx.defines += ['DEBUG', '_DEBUG'] + cxx.defines += ['DEBUG', '_DEBUG', '_ITERATOR_DEBUG_LEVEL=0'] if cxx.behavior == 'gcc': cxx.cflags += ['-g3'] elif cxx.behavior == 'msvc': @@ -354,7 +355,7 @@ class MMSPluginConfig(object): '-lc++', ] elif cxx.target.platform == 'windows': - cxx.defines += ['WIN32', '_WINDOWS'] + cxx.defines += ['WIN32', '_WINDOWS', 'SUBHOOK_STATIC'] # Finish up. # Custom defines here @@ -366,7 +367,7 @@ class MMSPluginConfig(object): compiler = cxx.clone() mms_core_path = os.path.join(self.mms_root, 'core') compiler.cxxincludes += [ - os.path.join(mms_core_path), + os.path.join(mms_core_path), os.path.join(mms_core_path, 'sourcehook'), os.path.join(context.currentSourcePath), ] @@ -385,6 +386,8 @@ class MMSPluginConfig(object): paths.append(['public', 'game', 'server']) paths.append(['game', 'shared']) paths.append(['common']) + paths.append(['public', 'entity2']) + paths.append(['game', 'server']) compiler.defines += ['SOURCE_ENGINE=' + sdk.code] if sdk.name in ['sdk2013', 'bms', 'pvkii'] and compiler.like('gcc'): @@ -400,16 +403,16 @@ class MMSPluginConfig(object): compiler.defines += ['COMPILER_MSVC32'] elif compiler.target.arch == 'x86_64': compiler.defines += ['COMPILER_MSVC64'] - + if compiler.version >= 1900: compiler.linkflags += ['legacy_stdio_definitions.lib'] else: compiler.defines += ['COMPILER_GCC'] - + if compiler.target.arch == 'x86_64': compiler.defines += ['X64BITS', 'PLATFORM_64BITS'] - if sdk.name in ['css', 'hl2dm', 'dods', 'sdk2013', 'bms', 'tf2', 'l4d', 'nucleardawn', 'l4d2', 'dota', 'cs2', 'pvkii']: + if sdk.name in ['css', 'hl2dm', 'dods', 'sdk2013', 'bms', 'tf2', 'l4d', 'nucleardawn', 'l4d2', 'pvkii']: if compiler.target.platform in ['linux', 'mac']: compiler.defines += ['NO_HOOK_MALLOC', 'NO_MALLOC_OVERRIDE'] @@ -434,7 +437,7 @@ class MMSPluginConfig(object): def HL2Library(self, context, compiler, name, sdk): compiler = self.HL2Compiler(context, compiler, sdk) - + if compiler.target.platform == 'linux': if sdk.name == 'episode1': lib_folder = os.path.join(sdk.path, 'linux_sdk') @@ -466,7 +469,7 @@ class MMSPluginConfig(object): compiler.postlink += [os.path.join(lib_folder, 'interfaces.a')] else: compiler.postlink += [os.path.join(lib_folder, 'interfaces_i486.a')] - + if sdk.name == 'bms': compiler.postlink += [os.path.join(lib_folder, 'mathlib.a')] @@ -525,4 +528,4 @@ BuildScripts = [ 'PackageScript', ] -builder.Build(BuildScripts, { 'MMSPlugin': MMSPlugin }) +builder.Build(BuildScripts, { 'MMSPlugin': MMSPlugin }) \ No newline at end of file diff --git a/metamod/AMBuilder b/metamod/AMBuilder index 598f306..d78759a 100644 --- a/metamod/AMBuilder +++ b/metamod/AMBuilder @@ -15,15 +15,33 @@ for sdk_name in MMSPlugin.sdks: binary = MMSPlugin.HL2Library(builder, cxx, MMSPlugin.plugin_name, sdk) + binary.compiler.cxxincludes += [ + os.path.join(builder.sourcePath, 'vendor', 'funchook', 'include'), + ] + + if binary.compiler.target.platform == 'linux': + binary.compiler.postlink += [ + os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', 'libfunchook.a'), + os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', 'libdistorm.a'), + ] + elif binary.compiler.target.platform == 'windows': + binary.compiler.postlink += [ + os.path.join('psapi.lib'), + os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', 'funchook.lib'), + os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', 'distorm.lib'), + ] + binary.sources += [ - './src/wst.cpp', + 'src/wst.cpp', + 'src/core/schemasystem.cpp' ] if sdk_name in ['dota', 'cs2']: binary.sources += [ - os.path.join(sdk.path, 'tier1', 'convar.cpp'), - os.path.join(sdk.path, 'public', 'tier0', 'memoverride.cpp'), - ] + os.path.join(sdk.path, 'public', 'tier0', 'memoverride.cpp'), + os.path.join(sdk.path, 'tier1', 'convar.cpp') + ] + if cxx.target.arch == 'x86': binary.sources += ['sourcehook/sourcehook_hookmangen.cpp'] diff --git a/metamod/CMakeLists.txt b/metamod/CMakeLists.txt new file mode 100644 index 0000000..d17dca8 --- /dev/null +++ b/metamod/CMakeLists.txt @@ -0,0 +1,38 @@ +cmake_minimum_required(VERSION 3.0) +project(wst) + +include_directories( + hl2sdk + hl2sdk/common + hl2sdk/game/shared + hl2sdk/game/server + hl2sdk/public + hl2sdk/public/engine + hl2sdk/public/mathlib + hl2sdk/public/tier0 + hl2sdk/public/tier1 + hl2sdk/public/entity2 + hl2sdk/public/game/server + metamod-source/core + metamod-source/core/sourcehook + vendor/funchook/include +) + +add_executable(wst + src/wst.cpp + src/wst.h + src/core/framework.h + src/core/module.h + src/core/virtual.h + src/core/schemasystem.cpp + src/core/schemasystem.h + src/core/cbaseentity.h +) + +# Dummy target to integrate custom build script +add_custom_target(MetamodBuild ALL + COMMAND PowerShell.exe -File ${CMAKE_SOURCE_DIR}/local_build.ps1 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) + + + diff --git a/metamod/configure.py b/metamod/configure.py index 2ca9277..d5af115 100644 --- a/metamod/configure.py +++ b/metamod/configure.py @@ -1,39 +1,39 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et: import sys try: - from ambuild2 import run, util + from ambuild2 import run, util except: - try: - import ambuild - sys.stderr.write('It looks like you have AMBuild 1 installed, but this project uses AMBuild 2.\n') - sys.stderr.write('Upgrade to the latest version of AMBuild to continue.\n') - except: - sys.stderr.write('AMBuild must be installed to build this project.\n') - sys.stderr.write('http://www.alliedmods.net/ambuild\n') - sys.exit(1) + try: + import ambuild + sys.stderr.write('It looks like you have AMBuild 1 installed, but this project uses AMBuild 2.\n') + sys.stderr.write('Upgrade to the latest version of AMBuild to continue.\n') + except: + sys.stderr.write('AMBuild must be installed to build this project.\n') + sys.stderr.write('http://www.alliedmods.net/ambuild\n') + sys.exit(1) # Hack to show a decent upgrade message, which wasn't done until 2.2. ambuild_version = getattr(run, 'CURRENT_API', '2.1') if ambuild_version.startswith('2.1'): - sys.stderr.write("AMBuild 2.2 or higher is required; please update\n") - sys.exit(1) + sys.stderr.write("AMBuild 2.2 or higher is required; please update\n") + sys.exit(1) parser = run.BuildParser(sourcePath=sys.path[0], api='2.2') parser.options.add_argument('-n', '--plugin-name', type=str, dest='plugin_name', default=None, - help='Plugin name') + help='Plugin name') parser.options.add_argument('-a', '--plugin-alias', type=str, dest='plugin_alias', default=None, - help='Plugin alias') + help='Plugin alias') parser.options.add_argument('--hl2sdk-root', type=str, dest='hl2sdk_root', default=None, - help='Root search folder for HL2SDKs') + help='Root search folder for HL2SDKs') parser.options.add_argument('--mms_path', type=str, dest='mms_path', default=None, - help='Metamod:Source source tree folder') + help='Metamod:Source source tree folder') parser.options.add_argument('--enable-debug', action='store_const', const='1', dest='debug', - help='Enable debugging symbols') + help='Enable debugging symbols') parser.options.add_argument('--enable-optimize', action='store_const', const='1', dest='opt', - help='Enable optimization') + help='Enable optimization') parser.options.add_argument('-s', '--sdks', default='all', dest='sdks', - help='Build against specified SDKs; valid args are "all", "present", or ' - 'comma-delimited list of engine names (default: "all")') + help='Build against specified SDKs; valid args are "all", "present", or ' + 'comma-delimited list of engine names (default: "all")') parser.options.add_argument('--targets', type=str, dest='targets', default=None, help="Override the target architecture (use commas to separate multiple targets).") -parser.Configure() +parser.Configure() \ No newline at end of file diff --git a/metamod/local_build.ps1 b/metamod/local_build.ps1 index 42ce2fe..2a52a6f 100644 --- a/metamod/local_build.ps1 +++ b/metamod/local_build.ps1 @@ -11,6 +11,7 @@ $packageDir = "$buildDir\package\addons\*" # Define the target directory for the plugin $targetDir = "C:\cs2\game\csgo\addons" +$command = "C:\cs2\game\bin\win64\cs2.exe" # Check if the build directory exists, and delete it if it does @@ -33,5 +34,8 @@ if (Test-Path $packageDir) { Copy-Item -Path $packageDir -Destination $targetDir -Recurse -Force } -# Return to the root directory -Set-Location -Path $currentDir \ No newline at end of file +# Spawn a process running $command with args -dedicated +map de_dust2 +Start-Process -FilePath $command -ArgumentList "-dedicated +map de_dust2" + + + diff --git a/metamod/src/core/cbaseentity.h b/metamod/src/core/cbaseentity.h new file mode 100644 index 0000000..e934c45 --- /dev/null +++ b/metamod/src/core/cbaseentity.h @@ -0,0 +1,33 @@ +#ifndef WST_CBASEENTITY_H +#define WST_CBASEENTITY_H + +#pragma once +#include +#include +#include "schemasystem.h" + +//inline CEntityInstance* UTIL_FindEntityByClassname(CEntityInstance* pStart, const char* name) +//{ +// extern CEntitySystem* g_pEntitySystem; +// CEntityIdentity* pEntity = pStart ? pStart->m_pEntity->m_pNext : g_pEntitySystem->m_EntityList.m_pFirstActiveEntity; +// +// for (; pEntity; pEntity = pEntity->m_pNext) +// { +// if (!strcmp(pEntity->m_designerName.String(), name)) +// return pEntity->m_pInstance; +// }; +// +// return nullptr; +//} + +class SC_CBaseEntity : public CBaseEntity +{ +public: + SCHEMA_FIELD(int32_t, CBaseEntity, m_iHealth); + SCHEMA_FIELD(int32_t, CBaseEntity, m_iMaxHealth); + SCHEMA_FIELD(LifeState_t, CBaseEntity, m_lifeState); + SCHEMA_FIELD(uint8_t, CBaseEntity, m_iTeamNum); + SCHEMA_FIELD(float, CBaseEntity, m_flGravityScale); +}; + +#endif //WST_CBASEENTITY_H diff --git a/metamod/src/core/framework.h b/metamod/src/core/framework.h new file mode 100644 index 0000000..8499ef7 --- /dev/null +++ b/metamod/src/core/framework.h @@ -0,0 +1,73 @@ +#ifndef WST_FRAMEWORK_H +#define WST_FRAMEWORK_H + +#include +#include "igameevents.h" +#include "module.h" +#include "schemasystem.h" + + +#pragma once + + + +class Framework { +public: + static ICvar*& CVar() { + static ICvar* wst_CVar = nullptr; + return wst_CVar; + } + + static IFileSystem*& FileSystem() { + static IFileSystem* wst_FullFileSystem = nullptr; + return wst_FullFileSystem; + } + + static INetworkServerService*& NetworkServerService() { + static INetworkServerService* wst_NetworkServerService = nullptr; + return wst_NetworkServerService; + } + + static ISource2Server*& Source2Server() { + static ISource2Server* wst_Source2Server = nullptr; + return wst_Source2Server; + } + + static IVEngineServer2*& EngineServer() { + static IVEngineServer2* wst_EngineServer = nullptr; + return wst_EngineServer; + } + + static IGameEventManager2*& GameEventManager() { + static IGameEventManager2* wst_GameEventManager = nullptr; + return wst_GameEventManager; + } + + // ServerCModule + static CModule Server() { + static CModule wst_ServerCModule(GAMEBIN, "server"); + return wst_ServerCModule; + } + + static CModule SchemaSystemModule() { +#ifdef WIN32 + static CModule wst_SchemaSystemCModule(ROOTBIN, "schemasystem"); +#else + static CModule wst_SchemaSystemCModule(ROOTBIN, "libschemasystem"); +#endif + return wst_SchemaSystemCModule; + } + + static CSchemaSystem*& SchemaSystem() { + static CSchemaSystem* wst_SchemaSystem = nullptr; + return wst_SchemaSystem; + } + + // Disable the creation of this class + Framework() = delete; + Framework(const Framework&) = delete; + Framework& operator=(const Framework&) = delete; +}; + + +#endif //WST_FRAMEWORK_H diff --git a/metamod/src/core/module.h b/metamod/src/core/module.h new file mode 100644 index 0000000..44bbf11 --- /dev/null +++ b/metamod/src/core/module.h @@ -0,0 +1,131 @@ +#ifndef WST_MODULE_H +#define WST_MODULE_H + +#pragma once + +#include "dbg.h" +#include "interface.h" +#include "strtools.h" +#include "metamod_oslink.h" + +#ifdef _WIN32 +#include +#endif + + +#ifdef _WIN32 +#define MODULE_PREFIX "" +#define MODULE_EXT ".dll" +#else +#define MODULE_PREFIX "lib" +#define MODULE_EXT ".so" +#endif + +#ifdef _WIN32 +#define ROOTBIN "/bin/win64/" +#define GAMEBIN "/csgo/bin/win64/" +#else +#define ROOTBIN "/bin/linuxsteamrt64/" +#define GAMEBIN "/csgo/bin/linuxsteamrt64/" +#endif + +class CModule +{ +public: + CModule(const char *path, const char *module) : + m_pszModule(module), m_pszPath(path) + { + char szModule[MAX_PATH]; + + V_snprintf(szModule, MAX_PATH, "%s%s%s%s%s", Plat_GetGameDirectory(), path, MODULE_PREFIX, m_pszModule, MODULE_EXT); + + m_hModule = dlmount(szModule); + + if (!m_hModule) + Error("Could not find %s\n", szModule); + +#ifdef _WIN32 + MODULEINFO m_hModuleInfo; + GetModuleInformation(GetCurrentProcess(), m_hModule, &m_hModuleInfo, sizeof(m_hModuleInfo)); + + m_base = (void *)m_hModuleInfo.lpBaseOfDll; + m_size = m_hModuleInfo.SizeOfImage; +#else + if (int e = GetModuleInformation(szModule, &m_base, &m_size)) + Error("Failed to get module info for %s, error %d\n", szModule, e); +#endif + } + + void *FindSignature(const byte *pData, size_t length) + { + unsigned char *pMemory; + void *return_addr = nullptr; + + pMemory = (byte *)m_base; + + for (size_t i = 0; i < m_size; i++) + { + size_t Matches = 0; + while (*(pMemory + i + Matches) == pData[Matches] || pData[Matches] == '\x2A') + { + Matches++; + if (Matches == length) + return_addr = (void *)(pMemory + i); + } + } + + return return_addr; + } + + // Will break with string containing \0 !!! + void *FindSignature(const byte *pData) + { + size_t iSigLength = V_strlen((const char *)pData); + + return FindSignature(pData, iSigLength); + } + + static byte *ConvertToByteArray(const char *str, size_t *outLength) { + size_t len = strlen(str) / 4; // Every byte is represented as \xHH + byte *result = (byte *)malloc(len); + + for (size_t i = 0, j = 0; i < len; ++i, j += 4) { + sscanf(str + j, "\\x%2hhx", &result[i]); + } + + *outLength = len; + return result; + } + + void *FindSignature(const char *pData) + { + size_t iSigLength; + byte *pByteArray = ConvertToByteArray(pData, &iSigLength); + + void *result = FindSignature(pByteArray, iSigLength); + + free(pByteArray); + + return result; + } + + void *FindInterface(const char *name) { + CreateInterfaceFn fn = (CreateInterfaceFn)dlsym(m_hModule, "CreateInterface"); + + if (!fn) Error("Could not find CreateInterface in %s\n", m_pszModule); + + void *pInterface = fn(name, nullptr); + + if (!pInterface) Error("Could not find %s in %s\n", name, m_pszModule); + + return pInterface; + } + + + const char *m_pszModule; + const char* m_pszPath; + HINSTANCE m_hModule; + void* m_base; + size_t m_size; +}; +#endif //WST_MODULE_H diff --git a/metamod/src/core/schemasystem.cpp b/metamod/src/core/schemasystem.cpp new file mode 100644 index 0000000..418463c --- /dev/null +++ b/metamod/src/core/schemasystem.cpp @@ -0,0 +1,48 @@ +#include "schemasystem.h" +#include "virtual.h" +#include + +void CSchemaSystemTypeScope::FindDeclaredClass(SchemaClassInfoData_t*& pClassInfo, const char* pszClassName) +{ +#if WIN32 + CallVFunc(this, pClassInfo, pszClassName); +#else + pClassInfo = CallVFunc(this, pszClassName); +#endif +} + +CSchemaSystemTypeScope* CSchemaSystem::FindTypeScopeForModule(const char* szpModuleName) +{ + return CallVFunc(this, szpModuleName, nullptr); +} + +CSchemaSystemTypeScope* CSchemaSystem::GetServerTypeScope() +{ +#if WIN32 + static CSchemaSystemTypeScope* pServerTypeScope = FindTypeScopeForModule("server.dll"); +#else + static CSchemaSystemTypeScope* pServerTypeScope = FindTypeScopeForModule("libserver.so")); +#endif + + return pServerTypeScope; +} + +int32_t CSchemaSystem::GetServerOffset(const char* pszClassName, const char* pszPropName) +{ + SchemaClassInfoData_t* pClassInfo = nullptr; + GetServerTypeScope()->FindDeclaredClass(pClassInfo, pszClassName); + if (pClassInfo) + { + for (int i = 0; i < pClassInfo->m_iFieldsCount; i++) + { + auto& pFieldData = pClassInfo->m_pFieldsData[i]; + + if (std::strcmp(pFieldData.m_pszName, pszPropName) == 0) + { + return pFieldData.m_iOffset; + } + } + } + + return -1; +} \ No newline at end of file diff --git a/metamod/src/core/schemasystem.h b/metamod/src/core/schemasystem.h new file mode 100644 index 0000000..26a0bf2 --- /dev/null +++ b/metamod/src/core/schemasystem.h @@ -0,0 +1,64 @@ +#ifndef WST_SCHEMASYSTEM_H +#define WST_SCHEMASYSTEM_H + +#ifdef _WIN32 +#pragma once +#endif + +#include +#include + +struct SchemaClassFieldData_t +{ + const char* m_pszName; // 0x0000 + void* m_pSchemaType; // 0x0008 + int32_t m_iOffset; // 0x0010 + int32_t m_iMetaDataSize; // 0x0014 + void* m_pMetaData; // 0x0018 +}; + +struct SchemaClassInfoData_t +{ + char pad_0x0000[0x8]; // 0x0000 + + const char* m_pszName; // 0x0008 + const char* m_pszModule; // 0x0010 + + int m_iSize; // 0x0018 + int16_t m_iFieldsCount; // 0x001C + + int16_t m_iStaticSize; // 0x001E + int16_t m_iMetadataSize; // 0x0020 + int16_t m_iUnk1; // 0x0022 + int16_t m_iUnk2; // 0x0024 + int16_t m_iUnk3; // 0x0026 + + SchemaClassFieldData_t* m_pFieldsData; // 0x0028 +}; + +class CSchemaSystemTypeScope +{ +public: + void FindDeclaredClass(SchemaClassInfoData_t*& pClassInfo, const char* pszClassName); +}; + +class CSchemaSystem +{ +public: + CSchemaSystemTypeScope* FindTypeScopeForModule(const char* szpModuleName); + CSchemaSystemTypeScope* GetServerTypeScope(); + int32_t GetServerOffset(const char* pszClassName, const char* pszPropName); +}; + + + +#define SCHEMA_FIELD(type, className, propName) \ + std::add_lvalue_reference_t propName() \ + { \ + static const int32_t offset = Framework::SchemaSystem()->GetServerOffset(#className, #propName); \ + return *reinterpret_cast>(reinterpret_cast(this) + offset); \ + } + + + +#endif //WST_SCHEMASYSTEM_H diff --git a/metamod/src/core/virtual.h b/metamod/src/core/virtual.h new file mode 100644 index 0000000..25e11ad --- /dev/null +++ b/metamod/src/core/virtual.h @@ -0,0 +1,53 @@ +#ifndef WST_VIRTUAL_H +#define WST_VIRTUAL_H + +#include "platform.h" + +#define CALL_VIRTUAL(retType, idx, ...) \ + CallVirtual(idx, __VA_ARGS__) + + +template +constexpr T CallVFunc(void* pThis, Args... args) noexcept +{ + return reinterpret_cast (reinterpret_cast(pThis)[0][index])(pThis, args...); +} + +template +inline T GetVMethod(uint32 uIndex, void *pClass) +{ + if (!pClass) + { + Warning("Tried getting virtual function from a null class.\n"); + return T(); + } + + void **pVTable = *static_cast(pClass); + if (!pVTable) + { + Warning("Tried getting virtual function from a null vtable.\n"); + return T(); + } + + return reinterpret_cast(pVTable[uIndex]); +} + +template +inline T CallVirtual(uint32 uIndex, void *pClass, Args... args) +{ +#ifdef _WIN32 + auto pFunc = GetVMethod(uIndex, pClass); +#else + auto pFunc = GetVMethod(uIndex, pClass); +#endif + if (!pFunc) + { + Warning("Tried calling a null virtual function.\n"); + return T(); + } + + return pFunc(pClass, args...); +} + + +#endif //WST_VIRTUAL_H diff --git a/metamod/src/wst.cpp b/metamod/src/wst.cpp index 552a800..95cef42 100644 --- a/metamod/src/wst.cpp +++ b/metamod/src/wst.cpp @@ -1,5 +1,19 @@ +// Hack to get my IDE to work remove this before compiling +//#define COMPILER_MSVC + #include "wst.h" +#include +#include +#include +#include + +#include "core/framework.h" +#include "core/module.h" +#include "core/virtual.h" +#include "core/cbaseentity.h" + + void Message(const char *msg, ...) { va_list args; @@ -96,25 +110,70 @@ CON_COMMAND_F(wst_mm_save_record, "Save a record to disk", FCVAR_GAMEDLL | FCVAR } } +typedef void (*HostSay)(CBaseEntity*, CCommand&, bool, int, const char*); +static HostSay m_pHostSay = nullptr; + +void DetourHostSay(SC_CBaseEntity* pController, CCommand& args, bool teamonly, int unk1, +const char* unk2) +{ + IGameEvent *pEvent = Framework::GameEventManager()->CreateEvent("player_chat", true); + + if (pEvent) + { + pEvent->SetBool("teamonly", teamonly); + pEvent->SetInt("userid", pController->m_pEntity->m_EHandle.GetEntryIndex()); + pEvent->SetString("text", args[1]); + + Framework::GameEventManager()->FireEvent(pEvent, true); + } + + // if the text starts with ! or / then we don't call m_pHostSay + // check args length to prevent crash + if (*args[1] == '/' || *args[1] == '!') { + return; + } + + m_pHostSay(pController, args, teamonly, unk1, unk2); +} + bool WSTPlugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late) { PLUGIN_SAVEVARS(); Message("Plugin Loaded\n"); - // This cursed shit is required to register console commands, yay we have to set some rando ass global with some magical incarntation - // see hl2sdk/tier1/convar.cpp - GET_V_IFACE_CURRENT(GetEngineFactory, g_pCVar, ICvar, CVAR_INTERFACE_VERSION); - GET_V_IFACE_ANY(GetFileSystemFactory, g_pFullFileSystem, IFileSystem, FILESYSTEM_INTERFACE_VERSION); + GET_V_IFACE_CURRENT(GetEngineFactory, Framework::CVar(), ICvar, CVAR_INTERFACE_VERSION); + GET_V_IFACE_ANY(GetFileSystemFactory, Framework::FileSystem(), IFileSystem, FILESYSTEM_INTERFACE_VERSION); + GET_V_IFACE_ANY(GetEngineFactory, Framework::NetworkServerService(), INetworkServerService, NETWORKSERVERSERVICE_INTERFACE_VERSION); + GET_V_IFACE_ANY(GetServerFactory, Framework::Source2Server(), ISource2Server, SOURCE2SERVER_INTERFACE_VERSION); + GET_V_IFACE_CURRENT(GetEngineFactory, Framework::EngineServer(), IVEngineServer2, INTERFACEVERSION_VENGINESERVER); + + Framework::GameEventManager() = (IGameEventManager2 *)(CALL_VIRTUAL(uintptr_t, 91, Framework::Source2Server()) - 8); + Framework::SchemaSystem() = (CSchemaSystem*)Framework::SchemaSystemModule().FindInterface(SCHEMASYSTEM_INTERFACE_VERSION); + + // https://github.com/Source2ZE/CS2Fixes/blob/main/gamedata/cs2fixes.games.txt + // For now only detour HostSay on windows, for linux tell people to use CounterStrikeSharp +#ifdef WIN32 + m_pHostSay = (HostSay)Framework::Server().FindSignature(R"(\x44\x89\x4C\x24\x2A\x44\x88\x44\x24\x2A\x55\x53\x56\x57\x41\x54\x41\x55)"); + auto m_hook = funchook_create(); + funchook_prepare(m_hook, (void**)&m_pHostSay, (void*)&DetourHostSay); + funchook_install(m_hook, 0); +#else + // m_pHostSay = (HostSay)Framework::Server().FindSignature(R"(\x55\x48\x89\xE5\x41\x57\x49\x89\xFF\x41\x56\x41\x55\x41\x54\x4D\x89\xC4)"); +#endif // Call register convars + g_pCVar = Framework::CVar(); // set magic global for metamod ConVar_Register(FCVAR_GAMEDLL | FCVAR_HIDDEN); return true; } + bool WSTPlugin::Unload(char *error, size_t maxlen) { + ConVar_Unregister(); + return true; } @@ -128,8 +187,10 @@ bool WSTPlugin::Unpause(char *error, size_t maxlen) return true; } + void WSTPlugin::AllPluginsLoaded() { + } const char *WSTPlugin::GetLicense() diff --git a/metamod/src/wst.h b/metamod/src/wst.h index 2b6c612..efed027 100644 --- a/metamod/src/wst.h +++ b/metamod/src/wst.h @@ -1,24 +1,29 @@ #pragma once #include +#include +#include "igameevents.h" + class WSTPlugin : public ISmmPlugin, public IMetamodListener { public: - bool Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool late); - bool Unload(char* error, size_t maxlen); - bool Pause(char* error, size_t maxlen); - bool Unpause(char* error, size_t maxlen); + bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late); + bool Unload(char *error, size_t maxlen); + bool Pause(char *error, size_t maxlen); + bool Unpause(char *error, size_t maxlen); void AllPluginsLoaded(); +// void Hook_StartupServer(const GameSessionConfiguration_t &config, ISource2WorldSession *, const char *); + public: - const char* GetAuthor(); - const char* GetName(); - const char* GetDescription(); - const char* GetURL(); - const char* GetLicense(); - const char* GetVersion(); - const char* GetDate(); - const char* GetLogTag(); + const char *GetAuthor(); + const char *GetName(); + const char *GetDescription(); + const char *GetURL(); + const char *GetLicense(); + const char *GetVersion(); + const char *GetDate(); + const char *GetLogTag(); }; extern WSTPlugin g_WSTPlugin; \ No newline at end of file diff --git a/metamod/vendor/funchook/LICENSE b/metamod/vendor/funchook/LICENSE new file mode 100644 index 0000000..2da840d --- /dev/null +++ b/metamod/vendor/funchook/LICENSE @@ -0,0 +1,360 @@ +Funchook is distributed under the terms of the GNU General Public +License version 2 or later with the following clarification and +special exception. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from or +based on this library. If you modify this library, you must extend this +exception to your version of the library. + +===================================================================== + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/metamod/vendor/funchook/README.md b/metamod/vendor/funchook/README.md new file mode 100644 index 0000000..419021f --- /dev/null +++ b/metamod/vendor/funchook/README.md @@ -0,0 +1,273 @@ +Funchook - an API hook library +============================== + +[![tests](https://github.com/kubo/funchook/actions/workflows/run-tests.yml/badge.svg?branch=master)](https://github.com/kubo/funchook/actions/workflows/run-tests.yml) + +This library depends on one of the following disassemblers. + +On x86_64 and x86 +* [diStorm3][] (default) +* [zydis][] (when `-DFUNCHOOK_DISASM=zydis` is passed to the `cmake` command) +* [capstone][] (when `-DFUNCHOOK_DISASM=capstone` is passed to the `cmake` command) + +On arm64 +* [capstone][] + +TODO +---- + +* write documents. + +News +---- + +### 2.0.0 (20XX-XX-XX) + +* Add `funchook_prepare_with_params()` to support prehook. +* Add `funchook_get_arg()` to get arguments in prehook. + +### 1.1.1 (2022-10-02) + +* More permissive check for page allocation mmap ([#25][]) +* Flush instruction cache for arm64. It does nothing for intel CPU. +* Disassember engine + * Upgrade capstone to 4.0.2 + * Upgrade distorm to 3.5.2 +* CMake + * Allow user to specify FUNCHOOK_CPU explicitly ([#19][]) + * Avoid polluting global include and link dirs ([#20][]) + * Use target based compile options for gcc's -Wall ([#21][]) + * Use ExternalProject_add to download captone only ([#30][]) + * Add option FUNCHOOK_INSTALL ([#31][]) + * Use "FUNCHOOK_CPU MATCHES " ([#32][]) +* Documentation + * added example usage from python ([#22][]) +* Fix tests on Android ([#29][]) + +### 1.1.0 (2020-03-22) + +* Arm64 Linux support. [capstone][] is used as the disassembler library on arm64. +* Options to use [zydis][] and [capstone][] as a disassembler library on x86_64 and x86. +* `extern "C"` was added in funchook.h for C++. ([#15][]) +* Libc-compatible functions were removed to simplify code. + +### 1.0.0 (2020-01-19) + +* [diStorm3][] is used as the disassembler library. +* Libc-compatible functions were implemented on Linux in order not to hook function calls issued by funchook itself. + +Supported Platforms +------------------- + +* Linux x86_64 +* Linux x86 +* Linux arm64 (since 1.1.0) +* macOS x86_64 (Functions in executables cannot be hooked when Xcode version >= 11.0. (*1)) +* Windows x64 (except C-runtime functions under [Wine][]) +* Windows 32-bit + +*1 [`mprotect`] fails with EACCES. + +Unsupported Platforms +--------------------- + +* macOS arm64 (*1) + +*1 I received a mail that [`mprotect`] failed with `EINVAL`. Apple seems to prevent executable memory regions from being writable. + +Compilation and installation +----------- + +### Unix + +```shell +$ git clone --recursive https://github.com/kubo/funchook.git +$ mkdir build +$ cd build +$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/path/to/install/directory ../funchook +$ make +$ make install +``` + +* Available [`CMAKE_BUILD_TYPE`][] values are empty(default), `Debug`, `Release`, `RelWithDebInfo`(release build with debug information) and `MinSizeRel`. +* When [`CMAKE_INSTALL_PREFIX`][] isn't set, funchook is installed at `/usr/local`. + + installed files: + * `${CMAKE_INSTALL_PREFIX}/include/funchook.h` (header file) + * `${CMAKE_INSTALL_PREFIX}/lib/libfunchook.so` (symbolic link to `libfunchook.so.1`) + * `${CMAKE_INSTALL_PREFIX}/lib/libfunchook.so.1` ([soname][]; symbolic link to `libfunchook.so.1.1.0`) + * `${CMAKE_INSTALL_PREFIX}/lib/libfunchook.so.1.1.0` (shared library) + * `${CMAKE_INSTALL_PREFIX}/lib/libfunchook.a` (static library) + +### Windows + +Here is an example to compile funchook with Visual Studio 2017 Win64. +Change the argument of `-G` to use other compilers. + +```shell +$ git clone --recursive https://github.com/kubo/funchook.git +$ mkdir build +$ cd build +$ cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_INSTALL_PREFIX=c:\path\to\install\directory ..\funchook +$ cmake --build . --config Release --target INSTALL +``` + +* Available `-G` arguments (generators) are listed in the output of `cmake --help`. +* Available `--config` arguments are `Debug`(default), `Release`, `RelWithDebInfo` and `MinSizeRel`. +* When [`CMAKE_INSTALL_PREFIX`][] isn't set, funchook is installed at `c:\Program Files\funchook`. + + installed files: + * `${CMAKE_INSTALL_PREFIX}\include\funchook.h` (header file) + * `${CMAKE_INSTALL_PREFIX}\bin\funchook.dll` (shared library) + * `${CMAKE_INSTALL_PREFIX}\bin\funchook.pdb` (debug file for `funchook.dll` when `--config` is `Debug` or `RelWithDebInfo`) + * `${CMAKE_INSTALL_PREFIX}\lib\funchook.lib` (static library) + * `${CMAKE_INSTALL_PREFIX}\lib\funchook_dll.lib` (import library for `funchook.dll`) + +Example +------- + +```c +static ssize_t (*send_func)(int sockfd, const void *buf, size_t len, int flags); +static ssize_t (*recv_func)(int sockfd, void *buf, size_t len, int flags); + +static ssize_t send_hook(int sockfd, const void *buf, size_t len, int flags); +{ + ssize_t rv; + + ... do your task: logging, etc. ... + rv = send_func(sockfd, buf, len, flags); /* call the original send(). */ + ... do your task: logging, checking the return value, etc. ... + return rv; +} + +static ssize_t recv_hook(int sockfd, void *buf, size_t len, int flags); +{ + ssize_t rv; + + ... do your task: logging, etc. ... + rv = recv_func(sockfd, buf, len, flags); /* call the original recv(). */ + ... do your task: logging, checking received data, etc. ... + return rv; +} + +int install_hooks() +{ + funchook_t *funchook = funchook_create(); + int rv; + + /* Prepare hooking. + * The return value is used to call the original send function + * in send_hook. + */ + send_func = send; + rv = funchook_prepare(funchook, (void**)&send_func, send_hook); + if (rv != 0) { + /* error */ + ... + } + + /* ditto */ + recv_func = recv; + rv = funchook_prepare(funchook, (void**)&recv_func, recv_hook); + if (rv != 0) { + /* error */ + ... + } + + /* Install hooks. + * The first 5-byte code of send() and recv() are changed respectively. + */ + rv = funchook_install(funchook, 0); + if (rv != 0) { + /* error */ + ... + } +} + +``` + +Example - Using Python ctypes +----------------------------- +```python +# should work on python 2.7/3 windows/linux + +# load funchook +import ctypes +fh_lib = ctypes.cdll.LoadLibrary('/path/to/funchook/dll/or/so') + +# define signatures +funchook_create = fh_lib.funchook_create +funchook_create.restype = ctypes.c_void_p +funchook_create.argtypes = [] + +funchook_prepare = fh_lib.funchook_prepare +funchook_prepare.restype = ctypes.c_ssize_t +funchook_prepare.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p] + +funchook_install = fh_lib.funchook_install +funchook_install.restype = ctypes.c_ssize_t +funchook_install.argtypes = [ctypes.c_void_p, ctypes.c_int] + +PySys_WriteStdout = ctypes.pythonapi.PySys_WriteStdout +PySys_WriteStdout.restype = None +PySys_WriteStdout.argtypes=[ctypes.c_char_p] + +# must keep those references alive, or stuff will be GC'd and weird errors will occur +global orig_write, hook, orig_write_ptr + +# create hook (this function will replace the original function) +hook_type = ctypes.PYFUNCTYPE(None, ctypes.c_char_p) +orig_write = None +def hook_impl(msg): + print('about to write: ' + str(msg)) # do what we want + orig_write(msg) # call the original function + +hook = hook_type(hook_impl) + +fh = funchook_create() +# create a pointer object with the function address +orig_write_ptr = ctypes.c_void_p(ctypes.c_void_p.from_address(ctypes.addressof(PySys_WriteStdout)).value) +# orig_write_ptr.value will get a ptr to the original PySys_WriteStdout and PySys_WriteStdout will now point to the hook +ret = funchook_prepare(fh, ctypes.addressof(orig_write_ptr), hook) +assert not ret, 'ret is ' + str(ret) +ret = funchook_install(fh, 0) +assert not ret, 'ret is ' + str(ret) +orig_write = hook_type.from_address(ctypes.addressof(orig_write_ptr)) +PySys_WriteStdout(b'hi there\n') +``` + +License +------- + +GPLv2 or later with a [GPL linking exception][]. + +You can use funchook in any software. Though funchook is licensed under +the GPL, it doesn't affect outside of funchook due to the linking exception. +You have no need to open your souce code under the GPL except funchook itself. + +If you modify funchook itself and release it, the modifed part must be +open under the GPL with or without the linking exception because funchook +itself is under the GPL. + +[diStorm3][] and [capstone][] are released under the 3-clause BSD license. +[zydis][] is released under the MIT license. They are compatible with the GPL. + +[GPL linking exception]: https://en.wikipedia.org/wiki/GPL_linking_exception +[diStorm3]: https://github.com/gdabah/distorm/ +[zydis]: https://github.com/zyantific/zydis +[capstone]: https://github.com/aquynh/capstone +[Wine]: https://www.winehq.org/ +[`CMAKE_BUILD_TYPE`]: https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html +[`CMAKE_INSTALL_PREFIX`]: https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html +[soname]: https://en.wikipedia.org/wiki/Soname +[#15]: https://github.com/kubo/funchook/issues/15 +[#19]: https://github.com/kubo/funchook/pull/19 +[#20]: https://github.com/kubo/funchook/pull/20 +[#21]: https://github.com/kubo/funchook/pull/21 +[#22]: https://github.com/kubo/funchook/pull/22 +[#25]: https://github.com/kubo/funchook/pull/25 +[#29]: https://github.com/kubo/funchook/pull/29 +[#30]: https://github.com/kubo/funchook/pull/30 +[#31]: https://github.com/kubo/funchook/pull/31 +[#32]: https://github.com/kubo/funchook/pull/32 +[`mprotect`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/mprotect.2.html diff --git a/metamod/vendor/funchook/include/funchook.h b/metamod/vendor/funchook/include/funchook.h new file mode 100644 index 0000000..5c6ed34 --- /dev/null +++ b/metamod/vendor/funchook/include/funchook.h @@ -0,0 +1,167 @@ +/* + * This file is part of Funchook. + * https://github.com/kubo/funchook + * + * Funchook is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 2 of the License, or (at your + * option) any later version. + * + * As a special exception, the copyright holders of this library give you + * permission to link this library with independent modules to produce an + * executable, regardless of the license terms of these independent + * modules, and to copy and distribute the resulting executable under + * terms of your choice, provided that you also meet, for each linked + * independent module, the terms and conditions of the license of that + * module. An independent module is a module which is not derived from or + * based on this library. If you modify this library, you may extend this + * exception to your version of the library, but you are not obliged to + * do so. If you do not wish to do so, delete this exception statement + * from your version. + * + * Funchook is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with Funchook. If not, see . + */ +#ifndef FUNCHOOK_H +#define FUNCHOOK_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Only functions with FUNCHOOK_EXPORT are visible from outside of funchook.dll + * or libfunchook.so. Others are invisible. + */ +#ifdef FUNCHOOK_EXPORTS +#if defined(_WIN32) +#define FUNCHOOK_EXPORT __declspec(dllexport) +#elif defined(__GNUC__) +#define FUNCHOOK_EXPORT __attribute__((visibility("default"))) +#endif +#endif /* FUNCHOOK_EXPORTS */ +#ifndef FUNCHOOK_EXPORT +#define FUNCHOOK_EXPORT +#endif + +typedef struct funchook funchook_t; + +#define FUNCHOOK_ERROR_INTERNAL_ERROR -1 +#define FUNCHOOK_ERROR_SUCCESS 0 +#define FUNCHOOK_ERROR_OUT_OF_MEMORY 1 +#define FUNCHOOK_ERROR_ALREADY_INSTALLED 2 +#define FUNCHOOK_ERROR_DISASSEMBLY 3 +#define FUNCHOOK_ERROR_IP_RELATIVE_OFFSET 4 +#define FUNCHOOK_ERROR_CANNOT_FIX_IP_RELATIVE 5 +#define FUNCHOOK_ERROR_FOUND_BACK_JUMP 6 +#define FUNCHOOK_ERROR_TOO_SHORT_INSTRUCTIONS 7 +#define FUNCHOOK_ERROR_MEMORY_ALLOCATION 8 /* memory allocation error */ +#define FUNCHOOK_ERROR_MEMORY_FUNCTION 9 /* other memory function errors */ +#define FUNCHOOK_ERROR_NOT_INSTALLED 10 +#define FUNCHOOK_ERROR_NO_AVAILABLE_REGISTERS 11 +#define FUNCHOOK_ERROR_NO_SPACE_NEAR_TARGET_ADDR 12 + +#define FUNCHOOK_FLAG_THISCALL (1u << 0) +#define FUNCHOOK_FLAG_FASTCALL (1u << 1) + +typedef struct funchook_arg_handle funchook_arg_handle_t; + +typedef struct funchook_info { + void *original_target_func; + void *target_func; + void *trampoline_func; + void *hook_func; + void *user_data; + funchook_arg_handle_t *arg_handle; +} funchook_info_t; + +typedef void (*funchook_hook_t)(funchook_info_t *fi); + +typedef struct { + void *hook_func; + funchook_hook_t prehook; + void *user_data; + unsigned int flags; +} funchook_params_t; + +/** + * Create a funchook handle + * + * @return allocated funchook handle. NULL when out-of-memory. + */ +FUNCHOOK_EXPORT funchook_t *funchook_create(void); + +/** + * Prepare hooking + * + * @param funchook a funchook handle created by funchook_create() + * @param target_func function pointer to be intercepted. The pointer to trampoline function is set on success. + * @param hook_func function pointer which is called istead of target_func + * @return error code. one of FUNCHOOK_ERROR_*. + */ +FUNCHOOK_EXPORT int funchook_prepare(funchook_t *funchook, void **target_func, void *hook_func); + +FUNCHOOK_EXPORT int funchook_prepare_with_params(funchook_t *funchook, + void **target_func, const funchook_params_t *params); + +/** + * Install hooks prepared by funchook_prepare(). + * + * @param funchook a funchook handle created by funchook_create() + * @param flags reserved. Set zero. + * @return error code. one of FUNCHOOK_ERROR_*. + */ +FUNCHOOK_EXPORT int funchook_install(funchook_t *funchook, int flags); + +/** + * Uninstall hooks installed by funchook_install(). + * + * @param funchook a funchook handle created by funchook_create() + * @param flags reserved. Set zero. + * @return error code. one of FUNCHOOK_ERROR_*. + */ +FUNCHOOK_EXPORT int funchook_uninstall(funchook_t *funchook, int flags); + +/** + * Destroy a funchook handle + * + * @param funchook a funchook handle created by funchook_create() + * @return error code. one of FUNCHOOK_ERROR_*. + */ +FUNCHOOK_EXPORT int funchook_destroy(funchook_t *funchook); + +/** + * Get error message + * + * @param funchook a funchook handle created by funchook_create() + * @return pointer to buffer containing error message + */ +FUNCHOOK_EXPORT const char *funchook_error_message(const funchook_t *funchook); + +/** + * Set log file name to debug funchook itself. + * + * @param name log file name + * @return error code. one of FUNCHOOK_ERROR_*. + */ +FUNCHOOK_EXPORT int funchook_set_debug_file(const char *name); + +/* This function is under developemnt. It will be used by C++ template functions later. */ +FUNCHOOK_EXPORT void *funchook_arg_get_int_reg_addr(const funchook_arg_handle_t *arg_handle, int pos); + +/* This function is under developemnt. It will be used by C++ template functions later. */ +FUNCHOOK_EXPORT void *funchook_arg_get_flt_reg_addr(const funchook_arg_handle_t *arg_handle, int pos); + +/* This function is under developemnt. It will be used by C++ template functions later. */ +FUNCHOOK_EXPORT void *funchook_arg_get_stack_addr(const funchook_arg_handle_t *arg_handle, int pos); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/metamod/vendor/funchook/lib/distorm.lib b/metamod/vendor/funchook/lib/distorm.lib new file mode 100644 index 0000000000000000000000000000000000000000..746006f8646e05c9373665ef678ed62e7439e3c4 GIT binary patch literal 76378 zcmeFa34B!5`8R$}W-^&9WQI+{BHV)puq?qOXHwM6zrCCVHacHl-{_LF`|zSek0sOf zn%A#LL_oA;ef!c??W-efNxiQs7;f;@H`LZwhV*clty$Z?u6cFa`X%ifBI}x4p;BGr ztFEmHR)!PWVOF_nZT0H*Rclr+Z>{aQ_P+i*;Ug#xM zQ(H%@PHznR2-JJ)^%@bgKo2&s;Og~};OdSw>l4VgLE!MR=5_6D6sNL>=DN<-$nrI- z*Eg(dZ)ZZhB+qYx0l2U%AurTf({XHHjvSY)T(f3H=UQgLOA6aouQ{Ko<}9eJtPA<) zR_dNPxs~(EJf=KY>#MD(s;n0BqJ(^&uc{_gQyucm$(vK05Z44Ne4&bY^MrbVDK82J z=IOqHX4Z*}Yb$*7sw)E_Pea974ZdTIstr`v&aL*= zdJ>UTrMBhkBWu>JQXROYXnJIGkqg^b<#24e?5Vl4AiP7@MKIl&)i$tUSSMQ_C3y|@V{|F8!+vE z=F{WMtzTMi{`-sEaTnIKGmqJ%eAOPMpsYmgR?bONj+xfBeBI*e<*UQXFKn-GU%5Df zHM6a~WBs%>E$13D+p#*bdMDE`JaRIfRch@$X;I|(uT(JB(UX;CRQDv+l3iz=$mL99 zTW9RSH$%Tn0V4^M6Xhn=xgFzeDat!-U$LM*OyJFh9w&qB)p~VS;t;<%d$FgT!WdPfi zjv-@MvEZ{ay*|I*7-|RwE2igEhnp(v8*&B;YeU`|z1kPf(I|%xK;Hw^F;2@J^G;v9 zba`ZPWw^kk|{EmXWg8YJlg2IBLg5rXbg3^Mrg7Sjqf|i2T zg0_P8f{wzx!u-O5!otF$!s5b`!qURB!t%oA!j{6;!nVTp!j7W6qWq$QqQau0qT-^G zqSB(WqVl5VqL!l8qPC*;qK@Lc;{4)*;=;_~9=;+Epp;-sHM22q@}c_tfjoAxuvD0wWY14y``fyuQk85ptZ2IsI|DYq_woQthKzg zxwWOWwY9Cay|tq)uPwi=psld2sI9oIq^-2AtgXDQxvizGwXLnKy{)4?uRXuLpuMoY zsJ*zoq`kDgti8OwxxJ;mwY{yqy}hF&uLF(L0Y`VhSskcw2aN7O!5v84(ZNEo)2KiC z3ZL}ZdPA}2yj!_%OUP;0UE7m_{X2EnefG)@eXBRsu19wy`DQ$^?wws2is)nvJF8Ia z$v|vp;gi)d-l6Ydc^iV!-lV|h=Q>mM-7GH{<+fdc9S7{u9rnQH-p&uBaeJs|IF*M~ zf#(lI_q!^#+1>gU7VPic{N$ytS8wIJiV;0T3-(V+hdzAd3@*&{h_~2KU(y7>-I5A z`u?U@|GZoo!%O!`d zkjSc&EOcm2B%K%5{}%HpA!AhrL9pb4#JIr;zL4iS{7*YNaeH&QohEt(0kO8CJ>{G8r4Is$%UKB%*$C3%SdB z9cQJy4)M<)qbF8Mi~mIycvxDY`iPOGht>63+neMZU1bGUDC>2+l~RMk%0X5wwCr(K z)HzVO;(tN!BIy0;czPQKR%96T{P3Ig^0@On)7B2u%Yecn=yfPv8UaG@m=(GX^6q2u z`vxmCMiHy|Z>-Rk&E_{-pJCAd53gf-?3XP3|2qCl1^y2Ss9sk3A1e0$7Nb01`2PPC zhZy7F|1`V5%D+avPNetWiZ}fBb@_?x`?~UD?fAO+{NHq6&jW`4zh3J9`BY>tU0>Jk zKwD`_Mkw}rF!m=s zder5LwjzvYxKZBN^U=@R&%Y$HHu~9w$dc%1(;}tO&q^W_qMyx<43B=+=Gxo^3peIm zdZ54G_2B90eL28y3Y^+^3h)~OJNwc$=Jf9uIK_2e#SlIAWJhX6M(pv9=l6GPtr!yD zC$o85sHFA1ilpxgoYD8J9(yVp?{Ibh06J5ij-0}!msdHS5uG_B7T zO>-mOeT;?fz5?Wx2`M5^u_ivHFAFh)WXv#Y%&=fAkma>Kt@j7CK>rR{slm&C4Q>r& zxvsqGi~fFJtWLv2urKz?A7QJeM?X!vcu`mRs?o#Ix?`eV$z<9EZWjAM13=T6$1gtBN4?b^;i z-n-+I6j?#O|9u3=6dRfHpXyj$mNeEA zOLIN=#)$P=u&1IwFysBmsjde<7_l|2{M;;5q$P_Pjr8%3EHrJtNRFKU2S-o@P7JlL9^U zNgZ4Dj9~Nt?>w?AHs4-2n3N)gt_R;7vEJU1u4jI{vkT8<5yC@0+PPK$H=+lL=wU#a z0-dre2Je27)akyRjsznsb{xpaDkfVg|by-M8u;_lnE@hHs#t{?Q;ck5g9qFsEblMRj7 znXApl(i@UkN)e)Q(G#3;(K)P5oB~KhpO}phGUME%`+|QQ`uVsgKK!M11kM84zP##`?4Tzm0{E3dfZ$ziL0nAf)W)#Xopcw^+q zFN~7@C(lFZnRno2J#C=s+c-Y36W7Bta`q;4zv?{1@ZG!z-#klBy4L4oc^;yv>~5Xd zih~F8xm8D=bF))N~#NU(8w#vXWGjo^R}%FK_B{$IThaqPokK?d(9GdsQNNLzOu;ZQ6JczvfqYqAR~lo#2hl~nOXwXZzkM2MB(4+XcUWWWD2T3;<##ID z%X*zCze4EEQMzV+$DAWALq^{^CckfRj`Tfb_h0#>XTV32-|Qrb!zSu+G^Nl4;Rb0S z52y>20LRxnzSNS;gFL!GqEmgjr2lsMWApne`@d9Qk-!6ck0n(FD&Ry!)jJuHlfMa3 z1AP;s%F;#LAR$mU!xl z(ia4xhdkccwYgUzt*`LyKDQtvYm+yu{y|F8D zX%FCw?a+4|aOlzf*jRpI>pUHs=h?3Ad6@DFdqX{ob3MV>*?Ga(in3sAJ@8xl68+oy zxAetJc0qHN>&hHt=IVCfu161+L@vOcySn?3wM5S=6seHmJI$DT1p1VB{t&j@hQQ`0 zBWLPUo{DJtjHf#D9)!fE$99d|Ib&yMvg^S$_7VC+9tit}Q(#d1a$teF|@e2T>7vv^AOd)Si zyXJNI-if!8Li8ZKdX_}+Pf(%AEQ4TA#Y53gvRs#!VR`b#x>b`tq3?*JN#8(|9<{l;(=bSoZJq1N8KSYK zh{pPKuItJtk&&x=lx#e&t9!6SFp%1VOpBZ^4ZOw(hoyn9|EIryTUD;8X|9tj9QU*> zj&5{p8+c_Kpe@MvMq9`>*t#MqzCqN~?t1XRAmvlOwaVU^B69A#%kXpOaNYIbTUqN; zpf~~w4|`xx-<6{MAExH-i^9-(k$(xJv&DU|xO>Rp$gA-)VDZPaxnq%E^zAY8{ZXQy zi9BcQbZst%Yej3vrvN?dME3D)a(DF81(yaRvykun$X3eT)!iWEgqE9Vg^5aJDzxZb zpZE92{RlqXMcF-vY9oV%uI}v;@yKFf?i_Jf-QWTwlHFjA=mv-Naffu43dywpY z%5K!*aR+P%;@?e(M;+eyPA_7jk9*=B5I;<_Xne6KYk!LV079xyoPypF(NQ(@hjSrz zb??AkoE4x)j3zwgNmuv3DFJ~tDTxFTig@)IPr5cg_gR0xH?|;Gf0SJ1>)sc!`D}Z9 z<6aVtsK=hrV>>^7**EHKJ=*K`j(f*zd&jr=ISh^+@gXQZG5nV&@;pk#L_e)EhCW(< z#CkOih@K#^x4Smi)jb``a(G62opE|QCRQc76ncu(co>GMt`q+a@WA*;x{8B=PGdUh z)#4H4MCl``X713?q(;1nV#{l@Iwy+Qhx0_fx%#*rdQV1gkN!C(RBw+j!|SSg+-uv> zhY#<2^Yn*AcN&SbXz6*81->c!BK35eO1D(sjD4=n8$X3Zk11D7G33Db-%-vnv8rRg zLWT^APp4id+Cr!~g?VTZnwvUDiw^G{_lmypGi1a&)8(`(=2LI?rMZ!7g?`@w(cLQ| z6Jh6k%o6B3WZ`(aX>`j>7`*qWGI)kei)wn1Im`|B6(Ie>NERtyLN_nn=7@U!*hogM zae~g)AL>FnF*~d2*t?~Y>#-f)E$J1pj7_OEqvP#J6|2qFyPu56bYcR~$2}d}@$t)g zk8dq{ns?lOuWkRwe;w7Uk9!>XdTqUZw+n9=MXk^uqA}5T4VF$?3H68RnKJg&j<^k3 zq3)wxSK9G7=IVY2ErxKW>&ic1>+0$*L7(-_c+qv`r%3PW-Y=UHGr%8AbbvAx^TV?y znyX?X-$rJb5w6EEjCae>jy;u0PV}RtS&Kr>*`ieH0|e|OvD0z?z$p!H{{t}&i6#pzm2E|%FL(KybgqDOh>Fe={7 z`Z78&8TUD)F&(L^ak{ix#IqKbLH$BcyTCaKHAsYs+lI@K#DoR@md6NK6GFdaR0$Ik#r^ zy`hSCB39IztJrPMEt&BdNY$fjyKNjUmo<%FMiXi5Icc6gTsTx3q7hNs{RMr4m}EPHOe12d5fMQkwsqfr<+P3{Eb{10z254;6qSo~8g zmxfc_8l)bQz6~i74tHI-(njNTCx)+B-dwKkH_!|i3$E^$4G=ZJdq^wWmj+8321_I@ ze&ECYeoRgm$q}~OmR$Ip*yr`EdcUJQoYXlnv6h`m$uek+4H45>U%D7#$q1}S^2PkQ zq1ZFnr9ME9Ff?7T!Y9k+Mzu4SDv{~kvbt0asqdgz8iis=)i~q7LY3f^yOD}_<_K+% z(njB|RNCm<(B)_@@0Jdc6-L$s6)DCPqJN33C~MWCuI+(-On+$DMbxlzrkaIm5Un_F z=drzR_~u?$_a+n|nmxM18SgX#JsCUV%c!SNUx0%-H6#>{3Yl1((dM+*b9LV!+D+{1 zNaacd(c`F3I+>`pG>Y^iIPFFUj_xSyJ1u%?7A7zmK5Ac=9NjS!pFQlz>$7$3$V2~k zZQl|98&*nxH>0!x6BZ2s0RD6f2k?1XMtT!bHRRpR^NgE1oV*v^o@br znIoD{HOnjiG$zMKjY%e{Pm^Ow%`^8IDv4@woK7K+GUS;EqfYc zhIW!MnBJ$ElkX{F^sINOF-Gy21~R45#saY0U(}E8NxgJH7bQ1Pr|Wd=uH+N?h8cbE zemWX=c@KEDtl+WaECk}Ku}EVDJjK;L2qQ|ag>+;|C_-BT9vLNj*R>yrNpCO>ST7|l zL{g0F9GVulkRXQ^{BBV)P4k2I*c>$I{iD;xxbG_#BVf195&eXB4u@%KJ`)-qyn~=?B-~Jh}hADkD2CDb4~0UZdiH$sW8Qh z_VSAM8cl{hqLw^00m%Lk-7znIyJ*NyC%dlf6kYM#xTE26Tvtv*!@9aplg&HY)%^_e zkqsSFDAFn#x=P&hWOLtoL`(|4o(ofMvx`+Bv1sX=_qaBx@SNt<5G)vB(l z$o1)FIen?{EEU;B+XQ(=64$VxBGGM_!xvzsr^&k(+^QLGNtFBR!$!Fb?<1S#(*8VA zzrLTCyRqF49^ZlPCZ4RkwBx>6bh&F~mpk3neSt(+Up_INN{@QvNLTk&hI@xdm!6LD zciU|7YM4arzws^lh>`Egc@x1Jv@wdoK+F`+l$QcCCoRKjEoB%EY zZp?-`7+%4?(YOctPQl&V=f=INFAaBppB;A}oiD}fu=WOe{5gRcyE;>`GjMfZcL-iP zn(Vs#N`M~S8~-6p6Z?Jcy6hszs5xDmzXK%t9$8J}n>HOCbh^|PzqoHHDaox$BvVW{ z!5)7uwp)E;gVEi&!Pss+Ivd*%xej`}&y1uX(wn-*uFrVZb@?!4{veHF*Ds!OMIDx+ zqGgtXc3gz@RP1D^%WcM@iP4cyJJrYFx%edzkZx(MSDNjxB4~LmT4$)w=GpRw&?u#VS8kkD1eW%GvhCzoM`W-QvZvCroJXNA+(z^ z)a_7zfY#n1ugU7m-fgo}zUJe@PNb!b@%Vrw*h}0G@3Q!BNDMR-0Xw5}6#BH!&Ynj1 zlCpmxPbnLL4kppx!6Z6jqSMn1*-R6ihTXT+D>Tt-KTys+F;;Omwk{wwcI=uOdjjWhQ#d zL_fv{u`>2Juj=5GT%M8V#VYKDuVUMi8H~OEQFm?^{Nnb-_IYF8+zp}Fr{11czO}+0 zh#if%KT2}rtpa)%!;T$SM;1=2T-~$LV0b@bEzZf4JF7Pzc5UuP7Q6kWT2!Y;%3?HQ zAf{&pu+_tEg?26hY`_E2sw}&A3yWTwo8;Pj1k#Q@%rRH*@m$oA>d%V*4H9H&?=1ID zZbnD_2a2I=e6gLO*u5f~5YGE2;ou)HWMl>UdjnhbEN|>jf!H$#ke2mLHuUt}4u`k9 zMI2Y1i{o-}rt&E^1A14l+qcEf^%;jcHCXKQPF{+l=vgNat5Og5HO>%Un$2elGeLt4tI6$gIzO+ zxw@YO7f(2Gnj~Tkxoh#Y6zu*!adb{KoV1%IqZBush{J>Tp(dQ@qAj&7CaLeC0G_MJ zq3Vk(!JbVBu%NA%JhvWxVY_+C7JsoG>lQIseiJ%+3(wj5q(3>;M z0@26v#3v<-cj0BE&R>fPR%u^s7%Kg3tz1uGZ{Ht3fGOzE7^!cgkjVn|0Zjz5v1D{D z>ftu#0-7YyY9I_Gq&R-B7oQDzWA(Y7?J4*yNZ%IMcl6mjIsfqH{5?RQ4TW;+e6jud zM>~_~c$4}|*Dj|nrm9dZ9*X@-@7YkKcYS8>w0X8W0zH+*o-O&Io(p)$<@-du3gnr7 zAcB{b_D1k5j`Y5qy?T!~_Y1xEP20yWkL=BLdz1EhlU_uZx;Qt0t>X7!?f~@%@G%o3 zbv^od5{`qR@7r=}Mc2&I{>YFD*LHhpphtY6A!gs0S~;4G!AC^&;YLrTTkm?qh66B4 zii5B}xqMGlZpoOWZ+lXI4z>F0$X-3CcS~gnHP0k!9(*Pg$t|Pi@faUs?Gn|yYYXrD z>+7&YP9l7C1{>YxW}_QiY;;j38@(>;{ZsZ2+dHJ!y%tK0UI#EPdIdzj93+twVcJ~V z7$23vMn#-#R9gxg)!<;Gijvu=_ebnMb?@+AC@^{nz__U4WiAp?E~g0@KP`iu78%4& zYXfgcXQvgVvD4~DynpI`nG3ygU|h6>$Xq0%T*e8R@uJc@TNe)hUPnX8%a4bG!SCF1 z`=fO?{BF^T7os07u3o#bZFBEsd$z2(_SN-c_Vr&=_1c3sbzkke;=G&E>K>@PW_$Xg zOM{RUrfiEZFZ~&!` zRw@48{`Y9&HKS!pDs%?CoJ74P@p97iPj5^~q}r%b37r8iLWxPqENj}|_Jthgi%>sS zspQ0EeGv+K7E4*P_N47eq}r}h37r9DVJ~B;*UlgKUZJ0!kk@mH3!MS=qNnaez5K7< zzBiGICSAIOjzBJsZ{wo1$m`PcC6JU2kbD~w<3j(jyu?CNm5m!dHgp)HkJY~XdjsZM zRn}LojCW1UAD}r_uw?!6mM{HG&5~7X+SaXN#`{{wreW%ZtuM>f3tq=Yh(b<~NXDHg zp)y3iAoitfW$c{lT5s4hr_M8H&ha(m_XCAm!B^`oSrS~;ytKWdd3`&+Q<$GO;7f&H z^$uEoK~brE360)Cvx|4o{&*&1V%0$l9`7BrdlM}y(Fxu`d+QiI&vCweKYAKtms&a$ zCBb(JJ=ShTG7a=o*frq77{U8Z)!}!Ol4|QoR>^GPiV7h7Zj#Nb>j*X?=+(o_wos^$tg^ZeDkKZmAcfag z$&x869XZz4=`6XT79}yeUSAht_F#2mh&02@Ufb9ZW=V5vnQd-OEda8ftNQ>Jk%Vp) z6w*P+d@hnC%|%gjYhd79WHPtPhg*nrs+hgO7j9tog_VISX2Y*QFPb`y$3q@N`RYZ|mdsx$1vtrmBYO4qB&ad1so4^_hUklw%? zq1xIyR6d#bA}R~*VV_&M5Tdz0$?AzE1#6fME`({Q0~~>7NWo3ihRVrjwm=BRRaT=_ zDp7zf+#pbp5N?$rxFXzuTL=!Yg~B105M&|u?`;U9@$0=RRELtC$U-`W^7bvnPj5M@d<|jhC6#b(Epre< z2N1yu8ALY_!9^-oar6fvMyH}gFi@n0--*|$APk~lNCweKgckaV5TmPveQ1Pa+)*k8 zDntNfQUHFY7|Bo|$B z^J_#1@czOI{0dtQv-`!M_tSW^`zvd!(WJPe zLVgw+>^RUmmyflx*}_zM}0wX_xk)s@fp$GVbAt=1%@KZ0OXyQJUBf{v80yILsoArU8Z{1b0#1q85~>rb4Bz@iC`JU4xz}GpuPu3SSL*&*u$>iKF+`k(HD^`Uy2F ziR&?YVU+s)^*(Yr#VRGL3aUvA)ue`%h9N6-0uqChm?}m=a5A(4W+(eAq@kiTl{Sce zSyPM2r^ZLqF-`g88oO|iJsk2PDva)K4+$6|*yO91cl4xi6*TPOAl*X(hXf8+hY=g1 zy90AksIH1RnyST&5Vn$fk5@XaAP$*-Bi7>*6(L2^pk?3^3~$U|1i7hm~g`l zxH}eNI;udkEri>MH&y$Q4F;PJt5!1dYD70{s+Of7HdKo#8$2wg_;5p2kY-EV9pQOF z6vI-aWjX{Hpcu*yF)`LLCpx0v*8me!4YU9YPq4tR7|N^j7X&E;hEnSMHF{+wOR4kM z831zzO*D1>YIIVt`bzY5FwvQ4 zVZhW3ppGh>PH<&#z_e572=hou0mDwAmTvTe8muvCMxY_jg7YmHQzJ^$ zRmq|esLmu1xs$|M+0=k81(AWIEF3IAqmYacS)m|R&6JX(YZ@p&31nq!8jw^aR3AqONYz$`AI*M#A40cIs34SNZuQE|x8f`wezE3yzs93Qn=upHnO`8eK9dIl>6mkd=ay z4N9N@wx6~2h^ITvcOoDdLfGX~&crBZ8I&Bcv}91ZU@|0(@p@4&lrADAS7Bj0)!};3BPzH~NX}*LCP8s$Zi^NE!7r)vc*ds?IJo&E8`S0ijEI zdgmKCArYPsj6O|}`k9OuP%6ldEO9cekf;JNR0xbJM2spgBPCa1Q6U+hjHz5W1B{%3 zrz3I(80pGL$yHdSmGQ~66hoUB(t=T1Vx%i0C0AjQR>mh|Q4r;VQMvj;Q7)J$M?|7r z5i7VXSH!2*$vG6yS7}WNY>4rcWr~3fFOHbcoiY{KW$z9)>|b_QswUQi!wz+M%jrY>L^RdoU82*~+Da+(U2Kmp8D0U9po zf`SVTDS(C?NXZMu<|{=o{C1%ugdK1t_InHE9@i;3#Z=1}r%Z$C|nv_ce>MVc{AdwwSX)-&7grbq1lu>pvv2Q*Gsm#s*J^(X2V3nPL@Sv|` zIL0uo1CrKZE>PJS)bi#dM$;_h zUK=*@2{p)+BGZsh1_qhdFCj&4b?g4hcm_ z7%K3v38|Y4t7MCK6W)T2$`qk*vEn+DH6*oe%Ma+=! zw8}-cNTM)HD%m1ND%m1lHn2sESlMw@HnK&GfM^kArqLqi7@=V(+CdCW*&>h$uZb~& zfNTaa+>I77rD7l(En*}TEn=!v(O8!WtEiMjiy)BbPc)mzb`Wy|nIhE97BP~Fsu}^& zB4&VE1OaP{AZV7+7&b$qMG_%u5rl+kqD71VRV9&1w1}BXvYSz5&C-)Ip73T4$eq;0l{rDG+u(IQ4dxLB!(F@k{UEx6Jg zBPJsCM2jSHuMHzY*eF}X2#6LLI7XmomI2=yA=x5kNVJH`MYc$yFiR@gB1S6NBFBso zvjo{9DjV4%Mu5f$^aivDwgq+AXW$$H`yB}!b+rEw0tpA^HCIhL&^B~SovMn9&L z*Rl$+lo8A?!Ir3rCVrg0Iq4}yY(fk~gT)k@5L@lKa6L9(4(zmuiy-ZuDTtjBF>LQd zkPcOlg$PPcM=EmXrT}dQ>Cr=+cg!!K9Wq3C+!Q-x17ge9SV1Q*w7-)`iR6}#M6^@H z69Nu{;3o;}b$If_j#Dt4-r#&h<{=R6{uDq;eW6Mz0PMy?BvnIj1e>aG?t>t4s-&)5 z04{>c1++ONB@rvQJVt61hN98|AQT56+D`)G1ObjPp3BhZX)oy|=b)$4VS~UJQu4t} z3>`y*w$U}T5fz-Wq5X6Xp5RazJcer1Zdm{+5T%nq`3+q94FDgB(ZM9$9poaJS^_B$ z$|Mk}@q8px3t+FKkILY6!9r+%Z04IJhpVXlse2F?LFqZ1i^`zvJRx)<;kiap8FCmQ zh)^n?ThI{{LUnX69&o6B0ywMn@I2HWep84nNXKKH5K{o0le@$h` zM~D1^At(-1aTZSJstAg0Ka}a{m4XfMG^G`er$H_oRscsGJy-}&NFW6?9f%kJ!I2j3 zBNd=j;YZOA@SsXQRegeQ_5tMCA)f7S5#&p;rW~}f+dd5Z-aDYqD5Yi}B z!h|LruPC9K@WKn}SzHOJd&}qr2~9vH#4s>4#qfsLXk;L<1oFX`rT`PExj;uk6N;mV z#xVK|aueqWfN91kfhQAK*|R87M*)RBK!)W48bZTJ2$kiF5_J?%X_|F}(9|^RxM(5O zO&)j{RjR^7C+2!NFVV3O+KT3Uv03pC+D+O}a#qwZi06+s1mRv6ckOHXzfznWU zU|m2Lpd=~}0U*GNCX)z|Ru@3|b+ut=OR$h52|!&XKxPv@tPsmD zencOR9~hSL7+_FI#3#bEcM$1iq$OaD5t}|k4K*V*MP{u1)$Vf}T^b2AVexZO_ z`$QUKNC9h1!Y?w7;R%_@8cO(uG-=k6ezBxe`KvgyG{Y~JbTSS$TKrO&KhQ4-5Acf_ zkHq8`5pTFcL|Os~zZB+M{DMHD_GTKg#>`CyEPfGb%-V`X){w<7q9{w8rN2=A7Qcwn zOur=3slqW@bzeA$H!yI{F98W~OeO^c(xd?YiLC)6z!D%$dXGmWB|w_s2~8tFAM%N} zGU_V}3ou90@>C!ejTD?0iq9qRF@{1)g!xm6FzQ7dT%|-nN@Qxm1u0@ZL+zbS22vu@ zk|Joy^-nD4LWbF{P7h&Wr9(>t$)^P|&C$~WO_juHb|Ws94k^G?DJ7}I@R9)xNNY;q z^d`)#IPetJ%`hTFNIs*8LZE{}oKh7zq^eYaQj1C^B~dZ~)I>ho%x8A5_}r&SFbZHD zrvOy&K9bzu;h9CE)Vj(LreARcjj7bYsnS8%grIEU7y6_CtDMAmvJeX+K8~-Z2E>yQ z_7%XUm_D&H#P}eOAl^+dwIw#ihBk?V%!Q6K&v#apuLl3_4yhO|D%Y>K-TrROFD?d*JB+j?s z0t=R}JWHJ-i@eyxK8yW$IV~Z#*zdF0@3YwNv)GRb%91vL>&v{RyuMswdIP&YKTiZC z&bQzK3of+aA`31Sn0%tl7yeP^3#`l+SeY-dGGEH2`=wl(EUgq)P)p$dV zE-JUWI+1^Mbt3=j>O}t4)rtJ8s}uQGSIhj#{|i+C3X1|176m9Q3Q$-Sps*-FVNrm> zq5y@(ETXWOMd*6~C|ArP2Bv}yOa&X53N|nmY+x#w@;u98Kd@;(uxUTAX+N-OKd@;( zuxUTAX+N-OKd@;(uxUSG!+yes{e%ts2^;nkrh=&*E9+(Z0-BeU3-gtZFkfL|zNvdM zAoG!vIAO0UOJdjrULz4a{(rQ@cOQz>e-gyE0&soRcOUQ{+lmW>X5zaKwQcfuXQ|My``w4@koGOg zz;cQ2J`DW#LhRla#xDBucOSm=9{@Gvb0+K>aDDynKE#ku^?&2L4~hRU`HjB!Fc@6` zCUr48n7ym3i-KHG7fS+9f(WvNrzk9f8yO%MaZuD4KL-(QGO`OQc8Y?m3$iGPx>*!5 z`ro^Z^@2Ry?gUH4uMvZ~oKD6;z)4+BH?W&+9057vY@jG~qp-IZws;1!F7Pf7;wiiX z)QbWrSDkW(t_Nv6kn5mI#CaeOq%w`l(@@4a;Gop5RF+O*5ZU5J*qsf0Ib;m^kema% zQ}O*d#DQ29(h+%5HDO;b*PtXY4$@c!(l|gvfRnOe;~u2bpxf)zgdN0t5r^M+b9B@ug^u-AIdqaXGyI2E@;y2PF48Bo8T+IMNMvzs-1>@>`nnTblA)n(|w^ z@>{y{TLv5QA^B~P_#!mpnTpdKNpg1ydIES_iqAuQ5V|q(!2xGBdx7yGVkKvM=!jFO z&uko~_|V}aWLWV*m~}OljPx#4PI8ap_#%gpcPVaH{6@w1gQH%eo~W1L@Q<(qeieMU z3J*8JUWb$ir2WIssFGn-pW#(!h%g^CMDSDSj(VjsT0=QMRRkIFeiGn2jxQ=sF`N&j zZ#{w!6JJ_Ga}1T?LBj;k8ZP|7M<_n@l;Qt|C48jfXa`Xbw1eP7)205%L6Q$0o=*Pb zBZm(X9Pu*!Aj!G>XR3UZP1-*QV-}MZ{76?4ch8jd9+WS>zoz62-x`&A@|&tjR4-f( zaP($y^drF$k9sF(>Pw_UV9CSuMC+}T z+bB8JQ(PHoEI@!~PZ9g1joDKbFPuX1joF1$1=r{fy&Uu-jiuO#bHzQ1;{`n-?^4{Z z_>GG12iH(<4Spg{{hv7bk2v*z;$4bU|EKVcith){VP2$%9pI?A;2y0-e$_EW%_md2oX^34S^>NlyA_8u=&7{PU7k{s@yk!a|?qB7dcqulh>?_tH|uiF3(?{|Y$#DZ&9I zmwqkea-J#@-Idu2ZL;4LA#+@|g2~=&a88^{F3K;M98mIrl1sY^PFLlFi}FwR%JNTF z<%3JPEdLDjGF(Z;;vX9jAEm;?SW zU==DK$)WF~d=lpI`zM@l|}Vo^@1Y@dvo z;UWqTQamGP!59iBEAGf?RN*GU9kb5PrFi%391(WUDOJ2&@|-aXWO~URIb#}CxQV!9 zR_@uv-E+p2Dqb$QN9LcLBlB_O$Z(3T%BfI%)*@Mc&KQv{S#ifK8Fp7H`xSRoOj7z% zo}%iVTp1Sj8r(5CB*TisZs959FF3-&-gH%7`mEeaVRvPd@LzJ}0>K@V8|gO>Sn}j1 z!5y;}W=p-sG1TD6m4+XsU){50*zFxFR?1|>9ll(V-d(Buuef8@Vp*SAXG?!q){AoO zm9ic2O-LE`%lbHG1y#GK_$tYhtE4|16_UF(vJwlXm`%_=!8CDJmN_?XEXmX7jTQN% z2SdWH%t{pwDXz(SWNKqXJ7+5Yr}&FRK6d{Y!O>1Z%Fmrs6ee!3mi>^|u-O#mwTjmT zoF0VJ=F>cgbtO;nN|Iw7*2{fZW;o!~*}aT6sCHM}(V+a+p#0sa`az@WM^&}5-KuIu zy&O$SzMxpPLzQd~$HFnP9hAS4n^Zn$vFT(V#*yfUnciZVk9Vx>2eYIf+#!`;Nag2K z`Kk6w&MA`pxUxi~PnlII+gHUqLdDWf2G&|nqSX0xt#A7!zf%y-x9xv!IHkM zxXRC|+Qq5rld8gLvr1LJDxW~<-LqyWuKI`Sx2dWhrdBoxdsAmgZj8IsoEb_kxw~SL z94EmUvfrrjI9QG6!K(bBvt&6#m3%1ei*WHAuSl1M{e=t%WVk}jLroK$cq zr>cH#)YDltW-g^qT{xzWxVvi1JQbcV!b@cTOs!D;v&sznMSR5sF|WC+YGnPE$nlk` z{5VAQpCKxorua}bzJ{K|izy#_DR#EF9L-~Mh`U?pf8#KgS<1xx!skftR`XP5t6#+P z7PWq~$?=;(zgojVNg({&GiC=RgB;igq~Q4)zgfgmL200L5Pru9KZh}jWg^~%|83+3 z4F(MX4FwGY4Ttm;{JB^zP%h$g5uc0rT*T*Mr|!mTata&4CbN;CQJ~SF(?DZDW5r&t z5Ox*9F8nwF$PP*djb&v_!`hY&$^nf7<$}h8CSc8%-6x|nQKyqp9y=Rb+7>*vEW^{>8q~(kia{mpBDB^;s96_gfi5+1-yq=BXVV2DskggHb1X=)E$R_f$ zK#SNJ{A|!-l>IHxw^<=y0y>A4^JY*Bo5Nc{ZAf!6YDfIZr~|*3wG_0B%>~u+<*b39 z%g*L2SPNeXTE&*})ocx4!yjG^=+$PW}_8O0}H+eUE4|E9h0pH9%0)56W!+d!e zexB`emIiVqZDGTbwzAW}$AM1)coAiBlLDJQ1BWO#~HS8+TkCLusKL`CX=?CmC(DtMsvWG#BCH;u~8T5S8b?jBp zn@K-r2SNW#`U(2fPtd1+iqd|HK6O3%)b;rL8T!=E(5G%dpSl5k>gVWFKS!Us5q;`L z^r@TBr*1-@x|tnKx|#JS{en4czhD`*Ti8(02-~ep15LF3lAQr6wEc=r2YGC_u_{ot z?RM4xI@|VZ^z%C~KEBVIZFjO|w!0AiEy8!Rb+&uh`L^G&PL#aKb}#4;EC$(C;6DKU z#I~LN+;$&`e0LA~CBkhzwH4WH=c|h#O(D)%rp;S26+fG#>1E) z9>fTI1S9HEjE-K!??C)c#P3A>F2wgD{xQTqj`-b(--Gxk5dQ??pG5p_#6N}jKOz3l zh<_UK&mjI8#6OGpKO=rG;`br`In?!ew#W87`?Ku@wh#0d+l%Z~(09d{0h;?T1iq-wEg- z>^V7&LHx;RJmODARL2ujoE6v)vr^DZ`#)HP{Ro>2TMNE|=A%yYp>upX#1Z+RGJFae0UDc( zwggQD6@sRNDnLQde9*$=_t`lor4QJ$MO&{CIQ( zW8(4-l*9l_Z858CAmjIA%k*wP(GA^V6`IX*}DV^-rhIW0i^ ziK!o}CF4sRoVPiW_;OGuKIvZVu<`W{JAVcz%u5^&#HAoE1#wQqIT4qN9ce0WVrk%M z;OYDcp22Zm&!6F${CV!;Zsz6}I0o}e9Yc7xV<_L|7{;#z{lGDt{}gnS;}rfY&~F^4 z^4~kM_ydj+{87h9z6bOy=&zu+9HV$2=tIzFAfEDlmI896jO3@LjOJrgPUGWK#_*{r zV|g)X7O)RA4|slx#?MO0<}ILeQ*!t^(8Vd^_~j|N{CnU(0KXpm7oaq}N4stkic_wH$XbfmP=uGE0UIy-Qj^{z=1U}!19l3K7KgW3n!qX5w z6X86Bi}_ESCH!X4ozCg}YUd1uXYqHPv-$hr?$p_QWNI;=m+Il+)akr3bq27`yFuRv z{S0(_>UjQ#)Cv6I)HA@RfmiUCQY-lzsb1cf>f`@T_4DCrReVfZfKN;d^1QTpygDt! z7p7J7*0dVF8sYD!&E`Kv_*R5}n^wo4#re$3;Qt2yPg(;%HNBB%r_bVg`fMIdU%=<5 z&*x_$yczg=;CF!k4*W^P?*)Gk{0Mkz#%%7&n8n9|pAN2r2Qn7$+KlLMy z;j2LpAiOJMA%7b9CE!7WX7f`)*@I^B8t}$J3;5ze^LZ=6+YtUf!q*}EbA)#z{4~NZ zAp9!ANtv^GYUTp&&YaIr%{-gWMtC-OBX}eDO7NALi+L103Vt2Me^-vRyz_#@!^ z!1sZ_3;r(nf586(KFl>6w3tr;C-Q*Ka-G9BxF+x`K-VJfFl2|pajptl%!h&xb+_>e z?hanzUd|V}&*gL7EBJi(O5W;T#aFpk^YcNMf_@CT$vp}AtpiO%p3{)$d3@O5^Z7E{ z27W&1D$p-&7x2-8FXY*SFW{2~U&PNC9K)xqtNCcqgb|Cmf5dFiV%`Ye2;K(XHexMx0RI5|3-B+% z2alW$x|)v!A2|{}0iS~Kbnxj22f>5j3&9scz7%{Z_<7*xLB187=qDrR^IO4xJMtR- z>c}eo7UDia_#^O?QL{l;^DOYJQH%Lx@X6ps;6>m*a3A8Ez?%?W3chsIwfIjqXk*|g z_|@Q7gWm*x)2JWvyTR{9co+CCr2Px{Uq=0izc=bS{sH7^qi2H_^AX@9z$bxE8vR3F z3SNq^AKVY#2;KMUZJDqa?YvLWk0(6O9|FBH;RXIS_+fB9 z@p+y$@h^PL#2B9l%9~h(=U(~h0%HOv(=i@nHSBG{2@f&3h$KNWHV z=Uej0|6j-g)C7&X`RUFPP+U(m^j}e&$r0Scz)6xt)mzSp*WzFT4Ca&cdq*X|D zoOo@v;0G-DF%#GGH_{B-!o1JK^*lK}Ab};3zhm)3m~VD@WKk^N;*)%y@X31qNAdCq zV>{gu{wIN-cfSh!j=+cAAGDqXJ(s_y>b8;m-;D>fpBr zU&^z^i)5z{DIC(p*AAh2T{xs0IB6K+jA5q?+sLmSPW|wP;kOOn$S0gi{V?y;>8Ebu z_h%Vx6t&=P-kXI>qX7RISK3n;}OuUVM zE?$ygEM>$To;M=V7Bfs-#;Zpp+IO)9udv_?EqI%Wzh`NS@AKb|@Q9kwSleall<~h< z@Bs_{*n(3=CTy_c9E-fbf^`e7v*0BbyxM{f~Q&VObf2I;BQ;-Dii;JUo^_Fr;Kkis1uwARmiYvJ>3QU$x+OOgx!?Wa{6-zcBHw zJVSo^j^w}OBTf7(oiHrQ-@(_I zILy0ET+e@O;xNC<#ASS^X+s%*!Ghnh;EyagMKf%M{T4jgf~Q;XJPTfI;$QLaXoer| z;n!&?n5%Eo#B+UK9V3hjZO$$%vczl3ZgweULB9HS}-h>n!q%O!-56vnlW9-^*oHg$UW$EMB> z-k)o%^*b$lfL)e7z+>DwUe?_`{&Ai)-jAZP$20t=xzm*#Un=3nV)DfzbX-TdnDjv!}0MY%WgTTK0}{MX|X zzPiVhck}zk8$N*#E%H64{7-zJDgQHn&6IED2aqQU!iBw!iSe(yp@Ytb>uH`k!RQaI zeAon|?oV^gBA;TBms;c%7I}?DewHbJhPRvYXZd-i{5je?DStl4u@5mZ)@~DHPi124 zPfUz8-Ne{ynfNNRtmin^dQ*OrDPPZjJwa5Q{cgf~zFXmEC%ni%p5T!Y>_t9oqJf1- z<64qt)9hNZ=Fn0!rTy2H6Qd_01 z*4AiiweM)_wDnpN;nmwn>X> z-P&gDGVO9L$z$_u(a`6#ZCXsbLhI4Kr(LOCrF~z!TDwNOR{MeWL+wY}b=r@$pJ+eT zuGfC1-JtzkyHUGIyIK2%c8hka_Dk(o+HKnH+OM@cv^%v)oANgOM!QSE%uPH$9*|sQpoUNIS4IZ`X!hy}O)`)jf9IWBVU_ zSbIc!RI__}wH?|{ZI||#_PDlN+oL_9J*hpV{Rx)-8HBN*J)=$9oVWQ|ZLhXZdro^^ zdqFGP?AaXHT=)2k+FzjalJ>IpSM3$;Rp8e^*KPircH^x#zI*4p_rLqtyL;b#?cD?K ze)ulC9GRKd-?i7Z{n{Jao0=hVzBlYW?Y*h*mA&VEukO9Y@4cnHt-YhYtG%ZkfKFUn z_AADg-DYSrc2Min4rzzAe`rUv_q7kSe`^2IKGgoLeWZP?eWD%Jmc=9SuJ{%4>*BY> z?~Xqde>`;Yd8hLt^= zXD4ObvhCT)*^ca#Y-e_Ac3O6Nc1HG~?96OewmW-p_K@tM*~7AjXP=UNYIauki0qNs zqq0Y5pO&5Mad@a!W3tC)YuVY^DITY%`-+_GaoM@q?;mU$-eH2 zso6Iky7SN(+0(Mm%+AZc|4@GRV~6%0dhO7GD+;m;vx~BevrDo|v&*u}v)@1T`61`w zVTZNDQxBIN_8zV~y!i04!;!;Xhp#w%-Qimf-+lO@!%rN3;s5FGT;QT8*T+B0u7HRx z8Y-6B&O1|@rlO$YEoWd?XJrvDcquhd0VOXG?0QQRS}1Ycj+Nc5>~^$Hx6?(ja#@4S1N1x}v-`TfrC|NFmuX6Bji`#kUceP`x^9em(Q+ zrC&{Fqt13e+xu+%S?R3f?DVslXY~AI0CskLD#_<`elO-pbqfG5lCw;qCl5KACs$Dg1aom7l;*vv@8JD)iP8*yCO?b6lTYU}_}Tm%elDNMXYtwmJbpf(!{5a(2-4SE|M#CQ z42pkI(D{FV3iL574vIgQ&*Sgr^Z5ea$-DR^{8D}yznove-@~uuSMm4qtNB8{h`*0_ z^Tm7#e?R{KzlJa6*YYaAj`#2n@_*vj^AGV4^N;Ww_(%E2_{aGt_$T?N_^0`e{4@Ns z{B!&!{(1fd{zd*J{$>8p{APX&{|f&q{}=u>{&oHh{!RWZ{;&Mo{5$-+{CoUXejC4? zf1lsMf57kLKjc5+ckyL>Ilr5);P>!*`F;F;{s4cFKg1vAKjx3{pYTWdO8!&+82=gn zIe(o0fr`I{8_3|%h%CkJ%5fr&o}TF_(uLBkW2h!{tADU|Be3#|2yBrbHqSGh>@5` z8xl&wNH}RrB1k(DN!pVR#7v?{N79L0N1{n*(uH&-F{B&0p4>pXlOCiexsg~1PY4l+ zNNyrGlU}4ZxrOv0eaWq)AL&m9z+H2&i*11g>-f(Hl0hVn#DmRX*oKgyB!LVg!^sFT zl8hp^kixlVkhHBGI5X;GM=Q831lLfL?)9oGKEYf)5vr(vR0|R zou%RqGK0({v&fw!on(;NWDc22GD#N6CiBRAlG7}$caa5TAz4HglU$NV?k4%9fH;YZ zEFnwDGP0bkAoq}!WEHuWtR{t|sF}S#XPR^$ag$wvboI ztK=`_HS#)nqgniKlDEiT$=l=|@-BIgY$e;scJe;iK|UZm$%o`4vWt|FaBbQZb@U4Cg;L2Pq>?%<+Eb}JO0m=ic@e2ON6CDTPZ?nCq+t_lJ-&uX_>HGSRvdan58JG zqtuD=>!fI@v$RrJCEP1?k-ADTQa8%cX0=dA^K!l9o0dh)6$$rI-d*Y;QNVU?p_uZX zl5Z-F`dFkA;ePPpB_as{77qw(sJJS#jW zY@$3?8tCKC3olSMNQ(0@2!?x6c!~0OX|Rqjt1YfwU%Rn(OYOV0WwjsIo~-?`wyyTK z+VHyQI!oQHbqRH74Wmfi1dwLd&98IT6@s*`?uojW;P_VE&bkA2pVw8@ouQhS>P+=f z_1)`x*T>gO^^W@K^_lf~^(*Vw)NiQgxJ~u1)o-ugQ(syCP5tTmhI;N?b$;jh1Lr?KU-gIfXU<>xLmiCE z)DYFsy#cO04e!%85UThp+iVN=6v4ci;`_!#g5UqJgc*hT^w<)iSv60kR5yA9ar0RE=%7Eq3pBsqY>9J%l| z<%v>~j=v+kOSx6D>G*pB&W>~37-_7IZxgl)?+ZHwMY2odq-3Ap2f|L_L*XOAA*D#; zrBol^C6o!}!fs)LG*Ox)P4@8$VUMsEVn~ywNK<_j=7WX(!U5r+Fin~+-7ekX^Eo6O z7Csh^2s5Oa(k$stAOA!+DpU%e3h7dYG+UbE0*6}mKuZ-vGILDo3yda3zGVauIm$ZbPFV*onpsahzHpLCKVGQ2a9(I& z=_!(^GTU7c8X3P&$1e((79gObK@-$o1-!zllg zv_63Ub|Jhmy3x}3ko2(hh_r$Fgi}4VYVO*K5n?+rQfv=8uzK0dnSn*Mz#o+!lOC6z zke-yDlAe|}N?yZfq-UA@oR6X3Ch2*0{sKD!1oxu!l7z>Xr9aan%9`6Od8Jz$J3UvxZ1?8f+OI)1%)1LLpjcz3Y}<8SCV%#e#W ziWcyDQ^$FcF#Wf5To6UZ|El9Ri8nL;wvP7_wI8nFxOa5?7O@Z0e^x9fPE7|;0oIzCt&!uSpyA1cC{H+3KA_%Lxe<2!YHggBD% z4|RN$cpKv%={VfYh>|FS-!7?4D);#%ib+g=w~uk)tfGza3LPIKj%9q0jw_;_@x3}e zPE2NepN>1k6vp@K_;@ju@dG+OL7d3=K^>nYPG-aozKI6xAJV(5X@h^0Ifw++I6FR;~T+H}M9nTf>82?ho?-t=5ixymg=xmX@ z#3e2ArQ)&{`EqeZi~JsOWs7{3cyEh*wOGjbSGx2UiT5%7wT`>RV#dGG@e=WV#{Z_{ z4~T0R|5nFK#kGuor{k))j`1oT_lWR53U#M+{7>R~#=qC`hs1{&|3Swe5jQaYqmDl+ zKF0Xpb)56LpIYHRx57`i!mES$FG1%Vb2Y8-Gp+E)S^9r%#s6$8ytWlyr{hnEPqOgq zb^IyuX~xg#_(t&=#?R|Gy!Fd?LlA$C@e4tG6XT6R{CUPN2JsgdzZAq@Wc+dve~Ixc zLHuRLuLkiyGyYo;-^}^R>q@(^tUnIF^F$xyi*W=pK%tf@35m4{y{6;Yj|By_+B2} z3h&$s@6rnI+6s?pg?DR(`(6Y0CXgL{uWSeL?yZF5dwn=azh^7@H@3npt#G~-PFmqY zD_m@a-_#1fxfR~472dlQeoHI7Pb<7{EBw}0c)wP7|5o^bR(Na>-^tqfz##r1@m-9^2k|n-2kUq_rMsD*ze!b4vZopMYYfqa$JSB*aXXmLwd;&Y4 z7{t9LI;j;tIf$pR^C>}mDm$MR#HX|K+k^NW?0iNLpUKW=1@SxCd3q4fVCS=gxHn&O zTH$kB;h8}^i=Af&@p9~M7mJYUC;h@UWCpyNlyO2(Z!{;7D3ahHyB+-Hn0(ecm4j!V(va2*|D!@D_?@y|@ZsPH`dh#e@SBW1xxVl#gfi!V&jd2zmkC$E zYp9RH@4&sny$8RBb`*YXtcJVHg&8^<2>ep@C_^&5Zk}UUVsOLn0gmbA{eLWLS3LdW zP3ylY?KAJ{{5KuPPkYn$pZtF;Pk1Bs9s39TqY)!eqXGZb2)a>e->lFi+?$w)Iw4dx z!+sN#r=JKw@}dGsKOl90{W`;dR1OX#5AS zxwm}eTK+rDD-gz*g|p`s&@6NI#RbmE^JnL0W!e{K=lU6*6;NL)*_Kf`-!<2nle@Se zEk7%Z^OhMDn_rGg2#{qC(#Zb#9Y~Y3|9F?QC@*Dk)}q|SIdfC9vkS7E1>DpY*nojU zhgbsKAN{YK!Er+qGO~ded(J!e?bBKYe=udE;}tKJop7(4%*xRt8I)t#gXQ)Ck`hmlcy$4 zN+Wuh>adQNQ*4uo1)D`ZY!Abh_Fwfsj=cS{f9{;SxPR+k9dYJuYicuW#(C3tQ( zmS@W&DiyP}yaLfPaonp*1IZd7- zPnD-B?lYFSCWq%H(Bc%eT2a4J)QK@x^`cd6vU+k2s!dcpE{l0^?*`R<|K`hDazSi zO%g9wZizCNtOBD(*(5pJ4!g%ZJwMa%&oPwzpdm~^O_{U=B>jqTdo^vmIeYTuQj@V z4pUD+Gdn~}tGWkJPzp7dgu?g(J~S=mzZh-8m+tSwWRK}OD7RuOW?5FtprqWF46bMp zQ&$*KOtj6MXcnoodgGu#cFz6OF zl>zWPpfo`#B~{AC&%k0`8fs;i95ff_fsXoV`7iC=S4;(yRftt9AxMC?B;8jG-d=%e zazMH1V^y_SFIJj&RJAWCp#>8I;Z`q&NM-dz^-sSyHBlM@R4WW9o;I$PP##v}cVnRq z&7>)!ZRl@MX3&PP0l6=mT~Q-0yCS_6QvrTh`~`jN>TYiWA+6p7`n&BOP%~6_g_uDI zb9Kbpfxe+t&`J!(V{0l6RXpPiN@+?=Ntt;~CQz$+Yd4I*T!QTjjCRW~Qk2&iW%mzZ zvate7kJcM4y+L3>OAm&Kf?J>${qrP2NmiHqqp8W84(Ofc;yQ@u{hn|aojptmF_)Zz zQ?1ezZ6H(3N#)gtF)_47t<{osNLDM#Pa9?7pc}@C1DGt@4b^hiny$mT)Fu{bV~W3D zYfK4{$^Z|oF~vWaQqt(`0ikq&#ZNBI4Bl<lUMI1 zkTktU?E`>et%r9+it znxKJgjVhHbc8>(zMUH_QKUj@g@LUK#GKR(65B6F?!ga2I+u{`%Bi!%Ph_a*)s_`T-A3qW;mCekvpIO zq5W6wvXvU-9Z+LjO)q+o%{%Ja%cT>$*F^htYTE9Al0xfn%LW1G7xg&UJ(-lgHE_BT;5JI7HLz< z0VoE@z>Tt6F1t?|FIJXcGP(J8!Df(kY$#sg4a(c`si`6J+swt;}ksdgP{8uE1E~YU94##$~fN zm3tDKQc9C!PCGPXx$LcF{P=@ zonxVGd$}pDtfq5eLRmq3*)!3Ed8JJqE~ynTOtThX=pM;+&x9?l9oIcRg6lpgrmjm> zbY-Wqs60^O@IlGzZUDguN#S6Y1f_7;_oR}+WZ+DRAcFf+JJ3D$Y0W~D&_bllU=HQX znPHqc9*%?B(YWy8$m?)y)GRd#E&EXBol}Wh`r%!N90||1yM65x<=!<@p1onuH{D)r zc-8ju1J9l5aYd+_ded;WcE=C2QZ7kT-Ii=Tb? zmrw4!q2HQ$b-m9&d*R7L#>%qUeJ;*DTKRcI>5KC^&q~UDO^-t64u)4|~yT^k=6qXB3)7TD0GF%s${IgEt+2zD`aVU&oD@d@CcwrLnQ8DTeA3g2fx+xK+sVgU0m&e z8Vy)(=sq2`7kZ30u6H#E|5*XU42+A$;)`qOqDkHSR-ZB}EhT~Z!YifG5XJmA7p49h z=8NlBMyZZ2E_@F6=WD^sD{u2#wJ~UBRELV)8Nm~+mTzfB;+qkr8JX0K+}Vue>WFua zOiPhB_Iq?X==VS~@`#SW>=~U`^oIk4&MW!}O3wsa(RoF^&SsrX;GCfu6pe;uUUlE` z9k9sD&&tkOmQ|3RGjDNjepdSIg$w;GGiz>cW)_G4ZaIBnZtenCUZ9*Fm$^81sYd2y zIn#4sZc*pY!p_v-lB{Lvi*hq{0U=`ni>}2>a~5Zcfsu)H&Pk7&tEKzmX|5mO7ibt5 zZ$KOYcmgdKTF(Xl!xO9N>Gnml=Vc|%F392r3>x?^&7LL<91<{lYN4~IQE->HkTrsq zW>2HNV}iG#v@mHUhO4-f-~P4m#&LVrbf+*;06z{HdL&if>2t0)}$* zz`=E9ke<}a>}e+G;fEZ2QBD@U87#aHR@^q zZQCC)jW=kP9|x4Epz!{US$@1TOXUo7(6A1lIWNaKGimamF?b=Jxg=|GW^Vq>Y}ews z^WmB~bB-%#Vdl)toC0TV{-XYwIr%eFau!d{S&=mQ;NdnSz2bFXIGmZ_e}lpA{80%eSQ1hoRiUy+Hq_XZl7r3>?&TJ4 zVF_as!< zeUUjJQ!xrChfkS2)xUzFp25i-#r;WBiduJ3?v3T6s8L2qp*u7mARGGd!fB$C%RW|7A>wYwQKczaIV1dbvVkyzjj?`-a0K# zF?Lmq)1vIciRwpz7hY{+E?Enq2Su!fKZ6!RQ#qC+R?^ZWsLgnmM|ag~Z#K0A>N1O# zz6=`=p!Gh(a7?eFPJ=nSlnh9MR-`m5v(T%$9ZeD}wBVym%Sm!Tz>tx6n0#_TpoLeO zTw&XxEpjz&)ZLIK09JLMY~EM~Ydo$o&<-uK)RpEWv)r1FcxPrX49KtdM{~*vBI-nt8P}+wA{3L zNwxSXFymk@j+FssfF)jQI$B`fmZKi@ma48iePxNQ0~%0@y5HMKs&~L7JY?JKnF2i& za&^cVq2Gig9#WT$y;{%Gn`pjFySQmh9d2dhq+`X(|*A}B5x5f}qk+|NQ-SM zNLp;OK+^QGLDFpR_W9y+lji%FkG{NDCSCqdFe?gS6Iw`t*lGz}ypHxVQ)l$juD zdUHXVPJNgAd>`}qJ_8ay(Hr3&?o98(6+<~^U&Xy594-omRh{V778>cKaOL7xcA>H+ zVjtI6X`)2y4Y;I)lgL^+rO6PA1@5F^RVT#kDFhF^ibNK!AO>e>;fk9Lu3YoBahC0$ zLS>COuyl|!!(DxkbB4RRjdN;I^%-a;&hhT*D5u?BEjX?2>PY8kcXfB?a9C1t4z9*I z%%bWqz}DFtO$6Na#9cSsMHf{YAUn>;qRWmRFocvm5Bm1GW#(;;`^55Uqr2MRT!y>5 z+|?n@aqeo9b0kXr-PNJa4(`iQt^)7C2V+Y+CTk-!%dIi2Ce^FcY;Xh{y>e&`yzhax zyPR(TZKl%(*MDYI>;a`T*i7)RaXD@xmA;0(R+||6c*^QwpG>7Iuve%Q?(4UmL9$WS z6Qo2c-Rkq*9@56hRnX-cY;@qT=DiL|3|av+X84EWD22nGP{|Ml|Moo7%tgg_;G*7+ z%mc{P;f^_N83-*k2`ziW2LElTM_aB(Vwbw;s!o+rWgYU`XGF%fo1mHD{E*k(2!a;3 zCSeHuDKmtIaG`@jVo?)kfV>X-w`QS9Xc13Y;BwS(uR0vDPiYpKgcj&;x>Yx|X^%5)t zEI2&p5~p!iI85ZMiIA9EEnJ^LT%UNZPXgy%_PW1)=O5oXIAhbL?{{{d^IQEp_B{_z zjheas${&N4T z4J)SB-=33ouk^r2n|AJ+qt5C6!_cEU6OIqra4P?&%e9Y9cx}LJN6iD{`c0dfkbBpo zaX%dCbZ3!wnQXv|XWMo?_syhrt3Qf)eEz8q=iJSI{c^(9@b!bl+d+6S5ro?=?j`Ipx4K^+|~q+uT6pZ(B% z;9{G%U*SSp2)8I}(cHY{Ovz_8&I>3haOS7a&sxTqH{?5XI(RaV5p6*ZPwrtvTgHPW zx}glvw1;v)20`IbhqXh=z`+b@9W8LVt1amGm(~WZ#1MjMM zt?-@;9o7IW$OX&`Ys+|1)EBP)#R>3sjMwT2qkpuFH!gYsyfx#s`iWV!wv6Ykz3Pn> z5p8@{zcZ`$aMUju(j_|IlHv2?UU<=O)zzSxQ5{{rv}G!6SLj~c@@0d6@oxaLqB^=I zLo5gXlA*!6;%&cGGP9yOy0|)0D{ox-rO<3;bgc!uJ=;gNBfsTOPLkb0X>fW z^FS)HHoukWAPeCF=TLEq)o8$0gf4e!0u-*+PvA95W`#O>E1b~uTg`c6C^QzYRTZ;B z9laIaJNT_qhDQC#Z`H)CP)BdoMQ2qIJ2uB})q_QfI(jR-)9}aD=a!w9{8l5F73%1% zu)X=MCNzD2*>80_vqBxcRX3g0f`^|w=C@kHtWXE60%pUnr&g0-k1oCA^23^h`wh&B z>QKB1NGwQx@>d{=j|A4~4M2?sZy#F~xfwp{w*WC3=w%2bzmvd%O_!(R3iP79+=484V?U5(27+vuSfA|-&{&d{ zUjW~;aN7DcEKEDI@)yru$l>(@PSSH0IuzHg9oOW;#Ti$9dPM15@Em z8C!R5(TgoR2l~;(w_v03AOm0Kf(-n;MFTBAE!r@z*31I3tSyaulkO`hzeak>cw0*9 zcze=hE`5@1tbKBtZPH|J^yu^?DLpnJRY^%5mtswo@HTh!VC_%xc_&&^5^ZCwRtfKU zn|qHNn>u!UN@9vc@0){-71@zE-jS3f(L3j0-_%4~a!QiokmwzDGhaE;mS~d`CGEBw zz5S_5af}_OjI$<7^j6$!s=Z>MeMhCqxPrqzwkm+R=bUAlC(C=hT}hU0<0eSfL|yQM zl5JzhJI1Ftq|vbfu?`wzKW&{fckoZ=O*rSKjEonp9RcETGNa5z#^y?}cy z9Bnt z6yE<6Yn$}#q5S`XkC!-j1Gz&%+qg1VSTsLcR-u+x(07uN+S-q`p8A6 zpfHSb5!^6v24{EB>Q>M}F02Zd8&BR)cJX8rC}aI$5DH9emrjQ@v-$8jQl7<8D(SvR z%Cq4oNm7{=Rxc;mVI8k@Ss7i?t3C|@z;bJy%`;7sJ!6d@;WZ4t6EGKtLDOUNxbSvt z2Zv`1s-}1r9>Ld$Q#c2F`;?)+y9TLs*h+D_bC}wdX2s%O9b<4^-#AtbcSc)>t?usX zVBT@AeQ8%%mW$4AJ2p~H5ox?ub*yMrt7_U?)hrRdA(7ROZR&oj`U&+-QFp`oWLn%Y z_(sX9UZPBD+-HFIyLbH5Grt3@4aK+@Sq$biTKA0%XQOdCiaO(z8DOJ}R$Vj@q# zs37mcp#cKyRFDjzj1RSYY$jYRS0LMvfi!QfwOl3uVhOd1y>Xe^`yCqwcs~sgQp%F* zfR9Hq)P3cryJ-~(l_bFzU@=zioMj1)fyLnyka7h|X}VGcLR)6pw{4_t_01gLHQ;Nbx2Cx&gfEZZ2+u!4$r@Vl$Ht z&#PbvUo>G&4q;gVmoinO9%ozzqfNhb(qLWMNohcA~R6#Fm+fF{djW6!$IeBUAn z7^Le9qUfLkG}qLvdO9pv`a|oA(W?7y3g--lQ8<6&g0Bm6P3@tqdVy_^0$yG_#pE} zHzz^5ig5zjw$^5n-#%`G<-#HI+A>%p-dc&r@NDBT^VS0(X1DuPv}k7_+Q{zg^6x{T z5rIc#cIo7i5Q6dl-h8-iZAu$kF}&r1-CAB-F5(9#WgukRjF1dSL$ zbvO>HZ0KxTkbuMMKI7B-lHv^6`;#nVdcnBdcYo6XgUzCN#=^H3witTVa=@Buo?V?0 zYgZQ}*wq5XuKwU##;X_(nZSD~6L$yf`%)<(iyK_RC*is_`F5R}S=BSA<7TQ+Z z)jD&OL0t|XSDi9P+2L|-`%Y26Rd+i|Z6_|C)V?2rFNUn}Le32b-KXX&?s7>nzgceX zXnW4wG38CgowB(}G49JY-}?m^AB9h^%pIrfDz(+ZRsBJHvl>>3w>i{B&%sMWW~fR} z%Fk9$Vysr5BW4{nyYb6Ohk97?O!*mxZ%}xSdYZQ;$63`f#gOtG{U)gjQh#y(Z*XsI zF8&Z?^Nye4+bVb!$I$c%#JmkI1z6wDmAZD-7**FUsd2x_8PS-OU^W-y8}Ojtt{^_o+Q9mP|mwS9lj8Tn4As}qfiWS${<=$G~x)jUqaF3>?;*F zEeEL$-W&WJUI1dKvkQoAQ4Djo12LlDM)##~*Y&cxAKr}d7oG9T>W3lmkiOK|F~PEeB}qF);G14P9fjt9!AfLl@Xg?<<;x4G~A?_wtvCR)1JBP%2nBC5`uX zQEj!=^Y9~9?c=ae?bRZs@2nH@MX3A=NNwCPZ&hEchc)rpZlrftO3|K8kS|}Kx^q?q&ScyQn~8f3_F5k~2ola(nYd4}N~n|zJp*T#OkB4< z_~BCzuDcm8T6TD5jp|9!94*RJ_Fzk7IXw~_$13dog49eJ8r_`t7fE zL%th2nK3hUj!hFyGZ-BmI;4gQerO~j_=jRmyS3$5$jRqVE(R~$hdV#hw z5vYTgcB3JQYQQ{S)T-jT3k~++({?jEGc_8m1>(@NmQY-8==%&`crubJBe$(I|ekOHu(vd8`RTL%~983VP@(~z8s?|>a zW+bs0nbM5pG$Sq@3H&st9ma0JCwRSk04#!MFWF}<1?kYT(p`&P1u!+aXm-JZz;A8> zW%hkeZeCXY?8TV{>F~QY`LpLbz2V{~J6YM;S@6?8OW?bo%*=c?2TC8?)AioDc{)%0 zNC)Pe#!glsg&k%RhChh3uP-_0CQPWADtQ fmqT2^s(}9B*N$5F>7kZ>jwo>AEHM3A$|L>{C&hWx literal 0 HcmV?d00001 diff --git a/metamod/vendor/funchook/lib/funchook.lib b/metamod/vendor/funchook/lib/funchook.lib new file mode 100644 index 0000000000000000000000000000000000000000..c321ae51d6180bc2835a37c424d28e80037ee559 GIT binary patch literal 65438 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≺`LC-F%pwDuYM@_p^>ZYU`Ynd=asBfRWLd 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 NMC>nng+ZJ0{|^ym-97*S literal 0 HcmV?d00001 diff --git a/metamod/vendor/funchook/lib/libfunchook.a b/metamod/vendor/funchook/lib/libfunchook.a new file mode 100644 index 0000000000000000000000000000000000000000..1b25984bd77f74380fa77ad902ec3030bdc361c8 GIT binary patch literal 46806 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 literal 0 HcmV?d00001 diff --git a/scripts/vscripts/wst.lua b/scripts/vscripts/wst.lua index 71e33f5..68031f5 100644 --- a/scripts/vscripts/wst.lua +++ b/scripts/vscripts/wst.lua @@ -300,7 +300,7 @@ Convars:RegisterCommand("wst_top", function() for i, p in ipairs(topPlayers) do local position, total_players = getPlayerPosition(p.steam_id) - SendTextToClient(player, position .. "/" .. total_players .. " " .. p.name .. " " .. p.time) + SendTextToClient(player, position .. "/" .. total_players .. " " .. p.name .. " " .. FormatTime(p.time)) end end, nil, 0) @@ -426,6 +426,30 @@ ListenToGameEvent("player_spawn", function(event) end end, nil) +ListenToGameEvent("player_chat", function(event) + -- This is off by 1 from the userid we get in lua + -- IE first player.user_id to join is 1 in lua but 0 from C++ + -- Unsure if s2ze just sending it wrong or not + local userid = event.userid - 1 + + local chatPlayer = nil + local players = Entities:FindAllByClassname("player") + for i, player in ipairs(players) + do + if player.user_id == userid then + chatPlayer = players[i] + break + end + end + if (chatPlayer == nil) then + return + end + if event.text == "!r" or event.text == "/r" then + TeleportToStartZone(chatPlayer) + return + end +end, nil) + function ServerMessage() ScriptPrintMessageChatAll(ConvertTextToColoredChatString( "Type wst_help in console (~) for surf timer commands"))