From 262af0731183d51e3cb1669a6d7d435acd5fa75d Mon Sep 17 00:00:00 2001 From: Romain Thomas Date: Wed, 28 Mar 2018 05:57:22 +0200 Subject: [PATCH] Use Frozen for static const containers. Thanks to https://github.com/serge-sans-paille/frozen By default, Frozen is used if the compiler support C++14. It can be disabled by using the "LIEF_DISABLE_FROZEN" option during the CMake configuration step --- CMakeLists.txt | 29 +- cmake/LIEFCompilerDetection.cmake | 27 ++ cmake/LIEFDependencies.cmake | 23 ++ cmake/LIEFOptions.cmake | 2 + include/LIEF/ELF/Header.hpp | 6 +- include/LIEF/ELF/Relocation.hpp | 2 + include/LIEF/config.h.in | 4 + src/Abstract/EnumToString.cpp | 14 +- src/ELF/CMakeLists.txt | 3 +- src/ELF/EnumToString.cpp | 61 +-- src/ELF/Header.cpp | 17 +- src/ELF/Relocation.cpp | 47 ++- src/ELF/RelocationSizes.hpp | 387 ++++++++++++++++++ src/MachO/EnumToString.cpp | 52 +-- src/PE/EnumToString.cpp | 67 +-- .../libraries_table.hpp | 1 + .../ws2_32_dll_lookup.hpp | 1 + src/compiler_support.h.in | 23 ++ src/frozen.hpp | 29 ++ third-party/frozen-2f608b5.zip | Bin 0 -> 124656 bytes 20 files changed, 665 insertions(+), 130 deletions(-) create mode 100644 cmake/LIEFCompilerDetection.cmake create mode 100644 src/ELF/RelocationSizes.hpp create mode 100644 src/compiler_support.h.in create mode 100644 src/frozen.hpp create mode 100644 third-party/frozen-2f608b5.zip diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d89a0c..7a92891 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.6) set_property(GLOBAL PROPERTY USE_FOLDERS ON) @@ -25,6 +25,9 @@ message(STATUS "${PROJECT_NAME} ${PROJECT_VERSION}") # ============= include(LIEFOptions) +# Compiler detection (C++14, C++17, ...) +include(LIEFCompilerDetection) + # CCACHE # ====== find_program(CCACHE_FOUND ccache) @@ -98,7 +101,9 @@ set(LIEF_INC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/Visitor.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/visitor_macros.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/BinaryStream/BinaryStream.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/BinaryStream/VectorStream.hpp") + "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/BinaryStream/VectorStream.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/frozen.hpp" +) set(LIEF_VISITOR_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/hash.hpp") @@ -131,6 +136,10 @@ add_library(LIB_LIEF_SHARED SHARED ${LIBLIEF_SOURCE_FILES} ${LIEF_INCLUDE_FILES} target_compile_definitions(LIB_LIEF_STATIC PRIVATE -DLIEF_STATIC) target_compile_definitions(LIB_LIEF_SHARED PRIVATE -DLIEF_EXPORTS) +if (LIEF_SUPPORT_CXX14) + target_compile_features(LIB_LIEF_STATIC PRIVATE cxx_std_14) + target_compile_features(LIB_LIEF_SHARED PRIVATE cxx_std_14) +endif() # Abstract part include("${CMAKE_CURRENT_SOURCE_DIR}/src/Abstract/CMakeLists.txt") @@ -177,6 +186,11 @@ else() add_definitions(-DELPP_DISABLE_DEFAULT_CRASH_HANDLING) endif() +# Frozen Configuration +# ==================== +if (LIEF_FROZEN_ENABLED) + list(APPEND LIEF_PRIVATE_INCLUDE_DIR "${FROZEN_INCLUDE_DIR}") +endif() # LIEF includes # ============= @@ -202,8 +216,10 @@ list(APPEND LIEF_PRIVATE_INCLUDE_DIR "${LIEF_PUBLIC_INCLUDE_DIR}" "${LIBRANG_SOURCE_DIR}/include" "${CMAKE_CURRENT_SOURCE_DIR}/src" + "${CMAKE_BINARY_DIR}" "${ELG_SOURCE_DIR}" - "${MBEDTLS_INCLUDE_DIRS}") + "${MBEDTLS_INCLUDE_DIRS}" +) # Grouping external projects @@ -212,7 +228,7 @@ source_group("mbedtls\\crypto" FILES ${mbedtls_src_crypto}) source_group("mbedtls\\x509" FILES ${mbedtls_src_x509}) source_group("mbedtls\\tls" FILES ${mbedtls_src_tls}) if (LIEF_LOGGING) -source_group("easylogging" FILES ${ELG_SOURCE_DIR}/easylogging++.cc) + source_group("easylogging" FILES ${ELG_SOURCE_DIR}/easylogging++.cc) endif() # Library definition @@ -236,6 +252,11 @@ if (LIEF_LOGGING) add_dependencies(LIB_LIEF_SHARED lief_easyloggingpp) endif() +if (LIEF_FROZEN_ENABLED) + add_dependencies(LIB_LIEF_STATIC lief_frozen) + add_dependencies(LIB_LIEF_SHARED lief_frozen) +endif() + add_dependencies(LIB_LIEF_STATIC lief_rang_cpp_color) add_dependencies(LIB_LIEF_SHARED lief_rang_cpp_color) diff --git a/cmake/LIEFCompilerDetection.cmake b/cmake/LIEFCompilerDetection.cmake new file mode 100644 index 0000000..d0eb66f --- /dev/null +++ b/cmake/LIEFCompilerDetection.cmake @@ -0,0 +1,27 @@ +if(__add_lief_compiler_detection) + return() +endif() +set(__add_lief_compiler_detection ON) + +set(LIEF_SUPPORT_CXX11 0) +set(LIEF_SUPPORT_CXX14 0) +set(LIEF_SUPPORT_CXX17 0) + +if (cxx_std_11 IN_LIST CMAKE_CXX_COMPILE_FEATURES) + set(LIEF_SUPPORT_CXX11 1) +endif() + +if (cxx_std_14 IN_LIST CMAKE_CXX_COMPILE_FEATURES) + set(LIEF_SUPPORT_CXX14 1) +endif() + +if (cxx_std_17 IN_LIST CMAKE_CXX_COMPILE_FEATURES) + set(LIEF_SUPPORT_CXX17 1) +endif() + +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/src/compiler_support.h.in" + "${CMAKE_CURRENT_BINARY_DIR}/compiler_support.h" + @ONLY +) + diff --git a/cmake/LIEFDependencies.cmake b/cmake/LIEFDependencies.cmake index 6bab343..9523c36 100644 --- a/cmake/LIEFDependencies.cmake +++ b/cmake/LIEFDependencies.cmake @@ -225,3 +225,26 @@ if (LIEF_FUZZING) add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/fuzzing") endif() + +# Frozen +# ------ +set(LIEF_FROZEN_ENABLED 0) + +if (LIEF_SUPPORT_CXX14 AND NOT LIEF_DISABLE_FROZEN) + message(STATUS "Enable Frozen (C++14 support)") + set(LIEF_FROZEN_ENABLED 1) + set(FROZEN_VERSION 2f608b5) + set(FROZEN_SHA256 SHA256=e72a59976beb55f4d608d195745b9fbd51f8bcff20a23060b18f20a46873bddf) + set(FROZEN_URL "${THIRD_PARTY_DIRECTORY}/frozen-${FROZEN_VERSION}.zip" CACHE STRING "URL to Frozen") + ExternalProject_Add(lief_frozen + URL ${FROZEN_URL} + URL_HASH ${FROZEN_SHA256} + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + UPDATE_COMMAND "" + INSTALL_COMMAND "") + + ExternalProject_get_property(lief_frozen SOURCE_DIR) + set(FROZEN_INCLUDE_DIR "${SOURCE_DIR}/include") +endif() + diff --git a/cmake/LIEFOptions.cmake b/cmake/LIEFOptions.cmake index 20b89d2..d532ce5 100644 --- a/cmake/LIEFOptions.cmake +++ b/cmake/LIEFOptions.cmake @@ -16,6 +16,8 @@ option(LIEF_EXTRA_WARNINGS "Enable extra warning from the compiler" OFF) option(LIEF_LOGGING "Enable logging" ON) option(LIEF_ENABLE_JSON "Enable JSON-related APIs" ON) +option(LIEF_DISABLE_FROZEN "Disable Frozen even if it is supported" OFF) + option(LIEF_ELF "Build LIEF with ELF module" ON) option(LIEF_PE "Build LIEF with PE module" ON) option(LIEF_MACHO "Build LIEF with MachO module" ON) diff --git a/include/LIEF/ELF/Header.hpp b/include/LIEF/ELF/Header.hpp index 88b86e0..d4f5e98 100644 --- a/include/LIEF/ELF/Header.hpp +++ b/include/LIEF/ELF/Header.hpp @@ -35,7 +35,9 @@ class LIEF_API Header : public Object { public: using identity_t = std::array; + using abstract_architecture_t = std::pair>; + public: Header(void); Header(const Elf32_Ehdr *header); Header(const Elf64_Ehdr *header); @@ -55,7 +57,9 @@ class LIEF_API Header : public Object { ARCH machine_type(void) const; //! @brief LIEF abstract architecture - std::pair> abstract_architecture(void) const; + //! + //! Empty it can't be abstracted + abstract_architecture_t abstract_architecture(void) const; //! @brief LIEF abstract endianness ENDIANNESS abstract_endianness(void) const; diff --git a/include/LIEF/ELF/Relocation.hpp b/include/LIEF/ELF/Relocation.hpp index da0f48d..e924892 100644 --- a/include/LIEF/ELF/Relocation.hpp +++ b/include/LIEF/ELF/Relocation.hpp @@ -69,6 +69,8 @@ class LIEF_API Relocation : public LIEF::Relocation { RELOCATION_PURPOSES purpose(void) const; //! @brief Return the **bit** size of the value to patch + //! + //! Return -1 if it fails virtual size_t size(void) const override; bool has_symbol(void) const; diff --git a/include/LIEF/config.h.in b/include/LIEF/config.h.in index a5d8f78..184b4c0 100644 --- a/include/LIEF/config.h.in +++ b/include/LIEF/config.h.in @@ -37,4 +37,8 @@ #define LIEF_LOGGING_SUPPORT #endif +#if @LIEF_FROZEN_ENABLED@ +#define LIEF_FROZEN_ENABLED +#endif + #endif diff --git a/src/Abstract/EnumToString.cpp b/src/Abstract/EnumToString.cpp index 731a3cd..74ff3e3 100644 --- a/src/Abstract/EnumToString.cpp +++ b/src/Abstract/EnumToString.cpp @@ -14,12 +14,12 @@ * limitations under the License. */ #include "LIEF/Abstract/EnumToString.hpp" -#include +#include "frozen.hpp" namespace LIEF { const char* to_string(EXE_FORMATS e) { - const std::map enumStrings { + CONST_MAP(EXE_FORMATS, const char*, 4) enumStrings { { EXE_FORMATS::FORMAT_UNKNOWN, "UNKNOWN" }, { EXE_FORMATS::FORMAT_ELF, "ELF" }, { EXE_FORMATS::FORMAT_PE, "PE" }, @@ -30,7 +30,7 @@ const char* to_string(EXE_FORMATS e) { } const char* to_string(OBJECT_TYPES e) { - const std::map enumStrings { + CONST_MAP(OBJECT_TYPES, const char*, 4) enumStrings { { OBJECT_TYPES::TYPE_NONE, "NONE" }, { OBJECT_TYPES::TYPE_EXECUTABLE, "EXECUTABLE" }, { OBJECT_TYPES::TYPE_LIBRARY, "LIBRARY" }, @@ -41,7 +41,7 @@ const char* to_string(OBJECT_TYPES e) { } const char* to_string(ARCHITECTURES e) { - const std::map enumStrings { + CONST_MAP(ARCHITECTURES, const char*, 10) enumStrings { { ARCHITECTURES::ARCH_NONE, "NONE" }, { ARCHITECTURES::ARCH_ARM, "ARM" }, { ARCHITECTURES::ARCH_ARM64, "ARM64" }, @@ -59,7 +59,7 @@ const char* to_string(ARCHITECTURES e) { const char* to_string(MODES e) { - const std::map enumStrings { + CONST_MAP(MODES, const char*, 15) enumStrings { { MODES::MODE_NONE, "NONE" }, { MODES::MODE_16, "M16" }, { MODES::MODE_32, "M32" }, @@ -81,7 +81,7 @@ const char* to_string(MODES e) { } const char* to_string(ENDIANNESS e) { - const std::map enumStrings { + CONST_MAP(ENDIANNESS, const char*, 3) enumStrings { { ENDIANNESS::ENDIAN_NONE, "NONE" }, { ENDIANNESS::ENDIAN_BIG, "BIG" }, { ENDIANNESS::ENDIAN_LITTLE, "LITTLE" }, @@ -91,7 +91,7 @@ const char* to_string(ENDIANNESS e) { } const char* to_string(Binary::VA_TYPES e) { - const std::map enumStrings { + CONST_MAP(Binary::VA_TYPES, const char*, 3) enumStrings { { LIEF::Binary::VA_TYPES::AUTO, "AUTO" }, { LIEF::Binary::VA_TYPES::RVA, "RVA" }, { LIEF::Binary::VA_TYPES::VA, "VA" }, diff --git a/src/ELF/CMakeLists.txt b/src/ELF/CMakeLists.txt index 871392b..450b6f4 100644 --- a/src/ELF/CMakeLists.txt +++ b/src/ELF/CMakeLists.txt @@ -64,7 +64,6 @@ set(LIEF_ELF_INC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Header.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Parser.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Relocation.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/RelocationSizes.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Section.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Segment.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Symbol.hpp" @@ -79,6 +78,8 @@ set(LIEF_ELF_INC_FILES "${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/ELF/Structures.hpp" "${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/ELF/enums.hpp" + + "${CMAKE_CURRENT_LIST_DIR}/RelocationSizes.hpp" ) set(LIEF_ELF_DATA_HANDLER_INCLUDE_FILES diff --git a/src/ELF/EnumToString.cpp b/src/ELF/EnumToString.cpp index b49f376..c57ba0b 100644 --- a/src/ELF/EnumToString.cpp +++ b/src/ELF/EnumToString.cpp @@ -15,13 +15,14 @@ */ #include "LIEF/ELF/Structures.hpp" #include "LIEF/ELF/EnumToString.hpp" +#include "frozen.hpp" #include namespace LIEF { namespace ELF { const char* to_string(SYMBOL_BINDINGS e) { - const std::map enumStrings { + CONST_MAP(SYMBOL_BINDINGS, const char*, 8) enumStrings { { SYMBOL_BINDINGS::STB_LOCAL, "LOCAL" }, { SYMBOL_BINDINGS::STB_GLOBAL, "GLOBAL" }, { SYMBOL_BINDINGS::STB_WEAK, "WEAK" }, @@ -37,7 +38,7 @@ const char* to_string(SYMBOL_BINDINGS e) { const char* to_string(E_TYPE e) { - const std::map enumStrings { + CONST_MAP(E_TYPE, const char*, 7) enumStrings { { E_TYPE::ET_NONE, "NONE" }, { E_TYPE::ET_REL, "RELOCATABLE" }, { E_TYPE::ET_EXEC, "EXECUTABLE" }, @@ -52,7 +53,7 @@ const char* to_string(E_TYPE e) { const char* to_string(VERSION e) { - const std::map enumStrings { + CONST_MAP(VERSION, const char*, 2) enumStrings { { VERSION::EV_NONE, "NONE" }, { VERSION::EV_CURRENT, "CURRENT" } }; @@ -62,7 +63,7 @@ const char* to_string(VERSION e) { const char* to_string(ARCH e) { - const std::map enumStrings { + CONST_MAP(ARCH, const char*, 175) enumStrings { { ARCH::EM_NONE, "None" }, { ARCH::EM_M32, "M32"}, { ARCH::EM_SPARC, "SPARC"}, @@ -244,7 +245,7 @@ const char* to_string(ARCH e) { } const char* to_string(SEGMENT_TYPES e) { - const std::map enumStrings { + CONST_MAP(SEGMENT_TYPES, const char*, 24) enumStrings { { SEGMENT_TYPES::PT_NULL, "NULL" }, { SEGMENT_TYPES::PT_LOAD, "LOAD" }, { SEGMENT_TYPES::PT_DYNAMIC, "DYNAMIC" }, @@ -275,7 +276,7 @@ const char* to_string(SEGMENT_TYPES e) { } const char* to_string(DYNAMIC_TAGS e) { - const std::map enumStrings { + CONST_MAP(DYNAMIC_TAGS, const char*, 91) enumStrings { { DYNAMIC_TAGS::DT_NULL, "NULL"}, { DYNAMIC_TAGS::DT_NEEDED, "NEEDED"}, { DYNAMIC_TAGS::DT_PLTRELSZ, "PLTRELSZ"}, @@ -375,7 +376,7 @@ const char* to_string(DYNAMIC_TAGS e) { const char* to_string(ELF_SECTION_TYPES e) { - const std::map enumStrings { + CONST_MAP(ELF_SECTION_TYPES, const char*, 38) enumStrings { { ELF_SECTION_TYPES::SHT_NULL, "NULL"}, { ELF_SECTION_TYPES::SHT_PROGBITS, "PROGBITS"}, { ELF_SECTION_TYPES::SHT_SYMTAB, "SYMTAB"}, @@ -420,7 +421,7 @@ const char* to_string(ELF_SECTION_TYPES e) { } const char* to_string(ELF_SECTION_FLAGS e) { - const std::map enumStrings { + CONST_MAP(ELF_SECTION_FLAGS, const char*, 25) enumStrings { { ELF_SECTION_FLAGS::SHF_NONE, "NONE"}, { ELF_SECTION_FLAGS::SHF_WRITE, "WRITE"}, { ELF_SECTION_FLAGS::SHF_ALLOC, "ALLOC"}, @@ -453,7 +454,7 @@ const char* to_string(ELF_SECTION_FLAGS e) { const char* to_string(ELF_SYMBOL_TYPES e) { - const std::map enumStrings { + CONST_MAP(ELF_SYMBOL_TYPES, const char*, 12) enumStrings { { ELF_SYMBOL_TYPES::STT_NOTYPE, "NOTYPE"}, { ELF_SYMBOL_TYPES::STT_OBJECT, "OBJECT"}, { ELF_SYMBOL_TYPES::STT_FUNC, "FUNC"}, @@ -473,7 +474,7 @@ const char* to_string(ELF_SYMBOL_TYPES e) { const char* to_string(RELOC_x86_64 e) { - const std::map enumStrings { + CONST_MAP(RELOC_x86_64, const char*, 43) enumStrings { { RELOC_x86_64::R_X86_64_NONE, "NONE"}, { RELOC_x86_64::R_X86_64_64, "R64"}, { RELOC_x86_64::R_X86_64_PC32, "PC32"}, @@ -523,7 +524,7 @@ const char* to_string(RELOC_x86_64 e) { } const char* to_string(RELOC_ARM e) { - const std::map enumStrings { + CONST_MAP(RELOC_ARM, const char*, 138) enumStrings { { RELOC_ARM::R_ARM_NONE, "NONE"}, { RELOC_ARM::R_ARM_PC24, "PC24"}, { RELOC_ARM::R_ARM_ABS32, "ABS32"}, @@ -668,7 +669,7 @@ const char* to_string(RELOC_ARM e) { } const char* to_string(RELOC_AARCH64 e) { - const std::map enumStrings { + CONST_MAP(RELOC_AARCH64, const char*, 123) enumStrings { { RELOC_AARCH64::R_AARCH64_NONE, "NONE"}, { RELOC_AARCH64::R_AARCH64_ABS64, "ABS64"}, { RELOC_AARCH64::R_AARCH64_ABS32, "ABS32"}, @@ -800,7 +801,7 @@ const char* to_string(RELOC_AARCH64 e) { const char* to_string(RELOC_i386 e) { - const std::map enumStrings { + CONST_MAP(RELOC_i386, const char*, 41) enumStrings { { RELOC_i386::R_386_NONE, "NONE"}, { RELOC_i386::R_386_32, "R32"}, { RELOC_i386::R_386_PC32, "PC32"}, @@ -848,7 +849,7 @@ const char* to_string(RELOC_i386 e) { } const char* to_string(ELF_CLASS e) { - const std::map enumStrings { + CONST_MAP(ELF_CLASS, const char*, 3) enumStrings { { ELF_CLASS::ELFCLASSNONE, "NONE"}, { ELF_CLASS::ELFCLASS32, "CLASS32"}, { ELF_CLASS::ELFCLASS64, "CLASS64"}, @@ -859,7 +860,7 @@ const char* to_string(ELF_CLASS e) { } const char* to_string(ELF_DATA e) { - const std::map enumStrings { + CONST_MAP(ELF_DATA, const char*, 3) enumStrings { { ELF_DATA::ELFDATANONE, "NONE"}, { ELF_DATA::ELFDATA2LSB, "LSB"}, { ELF_DATA::ELFDATA2MSB, "MSB"}, @@ -870,7 +871,7 @@ const char* to_string(ELF_DATA e) { } const char* to_string(OS_ABI e) { - const std::map enumStrings { + CONST_MAP(OS_ABI, const char*, 23) enumStrings { { OS_ABI::ELFOSABI_SYSTEMV, "SYSTEMV"}, { OS_ABI::ELFOSABI_HPUX, "HPUX"}, { OS_ABI::ELFOSABI_NETBSD, "NETBSD"}, @@ -902,7 +903,7 @@ const char* to_string(OS_ABI e) { const char* to_string(DYNSYM_COUNT_METHODS e) { - const std::map enumStrings { + CONST_MAP(DYNSYM_COUNT_METHODS, const char*, 4) enumStrings { { DYNSYM_COUNT_METHODS::COUNT_AUTO, "AUTO"}, { DYNSYM_COUNT_METHODS::COUNT_SECTION, "SECTION"}, { DYNSYM_COUNT_METHODS::COUNT_HASH, "HASH"}, @@ -915,7 +916,7 @@ const char* to_string(DYNSYM_COUNT_METHODS e) { const char* to_string(NOTE_TYPES e) { - const std::map enumStrings { + CONST_MAP(NOTE_TYPES, const char*, 5) enumStrings { { NOTE_TYPES::NT_UNKNOWN, "UNKNOWN"}, { NOTE_TYPES::NT_GNU_ABI_TAG, "ABI_TAG"}, { NOTE_TYPES::NT_GNU_HWCAP, "HWCAP"}, @@ -928,7 +929,7 @@ const char* to_string(NOTE_TYPES e) { } const char* to_string(NOTE_ABIS e) { - const std::map enumStrings { + CONST_MAP(NOTE_ABIS, const char*, 7) enumStrings { { NOTE_ABIS::ELF_NOTE_UNKNOWN, "UNKNOWN"}, { NOTE_ABIS::ELF_NOTE_OS_LINUX, "LINUX"}, { NOTE_ABIS::ELF_NOTE_OS_GNU, "GNU"}, @@ -943,7 +944,7 @@ const char* to_string(NOTE_ABIS e) { } const char* to_string(RELOCATION_PURPOSES e) { - const std::map enumStrings { + CONST_MAP(RELOCATION_PURPOSES, const char*, 4) enumStrings { { RELOCATION_PURPOSES::RELOC_PURPOSE_NONE, "NONE"}, { RELOCATION_PURPOSES::RELOC_PURPOSE_PLTGOT, "PLTGOT"}, { RELOCATION_PURPOSES::RELOC_PURPOSE_DYNAMIC, "DYNAMIC"}, @@ -956,7 +957,7 @@ const char* to_string(RELOCATION_PURPOSES e) { const char* to_string(PPC64_EFLAGS e) { - const std::map enumStrings { + CONST_MAP(PPC64_EFLAGS, const char*, 1) enumStrings { { PPC64_EFLAGS::EF_PPC64_ABI, "ABI"}, }; @@ -966,7 +967,7 @@ const char* to_string(PPC64_EFLAGS e) { const char* to_string(ARM_EFLAGS e) { - const std::map enumStrings { + CONST_MAP(ARM_EFLAGS, const char*, 8) enumStrings { { ARM_EFLAGS::EF_ARM_SOFT_FLOAT, "SOFT_FLOAT" }, { ARM_EFLAGS::EF_ARM_VFP_FLOAT, "VFP_FLOAT" }, { ARM_EFLAGS::EF_ARM_EABI_UNKNOWN, "UNKNOWN" }, @@ -982,7 +983,7 @@ const char* to_string(ARM_EFLAGS e) { } const char* to_string(MIPS_EFLAGS e) { - const std::map enumStrings { + CONST_MAP(MIPS_EFLAGS, const char*, 43) enumStrings { { MIPS_EFLAGS::EF_MIPS_NOREORDER, "NOREORDER" }, { MIPS_EFLAGS::EF_MIPS_PIC, "PIC" }, { MIPS_EFLAGS::EF_MIPS_CPIC, "CPIC" }, @@ -1038,7 +1039,7 @@ const char* to_string(MIPS_EFLAGS e) { const char* to_string(HEXAGON_EFLAGS e) { - const std::map enumStrings { + CONST_MAP(HEXAGON_EFLAGS, const char*, 9) enumStrings { { HEXAGON_EFLAGS::EF_HEXAGON_MACH_V2, "MACH_V2" }, { HEXAGON_EFLAGS::EF_HEXAGON_MACH_V3, "MACH_V3" }, { HEXAGON_EFLAGS::EF_HEXAGON_MACH_V4, "MACH_V4" }, @@ -1057,7 +1058,7 @@ const char* to_string(HEXAGON_EFLAGS e) { } const char* to_string(IDENTITY e) { - const std::map enumStrings { + CONST_MAP(IDENTITY, const char*, 11) enumStrings { { IDENTITY::EI_MAG0, "MAG0" }, { IDENTITY::EI_MAG1, "MAG1" }, { IDENTITY::EI_MAG2, "MAG2" }, @@ -1076,7 +1077,7 @@ const char* to_string(IDENTITY e) { } const char* to_string(SYMBOL_SECTION_INDEX e) { - const std::map enumStrings { + CONST_MAP(SYMBOL_SECTION_INDEX, const char*, 10) enumStrings { { SYMBOL_SECTION_INDEX::SHN_UNDEF, "UNDEF" }, { SYMBOL_SECTION_INDEX::SHN_LORESERVE, "LORESERVE" }, { SYMBOL_SECTION_INDEX::SHN_LOPROC, "LOPROC" }, @@ -1095,7 +1096,7 @@ const char* to_string(SYMBOL_SECTION_INDEX e) { const char* to_string(DYNAMIC_FLAGS e) { - const std::map enum_strings { + CONST_MAP(DYNAMIC_FLAGS, const char*, 5) enum_strings { { DYNAMIC_FLAGS::DF_ORIGIN, "ORIGIN" }, { DYNAMIC_FLAGS::DF_SYMBOLIC, "SYMBOLIC" }, { DYNAMIC_FLAGS::DF_TEXTREL, "TEXTREL" }, @@ -1108,7 +1109,7 @@ const char* to_string(DYNAMIC_FLAGS e) { } const char* to_string(DYNAMIC_FLAGS_1 e) { - const std::map enum_strings_flags1 { + CONST_MAP(DYNAMIC_FLAGS_1, const char*, 26) enum_strings_flags1 { { DYNAMIC_FLAGS_1::DF_1_NOW, "NOW" }, { DYNAMIC_FLAGS_1::DF_1_GLOBAL, "GLOBAL" }, { DYNAMIC_FLAGS_1::DF_1_GROUP, "GROUP" }, @@ -1142,7 +1143,7 @@ const char* to_string(DYNAMIC_FLAGS_1 e) { } const char* to_string(ELF_SEGMENT_FLAGS e) { - const std::map enum_strings { + CONST_MAP(ELF_SEGMENT_FLAGS, const char*, 4) enum_strings { { ELF_SEGMENT_FLAGS::PF_NONE, "NONE" }, { ELF_SEGMENT_FLAGS::PF_X, "X" }, { ELF_SEGMENT_FLAGS::PF_W, "W" }, @@ -1155,7 +1156,7 @@ const char* to_string(ELF_SEGMENT_FLAGS e) { const char* to_string(ELF_SYMBOL_VISIBILITY e) { - const std::map enum_strings { + CONST_MAP(ELF_SYMBOL_VISIBILITY, const char*, 4) enum_strings { { ELF_SYMBOL_VISIBILITY::STV_DEFAULT, "DEFAULT" }, { ELF_SYMBOL_VISIBILITY::STV_HIDDEN, "HIDDEN" }, { ELF_SYMBOL_VISIBILITY::STV_INTERNAL, "INTERNAL" }, diff --git a/src/ELF/Header.cpp b/src/ELF/Header.cpp index d895804..4bab87b 100644 --- a/src/ELF/Header.cpp +++ b/src/ELF/Header.cpp @@ -19,16 +19,20 @@ #include #include +#include "frozen.hpp" + #include "LIEF/exception.hpp" #include "LIEF/ELF/hash.hpp" #include "LIEF/ELF/Header.hpp" #include "LIEF/ELF/EnumToString.hpp" +#include "LIEF/logging++.hpp" + namespace LIEF { namespace ELF { -static const std::map>> arch_elf_to_lief { +static const std::map arch_elf_to_lief { {ARCH::EM_NONE, {ARCH_NONE, {}}}, {ARCH::EM_X86_64, {ARCH_X86, {MODE_64}}}, {ARCH::EM_ARM, {ARCH_ARM, {MODE_32}}}, @@ -132,12 +136,13 @@ OBJECT_TYPES Header::abstract_object_type(void) const { } -std::pair> Header::abstract_architecture(void) const { - try { - return arch_elf_to_lief.at(this->machine_type()); - } catch (const std::out_of_range&) { - throw not_implemented(to_string(this->machine_type())); +Header::abstract_architecture_t Header::abstract_architecture(void) const { + auto&& it = arch_elf_to_lief.find(this->machine_type()); + if (it == std::end(arch_elf_to_lief)) { + LOG(ERROR) << to_string(this->machine_type()) << " is not supported!"; + return {}; } + return it->second; } diff --git a/src/ELF/Relocation.cpp b/src/ELF/Relocation.cpp index 0398f7d..15fd330 100644 --- a/src/ELF/Relocation.cpp +++ b/src/ELF/Relocation.cpp @@ -19,9 +19,11 @@ #include "LIEF/ELF/hash.hpp" #include "LIEF/ELF/Relocation.hpp" -#include "LIEF/ELF/RelocationSizes.hpp" #include "LIEF/ELF/EnumToString.hpp" +#include "RelocationSizes.hpp" +#include "LIEF/logging++.hpp" + namespace LIEF { namespace ELF { @@ -172,47 +174,48 @@ size_t Relocation::size(void) const { switch (this->architecture()) { case ARCH::EM_X86_64: { - try { - return relocation_x86_64_sizes.at(static_cast(this->type())); - } catch (const std::out_of_range&) { - throw not_implemented(to_string(this->architecture()) + std::string(" - ") + to_string(static_cast(this->type()))); + auto&& it = relocation_x86_64_sizes.find(static_cast(this->type())); + if (it == std::end(relocation_x86_64_sizes)) { + LOG(ERROR) << to_string(this->architecture()) << std::string(" - ") << to_string(static_cast(this->type())); + return -1u; } - break; + return it->second; } case ARCH::EM_386: { - try { - return relocation_i386_sizes.at(static_cast(this->type())); - } catch (const std::out_of_range&) { - throw not_implemented(to_string(this->architecture()) + std::string(" - ") + to_string(static_cast(this->type()))); + auto&& it = relocation_i386_sizes.find(static_cast(this->type())); + if (it == std::end(relocation_i386_sizes)) { + LOG(ERROR) << to_string(this->architecture()) << std::string(" - ") << to_string(static_cast(this->type())); + return -1u; } - break; + return it->second; } case ARCH::EM_ARM: { - try { - return relocation_ARM_sizes.at(static_cast(this->type())); - } catch (const std::out_of_range&) { - throw not_implemented(to_string(this->architecture()) + std::string(" - ") + to_string(static_cast(this->type()))); + auto&& it = relocation_ARM_sizes.find(static_cast(this->type())); + if (it == std::end(relocation_ARM_sizes)) { + LOG(ERROR) << to_string(this->architecture()) << std::string(" - ") << to_string(static_cast(this->type())); + return -1u; } - break; + return it->second; } case ARCH::EM_AARCH64: { - try { - return relocation_AARCH64_sizes.at(static_cast(this->type())); - } catch (const std::out_of_range&) { - throw not_implemented(to_string(this->architecture()) + std::string(" - ") + to_string(static_cast(this->type()))); + auto&& it = relocation_AARCH64_sizes.find(static_cast(this->type())); + if (it == std::end(relocation_AARCH64_sizes)) { + LOG(ERROR) << to_string(this->architecture()) << std::string(" - ") << to_string(static_cast(this->type())); + return -1u; } - break; + return it->second; } default: { - throw not_implemented(to_string(this->architecture())); + LOG(ERROR) << to_string(this->architecture()) << " not implemented"; + return -1u; } } diff --git a/src/ELF/RelocationSizes.hpp b/src/ELF/RelocationSizes.hpp new file mode 100644 index 0000000..8035220 --- /dev/null +++ b/src/ELF/RelocationSizes.hpp @@ -0,0 +1,387 @@ +/* Copyright 2017 R. Thomas + * Copyright 2017 Quarkslab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef LIEF_ELF_RELOCATIONSIZE_H_ +#define LIEF_ELF_RELOCATIONSIZE_H_ + +#include + +#include "LIEF/ELF/enums.hpp" +#include "frozen.hpp" + +namespace LIEF { +namespace ELF { + +CONST_MAP(RELOC_x86_64, uint32_t, 43) relocation_x86_64_sizes { + {RELOC_x86_64::R_X86_64_NONE, 0 }, + {RELOC_x86_64::R_X86_64_64, 64 }, + {RELOC_x86_64::R_X86_64_PC32, 32 }, + {RELOC_x86_64::R_X86_64_GOT32, 32 }, + {RELOC_x86_64::R_X86_64_PLT32, 32 }, + {RELOC_x86_64::R_X86_64_COPY, 32 }, + {RELOC_x86_64::R_X86_64_GLOB_DAT, 64 }, + {RELOC_x86_64::R_X86_64_JUMP_SLOT, 64 }, + {RELOC_x86_64::R_X86_64_RELATIVE, 64 }, + {RELOC_x86_64::R_X86_64_GOTPCREL, 32 }, + {RELOC_x86_64::R_X86_64_32, 32 }, + {RELOC_x86_64::R_X86_64_32S, 32 }, + {RELOC_x86_64::R_X86_64_16, 16 }, + {RELOC_x86_64::R_X86_64_PC16, 16 }, + {RELOC_x86_64::R_X86_64_8, 8 }, + {RELOC_x86_64::R_X86_64_PC8, 8 }, + {RELOC_x86_64::R_X86_64_DTPMOD64, 64 }, + {RELOC_x86_64::R_X86_64_DTPOFF64, 64 }, + {RELOC_x86_64::R_X86_64_TPOFF64, 64 }, + {RELOC_x86_64::R_X86_64_TLSGD, 32 }, + {RELOC_x86_64::R_X86_64_TLSLD, 32 }, + {RELOC_x86_64::R_X86_64_DTPOFF32, 32 }, + {RELOC_x86_64::R_X86_64_GOTTPOFF, 32 }, + {RELOC_x86_64::R_X86_64_TPOFF32, 32 }, + {RELOC_x86_64::R_X86_64_PC64, 64 }, + {RELOC_x86_64::R_X86_64_GOTOFF64, 64 }, + {RELOC_x86_64::R_X86_64_GOTPC32, 32 }, + {RELOC_x86_64::R_X86_64_GOT64, 64 }, + {RELOC_x86_64::R_X86_64_GOTPCREL64, 64 }, + {RELOC_x86_64::R_X86_64_GOTPC64, 64 }, + {RELOC_x86_64::R_X86_64_GOTPLT64, 64 }, + {RELOC_x86_64::R_X86_64_PLTOFF64, 64 }, + {RELOC_x86_64::R_X86_64_SIZE32, 32 }, + {RELOC_x86_64::R_X86_64_SIZE64, 64 }, + {RELOC_x86_64::R_X86_64_GOTPC32_TLSDESC, 32 }, + {RELOC_x86_64::R_X86_64_TLSDESC_CALL, 0 }, + {RELOC_x86_64::R_X86_64_TLSDESC, 64 }, + {RELOC_x86_64::R_X86_64_IRELATIVE, 64 }, + {RELOC_x86_64::R_X86_64_RELATIVE64, 64 }, + {RELOC_x86_64::R_X86_64_PC32_BND, 32 }, + {RELOC_x86_64::R_X86_64_PLT32_BND, 32 }, + {RELOC_x86_64::R_X86_64_GOTPCRELX, 32 }, + {RELOC_x86_64::R_X86_64_REX_GOTPCRELX, 32 }, +}; + +CONST_MAP(RELOC_i386, uint32_t, 40) relocation_i386_sizes { + {RELOC_i386::R_386_NONE, 0 }, + {RELOC_i386::R_386_32, 32 }, + {RELOC_i386::R_386_PC32, 32 }, + {RELOC_i386::R_386_GOT32, 32 }, + {RELOC_i386::R_386_PLT32, 32 }, + {RELOC_i386::R_386_COPY, 32 }, + {RELOC_i386::R_386_GLOB_DAT, 32 }, + {RELOC_i386::R_386_JUMP_SLOT, 32 }, + {RELOC_i386::R_386_RELATIVE, 32 }, + {RELOC_i386::R_386_GOTOFF, 32 }, + {RELOC_i386::R_386_GOTPC, 32 }, + {RELOC_i386::R_386_32PLT, 32 }, + {RELOC_i386::R_386_TLS_TPOFF, 32 }, + {RELOC_i386::R_386_TLS_IE, 32 }, + {RELOC_i386::R_386_TLS_GOTIE, 32 }, + {RELOC_i386::R_386_TLS_LE, 32 }, + {RELOC_i386::R_386_TLS_GD, 32 }, + {RELOC_i386::R_386_TLS_LDM, 32 }, + {RELOC_i386::R_386_16, 16 }, + {RELOC_i386::R_386_PC16, 16 }, + {RELOC_i386::R_386_8, 8 }, + {RELOC_i386::R_386_PC8, 8 }, + {RELOC_i386::R_386_TLS_GD_32, 32 }, + {RELOC_i386::R_386_TLS_GD_PUSH, 32 }, + {RELOC_i386::R_386_TLS_GD_CALL, 32 }, + {RELOC_i386::R_386_TLS_GD_POP, 32 }, + {RELOC_i386::R_386_TLS_LDM_32, 32 }, + {RELOC_i386::R_386_TLS_LDM_PUSH, 32 }, + {RELOC_i386::R_386_TLS_LDM_CALL, 0 }, + {RELOC_i386::R_386_TLS_LDM_POP, 32 }, + {RELOC_i386::R_386_TLS_LDO_32, 32 }, + {RELOC_i386::R_386_TLS_IE_32, 32 }, + {RELOC_i386::R_386_TLS_LE_32, 32 }, + {RELOC_i386::R_386_TLS_DTPMOD32, 32 }, + {RELOC_i386::R_386_TLS_DTPOFF32, 32 }, + {RELOC_i386::R_386_TLS_TPOFF32, 32 }, + {RELOC_i386::R_386_TLS_GOTDESC, 32 }, + {RELOC_i386::R_386_TLS_DESC_CALL, 32 }, + {RELOC_i386::R_386_TLS_DESC, 32 }, + {RELOC_i386::R_386_IRELATIVE, 32 }, +}; + +// From https://github.com/gittup/binutils/blob/gittup/bfd/elf32-arm.c#L75 +CONST_MAP(RELOC_ARM, uint32_t, 138) relocation_ARM_sizes { + {RELOC_ARM::R_ARM_NONE, 0 }, + {RELOC_ARM::R_ARM_PC24, 24 }, + {RELOC_ARM::R_ARM_ABS32, 32 }, + {RELOC_ARM::R_ARM_REL32, 32 }, + {RELOC_ARM::R_ARM_LDR_PC_G0, 32 }, + {RELOC_ARM::R_ARM_ABS16, 16 }, + {RELOC_ARM::R_ARM_ABS12, 12 }, + {RELOC_ARM::R_ARM_THM_ABS5, 5 }, + {RELOC_ARM::R_ARM_ABS8, 8 }, + {RELOC_ARM::R_ARM_SBREL32, 32 }, + {RELOC_ARM::R_ARM_THM_CALL, 25 }, + {RELOC_ARM::R_ARM_THM_PC8, 8 }, + {RELOC_ARM::R_ARM_BREL_ADJ, 32 }, + {RELOC_ARM::R_ARM_TLS_DESC, 0 }, + {RELOC_ARM::R_ARM_THM_SWI8, 0 }, + {RELOC_ARM::R_ARM_XPC25, 25 }, + {RELOC_ARM::R_ARM_THM_XPC22, 22 }, + {RELOC_ARM::R_ARM_TLS_DTPMOD32, 32 }, + {RELOC_ARM::R_ARM_TLS_DTPOFF32, 32 }, + {RELOC_ARM::R_ARM_TLS_TPOFF32, 32 }, + {RELOC_ARM::R_ARM_COPY, 32 }, + {RELOC_ARM::R_ARM_GLOB_DAT, 32 }, + {RELOC_ARM::R_ARM_JUMP_SLOT, 32 }, + {RELOC_ARM::R_ARM_RELATIVE, 32 }, + {RELOC_ARM::R_ARM_GOTOFF32, 32 }, + {RELOC_ARM::R_ARM_BASE_PREL, 32 }, + {RELOC_ARM::R_ARM_GOT_BREL, 32 }, + {RELOC_ARM::R_ARM_PLT32, 24 }, + {RELOC_ARM::R_ARM_CALL, 24 }, + {RELOC_ARM::R_ARM_JUMP24, 24 }, + {RELOC_ARM::R_ARM_THM_JUMP24, 24 }, + {RELOC_ARM::R_ARM_BASE_ABS, 21 }, + {RELOC_ARM::R_ARM_ALU_PCREL_7_0, 12 }, + {RELOC_ARM::R_ARM_ALU_PCREL_15_8, 12 }, + {RELOC_ARM::R_ARM_ALU_PCREL_23_15, 12 }, + {RELOC_ARM::R_ARM_LDR_SBREL_11_0_NC, 12 }, + {RELOC_ARM::R_ARM_ALU_SBREL_19_12_NC, 8 }, + {RELOC_ARM::R_ARM_ALU_SBREL_27_20_CK, 8 }, + {RELOC_ARM::R_ARM_TARGET1, 32 }, + {RELOC_ARM::R_ARM_SBREL31, 32 }, + {RELOC_ARM::R_ARM_V4BX, 32 }, + {RELOC_ARM::R_ARM_TARGET2, 32 }, + {RELOC_ARM::R_ARM_PREL31, 31 }, + {RELOC_ARM::R_ARM_MOVW_ABS_NC, 16 }, + {RELOC_ARM::R_ARM_MOVT_ABS, 16 }, + {RELOC_ARM::R_ARM_MOVW_PREL_NC, 16 }, + {RELOC_ARM::R_ARM_MOVT_PREL, 16 }, + {RELOC_ARM::R_ARM_THM_MOVW_ABS_NC, 16 }, + {RELOC_ARM::R_ARM_THM_MOVT_ABS, 16 }, + {RELOC_ARM::R_ARM_THM_MOVW_PREL_NC, 16 }, + {RELOC_ARM::R_ARM_THM_MOVT_PREL, 16 }, + {RELOC_ARM::R_ARM_THM_JUMP19, 19 }, + {RELOC_ARM::R_ARM_THM_JUMP6, 6 }, + {RELOC_ARM::R_ARM_THM_ALU_PREL_11_0, 13 }, + {RELOC_ARM::R_ARM_THM_PC12, 13 }, + {RELOC_ARM::R_ARM_ABS32_NOI, 32 }, + {RELOC_ARM::R_ARM_REL32_NOI, 32 }, + {RELOC_ARM::R_ARM_ALU_PC_G0_NC, 32 }, + {RELOC_ARM::R_ARM_ALU_PC_G0, 32 }, + {RELOC_ARM::R_ARM_ALU_PC_G1_NC, 32 }, + {RELOC_ARM::R_ARM_ALU_PC_G1, 32 }, + {RELOC_ARM::R_ARM_ALU_PC_G2, 32 }, + {RELOC_ARM::R_ARM_LDR_PC_G1, 32 }, + {RELOC_ARM::R_ARM_LDR_PC_G2, 32 }, + {RELOC_ARM::R_ARM_LDRS_PC_G0, 32 }, + {RELOC_ARM::R_ARM_LDRS_PC_G1, 32 }, + {RELOC_ARM::R_ARM_LDRS_PC_G2, 32 }, + {RELOC_ARM::R_ARM_LDC_PC_G0, 32 }, + {RELOC_ARM::R_ARM_LDC_PC_G1, 32 }, + {RELOC_ARM::R_ARM_LDC_PC_G2, 32 }, + {RELOC_ARM::R_ARM_ALU_SB_G0_NC, 32 }, + {RELOC_ARM::R_ARM_ALU_SB_G0, 32 }, + {RELOC_ARM::R_ARM_ALU_SB_G1_NC, 32 }, + {RELOC_ARM::R_ARM_ALU_SB_G1, 32 }, + {RELOC_ARM::R_ARM_ALU_SB_G2, 32 }, + {RELOC_ARM::R_ARM_LDR_SB_G0, 32 }, + {RELOC_ARM::R_ARM_LDR_SB_G1, 32 }, + {RELOC_ARM::R_ARM_LDR_SB_G2, 32 }, + {RELOC_ARM::R_ARM_LDRS_SB_G0, 32 }, + {RELOC_ARM::R_ARM_LDRS_SB_G1, 32 }, + {RELOC_ARM::R_ARM_LDRS_SB_G2, 32 }, + {RELOC_ARM::R_ARM_LDC_SB_G0, 32 }, + {RELOC_ARM::R_ARM_LDC_SB_G1, 32 }, + {RELOC_ARM::R_ARM_LDC_SB_G2, 32 }, + {RELOC_ARM::R_ARM_MOVW_BREL_NC, 16 }, + {RELOC_ARM::R_ARM_MOVT_BREL, 16 }, + {RELOC_ARM::R_ARM_MOVW_BREL, 16 }, + {RELOC_ARM::R_ARM_THM_MOVW_BREL_NC, 16 }, + {RELOC_ARM::R_ARM_THM_MOVT_BREL, 16 }, + {RELOC_ARM::R_ARM_THM_MOVW_BREL, 16 }, + {RELOC_ARM::R_ARM_TLS_GOTDESC, 0 }, + {RELOC_ARM::R_ARM_TLS_CALL, 0 }, + {RELOC_ARM::R_ARM_TLS_DESCSEQ, 0 }, + {RELOC_ARM::R_ARM_THM_TLS_CALL, 0 }, + {RELOC_ARM::R_ARM_PLT32_ABS, 32 }, + {RELOC_ARM::R_ARM_GOT_ABS, 32 }, + {RELOC_ARM::R_ARM_GOT_PREL, 32 }, + {RELOC_ARM::R_ARM_GOT_BREL12, 12 }, + {RELOC_ARM::R_ARM_GOTOFF12, 12 }, + {RELOC_ARM::R_ARM_GOTRELAX, 12 }, + {RELOC_ARM::R_ARM_GNU_VTENTRY, 0 }, + {RELOC_ARM::R_ARM_GNU_VTINHERIT, 0 }, + {RELOC_ARM::R_ARM_THM_JUMP11, 11 }, + {RELOC_ARM::R_ARM_THM_JUMP8, 8 }, + {RELOC_ARM::R_ARM_TLS_GD32, 32 }, + {RELOC_ARM::R_ARM_TLS_LDM32, 32 }, + {RELOC_ARM::R_ARM_TLS_LDO32, 32 }, + {RELOC_ARM::R_ARM_TLS_IE32, 32 }, + {RELOC_ARM::R_ARM_TLS_LE32, 32 }, + {RELOC_ARM::R_ARM_TLS_LDO12, 12 }, + {RELOC_ARM::R_ARM_TLS_LE12, 12 }, + {RELOC_ARM::R_ARM_TLS_IE12GP, 12 }, + {RELOC_ARM::R_ARM_PRIVATE_0, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_1, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_2, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_3, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_4, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_5, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_6, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_7, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_8, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_9, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_10, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_11, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_12, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_13, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_14, 0 }, + {RELOC_ARM::R_ARM_PRIVATE_15, 0 }, + {RELOC_ARM::R_ARM_ME_TOO, 0 }, + {RELOC_ARM::R_ARM_THM_TLS_DESCSEQ16, 0 }, + {RELOC_ARM::R_ARM_THM_TLS_DESCSEQ32, 0 }, + {RELOC_ARM::R_ARM_IRELATIVE, 0 }, + {RELOC_ARM::R_ARM_RXPC25, 25 }, + {RELOC_ARM::R_ARM_RSBREL32, 32 }, + {RELOC_ARM::R_ARM_THM_RPC22, 22 }, + {RELOC_ARM::R_ARM_RREL32, 32 }, + {RELOC_ARM::R_ARM_RPC24, 24 }, + {RELOC_ARM::R_ARM_RBASE, 0 }, +}; + +CONST_MAP(RELOC_AARCH64, uint32_t, 123) relocation_AARCH64_sizes { + { RELOC_AARCH64::R_AARCH64_NONE, 0 }, + { RELOC_AARCH64::R_AARCH64_ABS64, 64 }, + { RELOC_AARCH64::R_AARCH64_ABS32, 32 }, + { RELOC_AARCH64::R_AARCH64_ABS16, 16 }, + { RELOC_AARCH64::R_AARCH64_PREL64, 64 }, + { RELOC_AARCH64::R_AARCH64_PREL32, 32 }, + { RELOC_AARCH64::R_AARCH64_PREL16, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_UABS_G0, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_UABS_G0_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_UABS_G1, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_UABS_G1_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_UABS_G2, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_UABS_G2_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_UABS_G3, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_SABS_G0, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_SABS_G1, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_SABS_G2, 16 }, + { RELOC_AARCH64::R_AARCH64_LD_PREL_LO19, 19 }, + { RELOC_AARCH64::R_AARCH64_ADR_PREL_LO21, 21 }, + { RELOC_AARCH64::R_AARCH64_ADR_PREL_PG_HI21, 21 }, + { RELOC_AARCH64::R_AARCH64_ADR_PREL_PG_HI21_NC, 21 }, + { RELOC_AARCH64::R_AARCH64_ADD_ABS_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_LDST8_ABS_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TSTBR14, 14 }, + { RELOC_AARCH64::R_AARCH64_CONDBR19, 19 }, + { RELOC_AARCH64::R_AARCH64_JUMP26, 26 }, + { RELOC_AARCH64::R_AARCH64_CALL26, 26 }, + { RELOC_AARCH64::R_AARCH64_LDST16_ABS_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_LDST32_ABS_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_LDST64_ABS_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_MOVW_PREL_G0, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_PREL_G0_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_PREL_G1, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_PREL_G1_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_PREL_G2, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_PREL_G2_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_PREL_G3, 16 }, + { RELOC_AARCH64::R_AARCH64_LDST128_ABS_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G0, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G0_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G1, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G1_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G2, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G2_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G3, 16 }, + { RELOC_AARCH64::R_AARCH64_GOTREL64, 64 }, + { RELOC_AARCH64::R_AARCH64_GOTREL32, 64 }, + { RELOC_AARCH64::R_AARCH64_GOT_LD_PREL19, 19 }, + { RELOC_AARCH64::R_AARCH64_LD64_GOTOFF_LO15, 15 }, + { RELOC_AARCH64::R_AARCH64_ADR_GOT_PAGE, 21 }, + { RELOC_AARCH64::R_AARCH64_LD64_GOT_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_LD64_GOTPAGE_LO15, 15 }, + { RELOC_AARCH64::R_AARCH64_TLSGD_ADR_PREL21, 21 }, + { RELOC_AARCH64::R_AARCH64_TLSGD_ADR_PAGE21, 21 }, + { RELOC_AARCH64::R_AARCH64_TLSGD_ADD_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSGD_MOVW_G1, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSGD_MOVW_G0_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_ADR_PREL21, 21 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_ADR_PAGE21, 21 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_ADD_LO12_NC, 0 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_G1, 0 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_G0_NC, 0 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_LD_PREL19, 19 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G2, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G1, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G0, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_HI12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_LDST8_DTPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_LDST16_DTPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_LDST32_DTPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_LDST64_DTPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSIE_MOVW_GOTTPREL_G1, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, 21 }, + { RELOC_AARCH64::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSIE_LD_GOTTPREL_PREL19, 19 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G2, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G1, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G1_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G0, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC, 16 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_HI12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_LDST8_TPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_LDST16_TPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_LDST32_TPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_LDST64_TPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSDESC_LD_PREL19, 19 }, + { RELOC_AARCH64::R_AARCH64_TLSDESC_ADR_PREL21, 21 }, + { RELOC_AARCH64::R_AARCH64_TLSDESC_ADR_PAGE21, 21 }, + { RELOC_AARCH64::R_AARCH64_TLSDESC_LD64_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSDESC_ADD_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSDESC_OFF_G1, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSDESC_OFF_G0_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSDESC_LDR, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSDESC_ADD, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSDESC_CALL, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_LDST128_TPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_LDST128_DTPREL_LO12, 12 }, + { RELOC_AARCH64::R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC, 12 }, + { RELOC_AARCH64::R_AARCH64_COPY, 64 }, + { RELOC_AARCH64::R_AARCH64_GLOB_DAT, 64 }, + { RELOC_AARCH64::R_AARCH64_JUMP_SLOT, 64 }, + { RELOC_AARCH64::R_AARCH64_RELATIVE, 64 }, + { RELOC_AARCH64::R_AARCH64_TLS_DTPREL64, 64 }, + { RELOC_AARCH64::R_AARCH64_TLS_DTPMOD64, 64 }, + { RELOC_AARCH64::R_AARCH64_TLS_TPREL64, 64 }, + { RELOC_AARCH64::R_AARCH64_TLSDESC, 64 }, + { RELOC_AARCH64::R_AARCH64_IRELATIVE, 64 }, +}; + +} +} + +#endif diff --git a/src/MachO/EnumToString.cpp b/src/MachO/EnumToString.cpp index db2ec7b..a512106 100644 --- a/src/MachO/EnumToString.cpp +++ b/src/MachO/EnumToString.cpp @@ -15,14 +15,14 @@ */ #include "LIEF/MachO/Structures.hpp" #include "LIEF/MachO/EnumToString.hpp" -#include +#include "frozen.hpp" namespace LIEF { namespace MachO { const char* to_string(MACHO_TYPES e) { - const std::map enumStrings { + CONST_MAP(MACHO_TYPES, const char*, 6) enumStrings { { MACHO_TYPES::MH_MAGIC, "MAGIC"}, { MACHO_TYPES::MH_CIGAM, "CIGAM"}, { MACHO_TYPES::MH_MAGIC_64, "MAGIC_64"}, @@ -36,7 +36,7 @@ const char* to_string(MACHO_TYPES e) { const char* to_string(FILE_TYPES e) { - const std::map enumStrings { + CONST_MAP(FILE_TYPES, const char*, 11) enumStrings { { FILE_TYPES::MH_OBJECT, "OBJECT"}, { FILE_TYPES::MH_EXECUTE, "EXECUTE"}, { FILE_TYPES::MH_FVMLIB, "FVMLIB"}, @@ -54,7 +54,7 @@ const char* to_string(FILE_TYPES e) { } const char* to_string(LOAD_COMMAND_TYPES e) { - const std::map enumStrings { + CONST_MAP(LOAD_COMMAND_TYPES, const char*, 49) enumStrings { { LOAD_COMMAND_TYPES::LC_SEGMENT, "SEGMENT"}, { LOAD_COMMAND_TYPES::LC_SYMTAB, "SYMTAB"}, { LOAD_COMMAND_TYPES::LC_SYMSEG, "SYMSEG"}, @@ -110,7 +110,7 @@ const char* to_string(LOAD_COMMAND_TYPES e) { } const char* to_string(CPU_TYPES e) { - const std::map enumStrings { + CONST_MAP(CPU_TYPES, const char*, 10) enumStrings { { CPU_TYPES::CPU_TYPE_ANY, "ANY"}, { CPU_TYPES::CPU_TYPE_X86, "x86"}, { CPU_TYPES::CPU_TYPE_I386, "i386"}, @@ -128,7 +128,7 @@ const char* to_string(CPU_TYPES e) { } const char* to_string(HEADER_FLAGS e) { - const std::map enumStrings { + CONST_MAP(HEADER_FLAGS, const char*, 26) enumStrings { { HEADER_FLAGS::MH_NOUNDEFS ,"NOUNDEFS"}, { HEADER_FLAGS::MH_INCRLINK ,"INCRLINK"}, { HEADER_FLAGS::MH_DYLDLINK ,"DYLDLINK"}, @@ -161,7 +161,7 @@ const char* to_string(HEADER_FLAGS e) { } const char* to_string(MACHO_SECTION_TYPES e) { - const std::map enumStrings { + CONST_MAP(MACHO_SECTION_TYPES, const char*, 22) enumStrings { { MACHO_SECTION_TYPES::S_REGULAR, "REGULAR"}, { MACHO_SECTION_TYPES::S_ZEROFILL, "ZEROFILL"}, { MACHO_SECTION_TYPES::S_CSTRING_LITERALS, "CSTRING_LITERALS"}, @@ -190,7 +190,7 @@ const char* to_string(MACHO_SECTION_TYPES e) { } const char* to_string(MACHO_SECTION_FLAGS e) { - const std::map enumStrings { + CONST_MAP(MACHO_SECTION_FLAGS, const char*, 10) enumStrings { { MACHO_SECTION_FLAGS::S_ATTR_PURE_INSTRUCTIONS, "PURE_INSTRUCTIONS"}, { MACHO_SECTION_FLAGS::S_ATTR_NO_TOC, "NO_TOC"}, { MACHO_SECTION_FLAGS::S_ATTR_STRIP_STATIC_SYMS, "STRIP_STATIC_SYMS"}, @@ -208,7 +208,7 @@ const char* to_string(MACHO_SECTION_FLAGS e) { const char* to_string(MACHO_SYMBOL_TYPES e) { - const std::map enumStrings { + CONST_MAP(MACHO_SYMBOL_TYPES, const char*, 4) enumStrings { { MACHO_SYMBOL_TYPES::N_STAB, "STAB"}, { MACHO_SYMBOL_TYPES::N_PEXT, "PEXT"}, { MACHO_SYMBOL_TYPES::N_TYPE, "TYPE"}, @@ -219,7 +219,7 @@ const char* to_string(MACHO_SYMBOL_TYPES e) { } const char* to_string(N_LIST_TYPES e) { - const std::map enumStrings { + CONST_MAP(N_LIST_TYPES, const char*, 5) enumStrings { { N_LIST_TYPES::N_UNDF, "UNDF"}, { N_LIST_TYPES::N_ABS, "ABS"}, { N_LIST_TYPES::N_SECT, "SECT"}, @@ -231,7 +231,7 @@ const char* to_string(N_LIST_TYPES e) { } const char* to_string(SYMBOL_DESCRIPTIONS e) { - const std::map enumStrings { + CONST_MAP(SYMBOL_DESCRIPTIONS, const char*, 17) enumStrings { { SYMBOL_DESCRIPTIONS::REFERENCE_FLAG_UNDEFINED_NON_LAZY, "FLAG_UNDEFINED_NON_LAZY"}, { SYMBOL_DESCRIPTIONS::REFERENCE_FLAG_UNDEFINED_LAZY, "FLAG_UNDEFINED_LAZY"}, { SYMBOL_DESCRIPTIONS::REFERENCE_FLAG_DEFINED, "FLAG_DEFINED"}, @@ -255,7 +255,7 @@ const char* to_string(SYMBOL_DESCRIPTIONS e) { } const char* to_string(X86_RELOCATION e) { - const std::map enumStrings { + CONST_MAP(X86_RELOCATION, const char*, 6) enumStrings { { X86_RELOCATION::GENERIC_RELOC_VANILLA, "VANILLA" }, { X86_RELOCATION::GENERIC_RELOC_PAIR, "PAIR" }, { X86_RELOCATION::GENERIC_RELOC_SECTDIFF, "SECTDIFF" }, @@ -269,7 +269,7 @@ const char* to_string(X86_RELOCATION e) { const char* to_string(X86_64_RELOCATION e) { - const std::map enumStrings { + CONST_MAP(X86_64_RELOCATION, const char*, 10) enumStrings { { X86_64_RELOCATION::X86_64_RELOC_UNSIGNED, "UNSIGNED" }, { X86_64_RELOCATION::X86_64_RELOC_SIGNED, "SIGNED" }, { X86_64_RELOCATION::X86_64_RELOC_BRANCH, "BRANCH" }, @@ -287,7 +287,7 @@ const char* to_string(X86_64_RELOCATION e) { const char* to_string(PPC_RELOCATION e) { - const std::map enumStrings { + CONST_MAP(PPC_RELOCATION, const char*, 16) enumStrings { { PPC_RELOCATION::PPC_RELOC_VANILLA, "VANILLA" }, { PPC_RELOCATION::PPC_RELOC_PAIR, "PAIR" }, { PPC_RELOCATION::PPC_RELOC_BR14, "BR14" }, @@ -311,7 +311,7 @@ const char* to_string(PPC_RELOCATION e) { const char* to_string(ARM_RELOCATION e) { - const std::map enumStrings { + CONST_MAP(ARM_RELOCATION, const char*, 10) enumStrings { { ARM_RELOCATION::ARM_RELOC_VANILLA, "VANILLA" }, { ARM_RELOCATION::ARM_RELOC_PAIR, "PAIR" }, { ARM_RELOCATION::ARM_RELOC_SECTDIFF, "SECTDIFF" }, @@ -329,7 +329,7 @@ const char* to_string(ARM_RELOCATION e) { const char* to_string(ARM64_RELOCATION e) { - const std::map enumStrings { + CONST_MAP(ARM64_RELOCATION, const char*, 11) enumStrings { { ARM64_RELOCATION::ARM64_RELOC_UNSIGNED, "UNSIGNED" }, { ARM64_RELOCATION::ARM64_RELOC_SUBTRACTOR, "SUBTRACTOR" }, { ARM64_RELOCATION::ARM64_RELOC_BRANCH26, "BRANCH26" }, @@ -347,7 +347,7 @@ const char* to_string(ARM64_RELOCATION e) { } const char* to_string(RELOCATION_ORIGINS e) { - const std::map enumStrings { + CONST_MAP(RELOCATION_ORIGINS, const char*, 3) enumStrings { { RELOCATION_ORIGINS::ORIGIN_UNKNOWN, "UNKNOWN" }, { RELOCATION_ORIGINS::ORIGIN_DYLDINFO, "DYLDINFO" }, { RELOCATION_ORIGINS::ORIGIN_RELOC_TABLE, "RELOC_TABLE" }, @@ -357,7 +357,7 @@ const char* to_string(RELOCATION_ORIGINS e) { } const char* to_string(REBASE_TYPES e) { - const std::map enumStrings { + CONST_MAP(REBASE_TYPES, const char*, 3) enumStrings { { REBASE_TYPES::REBASE_TYPE_POINTER, "POINTER" }, { REBASE_TYPES::REBASE_TYPE_TEXT_ABSOLUTE32, "TEXT_ABSOLUTE32" }, { REBASE_TYPES::REBASE_TYPE_TEXT_PCREL32, "TEXT_PCREL32" }, @@ -368,7 +368,7 @@ const char* to_string(REBASE_TYPES e) { const char* to_string(BINDING_CLASS e) { - const std::map enumStrings { + CONST_MAP(BINDING_CLASS, const char*, 3) enumStrings { { BINDING_CLASS::BIND_CLASS_WEAK, "WEAK" }, { BINDING_CLASS::BIND_CLASS_LAZY, "LAZY" }, { BINDING_CLASS::BIND_CLASS_STANDARD, "STANDARD" }, @@ -379,7 +379,7 @@ const char* to_string(BINDING_CLASS e) { const char* to_string(REBASE_OPCODES e) { - const std::map enumStrings { + CONST_MAP(REBASE_OPCODES, const char*, 9) enumStrings { { REBASE_OPCODES::REBASE_OPCODE_DONE, "DONE" }, { REBASE_OPCODES::REBASE_OPCODE_SET_TYPE_IMM, "SET_TYPE_IMM" }, { REBASE_OPCODES::REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB, "SET_SEGMENT_AND_OFFSET_ULEB" }, @@ -396,7 +396,7 @@ const char* to_string(REBASE_OPCODES e) { const char* to_string(BIND_TYPES e) { - const std::map enumStrings { + CONST_MAP(BIND_TYPES, const char*, 3) enumStrings { { BIND_TYPES::BIND_TYPE_POINTER, "POINTER" }, { BIND_TYPES::BIND_TYPE_TEXT_ABSOLUTE32, "TEXT_ABSOLUTE32" }, { BIND_TYPES::BIND_TYPE_TEXT_PCREL32, "TEXT_PCREL32" }, @@ -407,7 +407,7 @@ const char* to_string(BIND_TYPES e) { const char* to_string(BIND_SPECIAL_DYLIB e) { - const std::map enumStrings { + CONST_MAP(BIND_SPECIAL_DYLIB, const char*, 3) enumStrings { { BIND_SPECIAL_DYLIB::BIND_SPECIAL_DYLIB_SELF, "SELF" }, { BIND_SPECIAL_DYLIB::BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE, "MAIN_EXECUTABLE" }, { BIND_SPECIAL_DYLIB::BIND_SPECIAL_DYLIB_FLAT_LOOKUP, "FLAT_LOOKUP" }, @@ -418,7 +418,7 @@ const char* to_string(BIND_SPECIAL_DYLIB e) { const char* to_string(BIND_OPCODES e) { - const std::map enumStrings { + CONST_MAP(BIND_OPCODES, const char*, 13) enumStrings { { BIND_OPCODES::BIND_OPCODE_DONE, "DONE" }, { BIND_OPCODES::BIND_OPCODE_SET_DYLIB_ORDINAL_IMM, "SET_DYLIB_ORDINAL_IMM" }, { BIND_OPCODES::BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB, "SET_DYLIB_ORDINAL_ULEB" }, @@ -439,7 +439,7 @@ const char* to_string(BIND_OPCODES e) { const char* to_string(EXPORT_SYMBOL_KINDS e) { - const std::map enumStrings { + CONST_MAP(EXPORT_SYMBOL_KINDS, const char*, 3) enumStrings { { EXPORT_SYMBOL_KINDS::EXPORT_SYMBOL_FLAGS_KIND_REGULAR, "REGULAR" }, { EXPORT_SYMBOL_KINDS::EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL, "THREAD_LOCAL" }, { EXPORT_SYMBOL_KINDS::EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE, "ABSOLUTE" }, @@ -450,7 +450,7 @@ const char* to_string(EXPORT_SYMBOL_KINDS e) { const char* to_string(VM_PROTECTIONS e) { - const std::map enumStrings { + CONST_MAP(VM_PROTECTIONS, const char*, 3) enumStrings { { VM_PROTECTIONS::VM_PROT_READ, "READ" }, { VM_PROTECTIONS::VM_PROT_WRITE, "WRITE" }, { VM_PROTECTIONS::VM_PROT_EXECUTE, "EXECUTE" }, @@ -461,7 +461,7 @@ const char* to_string(VM_PROTECTIONS e) { const char* to_string(SYMBOL_ORIGINS e) { - const std::map enumStrings { + CONST_MAP(SYMBOL_ORIGINS, const char*, 3) enumStrings { { SYMBOL_ORIGINS::SYM_ORIGIN_UNKNOWN, "UNKNOWN" }, { SYMBOL_ORIGINS::SYM_ORIGIN_DYLD_EXPORT, "DYLD_EXPORT" }, { SYMBOL_ORIGINS::SYM_ORIGIN_LC_SYMTAB, "LC_SYMTAB" }, diff --git a/src/PE/EnumToString.cpp b/src/PE/EnumToString.cpp index 6f976da..be9b525 100644 --- a/src/PE/EnumToString.cpp +++ b/src/PE/EnumToString.cpp @@ -15,13 +15,14 @@ */ #include "LIEF/PE/Structures.hpp" #include "LIEF/PE/EnumToString.hpp" -#include + +#include "frozen.hpp" namespace LIEF { namespace PE { const char* to_string(PE_TYPE e) { - const std::map enumStrings { + CONST_MAP(PE_TYPE, const char*, 2) enumStrings { { PE_TYPE::PE32, "PE32" }, { PE_TYPE::PE32_PLUS,"PE32_PLUS" }, }; @@ -30,7 +31,7 @@ const char* to_string(PE_TYPE e) { } const char* to_string(DATA_DIRECTORY e) { - const std::map enumStrings { + CONST_MAP(DATA_DIRECTORY, const char*, 15) enumStrings { { DATA_DIRECTORY::EXPORT_TABLE, "EXPORT_TABLE" }, { DATA_DIRECTORY::IMPORT_TABLE, "IMPORT_TABLE" }, { DATA_DIRECTORY::RESOURCE_TABLE, "RESOURCE_TABLE" }, @@ -53,7 +54,7 @@ const char* to_string(DATA_DIRECTORY e) { const char* to_string(MACHINE_TYPES e) { - const std::map enumStrings { + CONST_MAP(MACHINE_TYPES, const char*, 25) enumStrings { { MACHINE_TYPES::MT_Invalid, "INVALID" }, { MACHINE_TYPES::IMAGE_FILE_MACHINE_UNKNOWN, "UNKNOWN" }, { MACHINE_TYPES::IMAGE_FILE_MACHINE_AM33, "AM33" }, @@ -87,7 +88,7 @@ const char* to_string(MACHINE_TYPES e) { const char* to_string(HEADER_CHARACTERISTICS e) { - const std::map enumStrings { + CONST_MAP(HEADER_CHARACTERISTICS, const char*, 15) enumStrings { { HEADER_CHARACTERISTICS::IMAGE_FILE_RELOCS_STRIPPED, "RELOCS_STRIPPED" }, { HEADER_CHARACTERISTICS::IMAGE_FILE_EXECUTABLE_IMAGE, "EXECUTABLE_IMAGE" }, { HEADER_CHARACTERISTICS::IMAGE_FILE_LINE_NUMS_STRIPPED, "LINE_NUMS_STRIPPED" }, @@ -110,7 +111,7 @@ const char* to_string(HEADER_CHARACTERISTICS e) { const char* to_string(SUBSYSTEM e) { - const std::map enumStrings { + CONST_MAP(SUBSYSTEM, const char*, 14) enumStrings { { SUBSYSTEM::IMAGE_SUBSYSTEM_UNKNOWN, "UNKNOWN" }, { SUBSYSTEM::IMAGE_SUBSYSTEM_NATIVE, "NATIVE" }, { SUBSYSTEM::IMAGE_SUBSYSTEM_WINDOWS_GUI, "WINDOWS_GUI" }, @@ -132,7 +133,7 @@ const char* to_string(SUBSYSTEM e) { const char* to_string(DLL_CHARACTERISTICS e) { - const std::map enumStrings { + CONST_MAP(DLL_CHARACTERISTICS, const char*, 11) enumStrings { { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, "HIGH_ENTROPY_VA" }, { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, "DYNAMIC_BASE" }, { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY, "FORCE_INTEGRITY" }, @@ -151,7 +152,7 @@ const char* to_string(DLL_CHARACTERISTICS e) { const char* to_string(SECTION_CHARACTERISTICS e) { - const std::map enumStrings { + CONST_MAP(SECTION_CHARACTERISTICS, const char*, 35) enumStrings { { SECTION_CHARACTERISTICS::IMAGE_SCN_TYPE_NO_PAD, "TYPE_NO_PAD" }, { SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_CODE, "CNT_CODE" }, { SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_INITIALIZED_DATA, "CNT_INITIALIZED_DATA" }, @@ -194,7 +195,7 @@ const char* to_string(SECTION_CHARACTERISTICS e) { const char* to_string(PE_SECTION_TYPES e) { - const std::map enumStrings { + CONST_MAP(PE_SECTION_TYPES, const char*, 10) enumStrings { { PE_SECTION_TYPES::TEXT, "TEXT" }, { PE_SECTION_TYPES::TLS, "TLS_" }, { PE_SECTION_TYPES::IMPORT, "IDATA" }, @@ -211,7 +212,7 @@ const char* to_string(PE_SECTION_TYPES e) { } const char* to_string(SYMBOL_BASE_TYPES e) { - const std::map enumStrings { + CONST_MAP(SYMBOL_BASE_TYPES, const char*, 16) enumStrings { { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_NULL, "NULL" }, { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_VOID, "VOID" }, { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_CHAR, "CHAR" }, @@ -234,7 +235,7 @@ const char* to_string(SYMBOL_BASE_TYPES e) { } const char* to_string(SYMBOL_COMPLEX_TYPES e) { - const std::map enumStrings { + CONST_MAP(SYMBOL_COMPLEX_TYPES, const char*, 5) enumStrings { { SYMBOL_COMPLEX_TYPES::IMAGE_SYM_DTYPE_NULL, "NULL" }, { SYMBOL_COMPLEX_TYPES::IMAGE_SYM_DTYPE_POINTER, "POINTER" }, { SYMBOL_COMPLEX_TYPES::IMAGE_SYM_DTYPE_FUNCTION, "FUNCTION" }, @@ -247,7 +248,7 @@ const char* to_string(SYMBOL_COMPLEX_TYPES e) { const char* to_string(SYMBOL_SECTION_NUMBER e) { - const std::map enumStrings { + CONST_MAP(SYMBOL_SECTION_NUMBER, const char*, 3) enumStrings { { SYMBOL_SECTION_NUMBER::IMAGE_SYM_DEBUG, "DEBUG" }, { SYMBOL_SECTION_NUMBER::IMAGE_SYM_ABSOLUTE, "ABSOLUTE" }, { SYMBOL_SECTION_NUMBER::IMAGE_SYM_UNDEFINED, "UNDEFINED" }, @@ -258,7 +259,7 @@ const char* to_string(SYMBOL_SECTION_NUMBER e) { const char* to_string(SYMBOL_STORAGE_CLASS e) { - const std::map enumStrings { + CONST_MAP(SYMBOL_STORAGE_CLASS, const char*, 24) enumStrings { { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_END_OF_FUNCTION, "END_OF_FUNCTION" }, { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_NULL, "NULL" }, { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_AUTOMATIC, "AUTOMATIC" }, @@ -290,7 +291,7 @@ const char* to_string(SYMBOL_STORAGE_CLASS e) { const char* to_string(RELOCATIONS_I386 e) { - const std::map enumStrings { + CONST_MAP(RELOCATIONS_I386, const char*, 11) enumStrings { { RELOCATIONS_I386::IMAGE_REL_I386_ABSOLUTE, "ABSOLUTE" }, { RELOCATIONS_I386::IMAGE_REL_I386_DIR16, "DIR16" }, { RELOCATIONS_I386::IMAGE_REL_I386_REL16, "REL16" }, @@ -311,7 +312,7 @@ const char* to_string(RELOCATIONS_I386 e) { const char* to_string(RELOCATIONS_AMD64 e) { - const std::map enumStrings { + CONST_MAP(RELOCATIONS_AMD64, const char*, 17) enumStrings { { RELOCATIONS_AMD64::IMAGE_REL_AMD64_ABSOLUTE, "ABSOLUTE" }, { RELOCATIONS_AMD64::IMAGE_REL_AMD64_ADDR64, "ADDR64" }, { RELOCATIONS_AMD64::IMAGE_REL_AMD64_ADDR32, "ADDR32" }, @@ -338,7 +339,7 @@ const char* to_string(RELOCATIONS_AMD64 e) { const char* to_string(RELOCATIONS_ARM e) { - const std::map enumStrings { + CONST_MAP(RELOCATIONS_ARM, const char*, 15) enumStrings { { RELOCATIONS_ARM::IMAGE_REL_ARM_ABSOLUTE, "ABSOLUTE" }, { RELOCATIONS_ARM::IMAGE_REL_ARM_ADDR32, "ADDR32" }, { RELOCATIONS_ARM::IMAGE_REL_ARM_ADDR32NB, "ADDR32NB" }, @@ -362,7 +363,7 @@ const char* to_string(RELOCATIONS_ARM e) { const char* to_string(RELOCATIONS_BASE_TYPES e) { - const std::map enumStrings { + CONST_MAP(RELOCATIONS_BASE_TYPES, const char*, 12) enumStrings { { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_ABSOLUTE, "ABSOLUTE" }, { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_HIGH, "HIGH" }, { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_LOW, "LOW" }, @@ -384,7 +385,7 @@ const char* to_string(RELOCATIONS_BASE_TYPES e) { const char* to_string(DEBUG_TYPES e) { - const std::map enumStrings { + CONST_MAP(DEBUG_TYPES, const char*, 16) enumStrings { { DEBUG_TYPES::IMAGE_DEBUG_TYPE_UNKNOWN, "UNKNOWN" }, { DEBUG_TYPES::IMAGE_DEBUG_TYPE_COFF, "COFF" }, { DEBUG_TYPES::IMAGE_DEBUG_TYPE_CODEVIEW, "CODEVIEW" }, @@ -409,7 +410,7 @@ const char* to_string(DEBUG_TYPES e) { const char* to_string(RESOURCE_TYPES e) { - const std::map enumStrings { + CONST_MAP(RESOURCE_TYPES, const char*, 21) enumStrings { { RESOURCE_TYPES::CURSOR, "CURSOR" }, { RESOURCE_TYPES::BITMAP, "BITMAP" }, { RESOURCE_TYPES::ICON, "ICON" }, @@ -438,7 +439,7 @@ const char* to_string(RESOURCE_TYPES e) { } const char* to_string(RESOURCE_LANGS e) { - const std::map enumStrings { + CONST_MAP(RESOURCE_LANGS, const char*, 103) enumStrings { { RESOURCE_LANGS::LANG_NEUTRAL, "NEUTRAL" }, { RESOURCE_LANGS::LANG_INVARIANT, "INVARIANT" }, { RESOURCE_LANGS::LANG_AFRIKAANS, "AFRIKAANS" }, @@ -549,7 +550,7 @@ const char* to_string(RESOURCE_LANGS e) { } const char* to_string(RESOURCE_SUBLANGS e) { - const std::map enumStrings { + CONST_MAP(RESOURCE_SUBLANGS, const char*, 229) enumStrings { { RESOURCE_SUBLANGS::SUBLANG_AFRIKAANS_SOUTH_AFRICA, "AFRIKAANS_SOUTH_AFRICA" }, { RESOURCE_SUBLANGS::SUBLANG_ALBANIAN_ALBANIA, "ALBANIAN_ALBANIA" }, { RESOURCE_SUBLANGS::SUBLANG_ALSATIAN_FRANCE, "ALSATIAN_FRANCE" }, @@ -786,7 +787,7 @@ const char* to_string(RESOURCE_SUBLANGS e) { } const char* to_string(EXTENDED_WINDOW_STYLES e) { - const std::map enumStrings { + CONST_MAP(EXTENDED_WINDOW_STYLES, const char*, 19) enumStrings { { EXTENDED_WINDOW_STYLES::WS_EX_DLGMODALFRAME, "DLGMODALFRAME" }, { EXTENDED_WINDOW_STYLES::WS_EX_NOPARENTNOTIFY, "NOPARENTNOTIFY" }, { EXTENDED_WINDOW_STYLES::WS_EX_TOPMOST, "TOPMOST" }, @@ -814,7 +815,7 @@ const char* to_string(EXTENDED_WINDOW_STYLES e) { const char* to_string(WINDOW_STYLES e) { - const std::map enumStrings { + CONST_MAP(WINDOW_STYLES, const char*, 20) enumStrings { { WINDOW_STYLES::WS_OVERLAPPED, "OVERLAPPED" }, { WINDOW_STYLES::WS_POPUP, "POPUP" }, { WINDOW_STYLES::WS_CHILD, "CHILD" }, @@ -843,7 +844,7 @@ const char* to_string(WINDOW_STYLES e) { const char* to_string(DIALOG_BOX_STYLES e) { - const std::map enumStrings { + CONST_MAP(DIALOG_BOX_STYLES, const char*, 15) enumStrings { { DIALOG_BOX_STYLES::DS_ABSALIGN, "ABSALIGN" }, { DIALOG_BOX_STYLES::DS_SYSMODAL, "SYSMODAL" }, { DIALOG_BOX_STYLES::DS_LOCALEDIT, "LOCALEDIT" }, @@ -867,7 +868,7 @@ const char* to_string(DIALOG_BOX_STYLES e) { const char* to_string(FIXED_VERSION_OS e) { - const std::map enumStrings { + CONST_MAP(FIXED_VERSION_OS, const char*, 14) enumStrings { { FIXED_VERSION_OS::VOS_UNKNOWN, "UNKNOWN" }, { FIXED_VERSION_OS::VOS_DOS, "DOS" }, { FIXED_VERSION_OS::VOS_NT, "NT" }, @@ -889,7 +890,7 @@ const char* to_string(FIXED_VERSION_OS e) { const char* to_string(FIXED_VERSION_FILE_FLAGS e) { - const std::map enumStrings { + CONST_MAP(FIXED_VERSION_FILE_FLAGS, const char*, 6) enumStrings { { FIXED_VERSION_FILE_FLAGS::VS_FF_DEBUG, "DEBUG" }, { FIXED_VERSION_FILE_FLAGS::VS_FF_INFOINFERRED, "INFOINFERRED" }, { FIXED_VERSION_FILE_FLAGS::VS_FF_PATCHED, "PATCHED" }, @@ -903,7 +904,7 @@ const char* to_string(FIXED_VERSION_FILE_FLAGS e) { const char* to_string(FIXED_VERSION_FILE_TYPES e) { - const std::map enumStrings { + CONST_MAP(FIXED_VERSION_FILE_TYPES, const char*, 7) enumStrings { { FIXED_VERSION_FILE_TYPES::VFT_APP, "APP" }, { FIXED_VERSION_FILE_TYPES::VFT_DLL, "DLL" }, { FIXED_VERSION_FILE_TYPES::VFT_DRV, "DRV" }, @@ -918,7 +919,7 @@ const char* to_string(FIXED_VERSION_FILE_TYPES e) { const char* to_string(FIXED_VERSION_FILE_SUB_TYPES e) { - const std::map enumStrings { + CONST_MAP(FIXED_VERSION_FILE_SUB_TYPES, const char*, 15) enumStrings { { FIXED_VERSION_FILE_SUB_TYPES::VFT2_DRV_COMM, "DRV_COMM" }, { FIXED_VERSION_FILE_SUB_TYPES::VFT2_DRV_DISPLAY, "DRV_DISPLAY" }, { FIXED_VERSION_FILE_SUB_TYPES::VFT2_DRV_INSTALLABLE, "DRV_INSTALLABLE" }, @@ -940,7 +941,7 @@ const char* to_string(FIXED_VERSION_FILE_SUB_TYPES e) { } const char* to_string(CODE_PAGES e) { - const std::map enumStrings { + CONST_MAP(CODE_PAGES, const char*, 140) enumStrings { { CODE_PAGES::CP_IBM037, "IBM037"}, { CODE_PAGES::CP_IBM437, "IBM437"}, { CODE_PAGES::CP_IBM500, "IBM500"}, @@ -1089,7 +1090,7 @@ const char* to_string(CODE_PAGES e) { const char* to_string(WIN_VERSION e) { - const std::map enumStrings { + CONST_MAP(WIN_VERSION, const char*, 9) enumStrings { { WIN_VERSION::WIN_UNKNOWN, "UNKNOWN" }, { WIN_VERSION::WIN_SEH, "SEH" }, { WIN_VERSION::WIN8_1, "WIN_8_1" }, @@ -1106,7 +1107,7 @@ const char* to_string(WIN_VERSION e) { const char* to_string(GUARD_CF_FLAGS e) { - const std::map enumStrings { + CONST_MAP(GUARD_CF_FLAGS, const char*, 7) enumStrings { { GUARD_CF_FLAGS::GCF_NONE, "NONE" }, { GUARD_CF_FLAGS::GCF_INSTRUMENTED, "INSTRUMENTED" }, { GUARD_CF_FLAGS::GCF_W_INSTRUMENTED, "W_INSTRUMENTED" }, @@ -1121,7 +1122,7 @@ const char* to_string(GUARD_CF_FLAGS e) { const char* to_string(GUARD_RF_FLAGS e) { - const std::map enumStrings { + CONST_MAP(GUARD_RF_FLAGS, const char*, 3) enumStrings { { GUARD_RF_FLAGS::GRF_INSTRUMENTED, "INSTRUMENTED" }, { GUARD_RF_FLAGS::GRF_ENABLE, "ENABLE" }, { GUARD_RF_FLAGS::GRF_STRICT, "STRICT" }, @@ -1132,7 +1133,7 @@ const char* to_string(GUARD_RF_FLAGS e) { const char* to_string(CODE_VIEW_SIGNATURES e) { - const std::map enumStrings { + CONST_MAP(CODE_VIEW_SIGNATURES, const char*, 5) enumStrings { { CODE_VIEW_SIGNATURES::CVS_UNKNOWN, "UNKNOWN" }, { CODE_VIEW_SIGNATURES::CVS_PDB_70, "PDB_70" }, { CODE_VIEW_SIGNATURES::CVS_PDB_20, "PDB_20" }, diff --git a/src/PE/utils/ordinals_lookup_tables/libraries_table.hpp b/src/PE/utils/ordinals_lookup_tables/libraries_table.hpp index 783e3b5..2102391 100644 --- a/src/PE/utils/ordinals_lookup_tables/libraries_table.hpp +++ b/src/PE/utils/ordinals_lookup_tables/libraries_table.hpp @@ -17,6 +17,7 @@ #define LIEF_PE_UTILS_LIBRARY_TABLE_H_ #include +#include "frozen.hpp" #include "kernel32_dll_lookup.hpp" #include "ntdll_dll_lookup.hpp" diff --git a/src/PE/utils/ordinals_lookup_tables/ws2_32_dll_lookup.hpp b/src/PE/utils/ordinals_lookup_tables/ws2_32_dll_lookup.hpp index 8f6a172..b78ca5a 100644 --- a/src/PE/utils/ordinals_lookup_tables/ws2_32_dll_lookup.hpp +++ b/src/PE/utils/ordinals_lookup_tables/ws2_32_dll_lookup.hpp @@ -17,6 +17,7 @@ #define LIEF_PE_WS2_32_DLL_LOOKUP_H_ #include +#include "frozen.hpp" namespace LIEF { namespace PE { diff --git a/src/compiler_support.h.in b/src/compiler_support.h.in new file mode 100644 index 0000000..b8ee36c --- /dev/null +++ b/src/compiler_support.h.in @@ -0,0 +1,23 @@ +/* Copyright 2017 R. Thomas + * Copyright 2017 Quarkslab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef LIEF_COMPILER_SUPPORT_H_ +#define LIEF_COMPILER_SUPPORT_H_ + +#define LIEF_SUPPORT_CXX11 @LIEF_SUPPORT_CXX11@ +#define LIEF_SUPPORT_CXX14 @LIEF_SUPPORT_CXX14@ +#define LIEF_SUPPORT_CXX17 @LIEF_SUPPORT_CXX17@ + +#endif diff --git a/src/frozen.hpp b/src/frozen.hpp new file mode 100644 index 0000000..f82177d --- /dev/null +++ b/src/frozen.hpp @@ -0,0 +1,29 @@ +/* Copyright 2017 R. Thomas + * Copyright 2017 Quarkslab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef LIEF_FROZEN_H_ +#define LIEF_FROZEN_H_ +#include "LIEF/config.h" +#include "compiler_support.h" + +#ifdef LIEF_FROZEN_ENABLED +#include +#define CONST_MAP(KEY, VAL, NUM) constexpr frozen::map +#else +#include +#define CONST_MAP(KEY, VAL, NUM) static const std::map +#endif + +#endif diff --git a/third-party/frozen-2f608b5.zip b/third-party/frozen-2f608b5.zip new file mode 100644 index 0000000000000000000000000000000000000000..e362f557759122812ba851ad017ac3069a08a13d GIT binary patch literal 124656 zcma&MW0Yn~wl17mY1_7K+qP}nwzDd2+qP|^veLHgytz+*eZSkg`<{E&7%|@UBVt9o zb3QZXGa)Yp1dI#>@clSuJ4yfb`_BjN`^D7J&eOz}hS8Ljp52gzPX7O!4E|q}OHqgT zExspteGlw^pG<3DZ|`d2VdqHeVPicpDI+b{v^%c?K0!?@GpPVhOCd8hsYcI8&wR8? zIVwRdF+n#DGNzWAX750fWO`UQh(?BHf|{uAKmia?E$C=#=vp3F9o0}%&|=l8R9f;= z%3Ivnzrse|Qr6PYp*#?`Tu`T$fL{UNUyn$MZMH`IeKd;if$<-XXlCJTVP;Td-<_<>o06QZij!hz=xV8HDr<>@_P0+@^QI#M00IC|{r~{L{12aY zb~JFcaQf@NCn?BC0WrXL9jWbaR~aJ+$A#cJcZ3;66_qY7#FGwSvg+*@P=|kQOldBw z(_LiVnr?dCrHYrYiEEKFG@ufUx6O46yOUcET(c*$%`u24RD#F8l?oB}p^x#F&JM-_ z@MhK)a+gLM;n43G5NeEbu70xFnK3!K%^OkBx6xF`<@ZH=iV-m<#0>zD=HHMc3y$zI z0r-$RG_A2L-FY@>FRgjhV=WU8L^UaON}G5WOOzs5cG}KBhrR6{W-^0&916Gl)~n#4 z!Cn>o@*a#n;-7=1*HAtSD{1%e)~QCFns_VDwiEdA&{M$YRn6=491=yyMpVGV`#A4r zcpEy)_OB}05;U#-3pH-v1NGnKCZM7$E~ltOB}*eIw?rd5NwrKPJ~=rip;AjBOD8i$ zF*f5wPAx+{PCG3jJufvq)3kTX*;#*loxH9Lk}|)(xZ6324U$p0nE$@6+=X1~FXTx( z3mtBG6rDe52vV}RZw->MA5DyZAs-LP3{432H>Iw77oD4aE7S`F008IT4<{sJU}Yk0 z;pFT@>+J5Fr95G~Mi1ZlMg=|q)&@o<;6)yo?@v7!E8m4bXW>X_9?_h3yrbxxz?ag&ViBEuSJ7No5?Z zJ?S7>>cKEPQniBw8xKGr55piwel4O_B=Fdm8{K?Vee4#EPG0TK(vhQ0xcX!U?GSrp zw7mlhPB_lEBM}RACyA5Y6Q9m_j7ZC=f?CzkXMicUMz(szdm<_kjdF!j0hQm@hVIGM0%N4&xselQX_Lhz=^II@5&kCnVE&LE4)Gm94c zcQNqD;LXvS0S;$6XmH@4^BT(JPH|R_gr8rvVEF_ug5~aJH2VA`a3(_oh zZZPg&HMbabMxt5p78RtI?XnVIRE;yM*_F7)D%e;QZr`P;lIAPq{Oa$$?qw0o5cA^Z zQe54A&OPr}WydsyV?wmaY`q(MW=VQjEn@MI7F^&ExzyzVKo>d|XIDhFGSqRpKF}?@ zCFa4|A#Bew6H+)ceiw+1i4>_PV+=+graCK$KGQ-I=F3$T!O=dQ1+|0v&)9mKE>EBI z!)I~O#+I2Oo`Fh(zlrJ7@?!d?T3ZeTv)^X6>b9bTZ24f%foHI$i}ev&^TMgmn9l=? z)k)kn01UG6V22ei^^sv#z$Comk#I}ovFp@J5<9P5a(qC%!AMD~=?faUmu@$UXcEkt ze92*SHUBP!JqK*~K?f|LG~zPK6R9!H^C&N=vzPl}8gK4?IzVxcw9z8#tvC4f^ojMa z*0Xl{JLMi006?1hKU$Bpgpi1=lE{XphSM7}yx);h_#}NJQ}OzfQXWYEoS;^5hHttoLNd-I^K}2W98$4;$~+?zdB2olWhs zpLTZD$#4^E8D0-#7g?{5pY4inzxB2@bba0!x~kommTo_HY+vSD?n5CueeQf%b9Bp`(p16<{x?ik@ zZmuoyUnRj>%7~>mY2qw(m4%F+tiBS-dHAXXY@dc3d7`xc;Vc zGmlZzhrqJ&Q}#S|n_lC4=FYoYgza4D>d(`vsjJ&4?^bsm^#5}zs>5`Gfg}W_5bRap zJf$2Ar3$nx$_NWZ7_@M+q!Y)yiuBQR^K8@ORwXY9wbb{>l}7}o zTPl}n#@pWK28*lIm=2>$Qbw2r5{0;!#*K!Zbyv6K zGQsK5cotyp!SeW1y!Rc})&_uR@M#lN5_oQArQ15Wtzx4CP?46r^RXm**`tABGo$If z-5};mQtW(VRgif~Aqm=gtsO%h1zd2cU6;kx&Vlm}L#vD*{u87(esn#nN-Pg4vGHyo z<P zTwiC@6xi2@*iyKLa#RHRYviI3017(DRyDsxPsD7nx-1pnQ#yr7q^E7I zZK$VDWSB#Sl9$TgaGOF{65C>kr=6j;mforv8WGAq=Eg;JJ^r|Wl6}SMTdwbPn(vIe zzk$>6Vv0aQL?OX#Gi5IeBs9RSzp_YrK5!N;j7T!l z9;Y+SH{tzAqslKu-21>l;iOLBHn<;W59X0#KYjkExfZNw+CYTXO8GLo3Y95$zQdjS z#-oH#D^y6XI{*z8ZwAc zQAR%byb_*dZSAMfLrRgjcvj}lDuNv3=H~1n=r2a)z4)X&dG^rF^8xmdHF(eha7+0Z zX{y2ZRV)E23@e#L-6Uql+rYBsx@dY^9^mp@$KC8(lI;2*Wn%kKU?6lG$+nu!9ya!ul zZ3{H&;!>MCFht@NWU@5!Zb;PEMMy-@a#ZAy;ohBN!(Z5^G$|Q?OWaqxrU^Q9xUD9f0oFm2`?4J>(}=}Y+}%|HiTq^0cQlgdQTzPE|0s6(v!0EKo3vHf+tMEQ7_) zH}2Y};w0{EUiNY9&ey?emD84@bUzc^NV_pU4*a=!W;ABKKs`tT1Iul3|Al%$F%jrA z!g@}1Lv-|_mqK;hXjANzGi9t|8zM|F)bu!9n^adRASWD3*LD_!=BVdF8xMQkNb_v+ zSh(e{VPj^HOKgl-6Af_`Xju(ck~J7cEX?bqG94Y1@uO%;^VJRG)ZLF5&_I2m_>v)U zk7I}=#WY>N|u-5>_gYP&#VBytMa#`7S-7}#DMr>ibR)Q)K=WVL4G+($DE6KomoQH}QWiR%l^Fi+q|U%tG=<&OaSfnQff^i$-w zh!9d;BuI8M4N@l82Xl1^5V;8($Bg~hI%AyKF_+#{QzggrR9IU2$fM~sew8!s?FlJcO`v@7c{rT-FlVfp zev!34EWe-EsoOBFMyc_#h|m`~BITTK?ODW`JztR)C$dqk0iMCxq7iW&_>Cf~tRp5B zI~;@aoiqJSBP374HUMAdYYzEgnpYH=it=r7uj*|VIDjmu-Vm}d@fd^Y9}n|rd8tFO)|+0ybyr;CArSt+ z?>xhERwHQ*Xrnr|!L6x7P%Hs-j_h)l1K@MOmf#;mqZA&*bp>#DhRMyTwTYqg#h#PO z)}1{4L9o?D@wB8OJ8rq&#eu_N|-5x^P zk0_!mIeUR?5Z7g@Ef+9Y#NwwVK(hbJYcCy7Phh7+gMym~qpP7Z|2RxKm?CqV$dIe) zY47$ZT~zz+hUW)LOUI|_+vfcor*oWeFfjGd<;`o4Vd3rL0T$%*c5smO`nuLpV|P_k zv^s8MAjAf>-7}DvY=`q~D%##(*3s*@>9UE)Z5F_GO{>}esm4gVDSh-o0Du(NN};pX zo5s_+ddQlV;Ms1*g3sG#p47=Q(|@J2%~6J&ab2j^yfbk}qM~bpyVEflHrrbf8kV(< zkmbt!@k|N@yZBQKwCWEl>Tw0@kxKUksmsjW^L5LoFDZY3>1&J*L$1+bGxJaJC)Afw z-5v5BSDdMtGe~Z-gpWq(Xge}7*F|<}rqa3Ec*qUR86FWIG^s_&fM1*%Ehio(1 z&zCu(Au|}ch#5zdbi#^Ii~^CEL_w|vcsUC#@ z?*HJ+nkO2x>+)$L_ZLRMzS$@TCTv7>3irODoz@qp1JLYGN|EUu3i7~4Ub&5~k?m+w zUTo>Lm>_FjW$sawN^_2|u`oKRXxcy@Ar*2S$`b_(hszGeR*YJ_9*R6k^P6x` z$a5-!xkOyss;5Lc zvDanJ5aOus%~5N3DZ{D$20VvZxXSc05(dE3GS_waqmPF9(w&#;05n1mQy%I||>FGfYmG*82GM~KZYV9}2Pu<)> zbJEYC}kbkO*6`bJ3Dt;tJ_WHK7s z%aL2bz2Qk+3i_sKQ4Z-K{uRWaV$x%~0j#vW*l^VpV04Lx#!PR|A%BAR{y5{&rBBe9 zV9X>Eggrh?^A<~M&?0TQUp%-iu>lcWiPl^jO(Q{&OlB2f`hAv7*XDW~czhCw?_UDF z4;!L{9Y8d$v9e|*f~Rd+Y^sjO92dArQDI@@Z(RXU@KP3JXMFfOpL}(qIoSQVx9QT-!KVxzP6EV!A z_TVoQS>@Y9XsB&Uw9qdj45?znX)q*Yv0NVmo@cPG4ZX$c_u4mf#-|!CTIc85ypJfa zN<_aXmG2|{^2sGqsXb^PA6NR@#xG&QrmvG4gOo{E_l2mWX+e{zxJp~8AsI5gU?X%6 z@TQ>EPIhzmmm!cCh99xP+TJ=Q^N;hk)98V!B3Y=2pVL{Kpf1%-?j=q8>)F)HtBe#S z$UF%A4rDEd4p)2q>s`H7!R5(EiV%kxs~MYjMNcuWM5<$)qvlB!kO5Y%H=^?UU|`p{ zHAuM)1ZuKUWlHoR@2aVovS1Z;RNoz1)+r&36L3xV)1g?oBp6355 zyozmE4ybAs6{kOI6j)@i*s%eDT0seBBC-Y%owSgvICUh2{?m?ZrFbq~lrJP~%rNSy zE7zvDT9>BplH>peNvBRZDubqdKxi7WJkef{puzAImr*N3cuGV=Gm9LkLlb-|257T{ z8hQoe3SNbDew}|klHV6Y7Rg&v737N&_(zCRMRQRD>rp>R0w{-@a#qcL0mLt=+)iZ&i`*5YUAa=%5{b+g; z^VyfiEC;BP~H&d1YA;1qH5bo+*7IsIRof;e4&-g_?74Mfi0AQ)7rA$FmH9 zs|=NiXQPm6YFrHK`noO*}(N;^OY`y z>8a(EYPvmbj0#5)n?K~y1rvxiUE(|(a$!Y$ISpi-8MXQsqEp&cW2x(_vuFOGv{ddi z?hV*EhKc<~bu{+kk*ejAHY3#O{_;&gG)EVN&fDe+5^W%V9q%tw*efmY7eIvsy#*Ax z#wP(|@tBM9ai<0TqLMkR`w)e-mqFdD{li&UmD3%6MZ{_JZH8orgJyexUW}1j(OZ#Q z9zte9jzP;b>h=|T0gEW*;AWt=CX}Qqj}5DA=Vvw)U&+mQ<)aPWe>A0Z(`c? zeJV7Brk+mhv#dAng0LeD1b5gN3fX&CSSfG2?5PkP_RAZhGV0;~(U6Gw>>Fxn@k-aB z8makG3H_zmm1xe88%l4{$+@{n3~Awo0SV??Nv&`JO}Log$CPDz+VB7bO(``{XLYvt z^0P)s!2=7Ia32cO3e*i3+D(6M+PwakEzbDh-h`NVz`$KXYRJt@5SglA8zy2I7naYE zFxB92w31h3@xpYcrQJ_1XtQ(U>E(9Vn1s#fk$I{4rnA<@IZP&-eCbI8sf7#PF7~&} zXJGwGOGe%R8LYh1*VUiG*qW$3U zAM_tDKpr^2SaHAk`R*HFw^F08FOrJs@Mr_FOivxUwi{(uls-c$0fspJA zKP)=yG*j`H2qbAtlCNi(vQ6fHdKlQ}omYZ%0xj=oC$CFZ`^Ff*S@czzr0j`Gh*H`? z4%v$fD%yfPEKS`*zcX@(#S-aCBo$9`5rN3qegJoAgt(A&dNsQ>(*Z$vEmdGYjfNk{ zu6)%}i1_m&C1T!ei0h*|=o+hQLlhfR_CiCLWeq-uS_&&>A+rK++71=9#jED3n&l%t z7b(_tfI%=r>)6=}T6r?%GqL1a1%WbmmGn8~k}N*bjmTx&>W##_f`L_P>9AFx6JeQ{ zeGZ3C6m>&}gkpp*nZP50GI8!Yl|jW9qu%UB*3eWykx5iSM&M&5*#I} z6Z`=NipvPjxrQ5OxkHL5sSKY;k9WgIWE14g@w6`j3wgiz-_b|7MCId2GWGfhtS!|YuIM;R}C!01j_lvJt(MVDu z^nbk(OZeW~L5^N-gsTc%haC!2OZn1Fv>UHf^)@A54$$5er7Q6f4Y@qT*-=G8ocKeW z++*fWu`EKyW{-7N@K-Ud&WhA9Ip;tyeORG3P5qh^FM3nBNVNC?;3LpJ%g%V|?yc2kuR!8T@@P$r(j}xDupMH_^J}4b zFxV4O^e5R<732rtp)W}wkAbK>8>Grj$uEJeo}0Zexs2VL-vbFKm($nxrsqj`m&M_} zI-cZiVMd_L@5fWk?88M>f09$|DJmOq+vI?&QAyaO+7~u_jz702n9RYL?>X56FJpFK z(=mD7E?n|wsdhYy*SW6{KOmW!6bI+xAlYgLf(mLu;dW)6!hDx0R{0ifYGGatu>Cx5r}}(X(4Dc!N`BJ8;qjz%v$vrS3}4>LL1aOR@P;zvv6g(i zxiNLDuwW~H`r$$OhO0mM*V8y+dBIJ~3f#wUeMDc_`4sKD9A(f*mRBj2`5tN+B@@%+ z3Pe37gs%Y$f*H+!N#FE?z4PO~%Pmd`h!|dZ(aS$MU;sxapyfa>cFCV$EH@BWelSTL z@AotU+wI&{n>`9jDdxA*c?P^{pmYB&+8Evf$>(~}1DIpzfEk2RRIEz?8|gxZJ^~N% z#c#kL{>*^(k=+alehW4yd0qthss>K~sY^nEhd4t3)BjtdsgyVVPoMdH zpF3yX9F(wBIvLaj_~y*l^VIu|S45Pz4rGP#4jC-8#`73j&?BPhpk!plV`R~vxqknB zBujo8o)`hq=~Maya~G@-VEusLl4_u{I)L0s#VekYukyS)m#ulj_}}^Vnm*^-Y|^no zX$Y}LlEnGAM&&V|!2hJT|6Zs655;Fg6I&y58v{oxr@xi#HzDiqOTLTNJ-`3}*4A1jRftJ1a{MpE4u)cdjTeWp#C^ zK&;34X%DM}J%%=^2t!oh0F}o`8^c6XN^)vpG(9WJcKyR6k* zBOlQqv69AfWS^Vrq?Z}@ERCI(VRLY_5nS1Z{lvSMR3ALfH6`1!p>Cevy{!p3*nWtO z3!9|o7Ti?$UXSZTx;xZ`Y+d6SB~Wv$7HR9Bm~OFnvDT=&CPZ8LzSC1iVksj+UQzB z6=83LHi%4Rr8wDs85-?Tqc$<$e(;w{x+!n=F+o@<*)Ak@@2D(G0-=LxdNoytyDG=a zltB8l|5~|*`d3ZZYF(gXe76Fidjb%(!LDqD!!JDBqGjG#W7HF->YcIOThw_I1VV(^HM;*q77YtB-1%UR9Z_Vvp8UUod9R$x0g|m&Bkr&IUAyEhOk=h;g zL$l9oD_yLx)K58!%TT`9PPFQrD_o~nw1s!Q%oHL?dDeJo4e2F%lLW}^kdhi zewj2|k&U?ZX;R5ME1k@Q?bEJ_sivyjCsG=Z7~rlg2q%er-@`IL&e7#u^j;X611H-+ zw_^@l0G~#mN|h-`EWcLXB}TyT&JPfnJhg(@ycP)?$t>19wo}ypitqG`o<*UfJ~@S@ z$wF^&i#ae5F1WH4K4U5E_e(DT|6Qsjj4~Yn5WtdIFAyMl=`ueI`ZYfQD1hdue^}pK z7SO+im+81Wn0>BWHEn_|NdhC2f}O&ENuURm(uj4)HH?6cYBS5UZCN!dW|yL;y2QqO^M-W&n*O&cAtRt6tbuy-)bqI~^%Ufsbv%O?*C z>C4AVtr4eUcvxM9V)|~Q%WLMyT3xSo8UH+H4o#&%sH;J}tNL+?FjozN~Y`2GzXZq$LtH+V?uvtr*9$_9IdfjC@oq6bq8H|A_7ymDbDW0Re-0 zAh@}Yhk7aQF#{TfBf-Cp)^fJnihTR^`Ha=wygf`DXzm2GRghj-Kxcx`GrezRj=I0H zKAN8wjCs*>Sygv*O=9RY6P-Cxm>UI#nmw8XXRZRMR3s@6v=kU??1Y#HNfT5|SJX;gP#ov&BBZ|WMsa@VWBAO1c8I8kSL*&dGD(^OgWKdmIUr%xDo|zE2pSW6s~0s zb0$ETY*zvD-Y=!H#7>w)GjhW60gi>>(O%(|+yd0bj1$?{IZ`U=#BTlzT*}1oONXY( zD%)9(Um}6+&^#XDg3nha?)c&%fFfSTe{=y^v!v8pnr$C@#BJO=hX9Or6HRja7H6dA zW!;$qqwBBc0R@QvFtXMmgU3`e2ufbGj+2Fqt%!1^XpX`pmkK2&nToR(D;)7pPiaJ+ z4-&VDrzH`P_@y5{F6Fj#w34?c{i11|YB;d>)uLq|wed*$Ju&N@b-l*S->u8RtXHua z@1vn1sR=_z+e*kW7L!#dvEadb2%uvkJT8xO9KS0Z0ve2l@q!klziJ<7fOf^1P-*L z->>F!Y3J>(V6P!)V&Su<9@HvCukOWfTx7w?nCiJfZ(8SQeDij%y{TtBlU-Hf?v3+p zIhD!X&|Y?iR(G{0B|USsMLR-_V1+#$bn5*Hi1;=h2&*}mttY489X0!6X#5Y2j|a0N z_I}S|2aH9N?BMGrv7-=lL(%KsT=9xD&r$lfsn|jN&m6!%Oy$2Ezrh0I<7akh(hBxm^Vz7YIvP+x8#2gxQ#Ea zvf)=#(Yy2{xjJzyi1=j?N98xQf;n;c@AXf(m?fQjt_bZKl{Knf#-jBXBSl=!QvS9Z zGqayB(_AzM1(W-!8m#Ie+x$B&Xh_rB-H+ z_*Gie4!NFT!SESL1&KP9g~M|Dq0Wq5dn#opEewkbO@SP8J+KwQ?8XK>Q_6WoMI z%x0@Ilc^dpA92|J<=vB<9v<&!tDKyy=tDvramArsL+hkL+O!PiaiT=S!#t{Vg6SVB z1>|avDC+SPgUn(CxF<{O1*ET|J?e?CnY*d%qpRIhbdUi2(Ee+c<@rl7D=0erz@qRh zeUjr%yoM-Q-TWZ%*fp9z6t}5%@zK^i+P}9_V+3W*g09ftO~j`*hvgYUH>{KV7R@b* zxe}a3rM9NCHa1Pb5(Pp$4HTesn2u?pD4BZTWCfr&IKx@^w1FqQd`kz#r?l6aWXNc{jbF#aTB&d^zb52pOFZsKTu_Q@S%*gXe{l21vHsph>67D z^_!~PT#?vNC?t+laxZtKJDCN>TF69{GSHQS#+T4(A6_YMCp(Q})=`~`{tA?%6L8DO z4c#1xVZ2o$0|z*IjuGs`9M|X$8k~3roa?I$(X)vsa7M3+>}ohU>1gqd-krr`X=R|j zf(9I|MzVyS!^q2In0GztwkdxMJC){|N~l5EOfi`Tr$+dEh3I?mB&C{g#jSHya$Iu) zt=DPA?Et;_sc2DPgRJ`~#O~qrIewX1&N1ehj>Q08MNY(`eQhSbcIkJ8@e2A+$^L`K zGljE}J$;LZ{rdtT`R~N!WaMaJ|9xrvCF&4`Im-cjWS=K0+Ig@6bZf5-r4?eTV8#00 zN7TYDDPXHWO>pEdpY~>^i62W~H=9n=Jf4+IiY=A9Ym9z7{CmE|`u6gMVPK2Z7{Sb_ zswI9bIS98TD4?#Nkj^ggp6uW*3ER(2;Y(#@s&cETw87zhe^Z-z8^ZYh>+W{Qsl!-xvJ{RQ_|(KiJOS5KVnh%)Rlw zk?VKJ_1&TQcS`iPwf`Dp$Hdn`_R}Maxb@@*1<|%gfj6mwFT*xX6Ex4T&XSTyfT4Wp zC@>rs5TA9BjqPQl7gN$JPw1lLl9`dz;Qxp}bZCYta7PB-J9rh3hxwRBo!N2nj(Xgo zEuLeT*kvw(;MjK-s(;I5Nm5>4yr^{jMRS%JZJ3{US;36XW`vBEgmf07OhQgxwlNd- zsIfB`(+pz4_c_Q+SK8*h?E!!}^*&l%W%h7tl2#bTEgkPSqm3-1*Z=;(y+z1Ch*0QOJ4`~%VU97dcdU;qFa-woh@wdVhg zIsQ#d2G(YFjuy`5HniqT>KZ>6=;3{5YS8)lrRZQID#9AqQD#Bf{Q>euWwMrk4fnZH zggy2!8Fg@^(@a3>ZW|zRF>PsYttfe_{b>F1Gx5Do$+Ls5;YyM^8MIoj%N0qtI_g;eXt_=pD7g6ugO3_Koe6REJnj`uB^d{Y!7Aewik7$L zMKew(!B<>Y*ANp|xB*deilfCJ-%H3yr0PP(SmhGbI=)=SxbW}Nhcr$L? zf%%~@`ny9dFW^U^^QIrq*16UN${TDMbM0~`KiDVDZkmAGT%AfXc(Q2WMFEv{?$0ak z@Jx)*+sV)$jI>dJOx^MTQbzS1U7My2CyZxyYULt!SO!-Zq^^uUD*`!P<7dn}nnAmI z%Yp`>W?KO!7?iabp6RtP;s@ix2V^;HlIYTw8I4UP{B7d2CMaMb)!^dL#7!rhsr~Mr zxR*H6BMYpZICwl9-af!~aJpTbsn{`ivOCu(>wKBq=y)-3WUZdSU)Tr{xYB94ii8xgI z>4mJ6t45ZGHgw^&;Te1*cIGMup5VxK8p6c(3P!?q`Wi;UYUs<4b`rLK_@YsK#enw} zD%58?vE!{Bo-54Hi@14oe_D`6Urwc>DwubhX(!14sz>>)?hY#p=?f}Q1D3*KMyaXW z{89&Vw5l>_-?P;23KiVUZK9VZUV2+7tUWJIn(bNu&4leV6j!E0Y-6`DP=zans%QYC z$`gi%9{W6bEs#iGb)zpo8vC+hKNPKOW51?EHMvB-f&c)vu(A;wGG7eSu?B7mk0fQ} zDBTLY+QS-@1L(hNS~c(8uu~`A@~0`v*WNn8_?ZoeiGuISI6|>)Rbo`s8x2kNMc5D&bJKEc zzFPiStGLO5nF{LY<4z0s_8N)3_#iu9d;{~ork^rroct&-gy)R}+9YaU zh$lxskmaJzU$Tt0BM!ab#oP1S!JHckCkh095J{tIw*#BF&8TdMG-2+a_<|1UZL#w% zHDVc`X%Oaj03s8=;K<1B1+qB(uDd^?{n`2K;5DJp6Xe1#2XG6@`BI6Ily&cHBnadB zvoIZZbh3*j-HanFeL9`aAtb$}5Dt=wcoKZTYF*^o;tL`4b8nHPCq99a} zNlBqgbN-LqQqHGnZVxh;&+tfggDWHCXZTPMM3Dn9)ni(ind#dgE_O(i?bkEj2FKIB zTeYNHtTMMAPn@KgBB@!2i)k==HF%llMkPy(7^V(5j10KzvH#9VNmI0qX*xZ6?}b8- zzvf8Yv#TimB3$mFh(*k^%l`Ouj$Swj&&sN}-@-xj=Y9Fwl{H@}Z{NuV&H^w!C zzfI6nnOW&rg*slQ(25;i9#i3`=$vB4SttDHwb{5>x{>4H4k` zSdWj#KsTC2;km>1MPLIIX3nQuYX_S?$$ey+IRxUwFdAXe76Y#7o0J35()&I!Qub7X z7uGMVZPe6bBr>Aom6-!?yS8J#r90UU;U~ipv@dtNg0|L~S<5%99>4iXiI(6aH}ZLo zuVkbI%ptPbBlb8(s@oQz#3U4gh5-y-t}IHqC|k$R7KKKY?i{(>aN|xc5q~_!bj-7P z8uLWRI2N9nJ9Xv}=;^aQWMtqY&jaVNaTu|Oo6Is+VO-?2s)j@A%$r^oKxPeCIL&O8 zCfi4Vx3J|~8n;7>CiZE+W!qqH^Qy%PO5O7%l+O_jwZUvxA!0eEQrL9dVIE1M!?Hd4 z##_VRWP1W0^wn;UWaz3%P!DqSjy;)}uFj-6El3X~Kc{XdS5I068rA*A!?psqT~aGz zDIOfwVpe&pZ6JH?V0ECW9;*}xSHPk^>vRqfJXZNkUR_kD>4AP{sH@R93-HZ+Q4E7PGM<1I{k#AnEgm*919Yb)6t zPKTykC)rkg9IXZMPulYfQ^Y)~hE1&YH-cA?+|#L^1$eb0P?g(22##eQz@&f;hxV!U z@P4La^ZU{ctqI1AhN8rXodbVx@a#uXh~pDn^Ys&Ql~ctF1__zi5zxYWRU_|UQbgSV zOf$8f$DDb)J+P7qn_uH*LvRsCLo^DaXMd5M!cZebip1eBP=gXU7#cRH|YljrY$|its^R9COJ4a zHr<8@8njAkqm#tXBcU>iEs*C1jOZ-9YL7Fm&&>tH25YvbftCI9=&4xl==%M7EMZ{G z+uI9tfy~~CvyCPDX9*JaM!>)r)O;sj_PQkynz@Jpw^E2Kypq7pzJiKOY*1AaqZH>s zo_ZwwMnXk&6?(ca63g}o7X4oDc>rEE^F6`WaL*D^*TV!WT)FMJbpGla06c~(m|g6K=yR8#}~ zSfy&NGXC3V-TkwsPrr?ITj?F^^a%$hba}?2CKRPe(5S|X;TPUOJ;6PW4@PKz{E|;FzS>pUim%B4 zo-)Es#~(PtKa@^cbQrDswcG1CUWl>GZ8>m&Ab6qvE|M#y2lxTIDkAJuq%hNGe1B9a zEvllz5aiR_csTBkgx){InkmYpkxm-vs&NX1-?ZRc70738gZYTGlpmqRkK;aX(<9ua zn}_7L|I*E8&#f;$+DO;8V!srcup`4wl-3_}9yMh^WZY}y<#jC%g6d6T++i+M%cL#p zE`9M)kt>zdV8GA_NNY`A-GHt`S8EkxHDZ5?nO6F$M%_n6(CI{y<^&R`H^vY2-L-$5 z6qG>m`>yDHx*N!L&w+tMQW!XITH|zThuRA0Q*Tk5Ap<#vQP9jd3m5g-|88pAh8#DW zRf|F~n=vo+juo;`gTFve4i#GxXITTXs0=j{%uilx9{WPLQI-2erjs)ZcJil7NB7g* zy1HLfF%M)|X;?lHR#x$e2nUVv;1&pGjj(p8H+%C$2$qN!zCAV>hp3$R-6;#lPMk!K z=F9d{bWN*3bliw{)DFj z$UUaZTLrn)QYnu0@kYr90^NIXfANMnj8O$kEL0?YA|3 zJ0`})Ixb6YYDjvQpf=BM#*@hJxcbOyBq|~$7_>q)Z@Ehmh0w-*w@B90%c&E8i3nrY z36A!iqd6zT=Kconu!%*zFyj*2_$*DL4VI>G<<4A4(=xh#Fhrr_QsJ}nz1X*4tZ5yd zUB$SatLqDime(s1XBdRM0Tr2Hcpko8{S1%uoxqnF0%6 zKbNT6Cp^{f)CunrQ46hu3n8g7uOFw#v?mbq1L(d#md$r8&acBzxEWU$zkF_02}d*t zB+)Tg&*Vw>C642BJZqEB##VuabcUR1@$gfq{#uP0GcVc00ejDj8Y*1%>S<4RrR!(W zD?0&776l-{z(jt~v2emeq9kYt(Z-N=X%QMc0^8c zzrf1jCjHc}VO>>J4u>tLy!B~1Uj)76ol_nLIpGP-Gp7J^HJms3Gt_Jzh6hCEE*Q)!UDw_?oBQfgvhIrN+o+f--v>>11REiafi;k%S{%T8UX zq38ZI*q`oKl`Qg_fqdM;I7sCLxb;wVw7ou=z1L5f5GPm7{A(P)>&V@v3JL&_iw*!l z|39M&h6YX+MtaU3_9ow4;X+-z4`B}YnkdLd#PA6{C@vRKXix5#4L=18R>Q@95BODx2wVb6 zLo5yKITUC$7TP8%q)Gn+LrRh?(P{}8UEcB}$aiIp&mTdGhS#9HH_xA9q2zb~Svuq$ zl&FwUqF>rP{>PqqsyYEE`AO<%@D0PD+DimQiDFhg^j-)$)WP&%Y2Zo-OIvo-dXb_j z57jWNw;*A{ZNeeZ^=zO2>7~Vnoz{JDCJ-8?qllDiE}vn#MPgJxsm3_?PncB`wPF4k zJ?sc{%fQdU;va^}EuBoN;E)@ zc$g$6HArMsl1p#3C^xTd*ljOl#B4x_V&LJO9!u?4&r}$jDm7M?O=XNxA!iIolu2zS zDuQp%)IzGN(!2n~+DSmb#(n6)1)f_AszvKQ6(gTpaLr3RFA zxqI6*PF^Z18giVJ0Z>Ku$B1yI=Q+;3is`Y)KDj%5l9A)a^+-M6HWyRs99H`g&?&b&s*v6bW z)$XG=c8h^4Eom#f)fwVmx(anEg#~w>VJ{m_yS3}(2k}zdesTj$N`*lpnU%mSc|3!@ zns5Wro?_M>rIjJm(?vnNW!xTq(+J5g_F_xkv|T-pazZL)+?+|ZpJex8d^Ha%m~yDM z&Pq)b1rNFtUR8?(5j`GJ>5(qoP(N#atMpfS&`4+uxcvyrminRC@=t>oEp?*|M45&=77|F)BS%@_Ksba1<1B`+RmM}jY`|L%}U$0ZQH1{ZJU*- zw9QKUW_OQs$J>3+80Wk{V1HVBt%#WOi5WxsvcwH16@;Cghd{I*BUEGy9VuSKTzV~b z^?s;S;~pk&v7ddPF$X2N713@^6`9lI_gqUXIXn!`-487?KwrJI8Xdc){2M}Lq8QhzE071v`rk!&_}2&YjJmWYMvmkSMl zAv}~9!;mj^e68!r7cL#|qpW3Kk0INMIF@0QKw%?QA?okJ?(=HwY0s&6q_PvYw~$Ep zc>AniD}A#e6UrtV_#$R{J<+{p^274x$Nyk&Af8^OW4@h}!EfY^^?z5R zjO=WkoK4*A9rX>JoJ<^@>CI!5Wu3AZk-G0_TE>TG+Q_F1!VX06HW*#(t;W>Ln4{rf zm%&J>BNSQ}zqV2W_f45{j=;3KTi>>{Z{m130^1Y$6<1p`tXm`1aX=|XueS!%Vt;vc z8(1OY+V?vFuwfZdrXYySHRa+&QcKNX4C%QQ83#-J72~Hy1;kYd!L?dc<|Kp;l`w}_ zatee#R*^MIkZ=HE^1vt}D|~vT^R&T*PYOyjYJiPcQ&xMy zkP+y5kq|Uxa168q`A=g8g;RJt3q7eui7UBi*BCdW>XqsX2pX@IPDXNj*_f)sq|+bK zPzI8agO~l!Q}sA4;6(7w*iW0leg~`AiP8g^Ek`m3sl09LvxG5j!l>0E5%c;Q$=b(qp$}fM1QL;V_h3-M6G5MmNEMj^vM9SX^h)ee ztJDOu#SB3v(WX*wJ(9&H)8(9?_P8hC0mH|r0&>cL!#~tahAEC&6zKB$i+aLTIpk#> z!`W#(6kdgA8X*efkSc*Xf>9N_YxHVKV<47W_Jh&9s1GHrRH{C++y`Wv$&C7Ry`c^* zP>YlwZBr6niJ`4|>YDMSyVTS4UBZD50bk-Br7dQz8B-1C_JNr*;w6Y0z4Q{gbf!Hi4kM~2n&Uht1ukbRT$ zIO^DOyJ>VlbOQ>}H-sLyfjKsHrS{@4p}$5ai*7TDK2R+wILGWNWdU6q{9pe;;pj@l z^q_s)O+UW-u>aXh`KR7vV(nx|Z|tIL%6fw1I66P4Cr}KDU)~2%=@&5Q;hn!`xM& z?&j%-$OTf`;(t&{LuZGsBa^p>zo4B}(}WOBITxVp7Jsih4`^a|lY&-{6*c$kIjL2p zFgq%9^o*TFBK;y-OLA;M3>Hy+Ii$|y&-qEy2$LtFy`L^XwHfPFEc$C&+`2tk0_9XY z3Qp;ExQBQzAXLc^<(JY>@BOJ#LOpkeQ*XG}k4+LRZ4BEr&uU0r7A37Eab{2V!H}*4 z#V>lU>>WWf+50Lly@IDbpb|V7X&aZhv~W+gfo@(LjG-jBe;6_f&g8ml~EPtZ*KT1!eycP{J`B z5{_wR1j^cPqrdx4+0rCs5W@@v*7RU?segbF?C=uChW?gUmb`!FP3Gt#>EG zXD-35NtKo3Oque+RW&!x&E9NrN0nrGrs=fX9tV>ze>D+F+oKHmod$_{lutj3587nu z!YtJ@ss3dDY)|Cri%)nyqa`q@niffX{eRZen={qL}w_&z-FFo zwU5{}e+p&>sOlK4mQ!lPrAm6l$YMo_Qz~YRzHsvPxp53;Px9lIdy$&E58b0CrjbKv z2Z8gC-eug_!O9xzrEHB+*NPy}&_(E7P0^Vpr_*KrAMV|zQ)h0)oWLyBfFu^_Waq55 zw1A`&ajqSQlpw_NxnsVv_Urc@H;mT#+v6zM=+O5Pc!*JZuPE-%*u25*+s~H*xz4Vk z6W>8_&WxIm^#}r&Tcc_5n(QhvV!1 zr#rtIMZ=F=*b*>&^~s?uM||%mkxw0wEi0vn4G8}Kz;*^>p^1aOYe(02?f73xp(gG| zCic!2-xY-3JVdGAc2VFv_=_f#SXELraRD?eFn-~80eU}u%en&n@(4b6C0D1ZTMYEs zD063h)|`}mgWFR#`}OqHfiVyTqxxTVm^b#M2en&Ao1OQIOYY}2#)o_iYgQmgog282 zk$+f~V(H7YMe?+;i%cPmX)$9NyGnib*t6pQRW|Apf+va@BWtmRF_z?zHGUznQ%2*1 z4u#9{L81B`3HH;B&bDvejtNXoXEN#t(=34kNQeJsuP;=A(4YL=kJcz0Nc@!@h0;*w z-GEkppShyKP@rYp%3hRXufJ@%IZ+zbAiv4J54e&T6XPSu>yHOYb^hIrAG5{%7-}OZ z0U9&X&9zetXC>@9zFJztftq3BcKXOVw(mnhtR9M-+fGRsC5*|q2oGamBjfWUqsfNb zbmm&4!f}Bjo3^}O@S>Y&7Vl6^rJR-WecoOaPtPV`i4}P@GFz<*{MSbM#&h+tnuD+` zZ?pAgZQpMEYw9Ju;|GR-64LG(YfOJ!+>Rsm+btFC$G1u%Yrq*(Xc7Oc2WJS@$k_H5 zl^^beCCtL!E+g+_=L`_9j3)X~g%(mL*M3QH^ucz?+opS3T5L7t-p?FKF%g;qRq`Go zwW|6{(Wb2>XvvrS`Z3jB0H`u#vT-E-S?E9Nd& z4^a=*ANCz%1iBv~4UyZxJ{+rmp9IcJwgmAt8znJW8VlGBjJBbiT;Q0{?A%rZ(~kx-mUp% zM=T2X%IV$vb=yE0^2kEIfWFvyj<(mlgwDFgVypq7(Rr~qV~cF{vHsD;&fF<|iV+hr zkhO}M7jsTc40=n^9)idYJEPX78N-IUEx%CZ=hVbLiGgjgh+&9{v?AZbSy zn`SJ-<{XsDI{#{p=jSFs*ur0Ai3ImU!HR+eR#W7Ilrc6>F=b}~r((?znbH~tka1{) z6Go?>W=xPPG8NVRX3!<$V!ktn_7%PfY}3Oe3Fg&acF94POOdj&i$?!|5~})p{zwlF zWKbNpc{w`m)2~;~N@gJ!GLPo6&>QBNA*=({qA`*nB{br?rpiOOKN~B-HG{U3QZ97b zgdj%k7E7FY{L-*~TBTOmg5t4m!FKKr&rM*k+Bmt7H+G@mEAi6?&iX+c*`)5qUDmQ4 zED&3GL8E$y-yx|j&qU8e5uvCBbNv~qoO?X03Wbpg2Z#zFIiw?=#?tnlzJ;rcK(Bqj zXt2uvWhlXqr>ldT0}nZx=IkqIH#@rp9~yMW{Qi&|JL79QWd~_?tyN57KW;E<0zsy+ z5PtcKf-jRAi&QN;ZAvL@o&}~rkBR2D%pz^~lIB1`!|y-DOcxrUL=;f5qRG+{SoyZ+ z%Oe(L^C!***o^>Gxkl$*JVQsH%42FtyY+&z=zZtq2!Xw)N5`Ib@=V;TOP|eW(#$<` zscVKAKTbXz9}awkP>SQCYq_@~-+j~#kqF;+lyXT-3{+W2Wyzx%jtN=u;YOAq3-nUn zYhGYxHF6m77tded!+Y(Wc^-VsZicdeT`1d>0PcOCa! zgYNY>^fGklA9+e1N0@@AMRA%~0C#ilm1tDp7@I{;fRS1AOs6E^>H~oy&G6C9HJsWl zfTvAx#F9d+>y!v^Nehc`ASo9~7s*A*?CGC~+y(=}t^s^NoRb!3-iss9upEEeGLEtZ z4^0Yb`4X|o0I3Kigm&R8wk*^P;X#gEmz<+Z02ny#JqVzG+-zGhKfM;mW+pfw@b zxxL)i3);(V8d?v2bTTu)sIZP5*_h~d&zOtY_+7x@JL?wxZn=5*g}C zHUmW|x>!}Y6z|8tiNPT}1qA^2Zxw+*UDc3pZ30DnO@!Pp_33Ok5>3ZeEEz1JH$5UZ-8CI$7wNRVv^M-0)KMd6!1jr+>Mm&F+N-1h2Ickjb_BchcBvtvuD^X6Or_M@ACq95bpd=;N`))s z#JEP~?yf8mr3-U+$P7RMc|@V~ef5Nu=lg7?Lgd78t3d?&Cd{GC4<6Bj#{Uj zs`c{{7k>$74QLhH`8=Pip*y6Z6K{n%w6rBGTZ}K0c86oILLB-hekUK~&a63)Bf-kp zxRPcVO&id za}hQ<|MKTYo!jH1zW)`X+-nhg5Rv~E4E1llxJP4=s{W4JJsJt+=z1FAbej%*SFbsH zB(_)r5hY_W>x44<6ICjjqLo{AI;`Knnp=z;3Km_C1A>a|DC_9o8jTl=Yq-I#dnc5K zZW=GXRSPxs;fyCZ%sl?+0QE1pR<_Xj-O1qh5!d?q=jRX$CvD;_6(~c0!@)*wAi*sgBI^MwTkJ+!}pZg0FSVMzs~ROiGPHTXvd7+3`9!I&*JtENhlF zENYCU?t%;7273KZb8xVA$3UmM+Te0nW)`$_J$40~5tk@0-zaDN7X3)$bEo##)}VZ} zL!e?zM=$JqLV1KB_*c8UG_!F(X44)Hlg}vN`@@&J!+8~m#aHf0y|kWv&BQXKFBUj4 z(|zc&UB>|+qhxaP3hhSDTEgaX3&{{9*YM`Z&2xI)pH#nkB?;@TxSGL;T=J*xjW;}klE?15F;(y=AHONBuP;)@f=1P!W-xS=LrU*5 z9ECD&jiA7?a>}mD=M&Eb74)3XXRaSQPl3!A1W|5_Om>`JA^y_Q%=Wh^oeWSmhI5~Z za#0R8(UhmQ2LN&oec6%P1^@Qj8rs#m*47&(6RFr>$@ZFL>nxq<2tRUTrD&_5w7FRY z0S+^NW)+#XLxAQ)XW2C%C%_UJ#*q8^VrUM36oX5wjVd$qo{ zA<1}7aJscL*3il+*Qok~sCHw!e>F zr!HZYuFEDarBdne9{A94_3X>(2kStViPH8Yw%Lx8{6=ZD*ABKS?hBnQnqqqCMKKs) zXQ2Dsv+4Eih;u=zeONJp?<1i1u|#wdAIBailqShe743k#?x{@vgvKGu6Y7$hE#6r> zR4{)ov;TsjUn??xHl!9@l|@^in|=qBph!h|Q{-Glzpz`7bgkG>Bxd1*kGCZ_mmEIH zLBV=mr~jntB}iSYtW|X{o?PA&eK#5Jhi3uD*h1+t??R+NO{j-D4g{a>)+#@ThUH~o zV(CAQ@q0D6zMfpTUL4>Skqc1Xe!XS`DHxt#X~p}{!v{6C-hBU_pZMN~5qn`8*cL~& z|J}W##5sB3_y&C#h=73pXHv+<(Ei)7)3iZcU_|=t(RZ-?87im9{|uZwGZVG-2IsE(;ozDuYbe9GB5Au-hpo2qhNnI zv2=bzOR^W_EkjPZxHn2$7*VXOfcraepgLLPnRSo3nK*F3CznjQ5L3Rdm$hRX#JdE< zU5GUkR>SdkqQ0%=5eI4APs;!< znSsbCL`Gp{V=j|5)`$Qyjye_*7KJ%ZWaZQ;qP5Xcb!arlex-YMF?|U)aj~P&YHhsp zOfxnB#sfVTaF>WM*MU`9t$!^#g!8i0Y)c13H>s6GTcC`R8Q#fpcqz;&alHvPbD{{g zO_38{{Jxb{uslG}=cf=bA58_YqH7@#x>QMyt5>s@E_vv+3H{NfZt&%3`fC5l7TJL{ z5kq3S6m+2PRC*tr{Ib9T0N6NC#;5^=eu^dIbR}CokV?ife|~{JV2|`qG8#0KM}FUr z_@UzSWvJJpM*Fwra({g+EE2OD!%6R)9EizLr6h_K$oWYiXN4s-%7%o0}#s}!O&Vx)=uO_{$8#}f3Ut_p4&|-S6)XCCD#KFKq9imbJIfS^s}5<5S(|38pXIzx?MDIA^#-60gYuZX10CL2fSUi>7j?Yt4}U?#44l-Q*h*aX3!~W)S>fN*+y@B9Z9DQIfIFla-$ZUq^8wa;Zi0W$zwXqOT-YK{jHJ}!9aAZ(u{StG!`#Lqh30{kP0d(6?K5Wr2UDX}7eiJM zC1Gc*>wmeN+N*Y|Mv3d-Rh>VE=tvtQN0M$?N2Z7|Sbu3}k*r?s4DP3;&gx;?UJNcv zfpm7Vz2J{?3OR_b!y80y(tS%7#WW z^Beh5hHXt9PJON%^ow{y1Z?<7X#psTs7h*@LJ1F&Do-7C8Ok`I6|@qZb(rFahLm%j zt}O1AjfD-Ae}%&dl`>K*w2pg~9@C;m#z?aIx8C?DVjiM?$l&pA_4?rPJ`V+tGErU# zh!@ydo(Xhmuq?1{u8SK2oO|!2O;t(5j{>LE=eKfNyv_>-Z3~PRRbv&zn6tX{fFglp zygLoZs7DUO*c3WNc}Kcc+!n6hSo-XLpg~jj)_PiKJOag=wzjLW?w&ddaH)bQ#EN2n}&1Cx@Fm z7|q=wuDAd}xv6g0W}OWTUb$=SHx+K{z)lPU&E$nKbK`5V*P#{YP*j)sONuSfTBI#9VvioPM@xZMUI)hzMz! zWA!L^CR?@o-4w;fy1mGvcj@Ai_QscF`E*BwNpkeWW9kR6zM}qOkNe6RjTBQ|-au1h zjXTR;Sd}cvbLF4NXwOWbRof)6!}UDMB&i72}9+OR!7>AyURUvt=x-b5|%gY(X| zvpijqy$A^V2(@vFy+`FfoafEXhO`E`(J{NFLJ&vm`IFx{fs9-8zS)VL&dR>ypeK!) zZmIu!;Uz>}*vb8tlnuV6IP(9|l5{k*HMaZSeVJDK7c4{Gy9WYNqOfKo<3FLLVh|KL zAKC1`L*|G|(JXOcz)b^syUjTxp7mEXg5t4`?2-2=*Xi1!>k}{TYA!=fzuj4WR>ikO zw4uS-+5Xvo3n1gibZmX9h~-W%L=PV~M%_Rox1SyI%&cCo%RGH5gU0kzjZ*T{-FKO& z%TZR!F-$F!DWqIMvU0egPD7$HdI)9OW2A(Yw~+JL`gwS~k zH8mC8k}Pw_JwinGLD3fQ3zU66&cjvA%sxs^Jx$_-lHoHO_bmg_EZs?~ZDH5YSb?R?(i4ilTefeSE7s05SF z5vR;4ySc?%Z>H;oxADEhi_5^RI0pKW#o+^Ixkgw|wk*CpTJlD!tr>HkkDd5h^2KA_ zJrGrv*9@z0dzp}Pia1O5W=@XU-^xs!h@!MYV@Zb!$&uS;Ql9GG-W!ab=4;@6JCoyVAkqZ@nM6+)p=$O5@+--XsVIo5DGA zh7Rj57(!TmQpu%+jZHl(6=}#>&_`M>$-GkT`Ya(<$L>fc+X8?&R8LQ`%s4#`wyP^XmwHQYvc7#LD-&VW2%_D3KI z0Kecj_~6+=@a@Wx%W=-(8c{QMB{`1G^H;a*S#;C#=tRQak}At3V1rhz?P#qBHlq4H zKzHi=#a^Y?KM>$?kP_`0Kj9bY&AIMlbXd1{vK}^7J5`7)Qr7~$^H~wvlwc6+3~`e` z^Cfp>epEJX-va-wVQr*loFP1%B1GWK-h~7mRK{P+?{-tVET+EI47*x*WOb??C85Z6 zUHn5^W@t2uWJPg#nb3>p9(KjTb!7{wT>_}rN32!mZdTMmZ(E9Pi9GtX+Y4RE#@ZT^ z`T&vY`lkB8gF>9w zyEz$zKD8OE@e}cSRtjFCI$ww)I#0R*@Ly}tdNspj!EiilSlZRDPa^z}jEuEhSs4N) zlyfp--&sC< z;)sZT(^n5~O&ZX`&}mE7Pz)hdU-cG4iT3J|3&<-xmRI6{Z@R|VGE&yeF{f=-Ig9Dc zn?mLFC2^PzAuW9M?LUmOZ2s*SzHdVs2~tX`7v$N`18=MGRY;8JtctGV3`D9msv~?!?3D z6Vv*LqFt%hJ#+TQ7mvE`2}m9Vxk-{h%eS1cRO-$!TK;+pC&Q#eU!gxs)kT!tiBb5- zGNBQgw{9fyZW5%BvNO$z45{X506Nlak}N&pxZlG?v9n~mnyf!j3A(R6-x2|^G z@mI0Y4SkwgzdO(+smav4X~aPFNa7Q`%RC@hyXyqimCu(vN5vS%vD@b2DKm>eKTsAl zNWM1*qDjQu&5Lq6cpx3UvjW2-$WP>}07#9KwgS#;l>Q;h4xLL{)oQXoU)VyjTU}wa zXY1>NcK5Z%IN?2pN&dkCQW<`;fSRBYMsS3v#@GpH-z?z4S{$xgq6Mwxph%@NG$7Mh zT8(f_rC%@~$#!xHN660|4gWs$!w_`qUR-`wKW0bv`fzf~;I|)7@Lk%?jrUDC|5+a5 z%_;Ofgq`d`a$2DaR>?%QXKQOQ#eqq4y-u6qTv% z6zm&Mq}Cw@=&)D^3MkVO%%5P0VZzUzbO1}quiFgwEYybzf@U8Q(d#Tez0FuJ&+*=0 zxhi)SVgm!C96l1TPo_yp;|IYlx^j~$B|h+Gnao{+#rJC=BXyMh(3(J+*$u2g(+c9q z*om|$(mofvf*wKD&aV^XCdaJb_qX8w^EOK=b>c=>?rm1*UusLncIkSQJSzLgT8!*) zH)8%fApP5C(3EoaK}hU4*y?Ht-=AWQqsKzp=a#EC&{6i_5IoZeo!zHFfXfR<7dN=( zVW1hUt~z;kk5&@NI58>qpJOqr7{ z=e%e=gN^>x!}(tG*na!-WRx{oGT^pZAHH&hciiJA1a3Cef=HP(k4}@bWQIK7;&;cJ z355)df9V+`q?5u%_)Cs7j3x-d8g}cEWdclvga=squgL|pBP|ILePY{C{Y?tA=zt6S z;k8y|qO!|WEfHAHi!Q@bMp<(mDhPA`JGE01OB68yOmJN%3Zr+Jt#i72dC zR7!-sNfdO_Q{+81S%+>PaGZ#dvc+sgiJV3xgC zXPGcK_9)d@<^lQynZNMl0b*-?F-ydLul%pmO$W0gKAO0N zSxc^!f>$YK&w5RyM(O92kMA1^G8SijE#M1F|tec zSgnW2J%;zrpGzLsV0FD#;Y{)3vC2FVg&NXBci>_CXfb5(yF+0=C;LBvC*}L&P(HCS zxuHH-&DiZjfN&H9ku_Q7iVx&R&u0Av@5Dh5EV>(J5`8t&ded$WD1hM3U$H(z? zQ_G_=DJ~KQvPE;tbrqUckOv~p zNj9*IH7O*@VC_x_Bg|Os8*4`V*!3G<4i8pO?trJD%1S{FtlT(5XYg6^-Kbq-4w&0B z5Qtq!Rhz}opv@FZDe5w0X^r5&&s~Jyiq>t8l&u3m}98EqN;GJY;y3pi4eZZ5bcO=?M~)W)il#c=Y`Z`hlYHZW0?Y;(3E3QEJ21j zo8+JsAVn!s5lVqUMH!Zi#~J&Y%Z!*Gy(fn}M6aUvvHo_g*_g3!je zwOY@t?q9L}hBkLv<{J~!KxP6vBP&4&5?B)1FY+rQueAYPj%Nx-C zQDmWi| z_fX$9{4<~v`t4rjKO);1pQh~q=M>U?t@ecSmJfxdVC%6WL%0JeA^{KI=bf)6 zAw_+UDO7-;_{|RR23_OaN;Pj}HQASx=kX5_3vY$c>1TPYp85H=dG4zR&rx}Nu$#mD ze3#x&KFW4^=2Atu()f}U_ZrS$)#x%Qy_!)t1YKg4=N%24Y_T~G!^?A*12JG5FEg-K zS&nd(KIf?@DY>aHV`VL_(+M_a0c+TaMOTSa*w=eC%RMmJ1+ua~dJ?JPH1|G0{{4H@ zVjsg^_YXc300cz$KMwpZ-v=p;O&m>(_5Z24cdKh6et(vHkJY0yG3Q|LBM{3m?fxaX zXO_U#DY>3sseNniZjbrR!vm1(s) zVHljsRv*dJT03BQf5AdVI5DA3L+mMxpg&{}2COrL+$o)Yn1xCMUvejf;pMCUgFbFj zsY@VDkuU`09fqPS)grGd5!otWZi1&1ay=B?I=f#3)4HGCIMwjRLRq(KCcv%KrC7ql zDh(ew*~&Ho+VVqUNPY&uq{&RTYX~VlQ?!Dl=-ozN$d04W^Cr&gIWSuJY>xA^DS7(9 ziGkHhCb+yma4u#gg3En`R%%($5{mV>kC`~5Zyt_uOhC0q!>^&Gm zLnS+>yxq~XX4O1%3w}wvvpad)30d@f8gy#^YL45B9izYHck{RZLAN`ov<}c?SfHZ z%e!KgF8+Fm6~S879S+230e;@o3%De6rd!umpJ+y)MNrmPRVeOL_b|4=sDYcLzx^|R zJ)?EtdrxReDak>vrL9U(@R@rQ=t!`NTdungG93rDG-oCgl{3yA@Tq!P>+hzrpX!`G zf&2crjf|D}O+Isgu1bqh|7YT{T-anAzhAb^70q@~^<*$*1|A2YEOeUxXl<3`o1Hux zoPC_PBu25A*hH2Lc!Doyrw^awB>rm+MjsEd#OVp z#)P*8z(n)@az>MN!GC+m+UCYnBUs(pk(cD^GPO%wx7&?enZh1kC*J*p0)lkc-$sP=DJs8wM}?Df2?kReHu4yH;k8!DKz zcZ4<4&E&>&P^o53a=GByp-AWFSkgqAO7s4DO6z{cGEuWi5Uo6X25np*_M^B7eslim zv63f?;T`T0_eqzu14a2sSnOJ7udqgp5clP#emnM>g?|0Dw#VQyCj0$ezAgpsz4#6# z1lp%pJ-^6k+fatqh^gNRu7RDTf;;8O#=BY_jC^Io7OUSv{5Y}HTM+YOQgmBmEUYbu z^f)J4nNC)gNgSdtgXGOV?MoL+LM<2ef^&4KJXx}4g*==M#dh;A3uUaWhV8CKVZ&h# zXc$nJrvY)1DP8tZ_U0*eQW;_Ax_gF!$I;V5KDZC8%(|^(W*x_QdWZ-{kzlEd&`lhB z4$;DN_C51j;FR}`{B7HT&naW2Rk-gaRmi@Pq?YD3Pcj2!n$Og&;%qAX2JLiDdp}nW znIG7CHLVQ`pi!z+b2sH+o$iH_0lQc_g>FP}MeU?-qM+j!sx4@d1?Gbc(YdQ&MF2Sj z)g{s`@^SoLp72ra(BuDzNVi^CGgFN%xwtXNxP%Ed5MuQDeE2NO@vGiy{xocW>IFELmnUqJDz2;)U_1{oePBLjN&1 zE;}*G{&4PK`O~YnFft8Y8SqIfzii$Ij{%#yBdn|g-2J#k z(C(v-LNK9iIG4QrpW$Ukjq(RuJyZ8mYnr6_gF6kPlF(a`>c}Zax$CQwlKFX1!&*sL=q%t zm6Z{1OSb4(wD~=43A-yJwX4;RgP4fDXAURRWcs7$s{>{nQTAtLian)CLyik~puc-^ zs2S7QPXAh!z@6XuA;B>M)f)D6e+uW?;yI%PQWF>8549eEO_R0mcAfb=xI&Xn(DN7% z?IjE*?_pfh1FPe$B<2BI>;uvn|~I1{)P; zX2dPNF|6wlOBIInLyIv2OYg$}fD>d4B*WAgR%nf>{Vz#awJ~ERs*(R zsU-{u=q{VC8FTtn&0tdFALHeqr=*w3({;`+er|q#*yE&IxYFYrXKcQ#DT+m;?c71l z=YB$c*#R@&e7J6jDKq*XP=m=C-V4PSrHMh8X!>L+i|Hk_BR9_tgwin5w=q(-THkH? zU^3NrTMlh(J=kPJ6*8x9biRL?bh`&Pio7C<%nk zP{?kOco|EvsBVjF84)n7Tg^`J2oawtG2zE`eAN}F*_bb1P^52B5hISdR|7M|=wyM~ z1>kRljoK50+ShvhWHOkJKaehH`r|OovcKxh95;fJIL2h^#v;?0h0#o;2_d0Y@Fdh; zot%{uF0~$hGlm)&k!kSOdh@Qdg>6)n`JuWnlDpUTRlmxWz#Xr zMboHvx1Tq!phwGuj;P4jW>OikUuLf-?HT^G5j`3C$exIHuM}Z;25#cVq5&UPq7)*n zk@@q~7SeB4{fsuHGbT*QGa0?pwgRm`9Ad3h9)k3kD=ME` zG3r$}XbqzMbj+760j}LrMZgx$!ATRuVhQJwufY(_tx-tV$wrenMyap%YKkfVwe4CGt4DCMEt$cAGZJ*hUWs6dwalu*nmNgJ* z746M8>Yu{4MBf$Z(~#+%5$o7L8R64)O25ddOhjCkd{P*lHOP(p>S}7nIyVKd%rX<; zgcB7njb_R1d26Mt384t#k%b*aSXQkn8MZ`pxL$H z9@;|5UHqhOhGJ{|k|qbTG2MSX#3JCa3;5Q(-?KnE3#LUw9=>=xvsIQ~hfvr*qe*xy zKnN?sQuZw5B((_E+GD2Sf8-k0EXiCm?rCY$29NpMI(EM;Ei@zDvR?l6uaoa3t^u+h zdn(5}&@>gQirR3rZr2$q+~Mj|v+kBk5Q6Qk3l-lgwxC>r*s9zP4|GB7I%$CWPH6Qz zyErP@(tr`%Od-IW1vQjQFpX48G(C3Kx$96l2p(VLTGR`A85^a5)?e_$?f)dNA$erm z;BFdj;D;%7!^I-5Xx9PUW?I%A|CIXaDN5qLIrbpj_riJEfBGHT*J#xZM zrQ-Vv-I4>pqSlQDv%|RcTT!*$683$CRf1o|&ckxEvEz6TvTWEWx+R&*q4lM|X{S#| zzUyy@yh{1Rv-6@ZvT2+=f+D$~aNhRwve}I{L^!Oa4}k9#aay9J>HxTK+2_|(m`9A0Ve>0T+l~0I5g7&Wb9ZHJvts(t4WYoWY z^6%-5If=Sf-|3B^*KafvHvKH{~i-H2MuTB^v&A}Dd*uBA)IMA(^x z#{!&k*^h&SD_{okC#p#+(O+w`yFu}!kd#*4++xX~^@E0Ngtvb;?gg_G&eWg2|A6s% z+Yvr7keBLj>FSC%-W`|(oow+U@V)2;Tg@}mj6dLjG2_e){&Q>&-c%LlvhpFBB7&{J zMMHj>c`LSz^Mh9Q8Q!9t>Q6>M_S{4?fDm4AJVx+Nzcu+5hC`*J6^E2-o!^8V@YF~# z+Hg;wX1&NtXRtgTI$xPpfg0^)(V7H^>M-f(~q8>*_%1z8evnUT+bSW4IWtKCp_D#3P|`g-4AwTtQU#=k6!CxzJ{1Wl&Q0pdbau_DDb3I1?^qj`PXL$T9+g zBQe!AK%`85s_#Nn`e&7o6jgD3WReKa{!WkEhUli=b>*4^rkI6bqv8M(ld4he$M_}5 z{Rc~bqB$!zbIxg)>uTq4K;IU<5Q|Z9INcoo!)=FTtqOvd z__5i_kHcs_;(J5tp=!p8g8@C!=yT~(5oLTwW=4(Ha0*wyAg%l#9cgOcd;`fp{ z6~PBp9N%if*U2Otp-*NrR1|R9NvKF&-&>7uG|PUq#))>0!N9sDMdvoTr!%9raZs%B zz>e)ptHUJaQK(JU8(?TU%=2>rnW3P*e!b6Ymey5J(wyXFIuNFZFP{D1fZ>0=l$*Il zUGCqDt`gtK;(wFN`maC0Ka=L^zoT%PRdoN66zY9ltAPgnP)q_$8az}cR4X7Nsi@7T zPdxgEbeYq&F6RhlueVWdAqWH#Dxw8Z*42%tky#RRK!@FnWMZQKGOP8fkGWbp0*MA+ zfRyZ>3>Jbe6Yr>>6z&vKx?fRqsz8+!+a68mH>2Kefg_CFoJIlK27>Lt6uZpm!u>%{ z*y=gDWea2pUK2XBum)wYNFQu$3}}J>c}GGZRqPzJdcd2jzZuB2I9v{=*kv>Xb_aEj z9oUiB!lyFl$_DIU%{j<2Dnb*LFlW=6J=QG7xT!;sM4WJKipV*}O+8vDn3

tS~4o zNkyVdK78E*;ZpWvF*ixJ!XcH0Zd)wYJ!5;_On8+`SPq^d;IUjV2>`xm4ti?}BVQ=n z#rZ&Jw|{xJbWYb5vwTkZXCw-~YMD`=%M}sWYEnFml%wle7*j@R}r{Rl5YH=LBSLeBaqi#2} z*@rsRRx);kI!b7SMyj(iAER5-==74}0|c+*$)cnRw@raX330^+CKDKwxL~bJ@iG-C z>DS-OJ)hGW#K4x!4_bus8svoMsreZB79(6MM-sy2PssYSX%Iso7(ZHk69ly z0Vwc>@Iv>D;!&qXk)^W+qmOLQuEnR*CKZUy$-J0J$9!UUkqD#$>C8r2QtXq?=b^`a zh+8D#hB!tBPb#*|7wQW?Mk_}2PVae_i@GhQBO@n9(c z^&Pb=6XoM{^lh>6SH{QH3ByaG%Z)b$GPSZKcW&@u%NgK(m76@Zwl0Y3h>P$m@VPbR zT?*Y-)aX;(Ft(yG?}Af(w1aH=^p#XJLV<_|BEF(!%tJ#A5e)z=;Qb!}Za|U0fcBP;nRg9+m*S!K*M;v&{nRO2ig!=hMv+D+ha%dWZZfM{YGb7BQ z_xhvJgn_ev)K+J!D@gytt_brGyDvcK^dEllWL$QA1yD-^1QY`R00;nbo^wn$7=4Jd z9{~W3SOx$d0001Ha&LNNZY?rqHZVA1H7|5!b98erV_|e-Xf9}QaJ*Z4bJ|7_|KFct z8_%SW7z}Zm)}%=XgJRRcnDWSDrZbvDI^Y_iQ*|d}PamJXd(uflk(D#8UB*t}Zuhs3 z+uPec@xyl~ zuU^KKjeq@$*=K7eV97iRYa(DlsSg_(uBZ#kkZ)iUd6ETcmJ*kSq6uS<5<$V`{ElI%(fiPyof?CT2KK)={BM3c@UEc2&tgqHFcZF zA4Bw+kRe+{67`6D6by1r;f!-3Vak_sOF{}m=1^bIBY2OBG44aV*=j;;hTW? zx6EHDz{JAgpl6Mymff~nO?e}Mhv1;DKqRcC3_8ch+wHcwP*R#aTpfQwUq__lgG07N zg_bb;aCJ7ETfO<2HMOUM(fQD_2czC_-nZ;tch3;lTOJ%7 zAHyN@9WQcqq;!D!l7>Fan#;(_=Rz_E7`_S7 z-Y1O@D~~UT*KoLxff_lIhvLaT{MRI8#AQw+HfcXz=k&BeZzT0q(C^0@`H`S*LrGWe zF!L&>?js-|E=I(D<~)CX`a>h$ukv3rHUjDr9|`tC5L|Y+4fmoGh0AH>f=Te6eU&i=wK+#8{$BFBlkruNnX9H(YwL9ec2t1 z>hR~Ech64dqmeaHTUF0PGCjB)4>fd}QwlQxI!X72-AQ*>mYPe!%Cq+9YG(JXcY~4D zFHx3oV)=VyM4wBx2|T)?IPTi?#-V{^+;6VGmgP|;Wt4Skjb>Kgwm$Z(@oaE4vM;ja zf2Z(7Chm@nK?0g}dASE(z&sk-4hhJDc}y}YjPT>Z(3;@KarbO69Lxqdhlf{DUY|

ybm=xx0O<~DB zk8kk|$Wbuf(|GG3nW8L&U2i;Yx9!nrjsujMpW*1leDRg4>UFxA@fcP%xGy|XM?UskG05m-J(JHMNVMFDbyP`tS zU}{^V`6a>&>2^9y*ed;@vSuA;bBx23QAQZb1-1&V;nnCo{wHyX$Ng3Ok6GT;duuWo z^sR(Z<=l|D)XX;@4StzhcD8tt&wh`nU06S;aZGvPmI(?G{*p*?MNzN7oL542JN^7#Oaeo+$`d1&Y*tISa zgb&Pj`Bnf9e2s5>H647!68U`89i~dhV<6ZHv+9>BKl|dP#ztIHkQ|j{zQkV|3RGbU zKHcK*YUSx{5T8~Mq^*q;sT{3L-6$01$7zPGqL9Q1d*dDxeGaD|rNhE6`g7<{-g>svNUGax|LySds|D-7>jWWU)E1 z0RlWCY1mW_P`#a+)xnvnqw!MZ-58}{FQO$T@3sno7YX$n*Cwnm1aIG{2D9BdiBJ7v znNZp=*`ZyH^s@D$3h8A9lK#Kc+GH|t-EHlHnsakw>$9X@mXj^UohMN)v>IBUHzw@z zc~u05LcMmEFSUe9A=CMIJh7&D*v$I&hwfyAt?m?lJ%F8;J&w!B8a%nP?|1@r6GOT7 z{1uB&dc$NxvJJ(`JZsN>eS&xfrRSsnsx}Xll>7Q-+?`-mcVSJf>HqDcyy(BDXC6vv z9%yOB4TN3z?%p|m;8%RQ+^(<=%r|Q9(>b0^ww*=%H)+UMpF;*e6Mj`#QDsTe~D#o6I1mu z);dBeu;Y_gr>*u6t&`(jfQHXyLnFHl<~QV;iH2}^KpT#BQEs1oHtpNftNEm76_!eS z@3GeEjE5KsZoXJ&SCe6P)W;sWphh#rCV9M`7yGe9~ttCW!}^ zBow(${mY_H;-N=#2X_2gw7%2Gwog6)Z{EO5c=|LQxEze|+_2RN`wEA%g9WEQe#C}$ zY)uBLyH(rgMlBf1;u?<^fy}hXbykRL_|DQNM(M%oc2_xp$-+^Db?L^bpo}NQyJQR)oP)e_j0j` zyxf0jH{B)wwAF$-sH*op8VBtYd^1J&e^*Df_9|S=#O3bV%$4_iM%rSNhuGzlO*+D?+0|VB;u|nS&wulX6mWknJ*GxHQd6X>|9LJoMqeU#!eskJ0MsM zyvIr8NZ(&{r&;$og$gd6G_rh=WQvm_d9FgfUlW$;tl!HsZxULkc_yR3n#6X!8=9wROZ){Di~c@Ay@WcLw@6-W;1(4+najg5ds-q zs}h0IEh4L|t4;l>Bqo=TKs+xURTWgyWumW*Jqv1ID)dZA??1O`KC<2`lkMHJnIxIh zph2X8(=5Au?^u#(q&LecUs4vN7^$mdm=i-;j+sNtGQ?uV9cn2W%`E#!EZ@DB1R6Oq zc@^ReB|}-DnP*32QKI>9FV;Y2dV?raZ4iswx11<-%2icsa^<-NL1la<5l2SE)A9r? zh@dWTKbc!#(+JOj__uP+{8c;{2^y+<%IvYfOQ&aKb!P1 zb`OipggM*;SQFz^*kU{?4Z&h2u7WKpT}@b}xcQJaFNB%64Eq2Jl3`WYW-bTJrWt6< zpbrsgDO9Ch=DNddnUT5-{4l3i`9ekap?q0vMFpgf-BCBWlKa`3onaXB1^xKfaf~xlc2^I6=76|-IF zVtuwDlZbQlrD8sp5QIFSp?3>w;=5iVg~=wOCeNX|oF;^1xulNNJ$3w@t9eDWID@|p zL{%^)M^-PH=C6oEV?AmPLlbEc@<9@LR{ZXizWY|bX2T5R256IkMf*(Uc5&g1H>_V( z!AMw!E3ZeHNUuh=d+9xnK8%`g|L;*#rOi6)uc#|@ zH8YrXEOX>Hf2HTzI@xa7zvs#3N_#Y$$>dd1VBuW5sb_Tf9@X^(t%j8AkZ)^s17gAG z;xmAS2T$+$eTkY#aS{b9Xw*MDva^TZjKcF$sDzx&WN1|?8NarOUB@oW0GIGV_s0a?O=*cg>WAbHc4P8g(x%dpHkQH2=JELYPNt1-Pd9!ZY+q=cAOWICH*S{c0igs!1CL5MOA z)&EBNl-vx6vh`EU@S_kiq-67UXNY(!9x}Pc!2_ke2#7=V-(vl7Z~*v99v^~1FTM|Z zT^Q^UL8sIgOtNbVe?a^kZEww)Ly;Zy>k}16*@qF2-~RO)e-bRmBSPS~ul{O^EIee* zW5ay;kt62_wE|rHCn`_TTZPvf{b2EHGr&{Lya&KjP<1|$JVd$*b@l@&tCIuhXuhu} zn7`yu|F?R-&ca&p1|gT!k<{(nDZUPW{FO~yvoOAm{d<=}>rsq`DOu7p&OIGPLA3Cg zlS@!f53BgN=FEj!O5Eu@QxkO*8tbYNlXxYPIWZq>$Y-ipYOqieu89{>sB1~-E2J_C zeLeXTJk4cb{%9=5pUi7Z#)pp39f|I^47;^_=rxPn-GpSdaNqCd9Hy3opd|a13F)ZILz+jN< zf?)4ld#yx$^ClsF4bPwB$NH|{wQcZ>NgWmy{^<(A9Y$2%xtFVA_lsJQ&+NOhw1;rx z4&49dQ6?L21w|}3b*%a?*#bh6P>K&suK(fg=$e~`VekA319x0D3I`kyTsL|LV}o+Q zU@ZqcNJCdzfcI-4Q8=rmX8e5iRNtPvlWDy6eRXHx{3Is2xeTT!Z>7BP2Y?^C$UR;)q=WT%R2?hDh8qOH7F>~}v(lRKO_`xR z`y%5CFfFnwh&)Z+$`moPbr&sAH|=c`K?~UmS}_`mW2I}39G@qS6bYfV%JzOyRsz^nSBnz#e|-9@zU__sVyC zE{QuDStW|>XaudI8V~J+R7y7)AA{8DMJDM$BJB|9t_0Qk%EKxVN~Vwx-J3z z$uxz(E_7MJ{OPq}r|49O(~wg&wsg#Y9%Ui%Bq^(HYwQjpYt2Bkp8bUd zsr`dU9G74fOwBV+sPDBh3BnBL`J9GVL%yNCTVK!?eagYKYGhrGEyFol8>XmjgwQjv z*omU8qQ<3?PCx5xL$}db_YAexsFg3?6eqBQU{X1^Ey&l)1O1o+5VX!_P+iM{{rNW> zfEW%nly~ljP+j9wZv(LI-fLGV$n@Ie*=~KSydwaEarvq0x=|0vUyoP2v9AbBL1tx4 zSH$z8Y{k#K@7>#h0*bEo4@M3(UPIGb?Os58SktCx(X&q%f*l`&sEO+s)~=s{gdz-$ zZg@aWRB$A#okfB7+=khq{A7$48nST(nJoA6Vl2xl#HbI2%zAKcf36@iPDyYg#Rvy0 z-8dNk2~4xlAz^$5`q44i!X}0*@YmnX=Sxfq*X=vsSG4RMG+u4@OGjEw z67MHxIPi)^i7U5|kV`OU=5J(gA<)c_HNR~={E;P zj5ozx7)bc(1|qX*gf(U@g+EYwZBTcct%k{^F;eajy_QJP(pr>bv_={!~bSp~)IG$^Mb& z-7p~gPJf1ObBO>%^anQcx(Guv;D2ndOK}Z3$zl?T8_GGZ#J)QQu3kk1o)LHT%=ahP zt|1~Y3FL)py#?&XfMJG@7Zqy9&5;pdclf;49GuT-TJ1=oFpj{D(Jd~cY;(&ou>)By zQh=P}9j`{!BFkj4wLCK0>fD~iLX4%cEM&Y?ACBH!{*+U3O4`CtVqP`SKieQVMm2p? zQEEqANX@FeO43nRT$mhwOtOg^=ut$BGHhWDUGKKDATvNVbwPI!{Zv~dNmul{72&pM z^(JLg2cDJ+`;jFR#zpF3l@;o5S2GerKuFESD^Em55?8F$#O*bU&xZ_)NiRR*isH+; zTSeoJqJ8}k-at`R&(N!?3}BT+wF3Kz3)tj?#-F>Q|MBi<93SjH9KsQeH<$;knYbdc z2{@IN(^e$7b8ocUlC*x5_)3_;3a)H4my?El*B(yv%|v+`ww77;G5;WiKV(fQYJ}Q)`)R*YITR%06L-8H-E1qd$*jq+aROwj|uveQ$yaYTn#cHq>C&X(ca3T274ki2Ut) zw!R3Su0up`sF(u)91+_CqQNIqXNDbQXnyvAoM;ovaD`McuMrJh@U2%yDmj<~Uw0>-{T_=uWq^n?W#IgO|Rb;`kwZMVEqtF7*= zl7n{qvZ&=m?;8;8bT)aw1^4olNn!uFnx$a|M#e=9*R_Ps62G^oa&TFHW&U0lC@onLClrx#Js1`4#v5Np1AkR@|k@8ytcmmY&o0EU93 z1d@bETw#`5wtRXue#g(pAocj(!NU=5c&Zf|=558R7@g8tMd*TivLGnj|4 zJWjulb>!Caoj8<8lOOD&XjG#z>BW$ayT&*rC?@Sk>BYM}&5EKgm>4rlgM zuKh9MGtOb_yA*wC<9CZT7;xxs?AU)DcW^f;?D#`b2lMe8f)6J42L|$Lu?MsGkB1=K zk^eRV!Q{@1La>7S{)+<=$N$ z2cVrtYv9K<$yJc+x27=WWe4u`M(wMl?DzMlV<4bzOIzDj3{l^tCOBT%f0=#A@{>&5 z71wU^n%Mpa+zaAoTrqHA;K%3fh@Mq{YL1foov70kl+%M-%y#V3Ii?TxHM(T*m zG)<1m04=HjR2CKMIC;Y&AI!>mUMgV#GuYHKOb@U&Pz}xuJj4G(mMWRv04=e5$??GF zLhfhOTMcrnrx~HbQcU58(DUcpMJ41XIaw%r6GBj0x=c%nzF(ud-J^2q+jD)#R2nnZ zw~;RLf-}7(3}_R>cc{i?DJf93^dGa3sly!K&qb`hlZxH2y|fCL&$xXRQ9D%ngS}&K zYM%)HEuZ4R5mGGm?Pw`+08vpMj_psKQKu8yK%*t8Ny|?}{Os=DGuyi)O(_o@nE~2l zZ=aXFM|Sr{S+n?VI&vAG5|UE1C7`5v2Z>Tx*JexNSG40d~hG(v-mJFh_k9ZVoX`y~e|s zX#B=n&gY!R5FnrN2zhqFIb;K^9dmS;7Pggde0(Vm`4|X=v%x4F{05@3RGzeh&I-I> z8cbL=yVxF+!<{q1L_|IRbhf9sj)Z*D#_18`sk zWnk?M{i6PjH(c(GrYpE0B({b#M0H<{7C0}YZk67nZj|0)u1Ly0&o#EA7plW6blPK4 zLnl4C(9BC-*uHo&)lcW|a4WdzYWWHiI7#}Z)!yb8;Hvnu*ekcH!~@G6YFifs&jc7c zIuOmDT4SX@&D{Eitd7)@wHiSjUIiGiC&t_A24>8P{xr>ae zcGu-clDtD20~GmAA)`yO;-ibP^WSXg^3Vi$ekD%ngdnp;th9XvY04)_xF~)K-IJf< zj1Omjqlr7hHuT5YY{z#K&+|mcDF04bqP8{E=}!^TRutod<-s-#Y)`N)ZwtuOLJ&+Q zSl)@ZZa7=tyVw?8_Tdb#FGkXBIGWi<5!mzTB9=;%dx}T6Z6{B=7KU7}t>l0J%hDeD zX6fD!E&HOZL$A`V<_K}0chd#At`th_{!Dl*F|W^o0mN~;uUq-F!sU1cbn4F+KdTLa|2yVIJ4F8o%2a1>m8C*3$kKW1{y_jlhCK=1l9kcib8-uu?a7>p3!TAb&jPGg3Xo0# z>^^Gk{#hC^R4FJ?h2qf8*eaPglrXK<>jZ_(8XX240FGUV``xncd4BOLXa~w;&`=45 zT7;{xJEuZS#+aw@DEdK4GR+7#h0I_|Xay%71ljf%V2A@+eALrQlj$pB;{`PjdGl3T z$p)!8>`xqgC3SIMPCNF&~l;9rMbn;{2pdJSGdw{R_mN7=5MHa|tb z?D&E`;HW{JW8r&*>O~f*Tu8lQZMRmfAKKcax>|Rm0Bp1T(n0Y+OmVu~9Ts7Mtb1$mxj3YO~ng z2msb41H_Oa zI9CuaRellT3yLsJ!=ZxR0WUB~!$E+%LHrz%5Y61gK8W-7^^)SDCXf#WXt#4}00qMb zPv0=QF7vr|@TCj0!v*V5%9`Bbb11mwAIkZ?ey>@6|9z(bHZgqE5gq^g{)^ze;{FFq zNyh(vu&jLXt&k5sJX}5p|28q{jQ}10`~HjIyvj05Nd|wFWpr??y|cfzHp|cl*>`ru z9sRxCwwT;iXz442s?gV7n5nb}opW$kQn1sPoA~B^%*iODF+8f+sH|LPv_)^oxGeX* zx$osO?F9Jgbi~aTd}#qAv?{QhikaZ=)g!2AkV77TU?o#EE9r9li6D@1z7VbBb-R2w zdLWXDbX6~B%z^t=JjLMAdPGYH#8t(^Q8FuugR|ny7Nac=7K52FFW5yQ2B>BlrBh-v z5u#5>M=eEi`_dhJeL|1=h=)kojRDs-v^6vjij}8pJ%iSYqrl8S6a7#DRxN=> zL=`d1!hM+N-Wad%)p(}Zo(ov!PBrMOeDzq1232`y?zTA<7ej;ta)yU1$S;&oG7^F< zjI3phEtjTlHK&y(alP`Q*u}6OS$w>;9lo3e>Cox|v)BbgN~RYFhXm$( zb(F|Z$A{Rn3GEzrX|xkupEuF28-QEKx_5>0Xz6HliZe3hSY|&3ms99~!x=x}Y!Ib` z**JjjAx3G2@!+;y9L5rwlz{Q5GMMG)N1kX6$yoi9ueysSLWekbfN3hRf4_h73L@|d zjvhJf9`?bhs;cMe>^2YgTN~EZVU(f8+8=)K$)^oe;MU&W7Hcz6cl{k*fc-kkc(*J; z@ZS4~024!Rpr^n+o}jS}zTvX+{$vWqKzmaC#NW>NR(I%XB-$Ea~kH$VRlz zTPvW`(R%WiBDuF$lbSJsU!U4~J!-~Y{xY(4Y7ry$_iGdL>k+eiqF+a{z2!us1Q!-f zQ(I)4LmYB)2)@J9W9ZZz^(ZchMCab7?@h%~Avi9~#^cE}#dD`-6HNVP7Xi!>(e+H= z7Eh_f+3B0_ee@ys%Iq6?zGW1%gJ5YeD633hAOwzENAqo7q0;tee^AFXzph$(CSy%(SbJE>rn)b zHp+04JVcM4!E`VZhw=iIBOJImj!XC*Ch8n0lj+(jvMuaBnJ=)_l=ppRHE$@WotSD| zsje2b02oeF?h=4*i6)ckXK0hJv|0< zMY4e(U5R+ChJ5RLPbQvnZ%-#&=gDM~&h%-;^PfY!^YqF4sQ>hR^cke=lu21R=WMcK zna$#PG8x}$v1_m{*tRu>4!_+txL^}xP$uai zTu1;v6mdv92B7r?Q=|rs#^@?WQ=hMK5?{SY#&FX66pXoTjA~il$h`S#ct%Vs&?cgJ zp{${ypN2JQYPGduEWRky+Q7u*HCQh0mva1}4yZO?)Zj0YF*NrhGNx>d@-Jy*Z2AaR zMzjyqCZc!@J3kIJ$!fs)dSXliROXEQz*W8AMND)>`VS9 z?*kw12w%82eCaOH&EJb>@~ND+f~B4H$NJMqD#%0n=nAx2#1(#escgMa-moJ+0$T-> zhsT{k{L7{hPc)a%uWZT(wdyxWwoT2et0J2!h~>;m-$*^kt`f@%ZAh70-iQ)KrNO8z zOu>`nlG#xPNCy>REdtN}cZXJ3%Qb&p+xa4atcw6Q zdfzc0TcbQHqaf>Fh5-g(X-Wb);ypUsKR7x1oWgmEJ+#F*D{J?zwie$rhBn>c5+c`l zSx}Fibww7>HUpH{(EtWII|j6z^GKy&+yz+FsK=rqLN!_U=!9kA7{O5twr-JKldqGj zY3irrC;XBMm|x&PPlcimLx@Y}yefRzB#DPvFHw!!2>1(Y%s-I`t_TrW;3WqZM`PfP z>Kjj~*#F`P{(X1U+dn=7@ojrRR|j7z%(b9)8h6Vo!E~;{IEb(Mef=Es?`#<9_v#p6 zReU#s4_LB!W9J9pb7xLJJHYa9*@o<4kD>V*awHSUM}2bvewYM-5#S#*3;=XkXhHx6 z#{>hkA}9Zs4U@fB-<}-h9MW_)8HfG?4UfC!Jxl7#qOnBEoGCJzM9<{?Yy^Ow+JnI?hx2P`&T) zn?^n=;vh+{$YDqB=spdX^Of!j=e=|m3WTDMV$F{9r}uu@ML+{5&XKVJ-xq)gsZnk6 zvtC5JI%>evDQ0*@F=8-U;Q9`N5?B*j*XdBSQp%>5T#H>A1Zf03&IAj`yx=b~V#StF zf}7dy{QVx2RApX-4wt@@&)yzaTXN~m%ghsD`S)oK7g0yP%q5x5bror*{zY4bzFo{x8>n}+S}W8mCUA~=2(z5)d+Ye;=0BU zzIW5G(2!U#(i^B!xGfKfLUPIwMM`URpCXm7Sd*63Kp7g%4G~}Xrxh|+)%%Q|?M_&x z=??FB>~4ju_GvzAWrDSx$lWi_b#tCzY4G|qyiU^F9-SzQHT|}zEz%?2z$(y>_(i&ba%Rt=jGR9-*$=Bd2k- zK7(-ig$Z^{30J$tD}Sx3YrWcL6Rkb9fw2ykTs>q1C+)ckW%@y+a9Vta5hh06ZYjUZ zSLSg_{2e=Nw^8a!;W*^;3OL`B3T<^9PiE8OshE5Ej^{1D3N;l9%`T%9PimwWVT#6= z7(A24(VL8(u@+1+;B*1hq49i~HfU$S8CU_DRM~;HH_daygT&+3GL`+NbrD`gG0gGc zBRs8qYA0LY!+%u!qVkq3KdTvDmeu>}tuhcpv%@2y`HoqZ>rOqqkn2-gV%cAf;0P$E ze8eB0iNk8mBoMxPXH3qfIl(@Hb~py*p44;WubC;=IJ^$y>9;9=`32nA2lMk`Rl9A( zw<$zw&Mn=NOg))oj7#|7(0$UlP@m(MO8_a$Y(T)&3o6g0P7fB^<_@?YOLSk zKmhC`C*|H&bL46+Z7t1pS6&zf6itl2b+@H233=7SMs(+9T-#CgHtb*X6gJpB_xW@- zL?%P%%*oqF_j6mr-}h`Ee+~L~Z$P_Vp%zV-Wedf4*`($jxbyQx8ikk2iWv*yf7mRMG{-HMWbS6c1ZCI||HUA4Dl1AhBvel~UOY}%6k;cRKDU_9ef}AK1P9;< zMsJcmrn7P6Cz#R~x&%oIU4u|MF^=%!5~R#a5o?+tp0SU~2spg-%7Z!>BG2&$sU^O6 z+2R$a3bcb@$+@HfU4ld#0vpYfG@9br69MoxngdDU`#`%FN<0U<<2&EH)MqoJa}_c)a?{N z@2DE7jZ8FrgIN&WOJihqT~bsgbk|rY(wRAx5K3v-R5lHu3+)yfeQ4EL6R&l}RJ*V_ zEDZ<`7Rd``O-8ZgF@^2>Z;_RU{K_IvSVb6G(293?*Q z-Uql&fPils_Vs0n=2ja%Ecafg_jHP(nc|Bk8=^^y4DTCXI8cUWPg5649jp?+U^`8( zZXLdT^Ih14t|uN58lcd^eoLkq#X4g?cQtvSSQ*$wDH_p}@FM|OUG2bThA-N+AnG`p z0nz;jfbP)sV|aTdV*p$aH4NoaS~ZB>Rg6I)TKNdb`?qosomC7%;(CyA7|y+wQ?e4d zB9sp$UN+b4%2`^;xCm?c(3aCu6c>>A4WCZD2`ULv0_=O31l_VGzn%POY9~Z z4n=421A%7qxdZp7=9^LQKEhHkXmGUfOAjBSL+eF1N8*9BKMWUdUb+^n0_Rk5s`Dir@3ipZL+iWUM# zbjVIb#qv>`bIv10D(@J_d5tacSGi^)UYN>mH%E*?NQb|dI)X?=R1r3kZO0Hsx%;eF;@2iajMt^~kipF{o;9&GU+NTfpfZxWbDjsc zKGB02_T5d%j@Z=887-x0>J?6EVB$a&_H(G1531DNAQFs^8jk!zEN}gpMdS41nYk2f zfFYW<2pfGKv7_C+Ki1tEq_iVw26j4so=>6+Z?XqR)0Ax2O&OH>g(xai*!+DSGTVq< zKne$=fG-iEg5VZgA%8Y@O8V(PH96Okv*^8`rgqrY^GUt_=B5&tcqMbiW?7@k4^M`@{y}$-7n}{x z`*+dm#Cgoqw1;V)sH~WyKywPw(i~_t1AkOi-V4W6W$q|DR%xIK*7|Y%P{eL8SUen~q}d_~avb@Q8>_ zh!S&5h=WF?%?Z)ri=PX_>3Lu-e;;7z>T6%tIY??pt%elMmIky|l~Wbo0`}%HzG%P- zkJAT1`^Pz$ zx>t_t9(VWL(}DW~Mv>q-MUD?o+c{Q(n6mbgHkoVuzNhff%!m>hsB{2*(CO}M>Z5tSIrQLlUAc2D-* zWB5ZgR!fHp0&LBR7V-eA+jqr|q~5ajoH;i}-SjtH>@vRFv1z%L% zdfAj*Yc^Vh0F)+SFq`?5!C_mqy-L&B_6Hw~qEY1C1nJcTtc6j!Q+oU zxWHsXTS1scTeRfU>4XE&SKVwj`t)NGG%9snI`8U{4Tk;h87RD;jjhmiy=3aT&iW)^ z@#7}@@bS-KGWt0TquI})Ec@s)@yCy$I#;`H0k_TnUY~M*f%WEk{22f95&q|6Wywsg zO=WZvRd|1S_anfCaAkib9{P&3E!u|S{^2E0E#ZZjCPKZf;4VMCnBXhKIAQ@znm_We z9#7|b#BM%03YduMjW6gaHwfc)^8wm=UGm?TUNGSTapjL*0J0?Yy)je@C{TlC!Pr;u zVlPPeP6#Naq6TW3ENJ;H7I8NrNJS6jAp1ZgkkzsX#j}%h@D%5Z)S=Sgqt8Dr$jR@Y zf9ihvaid03fd8;^CNQvx&(u7u=Oz#-KLCo^1rnEvR3Fd%(2p^Xhj-f|__U1SQtC}G zFis_M$&ta~GyJVhI?cJRN-HFZuO`lVr%~*WJIu51xz^5mqOb3*^NynlTGKk?$wWl@ zX$WP4u|dW-TP&Z+ZKsq7ty$5>pBh^FKLuCzZ}56@n(gpT10SZ3%sh?0gq@(m6ZxP!7{Z^A&km1zjkOO}`xm!56-o=F&>zod+^#g32xWt7DYy)v z8dcH7ZC<;;YE*j&19joYP=?@eiK5(ch0@IFJ3j>dDDA+nylW_m@Cg;pz~zDh0L8-# z0B628x}s}SHt&3rPr65P&H>2Y&|$Hb09WoxdTA@mpZE}L?S|rU0^}P;D%iVK;BUYc ze>4qJuHYvujc>QOr1P(;@>sf&aRE}ys|*l0WwR*t!!+PuS~-`6{gV6|d+mdI7rO;| z$BVNA2ks|wqUhEF^8^^tH304MXC46X6QOqJGo^Xuk}KoToYQF|^kGw|ZP z)1-{yS(>(ar5W@L#;(gL7lj&hfm@M+dvfpa~QoVY&zhUEpH?>F5()T zpYcS8?pe3rI~jh}8{nz4+dlz?Kge}+bS!MQEg7KOgH+-=KdHlJAJIIl9+Q3f=s>cW zdWl{n6Q6blp}D2lJ$j@$>C4YmZ@=x}U>i*Q4T6V1c_1m2|Ii1E_ACj^n0YCRSsLIm zWS*itf?R^WM*);;M}&oZ4g!wV9xR>cg;*E9j6_8C2njR~vHS7hyS?`lw)gSpj~}ZT zgiQ{VXwGmYSD>u7c#6y*Rm34UwVv?V_sUB$b9{dcqi?MlD?@~Zafe@ZZ7YMmP?<{v zzdk+q3IQC#N8=qq$%>bY-dO*nsDGhT_yO5JBgx_%!eiGsXtgCyGY_#Z9EL*kUW4l9 zJ|6rmk58XBQTzf#YMx3lqy066y+hm)@M3Wtz3|5f3bxJ<(Ay)->G2eE#tL7N)O&&U zLNiq8ae&@g-U!>!CPHxe#taRhz1(n9`1Qi z?S;@xo~tIoMGW>Iyv3b%?clOd)3W3^Zd4sNcgpvFI(M%A7*MfMzBxN2oJk1#-8aHJ zZ-)2Y5MSp0%rQIYx62wdD!aZhGoshA>g9^G(QCA?B6+XJ-ul66|0-LYhX>0n&ATpb zlAGK`+kCcf6~04kb&~mL@-SYaCMoghNr{s(ZI-4W#-5-4J=G!aI&S41x^E9VZ9_ld*{cj(d6Gp3O}CC z)6*ANLO!PifxIcUm?O(-9b>3BsMt&0qXJ7>f+W_Kw6QG#OO{(YAf?!WlT00WxxE7o z4SUfq>Plr+pAVh%mpWha@v=7CWt`D@A_oiYD@Kb{Q5)+3wb4*RDqPrw#f$~Yh1RL` zbyB0qNX^qz>SP5MvNPVX8n~M0Hp9>ZdC0u13Ova0qM&QpKr>_3A)L}WqSu~vgzJQy zUxp~rSD7fQTV>R{bd}}2BHE08WGjG*ES*znw1s`?&$27kF0yot(T@E|>J`U1i~Va+ zQa@PMmf=3OsGA~%-UNzVP+FwJ9$UgJZf@%1E-XE|qS`^z%r6X|x|m4nyOWGA$$vw4 z@zNUIMMH%?HS(iqq^3mnGP;Sj5d#xd5o9s|T*3j&^xL9==SwxRo#lOX?LNUs)M72i zelm&!@o=QYOQ94pMqh+(_s`8itM>p_e6{+E@lhsT-?FBv%7eOvHbGF00Vtj&Wk1qX*zW@*xv-x%szSCka7+7T1Uw!6NHI!A;$ zO@q;kL>*aG3+bDOZiY_7?s|^ST)l}mOW^Vxpbe;CwK_N~&%zrblI9<*8s`;|GKUIax<_dEiZQmO zA(O8b2op9(>;kQ3{n0!{-@XA?PAzJ= z&Zu5U>r^bZ1(xf*UVP~e>gZ3oy4i!|gq*UfMn*?MlxVF7C5|EhRKc`UJ1iqdfa9lONn4J|4|VnrsIfy z6zrywSxzbVJY4F9@SkkrShfUyTX;-fFq8yRP|P%{oej=~WVy*Gc5;ZpJkY>+jI(2g z=a{;@ENP*Kyo>G=g)9=QnkIqfC*JOt`^^dw&70Xnlj@0lI$57u?(aoY{!Z)D1n8VL z8>j;lUhxJ%620@u&3a>FgB?fLxHV6`5F{$WRAkd&;-Lj2Pc!Mx(iq#7p|F%?*GS%H zo6qKDFcA@wI;}=>mMM@b0qA02B_i?D1BpXVOih^cu!*2{)&g+YFRO(4 zFB{vnFv1f*^&wxA11MBHLY;a#?hKhlxTNTz6(_uO9ddzg=fX3{*03tPU72;R=g z4Xc^wu6AuyvZje9r$S%Z8<_C}i`^iV1P7?cXPFXdyg^rsF z67_albjQ>hL0X#X(MAZ%wsL%E3R2@`NuP;MTcUpSNUzwH<(mX>t0VOX(PPp?(w6V2 zw4087OWRH82_^SKQPDQZFdkG*+i(c*c-nW^I>+XZ@ohBa$J^*q!Gltsr3DzMrphJjO%#?b^Ir&o#U=LucEu56&u1>(CPL2W!p=i?w^ zTQCzm9nOm|x?xxFZyLd}{av_&&n7;m=NY5(1*gf_bE;>aG=r{`YS>7Un%}kvYQ4@v z=gvx%TA>Z?nyMb3eFLU_oA`6B%3x)L{*9$gjvLf^tAi|8IH&=ZQmeW#&@M_-i7cpP zmpM5B&vEG(nx!c>CsU!BHIzHgE+?u36;ewB)(GS^b~N#*SC~2S&1CPS_o0q95se%@ z8Ds`LS*uPEM*P-}eHY@?Z5*}*u=0L%b0P*&Sqp`P3mcv4N!lbP#AAvNK_MAheq2&O zyg+})>8Xd%s~17k67c)1C>? z0`l_zwX|!L>mES#4A*7r&Uz^sF8?Ec5L|Dp*O~Vi@klb0=Y>O(^nTduof(Ed#_O5+ z!nR<56gUF_h+Fq+ezAC%l-{#L;Kq;cSLaVx7@tzT;i=NTq)o5wWme;{7bX*w!-X5_ z4P^X1>Taz)@PM7g%AxnXI|;mmx@y&`_^bJaJq!%h+X7XZq{(+;ycrj(sv{Q?GfhZT zwFo2{vk9qKRUHelat=AXih9S0Y)EWBp7S91b=)_bkuEo~2VfgN7EHH?9+nU5XKB1! z6q=4|aw&c@BEB5g5&ky>T&n|#Gwo!nO+iTEH>$pcK+sIc3#N4zH&~kec_FY$a;%K? zu%>CNNxkRInt0Ck5STRQT+mDzASo&|EtMKEAiU;;=QCNR(X3cv7_c^Q|14FJ^1HNV z6S3hJdF~&~!x0uV5L~?i)FIO~tYS_(%u<@vBeN|&TRY3@v-8if5@LB=Yt}cUS2$a& ztwnd7>LHr#ZQ6b@S+P<{J83yikLID`*j)vQzJ^p!GktW|9_ef|t_yW)$}$^1G7@9q zd%w}tVMY;k(`;H^0}(69Ekl3lB2|2x#TV(e0$CPIS_F5Y6;*A3XFkk2@GcCl^28B9 zxcQ{1&=O$#lPr1I;S~D6)1AzU&N`*gtsW80Dh4AFImvfy*W!p{5+>8w-i3cT;-*NVn~%+&Bz_{ONvkSBv9xS7#S=R=}1iiIl+ zkJpLrCET8ZTw0AqOr0F+M2;TWR{Mvtov50=Wy~@%IMf?v_mNH$67upc^sg|So1<_6HvCTNi>F^@O(d!0E+7ee=({!s2iGWF7{{LOa~OoKG(RK&^LJ3D*w#2x;4 z)$)@RB8pHHvAM`kxd!$$}B9i*z2BTehn_XFOLJ}mpQB$#A@ z-oyD6L)yAxl)IOc$V=hNqH5IGc=8yXUkX`3re2J%{OobdQkjfA^jvyktK%d&M47pp z%27CKG`gL&eJu2iTo#m2ObzAl65^>D|5-8&YE?QMT9Rrs^CXR?PQ&hWp@#lAuRaad zWM99XMq#Q6tk&KWU{xc150r~Wagvx?(oivySZHk~`IvFgX2~wwYC~OSkr`VlqrEhr zdaPaesP2cj3A(|humlPcH_PT1K*g@$X_F0MA#k3-{}Do`Y{}(52yUyQoWYR<*l~E9 zMqW<-!7*IM0cayzE-4NP&k&eTR*t76(>NKidf^Km #&B&O2<;8K3@L;m|f%(dx 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