pax_global_header00006660000000000000000000000064151761231730014520gustar00rootroot0000000000000052 comment=602118d99d46ca5df71bda60d3df642135417f29 libjwt-3.3.3/000077500000000000000000000000001517612317300130215ustar00rootroot00000000000000libjwt-3.3.3/.github/000077500000000000000000000000001517612317300143615ustar00rootroot00000000000000libjwt-3.3.3/.github/workflows/000077500000000000000000000000001517612317300164165ustar00rootroot00000000000000libjwt-3.3.3/.github/workflows/build-and-test.yml000066400000000000000000000041111517612317300217520ustar00rootroot00000000000000name: LibJWT Build, Unit Tests, and Coverage on: workflow_dispatch: push: branches: [ "master" ] paths-ignore: - "doxygen/**" - ".github/**" - "images/**" - ".gitignore" - "*.md" pull_request: branches: [ "master" ] paths-ignore: - "doxygen/**" - ".github/**" - "images/**" - ".gitignore" - "*.md" permissions: contents: read jobs: build-macos: runs-on: macos-latest steps: - uses: actions/checkout@v4 - uses: ConorMacBride/install-package@v1 with: brew: gnutls openssl@3 jansson pkgconf cmake check curl bats-core jq - name: Build and Test uses: threeal/cmake-action@v2.1.0 with: options: WITH_LIBCURL=YES build-args: | -- all check build-linux: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: ConorMacBride/install-package@v1 with: apt: gnutls-dev libssl-dev libjansson-dev pkg-config check lcov valgrind libcurl4-openssl-dev bats jq - name: Build, Test, and Coverage uses: threeal/cmake-action@v2.1.0 with: options: | ENABLE_COVERAGE=YES WITH_LIBCURL=YES build-args: | -- all check-code-coverage - uses: codecov/codecov-action@v5.1.2 with: token: ${{ secrets.CODECOV_TOKEN }} files: ${{github.workspace}}/build/check-code-coverage.info disable_search: true verbose: true - name: Memcheck working-directory: ${{github.workspace}}/build run: ctest -T memcheck build-linux-json-c: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: ConorMacBride/install-package@v1 with: apt: gnutls-dev libssl-dev libjson-c-dev pkg-config check libcurl4-openssl-dev bats jq - name: Build and Test with json-c uses: threeal/cmake-action@v2.1.0 with: options: | WITH_JSON_C=YES WITH_LIBCURL=YES build-args: | -- all check libjwt-3.3.3/.github/workflows/codeql.yml000066400000000000000000000111751517612317300204150ustar00rootroot00000000000000# For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. # # ******** NOTE ******** # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # name: "CodeQL Advanced" on: push: branches: [ "master" ] pull_request: branches: [ "master" ] schedule: - cron: '40 16 * * 0' jobs: analyze: name: Analyze (${{ matrix.language }}) # Runner size impacts CodeQL analysis time. To learn more, please see: # - https://gh.io/recommended-hardware-resources-for-running-codeql # - https://gh.io/supported-runners-and-hardware-resources # - https://gh.io/using-larger-runners (GitHub.com only) # Consider using larger runners or machines with greater resources for possible analysis time improvements. runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} permissions: # required for all workflows security-events: write # required to fetch internal or private CodeQL packs packages: read # only required for workflows in private repositories actions: read contents: read strategy: fail-fast: false matrix: include: - language: actions build-mode: none - language: c-cpp build-mode: autobuild # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' # Use `c-cpp` to analyze code written in C, C++ or both # Use 'java-kotlin' to analyze code written in Java, Kotlin or both # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - name: Checkout repository uses: actions/checkout@v4 # Add any setup steps before running the `github/codeql-action/init` action. # This includes steps like installing compilers or runtimes (`actions/setup-node` # or others). This is typically only required for manual builds. # - name: Setup runtime (example) # uses: actions/setup-example@v1 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality # If the analyze step fails for one of the languages you are analyzing with # "We were unable to automatically build your code", modify the matrix above # to set the build mode to "manual" for that language. Then modify this step # to build your code. # ℹ️ Command-line programs to run using the OS shell. # πŸ“š See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - name: Run manual build steps if: matrix.build-mode == 'manual' shell: bash run: | echo 'If you are using a "manual" build mode for one or more of the' \ 'languages you are analyzing, replace this with the commands to build' \ 'your code, for example:' echo ' make bootstrap' echo ' make release' exit 1 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4 with: category: "/language:${{matrix.language}}" libjwt-3.3.3/.github/workflows/deploys-docs.yml000066400000000000000000000027411517612317300215520ustar00rootroot00000000000000name: LibJWT Documentation on: workflow_dispatch: push: branches: - "master" tags: - v* paths: - include/jwt.h - doxygen/** - cmake/LibJWTDoxyfile.cmake jobs: build: if: ${{github.ref == 'refs/heads/master'}} permissions: contents: read runs-on: macos-latest steps: - uses: actions/checkout@v4 with: fetch-tags: true fetch-depth: 0 - uses: ConorMacBride/install-package@v1 with: brew: openssl@3 jansson pkgconf cmake doxygen graphviz autoconf automake libtool - name: Build Head docs run: | set -e cmake -B build make -C build doxygen-doc mv build/doxygen-doc/html gh-pages rm -rf build - name: Build v2 release docs run: | set -e git checkout v2.1.1 autoreconf -fi mkdir build cd build ../configure make doxygen-doc cd .. mv build/doxygen-doc/html gh-pages/stable rm -rf build - name: Upload pages id: deployment uses: actions/upload-pages-artifact@v3 with: path: gh-pages/ deploy: permissions: id-token: write pages: write deployments: write environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest needs: build steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 libjwt-3.3.3/.gitignore000066400000000000000000000001031517612317300150030ustar00rootroot00000000000000# Generic ignores for cmake project /build/** /out/** # VIM *.swp libjwt-3.3.3/CLAUDE.md000066400000000000000000000107101517612317300142770ustar00rootroot00000000000000# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview LibJWT is a C library implementing RFC 7515-7519 for JSON Web Tokens (JWT), JSON Web Keys (JWK), and JWK Sets (JWKS). It supports multiple cryptographic backends (OpenSSL, GnuTLS, MBedTLS) and JSON backends (Jansson, json-c). ## Build Commands ```bash # Standard build mkdir build && cd build cmake .. make # Build with options cmake -DWITH_GNUTLS=ON -DWITH_MBEDTLS=ON -DWITH_LIBCURL=ON -DWITH_JSON_C=ON .. # Run all tests make check # Run a single test (from build directory) ctest -R jwt_builder -V # Run tests with valgrind memory checking ctest -T memcheck # Code coverage (must configure with ENABLE_COVERAGE) cmake -DENABLE_COVERAGE=YES .. make check-code-coverage All new code MUST be covered by tests cases. Do not commit ANY code changes without running coverage first, and ensure there are no new missing lines covered. # Build documentation (requires Doxygen >= 1.9.8) # Docs are built automatically if Doxygen is found ``` ## Key CMake Options | Option | Default | Description | |--------|---------|-------------| | `WITH_JSON_C` | OFF | Use json-c instead of Jansson | | `WITH_GNUTLS` | auto-detect | Enable GnuTLS backend | | `WITH_MBEDTLS` | OFF | Enable MBedTLS backend | | `WITH_LIBCURL` | OFF | Enable libcurl for remote JWKS | | `WITH_TESTS` | ON | Build test suite | | `WITH_KCAPI_MD` | OFF | Linux Kernel Crypto API for HMAC | | `ENABLE_COVERAGE` | OFF | LCOV code coverage | | `EXCLUDE_DEPRECATED` | OFF | Exclude deprecated API | ## Architecture ### Abstraction Layers The library has two key abstraction interfaces that allow swapping implementations: 1. **Crypto backend abstraction** (`jwt-crypto-ops.c`, `jwt-private.h:jwt_crypto_ops`): Each crypto provider (OpenSSL, GnuTLS, MBedTLS) implements the `jwt_crypto_ops` struct with function pointers for sign/verify and JWK parsing. OpenSSL is always required (handles JWK parsing); GnuTLS and MBedTLS are optional additional providers. The active provider is selected at runtime via `jwt_set_crypto_ops()`. 2. **JSON backend abstraction** (`jwt-json-ops.h`): Jansson and json-c each implement the same JSON operations interface. Selected at compile time via `WITH_JSON_C`. ### Source Organization - `libjwt/` β€” Core library source - `jwt.c` β€” Main JWT creation, parsing, and lifecycle - `jwt-common.c` β€” Shared builder/checker logic (compiled twice with `-DJWT_BUILDER` and `-DJWT_CHECKER` preprocessor flags via custom CMake commands) - `jwt-setget.c` β€” Claims get/set operations using `jwt_value_t` - `jwt-verify.c` β€” JWT signature verification - `jwt-encode.c` β€” JWT encoding/signing - `jwks.c` β€” JWK/JWKS parsing and management - `jwt-private.h` β€” Internal structures (`jwt`, `jwk_set`, `jwk_item`, `jwt_crypto_ops`) - `openssl/`, `gnutls/`, `mbedtls/` β€” Crypto backend implementations - `jansson/`, `json-c/` β€” JSON backend implementations - `include/jwt.h` β€” Complete public API (the only public header) - `tools/` β€” CLI utilities: `jwt-generate`, `jwt-verify`, `jwk2key`, `key2jwk` - `tests/` β€” Check framework unit tests and BATS integration tests ### Key Patterns - **Memory management**: Custom allocators (`jwt_malloc`, `__jwt_freemem`) with GCC `__attribute__((cleanup()))` auto-cleanup via `jwt_auto_t`, `jwt_builder_auto_t`, `jwt_checker_auto_t`, `jwt_json_auto_t` typedefs. - **Error handling**: Objects carry `error` flag and `error_msg[256]` buffer. Use `jwt_write_error()` macro for consistent error reporting. - **Builder/Checker pattern**: `jwt_builder_t` creates tokens, `jwt_checker_t` verifies them. Both share `jwt_common` struct internals. Support callback-based claim generation/verification. - **Linked list**: Internal `ll.h` provides a doubly-linked list for JWK sets. ## Testing Tests use the [Check](https://libcheck.github.io/check/) C unit testing framework. Each test file defines a `libjwt_suite()` function and uses the `JWT_TEST_MAIN()` macro. - Tests iterate over all compiled crypto providers using the `jwt_test_ops[]` array and `SET_OPS()` macro via Check's loop tests (`_i` index variable). - Test keys are in `tests/keys/` β€” referenced via the `KEYDIR` compile-time macro. - A constant timestamp `TS_CONST` (1475980545L) is used for reproducible time-based tests. - BATS tests in `tests/jwt-cli.bats` cover the CLI tools. ## Compiler Flags The project compiles with `-Wall -Werror -Wextra -Wunused`. All warnings are errors. libjwt-3.3.3/CMakeLists.txt000066400000000000000000000254441517612317300155720ustar00rootroot00000000000000# Copyright (C) 2015-2025 maClara, LLC # This file is part of the JWT C Library # # SPDX-License-Identifier: MPL-2.0 # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. cmake_minimum_required (VERSION 3.7...3.15) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(LibJWTVersions) project(${LIBJWT_PROJECT} VERSION ${LIBJWT_VERSION} DESCRIPTION ${LIBJWT_DESCRIPTION} HOMEPAGE_URL ${LIBJWT_HOMEPAGE_URL} LANGUAGES C) set(MEMORYCHECK_COMMAND_OPTIONS "-q --tool=memcheck --leak-check=yes --num-callers=50 --trace-children=yes --leak-check=full --track-origins=yes --gen-suppressions=all") set(CMAKE_POSITION_INDEPENDENT_CODE ON) add_compile_options(-Wall -Werror -Wextra -Wunused) # Must be set after the above include(GNUInstallDirs) # Find all the things we need for the library find_package(PkgConfig REQUIRED) option(WITH_JSON_C "Whether to use json-c instead of jansson (default is OFF)" OFF) if (WITH_JSON_C) pkg_check_modules(JSONC json-c>=0.16 REQUIRED IMPORTED_TARGET) else() pkg_check_modules(JANSSON jansson>=2.0 REQUIRED IMPORTED_TARGET) endif() if (NOT DEFINED WITH_GNUTLS) set(GNUTLS_AUTO TRUE) endif() option(WITH_GNUTLS "Whether to use GnuTLS (default is auto detect)" ON) option(WITH_MBEDTLS "Whether to use mbedTLS (default is OFF)" OFF) option(WITH_LIBCURL "Whether to include CUrl for retrieving JWKS (default is OFF)" OFF) option(WITH_TESTS "Whether to build and run the testsuite (default is ON)" ON) option(WITH_KCAPI_MD "Whether to use the Linux Kernel Crypto API to offload hmac (default OFF)" OFF) # Optional if (WITH_GNUTLS) if (NOT GNUTLS_AUTO) set(GNUTLS_REQUIRED REQUIRED) endif() pkg_check_modules(GNUTLS gnutls>=3.6.0 IMPORTED_TARGET ${GNUTLS_REQUIRED}) endif() if (WITH_MBEDTLS) pkg_check_modules(MBEDTLS mbedcrypto>=3.6.0 IMPORTED_TARGET REQUIRED) endif() if (WITH_LIBCURL) pkg_check_modules(LIBCURL libcurl>=7.8.8 IMPORTED_TARGET REQUIRED) endif() if (WITH_KCAPI_MD) find_library(HAVE_KCAPI kcapi REQUIRED) endif() # Required pkg_check_modules(OPENSSL openssl>=3.0.0 IMPORTED_TARGET REQUIRED) add_library(jwt SHARED) add_library(jwt_static STATIC) set_target_properties(jwt_static PROPERTIES OUTPUT_NAME jwt COMPILE_FLAGS -DJWT_STATIC_DEFINE) if (HAVE_KCAPI) target_link_libraries(jwt PRIVATE kcapi) target_link_libraries(jwt_static PRIVATE kcapi) add_definitions(-DUSE_KCAPI_MD) endif() add_custom_command( OUTPUT jwt-builder.i COMMAND bash -c "${CMAKE_C_COMPILER} -E -DJWT_BUILDER ${CMAKE_SOURCE_DIR}/libjwt/jwt-common.c -o jwt-builder.i ${CMAKE_C_FLAGS}" -o jwt-builder.i DEPENDS libjwt/jwt-common.c) add_custom_command( OUTPUT jwt-checker.i COMMAND bash -c "${CMAKE_C_COMPILER} -E -DJWT_CHECKER ${CMAKE_SOURCE_DIR}/libjwt/jwt-common.c -o jwt-checker.i ${CMAKE_C_FLAGS}" -o jwt-checker.i DEPENDS libjwt/jwt-common.c) add_custom_target(gen_jwt_builder ALL DEPENDS jwt-builder.i) add_custom_target(gen_jwt_checker ALL DEPENDS jwt-checker.i) add_dependencies(jwt gen_jwt_builder gen_jwt_checker) add_dependencies(jwt_static gen_jwt_builder gen_jwt_checker) set(JWT_SOURCES libjwt/jwt-memory.c libjwt/jwt.c libjwt/jwks.c libjwt/jwt-setget.c libjwt/jwt-crypto-ops.c libjwt/jwt-encode.c libjwt/jwt-verify.c libjwt/jwt-builder.c libjwt/jwt-checker.c libjwt/jwks-curl.c) # Allow building without deprecated functions (suggested) option(EXCLUDE_DEPRECATED "Exclude deprecated parts of the library (default included)" FALSE) if (EXCLUDE_DEPRECATED) set(NO_BUILD_DEPRECATED DEFINE_NO_DEPRECATED) endif() # Must come after the above so headers are available include(GenerateExportHeader) generate_export_header(jwt ${NO_BUILD_DEPRECATED}) include_directories(${CMAKE_SOURCE_DIR}/include ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/libjwt) if (WITH_JSON_C) add_definitions(-DHAVE_JSON_C) target_link_libraries(jwt PUBLIC PkgConfig::JSONC) target_link_libraries(jwt_static PUBLIC PkgConfig::JSONC) list(APPEND JWT_SOURCES libjwt/json-c/jwt-json-c.c) else() target_link_libraries(jwt PUBLIC PkgConfig::JANSSON) target_link_libraries(jwt_static PUBLIC PkgConfig::JANSSON) list(APPEND JWT_SOURCES libjwt/jansson/jwt-jansson.c) endif() # Process the detected packages set(HAVE_CRYPTO FALSE) if (GNUTLS_FOUND) set(HAVE_CRYPTO TRUE) add_definitions(-DHAVE_GNUTLS) target_link_libraries(jwt PUBLIC PkgConfig::GNUTLS) target_link_libraries(jwt_static PUBLIC PkgConfig::GNUTLS) list(APPEND JWT_SOURCES libjwt/gnutls/sign-verify.c) endif() if (MBEDTLS_FOUND) set(HAVE_CRYPTO TRUE) add_definitions(-DHAVE_MBEDTLS) target_link_libraries(jwt PUBLIC PkgConfig::MBEDTLS) target_link_libraries(jwt_static PUBLIC PkgConfig::MBEDTLS) list(APPEND JWT_SOURCES libjwt/mbedtls/sign-verify.c) endif() set(HAVE_CRYPTO TRUE) add_definitions(-DHAVE_OPENSSL) target_link_libraries(jwt PUBLIC PkgConfig::OPENSSL) target_link_libraries(jwt_static PUBLIC PkgConfig::OPENSSL) list(APPEND JWT_SOURCES libjwt/openssl/jwk-parse.c libjwt/openssl/sign-verify.c) if (LIBCURL_FOUND) add_definitions(-DHAVE_LIBCURL) target_link_libraries(jwt PUBLIC PkgConfig::LIBCURL) target_link_libraries(jwt_static PUBLIC PkgConfig::LIBCURL) endif() set(TOOLS) function(jwt_add_tool) set(oneValueArgs NAME SRC DIR) cmake_parse_arguments(Tool "" "${oneValueArgs}" "" ${ARGN}) list(APPEND TOOLS ${Tool_NAME}) add_executable(${Tool_NAME} ${Tool_SRC}) target_link_libraries(${Tool_NAME} PRIVATE jwt_static PkgConfig::OPENSSL) # target_link_libraries(${Tool_NAME} PRIVATE jwt) set_target_properties(${Tool_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tools" COMPILE_FLAGS -DJWT_STATIC_DEFINE) install(TARGETS ${Tool_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endfunction() jwt_add_tool(NAME jwt-verify SRC tools/jwt-verify.c) jwt_add_tool(NAME jwt-generate SRC tools/jwt-generate.c) jwt_add_tool(NAME jwk2key SRC tools/jwk2key.c) jwt_add_tool(NAME key2jwk SRC tools/key2jwk.c) install(DIRECTORY ${CMAKE_SOURCE_DIR}/tools/ DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 FILES_MATCHING PATTERN "*.1") # We need one of the things above to even work if (NOT HAVE_CRYPTO) message(FATAL_ERROR "No crypto support detected") endif() target_sources(jwt PRIVATE ${JWT_SOURCES}) target_sources(jwt_static PRIVATE ${JWT_SOURCES}) target_include_directories(jwt PUBLIC $ $ ) # Define versioning for the library (comes from configure.ac) set_target_properties(jwt PROPERTIES VERSION ${LIBJWT_VERSION_INFO} SOVERSION ${LIBJWT_COMPATVERSION} ) add_definitions(-D_GNU_SOURCE -DKEYDIR=\"${CMAKE_SOURCE_DIR}/tests/keys\") # Install header install(FILES include/jwt.h ${CMAKE_BINARY_DIR}/jwt_export.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) install(FILES LICENSE README.md DESTINATION ${CMAKE_INSTALL_DOCDIR}) # Install library install(TARGETS jwt EXPORT ${LIBJWT_PROJECT}Targets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) # Install Static library install(TARGETS jwt_static EXPORT ${LIBJWT_PROJECT}StaticTargets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) # For cmake users install(EXPORT ${LIBJWT_PROJECT}Targets FILE ${LIBJWT_PROJECT}Config.cmake NAMESPACE ${LIBJWT_PROJECT}:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${LIBJWT_PROJECT} ) # For pkg-config users unset(LIBJWT_LDFLAGS) if (WITH_JSON_C) set(_JSON_LDFLAGS ${JSONC_LDFLAGS}) else() set(_JSON_LDFLAGS ${JANSSON_LDFLAGS}) endif() foreach (FLAG ${_JSON_LDFLAGS} ${OPENSSL_LDFLAGS} ${GNUTLS_LDFLAGS} ${MBEDTLS_LDFLAGS} ${LIBCURL_LDFLAGS}) string(APPEND LIBJWT_LDFLAGS " " ${FLAG}) endforeach() configure_file(libjwt/libjwt.pc.in libjwt.pc @ONLY) install(FILES ${CMAKE_BINARY_DIR}/libjwt.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) find_package(Doxygen 1.9.8) if (DOXYGEN_FOUND) set(DOXYGEN_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/doxygen-doc) include(LibJWTDoxyfile) doxygen_add_docs(doxygen-doc ALL include/jwt.h) install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doxygen-doc/man/man3/ DESTINATION ${CMAKE_INSTALL_MANDIR}/man3 FILES_MATCHING PATTERN "man3/JW*.3" PATTERN "man3/jw*.3") install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doxygen-doc/html/ DESTINATION ${CMAKE_INSTALL_DOCDIR}/html/) endif() option(ENABLE_COVERAGE "Enable code coverage rules" OFF) # Tests and coverage depend on this, but optional if (WITH_TESTS) if (ENABLE_COVERAGE) set(CHECK_REQUIRED REQUIRED) endif() pkg_check_modules(CHECK check>=0.9.10 IMPORTED_TARGET ${CHECK_REQUIRED}) find_program (BATS_CMD bats) else() if (ENABLE_COVERAGE) message(SEND_ERROR "You must set WITH_TESTS=ON to enable code coverage") endif() endif() function(jwt_add_test) set(oneValueArgs NAME) cmake_parse_arguments(LibTest "" "${oneValueArgs}" "" ${ARGN}) add_executable(${LibTest_NAME} tests/${LibTest_NAME}.c) target_link_libraries(${LibTest_NAME} PRIVATE jwt) set_target_properties(${LibTest_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/tests) target_link_libraries(${LibTest_NAME} PRIVATE PkgConfig::CHECK) add_test(NAME ${LibTest_NAME} COMMAND /bin/bash -c "export TEST=${LibTest_NAME}; . ${CMAKE_SOURCE_DIR}/tests/test-env.sh; exec ${CMAKE_BINARY_DIR}/tests/${LibTest_NAME}") endfunction() if (CHECK_FOUND) include(CTest) set (UNIT_TESTS jwt_crypto) # JWKS Tests list (APPEND UNIT_TESTS jwt_jwks jwt_jwks_errors jwt_ec jwt_rsa jwt_hs) # Checker and Builder list (APPEND UNIT_TESTS jwt_builder jwt_checker jwt_flipflop) # Claims list (APPEND UNIT_TESTS jwt_claims) # Security list (APPEND UNIT_TESTS jwt_security) foreach (TEST ${UNIT_TESTS}) jwt_add_test(NAME ${TEST}) endforeach() if (BATS_CMD) add_test(NAME jwt_cli COMMAND /bin/bash -c "export SRCDIR=\"${CMAKE_SOURCE_DIR}\"; \"${CMAKE_SOURCE_DIR}\"/tests/jwt-cli.bats") endif() add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} DEPENDS ${UNIT_TESTS} ${TOOLS}) if (ENABLE_COVERAGE) set(CMAKE_BUILD_TYPE "Debug") include(CodeCoverage) append_coverage_compiler_flags() set(COVERAGE_LCOV_INCLUDES "${CMAKE_SOURCE_DIR}/libjwt/") setup_target_for_coverage_lcov( NAME check-code-coverage OUTPUT "${PROJECT_NAME}-${PROJECT_VERSION}-coverage" TITLE "${PROJECT_NAME}-${PROJECT_VERSION} Code Coverage" EXECUTABLE ctest -j ${PROCESSOR_COUNT} DEPENDENCIES ${UNIT_TESTS} ${TOOLS}) endif() elseif(ENABLE_COVERAGE) message(SEND_ERROR "Coverage enabled, but did not find check library") endif() if (NOT ENABLE_COVERAGE) add_custom_target(check-code-coverage COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "Coverage needs to be enabled for this target (ENABLE_COVERAGE=YES)" VERBATIM) endif() set(CPACK_PROPERTIES_FILE "${CMAKE_SOURCE_DIR}/cmake/CPackConfig.cmake") include(CPack) libjwt-3.3.3/LICENSE000066400000000000000000000405261517612317300140350ustar00rootroot00000000000000Mozilla Public License Version 2.0 ================================== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. 1.5. "Incompatible With Secondary Licenses" means (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. 1.6. "Executable Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. 1.10. "Modifications" means any of the following: (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or (b) any new file in Source Code Form that contains any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. 1.13. "Source Code Form" means the form of the work preferred for making modifications. 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants and Conditions -------------------------------- 2.1. Grants Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. 2.2. Effective Date The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. 2.3. Limitations on Grant Scope The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: (a) for any code that a Contributor has removed from Covered Software; or (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). 2.4. Subsequent Licenses No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). 2.5. Representation Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. 2.6. Fair Use This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. 2.7. Conditions Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. 3. Responsibilities ------------------- 3.1. Distribution of Source Form All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. 3.2. Distribution of Executable Form If You distribute Covered Software in Executable Form then: (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. 3.3. Distribution of a Larger Work You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). 3.4. Notices You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. 3.5. Application of Additional Terms You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. 4. Inability to Comply Due to Statute or Regulation --------------------------------------------------- If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Termination -------------- 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. ************************************************************************ * * * 6. Disclaimer of Warranty * * ------------------------- * * * * Covered Software is provided under this License on an "as is" * * basis, without warranty of any kind, either expressed, implied, or * * statutory, including, without limitation, warranties that the * * Covered Software is free of defects, merchantable, fit for a * * particular purpose or non-infringing. The entire risk as to the * * quality and performance of the Covered Software is with You. * * Should any Covered Software prove defective in any respect, You * * (not any Contributor) assume the cost of any necessary servicing, * * repair, or correction. This disclaimer of warranty constitutes an * * essential part of this License. No use of any Covered Software is * * authorized under this License except under this disclaimer. * * * ************************************************************************ ************************************************************************ * * * 7. Limitation of Liability * * -------------------------- * * * * Under no circumstances and under no legal theory, whether tort * * (including negligence), contract, or otherwise, shall any * * Contributor, or anyone who distributes Covered Software as * * permitted above, be liable to You for any direct, indirect, * * special, incidental, or consequential damages of any character * * including, without limitation, damages for lost profits, loss of * * goodwill, work stoppage, computer failure or malfunction, or any * * and all other commercial damages or losses, even if such party * * shall have been informed of the possibility of such damages. This * * limitation of liability shall not apply to liability for death or * * personal injury resulting from such party's negligence to the * * extent applicable law prohibits such limitation. Some * * jurisdictions do not allow the exclusion or limitation of * * incidental or consequential damages, so this exclusion and * * limitation may not apply to You. * * * ************************************************************************ 8. Litigation ------------- Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. 9. Miscellaneous ---------------- This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. 10. Versions of the License --------------------------- 10.1. New Versions Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. 10.2. Effect of New Versions You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. 10.3. Modified Versions If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice ------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" Notice --------------------------------------------------------- This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. libjwt-3.3.3/README.md000066400000000000000000000064431517612317300143070ustar00rootroot00000000000000![LibJWT - The C JWT Library](images/LibJWT-800x152.png) --- [![codecov](https://codecov.io/gh/benmcollins/libjwt/graph/badge.svg?token=MhCaZ8cpwQ)](https://codecov.io/gh/benmcollins/libjwt) [![maClara](https://img.shields.io/badge/Sponsored%20by-maClara%2C%20LLC-blue?style=plastic&logoColor=blue)](https://maclara-llc.com) > [!WARNING] > Version 3 of LibJWT is a complete overhaul of the code. Please see documentation for usage. ## :bulb: Supported Standards Standard | RFC | Description -------- | :------------------------------------------------------------------------: | ---------------------- ``JWS`` | :page_facing_up: [RFC-7515](https://datatracker.ietf.org/doc/html/rfc7515) | JSON Web Signature ``JWE`` | :page_facing_up: [RFC-7516](https://datatracker.ietf.org/doc/html/rfc7516) | JSON Web Encryption ``JWK`` | :page_facing_up: [RFC-7517](https://datatracker.ietf.org/doc/html/rfc7517) | JSON Web Keys and Sets ``JWA`` | :page_facing_up: [RFC-7518](https://datatracker.ietf.org/doc/html/rfc7518) | JSON Web Algorithms ``JWT`` | :page_facing_up: [RFC-7519](https://datatracker.ietf.org/doc/html/rfc7519) | JSON Web Token > [!NOTE] > Throughout this documentation you will see links such as the ones > above to RFC documents. These are relevant to that particular part of the > library and are helpful to understand some of the specific standards that > shaped the development of LibJWT. ## :construction: Build Prerequisites ### Required - [JANSSON](https://github.com/akheron/jansson) (>= 2.0) - [CMake](https://cmake.org) (>= 3.7) ### Crypto support - OpenSSL (>= 3.0.0) - GnuTLS (>= 3.6.0) - MbedTLS (>= 3.6.0) > [!NOTE] > OpenSSL is required and used for JWK(S) operations. ### Algorithm support matrix JWS Algorithm ``alg`` | OpenSSL | GnuTLS | MbedTLS :---------------------------- | :----------------- | :----------------- | :---------------------- ``HS256`` ``HS384`` ``HS512`` | :white_check_mark: | :white_check_mark: | :white_check_mark: ``ES256`` ``ES384`` ``ES512`` | :white_check_mark: | :white_check_mark: | :white_check_mark: ``RS256`` ``RS384`` ``RS512`` | :white_check_mark: | :white_check_mark: | :white_check_mark: ``EdDSA`` using ``ED25519`` | :white_check_mark: | :white_check_mark: | :x: ``EdDSA`` using ``ED448`` | :white_check_mark: | :white_check_mark: ``>= 3.8.8`` | :x: ``PS256`` ``PS384`` ``PS512`` | :white_check_mark: | :white_check_mark: | :white_check_mark:``*`` ``ES256K`` | :white_check_mark: | :x: | :white_check_mark: ``*`` RSASSA-PSS support in MbedTLS depends on Mbed-TLS/TF-PSA-Crypto#154 ### Optional - [Check Library](https://github.com/libcheck/check/issues) (>= 0.9.10) for unit testing - [Doxygen](https://www.doxygen.nl) (>= 1.13.0) for documentation ## :books: Docs and Source :link: [Current Docs](https://libjwt.io) :link: [Legacy Docs v2.1.1](https://libjwt.io/stable) :link: [GitHub Repo](https://github.com/benmcollins/libjwt) ## :package: Pre-built Packages LibJWT is available in most Linux distributions as well as through [Homebrew](https://formulae.brew.sh/formula/libjwt#default) for Linux, macOS, and Windows. ## :hammer: Build Instructions ### With CMake: $ mkdir build $ cd build $ cmake .. $ make libjwt-3.3.3/SECURITY.md000066400000000000000000000015271517612317300146170ustar00rootroot00000000000000# Security Policy ## Supported Versions | Version | Supported | | ------- | ------------------ | | 3.3.x | :white_check_mark: | | 2.1.x | :white_check_mark: | | < 2.1.1 | :x: | ## Reporting a Vulnerability **DO NOT** create a public GitHub issue for security vulnerabilities. Instead, please report it via the following channels: 1. **Email:** bcollins@libjwt.io (Encrypted PGP preferred) 2. **GitHub Private Report:** Use the "Private Security Report" feature on this repository. ## What to Include - Description of the vulnerability. - Steps to reproduce the issue. - Impact assessment (e.g., "Creates weak tokens"). - Suggested fix (optional). ## Response Timeline - **Acknowledgement:** Within 48 hours. - **Resolution:** Within 7 days for critical issues. - **Disclosure:** Public advisory after the fix is released. libjwt-3.3.3/cmake/000077500000000000000000000000001517612317300141015ustar00rootroot00000000000000libjwt-3.3.3/cmake/CPackConfig.cmake000066400000000000000000000022451517612317300172150ustar00rootroot00000000000000# This file will be configured to contain variables for CPack. These variables # should be set in the CMake list file of the project before CPack module is # included. The list of available CPACK_xxx variables and their associated # documentation may be obtained using # cpack --help-variable-list # # Some variables are common to all generators (e.g. CPACK_PACKAGE_NAME) # and some are specific to a generator # (e.g. CPACK_NSIS_EXTRA_INSTALL_COMMANDS). The generator specific variables # usually begin with CPACK__xxxx. set(CPACK_BINARY_TBZ2 "OFF") set(CPACK_BINARY_DEB "ON") set(CPACK_GENERATOR "TXZ") set(CPACK_PACKAGE_VENDOR "maClara, LLC") set(CPACK_SOURCE_GENERATOR "TXZ") set(CPACK_SOURCE_TBZ2 "ON") set(CPACK_SET_DESTDIR "ON") set(CPACK_PACKAGE_CONTACT "Ben Collins ") set(CPACK_IGNORE_FILES "/\\.git/" "\\.gitignore" "\\.github/" "\\.swp\$" "\\.DS_Store") string(TOLOWER ${CPACK_PACKAGE_NAME} CPACK_PACKAGE_NAME) if (NOT ${CPACK_SOURCE_PACKAGE_FILE_NAME} EQUAL "") set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") else() set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-binary") endif() libjwt-3.3.3/cmake/CodeCoverage.cmake000066400000000000000000000765171517612317300174510ustar00rootroot00000000000000# Copyright (c) 2012 - 2017, Lars Bilke # All rights reserved. # # Redistribution and use in source and binary forms, with or without modification, # are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # CHANGES: # # 2012-01-31, Lars Bilke # - Enable Code Coverage # # 2013-09-17, Joakim SΓΆderberg # - Added support for Clang. # - Some additional usage instructions. # # 2016-02-03, Lars Bilke # - Refactored functions to use named parameters # # 2017-06-02, Lars Bilke # - Merged with modified version from github.com/ufz/ogs # # 2019-05-06, Anatolii Kurotych # - Remove unnecessary --coverage flag # # 2019-12-13, FeRD (Frank Dana) # - Deprecate COVERAGE_LCOVR_EXCLUDES and COVERAGE_GCOVR_EXCLUDES lists in favor # of tool-agnostic COVERAGE_EXCLUDES variable, or EXCLUDE setup arguments. # - CMake 3.4+: All excludes can be specified relative to BASE_DIRECTORY # - All setup functions: accept BASE_DIRECTORY, EXCLUDE list # - Set lcov basedir with -b argument # - Add automatic --demangle-cpp in lcovr, if 'c++filt' is available (can be # overridden with NO_DEMANGLE option in setup_target_for_coverage_lcovr().) # - Delete output dir, .info file on 'make clean' # - Remove Python detection, since version mismatches will break gcovr # - Minor cleanup (lowercase function names, update examples...) # # 2019-12-19, FeRD (Frank Dana) # - Rename Lcov outputs, make filtered file canonical, fix cleanup for targets # # 2020-01-19, Bob Apthorpe # - Added gfortran support # # 2020-02-17, FeRD (Frank Dana) # - Make all add_custom_target()s VERBATIM to auto-escape wildcard characters # in EXCLUDEs, and remove manual escaping from gcovr targets # # 2021-01-19, Robin Mueller # - Add CODE_COVERAGE_VERBOSE option which will allow to print out commands which are run # - Added the option for users to set the GCOVR_ADDITIONAL_ARGS variable to supply additional # flags to the gcovr command # # 2020-05-04, Mihchael Davis # - Add -fprofile-abs-path to make gcno files contain absolute paths # - Fix BASE_DIRECTORY not working when defined # - Change BYPRODUCT from folder to index.html to stop ninja from complaining about double defines # # 2021-05-10, Martin Stump # - Check if the generator is multi-config before warning about non-Debug builds # # 2022-02-22, Marko Wehle # - Change gcovr output from -o for --xml and --html output respectively. # This will allow for Multiple Output Formats at the same time by making use of GCOVR_ADDITIONAL_ARGS, e.g. GCOVR_ADDITIONAL_ARGS "--txt". # # 2022-09-28, Sebastian Mueller # - fix append_coverage_compiler_flags_to_target to correctly add flags # - replace "-fprofile-arcs -ftest-coverage" with "--coverage" (equivalent) # # USAGE: # # 1. Copy this file into your cmake modules path. # # 2. Add the following line to your CMakeLists.txt (best inside an if-condition # using a CMake option() to enable it just optionally): # include(CodeCoverage) # # 3. Append necessary compiler flags for all supported source files: # append_coverage_compiler_flags() # Or for specific target: # append_coverage_compiler_flags_to_target(YOUR_TARGET_NAME) # # 3.a (OPTIONAL) Set appropriate optimization flags, e.g. -O0, -O1 or -Og # # 4. If you need to exclude additional directories from the report, specify them # using full paths in the COVERAGE_EXCLUDES variable before calling # setup_target_for_coverage_*(). # Example: # set(COVERAGE_EXCLUDES # '${PROJECT_SOURCE_DIR}/src/dir1/*' # '/path/to/my/src/dir2/*') # Or, use the EXCLUDE argument to setup_target_for_coverage_*(). # Example: # setup_target_for_coverage_lcov( # NAME coverage # EXECUTABLE testrunner # EXCLUDE "${PROJECT_SOURCE_DIR}/src/dir1/*" "/path/to/my/src/dir2/*") # # 4.a NOTE: With CMake 3.4+, COVERAGE_EXCLUDES or EXCLUDE can also be set # relative to the BASE_DIRECTORY (default: PROJECT_SOURCE_DIR) # Example: # set(COVERAGE_EXCLUDES "dir1/*") # setup_target_for_coverage_gcovr_html( # NAME coverage # EXECUTABLE testrunner # BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/src" # EXCLUDE "dir2/*") # # 5. Use the functions described below to create a custom make target which # runs your test executable and produces a code coverage report. # # 6. Build a Debug build: # cmake -DCMAKE_BUILD_TYPE=Debug .. # make # make my_coverage_target # include(CMakeParseArguments) option(CODE_COVERAGE_VERBOSE "Verbose information" FALSE) # Check prereqs find_program( GCOV_PATH gcov ) find_program( LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl) find_program( FASTCOV_PATH NAMES fastcov fastcov.py ) find_program( GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat ) find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test) find_program( CPPFILT_PATH NAMES c++filt ) if(NOT GCOV_PATH) message(FATAL_ERROR "gcov not found! Aborting...") endif() # NOT GCOV_PATH # Check supported compiler (Clang, GNU and Flang) get_property(LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) foreach(LANG ${LANGUAGES}) if("${CMAKE_${LANG}_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang") if("${CMAKE_${LANG}_COMPILER_VERSION}" VERSION_LESS 3) message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...") endif() elseif(NOT "${CMAKE_${LANG}_COMPILER_ID}" MATCHES "GNU" AND NOT "${CMAKE_${LANG}_COMPILER_ID}" MATCHES "(LLVM)?[Ff]lang") message(FATAL_ERROR "Compiler is not GNU or Flang! Aborting...") endif() endforeach() set(COVERAGE_COMPILER_FLAGS "-g --coverage" CACHE INTERNAL "") if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)") include(CheckCXXCompilerFlag) check_cxx_compiler_flag(-fprofile-abs-path HAVE_cxx_fprofile_abs_path) if(HAVE_cxx_fprofile_abs_path) set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path") endif() endif() if(CMAKE_C_COMPILER_ID MATCHES "(GNU|Clang)") include(CheckCCompilerFlag) check_c_compiler_flag(-fprofile-abs-path HAVE_c_fprofile_abs_path) if(HAVE_c_fprofile_abs_path) set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path") endif() endif() set(CMAKE_Fortran_FLAGS_COVERAGE ${COVERAGE_COMPILER_FLAGS} CACHE STRING "Flags used by the Fortran compiler during coverage builds." FORCE ) set(CMAKE_CXX_FLAGS_COVERAGE ${COVERAGE_COMPILER_FLAGS} CACHE STRING "Flags used by the C++ compiler during coverage builds." FORCE ) set(CMAKE_C_FLAGS_COVERAGE ${COVERAGE_COMPILER_FLAGS} CACHE STRING "Flags used by the C compiler during coverage builds." FORCE ) set(CMAKE_EXE_LINKER_FLAGS_COVERAGE "" CACHE STRING "Flags used for linking binaries during coverage builds." FORCE ) set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE "" CACHE STRING "Flags used by the shared libraries linker during coverage builds." FORCE ) mark_as_advanced( CMAKE_Fortran_FLAGS_COVERAGE CMAKE_CXX_FLAGS_COVERAGE CMAKE_C_FLAGS_COVERAGE CMAKE_EXE_LINKER_FLAGS_COVERAGE CMAKE_SHARED_LINKER_FLAGS_COVERAGE ) get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG)) message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading") endif() # NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG) if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") link_libraries(gcov) endif() # Defines a target for running and collection code coverage information # Builds dependencies, runs the given executable and outputs reports. # NOTE! The executable should always have a ZERO as exit code otherwise # the coverage generation will not complete. # # setup_target_for_coverage_lcov( # NAME testrunner_coverage # New target name # EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR # DEPENDENCIES testrunner # Dependencies to build first # BASE_DIRECTORY "../" # Base directory for report # # (defaults to PROJECT_SOURCE_DIR) # EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative # # to BASE_DIRECTORY, with CMake 3.4+) # NO_DEMANGLE # Don't demangle C++ symbols # # even if c++filt is found # ) function(setup_target_for_coverage_lcov) set(options NO_DEMANGLE SONARQUBE) set(oneValueArgs BASE_DIRECTORY NAME OUTPUT TITLE) set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES LCOV_ARGS GENHTML_ARGS) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT LCOV_PATH) message(FATAL_ERROR "lcov not found! Aborting...") endif() # NOT LCOV_PATH if(NOT GENHTML_PATH) message(FATAL_ERROR "genhtml not found! Aborting...") endif() # NOT GENHTML_PATH # Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR if(DEFINED Coverage_BASE_DIRECTORY) get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE) else() set(BASEDIR ${PROJECT_SOURCE_DIR}) endif() # Collect excludes (CMake 3.4+: Also compute absolute paths) set(LCOV_EXCLUDES "") foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_LCOV_EXCLUDES}) if(CMAKE_VERSION VERSION_GREATER 3.4) get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR}) endif() list(APPEND LCOV_EXCLUDES "${EXCLUDE}") endforeach() list(REMOVE_DUPLICATES LCOV_EXCLUDES) set(LCOV_INCLUDES "") foreach(INCLUDE ${COVERAGE_LCOV_INCLUDES}) if(CMAKE_VERSION VERSION_GREATER 3.4) get_filename_component(INCLUDE ${INCLUDE} ABSOLUTE BASE_DIR ${BASEDIR}) endif() list(APPEND LCOV_INCLUDES "${INCLUDE}") endforeach() list(REMOVE_DUPLICATES LCOV_INCLUDES) # Conditional arguments if(CPPFILT_PATH AND NOT ${Coverage_NO_DEMANGLE}) set(GENHTML_EXTRA_ARGS "--demangle-cpp") endif() # Setting up commands which will be run to generate coverage data. # Cleanup lcov set(LCOV_CLEAN_CMD ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -directory . -b ${BASEDIR} --zerocounters ) # Create baseline to make sure untouched files show up in the report set(LCOV_BASELINE_CMD ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -c -i -d . -b ${BASEDIR} -o ${Coverage_NAME}.base ) # Run tests set(LCOV_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS} ) # Capturing lcov counters and generating report set(LCOV_CAPTURE_CMD ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --directory . -b ${BASEDIR} --capture --output-file ${Coverage_NAME}.capture ) # add baseline counters set(LCOV_BASELINE_COUNT_CMD ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -a ${Coverage_NAME}.base -a ${Coverage_NAME}.capture --output-file ${Coverage_NAME}.total ) # filter collected data to final coverage report set(LCOV_FILTER_CMD ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --remove ${Coverage_NAME}.total ${LCOV_EXCLUDES} --output-file ${Coverage_NAME}.lcov1 ) set(LCOV_EXTRACT_CMD ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --extract ${Coverage_NAME}.lcov1 ${LCOV_INCLUDES} --output-file ${Coverage_NAME}.info ) # Generate HTML output set(LCOV_GEN_HTML_CMD ${GENHTML_PATH} ${GENHTML_EXTRA_ARGS} ${Coverage_GENHTML_ARGS} -o ${Coverage_OUTPUT} --title ${Coverage_TITLE} ${Coverage_NAME}.info ) if(${Coverage_SONARQUBE}) # Generate SonarQube output set(GCOVR_XML_CMD ${GCOVR_PATH} --sonarqube ${Coverage_NAME}_sonarqube.xml -r ${BASEDIR} ${GCOVR_ADDITIONAL_ARGS} ${GCOVR_EXCLUDE_ARGS} --object-directory=${PROJECT_BINARY_DIR} ) set(GCOVR_XML_CMD_COMMAND COMMAND ${GCOVR_XML_CMD} ) set(GCOVR_XML_CMD_BYPRODUCTS ${Coverage_NAME}_sonarqube.xml) set(GCOVR_XML_CMD_COMMENT COMMENT "SonarQube code coverage info report saved in ${Coverage_NAME}_sonarqube.xml.") endif() if(CODE_COVERAGE_VERBOSE) message(STATUS "Executed command report") message(STATUS "Command to clean up lcov: ") string(REPLACE ";" " " LCOV_CLEAN_CMD_SPACED "${LCOV_CLEAN_CMD}") message(STATUS "${LCOV_CLEAN_CMD_SPACED}") message(STATUS "Command to create baseline: ") string(REPLACE ";" " " LCOV_BASELINE_CMD_SPACED "${LCOV_BASELINE_CMD}") message(STATUS "${LCOV_BASELINE_CMD_SPACED}") message(STATUS "Command to run the tests: ") string(REPLACE ";" " " LCOV_EXEC_TESTS_CMD_SPACED "${LCOV_EXEC_TESTS_CMD}") message(STATUS "${LCOV_EXEC_TESTS_CMD_SPACED}") message(STATUS "Command to capture counters and generate report: ") string(REPLACE ";" " " LCOV_CAPTURE_CMD_SPACED "${LCOV_CAPTURE_CMD}") message(STATUS "${LCOV_CAPTURE_CMD_SPACED}") message(STATUS "Command to add baseline counters: ") string(REPLACE ";" " " LCOV_BASELINE_COUNT_CMD_SPACED "${LCOV_BASELINE_COUNT_CMD}") message(STATUS "${LCOV_BASELINE_COUNT_CMD_SPACED}") message(STATUS "Command to filter collected data: ") string(REPLACE ";" " " LCOV_FILTER_CMD_SPACED "${LCOV_FILTER_CMD}") message(STATUS "${LCOV_FILTER_CMD_SPACED}") message(STATUS "Command to extract collected data: ") string(REPLACE ";" " " LCOV_EXTRACT_CMD_SPACED "${LCOV_EXTRACT_CMD}") message(STATUS "${LCOV_EXTRACT_CMD_SPACED}") message(STATUS "Command to generate lcov HTML output: ") string(REPLACE ";" " " LCOV_GEN_HTML_CMD_SPACED "${LCOV_GEN_HTML_CMD}") message(STATUS "${LCOV_GEN_HTML_CMD_SPACED}") if(${Coverage_SONARQUBE}) message(STATUS "Command to generate SonarQube XML output: ") string(REPLACE ";" " " GCOVR_XML_CMD_SPACED "${GCOVR_XML_CMD}") message(STATUS "${GCOVR_XML_CMD_SPACED}") endif() endif() # Setup target add_custom_target(${Coverage_NAME} COMMAND ${LCOV_CLEAN_CMD} COMMAND ${LCOV_BASELINE_CMD} COMMAND ${LCOV_EXEC_TESTS_CMD} COMMAND ${LCOV_CAPTURE_CMD} COMMAND ${LCOV_BASELINE_COUNT_CMD} COMMAND ${LCOV_FILTER_CMD} COMMAND ${LCOV_EXTRACT_CMD} COMMAND ${LCOV_GEN_HTML_CMD} ${GCOVR_XML_CMD_COMMAND} # Set output files as GENERATED (will be removed on 'make clean') BYPRODUCTS ${Coverage_NAME}.base ${Coverage_NAME}.capture ${Coverage_NAME}.total ${Coverage_NAME}.info ${GCOVR_XML_CMD_BYPRODUCTS} ${Coverage_NAME}/index.html WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} VERBATIM # Protect arguments to commands COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report." ) # Show where to find the lcov info report add_custom_command(TARGET ${Coverage_NAME} POST_BUILD COMMAND true; COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info." ${GCOVR_XML_CMD_COMMENT} ) # Show info where to find the report add_custom_command(TARGET ${Coverage_NAME} POST_BUILD COMMAND true; COMMENT "file://${CMAKE_BINARY_DIR}/${Coverage_OUTPUT}/index.html" ) endfunction() # setup_target_for_coverage_lcov # Defines a target for running and collection code coverage information # Builds dependencies, runs the given executable and outputs reports. # NOTE! The executable should always have a ZERO as exit code otherwise # the coverage generation will not complete. # # setup_target_for_coverage_gcovr_xml( # NAME ctest_coverage # New target name # EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR # DEPENDENCIES executable_target # Dependencies to build first # BASE_DIRECTORY "../" # Base directory for report # # (defaults to PROJECT_SOURCE_DIR) # EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative # # to BASE_DIRECTORY, with CMake 3.4+) # ) # The user can set the variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the # GCVOR command. function(setup_target_for_coverage_gcovr_xml) set(options NONE) set(oneValueArgs BASE_DIRECTORY NAME) set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT GCOVR_PATH) message(FATAL_ERROR "gcovr not found! Aborting...") endif() # NOT GCOVR_PATH # Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR if(DEFINED Coverage_BASE_DIRECTORY) get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE) else() set(BASEDIR ${PROJECT_SOURCE_DIR}) endif() # Collect excludes (CMake 3.4+: Also compute absolute paths) set(GCOVR_EXCLUDES "") foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_GCOVR_EXCLUDES}) if(CMAKE_VERSION VERSION_GREATER 3.4) get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR}) endif() list(APPEND GCOVR_EXCLUDES "${EXCLUDE}") endforeach() list(REMOVE_DUPLICATES GCOVR_EXCLUDES) # Combine excludes to several -e arguments set(GCOVR_EXCLUDE_ARGS "") foreach(EXCLUDE ${GCOVR_EXCLUDES}) list(APPEND GCOVR_EXCLUDE_ARGS "-e") list(APPEND GCOVR_EXCLUDE_ARGS "${EXCLUDE}") endforeach() # Set up commands which will be run to generate coverage data # Run tests set(GCOVR_XML_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS} ) # Running gcovr set(GCOVR_XML_CMD ${GCOVR_PATH} --xml ${Coverage_NAME}.xml -r ${BASEDIR} ${GCOVR_ADDITIONAL_ARGS} ${GCOVR_EXCLUDE_ARGS} --object-directory=${PROJECT_BINARY_DIR} ) if(CODE_COVERAGE_VERBOSE) message(STATUS "Executed command report") message(STATUS "Command to run tests: ") string(REPLACE ";" " " GCOVR_XML_EXEC_TESTS_CMD_SPACED "${GCOVR_XML_EXEC_TESTS_CMD}") message(STATUS "${GCOVR_XML_EXEC_TESTS_CMD_SPACED}") message(STATUS "Command to generate gcovr XML coverage data: ") string(REPLACE ";" " " GCOVR_XML_CMD_SPACED "${GCOVR_XML_CMD}") message(STATUS "${GCOVR_XML_CMD_SPACED}") endif() add_custom_target(${Coverage_NAME} COMMAND ${GCOVR_XML_EXEC_TESTS_CMD} COMMAND ${GCOVR_XML_CMD} BYPRODUCTS ${Coverage_NAME}.xml WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} VERBATIM # Protect arguments to commands COMMENT "Running gcovr to produce Cobertura code coverage report." ) # Show info where to find the report add_custom_command(TARGET ${Coverage_NAME} POST_BUILD COMMAND true; COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml." ) endfunction() # setup_target_for_coverage_gcovr_xml # Defines a target for running and collection code coverage information # Builds dependencies, runs the given executable and outputs reports. # NOTE! The executable should always have a ZERO as exit code otherwise # the coverage generation will not complete. # # setup_target_for_coverage_gcovr_html( # NAME ctest_coverage # New target name # EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR # DEPENDENCIES executable_target # Dependencies to build first # BASE_DIRECTORY "../" # Base directory for report # # (defaults to PROJECT_SOURCE_DIR) # EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative # # to BASE_DIRECTORY, with CMake 3.4+) # ) # The user can set the variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the # GCVOR command. function(setup_target_for_coverage_gcovr_html) set(options NONE) set(oneValueArgs BASE_DIRECTORY NAME) set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT GCOVR_PATH) message(FATAL_ERROR "gcovr not found! Aborting...") endif() # NOT GCOVR_PATH # Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR if(DEFINED Coverage_BASE_DIRECTORY) get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE) else() set(BASEDIR ${PROJECT_SOURCE_DIR}) endif() # Collect excludes (CMake 3.4+: Also compute absolute paths) set(GCOVR_EXCLUDES "") foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_GCOVR_EXCLUDES}) if(CMAKE_VERSION VERSION_GREATER 3.4) get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR}) endif() list(APPEND GCOVR_EXCLUDES "${EXCLUDE}") endforeach() list(REMOVE_DUPLICATES GCOVR_EXCLUDES) # Combine excludes to several -e arguments set(GCOVR_EXCLUDE_ARGS "") foreach(EXCLUDE ${GCOVR_EXCLUDES}) list(APPEND GCOVR_EXCLUDE_ARGS "-e") list(APPEND GCOVR_EXCLUDE_ARGS "${EXCLUDE}") endforeach() # Set up commands which will be run to generate coverage data # Run tests set(GCOVR_HTML_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS} ) # Create folder set(GCOVR_HTML_FOLDER_CMD ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME} ) # Running gcovr set(GCOVR_HTML_CMD ${GCOVR_PATH} --html ${Coverage_NAME}/index.html --html-details -r ${BASEDIR} ${GCOVR_ADDITIONAL_ARGS} ${GCOVR_EXCLUDE_ARGS} --object-directory=${PROJECT_BINARY_DIR} ) if(CODE_COVERAGE_VERBOSE) message(STATUS "Executed command report") message(STATUS "Command to run tests: ") string(REPLACE ";" " " GCOVR_HTML_EXEC_TESTS_CMD_SPACED "${GCOVR_HTML_EXEC_TESTS_CMD}") message(STATUS "${GCOVR_HTML_EXEC_TESTS_CMD_SPACED}") message(STATUS "Command to create a folder: ") string(REPLACE ";" " " GCOVR_HTML_FOLDER_CMD_SPACED "${GCOVR_HTML_FOLDER_CMD}") message(STATUS "${GCOVR_HTML_FOLDER_CMD_SPACED}") message(STATUS "Command to generate gcovr HTML coverage data: ") string(REPLACE ";" " " GCOVR_HTML_CMD_SPACED "${GCOVR_HTML_CMD}") message(STATUS "${GCOVR_HTML_CMD_SPACED}") endif() add_custom_target(${Coverage_NAME} COMMAND ${GCOVR_HTML_EXEC_TESTS_CMD} COMMAND ${GCOVR_HTML_FOLDER_CMD} COMMAND ${GCOVR_HTML_CMD} BYPRODUCTS ${PROJECT_BINARY_DIR}/${Coverage_NAME}/index.html # report directory WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} VERBATIM # Protect arguments to commands COMMENT "Running gcovr to produce HTML code coverage report." ) # Show info where to find the report add_custom_command(TARGET ${Coverage_NAME} POST_BUILD COMMAND true; COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report." ) endfunction() # setup_target_for_coverage_gcovr_html # Defines a target for running and collection code coverage information # Builds dependencies, runs the given executable and outputs reports. # NOTE! The executable should always have a ZERO as exit code otherwise # the coverage generation will not complete. # # setup_target_for_coverage_fastcov( # NAME testrunner_coverage # New target name # EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR # DEPENDENCIES testrunner # Dependencies to build first # BASE_DIRECTORY "../" # Base directory for report # # (defaults to PROJECT_SOURCE_DIR) # EXCLUDE "src/dir1/" "src/dir2/" # Patterns to exclude. # NO_DEMANGLE # Don't demangle C++ symbols # # even if c++filt is found # SKIP_HTML # Don't create html report # POST_CMD perl -i -pe s!${PROJECT_SOURCE_DIR}/!!g ctest_coverage.json # E.g. for stripping source dir from file paths # ) function(setup_target_for_coverage_fastcov) set(options NO_DEMANGLE SKIP_HTML) set(oneValueArgs BASE_DIRECTORY NAME) set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES FASTCOV_ARGS GENHTML_ARGS POST_CMD) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT FASTCOV_PATH) message(FATAL_ERROR "fastcov not found! Aborting...") endif() if(NOT Coverage_SKIP_HTML AND NOT GENHTML_PATH) message(FATAL_ERROR "genhtml not found! Aborting...") endif() # Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR if(Coverage_BASE_DIRECTORY) get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE) else() set(BASEDIR ${PROJECT_SOURCE_DIR}) endif() # Collect excludes (Patterns, not paths, for fastcov) set(FASTCOV_EXCLUDES "") foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_FASTCOV_EXCLUDES}) list(APPEND FASTCOV_EXCLUDES "${EXCLUDE}") endforeach() list(REMOVE_DUPLICATES FASTCOV_EXCLUDES) # Conditional arguments if(CPPFILT_PATH AND NOT ${Coverage_NO_DEMANGLE}) set(GENHTML_EXTRA_ARGS "--demangle-cpp") endif() # Set up commands which will be run to generate coverage data set(FASTCOV_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}) set(FASTCOV_CAPTURE_CMD ${FASTCOV_PATH} ${Coverage_FASTCOV_ARGS} --gcov ${GCOV_PATH} --search-directory ${BASEDIR} --process-gcno --output ${Coverage_NAME}.json --exclude ${FASTCOV_EXCLUDES} ) set(FASTCOV_CONVERT_CMD ${FASTCOV_PATH} -C ${Coverage_NAME}.json --lcov --output ${Coverage_NAME}.info ) if(Coverage_SKIP_HTML) set(FASTCOV_HTML_CMD ";") else() set(FASTCOV_HTML_CMD ${GENHTML_PATH} ${GENHTML_EXTRA_ARGS} ${Coverage_GENHTML_ARGS} -o ${Coverage_NAME} ${Coverage_NAME}.info ) endif() set(FASTCOV_POST_CMD ";") if(Coverage_POST_CMD) set(FASTCOV_POST_CMD ${Coverage_POST_CMD}) endif() if(CODE_COVERAGE_VERBOSE) message(STATUS "Code coverage commands for target ${Coverage_NAME} (fastcov):") message(" Running tests:") string(REPLACE ";" " " FASTCOV_EXEC_TESTS_CMD_SPACED "${FASTCOV_EXEC_TESTS_CMD}") message(" ${FASTCOV_EXEC_TESTS_CMD_SPACED}") message(" Capturing fastcov counters and generating report:") string(REPLACE ";" " " FASTCOV_CAPTURE_CMD_SPACED "${FASTCOV_CAPTURE_CMD}") message(" ${FASTCOV_CAPTURE_CMD_SPACED}") message(" Converting fastcov .json to lcov .info:") string(REPLACE ";" " " FASTCOV_CONVERT_CMD_SPACED "${FASTCOV_CONVERT_CMD}") message(" ${FASTCOV_CONVERT_CMD_SPACED}") if(NOT Coverage_SKIP_HTML) message(" Generating HTML report: ") string(REPLACE ";" " " FASTCOV_HTML_CMD_SPACED "${FASTCOV_HTML_CMD}") message(" ${FASTCOV_HTML_CMD_SPACED}") endif() if(Coverage_POST_CMD) message(" Running post command: ") string(REPLACE ";" " " FASTCOV_POST_CMD_SPACED "${FASTCOV_POST_CMD}") message(" ${FASTCOV_POST_CMD_SPACED}") endif() endif() # Setup target add_custom_target(${Coverage_NAME} # Cleanup fastcov COMMAND ${FASTCOV_PATH} ${Coverage_FASTCOV_ARGS} --gcov ${GCOV_PATH} --search-directory ${BASEDIR} --zerocounters COMMAND ${FASTCOV_EXEC_TESTS_CMD} COMMAND ${FASTCOV_CAPTURE_CMD} COMMAND ${FASTCOV_CONVERT_CMD} COMMAND ${FASTCOV_HTML_CMD} COMMAND ${FASTCOV_POST_CMD} # Set output files as GENERATED (will be removed on 'make clean') BYPRODUCTS ${Coverage_NAME}.info ${Coverage_NAME}.json ${Coverage_NAME}/index.html # report directory WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} VERBATIM # Protect arguments to commands COMMENT "Resetting code coverage counters to zero. Processing code coverage counters and generating report." ) set(INFO_MSG "fastcov code coverage info report saved in ${Coverage_NAME}.info and ${Coverage_NAME}.json.") if(NOT Coverage_SKIP_HTML) string(APPEND INFO_MSG " Open ${PROJECT_BINARY_DIR}/${Coverage_NAME}/index.html in your browser to view the coverage report.") endif() # Show where to find the fastcov info report add_custom_command(TARGET ${Coverage_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo ${INFO_MSG} ) endfunction() # setup_target_for_coverage_fastcov function(append_coverage_compiler_flags) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}") endfunction() # append_coverage_compiler_flags # Setup coverage for specific library function(append_coverage_compiler_flags_to_target name) separate_arguments(_flag_list NATIVE_COMMAND "${COVERAGE_COMPILER_FLAGS}") target_compile_options(${name} PRIVATE ${_flag_list}) if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") target_link_libraries(${name} PRIVATE gcov) endif() endfunction() libjwt-3.3.3/cmake/GenerateExportHeader.cmake000066400000000000000000000443301517612317300211540ustar00rootroot00000000000000# Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file Copyright.txt or https://cmake.org/licensing for details. #[=======================================================================[.rst: GenerateExportHeader -------------------- Function for generation of export macros for libraries This module provides the function ``GENERATE_EXPORT_HEADER()``. .. versionadded:: 3.12 Added support for C projects. Previous versions supported C++ project only. The ``GENERATE_EXPORT_HEADER`` function can be used to generate a file suitable for preprocessor inclusion which contains EXPORT macros to be used in library classes:: GENERATE_EXPORT_HEADER( LIBRARY_TARGET [BASE_NAME ] [EXPORT_MACRO_NAME ] [EXPORT_FILE_NAME ] [DEPRECATED_MACRO_NAME ] [NO_EXPORT_MACRO_NAME ] [INCLUDE_GUARD_NAME ] [STATIC_DEFINE ] [NO_DEPRECATED_MACRO_NAME ] [DEFINE_NO_DEPRECATED] [PREFIX_NAME ] [CUSTOM_CONTENT_FROM_VARIABLE ] ) The target properties :prop_tgt:`CXX_VISIBILITY_PRESET <_VISIBILITY_PRESET>` and :prop_tgt:`VISIBILITY_INLINES_HIDDEN` can be used to add the appropriate compile flags for targets. See the documentation of those target properties, and the convenience variables :variable:`CMAKE_CXX_VISIBILITY_PRESET _VISIBILITY_PRESET>` and :variable:`CMAKE_VISIBILITY_INLINES_HIDDEN`. By default ``GENERATE_EXPORT_HEADER()`` generates macro names in a file name determined by the name of the library. This means that in the simplest case, users of ``GenerateExportHeader`` will be equivalent to: .. code-block:: cmake set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) add_library(somelib someclass.cpp) generate_export_header(somelib) install(TARGETS somelib DESTINATION ${LIBRARY_INSTALL_DIR}) install(FILES someclass.h ${PROJECT_BINARY_DIR}/somelib_export.h DESTINATION ${INCLUDE_INSTALL_DIR} ) And in the ABI header files: .. code-block:: c++ #include "somelib_export.h" class SOMELIB_EXPORT SomeClass { ... }; The CMake fragment will generate a file in the ``${CMAKE_CURRENT_BINARY_DIR}`` called ``somelib_export.h`` containing the macros ``SOMELIB_EXPORT``, ``SOMELIB_NO_EXPORT``, ``SOMELIB_DEPRECATED``, ``SOMELIB_DEPRECATED_EXPORT`` and ``SOMELIB_DEPRECATED_NO_EXPORT``. They will be followed by content taken from the variable specified by the ``CUSTOM_CONTENT_FROM_VARIABLE`` option, if any. The resulting file should be installed with other headers in the library. The ``BASE_NAME`` argument can be used to override the file name and the names used for the macros: .. code-block:: cmake add_library(somelib someclass.cpp) generate_export_header(somelib BASE_NAME other_name ) Generates a file called ``other_name_export.h`` containing the macros ``OTHER_NAME_EXPORT``, ``OTHER_NAME_NO_EXPORT`` and ``OTHER_NAME_DEPRECATED`` etc. The ``BASE_NAME`` may be overridden by specifying other options in the function. For example: .. code-block:: cmake add_library(somelib someclass.cpp) generate_export_header(somelib EXPORT_MACRO_NAME OTHER_NAME_EXPORT ) creates the macro ``OTHER_NAME_EXPORT`` instead of ``SOMELIB_EXPORT``, but other macros and the generated file name is as default: .. code-block:: cmake add_library(somelib someclass.cpp) generate_export_header(somelib DEPRECATED_MACRO_NAME KDE_DEPRECATED ) creates the macro ``KDE_DEPRECATED`` instead of ``SOMELIB_DEPRECATED``. If ``LIBRARY_TARGET`` is a static library, macros are defined without values. If the same sources are used to create both a shared and a static library, the uppercased symbol ``${BASE_NAME}_STATIC_DEFINE`` should be used when building the static library: .. code-block:: cmake add_library(shared_variant SHARED ${lib_SRCS}) add_library(static_variant ${lib_SRCS}) generate_export_header(shared_variant BASE_NAME libshared_and_static) set_target_properties(static_variant PROPERTIES COMPILE_FLAGS -DLIBSHARED_AND_STATIC_STATIC_DEFINE) This will cause the export macros to expand to nothing when building the static library. If ``DEFINE_NO_DEPRECATED`` is specified, then a macro ``${BASE_NAME}_NO_DEPRECATED`` will be defined This macro can be used to remove deprecated code from preprocessor output: .. code-block:: cmake option(EXCLUDE_DEPRECATED "Exclude deprecated parts of the library" FALSE) if (EXCLUDE_DEPRECATED) set(NO_BUILD_DEPRECATED DEFINE_NO_DEPRECATED) endif() generate_export_header(somelib ${NO_BUILD_DEPRECATED}) And then in somelib: .. code-block:: c++ class SOMELIB_EXPORT SomeClass { public: #ifndef SOMELIB_NO_DEPRECATED SOMELIB_DEPRECATED void oldMethod(); #endif }; .. code-block:: c++ #ifndef SOMELIB_NO_DEPRECATED void SomeClass::oldMethod() { } #endif If ``PREFIX_NAME`` is specified, the argument will be used as a prefix to all generated macros. For example: .. code-block:: cmake generate_export_header(somelib PREFIX_NAME VTK_) Generates the macros ``VTK_SOMELIB_EXPORT`` etc. .. versionadded:: 3.1 Library target can be an ``OBJECT`` library. .. versionadded:: 3.7 Added the ``CUSTOM_CONTENT_FROM_VARIABLE`` option. .. versionadded:: 3.11 Added the ``INCLUDE_GUARD_NAME`` option. :: ADD_COMPILER_EXPORT_FLAGS( [] ) .. deprecated:: 3.0 Set the target properties :prop_tgt:`CXX_VISIBILITY_PRESET <_VISIBILITY_PRESET>` and :prop_tgt:`VISIBILITY_INLINES_HIDDEN` instead. The ``ADD_COMPILER_EXPORT_FLAGS`` function adds ``-fvisibility=hidden`` to :variable:`CMAKE_CXX_FLAGS _FLAGS>` if supported, and is a no-op on Windows which does not need extra compiler flags for exporting support. You may optionally pass a single argument to ``ADD_COMPILER_EXPORT_FLAGS`` that will be populated with the ``CXX_FLAGS`` required to enable visibility support for the compiler/architecture in use. #]=======================================================================] include(CheckCompilerFlag) include(CheckSourceCompiles) # TODO: Install this macro separately? macro(_check_cxx_compiler_attribute _ATTRIBUTE _RESULT) check_source_compiles(CXX "${_ATTRIBUTE} int somefunc() { return 0; } int main() { return somefunc();}" ${_RESULT} ) endmacro() # TODO: Install this macro separately? macro(_check_c_compiler_attribute _ATTRIBUTE _RESULT) check_source_compiles(C "${_ATTRIBUTE} int somefunc(void) { return 0; } int main(void) { return somefunc();}" ${_RESULT} ) endmacro() macro(_check_jansson_long_long _RESULT) list(APPEND CMAKE_REQUIRED_FLAGS ${JANSSON_CFLAGS}) check_source_compiles(C "#include #if JSON_INTEGER_IS_LONG_LONG != 1 #error No long long #endif int main(void) { exit(0);}" ${_RESULT} ) endmacro() macro(_test_compiler_hidden_visibility) if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.2") set(GCC_TOO_OLD TRUE) elseif(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "4.2") set(GCC_TOO_OLD TRUE) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "12.0") set(_INTEL_TOO_OLD TRUE) endif() # Exclude XL here because it misinterprets -fvisibility=hidden even though # the check_compiler_flag passes if(NOT GCC_TOO_OLD AND NOT _INTEL_TOO_OLD AND NOT WIN32 AND NOT CYGWIN AND NOT CMAKE_CXX_COMPILER_ID MATCHES "^(IBMClang|XLClang|XL)$" AND NOT CMAKE_CXX_COMPILER_ID MATCHES "^(PGI|NVHPC)$" AND NOT CMAKE_CXX_COMPILER_ID MATCHES Watcom) if (CMAKE_CXX_COMPILER_LOADED) check_compiler_flag(CXX -fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) check_compiler_flag(CXX -fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) else() check_compiler_flag(C -fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) check_compiler_flag(C -fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) endif() endif() endmacro() macro(_test_compiler_has_deprecated) # NOTE: Some Embarcadero compilers silently compile __declspec(deprecated) # without error, but this is not a documented feature and the attribute does # not actually generate any warnings. if(CMAKE_CXX_COMPILER_ID MATCHES Borland OR CMAKE_CXX_COMPILER_ID MATCHES Embarcadero OR CMAKE_CXX_COMPILER_ID MATCHES HP OR GCC_TOO_OLD OR CMAKE_CXX_COMPILER_ID MATCHES "^(PGI|NVHPC)$" OR CMAKE_CXX_COMPILER_ID MATCHES Watcom) set(COMPILER_HAS_DEPRECATED "" CACHE INTERNAL "Compiler support for a deprecated attribute") else() if (CMAKE_CXX_COMPILER_LOADED) _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED_ATTR) if(COMPILER_HAS_DEPRECATED_ATTR) set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED_ATTR}" CACHE INTERNAL "Compiler support for a deprecated attribute") else() _check_cxx_compiler_attribute("__declspec(deprecated)" COMPILER_HAS_DEPRECATED) endif() else() _check_c_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED_ATTR) if(COMPILER_HAS_DEPRECATED_ATTR) set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED_ATTR}" CACHE INTERNAL "Compiler support for a deprecated attribute") else() _check_c_compiler_attribute("__declspec(deprecated)" COMPILER_HAS_DEPRECATED) endif() endif() endif() endmacro() macro(_test_compiler_has_constructor) if(CMAKE_CXX_COMPILER_ID MATCHES Borland OR CMAKE_CXX_COMPILER_ID MATCHES Embarcadero OR CMAKE_CXX_COMPILER_ID MATCHES HP OR GCC_TOO_OLD OR CMAKE_CXX_COMPILER_ID MATCHES "^(PGI|NVHPC)$" OR CMAKE_CXX_COMPILER_ID MATCHES Watcom) set(COMPILER_HAS_CONSTRUCTOR "" CACHE INTERNAL "Compiler support for a constructor attribute") else() if (CMAKE_CXX_COMPILER_LOADED) _check_cxx_compiler_attribute("__attribute__((__constructor__))" COMPILER_HAS_CONSTRUCTOR_ATTR) if(COMPILER_HAS_CONSTRUCTOR_ATTR) set(COMPILER_HAS_CONSTRUCTOR "${COMPILER_HAS_CONSTRUCTOR_ATTR}" CACHE INTERNAL "Compiler support for a constructor attribute") else() _check_cxx_compiler_attribute("__declspec(constructor)" COMPILER_HAS_CONSTRUCTOR) endif() else() _check_c_compiler_attribute("__attribute__((__constructor__))" COMPILER_HAS_CONSTRUCTOR_ATTR) if(COMPILER_HAS_CONSTRUCTOR_ATTR) set(COMPILER_HAS_CONSTRUCTOR "${COMPILER_HAS_CONSTRUCTOR_ATTR}" CACHE INTERNAL "Compiler support for a constructor attribute") else() _check_c_compiler_attribute("__declspec(constructor)" COMPILER_HAS_CONSTRUCTOR) endif() endif() endif() endmacro() get_filename_component(_GENERATE_EXPORT_HEADER_MODULE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) set(DEFINE_DEPRECATED) set(DEFINE_CONSTRUCTOR) set(DEFINE_EXPORT) set(DEFINE_IMPORT) set(DEFINE_NO_EXPORT) if (COMPILER_HAS_DEPRECATED_ATTR AND NOT WIN32) set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))") elseif(COMPILER_HAS_DEPRECATED) set(DEFINE_DEPRECATED "__declspec(deprecated") endif() if (COMPILER_HAS_CONSTRUCTOR_ATTR AND NOT WIN32) set(DEFINE_CONSTRUCTOR "__attribute__ ((__constructor__))") elseif(COMPILER_HAS_CONSTRUCTOR) set(DEFINE_CONSTRUCTOR "__declspec(constructor)") endif() get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE) if(NOT ${type} STREQUAL "STATIC_LIBRARY") if(WIN32 OR CYGWIN) set(DEFINE_EXPORT "__declspec(dllexport)") set(DEFINE_IMPORT "__declspec(dllimport)") elseif(COMPILER_HAS_HIDDEN_VISIBILITY) set(DEFINE_EXPORT "__attribute__((visibility(\"default\")))") set(DEFINE_IMPORT "__attribute__((visibility(\"default\")))") set(DEFINE_NO_EXPORT "__attribute__((visibility(\"hidden\")))") endif() endif() endmacro() macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) # Option overrides set(options DEFINE_NO_DEPRECATED) set(oneValueArgs PREFIX_NAME BASE_NAME EXPORT_MACRO_NAME EXPORT_FILE_NAME DEPRECATED_MACRO_NAME NO_EXPORT_MACRO_NAME STATIC_DEFINE CONSTRUCTOR_MACRO_NAME NO_DEPRECATED_MACRO_NAME CUSTOM_CONTENT_FROM_VARIABLE INCLUDE_GUARD_NAME) set(multiValueArgs) cmake_parse_arguments(_GEH "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) set(BASE_NAME "${TARGET_LIBRARY}") if(_GEH_BASE_NAME) set(BASE_NAME ${_GEH_BASE_NAME}) endif() string(TOUPPER ${BASE_NAME} BASE_NAME_UPPER) string(TOLOWER ${BASE_NAME} BASE_NAME_LOWER) # Default options set(EXPORT_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_EXPORT") set(NO_EXPORT_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_NO_EXPORT") set(EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME_LOWER}_export.h") set(DEPRECATED_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_DEPRECATED") set(CONSTRUCTOR_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_CONSTRUCTOR") set(STATIC_DEFINE "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_STATIC_DEFINE") set(NO_DEPRECATED_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_NO_DEPRECATED") set(VERSION_MAJOR_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_VERSION_MAJOR") set(VERSION_MINOR_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_VERSION_MINOR") set(VERSION_MICRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_VERSION_MICRO") set(VERSION_STRING_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_VERSION_STRING") set(USE_LONG_LONG_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_USES_LONG_LONG") if(_GEH_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unknown keywords given to GENERATE_EXPORT_HEADER(): \"${_GEH_UNPARSED_ARGUMENTS}\"") endif() if(_GEH_EXPORT_MACRO_NAME) set(EXPORT_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_EXPORT_MACRO_NAME}) endif() string(MAKE_C_IDENTIFIER ${EXPORT_MACRO_NAME} EXPORT_MACRO_NAME) if(_GEH_EXPORT_FILE_NAME) if(IS_ABSOLUTE ${_GEH_EXPORT_FILE_NAME}) set(EXPORT_FILE_NAME ${_GEH_EXPORT_FILE_NAME}) else() set(EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${_GEH_EXPORT_FILE_NAME}") endif() endif() if(_GEH_DEPRECATED_MACRO_NAME) set(DEPRECATED_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_DEPRECATED_MACRO_NAME}) endif() string(MAKE_C_IDENTIFIER ${DEPRECATED_MACRO_NAME} DEPRECATED_MACRO_NAME) if(_GEH_CONSTRUCTOR_MACRO_NAME) set(CONSTRUCTOR_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_CONSTRUCTOR_MACRO_NAME}) endif() string(MAKE_C_IDENTIFIER ${CONSTRUCTOR_MACRO_NAME} CONSTRUCTOR_MACRO_NAME) if(_GEH_NO_EXPORT_MACRO_NAME) set(NO_EXPORT_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_NO_EXPORT_MACRO_NAME}) endif() string(MAKE_C_IDENTIFIER ${NO_EXPORT_MACRO_NAME} NO_EXPORT_MACRO_NAME) if(_GEH_STATIC_DEFINE) set(STATIC_DEFINE ${_GEH_PREFIX_NAME}${_GEH_STATIC_DEFINE}) endif() string(MAKE_C_IDENTIFIER ${STATIC_DEFINE} STATIC_DEFINE) if(_GEH_DEFINE_NO_DEPRECATED) set(DEFINE_NO_DEPRECATED 1) else() set(DEFINE_NO_DEPRECATED 0) endif() if(_GEH_NO_DEPRECATED_MACRO_NAME) set(NO_DEPRECATED_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_NO_DEPRECATED_MACRO_NAME}) endif() string(MAKE_C_IDENTIFIER ${NO_DEPRECATED_MACRO_NAME} NO_DEPRECATED_MACRO_NAME) if(_GEH_INCLUDE_GUARD_NAME) set(INCLUDE_GUARD_NAME ${_GEH_INCLUDE_GUARD_NAME}) else() set(INCLUDE_GUARD_NAME "${EXPORT_MACRO_NAME}_H") endif() get_target_property(EXPORT_IMPORT_CONDITION ${TARGET_LIBRARY} DEFINE_SYMBOL) if(NOT EXPORT_IMPORT_CONDITION) set(EXPORT_IMPORT_CONDITION ${TARGET_LIBRARY}_EXPORTS) endif() string(MAKE_C_IDENTIFIER ${EXPORT_IMPORT_CONDITION} EXPORT_IMPORT_CONDITION) if(_GEH_CUSTOM_CONTENT_FROM_VARIABLE) if(DEFINED "${_GEH_CUSTOM_CONTENT_FROM_VARIABLE}") set(CUSTOM_CONTENT "${${_GEH_CUSTOM_CONTENT_FROM_VARIABLE}}") else() set(CUSTOM_CONTENT "") endif() endif() configure_file("${CMAKE_SOURCE_DIR}/include/jwt_export.h.in" "${EXPORT_FILE_NAME}" @ONLY) endmacro() function(GENERATE_EXPORT_HEADER TARGET_LIBRARY) get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE) if(NOT ${type} STREQUAL "STATIC_LIBRARY" AND NOT ${type} STREQUAL "SHARED_LIBRARY" AND NOT ${type} STREQUAL "OBJECT_LIBRARY" AND NOT ${type} STREQUAL "MODULE_LIBRARY") message(WARNING "This macro can only be used with libraries") return() endif() _test_compiler_hidden_visibility() _test_compiler_has_deprecated() _test_compiler_has_constructor() _check_jansson_long_long(HAS_LONG_LONG) if(HAS_LONG_LONG) set(DEFINE_LONG_LONG "1" CACHE INTERNAL "Use long long") else() set(DEFINE_LONG_LONG "0" CACHE INTERNAL "Do not use long long") endif() _do_set_macro_values(${TARGET_LIBRARY}) _do_generate_export_header(${TARGET_LIBRARY} ${ARGN}) endfunction() function(add_compiler_export_flags) if(NOT CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.12) message(DEPRECATION "The add_compiler_export_flags function is obsolete. Use the CXX_VISIBILITY_PRESET and VISIBILITY_INLINES_HIDDEN target properties instead.") endif() _test_compiler_hidden_visibility() _test_compiler_has_deprecated() _test_compiler_has_constructor() option(USE_COMPILER_HIDDEN_VISIBILITY "Use HIDDEN visibility support if available." ON) mark_as_advanced(USE_COMPILER_HIDDEN_VISIBILITY) if(NOT (USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY)) # Just return if there are no flags to add. return() endif() set (EXTRA_FLAGS "-fvisibility=hidden") if(COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) set (EXTRA_FLAGS "${EXTRA_FLAGS} -fvisibility-inlines-hidden") endif() # Either return the extra flags needed in the supplied argument, or to the # CMAKE_CXX_FLAGS if no argument is supplied. if(ARGC GREATER 0) set(${ARGV0} "${EXTRA_FLAGS}" PARENT_SCOPE) else() string(APPEND CMAKE_CXX_FLAGS " ${EXTRA_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE) endif() endfunction() # FIXME(#24994): The following module(s) are included only for compatibility # with projects that accidentally relied on them with CMake 3.26 and below. include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) libjwt-3.3.3/cmake/LibJWTDoxyfile.cmake000066400000000000000000000066721517612317300177150ustar00rootroot00000000000000# Doxygen config. Only things that differ from the default set(DOXYGEN_MARKDOWN_ID_STYLE "GITHUB") set(DOXYGEN_PROJECT_LOGO "images/LibJWT.svg") set(DOXYGEN_PROJECT_ICON "images/favicon.ico") set(DOXYGEN_INPUT_ENCODING "ISO-8859-1") set(DOXYGEN_STRIP_FROM_PATH ${CMAKE_SOURCE_DIR}) set(DOXYGEN_OPTIMIZE_OUTPUT_FOR_C "YES") set(DOXYGEN_TYPEDEF_HIDES_STRUCT "YES") set(DOXYGEN_EXTRACT_ALL "YES") set(DOXYGEN_SHOW_HEADERFILE "NO") set(DOXYGEN_SHOW_INCLUDE_FILES "NO") set(DOXYGEN_SHOW_USED_FILES "NO") set(DOXYGEN_SHOW_FILES "NO") set(DOXYGEN_SHOW_NAMESPACES "NO") set(DOXYGEN_QUIET "YES") set(DOXYGEN_WARN_NO_PARAMDOC "YES") set(DOXYGEN_WARN_IF_UNDOC_ENUM_VAL "YES") set(DOXYGEN_EXAMPLE_PATH "doxygen") set(DOXYGEN_EXAMPLE_PATTERNS "*.dox *.c") set(DOXYGEN_IMAGE_PATH "images") set(DOXYGEN_VERBATIM_HEADERS "NO") set(DOXYGEN_HTML_HEADER "doxygen/header.html") set(DOXYGEN_HTML_FOOTER "doxygen/footer.html") set(DOXYGEN_HTML_EXTRA_STYLESHEET "doxygen/doxygen-awesome.css \\\n\tdoxygen/libjwt.css") set(DOXYGEN_HTML_COLORSTYLE "LIGHT") set(DOXYGEN_COPY_CLIPBOARD "NO") set(DOXYGEN_GENERATE_DOCSET "YES") set(DOXYGEN_DOCSET_FEEDNAME "Docs provided by maClara, LLC") set(DOXYGEN_DOCSET_BUNDLE_ID "com.maclara-llc.LibJWT") set(DOXYGEN_DOCSET_PUBLISHER_ID "com.maclara-llc.DocPublish") set(DOXYGEN_DOCSET_PUBLISHER_NAME "maClara, LLC") set(DOXYGEN_GENERATE_QHP "YES") set(DOXYGEN_QCH_FILE "LibJWT.qch") set(DOXYGEN_QHP_NAMESPACE "com.maclara-llc.LibJWT") set(DOXYGEN_DISABLE_INDEX "YES") set(DOXYGEN_GENERATE_TREEVIEW "YES") set(DOXYGEN_GENERATE_LATEX "YES") set(DOXYGEN_PAPER_TYPE "letter") set(DOXYGEN_LATEX_BATCHMODE "YES") set(DOXYGEN_GENERATE_MAN "YES") set(DOXYGEN_MAN_LINKS "YES") set(DOXYGEN_GENERATE_DOCBOOK "YES") set(DOXYGEN_MACRO_EXPANSION "YES") set(DOXYGEN_EXPAND_ONLY_PREDEF "YES") set(DOXYGEN_PREDEFINED "_DOXYGEN JWT_EXPORT= JWT_NO_EXPORT= JWT_DEPRECATED=") string(APPEND DOXYGEN_PREDEFINED " \\\n\tJWT_DEPRECATED_EXPORT= JWT_DEPRECATED_NO_EXPORT=") string(APPEND DOXYGEN_PREDEFINED " \\\n\tJWT_CONSTRUCTOR= __attribute__(x)= __declspec(x)=") set(DOXYGEN_GENERATE_TAGFILE "${DOXYGEN_OUTPUT_DIRECTORY}/LibJWT.tag") set(DOXYGEN_DOT_IMAGE_FORMAT "svg") set(DOXYGEN_INTERACTIVE_SVG "YES") set(DOXYGEN_SEARCHENGINE "NO") set(DOXYGEN_LAYOUT_FILE "doxygen/DoxygenLayout.xml") # List of extra files we need for a nice theme set(DOXYGEN_HTML_EXTRA_FILES "doxygen/doxygen-awesome-paragraph-link.js") string(APPEND DOXYGEN_HTML_EXTRA_FILES " \\\n\tdoxygen/doxygen-awesome-paragraph-icon.js") string(APPEND DOXYGEN_HTML_EXTRA_FILES " \\\n\tdoxygen/doxygen-awesome-fragment-copy-button.js") string(APPEND DOXYGEN_HTML_EXTRA_FILES " \\\n\tdoxygen/doxygen-awesome-interactive-toc.js") string(APPEND DOXYGEN_HTML_EXTRA_FILES " \\\n\tdoxygen/maclara-pill.svg") # Base templates for ALIASES set(rfc_url "https://datatracker.ietf.org/doc/html/rfc") set(fa_i "\\emoji :page_facing_up:") set(a_pre "RFC-\\1\"") string(APPEND DOXYGEN_ALIASES " \\\n\trfc{2}=\"${a_pre_b}\\1#section-\\2\\\">RFC-\\1 Sec \\2\"") string(APPEND DOXYGEN_ALIASES " \\\n\trfc_t{2}=\"${fa_i} ${a_pre}\\1#section-\\2\\\">RFC-\\1 Sec \\2\"") set(DOXYGEN_VERBATIM_VARS DOXYGEN_EXAMPLE_PATTERNS DOXYGEN_PREDEFINED DOXYGEN_HTML_EXTRA_STYLESHEET DOXYGEN_HTML_EXTRA_FILES DOXYGEN_ALIASES) libjwt-3.3.3/cmake/LibJWTVersions.cmake000066400000000000000000000021311517612317300177240ustar00rootroot00000000000000# Source of truth set(LIBJWT_PROJECT "LibJWT") set(LIBJWT_DESCRIPTION "The C JSON Web Token Library +JWK +JWKS") set(LIBJWT_HOMEPAGE_URL "https://libjwt.io") set(LIBJWT_VERSION_SET 3 3 3) set(LIBJWT_SO_CRA 16 7 2) # SONAME History # v1.12.1 0 => 1 # v1.15.0 1 => 2 # v3.0.0 2 => 14 # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html string(TOLOWER ${LIBJWT_PROJECT} LIBJWT_PROJECT_LOWER) list(GET LIBJWT_VERSION_SET 0 DEFINE_MAJOR) list(GET LIBJWT_VERSION_SET 1 DEFINE_MINOR) list(GET LIBJWT_VERSION_SET 2 DEFINE_MICRO) string(JOIN "." LIBJWT_VERSION ${LIBJWT_VERSION_SET}) set(DEFINE_VERSION "\"${LIBJWT_VERSION}\"") list(GET LIBJWT_SO_CRA 0 LIBJWT_SO_CURRENT) list(GET LIBJWT_SO_CRA 1 LIBJWT_SO_REVISION) list(GET LIBJWT_SO_CRA 2 LIBJWT_SO_AGE) # Libtool does -version-info cur:rev:age, but cmake does things # a bit different. However, the result is the same. math(EXPR JWT_SO_MAJOR "${LIBJWT_SO_CURRENT} - ${LIBJWT_SO_AGE}") set(LIBJWT_VERSION_INFO "${JWT_SO_MAJOR}.${LIBJWT_SO_AGE}.${LIBJWT_SO_REVISION}") set(LIBJWT_COMPATVERSION "${JWT_SO_MAJOR}") libjwt-3.3.3/cmake/mingw-w64.cmake000066400000000000000000000003401517612317300166370ustar00rootroot00000000000000# cmake -DCMAKE_TOOLCHAIN_FILE=mingw-w64.cmake set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) libjwt-3.3.3/doxygen/000077500000000000000000000000001517612317300144765ustar00rootroot00000000000000libjwt-3.3.3/doxygen/DoxygenLayout.xml000066400000000000000000000241731517612317300200420ustar00rootroot00000000000000 libjwt-3.3.3/doxygen/doxygen-awesome-fragment-copy-button.js000066400000000000000000000077121517612317300242400ustar00rootroot00000000000000/** Doxygen Awesome https://github.com/jothepro/doxygen-awesome-css MIT License Copyright (c) 2022 - 2023 jothepro Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ class DoxygenAwesomeFragmentCopyButton extends HTMLElement { constructor() { super(); this.onclick=this.copyContent } static title = "Copy to clipboard" static copyIcon = `` static successIcon = `` static successDuration = 980 static init() { $(function() { $(document).ready(function() { if(navigator.clipboard) { const fragments = document.getElementsByClassName("fragment") for(const fragment of fragments) { const fragmentWrapper = document.createElement("div") fragmentWrapper.className = "doxygen-awesome-fragment-wrapper" const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button") fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title fragment.parentNode.replaceChild(fragmentWrapper, fragment) fragmentWrapper.appendChild(fragment) fragmentWrapper.appendChild(fragmentCopyButton) } } }) }) } copyContent() { const content = this.previousSibling.cloneNode(true) // filter out line number from file listings content.querySelectorAll(".lineno, .ttc").forEach((node) => { node.remove() }) let textContent = content.textContent // remove trailing newlines that appear in file listings let numberOfTrailingNewlines = 0 while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') { numberOfTrailingNewlines++; } textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines) navigator.clipboard.writeText(textContent); this.classList.add("success") this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon window.setTimeout(() => { this.classList.remove("success") this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon }, DoxygenAwesomeFragmentCopyButton.successDuration); } } customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton) libjwt-3.3.3/doxygen/doxygen-awesome-interactive-toc.js000066400000000000000000000066171517612317300232570ustar00rootroot00000000000000/** Doxygen Awesome https://github.com/jothepro/doxygen-awesome-css MIT License Copyright (c) 2022 - 2023 jothepro Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ class DoxygenAwesomeInteractiveToc { static topOffset = 38 static hideMobileMenu = true static headers = [] static init() { window.addEventListener("load", () => { let toc = document.querySelector(".contents > .toc") if(toc) { toc.classList.add("interactive") if(!DoxygenAwesomeInteractiveToc.hideMobileMenu) { toc.classList.add("open") } document.querySelector(".contents > .toc > h3")?.addEventListener("click", () => { if(toc.classList.contains("open")) { toc.classList.remove("open") } else { toc.classList.add("open") } }) document.querySelectorAll(".contents > .toc > ul a").forEach((node) => { let id = node.getAttribute("href").substring(1) DoxygenAwesomeInteractiveToc.headers.push({ node: node, headerNode: document.getElementById(id) }) document.getElementById("doc-content")?.addEventListener("scroll",this.throttle(DoxygenAwesomeInteractiveToc.update, 100)) }) DoxygenAwesomeInteractiveToc.update() } }) } static update() { let active = DoxygenAwesomeInteractiveToc.headers[0]?.node DoxygenAwesomeInteractiveToc.headers.forEach((header) => { let position = header.headerNode.getBoundingClientRect().top header.node.classList.remove("active") header.node.classList.remove("aboveActive") if(position < DoxygenAwesomeInteractiveToc.topOffset) { active = header.node active?.classList.add("aboveActive") } }) active?.classList.add("active") active?.classList.remove("aboveActive") } static throttle(func, delay) { let lastCall = 0; return function (...args) { const now = new Date().getTime(); if (now - lastCall < delay) { return; } lastCall = now; return setTimeout(() => {func(...args)}, delay); }; } } libjwt-3.3.3/doxygen/doxygen-awesome-paragraph-icon.js000066400000000000000000000010121517612317300230320ustar00rootroot00000000000000/* Icon from https://fonts.google.com/icons Licensed under the Apache 2.0 license: https://www.apache.org/licenses/LICENSE-2.0.html */ class DoxygenAwesomeParagraphIcon { static icon = ` ` } libjwt-3.3.3/doxygen/doxygen-awesome-paragraph-link.js000066400000000000000000000036511517612317300230520ustar00rootroot00000000000000/** Doxygen Awesome https://github.com/jothepro/doxygen-awesome-css MIT License Copyright (c) 2022 - 2023 jothepro Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ class DoxygenAwesomeParagraphLink { static title = "Permanent Link" static init() { $(function() { $(document).ready(function() { document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => { let anchorlink = document.createElement("a") anchorlink.setAttribute("href", `#${node.getAttribute("id")}`) anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title) anchorlink.classList.add("anchorlink") node.classList.add("anchor") anchorlink.innerHTML = DoxygenAwesomeParagraphIcon.icon node.parentElement.appendChild(anchorlink) }) }) }) } } libjwt-3.3.3/doxygen/doxygen-awesome-tabs.js000066400000000000000000000073251517612317300211050ustar00rootroot00000000000000/** Doxygen Awesome https://github.com/jothepro/doxygen-awesome-css MIT License Copyright (c) 2023 jothepro Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ class DoxygenAwesomeTabs { static init() { window.addEventListener("load", () => { document.querySelectorAll(".tabbed:not(:empty)").forEach((tabbed, tabbedIndex) => { let tabLinkList = [] tabbed.querySelectorAll(":scope > ul > li").forEach((tab, tabIndex) => { tab.id = "tab_" + tabbedIndex + "_" + tabIndex let header = tab.querySelector(".tab-title") let tabLink = document.createElement("button") tabLink.classList.add("tab-button") tabLink.appendChild(header) header.title = header.textContent tabLink.addEventListener("click", () => { tabbed.querySelectorAll(":scope > ul > li").forEach((tab) => { tab.classList.remove("selected") }) tabLinkList.forEach((tabLink) => { tabLink.classList.remove("active") }) tab.classList.add("selected") tabLink.classList.add("active") }) tabLinkList.push(tabLink) if(tabIndex == 0) { tab.classList.add("selected") tabLink.classList.add("active") } }) let tabsOverview = document.createElement("div") tabsOverview.classList.add("tabs-overview") let tabsOverviewContainer = document.createElement("div") tabsOverviewContainer.classList.add("tabs-overview-container") tabLinkList.forEach((tabLink) => { tabsOverview.appendChild(tabLink) }) tabsOverviewContainer.appendChild(tabsOverview) tabbed.before(tabsOverviewContainer) function resize() { let maxTabHeight = 0 tabbed.querySelectorAll(":scope > ul > li").forEach((tab, tabIndex) => { let visibility = tab.style.display tab.style.display = "block" maxTabHeight = Math.max(tab.offsetHeight, maxTabHeight) tab.style.display = visibility }) tabbed.style.height = `${maxTabHeight + 10}px` } resize() new ResizeObserver(resize).observe(tabbed) }) }) } static resize(tabbed) { } }libjwt-3.3.3/doxygen/doxygen-awesome.css000066400000000000000000002036351517612317300203340ustar00rootroot00000000000000/** Doxygen Awesome https://github.com/jothepro/doxygen-awesome-css MIT License Copyright (c) 2021 - 2023 jothepro Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ html { /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ --primary-color: #1779c4; --primary-dark-color: #335c80; --primary-light-color: #70b1e9; /* page base colors */ --page-background-color: #ffffff; --page-foreground-color: #2f4153; --page-secondary-foreground-color: #6f7e8e; /* color for all separators on the website: hr, borders, ... */ --separator-color: #dedede; /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ --border-radius-large: 8px; --border-radius-small: 4px; --border-radius-medium: 6px; /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */ --spacing-small: 5px; --spacing-medium: 10px; --spacing-large: 16px; /* default box shadow used for raising an element above the normal content. Used in dropdowns, search result, ... */ --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); --odd-color: rgba(0,0,0,.028); /* font-families. will affect all text on the website * font-family: the normal font for text, headlines, menus * font-family-monospace: used for preformatted text in memtitle, code, fragments */ --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; /* font sizes */ --page-font-size: 15.6px; --navigation-font-size: 14.4px; --toc-font-size: 13.4px; --code-font-size: 14px; /* affects code, fragment */ --title-font-size: 22px; /* content text properties. These only affect the page content, not the navigation or any other ui elements */ --content-line-height: 27px; /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ --content-maxwidth: 1050px; --table-line-height: 24px; --toc-sticky-top: var(--spacing-medium); --toc-width: 200px; --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 85px); /* colors for various content boxes: @warning, @note, @deprecated @bug */ --warning-color: #faf3d8; --warning-color-dark: #f3a600; --warning-color-darker: #5f4204; --note-color: #e4f3ff; --note-color-dark: #1879C4; --note-color-darker: #274a5c; --todo-color: #e4dafd; --todo-color-dark: #5b2bdd; --todo-color-darker: #2a0d72; --deprecated-color: #ecf0f3; --deprecated-color-dark: #5b6269; --deprecated-color-darker: #43454a; --bug-color: #f8d1cc; --bug-color-dark: #b61825; --bug-color-darker: #75070f; --invariant-color: #d8f1e3; --invariant-color-dark: #44b86f; --invariant-color-darker: #265532; /* blockquote colors */ --blockquote-background: #f8f9fa; --blockquote-foreground: #636568; /* table colors */ --tablehead-background: #f1f1f1; --tablehead-foreground: var(--page-foreground-color); /* menu-display: block | none * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. * `GENERATE_TREEVIEW` MUST be enabled! */ --menu-display: block; --menu-focus-foreground: var(--page-background-color); --menu-focus-background: var(--primary-color); --menu-selected-background: rgba(0,0,0,.05); --header-background: var(--page-background-color); --header-foreground: var(--page-foreground-color); /* searchbar colors */ --searchbar-background: var(--side-nav-background); --searchbar-foreground: var(--page-foreground-color); /* searchbar size * (`searchbar-width` is only applied on screens >= 768px. * on smaller screens the searchbar will always fill the entire screen width) */ --searchbar-height: 33px; --searchbar-width: 210px; --searchbar-border-radius: var(--searchbar-height); /* code block colors */ --code-background: #f5f5f5; --code-foreground: var(--page-foreground-color); /* fragment colors */ --fragment-background: #F8F9FA; --fragment-foreground: #37474F; --fragment-keyword: #bb6bb2; --fragment-keywordtype: #8258b3; --fragment-keywordflow: #d67c3b; --fragment-token: #438a59; --fragment-comment: #969696; --fragment-link: #5383d6; --fragment-preprocessor: #46aaa5; --fragment-linenumber-color: #797979; --fragment-linenumber-background: #f4f4f5; --fragment-linenumber-border: #e3e5e7; --fragment-lineheight: 20px; /* sidebar navigation (treeview) colors */ --side-nav-background: #fbfbfb; --side-nav-foreground: var(--page-foreground-color); --side-nav-arrow-opacity: 0; --side-nav-arrow-hover-opacity: 0.9; --toc-background: var(--side-nav-background); --toc-foreground: var(--side-nav-foreground); /* height of an item in any tree / collapsible table */ --tree-item-height: 30px; --memname-font-size: var(--code-font-size); --memtitle-font-size: 18px; --webkit-scrollbar-size: 7px; --webkit-scrollbar-padding: 4px; --webkit-scrollbar-color: var(--separator-color); --animation-duration: .12s } @media screen and (max-width: 767px) { html { --page-font-size: 16px; --navigation-font-size: 16px; --toc-font-size: 15px; --code-font-size: 15px; /* affects code, fragment */ --title-font-size: 22px; } } @media (prefers-color-scheme: dark) { html:not(.light-mode) { color-scheme: dark; --primary-color: #1982d2; --primary-dark-color: #86a9c4; --primary-light-color: #4779ac; --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); --odd-color: rgba(100,100,100,.06); --menu-selected-background: rgba(0,0,0,.4); --page-background-color: #1C1D1F; --page-foreground-color: #d2dbde; --page-secondary-foreground-color: #859399; --separator-color: #38393b; --side-nav-background: #252628; --code-background: #2a2c2f; --tablehead-background: #2a2c2f; --blockquote-background: #222325; --blockquote-foreground: #7e8c92; --warning-color: #3b2e04; --warning-color-dark: #f1b602; --warning-color-darker: #ceb670; --note-color: #163750; --note-color-dark: #1982D2; --note-color-darker: #dcf0fa; --todo-color: #2a2536; --todo-color-dark: #7661b3; --todo-color-darker: #ae9ed6; --deprecated-color: #2e323b; --deprecated-color-dark: #738396; --deprecated-color-darker: #abb0bd; --bug-color: #2e1917; --bug-color-dark: #ad2617; --bug-color-darker: #f5b1aa; --invariant-color: #303a35; --invariant-color-dark: #76ce96; --invariant-color-darker: #cceed5; --fragment-background: #282c34; --fragment-foreground: #dbe4eb; --fragment-keyword: #cc99cd; --fragment-keywordtype: #ab99cd; --fragment-keywordflow: #e08000; --fragment-token: #7ec699; --fragment-comment: #999999; --fragment-link: #98c0e3; --fragment-preprocessor: #65cabe; --fragment-linenumber-color: #cccccc; --fragment-linenumber-background: #35393c; --fragment-linenumber-border: #1f1f1f; } } /* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ html.dark-mode { color-scheme: dark; --primary-color: #1982d2; --primary-dark-color: #86a9c4; --primary-light-color: #4779ac; --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); --odd-color: rgba(100,100,100,.06); --menu-selected-background: rgba(0,0,0,.4); --page-background-color: #1C1D1F; --page-foreground-color: #d2dbde; --page-secondary-foreground-color: #859399; --separator-color: #38393b; --side-nav-background: #252628; --code-background: #2a2c2f; --tablehead-background: #2a2c2f; --blockquote-background: #222325; --blockquote-foreground: #7e8c92; --warning-color: #3b2e04; --warning-color-dark: #f1b602; --warning-color-darker: #ceb670; --note-color: #163750; --note-color-dark: #1982D2; --note-color-darker: #dcf0fa; --todo-color: #2a2536; --todo-color-dark: #7661b3; --todo-color-darker: #ae9ed6; --deprecated-color: #2e323b; --deprecated-color-dark: #738396; --deprecated-color-darker: #abb0bd; --bug-color: #2e1917; --bug-color-dark: #ad2617; --bug-color-darker: #f5b1aa; --invariant-color: #303a35; --invariant-color-dark: #76ce96; --invariant-color-darker: #cceed5; --fragment-background: #282c34; --fragment-foreground: #dbe4eb; --fragment-keyword: #cc99cd; --fragment-keywordtype: #ab99cd; --fragment-keywordflow: #e08000; --fragment-token: #7ec699; --fragment-comment: #999999; --fragment-link: #98c0e3; --fragment-preprocessor: #65cabe; --fragment-linenumber-color: #cccccc; --fragment-linenumber-background: #35393c; --fragment-linenumber-border: #1f1f1f; } body { color: var(--page-foreground-color); background-color: var(--page-background-color); font-size: var(--page-font-size); } body, table, div, p, dl, #nav-tree .label, .title, .sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, .SelectItem, #MSearchField, .navpath li.navelem a, .navpath li.navelem a:hover, p.reference, p.definition, div.toc li, div.toc h3 { font-family: var(--font-family); } h1, h2, h3, h4, h5 { margin-top: 1em; font-weight: 600; line-height: initial; } p, div, table, dl, p.reference, p.definition { font-size: var(--page-font-size); } p.reference, p.definition { color: var(--page-secondary-foreground-color); } a:link, a:visited, a:hover, a:focus, a:active { color: var(--primary-color) !important; font-weight: 500; background: none; } a.anchor { scroll-margin-top: var(--spacing-large); display: block; } /* Title and top navigation */ #top { background: var(--header-background); border-bottom: 1px solid var(--separator-color); } @media screen and (min-width: 768px) { #top { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; } } #main-nav { flex-grow: 5; padding: var(--spacing-small) var(--spacing-medium); } #titlearea { width: auto; padding: var(--spacing-medium) var(--spacing-large); background: none; color: var(--header-foreground); border-bottom: none; } @media screen and (max-width: 767px) { #titlearea { padding-bottom: var(--spacing-small); } } #titlearea table tbody tr { height: auto !important; } #projectname { font-size: var(--title-font-size); font-weight: 600; } #projectnumber { font-family: inherit; font-size: 60%; } #projectbrief { font-family: inherit; font-size: 80%; } #projectlogo { vertical-align: middle; } #projectlogo img { max-height: calc(var(--title-font-size) * 2); margin-right: var(--spacing-small); } .sm-dox, .tabs, .tabs2, .tabs3 { background: none; padding: 0; } .tabs, .tabs2, .tabs3 { border-bottom: 1px solid var(--separator-color); margin-bottom: -1px; } .main-menu-btn-icon, .main-menu-btn-icon:before, .main-menu-btn-icon:after { background: var(--page-secondary-foreground-color); } @media screen and (max-width: 767px) { .sm-dox a span.sub-arrow { background: var(--code-background); } #main-menu a.has-submenu span.sub-arrow { color: var(--page-secondary-foreground-color); border-radius: var(--border-radius-medium); } #main-menu a.has-submenu:hover span.sub-arrow { color: var(--page-foreground-color); } } @media screen and (min-width: 768px) { .sm-dox li, .tablist li { display: var(--menu-display); } .sm-dox a span.sub-arrow { border-color: var(--header-foreground) transparent transparent transparent; } .sm-dox a:hover span.sub-arrow { border-color: var(--menu-focus-foreground) transparent transparent transparent; } .sm-dox ul a span.sub-arrow { border-color: transparent transparent transparent var(--page-foreground-color); } .sm-dox ul a:hover span.sub-arrow { border-color: transparent transparent transparent var(--menu-focus-foreground); } } .sm-dox ul { background: var(--page-background-color); box-shadow: var(--box-shadow); border: 1px solid var(--separator-color); border-radius: var(--border-radius-medium) !important; padding: var(--spacing-small); animation: ease-out 150ms slideInMenu; } @keyframes slideInMenu { from { opacity: 0; transform: translate(0px, -2px); } to { opacity: 1; transform: translate(0px, 0px); } } .sm-dox ul a { color: var(--page-foreground-color) !important; background: var(--page-background-color); font-size: var(--navigation-font-size); } .sm-dox>li>ul:after { border-bottom-color: var(--page-background-color) !important; } .sm-dox>li>ul:before { border-bottom-color: var(--separator-color) !important; } .sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { font-size: var(--navigation-font-size) !important; color: var(--menu-focus-foreground) !important; text-shadow: none; background-color: var(--menu-focus-background); border-radius: var(--border-radius-small) !important; } .sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { text-shadow: none; background: transparent; background-image: none !important; color: var(--header-foreground) !important; font-weight: normal; font-size: var(--navigation-font-size); border-radius: var(--border-radius-small) !important; } .sm-dox a:focus { outline: auto; } .sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { text-shadow: none; font-weight: normal; background: var(--menu-focus-background); color: var(--menu-focus-foreground) !important; border-radius: var(--border-radius-small) !important; font-size: var(--navigation-font-size); } .tablist li.current { border-radius: var(--border-radius-small); background: var(--menu-selected-background); } .tablist li { margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); } .tablist a { padding: 0 var(--spacing-large); } /* Search box */ #MSearchBox { height: var(--searchbar-height); background: var(--searchbar-background); border-radius: var(--searchbar-border-radius); border: 1px solid var(--separator-color); overflow: hidden; width: var(--searchbar-width); position: relative; box-shadow: none; display: block; margin-top: 0; } /* until Doxygen 1.9.4 */ .left img#MSearchSelect { left: 0; user-select: none; padding-left: 8px; } /* Doxygen 1.9.5 */ .left span#MSearchSelect { left: 0; user-select: none; margin-left: 8px; padding: 0; } .left #MSearchSelect[src$=".png"] { padding-left: 0 } .SelectionMark { user-select: none; } .tabs .left #MSearchSelect { padding-left: 0; } .tabs #MSearchBox { position: absolute; right: var(--spacing-medium); } @media screen and (max-width: 767px) { .tabs #MSearchBox { position: relative; right: 0; margin-left: var(--spacing-medium); margin-top: 0; } } #MSearchSelectWindow, #MSearchResultsWindow { z-index: 9999; } #MSearchBox.MSearchBoxActive { border-color: var(--primary-color); box-shadow: inset 0 0 0 1px var(--primary-color); } #main-menu > li:last-child { margin-right: 0; } @media screen and (max-width: 767px) { #main-menu > li:last-child { height: 50px; } } #MSearchField { font-size: var(--navigation-font-size); height: calc(var(--searchbar-height) - 2px); background: transparent; width: calc(var(--searchbar-width) - 64px); } .MSearchBoxActive #MSearchField { color: var(--searchbar-foreground); } #MSearchSelect { top: calc(calc(var(--searchbar-height) / 2) - 11px); } #MSearchBox span.left, #MSearchBox span.right { background: none; background-image: none; } #MSearchBox span.right { padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); position: absolute; right: var(--spacing-small); } .tabs #MSearchBox span.right { top: calc(calc(var(--searchbar-height) / 2) - 12px); } @keyframes slideInSearchResults { from { opacity: 0; transform: translate(0, 15px); } to { opacity: 1; transform: translate(0, 20px); } } #MSearchResultsWindow { left: auto !important; right: var(--spacing-medium); border-radius: var(--border-radius-large); border: 1px solid var(--separator-color); transform: translate(0, 20px); box-shadow: var(--box-shadow); animation: ease-out 280ms slideInSearchResults; background: var(--page-background-color); } iframe#MSearchResults { margin: 4px; } iframe { color-scheme: normal; } @media (prefers-color-scheme: dark) { html:not(.light-mode) iframe#MSearchResults { filter: invert() hue-rotate(180deg); } } html.dark-mode iframe#MSearchResults { filter: invert() hue-rotate(180deg); } #MSearchResults .SRPage { background-color: transparent; } #MSearchResults .SRPage .SREntry { font-size: 10pt; padding: var(--spacing-small) var(--spacing-medium); } #MSearchSelectWindow { border: 1px solid var(--separator-color); border-radius: var(--border-radius-medium); box-shadow: var(--box-shadow); background: var(--page-background-color); padding-top: var(--spacing-small); padding-bottom: var(--spacing-small); } #MSearchSelectWindow a.SelectItem { font-size: var(--navigation-font-size); line-height: var(--content-line-height); margin: 0 var(--spacing-small); border-radius: var(--border-radius-small); color: var(--page-foreground-color) !important; font-weight: normal; } #MSearchSelectWindow a.SelectItem:hover { background: var(--menu-focus-background); color: var(--menu-focus-foreground) !important; } @media screen and (max-width: 767px) { #MSearchBox { margin-top: var(--spacing-medium); margin-bottom: var(--spacing-medium); width: calc(100vw - 30px); } #main-menu > li:last-child { float: none !important; } #MSearchField { width: calc(100vw - 110px); } @keyframes slideInSearchResultsMobile { from { opacity: 0; transform: translate(0, 15px); } to { opacity: 1; transform: translate(0, 20px); } } #MSearchResultsWindow { left: var(--spacing-medium) !important; right: var(--spacing-medium); overflow: auto; transform: translate(0, 20px); animation: ease-out 280ms slideInSearchResultsMobile; width: auto !important; } /* * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 */ label.main-menu-btn ~ #searchBoxPos1 { top: 3px !important; right: 6px !important; left: 45px; display: flex; } label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { margin-top: 0; margin-bottom: 0; flex-grow: 2; float: left; } } /* Tree view */ #side-nav { padding: 0 !important; background: var(--side-nav-background); min-width: 8px; max-width: 50vw; } @media screen and (max-width: 767px) { #side-nav { display: none; } #doc-content { margin-left: 0 !important; } } #nav-tree { background: transparent; margin-right: 1px; } #nav-tree .label { font-size: var(--navigation-font-size); } #nav-tree .item { height: var(--tree-item-height); line-height: var(--tree-item-height); overflow: hidden; text-overflow: ellipsis; } #nav-tree .item > a:focus { outline: none; } #nav-sync { bottom: 12px; right: 12px; top: auto !important; user-select: none; } #nav-tree .selected { text-shadow: none; background-image: none; background-color: transparent; position: relative; color: var(--primary-color) !important; font-weight: 500; } #nav-tree .selected::after { content: ""; position: absolute; top: 1px; bottom: 1px; left: 0; width: 4px; border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; background: var(--primary-color); } #nav-tree a { color: var(--side-nav-foreground) !important; font-weight: normal; } #nav-tree a:focus { outline-style: auto; } #nav-tree .arrow { opacity: var(--side-nav-arrow-opacity); background: none; } .arrow { color: inherit; cursor: pointer; font-size: 45%; vertical-align: middle; margin-right: 2px; font-family: serif; height: auto; text-align: right; } #nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { opacity: var(--side-nav-arrow-hover-opacity); } #nav-tree .selected a { color: var(--primary-color) !important; font-weight: bolder; font-weight: 600; } .ui-resizable-e { width: 4px; background: transparent; box-shadow: inset -1px 0 0 0 var(--separator-color); } /* Contents */ div.header { border-bottom: 1px solid var(--separator-color); background-color: var(--page-background-color); background-image: none; } @media screen and (min-width: 1000px) { #doc-content > div > div.contents, .PageDoc > div.contents { display: flex; flex-direction: row-reverse; flex-wrap: nowrap; align-items: flex-start; } div.contents .textblock { min-width: 200px; flex-grow: 1; } } div.contents, div.header .title, div.header .summary { max-width: var(--content-maxwidth); } div.contents, div.header .title { line-height: initial; margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; } div.header .summary { margin: var(--spacing-medium) auto 0 auto; } div.headertitle { padding: 0; } div.header .title { font-weight: 600; font-size: 225%; padding: var(--spacing-medium) var(--spacing-large); word-break: break-word; } div.header .summary { width: auto; display: block; float: none; padding: 0 var(--spacing-large); } td.memSeparator { border-color: var(--separator-color); } span.mlabel { background: var(--primary-color); border: none; padding: 4px 9px; border-radius: 12px; margin-right: var(--spacing-medium); } span.mlabel:last-of-type { margin-right: 2px; } div.contents { padding: 0 var(--spacing-large); } div.contents p, div.contents li { line-height: var(--content-line-height); } div.contents div.dyncontent { margin: var(--spacing-medium) 0; } @media (prefers-color-scheme: dark) { html:not(.light-mode) div.contents div.dyncontent img, html:not(.light-mode) div.contents center img, html:not(.light-mode) div.contents > table img, html:not(.light-mode) div.contents div.dyncontent iframe, html:not(.light-mode) div.contents center iframe, html:not(.light-mode) div.contents table iframe, html:not(.light-mode) div.contents .dotgraph iframe { filter: brightness(89%) hue-rotate(180deg) invert(); } } html.dark-mode div.contents div.dyncontent img, html.dark-mode div.contents center img, html.dark-mode div.contents > table img, html.dark-mode div.contents div.dyncontent iframe, html.dark-mode div.contents center iframe, html.dark-mode div.contents table iframe, html.dark-mode div.contents .dotgraph iframe { filter: brightness(89%) hue-rotate(180deg) invert(); } h2.groupheader { border-bottom: 0px; color: var(--page-foreground-color); box-shadow: 100px 0 var(--page-background-color), -100px 0 var(--page-background-color), 100px 0.75px var(--separator-color), -100px 0.75px var(--separator-color), 500px 0 var(--page-background-color), -500px 0 var(--page-background-color), 500px 0.75px var(--separator-color), -500px 0.75px var(--separator-color), 900px 0 var(--page-background-color), -900px 0 var(--page-background-color), 900px 0.75px var(--separator-color), -900px 0.75px var(--separator-color), 1400px 0 var(--page-background-color), -1400px 0 var(--page-background-color), 1400px 0.75px var(--separator-color), -1400px 0.75px var(--separator-color), 1900px 0 var(--page-background-color), -1900px 0 var(--page-background-color), 1900px 0.75px var(--separator-color), -1900px 0.75px var(--separator-color); } blockquote { margin: 0 var(--spacing-medium) 0 var(--spacing-medium); padding: var(--spacing-small) var(--spacing-large); background: var(--blockquote-background); color: var(--blockquote-foreground); border-left: 0; overflow: visible; border-radius: var(--border-radius-medium); overflow: visible; position: relative; } blockquote::before, blockquote::after { font-weight: bold; font-family: serif; font-size: 360%; opacity: .15; position: absolute; } blockquote::before { content: "β€œ"; left: -10px; top: 4px; } blockquote::after { content: "”"; right: -8px; bottom: -25px; } blockquote p { margin: var(--spacing-small) 0 var(--spacing-medium) 0; } .paramname, .paramname em { font-weight: 600; color: var(--primary-dark-color); } .paramname > code { border: 0; } table.params .paramname { font-weight: 600; font-family: var(--font-family-monospace); font-size: var(--code-font-size); padding-right: var(--spacing-small); line-height: var(--table-line-height); } h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { text-shadow: 0 0 15px var(--primary-light-color); } .alphachar a { color: var(--page-foreground-color); } .dotgraph { max-width: 100%; overflow-x: scroll; } .dotgraph .caption { position: sticky; left: 0; } /* Wrap Graphviz graphs with the `interactive_dotgraph` class if `INTERACTIVE_SVG = YES` */ .interactive_dotgraph .dotgraph iframe { max-width: 100%; } /* Table of Contents */ div.contents .toc { max-height: var(--toc-max-height); min-width: var(--toc-width); border: 0; border-left: 1px solid var(--separator-color); border-radius: 0; background-color: var(--page-background-color); box-shadow: none; position: sticky; top: var(--toc-sticky-top); padding: 0 var(--spacing-large); margin: var(--spacing-small) 0 var(--spacing-large) var(--spacing-large); } div.toc h3 { color: var(--toc-foreground); font-size: var(--navigation-font-size); margin: var(--spacing-large) 0 var(--spacing-medium) 0; } div.toc li { padding: 0; background: none; line-height: var(--toc-font-size); margin: var(--toc-font-size) 0 0 0; } div.toc li::before { display: none; } div.toc ul { margin-top: 0 } div.toc li a { font-size: var(--toc-font-size); color: var(--page-foreground-color) !important; text-decoration: none; } div.toc li a:hover, div.toc li a.active { color: var(--primary-color) !important; } div.toc li a.aboveActive { color: var(--page-secondary-foreground-color) !important; } @media screen and (max-width: 999px) { div.contents .toc { max-height: 45vh; float: none; width: auto; margin: 0 0 var(--spacing-medium) 0; position: relative; top: 0; position: relative; border: 1px solid var(--separator-color); border-radius: var(--border-radius-medium); background-color: var(--toc-background); box-shadow: var(--box-shadow); } div.contents .toc.interactive { max-height: calc(var(--navigation-font-size) + 2 * var(--spacing-large)); overflow: hidden; } div.contents .toc > h3 { -webkit-tap-highlight-color: transparent; cursor: pointer; position: sticky; top: 0; background-color: var(--toc-background); margin: 0; padding: var(--spacing-large) 0; display: block; } div.contents .toc.interactive > h3::before { content: ""; width: 0; height: 0; border-left: 4px solid transparent; border-right: 4px solid transparent; border-top: 5px solid var(--primary-color); display: inline-block; margin-right: var(--spacing-small); margin-bottom: calc(var(--navigation-font-size) / 4); transform: rotate(-90deg); transition: transform var(--animation-duration) ease-out; } div.contents .toc.interactive.open > h3::before { transform: rotate(0deg); } div.contents .toc.interactive.open { max-height: 45vh; overflow: auto; transition: max-height 0.2s ease-in-out; } div.contents .toc a, div.contents .toc a.active { color: var(--primary-color) !important; } div.contents .toc a:hover { text-decoration: underline; } } /* Code & Fragments */ code, div.fragment, pre.fragment { border-radius: var(--border-radius-small); border: 1px solid var(--separator-color); overflow: hidden; } code { display: inline; background: var(--code-background); color: var(--code-foreground); padding: 2px 6px; } div.fragment, pre.fragment { margin: var(--spacing-medium) 0; padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); background: var(--fragment-background); color: var(--fragment-foreground); overflow-x: auto; } @media screen and (max-width: 767px) { div.fragment, pre.fragment { border-top-right-radius: 0; border-bottom-right-radius: 0; border-right: 0; } .contents > div.fragment, .textblock > div.fragment, .textblock > pre.fragment, .textblock > .tabbed > ul > li > div.fragment, .textblock > .tabbed > ul > li > pre.fragment, .contents > .doxygen-awesome-fragment-wrapper > div.fragment, .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment, .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > div.fragment, .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > pre.fragment { margin: var(--spacing-medium) calc(0px - var(--spacing-large)); border-radius: 0; border-left: 0; } .textblock li > .fragment, .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { margin: var(--spacing-medium) calc(0px - var(--spacing-large)); } .memdoc li > .fragment, .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); } .textblock ul, .memdoc ul { overflow: initial; } .memdoc > div.fragment, .memdoc > pre.fragment, dl dd > div.fragment, dl dd pre.fragment, .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); border-radius: 0; border-left: 0; } } code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { font-family: var(--font-family-monospace); font-size: var(--code-font-size) !important; } div.line:after { margin-right: var(--spacing-medium); } div.fragment .line, pre.fragment { white-space: pre; word-wrap: initial; line-height: var(--fragment-lineheight); } div.fragment span.keyword { color: var(--fragment-keyword); } div.fragment span.keywordtype { color: var(--fragment-keywordtype); } div.fragment span.keywordflow { color: var(--fragment-keywordflow); } div.fragment span.stringliteral { color: var(--fragment-token) } div.fragment span.comment { color: var(--fragment-comment); } div.fragment a.code { color: var(--fragment-link) !important; } div.fragment span.preprocessor { color: var(--fragment-preprocessor); } div.fragment span.lineno { display: inline-block; width: 27px; border-right: none; background: var(--fragment-linenumber-background); color: var(--fragment-linenumber-color); } div.fragment span.lineno a { background: none; color: var(--fragment-link) !important; } div.fragment > .line:first-child .lineno { box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); background-color: var(--fragment-linenumber-background) !important; } div.line { border-radius: var(--border-radius-small); } div.line.glow { background-color: var(--primary-light-color); box-shadow: none; } /* dl warning, attention, note, deprecated, bug, ... */ dl.bug dt a, dl.deprecated dt a, dl.todo dt a { font-weight: bold !important; } dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.post, dl.todo, dl.remark { padding: var(--spacing-medium); margin: var(--spacing-medium) 0; color: var(--page-background-color); overflow: hidden; margin-left: 0; border-radius: var(--border-radius-small); } dl.section dd { margin-bottom: 2px; } dl.warning, dl.attention { background: var(--warning-color); border-left: 8px solid var(--warning-color-dark); color: var(--warning-color-darker); } dl.warning dt, dl.attention dt { color: var(--warning-color-dark); } dl.note, dl.remark { background: var(--note-color); border-left: 8px solid var(--note-color-dark); color: var(--note-color-darker); } dl.note dt, dl.remark dt { color: var(--note-color-dark); } dl.todo { background: var(--todo-color); border-left: 8px solid var(--todo-color-dark); color: var(--todo-color-darker); } dl.todo dt a { color: var(--todo-color-dark) !important; } dl.bug dt a { color: var(--todo-color-dark) !important; } dl.bug { background: var(--bug-color); border-left: 8px solid var(--bug-color-dark); color: var(--bug-color-darker); } dl.bug dt a { color: var(--bug-color-dark) !important; } dl.deprecated { background: var(--deprecated-color); border-left: 8px solid var(--deprecated-color-dark); color: var(--deprecated-color-darker); } dl.deprecated dt a { color: var(--deprecated-color-dark) !important; } dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { margin-inline-start: 0px; } dl.invariant, dl.pre, dl.post { background: var(--invariant-color); border-left: 8px solid var(--invariant-color-dark); color: var(--invariant-color-darker); } dl.invariant dt, dl.pre dt, dl.post dt { color: var(--invariant-color-dark); } /* memitem */ div.memdoc, div.memproto, h2.memtitle { box-shadow: none; background-image: none; border: none; } div.memdoc { padding: 0 var(--spacing-medium); background: var(--page-background-color); } h2.memtitle, div.memitem { border: 1px solid var(--separator-color); box-shadow: var(--box-shadow); } h2.memtitle { box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); } div.memitem { transition: none; } div.memproto, h2.memtitle { background: var(--fragment-background); } h2.memtitle { font-weight: 500; font-size: var(--memtitle-font-size); font-family: var(--font-family-monospace); border-bottom: none; border-top-left-radius: var(--border-radius-medium); border-top-right-radius: var(--border-radius-medium); word-break: break-all; position: relative; } h2.memtitle:after { content: ""; display: block; background: var(--fragment-background); height: var(--spacing-medium); bottom: calc(0px - var(--spacing-medium)); left: 0; right: -14px; position: absolute; border-top-right-radius: var(--border-radius-medium); } h2.memtitle > span.permalink { font-size: inherit; } h2.memtitle > span.permalink > a { text-decoration: none; padding-left: 3px; margin-right: -4px; user-select: none; display: inline-block; margin-top: -6px; } h2.memtitle > span.permalink > a:hover { color: var(--primary-dark-color) !important; } a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { border-color: var(--primary-light-color); } div.memitem { border-top-right-radius: var(--border-radius-medium); border-bottom-right-radius: var(--border-radius-medium); border-bottom-left-radius: var(--border-radius-medium); overflow: hidden; display: block !important; } div.memdoc { border-radius: 0; } div.memproto { border-radius: 0 var(--border-radius-small) 0 0; overflow: auto; border-bottom: 1px solid var(--separator-color); padding: var(--spacing-medium); margin-bottom: -1px; } div.memtitle { border-top-right-radius: var(--border-radius-medium); border-top-left-radius: var(--border-radius-medium); } div.memproto table.memname { font-family: var(--font-family-monospace); color: var(--page-foreground-color); font-size: var(--memname-font-size); text-shadow: none; } div.memproto div.memtemplate { font-family: var(--font-family-monospace); color: var(--primary-dark-color); font-size: var(--memname-font-size); margin-left: 2px; text-shadow: none; } table.mlabels, table.mlabels > tbody { display: block; } td.mlabels-left { width: auto; } td.mlabels-right { margin-top: 3px; position: sticky; left: 0; } table.mlabels > tbody > tr:first-child { display: flex; justify-content: space-between; flex-wrap: wrap; } .memname, .memitem span.mlabels { margin: 0 } /* reflist */ dl.reflist { box-shadow: var(--box-shadow); border-radius: var(--border-radius-medium); border: 1px solid var(--separator-color); overflow: hidden; padding: 0; } dl.reflist dt, dl.reflist dd { box-shadow: none; text-shadow: none; background-image: none; border: none; padding: 12px; } dl.reflist dt { font-weight: 500; border-radius: 0; background: var(--code-background); border-bottom: 1px solid var(--separator-color); color: var(--page-foreground-color) } dl.reflist dd { background: none; } /* Table */ .contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname), .contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { display: inline-block; max-width: 100%; } .contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { margin-left: calc(0px - var(--spacing-large)); margin-right: calc(0px - var(--spacing-large)); max-width: calc(100% + 2 * var(--spacing-large)); } table.fieldtable, table.markdownTable tbody, table.doxtable tbody { border: none; margin: var(--spacing-medium) 0; box-shadow: 0 0 0 1px var(--separator-color); border-radius: var(--border-radius-small); } table.markdownTable, table.doxtable, table.fieldtable { padding: 1px; } table.doxtable caption { display: block; } table.fieldtable { border-collapse: collapse; width: 100%; } th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone, table.doxtable th { background: var(--tablehead-background); color: var(--tablehead-foreground); font-weight: 600; font-size: var(--page-font-size); } th.markdownTableHeadLeft:first-child, th.markdownTableHeadRight:first-child, th.markdownTableHeadCenter:first-child, th.markdownTableHeadNone:first-child, table.doxtable tr th:first-child { border-top-left-radius: var(--border-radius-small); } th.markdownTableHeadLeft:last-child, th.markdownTableHeadRight:last-child, th.markdownTableHeadCenter:last-child, th.markdownTableHeadNone:last-child, table.doxtable tr th:last-child { border-top-right-radius: var(--border-radius-small); } table.markdownTable td, table.markdownTable th, table.fieldtable td, table.fieldtable th, table.doxtable td, table.doxtable th { border: 1px solid var(--separator-color); padding: var(--spacing-small) var(--spacing-medium); } table.markdownTable td:last-child, table.markdownTable th:last-child, table.fieldtable td:last-child, table.fieldtable th:last-child, table.doxtable td:last-child, table.doxtable th:last-child { border-right: none; } table.markdownTable td:first-child, table.markdownTable th:first-child, table.fieldtable td:first-child, table.fieldtable th:first-child, table.doxtable td:first-child, table.doxtable th:first-child { border-left: none; } table.markdownTable tr:first-child td, table.markdownTable tr:first-child th, table.fieldtable tr:first-child td, table.fieldtable tr:first-child th, table.doxtable tr:first-child td, table.doxtable tr:first-child th { border-top: none; } table.markdownTable tr:last-child td, table.markdownTable tr:last-child th, table.fieldtable tr:last-child td, table.fieldtable tr:last-child th, table.doxtable tr:last-child td, table.doxtable tr:last-child th { border-bottom: none; } table.markdownTable tr, table.doxtable tr { border-bottom: 1px solid var(--separator-color); } table.markdownTable tr:last-child, table.doxtable tr:last-child { border-bottom: none; } .full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { display: block; } .full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { display: table; width: 100%; } table.fieldtable th { font-size: var(--page-font-size); font-weight: 600; background-image: none; background-color: var(--tablehead-background); color: var(--tablehead-foreground); } table.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit, .fieldtable td.fielddoc, .fieldtable th { border-bottom: 1px solid var(--separator-color); border-right: 1px solid var(--separator-color); } table.fieldtable tr:last-child td:first-child { border-bottom-left-radius: var(--border-radius-small); } table.fieldtable tr:last-child td:last-child { border-bottom-right-radius: var(--border-radius-small); } .memberdecls td.glow, .fieldtable tr.glow { background-color: var(--primary-light-color); box-shadow: none; } table.memberdecls { display: block; -webkit-tap-highlight-color: transparent; } table.memberdecls tr[class^='memitem'] { font-family: var(--font-family-monospace); font-size: var(--code-font-size); } table.memberdecls tr[class^='memitem'] .memTemplParams { font-family: var(--font-family-monospace); font-size: var(--code-font-size); color: var(--primary-dark-color); white-space: normal; } table.memberdecls .memItemLeft, table.memberdecls .memItemRight, table.memberdecls .memTemplItemLeft, table.memberdecls .memTemplItemRight, table.memberdecls .memTemplParams { transition: none; padding-top: var(--spacing-small); padding-bottom: var(--spacing-small); border-top: 1px solid var(--separator-color); border-bottom: 1px solid var(--separator-color); background-color: var(--fragment-background); } table.memberdecls .memTemplItemLeft, table.memberdecls .memTemplItemRight { padding-top: 2px; } table.memberdecls .memTemplParams { border-bottom: 0; border-left: 1px solid var(--separator-color); border-right: 1px solid var(--separator-color); border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; padding-bottom: var(--spacing-small); } table.memberdecls .memTemplItemLeft { border-radius: 0 0 0 var(--border-radius-small); border-left: 1px solid var(--separator-color); border-top: 0; } table.memberdecls .memTemplItemRight { border-radius: 0 0 var(--border-radius-small) 0; border-right: 1px solid var(--separator-color); padding-left: 0; border-top: 0; } table.memberdecls .memItemLeft { border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); border-left: 1px solid var(--separator-color); padding-left: var(--spacing-medium); padding-right: 0; } table.memberdecls .memItemRight { border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; border-right: 1px solid var(--separator-color); padding-right: var(--spacing-medium); padding-left: 0; } table.memberdecls .mdescLeft, table.memberdecls .mdescRight { background: none; color: var(--page-foreground-color); padding: var(--spacing-small) 0; } table.memberdecls .memItemLeft, table.memberdecls .memTemplItemLeft { padding-right: var(--spacing-medium); } table.memberdecls .memSeparator { background: var(--page-background-color); height: var(--spacing-large); border: 0; transition: none; } table.memberdecls .groupheader { margin-bottom: var(--spacing-large); } table.memberdecls .inherit_header td { padding: 0 0 var(--spacing-medium) 0; text-indent: -12px; color: var(--page-secondary-foreground-color); } table.memberdecls img[src="closed.png"], table.memberdecls img[src="open.png"], div.dynheader img[src="open.png"], div.dynheader img[src="closed.png"] { width: 0; height: 0; border-left: 4px solid transparent; border-right: 4px solid transparent; border-top: 5px solid var(--primary-color); margin-top: 8px; display: block; float: left; margin-left: -10px; transition: transform var(--animation-duration) ease-out; } table.memberdecls img { margin-right: 10px; } table.memberdecls img[src="closed.png"], div.dynheader img[src="closed.png"] { transform: rotate(-90deg); } .compoundTemplParams { font-family: var(--font-family-monospace); color: var(--primary-dark-color); font-size: var(--code-font-size); } @media screen and (max-width: 767px) { table.memberdecls .memItemLeft, table.memberdecls .memItemRight, table.memberdecls .mdescLeft, table.memberdecls .mdescRight, table.memberdecls .memTemplItemLeft, table.memberdecls .memTemplItemRight, table.memberdecls .memTemplParams { display: block; text-align: left; padding-left: var(--spacing-large); margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); border-right: none; border-left: none; border-radius: 0; white-space: normal; } table.memberdecls .memItemLeft, table.memberdecls .mdescLeft, table.memberdecls .memTemplItemLeft { border-bottom: 0; padding-bottom: 0; } table.memberdecls .memTemplItemLeft { padding-top: 0; } table.memberdecls .mdescLeft { margin-bottom: calc(0px - var(--page-font-size)); } table.memberdecls .memItemRight, table.memberdecls .mdescRight, table.memberdecls .memTemplItemRight { border-top: 0; padding-top: 0; padding-right: var(--spacing-large); overflow-x: auto; } table.memberdecls tr[class^='memitem']:not(.inherit) { display: block; width: calc(100vw - 2 * var(--spacing-large)); } table.memberdecls .mdescRight { color: var(--page-foreground-color); } table.memberdecls tr.inherit { visibility: hidden; } table.memberdecls tr[style="display: table-row;"] { display: block !important; visibility: visible; width: calc(100vw - 2 * var(--spacing-large)); animation: fade .5s; } @keyframes fade { 0% { opacity: 0; max-height: 0; } 100% { opacity: 1; max-height: 200px; } } } /* Horizontal Rule */ hr { margin-top: var(--spacing-large); margin-bottom: var(--spacing-large); height: 1px; background-color: var(--separator-color); border: 0; } .contents hr { box-shadow: 100px 0 var(--separator-color), -100px 0 var(--separator-color), 500px 0 var(--separator-color), -500px 0 var(--separator-color), 900px 0 var(--separator-color), -900px 0 var(--separator-color), 1400px 0 var(--separator-color), -1400px 0 var(--separator-color), 1900px 0 var(--separator-color), -1900px 0 var(--separator-color); } .contents img, .contents .center, .contents center, .contents div.image object { max-width: 100%; overflow: auto; } @media screen and (max-width: 767px) { .contents .dyncontent > .center, .contents > center { margin-left: calc(0px - var(--spacing-large)); margin-right: calc(0px - var(--spacing-large)); max-width: calc(100% + 2 * var(--spacing-large)); } } /* Directories */ div.directory { border-top: 1px solid var(--separator-color); border-bottom: 1px solid var(--separator-color); width: auto; } table.directory { font-family: var(--font-family); font-size: var(--page-font-size); font-weight: normal; width: 100%; } table.directory td.entry, table.directory td.desc { padding: calc(var(--spacing-small) / 2) var(--spacing-small); line-height: var(--table-line-height); } table.directory tr.even td:last-child { border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; } table.directory tr.even td:first-child { border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); } table.directory tr.even:last-child td:last-child { border-radius: 0 var(--border-radius-small) 0 0; } table.directory tr.even:last-child td:first-child { border-radius: var(--border-radius-small) 0 0 0; } table.directory td.desc { min-width: 250px; } table.directory tr.even { background-color: var(--odd-color); } table.directory tr.odd { background-color: transparent; } .icona { width: auto; height: auto; margin: 0 var(--spacing-small); } .icon { background: var(--primary-color); border-radius: var(--border-radius-small); font-size: var(--page-font-size); padding: calc(var(--page-font-size) / 5); line-height: var(--page-font-size); transform: scale(0.8); height: auto; width: var(--page-font-size); user-select: none; } .iconfopen, .icondoc, .iconfclosed { background-position: center; margin-bottom: 0; height: var(--table-line-height); } .icondoc { filter: saturate(0.2); } @media screen and (max-width: 767px) { div.directory { margin-left: calc(0px - var(--spacing-large)); margin-right: calc(0px - var(--spacing-large)); } } @media (prefers-color-scheme: dark) { html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { filter: hue-rotate(180deg) invert(); } } html.dark-mode .iconfopen, html.dark-mode .iconfclosed { filter: hue-rotate(180deg) invert(); } /* Class list */ .classindex dl.odd { background: var(--odd-color); border-radius: var(--border-radius-small); } .classindex dl.even { background-color: transparent; } /* Class Index Doxygen 1.8 */ table.classindex { margin-left: 0; margin-right: 0; width: 100%; } table.classindex table div.ah { background-image: none; background-color: initial; border-color: var(--separator-color); color: var(--page-foreground-color); box-shadow: var(--box-shadow); border-radius: var(--border-radius-large); padding: var(--spacing-small); } div.qindex { background-color: var(--odd-color); border-radius: var(--border-radius-small); border: 1px solid var(--separator-color); padding: var(--spacing-small) 0; } /* Footer and nav-path */ #nav-path { width: 100%; } #nav-path ul { background-image: none; background: var(--page-background-color); border: none; border-top: 1px solid var(--separator-color); border-bottom: 1px solid var(--separator-color); border-bottom: 0; box-shadow: 0 0.75px 0 var(--separator-color); font-size: var(--navigation-font-size); } img.footer { width: 60px; } .navpath li.footer { color: var(--page-secondary-foreground-color); } address.footer { color: var(--page-secondary-foreground-color); margin-bottom: var(--spacing-large); } #nav-path li.navelem { background-image: none; display: flex; align-items: center; } .navpath li.navelem a { text-shadow: none; display: inline-block; color: var(--primary-color) !important; } .navpath li.navelem b { color: var(--primary-dark-color); font-weight: 500; } li.navelem { padding: 0; margin-left: -8px; } li.navelem:first-child { margin-left: var(--spacing-large); } li.navelem:first-child:before { display: none; } #nav-path li.navelem:after { content: ''; border: 5px solid var(--page-background-color); border-bottom-color: transparent; border-right-color: transparent; border-top-color: transparent; transform: translateY(-1px) scaleY(4.2); z-index: 10; margin-left: 6px; } #nav-path li.navelem:before { content: ''; border: 5px solid var(--separator-color); border-bottom-color: transparent; border-right-color: transparent; border-top-color: transparent; transform: translateY(-1px) scaleY(3.2); margin-right: var(--spacing-small); } .navpath li.navelem a:hover { color: var(--primary-color); } /* Scrollbars for Webkit */ #nav-tree::-webkit-scrollbar, div.fragment::-webkit-scrollbar, pre.fragment::-webkit-scrollbar, div.memproto::-webkit-scrollbar, .contents center::-webkit-scrollbar, .contents .center::-webkit-scrollbar, .contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar, div.contents .toc::-webkit-scrollbar, .contents .dotgraph::-webkit-scrollbar, .contents .tabs-overview-container::-webkit-scrollbar { background: transparent; width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); } #nav-tree::-webkit-scrollbar-thumb, div.fragment::-webkit-scrollbar-thumb, pre.fragment::-webkit-scrollbar-thumb, div.memproto::-webkit-scrollbar-thumb, .contents center::-webkit-scrollbar-thumb, .contents .center::-webkit-scrollbar-thumb, .contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-thumb, div.contents .toc::-webkit-scrollbar-thumb, .contents .dotgraph::-webkit-scrollbar-thumb, .contents .tabs-overview-container::-webkit-scrollbar-thumb { background-color: transparent; border: var(--webkit-scrollbar-padding) solid transparent; border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); background-clip: padding-box; } #nav-tree:hover::-webkit-scrollbar-thumb, div.fragment:hover::-webkit-scrollbar-thumb, pre.fragment:hover::-webkit-scrollbar-thumb, div.memproto:hover::-webkit-scrollbar-thumb, .contents center:hover::-webkit-scrollbar-thumb, .contents .center:hover::-webkit-scrollbar-thumb, .contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody:hover::-webkit-scrollbar-thumb, div.contents .toc:hover::-webkit-scrollbar-thumb, .contents .dotgraph:hover::-webkit-scrollbar-thumb, .contents .tabs-overview-container:hover::-webkit-scrollbar-thumb { background-color: var(--webkit-scrollbar-color); } #nav-tree::-webkit-scrollbar-track, div.fragment::-webkit-scrollbar-track, pre.fragment::-webkit-scrollbar-track, div.memproto::-webkit-scrollbar-track, .contents center::-webkit-scrollbar-track, .contents .center::-webkit-scrollbar-track, .contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-track, div.contents .toc::-webkit-scrollbar-track, .contents .dotgraph::-webkit-scrollbar-track, .contents .tabs-overview-container::-webkit-scrollbar-track { background: transparent; } #nav-tree::-webkit-scrollbar-corner { background-color: var(--side-nav-background); } #nav-tree, div.fragment, pre.fragment, div.memproto, .contents center, .contents .center, .contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, div.contents .toc { overflow-x: auto; overflow-x: overlay; } #nav-tree { overflow-x: auto; overflow-y: auto; overflow-y: overlay; } /* Scrollbars for Firefox */ #nav-tree, div.fragment, pre.fragment, div.memproto, .contents center, .contents .center, .contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, div.contents .toc, .contents .dotgraph, .contents .tabs-overview-container { scrollbar-width: thin; } /* Optional Dark mode toggle button */ doxygen-awesome-dark-mode-toggle { display: inline-block; margin: 0 0 0 var(--spacing-small); padding: 0; width: var(--searchbar-height); height: var(--searchbar-height); background: none; border: none; border-radius: var(--searchbar-height); vertical-align: middle; text-align: center; line-height: var(--searchbar-height); font-size: 22px; display: flex; align-items: center; justify-content: center; user-select: none; cursor: pointer; } doxygen-awesome-dark-mode-toggle > svg { transition: transform var(--animation-duration) ease-in-out; } doxygen-awesome-dark-mode-toggle:active > svg { transform: scale(.5); } doxygen-awesome-dark-mode-toggle:hover { background-color: rgba(0,0,0,.03); } html.dark-mode doxygen-awesome-dark-mode-toggle:hover { background-color: rgba(0,0,0,.18); } /* Optional fragment copy button */ .doxygen-awesome-fragment-wrapper { position: relative; } doxygen-awesome-fragment-copy-button { opacity: 0; background: var(--fragment-background); width: 28px; height: 28px; position: absolute; right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); border: 1px solid var(--fragment-foreground); cursor: pointer; border-radius: var(--border-radius-small); display: flex; justify-content: center; align-items: center; } .doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { opacity: .28; } doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { opacity: 1 !important; } doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { transform: scale(.91); } doxygen-awesome-fragment-copy-button svg { fill: var(--fragment-foreground); width: 18px; height: 18px; } doxygen-awesome-fragment-copy-button.success svg { fill: rgb(14, 168, 14); } doxygen-awesome-fragment-copy-button.success { border-color: rgb(14, 168, 14); } @media screen and (max-width: 767px) { .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { right: 0; } } /* Optional paragraph link button */ a.anchorlink { font-size: 90%; margin-left: var(--spacing-small); color: var(--page-foreground-color) !important; text-decoration: none; opacity: .15; display: none; transition: opacity var(--animation-duration) ease-in-out, color var(--animation-duration) ease-in-out; } a.anchorlink svg { fill: var(--page-foreground-color); } h3 a.anchorlink svg, h4 a.anchorlink svg { margin-bottom: -3px; margin-top: -4px; } a.anchorlink:hover { opacity: .45; } h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { display: inline-block; } /* Optional tab feature */ .tabbed > ul { padding-inline-start: 0px; margin: 0; padding: var(--spacing-small) 0; } .tabbed > ul > li { display: none; } .tabbed > ul > li.selected { display: block; } .tabs-overview-container { overflow-x: auto; display: block; overflow-y: visible; } .tabs-overview { border-bottom: 1px solid var(--separator-color); display: flex; flex-direction: row; } @media screen and (max-width: 767px) { .tabs-overview-container { margin: 0 calc(0px - var(--spacing-large)); } .tabs-overview { padding: 0 var(--spacing-large) } } .tabs-overview button.tab-button { color: var(--page-foreground-color); margin: 0; border: none; background: transparent; padding: calc(var(--spacing-large) / 2) 0; display: inline-block; font-size: var(--page-font-size); cursor: pointer; box-shadow: 0 1px 0 0 var(--separator-color); position: relative; -webkit-tap-highlight-color: transparent; } .tabs-overview button.tab-button .tab-title::before { display: block; content: attr(title); font-weight: 600; height: 0; overflow: hidden; visibility: hidden; } .tabs-overview button.tab-button .tab-title { float: left; white-space: nowrap; font-weight: normal; padding: calc(var(--spacing-large) / 2) var(--spacing-large); border-radius: var(--border-radius-medium); transition: background-color var(--animation-duration) ease-in-out, font-weight var(--animation-duration) ease-in-out; } .tabs-overview button.tab-button:not(:last-child) .tab-title { box-shadow: 8px 0 0 -7px var(--separator-color); } .tabs-overview button.tab-button:hover .tab-title { background: var(--separator-color); box-shadow: none; } .tabs-overview button.tab-button.active .tab-title { font-weight: 600; } .tabs-overview button.tab-button::after { content: ''; display: block; position: absolute; left: 0; bottom: 0; right: 0; height: 0; width: 0%; margin: 0 auto; border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; background-color: var(--primary-color); transition: width var(--animation-duration) ease-in-out, height var(--animation-duration) ease-in-out; } .tabs-overview button.tab-button.active::after { width: 100%; box-sizing: border-box; height: 3px; } /* Navigation Buttons */ .section_buttons:not(:empty) { margin-top: calc(var(--spacing-large) * 3); } .section_buttons table.markdownTable { display: block; width: 100%; } .section_buttons table.markdownTable tbody { display: table !important; width: 100%; box-shadow: none; border-spacing: 10px; } .section_buttons table.markdownTable td { padding: 0; } .section_buttons table.markdownTable th { display: none; } .section_buttons table.markdownTable tr.markdownTableHead { border: none; } .section_buttons tr th, .section_buttons tr td { background: none; border: none; padding: var(--spacing-large) 0 var(--spacing-small); } .section_buttons a { display: inline-block; border: 1px solid var(--separator-color); border-radius: var(--border-radius-medium); color: var(--page-secondary-foreground-color) !important; text-decoration: none; transition: color var(--animation-duration) ease-in-out, background-color var(--animation-duration) ease-in-out; } .section_buttons a:hover { color: var(--page-foreground-color) !important; background-color: var(--odd-color); } .section_buttons tr td.markdownTableBodyLeft a { padding: var(--spacing-medium) var(--spacing-large) var(--spacing-medium) calc(var(--spacing-large) / 2); } .section_buttons tr td.markdownTableBodyRight a { padding: var(--spacing-medium) calc(var(--spacing-large) / 2) var(--spacing-medium) var(--spacing-large); } .section_buttons tr td.markdownTableBodyLeft a::before, .section_buttons tr td.markdownTableBodyRight a::after { color: var(--page-secondary-foreground-color) !important; display: inline-block; transition: color .08s ease-in-out, transform .09s ease-in-out; } .section_buttons tr td.markdownTableBodyLeft a::before { content: 'γ€ˆ'; padding-right: var(--spacing-large); } .section_buttons tr td.markdownTableBodyRight a::after { content: '〉'; padding-left: var(--spacing-large); } .section_buttons tr td.markdownTableBodyLeft a:hover::before { color: var(--page-foreground-color) !important; transform: translateX(-3px); } .section_buttons tr td.markdownTableBodyRight a:hover::after { color: var(--page-foreground-color) !important; transform: translateX(3px); } @media screen and (max-width: 450px) { .section_buttons a { width: 100%; box-sizing: border-box; } .section_buttons tr td:nth-of-type(1).markdownTableBodyLeft a { border-radius: var(--border-radius-medium) 0 0 var(--border-radius-medium); border-right: none; } .section_buttons tr td:nth-of-type(2).markdownTableBodyRight a { border-radius: 0 var(--border-radius-medium) var(--border-radius-medium) 0; } } libjwt-3.3.3/doxygen/footer.html000066400000000000000000000012711517612317300166630ustar00rootroot00000000000000 libjwt-3.3.3/doxygen/header.html000066400000000000000000000070721517612317300166220ustar00rootroot00000000000000 $projectname: $title $title $treeview $search $mathjax $darkmode $extrastylesheet
$projectname $projectnumber
$projectbrief
$projectbrief
$searchbox
$searchbox
libjwt-3.3.3/doxygen/libjwt.css000066400000000000000000000005751517612317300165120ustar00rootroot00000000000000a.button { background-color: #EFF4FF; border: none; color: #2557D6; padding: 10px 20px; text-align: center; text-decoration: none; display: inline-block; margin-right: 13px; margin-left: -1px; margin-bottom: 10px; border-radius: 100px; cursor: pointer; transition: box-shadow 0.5s ease; } a.button:hover { box-shadow: inset 0em 0em 0em 10em #DCE6FF; } libjwt-3.3.3/doxygen/maclara-pill.svg000066400000000000000000000024471517612317300175640ustar00rootroot00000000000000Sponsored by: maClara, LLCSponsored bymaClara, LLClibjwt-3.3.3/doxygen/mainpage.dox000066400000000000000000000057551517612317300170070ustar00rootroot00000000000000@mainpage Welcome to LibJWT > [!WARNING] > Version 3 of LibJWT is a complete overhaul of the code. Please see documentation for usage. @section standards \emoji :bulb: Supported Standards Standard | RFC | Description -------- | :--------: | ---------------------- ``JWS`` | @rfc{7515} | JSON Web Signature ``JWE`` | @rfc{7516} | JSON Web Encryption ``JWK`` | @rfc{7517} | JSON Web Keys and Sets ``JWA`` | @rfc{7518} | JSON Web Algorithms ``JWT`` | @rfc{7519} | JSON Web Token > [!NOTE] > Throughout this documentation you will see links such as the ones > above to RFC documents. These are relevant to that particular part of the > library and are helpful to understand some of the specific standards that > shaped the development of LibJWT. @section building \emoji :construction: Build Prerequisites @subsection req Required - [JANSSON](https://github.com/akheron/jansson) (>= 2.0) - [CMake](https://cmake.org) (>= 3.7) @subsection req_crypto Crypto support - OpenSSL (>= 3.0.0) - GnuTLS (>= 3.6.0) - MbedTLS (>= 3.6.0) @note OpenSSL is required and used for JWK(S) operations. @subsection crypto_support Algorithm support matrix JWS Algorithm ``alg`` | OpenSSL | GnuTLS | MbedTLS :---------------------------- | :------------------------ | :------------------------ | :------------------------ ``HS256`` ``HS384`` ``HS512`` | \emoji :white_check_mark: | \emoji :white_check_mark: | \emoji :white_check_mark: ``ES256`` ``ES384`` ``ES512`` | \emoji :white_check_mark: | \emoji :white_check_mark: | \emoji :white_check_mark: ``RS256`` ``RS384`` ``RS512`` | \emoji :white_check_mark: | \emoji :white_check_mark: | \emoji :white_check_mark: ``EdDSA`` using ``ED25519`` | \emoji :white_check_mark: | \emoji :white_check_mark: | \emoji :x: ``EdDSA`` using ``ED448`` | \emoji :white_check_mark: | \emoji :white_check_mark: ``>= 3.8.8`` | \emoji :x: ``PS256`` ``PS384`` ``PS512`` | \emoji :white_check_mark: | \emoji :white_check_mark: | \emoji :white_check_mark:* ``ES256K`` | \emoji :white_check_mark: | \emoji :x: | \emoji :white_check_mark: ``*`` RSASSA-PSS support in MbedTLS depends on [TF-PSA-Ctypto#154](https://github.com/Mbed-TLS/TF-PSA-Crypto/pull/154) @subsection optional Optional - [Check Library](https://github.com/libcheck/check/issues) (>= 0.9.10) for unit testing - [Doxygen](https://www.doxygen.nl) (>= 1.13.0) for documentation @section docs \emoji :open_book: Docs and Source \emoji :link: [Current Docs](https://libjwt.io) \emoji :link: [Legacy Docs v2.1.1](https://libjwt.io/stable) \emoji :link: [GitHub Repo](https://github.com/benmcollins/libjwt) @section prebuilt \emoji :package: Pre-built Packages LibJWT is available in most Linux distributions as well as through [Homebrew](https://formulae.brew.sh/formula/libjwt#default) for Linux, macOS, and Windows. @section instructions \emoji :hammer: Build Instructions @subsection cmake With CMake: @code{.sh} $ mkdir build $ cd build $ cmake .. $ make @endcode libjwt-3.3.3/images/000077500000000000000000000000001517612317300142665ustar00rootroot00000000000000libjwt-3.3.3/images/LibJWT-800x152.png000066400000000000000000002161521517612317300170230ustar00rootroot00000000000000‰PNG  IHDR ’Ήΰ©&gAMA± όa cHRMz&€„ϊ€θu0κ`:˜pœΊQ<„eXIfMM*JR(‡iZ``    ’‘Aέ§ pHYsΔΔ•+ΚiTXtXML:com.adobe.xmp 96 2 96 1 800 1 162 gO₯@IDATxμ½ €ΩYί{ͺκn}{“Z­­Υ’Z»Fš}Ə=W&,66O€€ρsVΘ β BήγΙ{@ΰ%ΔKpl‡„`l fo³Zi$–Ρ’ZK«[έκυU•ίάΎ­ξΎUWjI3#ΝΤ™iέ{«ΞϊΥ©sΎω6c’”P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B„  $H(P ‘@B…p^H~7Rΰwκ‘tKG%㷍§ΓL*)›lhœο;YΓ§η>ρ}S2Ζ)z^Xrψ,—L©-ΚEΏ­ZO—?τ{{*΅'W $H(P ‘@B„  Όq(9Οϊ³€·₯Ϊ’ξ0™piոݞγ.3Ύι ³Ω1aŸηΉνahΑFŽbΉ0 "ŽΎ@\> <Œcψ4E.=ΎWƒp<ΝiΧ5ΗΉvήƒΛΎ †ω~₯u¬:φ;Pΰ{’ $H(P ‘@B„  Όξ)π† Ÿέ½3S-O/Eͺ±-πƒ{Ηy0ε:;yκΛv)ZΗI‡Ζ€ H©‡€Μϋγ—\ΨkΤtωΗ‘ [mg†k•0 «1Sd§Ψε00‡Œξ5~°Ώκ…/·šΦ‘μ>T~έΟΌd€  $H(P ‘@B„oH Ό‘ΰΑωτ/o]ζkθ»χ))άPX!Ί˜iπ„BπύLšΙiߌOfbΚ7žλ˜ ΧGΖͺ¦R M•ο])32^΅ω)ΧδsY½,mΖΘ/β¦SŽYζ™eδs)ίΒύ4b]χ$4©= ͎πγL†ϋ]ίμΡμχή±ϊ₯c—ΙΓν$%H(P ‘@B„  $Έσ)π† H:Ϊ*¦²# ‚wΐΙΏ—ΗvS]ˆ4΄ϋότ6η’ξ&xέS ·—3'ΫΓαDX.xΣDTXC‚ŠΈ©L2ΥT[Ω)…Ή3ΕΑΡ;¬c‹$%H(PΰU‘ΐC™tρΜς¬η…/ٝVωkΆΉ›zZΦdάtjΪ©R6εϊA:xΪρN5Ίι¬ηL 0cΤεΏ*IΉc)πΊ x˜–·‡σ# Ꝃ―Τ«$IΗΨd`ž˜6GΟ­ύ†€ «‘T\Θ~£%λZ Ωpθϊͺ΄R™5ΩL‘Š₯<οxS»ypk«56ΗυωΖ‹ζΜΕ²΅ρ@Τ¬€ό–΅Yσθ=mφz©X‰‡Τ΅tτΕ’Ia rς\ΩͺrIuKϊW’Έ¨ n™ k9μF²Ž•Ž©―2nghƒ`˜ΏΒ¨ύSE·π•ˆά±ο`ρΧ!6―Θnς2ξn”*wZ•Κ0,σ~Λ0ΜCΗ2͐[Έ··’Ι|μΔ‰ΡΓόN6λΧαDεΑ³!υυ™\‹ŸωΩΐ€Ύ››)x2εZŽΔ‘zœJxε7ΖΟLΥωΪΑJC=Ι…„u €κ_ξΤΟίύΉ0εoG΅κGy!ήNθ’DαΚΈoŽ-θC†γΓόIβΑέ_A![ x$μώΊ2%U+I"jd©bRψ3jQΰ ‚ Uh(YbΙs‚ί2,§mSh(>ŒyΙ­zW6ν™%ν΄Η=–‡Ά·š"yXΖ1t?t²@[Ψ•PO ,²υ.©Vmžƒ'ŠV%LεzPΧB³’φ~²χζΒό_~ς_nωΔtΙϊ‡~ν€N’”P ‘ΐkH–V³:tBΌκ±9λΤ@I ΐLbε9ηΊαΏΧΗ“|&H(p{S`σf“-·|/|Ι?d1z€e*kW*yθ ΒΗ7υε?6Ω?ύεA8iΆ’ž΅½/ΗR]ΰ”ΰΚχ=HjΎό©Ήρ?N]\ϊΥΔF€ώt’Ο„―>ͺγ{Ž£Β9+Ε‚~8n95ξHν!I  άz Έ»v·Ώ fwiΆΝ©dγg ŠΊε{%§2YΔχeιψq«zτ†@†Σ-§<σΣ=œ‘ZΜP©¬cޚςƒwʟΌ8½σ'ηr&œžφJA5^Z‹ΓœJΥM•0ρλή­ΞIw(ξHς_>Ίygʜ{‚θο°½―σ?³~ΈΏhU›€b%)|»•JθMΖζή¬y`k‡΅΅ πxώ₯)l5<3 s―$tyΐ’‘ΈΤ$ΙPήΛ؁ȓ•μB $9Q ’zΘΕξΡ3%ϋ]ε*/;Ω†θΎΔ8ͺW_έ7aAŒΐ„ΠϊUλ5«υ+IGξߚ·κ^O˜4η†ΚΦ]εj–co"ΙΝyκ’ΑόσΰΆΌ΅AšΣIDφοC/μ-ωž+ŸώΔξMŸψΰξν ’ ΌΑ( ύζΙα\―oά₯Ίη;U$–~…«κ³π; 8hΰ”LXΔ—π6lœΌκN χόlθκ;λΛ:A€ ¬€C7ε‡ ž―3 ?LΉ©`Θ­d<δ­lΰ:‰NΌΪεiwTŒOC›Ρ%ήXW7.]Ϊ™n©Γ Rfτ+eΗ‡rX‡=§šN;n˜ρ[όΡcΗ — Ξ<†i[ww»Ι”zόT˜ (Ÿ©:• s ^޸錩YΧχΗ_(^ όΝΔ_rϊ–·4iwIΚ+WU§d˜'&•kIϋ//ΐ“ΝοίbŸζφ5ν˜¬ΣεWΛΎ­}{†U,^¬¬\ι.ρ¦{έ΄ίκΰΡgœϊs™λž[Ν{ζ»ζ·Wζ“9WŒ˜λκ“ζ8ΡuΒμΪΉίι djg˜ο†ι]›οW“ήη|”λΎ¦`°‘Ίx±½3(šεX&¬ gϋ…“ώ¦Lΰv§ΤΚΓΝσ’ε (:^0m²mS¦ m[žβπρε”Wν/§³ǏOŽΎcΡ5v)»κζ4?Ρ’¨¦*Ž―u(“ ]―ΚΌε^9¬ ₯σ¨4ιΦ ―΅5Ρίϊ©ν°.5:T8/…ξ›œ΄ϋπ₯ζΨ訡γ˜›ͺYόt`ͺ}°RύσJ&? 4RΰŽ ΈΣν*ϊ…8 x^ {4ͺ%8tͺ`„ΌJI-ͺwoRΩaΘ¦‚ΕΦΊΡ}ωl ιGΖ¬[Eΰr’μ;$­!Ή€!²ΝΠ›%‰Δ(γΛ’†GˆeH+δ K •Ις KMJκc“΅ΆΧ,ΟΨ> £ΥΡV‹ύ‘Ά€Ύuδ4+#RέAr Υ-©­μJ™Gξn³}ξΓ;Φs€’*l‰€•Όo­^–ΤfΰΡ p ‘΄FΰH6$RίΈξΫ’—Kί^tΛ–ύγ=Ÿψθ–Pφ Ÿύ{»ˆ1’€„o ŒκjI·nκΌ0yΨ©2―qΕ jΘkVπyΩ}Φ$!όo…‚d›s3ύβΞΚ!„(:•Όή‘£s/t«,Wš y)ƒ΄λ[=θT΅μώΎηUUΙξ#~³ŠΧςΪ2m·σŒs…{9»ώy'0λ±Β+„Υ° σX­VΔG»°h~ 80λL9Ÿlk3Ώ?9iBfS!5Ύnσ£0Μχ Γ.Γ.A,•jΕ·εƒΐΟσx:ΰΠόξΝζΧ7')Όfknό²|ωςΦLK᧝0ψNywRn·ο)'τ—”|χ/ޚ3ΏωTќΉΡϊΕ\žΌ/¬8dμ9‚ΦΤΆš7ηΙξϋΝWΏ’ͺξG9x{ BŽͺ‚² VSΛά Υ+Χξ²Aς) ^Φ1Zά|NJ²κ»Ψ+ΙΙ#˜Ϋ%ΗΗδΨ€υvΎ“₯†ι7ψ•ξnσ?‡‡Νkα&ήΩάΥΥξΆ·]<~+4yυ’ν<ΔΥΌΞmΌΆό@ˆ˜y°ru?σˆ΅‰Φη¦θ©KFΪΆ6z¦œž:„τdˆ,:$ΈειςεΦe-&όhψζL%τM‘S’Š ΔΒͺŸͺΊn(Ιρfκ©LOι6ηΝ1ݺю\>±€5ΫZ^C‚U‘ƒ&‰1=ƒ.Όέގœ± :Yx·ώ›₯2S.χίD?λ5%Ÿ― άdχn“Ϊd6?V J?γΈξ;xσ Β<Ž#y Š“’˜σ:`@= { Ž‘`ΔΜO’~%CτZ¬Š”ŒΛ7 nΥ‘ ψπ-`)ΑΤˎCͺ\β28$qPω+\λΖS•‚”C«šl<ͺάΤ}½s*cϋΒg§ ΛySΥ3ΕόΨΊ.gοΛΓ• γΟ α9 ΆG±¬ΤΠΔ‰¬UέRmϊ.iŽ‹ΪSυnΖ&»ΖKϊs‰ˆl^ސa|n&eξe‘ωLyό“»7f―ιύϊ·ν~ς5=‘ͺυ>ω7‘ΐ«@‘R₯˜+»Ζνδ½YΑ›j­ΏCυΨί–?©>Ψ| ›kνί«ίžέ„αλυσ²Γ7+gΐτrŽPokα'-–—΅d²Y/$ύΝΪ*Βwσο6_J‹{yœe!!;ηέN#<»<ΞΦ՞Κ]¬ΊΥ˜Ι5-ΙWŸΠυLφΒ …μ foΜd­ΡΠ^uœΑΐχŠ™αW†IΏΪrγ· +ZWζ2Α[Ω=ί v^γ>θ νλiAηλ—>­ϊ‘ψώvήΫMδ;€_C?μΦχ3K&&ςΉ Εεj€TCU‹ΈΰL‘²!Ο*TΏ[k½y.š7φΉθY…³07ΫώT:]M{•2bάϊÏθmxa΅Bσ y–?iΒΡUNΉΛQ°~ΙΛΘΰn1­κ•'Ÿ―/ άφδvχ-I©ΑLΦΤ5Z@₯~τ v/γϊVξiCc)Ω]ΘΛ”ήTα”k[Ω~θ^)‚\πN#5ΡoII$π(’ ΉΘΥΠ»< 3_²ε­]Χ”Oλl7d’A‰R ¦Ύ"tδi5-©]©] yΡ’:–ΝΓ?½΄#/V’œΘΈ] fp€&M‘τ"Oy΅/… υOΰH©|]ΖS—Ž€-¨YΩρHϊ!ιŽάχΦΫΠŸ*XͺΦ}/υζ]Χύ.Š=pΜϋ-hω{?Ά» Ν$)‘ΐλšΈΑυΟΚhΑΌšΙΑ+Lθ9.6 +–^Π¨„DfF<.GT©7Ξ5)Ηyu)’VΗΘ$qFC™¦θΠΐψά«οΓ±Ηίbο€td%\\Wq«½+y=© Τ}@iMD¨ΆΈ}N*θ£ώƒ7Z57Ωƒ3v1ΗψEœ†γœτύ`ίψΈ™ZΥ†`Ξσ›Ο·HςέμE§ ]byΥζ°Ό8'Zή” ΓŸζ½‡έ’τώOπA !”ΚΖ™ ;Γ%ό-ƒ”6$€œλ]-Ξ}€Pωύ¨j™ΙVsَφΝ†9v΅ΜβΏI܌€  υΈ_ΊΨσ’]CC…#=Ωγˆ'ι­ωΜDšΫwη΄:™›0Ε…β¬ΟρŒ7Έ¦ q¬ _LyΞSΣΌCΕ&#šΫ^ςύLΫ€|κ£οa3T&~4+—ΉύηΛΨy”­'*I"<–{1τ²ηXΓ.Ζ_ŒΊ’•Zΐ”KŠP³‘ΰ ⡐tCφ’RHεJΧex.•,INŠœ]ΚξT«t¬$0 »1ύς^Ε‰Kννε³ jXΠQ}Šγ![MΨ›δdLN½ͺ[ΐ%W¬6bz(Ιψό>°ϊϋκ«Κ£–ΤΘœ3€Ι‰UωbŒylOT^εΡKωκKˆκλ$ξˆ Η¦Ν‹Έ~›’ϋ6η͎T/§„ ™Ιhϊ?ς+'،Ι? ^§@u"…CžWq!cΒ›†²CmεmΧΚ[ΚSUS§*'•εΕ³ usVΚΉ3 •δC΄UrεNΔΕΘγ•’œ+2ͺK@DI.€Ÿ-ZP#υ©UHlV0”G6J:_~v υ―ΠφιΤ…’U“ a‹ IΝ(>Δ]ˆB•«ίU؈D]Βe―•ˆpoαόΧφM6JΑχ΅)0b—ŸO°YάΙέ›vŸ0'ώ:ίτ’f;Ÿό“Pΰ6£@v²;νζ ΣΐϋύΌ2ήC~ ›1ΐΖΈλ„SlόSΌΏ,@–Β^ύ Η}ΌT'Ψvpyέώ2‡9A‹!lE΅Ό•/ν(Ύtr} s'§•Ζ֘Ψ0`‰}ΗBΩΒΧ©·υn“ξ ΑšUΥvѝΒyςθλj$έͺ{ΒΝ†ΗQZΏ—υ2€ΐΔ:fΫΦ²ιάcΜeκzέ)ο]ιe%Ώ—~ΦTŸJ:-rίΧΥfΊ±Sζvd_ŠΝ\λTS†ΩFK5Π€ΧxΟqŸυ7_²&KDΉ0|ž±Lσ9†ό}Œqc€° ΄φ§8„š CΌ?Ήα†ψ#ΜυuΤ7 &ζ·Δ…τgΘΡsBxV§•ρ΅Rƒyί8Hψγ;ηψΎΗSΟόZoζΧΆ•Ή @ΘL?ΐ’Zemσl¬τοωηιΪ½rfr/Μ΄ήGŠˆ/ž—ϊω΅gŸΛv”Ιώ$ΏwρΧΑu;—ΩXχ·N³εrαV§©I7ΐ5ΰ’™J”X›°K!΄¨yΥ_ψ¨—ϋVΆό&<^sΒwςjΙIΒ;η ν|~δwφŸ6ύ\‹œ£ΠUvm‘χΤυT²₯Μ-ι«κKλ›·ωOl[{Κχ’“‹Β Π+u&©ύΥ ψBΖβ’,EzњK[/QbμeΈ­˜Ž<€ ‹ύ†l+€Φ$»Ž ”υ}/F$₯hΛ»o{”ρ,ˆ™°*ZΘf;$MΑ­.‘ΦlHLRVΥJφZ΄ͺGθ£T΅$=i,Θ3·μŠ!χ»η=ƒ¨]Ir!ΓσmΨƒΘVdγš,ί[졝σfΛΣ5I ύ'+ AϊsιJ7’UHvΪι»<| δH-Lζ±RΫ ’”Gΐμ‹O™»Φηπ²Υͺρ’GμόΦ&gΣζOνv~οGv―·“|&x½P`υέΓ…ΑSωObΪωί|'5UHOL!’ΝσκΛΕΌ­Κε‚GΈΈƒŸqdΔ€‚/=Uϊ y8™ŸMzΝΤBRι©%ω’Sμ,N™"νbžύσښ-E?΄΄π;ξώœ¬oΜ―6Μό›H―ZŒ ]k§F&†³/SήœψΞ&ΪlλξXn΍Ÿαj§:›3κ Fξœob3ˆ›;<εp{«—έΠgJ'ϋΡO‰ͺ&ξZu¬ui6μ€MΌ pœπ$;ށ+Wj'ΥSιβΕl΅εcͺßΞL΄^Ή’ˆruιΡ<nX•~s6z3ΙxppN•œΒŸ>cŽRε\†ΣΞχΎ>5•ΫۜL₯ΝδŠ0ωςΠτŠ%"p―₯§PΔAb‘mΡΉCμχΏΥΦ2ύ?^8nΑήΌ±G:9::fFΝ6-ΟM΅Έ? Ψœ™U|Rί9Ζ¦ƒ„[ž²)ΩσWπΑ7ΎσΫ±χ\–5Ι3ΏΔ΅~ύƒ…gϋϊZOgΏ©¦·r0ƒ―X¦\zˆθΝ2ψc†Ši…σ”ŠWIRBkRΰΆ Έ{kwΥχ‘Eρ§ιyNΆϋP'šδΔ_κG$βμυy†~ € ³=c™m1χά²jTΉ'Υ+‘Ι †]R›ŸD―s³oHOXΚ'PΣ՞DΈ&tC?.Ž–-Γ/)‡}λαŠσ'ύ“―A½΅˜²‘Q»X+ύΰžΞ6d@ޏDC΅%Ι‡Ζ&[cHF4†5HuΆΫγΰΙi«β%0ӊΊ•μH4n’Ϋ©S’•‘j–Ό€)v‰@N)m$ύ‘MI=r»ΤΣ$υ‘„δ±ϋΪ‘•ΧΛJς+œŽ­ϋψ/¬ωε'~υœNύ’”PΰuC'Ÿσ5}αzΔ;_E7\Ζc΅—:ΊΞγη2bυ\*:$&εŠkc…gž―΅$ζ9ΊN ͺ,%Ρχλ΅Ώ?§NΉ΅βi€ΣXTTΌ‘hmΟSΩΠc°^DqˆsΥε7pά΅8‡Z‡1ΑΕΨiΰύͺ-)>―~5ΣΞρήΌc€Γ‚Tηοπό°ΩˆLάvφ!ϋΨh©π§/Ÿ[ΌGC₯γFόΫ\Vœ‚σγ0ΫCΎ›#°/LΓ+&2Ώέ/‘DD­+΅‘ŽΈ‘[„ΟΈ₯}ΐmςEψg)Ξgόϋ΅`άmΦ4 cjex ι\Όξϊ”N~ΎΑ([~{€ϊ‹ΦWΓΰΧXψ>ΒμΝυ£rυΏΎzcσ) $ށxM΅J=–=…Ήή@mJFεrW«˜z+$]Νˆξ·Απ ˆΘ-ΐ˜ρ3ƒ’$*‘nσί0£. "―,Ω’ΰΦΦ TΓ ΤάiR§Mο/¨0ωω†¦@}A{M‰πbγ’‚ύV|¨χΜΕ’ω³gΖ2΄ζόu)τΛθ\Μwgk­Ϋ…RνδηVfl …eη!•ͺΦI‚ Β€‹±3ekUK » Ι/ ΑΨoES/υ5+6*Ίβl,ΘHH’ @€ΦΤ*εaπ‡NΧϊe=aΡ¦Tͺ€β$ΐ3LΐΒ7νΘ[‰‰%*ν'ΆΗΪ•<ς‚u/†α’NΘk–€*―WZ}•½‡ Νυ]6-R©jgΌ+rε+ @‰Ό}Iβ‘$Cu0Yεd`/š©Ÿrύ+p#[˜?Ψ½νž6³scK Pσc§»ϊ£»O·&$xQ€Ψ¬ ²έ½΅|ςHƌ¨΄‘ž°bς™l֍”™Ήβ™!ϊ4βαD'’³(¨δωθ»φj5Υ=˜ 𽝠ςx‘° Ν]ΫϋLησίε*ΟοΊ·‘54^ύͺΦ6ά‘-ζΦ³£αR,šΫ9μΪΣΩς½P`Φ‹σζD%ν"P܍™&Θ¬&Z4·ιΫβ{ήΝ=„ώϋ’«‘qpCΨωτςαΒ—!–ΉΩŽŸ8_8»n]η―f*~κψ‘yΧΣ‡ΦVT'‘…β „C8ΙΫc@P<@β:Œ€†[±―kό0“;oD Όζδγ»7άΛFύoο¬βsBΡ½—£ •« ¦`:Ε—TAκMγSR%*[F^@ΔΕeξΟΨz[βΰ‚:›ΙXΙΒ{1μΦ«UV±\+αc/ϋΩ€¨ξ7οh3ίZ&έϋ‚iη«IŠ Ήε•’uyΒ:FLΩ€ˆΙ—ρΉ>%…BΥ©T.X; bdlN'₯2%i‡€€=κ»ͺ>΅΄Ž’B&5©‹—±o0Hβ!#u©lQƒu+,ΓbdδXuι·$=ΣŚM‹ΐ‡’‰μZ]ŽqRESϋ’τόΕscΝŠΎξdΎ›ΨΈYžΕΟ=±ϋΤ‹΅ΙΏ ή K!ε–nšιτPΰψyt?ciψ@IRPƒ•nΚ5€D°§ύ¦ŽΨη700PΨ΄:³/•JI](NΑ©Ω::ŽΦ„T™iM€υ”WΐϋU¨“ωψ'ΝΝ™΄Ύ’rξξμ4{ΖX~λ›}ϊΉ©žt˜ΪΖπZXυ••εέέsχω‰3'j6͊Gή£–XZEx.*ς;qCΏ— ξ.Ί€+2i‹ώ*aDΗ7¦m Κ[2Ά3gΖ$ωxESŸeS“Ž/dڀӌ/@τφxf°$Όor°Ρ©ŽeνIN\–θ‚ΙΥ7$^Sς_>Ίι!ίί‚~΄ Θxυ §QΉ’ §c5jKJς,%F[oͺl"δK«€κ$Γp©" ¨h‰–Νˆ€2οꐁyΊ©AƒφΙΎCFR΅£2’¨~½ζ’¨ΘmξeκΑ₯~%ΟPγ¨.Ij”zΔΈΛΓ”Ϊƒ.υ₯3ƒ%$ Ψ”P—lE Šρ![ ]“}…ς΄!y *”€!{rΈλ ,QPD”δe|ZΑ CΐN ΠD DΪ•JΩΖ59ΐDmΣ8dŸ!iΗrTΐŠ-ΝΠΎlΑ„€4νUΟΪͺ4]`lcH„²ΔζhάΏ€%κ£€;uγu3“ “ (IMMΐM D μ[οo—4ηQ6ό‡$δΓ‰$δF^§€LB«ΰΤ«›ν’9ŒΕ.ΞY†zZz*žσΰ‹‘³ O€kάΌι`g+—.™Αm½ΑQά5ν;[>yΎζu¨Yυ±νκ€#=<œοΞξL-ξš6kaΊL!l«ζœJΪΗοZ$ c₯ΐiιΉ ƒ¬›oΈΝ¦ŠΈ‰Τϊ]‡sθΜFΦ΄_^΅γŒ“-F€ςMEΕrώ6e2AĎk$Χυξ₯Ω ¬Ύup0 λ˜v–γ(6Λξ=…Ρά:Τ°$eΣ›z{{[fόž ¬v3OXΑsΒγΥ\ζЈ)6·4­•λœNέΖ‰xΛ3nψ`ψυτ4Š–3½φfœτs¨£MέΖΓ‰μΪς'M8άƒt{±Θ ΅‹[rωέ€όά[ΞΆξξ6?ΉΕ΄ηg³)?52lί›jW·S©ψn¦TMV'Šƒƒφ]oθ—CdF 4\―7?§ϊlΊ&' K³₯‘[} :ζlΰνX^ε\΅΄Φ muœ—Sεʞ–‹εS‹Y[ϊϊLRio•κlf’qΜΠ―Τι»Ωb5U BχΨω yχœϋ~Ή›VΆuj'ΜγΆύO›w­ εΊ υΒ Ν½₯υτ˜|ήΛ&ε6ΟqΆQλͺj.\ζ•Γ,keΙ+…£[zΝτӎΎ{ψδωΒΕm‹qΙYΎά΄.Λ΄gν3™δ™8Γaύy€ŠΥ4qU8 Ί"ΥBΝ›΄~OηzύΠ½›£σMN„m;Φ9O_>3υ βΒεΞΞφρ…Œη·LŒΪrՐgάQ{ΖͺδΘΉ Υ9—FΆξf(ζΡκ–RΊ0y…:»M&_I]Ž•ΞŸ·Ž5bηE\― ωψξ[Cίω.*SπΏΜE˜}Ϊ‹9σ,Cm©,‰ΉΏX)[ζ\LΆŒΆ8BΰD1ψW&kRIL€–dˆK2"•#Id$ι-…T§Δ°ΏŒͺ“`Ρ«#γt©KΙ‹•ϊ°―VR½*ŸCΐBΰ₯υ0΅/υ/1σRλ’=ŠΚΛ;•ϊ©?…*ωΥgυρRΩrψD%BB#Ϋ 1’T δπZYu.]³ ŒοtAυUΐGύΤ5yΚwΡO}x•²"©3%Τy“=‹Oϋό΄ΰ-›&š:ύ8GtMρBΘσV"˜ό?<£όΔξ“ΗTO’ $XRψ ΠΙ¦δz·"wJGΰ5Χ 8Ξw#Γ|?ΌαƒlΤKαd―fPŽ3釩—ΫΧ¦ώηφΐϋ ΘIJ*rέΙn\#ٍ“CξwδBσπw‘γ± Qc’gz+Ή0K—6”±΄λšZΫϊη;ΓΰΗ 4ά0σ{έΙˆώ;Ηί½d‰yΊM7lpΓx³“ϊκ½Ϊ;rnό/κΉ7tδ6Ώΰ€ύ»qpσΥ³ΈNςΰΏ?:všw=8€z f^ΌθA2@„ ·ΔV ©ͺ{Τ›ό@Ρqή—υρέ0]™¬f[ˆΒ̝.€3Δ6RŒ£φTΛLαKC(“,μlT§ §Ό¨gΥU܍«y©ΙfώΎ‡΅ π1λΕΝV‹‚ε”ŸJ½<Ή6υ§ΫBηsG¦Žp£ι;‘‚n1OkͺϊœΠ]ιδ+SU'd=’γ₯°₯κΙ .lέ°δ׏ΊrμΎ@PWnκۍγ0―κ£ aύLσ2}"U5Ο‘'Κ“›ƒ `z΄of-~œ5ω>7° ,^Υρ¬εŽ=¨šΠρΌππφ΅­Ÿ4ώΙαρ~κn*IΥ39œΙ<^vύΚVΛ§:YυZJΞtΑK…¨]zaWΞχΏήΥbώύHAU™3㜺X}ΔώlŸ$°¬gl7AΈ'ϋ.v΄ηŒWΑk\π–tΕ­Vr­ΣΠ„ώR™JΨz6φΛΰφυ-Ώyδtμwmš“ΗτόZύ+wΪχήιζڈγ9eJ Kά=ώBν|C±EΫ€½κδ“όΥΐ‚ΝΦϊΈχ}mί„Ω{tΪτ έ]σUσ$%ζΎT†nΌ„E|©LΙΦB«Φ,χ¬W¬i‹ΡΧuvO1QU’Ν‡@ˆ˜|%εΒ@\€₯ΰ‘ΰ„R• $D’©+‰‰·ΐ”BΦ(; Id,.I‰Β%δ˜Uo-Š:]œ5Π"†_y}ήT}—$B’‚ΪϊΤ–€#jkύʌ `(#rΕ ‘Κ—$’Ež|ΩtPΠοšη,yώ’70••:– ΠεαJφ’ HŠ£Ά%]ΡΨΥ–S;QPQͺky*«±k|ͺσΉ—€ŽεšGvΆ©νο ΚΤμξϋ?Ά»_h>I  ,–5Պš^hDY^;ι―;z[οΝΊαίηϋϋُd£P[΄Κ8m¬'Pl{ΰVwn]›cg§χ“νš›Άͺκ[²dΙτΕΚw;nπc,©s ΖVm©9hγ\βΫχ–ςΖΪFη»Y £}-οΝχζύ±ι?~rbρϋ¨gΡ‰Ύπ|²Zl€”ώψ,υ;AXρ‡©Τ9x€΅3c«ί«Β'[Β0·Š§Ÿ‹<’θ¦'Χ!°š£~ε ³Ι:cΉΫέRjxŽ\θδ€τuλ̟@ΖΘ?Ύ ܌θz#9(Qa”Ό½n+κ[…&ε’»|Η\΅ yΘ{˜χa Ο*–G$Cψx8ΨIτzεή‰IŒη:ΛΚFV vFεozMŽ«wŸ9NΛbPμ δ–―€aOώ@ΓJάμ•Eό†nΰzKΣ›zύwynυgˆΌFb@€ΣΚΌΎŸl‡|λΦή–ί(ό%“ΌιγτέPΡv°zήOŸκψΜ2+f1tχeJΎ]Ϋ΄ζe³ΣOχ§ΰf²2Ÿμ@uα葍R]–%™·†Nε*ίFΝ8@¨·C [― ŽΉ‚5δMŒgΧΦuΉ7}¦ψT³@h°±κΆ₯2F‡Nkω£‹Σͺν¦~8ΐ™³Ε©λ Ζ™J›D)Ή€&gm0|LRΥHzΒTV=41}ιlvΤ/KBΛ;€lj%ι{NPς™Žst|άΆθNΣ”)δz*χΤχnΦ°|­σΧτeπq]{ΠΒb_ξ…oΕοΟξήΩ…EΕ/A¬χI2ρΜΑI³ηΘ΄e˜Ελd2 A@ ΈΤ£$i°`"Xiΐ$ˆI€ˆ‚^‰—”dIvδ•TCFΧR½’$@ζ’uF|yΔzΓ‰fάƍ^NΈ“ϋ«xvŸζHιeβaΌDΏ^5 ”:όj§‘³­]™tΈ BεgΈ°Θ.°χ§Όμ…ŽΡ"3άυ ΆΩ,Iώ;›\xfWv2βŽβrŸΧg~β"1GœiΊzšφ(LUΛΊnπAzύ(0α ֎"˜¦“υcyγ{MVhΎoYgOKƜ/|±@MΣ "Of@KŸ?ά{Y§Š gβmώ~>B›Ι4‡Dab¬Ÿ;NwσŠμ†TfκGιορd6.o±ΙΙΣ³ΗyΟ[ΫϊrΚτŸQ[1΅ΐb:(κΫ ΘgBίm,l$+™ΰ#δύaκβ€h^’;η’D±O>iͺ›{Ό―ΓΫ!%‘„6br΄Β·ln5_ά;nνΡζa^ΕυHšΆ³ΨmΊZ_8 ύώζό•ρSδ“ΉθτͺOόΣ•­Ε ψΟρ>υγΨ6€O/›γHΨνδ„FŒ΄˜ζ1pœTžͺAΕ¬ζžT›ΔHK5IkvΝ;©jQN  %ψ 8ˆI—ΤA^₯d z&]φ#²#˜θAŠ ΤΐœμvJ5KR‚4TŸΘ!R˜€ΣV1ι­-0φVͺ@ύ€ 1πs“ˆ€ bξ5ΕλρΈTΙΤ_υ©€>u •PΏ[2)Ϋ' P@λβHΩΦ­2²]‘Ρ|V4ΰlMID€‚₯ώ ΰΤώjv0-(Lβ4\i€¦(ιJ5jKtSΏλ% QΏžD«γηŠΜcŽG·η=θψQΗyvύΰΏœ²%$H(p½°ηN1™uo &β­zυτ§Έφσ%:Œω[%/μ₯Σƒθΐλ4=2ΩSΐ\ω'a>Dν=dšSw¨UαbϋλΗΞ™—Ή§ωΐΖήΜyT…ΪιΞ;ΙΞΚSOΞ:}ΈwIΛΕαΙΒη›1 υ7ϊ‰Ύ΅–Iώo’Δ@4ƒysŠ>pqrδθκ–ƒ₯”ƒκ™‘„""…έ©ͺ»•πp:΅<‰=3^ιaΐΗ2ϊ¦=_ΜΠσ†ΗΞχΆtO™–Β~Κ>Θ_QwϋΐRΓΪ§†΅΅§})Q²u‚Ι3P +œ&ο½xΩͺ_5›΅όwξΏDW_a\―BEofdΌ?ΞρsCγ—ψ}'Σ£ιτΦXε$œ}ϋšωfθτ[ΰνei¦\1©ΒP Αγύ˜ΓΗΟo{Nώ0οΈ§6ϋ‘ώ78Όg}·4†%Λ*˜­οb$›bZ‡Tή‡ύκΟv­ΟŽηN—žˆSυ +E˜ -΄†DΎG°έχO₯ς[ќκ'OΣC>Τ―<ίyΪ¬€?υηv ½―§PW\'#ϊΨpιU »wΓC­d£ϋi\ϊΠΙQ”¦-XeDΝc(D’u!©G‰Y–Ά€²οδ£ϋŒNŒΐ«άp‘Ρ΅<_‰ΩC-—΄²y+ί%Ψ|ˆωVύ­9˜yΆ‹:f§+Ω^¨.[oQj"[}KoΦ¬DKَ¨υ:9•{n’rVmΧΤΈ€ca€A H1Hδ‘Kΰ€•}‡ͺθΘ§¬Y ΛΧl\`eΦVšQlΩ’¨\6X»υC’4]—€FΦN–“WΡΡΨP,mω”Κ–h' #Ϊ©œθΡ‚λbI\Dο―Ύ0a₯GχmΞ§Χύ)“o9 #Evξΐ“ο  \?΄)|7oΤΔξ)Φ’όήΓ+}ž#ζπ~mβ\“-š†ΔΕxμZbΎΡ&Π°Ααy&S™(~«ήjσλb΅z™ π4yޜζή,#χΠ@ω₯£«œ/•SžΤΦΞ-G™ΝˆΰŸXΆ6lψμτ>ξΕ24ά»α$D% ΅ωV$N€ύMaψ"Vzƒ,d« _}#S½vw-[f–ΝHxhjZ§ϊŒ›Ί—΅½u†œ0'ޞΆ)3qtjxͺoeζωlΖϋ.ξΙΦ€±ϋνΩ!€†υ…85¬’)Ν9)˜ƒΊϋ]η2ΡΦχΊ7αύjΞ oλ―Ž\Ν΅ŒNF<ŸzΧΓ"‘Ξ’ζ<ΕΩςΊ/1T»EΟ)λCœωŒρ*΅ Χuύ„% ¦˜«UΝΧ•ΠTR©²Nλη}­ •‹₯7 ΊΤΕWξ\η:vvκIΎΧ™Ϋ—`ςχΟƒ/ωΧWς7―TŒgTχG–¬^Φ?pας1ξΟI|· ΨPE.AVŠQ“@ΦoςΙzUρJΥπ5Έp6wΡDC›—pN1S-€+©VΣ8+qδžsŽ‘>‰]Μ—QΐίSρ³—‚|ΊœσK-ΌϋλXτXΏΓMΡmΠnΎ+ Zώr₯)\δl}n{υο~θS‘Γ!†νOÜg©άόξ/Mΐ­qM±ΓRΜ€‘‘‘ΙόͺόΧ²μό0_ŽZλΘάΛί›‰GσΜΤΤμ3ͺW1³hVΉ›¬=2$6‘ωϊθHQΟ¨Hj!‰‡lI)Τή ΐ„$*bδu¬–!“ΐŠo1ιkˆορπ]­¨s₯,c―@ςEΏm›|Ψ€φu`oΤ.Νω·ž‹ΗΔs£ί"Υ°eDjοf>i©KΙVc°pζbΩΪ~¨ΟR…¨Ν†ϊ$©„€ υξ’Π¬cΫ”Κ—T²$ ‘zšμ]4WσϊΥgGFν)/U£u  H Kκb’―ΤΠ”–b˜. #λžhs ϋI‹Vt₯€§ωσŸϊεM§ˆυ₯9MΎ&H(Cl–£Δ’ή€¨½B…μ¦ΨΛ»U@₯ΰpIρέΜΔ‹ΗŽ›)ά<¦r₯loΩx?NΖ²ŒΔm:,/Ξ=ΉlvFΨύδΥ&6/M]IοΘΊ€š·¦†ΝtOGWι₯#ηζ«ˆYο έ½Y'lfg\^Ώ:σ™\Κ“„πδΥΓάΔ‚ιΌΫO•žBBx€~eξM}R{«Υ,Όg,pυV€/o£λTk5恑‘©#Ω–“ε΄μΫΒ§ρŸƒ π•cu‡³KΑ8ν φφšƒ&wEωŸƒΫEά†ώ8f5κΈNδΝW1ю €Ρ»&ΡY8γ k–ό₯’’kξf<Ή†6β.dΝ>Ό˜μgή*8,Lά³σζΛ:{L1ζψƒ$τ}°Ή1ˆΜͺs…;ώJpύA[Άίq»cTήΊφι_ά΄–V~ŽΒλΔπ*~†>Ε(OͺœΘ»XΘ=Ό7I*!Π Ω­`ŠR.ϋ© IZ ΟUΊ'U© β€Hš “|ΕΊ¨T#·…α—Η*ΉΓ•Κ‘ΐ‡b‰WΦ঍xΣOμ1ςo»·ΝΌΧRσG:͎Ύœ(R•\P?ΕFD½mάΎ€²ͺCu))z hΫڜωφ‡:ΜγoνΔξ’Ε.·ςJ%Π‘Θε"DAΧo•‘EήΈ.Z:ΝΨ₯@υU’ I}ΐPR2%ηλOΠG‘±@œ”€ˆ¨ρ·!}QRœΡΊ $Iˆ‚ͺM²­#σΟϊ_σ,“”P ‘ΐ-£F›Oa—πΫ'ΟL<‹/yml>Ÿ₯ƒgK„d5ΏΓύIΊ—V™²³zy„M@&λΉ.›ΌέΈ"Δπx ΓΓGϊm»Z¦ζ%?γœεεΰβμΞ[Οΐš°ηo]Σ₯JQΟuϋ}†Ωβ »ΟK¬g‘ΜΐLΡώMoZZΐΜ²—xΩτΓ”—d©'xξάτθ~[fΈΰ/=‹b άF‘8.9»—φ²@IDAT}UΗͺa5€ Α¦*,]Π­ΣΖpίπερσό~E€Mq½| ³K;έό‰.±ό „―ΐ L{c YΤ3ς1»š§ ο»­Η‘~S&€\W[‘³ΏβzO"Χ­Άς ίρŸβύ3*uΓwΏƒΘkΈΩphRMΉzꃆς€υ%¬«ίƍ«ε±EAz€—&yΜ²gΧ ?Ο4Ίštθ2ε†/rΈςŸRχ‹G rμΌυ5ΓΉ]Ν«o¦Pœjω<ω„šbaπ.:[ρ¬- UE€!HΕ™-H6kΈ‘GλΑL’Νˆθ r` F4'>==Θ!ΨWΉ;4“gΞέΪWΚμ¬ϊ₯έk]=3@‹ψΫΞ›y^DΩ瑎>[ΞLdA\ΉαԈΨnΈͺΖ‚Ώ»»'Ο“ϋYPΦΫΕDεT] BΑϋΔΛθ\ŽΉR§λ€^ 1Ιr«+©…μ:t²/ι…€†\ίzγ“:’βs\AΗΚe₯%’˜δ³«#!P{jg Ί€ *E˜λ50Ωχln1kWf­Ί‘z/ͺ (ΌΙ6Α?ϊΤΟRl_τ·m]‹ΐ%ξ‘ώ’H’bΤ\μΦϊ¦~Ι#—ΚδΑΔ«‘£h"4IU$ρ˜Ζ¨^±$υ萄D`D†ξΚ+ϋΡ[tΦu©{εi§ˆDΟ€Ν€r&γ|©r 0Ύ`FΎΗ*ηg>ρ±•βƒgbςJΟ‘€ώ7Ζz~΄p”Ρ²‘ΜOgΟNŸί΄"σ₯t6υ6Φ δ5lΖ¬ -Ύητ»"Λv?α­Ng6δάΤ.Τ₯Pg‰:MvGQ)=Φ>a¦£8…|!?αζ g8²Π&‡ΊΡόΔ τN?—εP’t‚;–ωžŸγφϋΥίoŠVΌ*M55Ÿ(&WΊΰw•ςŒyzΎmMͺ2½ o"χ02dβМ…Ϊ‹τ,ν§ΪVgžO§RίΓsP‰lyυƒλΦ™/.TΓκ0γ«ΠΚΫAεΆ NϋGœ«κW·QoqΰZΡβASiΕ•0εL‘[sGΜ»¦#yoUGΆrλ™ΰΙύΜD€YjΞE}a}{(Iφ"ŸΝ‘C¦ΌqUκE/mcΞNΧ5γ‡|―mηJ3ΩΏPu ©η&N•(AΌsΪ}εbPχv₯CuΒ½”yώœX8‘ ΓυŒσnς]δϊ<@_vŠO΅•Μ3/ZΖ:²s[<9::Ά1›ύF:-•KϋG­ΡKΫ‚Φοq­ `ΖGŠG!]KΈ Yrώ€Θͺ‡‚Sž‘{yŽ— @+¦rΫ1mXzξΖάϊˆτ,.Ψ_ΒΚ4JOˆOΝςτθ֜ωΚpΡa }ΰΏ—Ί Ζ` > z{rτ€αΡΜkoAί―ύσ ω υ'ό ¦‹·οε)Ό^MΩSvΩ$؈η0ΓλpE+χ°Ί$ΖX€₯Σ,π 7·€bΘ.NH$-a2Y΅%ΩAt`§!ΙΘΚ₯¨g$$es{²½J–$"lΝ<2Vͺ@q 6"~΅“.…œˆDI¬5ζpΜ7pN`RZΔ 6UMυt:$&:šαT΅­dά3Υfž„-žW“[ΰΥIsβ=ψμYu£sτχχαžώππΩ«žš˜c©ΑΑόςΤTΊˆ ZΚΥ$©†DΎ‹Ig€Mβ»ο"ΖΙςeSΦ9§Y‹˜Γ֞%ͺYΡ¦“z%ΰΨΟZπΫ₯Rα ύCζΧνάWΐΌΉά•i+H’4oRε“^ΰ>ML7ΤΖΰ’ιΞm0EIqη―c\ΐήΰ^¬zΆ@X»VςΉΏκ₯ΎΙš?οΉ(λbΣ+@>ώΡΝ°iώ3:Τv”`O½ˆ…Μ²@„ Ή₯₯yID”δΦVΘΌ΅+1ΞRYH‘MΠŽΚΔ`λ*&͞βW'ϊ=ΙI^κ\ε“w-τΛ–βς₯ͺY΅,e½§Σ¬_]“xΤU«Τξν’΄ΙkiΈΪ@Δ5xκ’šΨK'‹<)0!*Œ1Ύ4>ΡS Aθ €"ΐΦF$υ< ₯ΜwίgΚR©ΤήκΰET«DoιλΉ(Q΅•Έθ·ΤΨT·ώΞγžwυ² žΓΤυΟ>Ή{σώέ}|―-”ό“P ‘@Ψ5j»uTNΰN”‚βEξΝ;…››7“ΙŒΐ5pH#6– ΦΩ–ΞaζξΦψ|άlΨYΚλΉρΡ³±6—–,;sΫ¬ί³ΗT6τx£M7%›)Μ‡©`m₯ ιΛμω½τνϋYΞ΄œwΓΚv›‡ιea―η5“E…£$ι”] ρLΥeRΚ`\^cΔΖΘχμεΛφ$w#\Κ–Ξeƒά^δςΒ(E¨ξτQ~Η₯fN,cβrυήΠOΝx›Αϋ•γμ»l‘pιΥ…ΞQSŠΡI²Ή‚”w…χb˜Zϋj  ½SΗΙΒ½lZ±Βt.tΘΫΗ™Ώ>cͺ‘‘ωΤ²Λ…ι‚Ρ™Νϋδ“jsZΜφ-Ib8²†χ‘υΑy8― ™`έΐψ:C€Y½¨χw†&ώ;t§Ί600 ΅²sVYvAT›W™―Αk'$@[;8™—ΝqΆ@°ηΫΟaΨΌ΅~[ww»›.<ΒWR†}$„£ž™:ΓοΨ}k^ύM~ΔlLMJ\Η-Ήά…jnŸ.†f/±>j±

―dξ―£Ϊͺ#«δΨG’ήW9ψύs“ŸψkΐG”ΆlΣVR^ϊ›Γϊ§Γ¦¨Τ‰bc[δldώ>RΎm ‚ΰA:aΧ#’ΟC™ζι›q½;·―ˆΔΝ·}'–ϋο“Ψ£g –Ι]Gΰ=ΩθO.feμ< ΰ°Aώ`’ΔH«ŒTƒt/#sfΌe”/`x-ΓhΜΛP»Π,[ώ+.ƒ‘:Ώ₯Ί%[ Eχ#νΦ¨Zo͝<ζ>}WŸδK±Kž90‰«]άμΒτV‰–’‘Ν ­τ[jhRΝ]δΊXΆ32ࠐDD¬Q-όΥ¨θjGξ~Xδ™L΄ε˜ i‰T΄Œyαεi φΫε)λύ&_ψKΪό΄m8ω'‘@B( hΩ‰Ω°Γ ŠΨc%΄F£ Φ―€/π‘ΘfϐρŽΧ€z!>Qqhυα! GΒu%‚UÊν£Gβ„YΞ?_t^fZΉαNJjιΡί­NΟ9™&B3½ήIέW6$„ αΆέ+― ŒŸ;ύRλ²l:|˜kΔm*Ζ Wρ~u¦ο†k-^τΛ™=^˜zŒόQDDΫθ:©»PΓڏ[YpO*t‰~Ž^Ό<χxΞ ;wNŸΓ3Z΄¬‘ΫΧΎΐ~ΘΨΤtσcΠΌΠΝίΥaπ83 ΗVΕ&ΊŸaΘnε·α’>:ί|'^―5@LήΡh’jΜ΅ϋρ£Ώφ‹[²v6] R„JηιΒyΔ―` %‘T$αd&X€8:šŽM“,ηqcΐΊω$΅ΘΛ—[—΅VƒuUΗέ‰!ϋ²ίΒ ΗvV§.ˆF—š$ k`Οβ»λ=Ϊ¦˜,a8Lρ!© 7’b§|“΅δdλε)7¬Eτ A&)ηΝSΐ @6­lλN₯ƒGi'&Ϊ Pς έ―¦oυξάΜ{°soάΘχΟ~?#₯’λόFζŠkΤ8uLφίΔYLnEιLΕυΏAΏcδ…ΦQΙ[;W·χΡ-+5χκ]¬Ώw3.­y„Ν7KαδΑ&kω•n©€rΟ¦ϋ}JζNsB/fUν4Δψ.λL>Κ–I–'E6—τC ­€ƒT¦d» w1Τ2––΄DΜ²NζuΝCr"ΖXεd’A"Ξ°±1$Εzο[:Mܚž―'πQͺ“θ O^ŠωρΜΑI$I΅Hη’“–*ΩΖH½Κ[^“ ©Œ$J28Ÿ|HMK΄pCš}ρ Έp]"Θ:Sυ 0Κ€k΅ςž=4i%QχmΙ§iφ§*Ϋ7ύ΅1'Π/LRB;“€Θ+ό-NΌwR±‰­ΧWŞίβ ά‘ρbYgs q0CœUΞΌ$‰λ>Οαέη9qΎ±Γn9ΑΡTΡϊΜa•Ή΅‰C(υ|΄šί†δΈn˜vϊ8μμŸ«ι/ƒM=ζ%̝u¨Ψ g^+Œϋb7άήΎΦ<ΕP€3k`₯ϋΚA¨y~tdό,ωΔΕ¦ŠλΎ„GψctruDν·¬ώΞe]=SEχ•SUk΄Η―ι#ΓΓ·Ϊϋ•ψ =ψGΖ”‹›5±c½e7ά°Ÿ½όέΫB7’£’SΆuY›ιžο©,*οm{ ¬vR4#ΆYKšeyΥΖnjQ?bϋBόλ‚KνΥͺη'y¦ΎΘώ3KU·\ιo6Q#KZ‰πΌυ0:[δUgcOΛΪΙKΞγάύ„ΛDv—σ]’ΰ™ΔOpΈNψ%’˜‘Θ€cΖώ+ζkη+'7M0ˆΎD!Yήάθxl‹r}ά·ύz*~Xοί+ή§ν™rψ _Z³ΖLW'‚·0φυδΥ‚qΩ ½―\™6ršrS}±šω'jAœ{ΊΏξO=„[σ+? ±6Λ%¬l0Φbχ‘ΣvΉkΦZ'Ψu3VΚ‘“z1Ί«0"Ρ1€lVΰBWjXRΙ’ZΠt ζ„‘{Κ£2ͺN’%1έCe+y7ρ*Φ*BzνΦuχύ5Μ¨ΝK±‹Jβοϊ‚Ov_šϊΜΧ‹ζΤ5ς-(φjώ”<^ΔήΞjVΡsYt‚¬‡! ‚HΑξ3Ή–ηioχƒΆ­0o’h…ΡώχΩdΛ0<—+ W‹™}Θ¨wΡAkΘΩΨQgsΚ”·³Ωg¨{-SM>'ΔήώΛ—'Ξρ=NzXΥυ\3{ ŠA…Vk伞—'fΟqf|”WγΧ†n¦:t"65OeΗΈ££ΈΈΆ_νάL^-<Νh ΦmzUν²λY+τΨώ’ ŸZΒΑΛ™kτŠEK6Εz‰­‹aOρjKͺa Ν.^m³IW3-όΆk—I]:{Τ―JΒaήΝ_MY―ΝJ1ΓYŸ&Ν—Žœž?»YημsΛD}ΏΔEiI6©‡·7ΐUλό .(ϋŠrΉyΟΆ:­#KΊ$^Ώf?fΛΌΚ_CΣΎρ@ΔΘ »½ώgS‚SΘ_δΙ₯h¬|VΞxήΙΓΔϋΥL ―Π9β{Ω—†CA’–ͺομ§wyP‘L2uψΠ}½ς]LE«oMG‚°ϊ=“ΚEo]‚ω“>3tŸΞΠΤ’ [ΧκυΧ$£Ω’ο „NΦbφ*œ μθ舢―‰-xέΈy“&ώA-r,Δ¦MŽŸNά!P_|{πwRA‰ογdƒZ —ψ<τ9ΧJψTμΗψϋ~ӏιj.έ°†ΑχHv[N$aMο+Ο‚δΙ=V­8ΏDYI –ς7w ψ qžτBχΚη¦ώΓΛ§'sίͺ\α/XοάΌσͺζFΰ–œΘwίf `‡(xΖ$Κ;H‹bλ)ΦpYA«~ε«Tt›QύafM/kΏ«’qeΨN³9¨Yΐ$ν+ηGΗϋ)wKšo‰DvΈiωAΉ"εύpΑ2Έ—ΣU«κsn¨[{š ΜΊάERτθGͺ–Y–w¬Q˜a1Αr­«z + lΐθO›Tί»ι°‘ΝŐ/&ΩM;0_…χψ"ί;ιΖw±ά»ΘjΣ€Ν «σySN}δ‰_=bU>υΡ-'8/ύEW•(czρŽυφϋΫΝίXIH @LΪDWIHdΓΡ QΔxΡW΄T9Ω}X—ΕRcγΖcVJ₯ρΛM²œHj’²Σ#>.zΡ 4lΥδ”Τγ¬Te-°δ™ϋ?πΉΘI½¨ρ$™ ΌΪ@]ΙE Q Œ–€Θ€}m·»ύ‘9ζ_μb“¦L3}i‘΅Ω4©:%+τΈΎ‘€·,\σ*ΚΈH@ΤNΰω_‡4§n΄M½—Θξ»lΗή· Le©»‰ζ2<—"¬€+Ώ€26—τI*[’@Ιm―Ό‹IςΡNτty*“ϋ^Εb‘χ1Ω‘Θλ˜ly ρ@S o»°}σ½7Ϊ€\BΧ’Υ\€΅ m“Δ&Γς`Όλ=i―ψ>―E Hlβ Ίιi£ ϊœŽ°³ΕΧηκŽΘΌM:〦P‡€Iv" #U7ΛΔ*7U’(>Ύ~e|’lsjLy“ΝΩqέΕ₯λ#Œ@'‚aσŠEŒΟλΡ•C‚šωfOqu―·Ιjͺ8ˆ„νEψ”Ι˜2ηFξ­γ©dψΤέΎ•η&4¬Έ~ΕTuνΛϊ₯`@›Οwζœό}]»ΆW&ΗtΨv€ƒ­Ώξ£ΝZ€ponρ«’·ΕL5+ϊšί;ωqΛ°Ft€)Α(’ς5Νs½ƒΑ&·ω»Ξ:7λ„5’Rbwˆ½ˆν Œz¦Ϊγpδ”*vόQΉNoN _΄φeQ@?ΆΆ2Ρλ:Αω!±yŒυϊζ[āΞkέ½Aͺ°/Κ[Ο†—‰©X?°R‹*†0V:I§kύ^\Ρ G\}π|α|¦|P!κΠ΅…Ι!Κ\π~†τ6”ξΚΨαιά2U¨[šš.BΧΣ’€Έ3όδλS;6 ΘΨΨ=έiΛΨ.‡a•½‚~ P@¬Η†`5Π–Q`(π˜`1Γz’R Rœ1ΞRΑi|L±Œ’₯64ΚuyƒRπΌjƒŸϋ±έύ:²iΒ›–~άS±3©žρζ> žJ―w6±ωΰR0φ”g6_³/Όf- δ\Χm;$ΕZ)”ŒΞλγRœ©³I K*mηρBv ΧΕRS ΘσΨΤΘY€"©KΕνΏε΅L@Foš<—]"Θαώγ j`ήϊ ζόΝξ]Χ\xš!Ή—Pΰ΅ €NΤpe«™%!&qκ^πΔ^O‚ƒ„ip›1¨ ΝξΫfl=LA|ίΰ&Q!]°ΑέsnβJΪS.Žιeχq–XjΛά`{Χ3ΆW+eΊβ⟠]‘„€yŽfύ•;^jθ'O,P›Wήq_JWrGž‚ΞΛ³ΰ‡‚βqπž‘4꒘©%Μ(žΝφ&φ,7"˜„…Ωχ›ΩδΑ\4έϋQ I#KšζY\«‹Λ=444Y­„ w&οBΝŸnTΥΎ{E.Ώ…β$%‹kόUΜςžζβgxνNόύEφ•Ι€ΊbλcήΉAKGάsgZ„²¦ΦύΘ:8£ΙρΜ$Aˆ«Γφ˜Π©δƒ ˆB3F_ΩΖυKk’Π|ΪΚώ# ,}Έ4Ί ³/_Ύ<ο₯ΌΰΓ€ώΡoιH'mΰR†??VIρRj\θ!Žn(W―EeM,lΓά0+άwσιs¬?γ^€S©F€Χ.΅ΣΓ__Θ ϋυά>+»εkQ±7ΘβΞMw1Ώ—žΉGN »{§Nœlϊ©_:Ο‘Ύσ"„Ώε§Nυ6ψ,‘ΛΙδΥ„MΛRΖ¬“Θ›J’…h’(²™‘ΔBͺjςD¦³ I4dΤίΥ‰­δβ8M>IB€ή¦η’€ί’·ž™’&ŠΚ Ό Μ¬(ρξ€Kσώ΄Œ›’”PΰŽ’θ_Ί…ΧZ =Ό€Έ¬ΜZ ―™CΗ™ύ.Li©kVΩ5 [1&Ψ « 6š ¦ςAξΖ­g ΆχΰΪ΅Φ ±i?šυρ•Ίη· έζ'Δt:~㿎Žyήτζ/ρbΪΥjˆ ο8ΟυO"1Ή. 1[εͺ£l^'c6ύΩ|φ‹ž&Ψ!β‚ΤDΜσοήτ/Dsφφ-ώ™sζ›ΫίάtGQA%U8ΐiμx6Cdm˜γ³Εη[@α?άΧ‡—²Hr6ηbΏhMˆ§Ρbk[lΜΞ]…γjΦ†ΆΪ[Φ€Š^ˆPuAWfBdΒήΝώlό‚β ₯cΧJ©+RΉμ'jL[c φŠSMυ2lŒΌ£Χ]Ϊ8½Β1Œžށ€uc‰Ψ>Π]ΈώΉ›ΟO΅§ά`5efyΑέ–‘μR’ΘuΤOHίP'‹™{ŒEZb¬"η0`<υΏΩ{θΈσΞσ-΅c'‚XΈC$%j—W9v”Δvœ­“tGJΆ³Lμ8ιnηtrfr:s&iNgΊ§gNŽέ‰γΞ:N'޳HέIΗ‰—Θ±-/’mIΤB‘E‚;‚b)Τώήόώ·π  ͺPΙ»XUοέυ»oωώίΪ`=H‰β2J­šμz?ΣωΞˍ|2­―Ευ­Γ‘Xφ7ΰš}XoœfΞ7ΪΔfΪC5ϋμφ^™ι=΅ˆdœHI€ ™σ(œ"Z)Κ•œŸV>Κ"iΊ~‹–•²‰€CΌS,1Θ½]\Ώt,ΖYζV2Ν’ƒ΅’ Γdίw  ΣΤkW2wšΏoή*’¬\t‘pψE.–Bμ₯aζQOcκ3κ:Ίaqαš‹h"Ϊτ£miH΄cŽ•@±& ’ΠΖ2ΕZX$α#ΐC>8BI“€,σ%2i@‹%α’φB=A™ge£{Ω7DΪ¨+d³—ζΪν%θηw]σΒB άd 8Δ:Ε §±$’*’֏*žJλžs’I"[§>w ι‹xΰ4|ŠyνΌœ"Μ―^?R³ v¬dtyŒGπ άΘυžgΜΝΏΏx΅υn€UrύUέάLA#1 hd€ ’q:7žσΩ³<Šή1Λ$ALBέΒ~ŽvσΉ……G‚I;ǐ½Δ4M’―ΊƒˆIρνη£]Ω ΤΉŸΑ˜°|­IqΦ ΨΔ—j¬ykΠψϊœ2š£bξx· Η¦Xv ʏ'ςΙ»ύv«—Ί —ΦΜμvμθθΪ·3ωΓ·nOΌoˆyΑ•±’tbψΈ6œ/Z’Χ3«Y#ŠΑκŽ „4²ΑyΗqίD^ξ΄κœ@§](τ‘X³3―Ϊθ'J»ψ¬gώ)ΆδN[n„:k4“’—™gΰζ—`n\1τ[)‰¬—”5ΤΪ`΅(aQΝ}pK.ΊŽ :Rι7ψ’Lu ˆΊΟυ»΄'υφΕρ PΥ; ΥΤ§΄‹ω|ώ«<[/πLk€‘ε9ρΥρ)kŒŽΥkjάZ•j΄VΕZΗ>υοvtA‘χπ̌xΘ,GEί‹>@„(+¦x†WΎr‚–S΄ό=ΔψΚ4«³,™ΐ dΜΓ O#u—$^r”–?ˆϊY¨οΏ£Υψ°q›.ε¦φŽ˜UΪVέ‰W².@i©ΎoLqό Χ‹x qρKrΣθ†mz.’‰"_½ωΆVC{εοφ–Ήh]ŽBVND(s+i4dΦv~2oL³δ;’¨W³Kay@”ˆ0Γ~ˆώ"2ιΪΕލνx¦ΡΚωξ?>tπš59M/6¬Rΰ:P ρ£<ήqβερc”}ΉQεΙHzO}€ƒyq,ŸXώF*ΰF₯\1Ε» [xέ~tkΫ`ήόΛ]—Ώ]Έ°x±P(~Š˜Ωš/Ό'w1Ο‘άΫ΅‡:17Sœ]½½†1»¦wH£Α0!τŸˆ5k[ng“G8f 6_<λ$‘QM“„ε~}ϋX‘0‚+œP—+Τ699™),–^]ˆ-βR«[ζΠz=wξ܍1Ώ2£–`‡κ0KΛ³²γςαwΪ/ΧΎQίΞLX犾χqHφOό5Rmσ\η—ς³©Ÿ°†˜Οf―K[aU^ξ—lΟ>„ Ήφλσn^M£\ l47έh2ε¬)`Xέίͺί5ϋΔ3Mq°jžS{„νxΕΧήχ9έj*ΊLΫΪΧςLΔΓω|}ΖΑΆ˜kίI? €±¦pœ‘|~ώe΄·5ξ€±u―Mn.i•"Νϊ0][f7b^kί—>A"ˆ‰Ε€:+Φ­„…Ρ8amaw9SωΩ€£ΔΧEΉ…κ·e=l°ΦκZΔ#ŠΜχ<Χ ^΄ΊKή)/•μΘ·ζζšχw«nίΜwmβζK"~/·7ΚΡ\¦:’’KΚ]”ƒsΰԜ[ςλΰΒ”D c»3{ιΉ@ΗfYbŠ·Β«/ν£"`)ά4(b υΆ––ενoν0Œτ΅€`ΑΜ§Ξό~&8sέIΟ*M2άφλ1FΠoπΙ Β*Μ¬~ AšΊ… mπ)F£Ήιœ2™ίM²ΒoKΣ)8ωθRώ•nωή ΈΆIΞζ’)ΚΌJϋ¦@­©˜1•“ζDwŸ‰P†ŽόC¦ΨCiXφό·7&­όνTωj0Χπ3€ΐ«Άq‘3τzΣ%C'±{ΈVθ/kW7~%Ό¬1IXρΒͺ)~4 p¨ϋ 2ΟΏ²<τ—uŸΌCJz9Υ‡€±―iϋ1€ήβΡΧjYυ’ΆόpσΩ‰½½Φl‘^M°ΒqkhΘJvψ‰·βƒ ?ωυbWζ3˜ 52ΪP³M»ΰΕμΈ[—ΡXκ΄”·σςΆ―Ν<41r)—Dς#HlήLu15ŠΏˆ.κ©™΄ργ¨+Ν¬Ρ08€¨2ΓΒ|ΛίΙvI«U«œ#γ1Μs]΅Ϊ5}Œ Η |ŸΧ‘+αTuΕΏ Κ© ω£»ϊ’ECΟήψίνZjM‹ϋw;Η₯ΝMm?0θَ±Μ‘G‰·Β±¦ γnΛ-ݏ9τ{ΉέήΝKŸο8 Ψ Ω‹Uΰ|–`r˜KŒCύ–‘ŽΆ.·Σ.`ΎœAŽ(ΟΟφά"m$i/Ψδ©ρμvΈσ€‹‘Rϊ‹GΗ šP}?“[ iΏj=/hiCΧπ#—ΰΜ΄±yqwu Ο@Μ½ύ=#ιY=)ΛRιͺκ9―p[άqξf[pψ^= ό-,λQ«uα0―©ΉE»ubNΒhAͺϊ ΎrœgZ)¦€ώ<ƒΚ|ϊ™Δœ•Κ]f*΅5Ž¬Ι΅Ό{»»»gF³i’šΟŒΆˆDύχ` ‹’LœY­bΗ£Ί›Φ.Ά\9†€IΐNB€š=€>"E„P΅ΟΦq½cgΟ¦/νιK|-³ίA]iψVΜ>8ΦW'¦ζOs6]Φ€‰σ›~ΐ:€Νυή :ί&σͺ##Κϋ!Ζ7b4 ‹h@™‚q:WΈVIΩ@J”y[NΠΪ(¦B„yν KfVŠv%Ÿi@Ά’E‰ΗΘχφγV|vχ³O '†ŠόΣ¨N@Pt‹νΊ·ΏυΙ½‰q˜wήP}όz}°Ÿj¬άXΜΣώδ!$6 ΦT=Άr}δ‘­ό5 κ­οPάh5d.%­…4M’e -ΖάbyPi€DλAψ0Bυ―lι^uΠBZE/SψθΌœhΥΓ4 Σd²@ncίσπΓΦγ=TŸ‰1…„x•Pΐ.ϊqd\υ͜4OνGΏ©ΥκΪ‹ˆ•pqύχGέ— η{T«HςΚ7γͺξœLxY;Zοf‡Χΰ¨hrjrαήώθ'"N©°Nή3ΌτΧ”vή|ˆΔ[Άν²>Y,΄>c·MΞ’Γ’ψ F‡aΆΆh–€|~ιϋρ9ωzˆmλ+±™΅ ƚή7y€ΰχόθUsmκf#ƒ Ύœ”kOuΦ+»ξΎΊpω|όX±ΰΞQWޱkΗ³­ n1z€c>›^ίpΊφˆΆηœ‡‘9Ιkς.jΤ l£̊gΟsώ†½τ ΟΌDΧ΅Λ¬Μά/%l―Τψž¨TΎρ_ΞNfžά=ύ˜γŽs©(3‡α«yoαHμzΓ·Ϋžϊτ-–σ(¬ίqϋΤΒμH™q ϋ,wb’'ιe³C¬υ.„ΰߏ β»θΏŸώ1‘΄Ώš,ζΞ1Ξ Ω‹|k Ή+ΧΈ1)ͺGC’ωώ?'λ›Έί©©€ s7Z,αͺMθX&œ$C ΝΤΰhμ΄ΏhYsU=ΔΚIΡ ϋZ{ο9Ησ&šάee³U —Ώ’‘”΄~ms.λς~p ίm—ςo#ΈΕ€τ C(ςœβ° ·0]_ΥΛ++π(~όΈNΑ^UΧ!‚‚‰βΖZkξΏκςάu“Fΐ玻f—ΞǏ”ςΞχSͺΔa^wFη9°3™ϊ±γΫ?ˆ€ιθθ~š`Τ.Ύ΅­δηϊxGGk2r©Ζaφ㈿κΌ+ήy'ή}₯ΊNΕ+9ή7"vδ8οΆž\7+Κ9―oY΄H~~γŠξ›*{σ;ϋό˜σ=χzW™ΟJΡ¬δό|u3,Ll‰Uξ 2˚žS˜Ψ’ρIPτ+ω!ΔH8!s Y˜[9¦ί‹oƒ©Ε\Χ+ λ‹τΡψ3H«²nρύΏσααψ/}lD/1.ΛψΗ†q~3Ιhκ\λφZ³Bϋ“‡-Ϋώα‡ξ‹$ϋfjάΠkϊ˜'χΖθε‚aώ₯ΙμXm˜GΥ+’΄ ŸΖ¬Ρ0i?$ϊPbAi:ύJΖ–J:(툴&2±’6DζZmh>ΤΗόb‘ˆeΚΙβnlΪ(t/·ί΅·η/ζy7β;3Ο‘2«7―πxHWЍ °Ώ2)ΊκΞ )ο˜Χ™γαV·Vεf4ΒJ6hU`>χZΡ«Η*ΝΦ|! €ΑεεV·”›%BκΧٞš(<»wΠύν¨γ¦`LήΖ=* ηκ‚ε·0]oΔ柡ςΙγ·ξpL#Νϊ[alφ,o?A^VbώgΌ9zjζH«χSσ k――EbΎΩHΜH$ΌκP>ώΨcVqο }™Λ%^gύ<‹ΧΌΩΖ3Ρω‘Q”R{«vϋ­ Σ—.Δ_B‚,S"UΕO#{vjΚ„Cw#ŠΝ…™ΐHEk¬‚΄ν(βφΖunΔμκχι+<Ώ{kμδTϋώΤfόl‰ζHŽλΐαώ}nή?ξ%ŸίgΫη8vw`ΨG»sβ”ΥgΫiκ8hνν]PΓδΔY"ŠlϘ5w{] sΨt‘y%š€‡zŒ§ιš φ0ί†«!vp±—?«·1ψξ§σΙ9IκƒͺκΜvJhο½r$hΈ†χ™Ÿη QΒm%£Lu<Ηg$ΡΝ† ‡gύT_gr4ΝόΧ³w_ΰΓv‹ο‡εψa~whBUEŽήΟ`φ±Ήs‹Οq\s―Y$؁ DyΌvŽεv„…¦x&YC­uος:φ1ζ°•ωΧx>ΪIxΠη9π†œ_8ƒINŒο{ιo€y晨5Ύ‰?ωσ,Ά΅3Ωοοάέr~ΛbϊΤ‘IcΒΉ|MΩEΦ"‘@= ZY»ηlξΚώ7ω«δζΟΊ%λ‰’Ή.ͺ{a}³ΰΜΏt-Ο»f¦₯Μ¦ †o"zΘIδO IζRHχ“ΈΜ{€Ή„\Η…ΙΨ-)Ί$λ([`v―ΜŒ| ”-]τκ-‡γΘ t!ΩΌΒρζ­»`€Ε 7ο σ4¦’η šΎκο™ξL„=έ<ζΕ"Ιύ'Γ>ŽΪ3ΗX5.ΔM‘+h”EUz1ψ‘Οhχ¬’­#΅i\dŠ6ψXΔ M—©ΜΡ.Οΰœ/M9„τΪφ’•"WνΖfύ"Ο›ο£ͺž9«Ž<ͺΛvπΞ‰#0uτ`ηΔK֌ΐAήKήΖ2«Μ;ΜΩλχ‰ΏβΨsΘ>ΊAρ―1^ώ8­]CA’|Ǝ[gΩ―[!Λͺχ’£ττ΄₯hL›GŒΞ~λhœW#ύ Π\}k “œ·`ς#U̍+>ζ+°qˆ`R›Ψ1Ξ6wSϞΉ”žΔ πχSvβiTΔ½›=fšΥ ԜʼίYηN^šοζκΥή•t'τt?α[QΎΆ—ΤσΟΣ±xœW[Ε^!8}}>¨"υeΙχκ[ρΗ€(J―ΉΊΜh8zyΧ—*«˜DεSσya`ώƒΆdΘΆœΗqω#ΏΈπ₯’ΈƒηίqφνΠϋ^|ώ―ξTΛ[·μ°^€Ο"ΠGι;@~οbμ~ώͺ$§πZ–σULΓ~πρΨdΩlnυΤ+Ώ=;’D$`€Ϊ«ΐΉS³B™JgK_ΊϊςΗΣSξ§ΈdBޟ΅B–ΝσάΊ+ζΆ₯ΗΊ€BO2—l—œEλξήͺz+ϋΠ„ +}m}aΞβ_Ύ|.ϋMκ˜+‹΅K›sUg5&QˆŸ,vA³ϊ€•£lτ—‚<μξwΎΫχƒ\οψξ.i€|ŒŒνΘc3§6mnΪτTV=h›kχ?μθμ±Αmb^υš’ω”ό €uΠU―$v2ω‘3³4QFRΤ+9¨O]υi–L}dš%ΖWώ#а€k{v‘³5ŽΟ2ν£|ηpΚμŽj¬.Ί³0θ—Θ¦Ύ˜e9 Šζ²½gPν‹ΤΜ΅Zθιe {ESŠ~i$β9zΩμX:t]>˜Ξ"6¦£ΥΉq―‹H ˆθ;ؐ™TυZt|½’ϊwμM3)E­δt½P.‡Α­q«3-ν•ϊ•D¦uŠ€%ςΕ@( $ M‰ ka«lϊ+›d ΰμκ/X;ϊb­άΔ?„Vιs­z“ Ο‡x)€R/dψ Jϋ8$*Όet‘“ͺ2γ²ͺΖڟA0²7܍lOΧτΙM%Ιf"Ž?&ϊDέM΅‹λΚ< ζŠ‘Wυ³4/sδZηeϋˆ―K™oμHŽςΜ{š—ε0=9‚JbW‹Ω0wxΥ€B`ο0™S?UJ€?‡yΕ ρύΖ4ΐPΉTκ3šϊX΄{~ŠWεZ5ρ9οn™l·p0χKo§:{²T$ν%Z Zƒ:ζ­M›_έ9Eλ=žaχχ@Γ¨,ν£–ωR’”;σRιoΠΟ5|*ΥC9ΰΞCzί)Z³ώχάž€΅5Mnζ1NΌρΏ600pΈΥ™ωkp?€’μ˜k$>οRCΧΥ Σo˜ή₯HE«Ο–ο­9–}­Ι7Έs?w5ΏψMΒΐή0,¨¨8+Θ€‰i_ΫυΠιZbΟμx<τ‘tΑΉΐ„η‚•τςlz­ρΜ3Ι™ΔΉ0Φμ»Β“–»>xΡη_Α6ΩΛ§”K­πΰƒΩ―Ύ|,Ή˜·‘ίοaY0;ΐ`% CϋΚ|Xtq†Ω|ΎγΟG.,J\Wσ¬ƒžΠΘƒ<―Y΄Α|Hγ‰Β ΛαΓV‘··υΣ]ΙΡ Ώ@ε{hš¬ίHμ/σχ»ισι―ΗvY^²ψΟQDS³ώUζe€|`oΒ>§Η.Y_ιΑš}‰αt02!Ÿ„ώ“#|yάμ'aΰŠŽ#“²5{R~͝)Έ±£Q«ψ4Οφ©μ#Θ>=ο9ξ³ΣΘΉ›λeσ΅6@’½W·A™·ˆVbϊυfRD$1¬b’³0·Κύ‘ŒΩbt:W`@‘uΕΈ*;·όBκ΅ P’φ2εQ=ωˆΘ$K¦?b†e~υw·RPK½Ί…s†!_Ϊ?}Θ1Ύ«¨r0Σζ\Ζ0Σ[ᑇ9₯‹ίΜΌΞρe‚›ζΊ‰Η_©±M·ϊ9@΄Ρj@U]φΪΠ€―ϊ\υw­[`bŽΈυ♬•€Ύ …,_Ρ_ί₯9RΒ‹˜ΐ‰Ζ:.ν‡Š΄+βΎ:cSe³:‘ΏOΧXiXd‚₯Ό/{γ ΊέίΩm@έyΣIψOHW1œ‚ušnγ’–s«μ½W{Μςvnu' *‘ΎyžTΤsŽ?.Mη0―@`˜ξ§Y †όZ{Β?=ω€ _mξ½GQ™oνά™:ŸςόΟ#Ί|δNNnα"O˜Εa•ύ\8§ψI±/Ήιω£#KfZ•Ι4ψ‚Ε¨q~FΎ•ύ^ωLΨs„2'ρ™kζ™ ₯π΄;ξ³ώ*}9υ"Ϟδϊx;7ΛN(’ηb„yλy˜ζz:A`²G žσΉΣ£sgi_°ψ·――γtΕg,Ώψ“μ…Œ¬[t›/2© κ} ψKσ…ΜS€*ζήy†ϋO>eΗ gΈͺ .†3‹Ώ«>vΏλžY}―zη.ežΰΈώ6\FFFς,λμ0@IDATT~…Ϊ£\ξ 5ΘtkξƒΪΜc’v‡οκ’γZO£(XΥυ΅F9«οΨ³F.δ ε+£Lτ’·’[)μφJZ €¦ΙΥr ―¬ρZδK’ύ’?Š4)ρf\쳦ώΠ–΄aΜrsψΗκy„ίC „xuQΰμYŠ=χ€‰y5όQέm<Ε%œαιΎΆ ‘^ϊ«*R¬ΏϊJ4™»“Μ·UΫxΦ’gΥϊfΧ₯ά fzSnŒšφFdzψΠΑV€N 8rVΓ)†XŒ«4„„#'DΒό‰‘ i–Ξ+οΗΉ‹9γλ!Ώ™υ(9‘Z%Μ#Y—΄&& ―ΰ½h?š)b²ε°.ι~υ'pt™‰ΆΤ*jηΨΞ­~.Β,B@η—bΧ­€―Ζ"³‹+„uEΛΩΙ5ˆζ,7… θ›Ο:w£eΟ`Y“Δ<ŒoŽ΄FΚp.‚Ÿ™ΘI³"!MΥvόB΄§JH¨9p*ͺ™’LžΛYη0³›Β|KΰDαy“δΚQ†uŠ«{t­ltŽaύ!B ok편$ψͺHζΦΠδ"DŸΗυμgnͺδzΝLΒ!B „ψ6£ͺΆhΔ}7Σή#h]$θΙΧNf xZf:oΰΊ6 @€Ϋ°> ΩIR.&U€C’δΏQδU v˜ΦEŽΞψ\ΑG@LsW’tiEτ]u9Ÿ·CΝbΊe.₯Oω•@Ρ$)ΤNfB‚θ&0#ΖY~υ d€€ΪCΥηΑ‚§ψpνϊΝS‚‹/v2l©:D(r{ΏWΞβΓ"†Ύ¬=)ŸU ­Q FŠ€Φ4DΫp:—vJYθƒ°Ην„Bξ ˆ€Bσ*œς(Z?G§pΙΪ_e₯7 “:“ŒΜ阠œΫεχ32–5wG‘˜ιίΘΓΊ!B „€6!ί„γ9Ÿo¦hvb†₯Θd‚C-˜QιΨ{Ρ ΐφB2c;=^ή_ν­φ²Ÿ€‘2+Υωœ({½φL SΎ › ΝLΫ€N’`†%€@HMQΫλθΑΙ·%#Φ/ ΔΪΗcj•vXŽηφg‹EλΓω\ΟθΚσ΄©ΒJ!B „xS ―Οj‰Fόwα5 ―&ΖnŽ(r_Ϙτ 7M£ΌqNΦ³χ;„S¦r™SI³0Šδ[sED ’&eyM€H;"m‡$δςϋ3+Ν‰Μ·δ‹0S+ΖUΎ!bˆεΛ‘¨O-˜σΘ„«Šnκ’‘yQ7σδΎΊˆ‘—)V•5Sυιγμ«>οNσς{©ϊΨ΅|g6‹Ž«ξ#Qh%―έ³z‘Zs0U-C@E½V―­ΊΟυΎ‹¦ΪωrHs€$ƒcω•Μή4†@’@ΎŸΘ0Ρ$1νυ-ΤSΈdiT47΅Ή Υ΅AΤ‹v…»Φ›Ox>€@HPΐΩΡ—Ψ3?™όPΑ·‹—α;yΠ€VQfΦφόΏπ]ϋ7q?ΒΉW§aυͺI‡?C „)πj’@‹ΊHa‘ΘW+[/Ήλ)Β^ψζ• εΐΊ'ά¨£< b<ΕάKλ!¦V喐OΗ%ŽΓŒgp…jؐAΞκιLΡHΛe"%ρΪ JΊ·uKĘh‰ρέHQυ$Z—6n+gn9₯kΞΥEυpšΎSΡƒγϊΓΓB@]]78ΏΡO@Ϋ"f]+ˆλ·ΠOoυ559wΧ2“i™4 ›-Z§1₯ΒK AŽιςίH:t\ϋ)“ͺφIηeV'‰>§I©} €ζp ­‡@₯^…Sފ?‰Μ΄Œ1%a‡Μ5³Ω ‡νB „x]P`hh(ή‹όKή;Ο@Μ―ͺΛωζO:ž}Ȏ%ώΟ“gΣ/@”|Ό.Œp‘!B \O μΪe%’‘βχπŒEθnΗ`ΰ €‘'¦―dεvpSŸ««Τۍ—™l/Θάξ“9hΙ’ο@6β©Ή‘ΚÈΚYYΜμ8¦8JR¨Ε1’Ωt9T9Θ[Fζ:CDΑ’‰€ζb„Ε$ζ—ϊ#AD+Σ¦ΙΐA&yα >κ/(šΫ•«%“SduX^šμομ6Άp•Θ^Ρ;aŜyμκAωτ}/CXI…n«Ϋu»˜`gυ₯‘™ΒY_Ϊ£κ’:qBζ*Lquύκ:Ν|—‰’Ž]ʘύΣΎ-bwŽsh£"ΟαΩ) "ŸiAΤ&Ζ^›}ΈˆΆΑώj\΅λΑKtUΠe‘]χ· Μ&9}S/κfθΦ )RΰΥC·ŽŽζOτΗ/g]‰σ*'J›ζMsŒΔX_$ϋΩg_<—~‘3ΊWΟμΓ™„)RΰΫƒv!ΊΏΰDΎNΈΆΦ fLžυ•Œη ^†ˆ+΄Γόφ’-@^φιγ)‰ω4 ©ΜxαJ‘­΄’Œ¬΄2ΡκG3!ζVΪiBΤ^™ua’%mŠH"gιΝ2Ϊ7Eϊ!υ-ζ9(š‡ΒΛ^]pŒ†&8O^t}ΈΏοβk€Έ±Θ)L&1Χ@4.T˜eB+"`A«^Μ²β†P ¬u—η·Φ¬ΩΠ36%ΌΦ"ν”J|°Π]ζU½ΗQήΠFy?$ε”.­G ‡rΊh₯5Ρ|δ―d‘Šd&ΡϊτxŽPΜλΆέIόwœžœ_…β}‡%€@H5)π‘¬φZξΣΌ c‚³ϋ€ιœ•\a_θΩA/¨ΐΚEωςSΝͺ¦œ^5ίΚα }Ρ:d&₯δŒΪ‡(*™LI₯ρΟhŸ όvYĐ`!ͺQΟΆζΡR)B–φVu΄o*ΪK…X–ζΓd―g΅Ίξ²K‘nͺˆKH!κR s`ρHv²ύ-fη '^Δpu'ž)R €ΐk€₯llΜv1Ώͺh?”\ύρΡE“©ύ¦9Ÿ€Δ §ωq£[‘χ˜ζ4Ξηb2gq&—FCΞΛ2Χ‘ζCΪ ε„ΈŠΏ‡R…Ω•T}q| Š˜CM}Iυε„0Hc„½¦Ÿ‹αxƒUб—D_γ―*qΫ³n;DhάΰψΒt/Ίλ…jœΫΘ§Ζ€ŸiΌ,*yE~Π’ΣΛ@B>°(•fπ«™WΨέ:Λ|κZ‹’€Ÿ’“ΙΤMŸςΒPΘ>L*Κ•²šΟ²Šr΅›pΘς©8*οcΙD, φG{'ΐ(wE:“6K`’±Ί#Ύ5x­sΫ‡)πΪ§€’‘yϊε)Zχ¦Ώ _ϋWR €ΐλ•~ΐΏ›υίΗiμΑkž€Q{ϊf;Ÿ{°!–Σ«A倜ΛMώz‘τ[šY‰ω”$]󱩜ɲ-Ν‡΄ Ϋ‘¨χβ€,P"Ζ—(»ζO~31½bŽ₯±ˆΉVS#1τŠΘU«hœ)|AδT] .Π;άiBγ.5’#:h@vΗkm’ju\η˜uRL^ΩeνZF=ΊΜ―/˜‘΄Wv·ΑHͺ[=ί:Γ­{X@¦Ί‹z<(Λ΄2Ÿύη0³*g·Χ> ‹yΙtK€EηUOΎ*§1έ:ΟONη&Eu€aΡώR:μ˜=°ξ„Β !B „)R €@H7„~ΐYΏ³¬ύ`Έψώ·.]ɞζΧ+bβΪ4‘fΐ/y»`Z£ Šb΅³/†6#c5ŒΣ$‘;Eξ<Υ1·ˆΐΎsi>ΔΔ*?ˆ4!J2(ΰ"ΣEO’Ζ˜\‘ΐ°œΝ\lϋ΅•FΜΊΦ Ίšα§ώΞh!)“‘J)ϊήIŽ―p―œlφK9 Κθώ±ŠTo~±·q@WZ©’^­DkΊΠʚ; Ί”A‚ΡRΠΑβMζt KΈΚ°0‘C“q~2o³o@dfutH’ΖOD“Φ˜QςBi>Ζ22»#’M„ν”δ:Ν|cλ k‡)R €@H!^Ο¨~ά;VŽφj[“°θίp_ησ`/š –υ€ΩCCGΜ»Μͺ_ζLb捩 ¬Β³*jπP€“©Ω‚ur4c’Z™<rdƟ@EQ•b8W&Xr‚–Ϊk-λq½3AXή` ‚uEm{oπSŸδ? #Ξζ kΚ»–wzUVUŒd[Q>tλ@f^ڏ›YR€ ―Q΅€}κοŽσ©Λμ—4r.'ϊŒqV’^aoε˜.ŸΥ—σΉ|AXԟL·Κ`ͺΌΤ’οwŠ·μ,r3ŽR €@H!B „xSΐΞDoZ.ζWΎxψ€5>βεγΗnfζσΥΫΠ4cx›uΩΑE>₯©Λω<ΙDδΜ,iΊ|@ζ‹ΖtJ&WςPώIΡ0t¬ŸΘWʚ-³%)τargшl‰•τ\‘w»Eσ’)–γΙ—cuΪΎ·‡± ΖΟ[ωι¨ηN°–ƒ›EΰŒΞΌρ O}Ά:n+ΩΡ»JΰŽZawE·ΝŽW=N­οκWΙ2W0A pΰ!ΪoOΕ (:q!kΜ­΄O²f“φJy\T\|mC¦kBZ-™Φ‘SΑ―μΣc*ϊvK.>{s6Τ ώR €@H!B „)π Ζ)/—μαœν“νάώ*–7dό&ϊͺe}~"su”Ο›+ύΪ’¦ΘΕ+9»³Λj·ZxˆqγšFγ‘/ŒYΞ-h<δD ‹86‹Ρc;ΈaI~Šœ%ΏiBδ ΖVΞη2ο ‘_‰ιΌj’7⫘|…½Η―#σηŽ‡Œ=tθφ,«εΨΩωάΑ[N‹Uί, @30_"wcυœˆΥΑβ[ΒXΞηΥEζP’Γ|Z ύ) hδn0μΐdξ ώ·„OΦθe'υ²ίˆ~koeR'Πv * 'ΗvQHύ†΄ezΩ~ΛΆH6 "\XB „)R €@H7‰„8χΈρ/ce+;Ÿ/΄w9₯R.Υ5»˜™Ÿ7?nLΦΣ4iλ.ΪQ'•ƒΉœ»ΕΌ:˜ά΄$\Γ΄*"Φ|ΔΐJ£'~« '»€iεψ\Ί`$η-ŽqH—ΏΘ˜Veδ–ɏ̯bΤΕΔήΖ[™ΙΧ"(χ²’2‡j–vλL&£δy€<τˆUϊσƒώζ#”4ΨX#NΉβΉξLωkωί’ηφαχ’œ[XϋREh Hu›λυ]@J OΰO ―…S˜`)χŠr²œΒ—G`bο`Z•πιI‰'™ΧfWΡhΜ„Z–―‡Ϊ«δ‰†&ΊΚ«Ÿ]ε3v*λnaG΄ΓR €@H!B „)p“(ΰ›ΏRkΚ°’³η*^Ή/M«…<Ψω˜|6β0—{ΡΰΐaΞ6V&U’˜‹±#Π¬˜We7W]™ε\ΐg@r¦ΙΉ˜ά±©Όqd“*‰Ή€Μ,ŽΛI‡θ΄UΜψυ$ϊ݁7ΜtF>,tcbœε|½‡@PkΔ8‡+>²)h0ŽΊζс§ρΰxSŸτ+~£€pΟJU―Uτ“c~¦€•mnT‘–)Βξ瑃φ_ 3™ξJ΄w…CϊLυ³hŒ΄­€ν§48&’Ώez' "σΌ‘­QZr‰”ό§uqΓΐνF­;μ7€@H!B „)Rΰ•₯@Σ¦1i+MJ‡rΦξ9%€T\š)ΐΌ pΈΖDΜ΄[9(ήΛ"Λ· Ι,ΡdΝ†™•Τ\ω.δ‡ οbΆΥN>%Δ»1κM‚εXέMn Iƒ"ή{‰V•Ύ’Ωœ3Ÿž=B…bΕωu~@‰ι]ΦJBΖ°#ߏ-^\€HΡ§D;i Άn‰˜ίΤ©Qͺ&]γμF XΔqώט  ,ηrJ0Μ«πΣQ@iFήr{«u`§Ž“―? —δδ™d“·lOΠ©φŠ(7Œ2Ϊ›βϊΙ‚Ulϊ:ΫΘΒΊ!B „)R €@Hί~hZβη"Q+aΕΔVΏ ˜L•«|ЁV$1³’†K*.­ˆDΰ·νNZίyO›(SϋΦ‹icς£œ rj–Yό ΨB©½")ΥfΎΝpϋg Ώž}Μ„\£υο…Ž(ωžΦ βΨ~[ΔΆχpψ[Α`~Ι½δ;ΕS0ί{ œ[οΣΤ·­ρ-‡ΰ}δΠΑ¨cηϋ4Ί΄ »cf>ZΏ|)Μ΄―jΟP@BD&V2KS`%TQ™Α΅@™Θέ{ eν&όε]·€¬o[°NœΟZq4"ΚαRΔ/]}t’Α^νζΙ!"σ;-$b;‘Έ—+w\{*αѐ!B „)R €@HΧš ^NΥNΕ‹Ι J™!7,³‰t%ωZˆϋμnw­·"9 ς•’#m'gˆΜ}ŽžΞIΊΪššpΓβ·ΥVf[ε>ƒ6χYžQνΆ}™ ό(ŸLŸT<0€eϋ·+SΉό?tμLόψΜ°5|‚y½KΏ7TπΧgˆsτ^h“RQ/2ΠΨρXΩJ©αΪρ"Ί^E=iO ψκDΙΫrq:gφI)ω€(‘ΰξώŸΙ„.p€Ή)‘φTfk§Ζr&«ΌŽk_XBY@D€N+V(/ξhΈ°„)R €@H!B „ W“Ε^l)€rB ψq(λΉ2bΛΤ5s1 2Ή‘ΝΏ˜T…θC+°!&Mα$ώΙ8‘^avαo ³+1Ίbrk΄¬t₯±qkδBΞ:=–·π'Ό’¬ώ]9Ή|Bσ λΚiΎ …Ω“-.τVCUt”–ικcM~ΟϊNiE"Γx΄Ψΰκaψ –εΉo°αΪκ .ŸνŸΜ₯΄W2Η’s~ί–a–}kŸs³fOϊͺώΑ²W{8H°I…ZV{eG—zΏω‘°‘ιd²l―·vᑐ!B „)R €@HΧš ‹ F (ΰ σ›²› (’˜P™ήl#L«€ίϟL[Κ’.Σ*1ϋ§i§ά!;ϋβ&ŸΪKΚ.†URwΏΣΔ}J ¨Άς%i€ φ΄ 6³ύ”XΦ'Ϊι³ΰΩηγ“4rƒΕ·’3₯QK­ –έoή²ΑžΚΥOΏι.$ “¬θVγD%S’H9ι+<²Βτφ‘dPZ¦c˜ΜΙ9]υ₯%y?ž G‰Ϊv‘SQ(ί«σ%^&U|Η_˜±fB ˆ‘FψOH!B „)R €@Σ> ΫΊγ~ΖΛ₯e*%? 1£bϊ³Σ£Ρά*ΙΉ…δœόΨROyΦמ]°ξΪ—2Ρ²ΔΔ>ž6fVrRWΈ^EΡ’D]&]*rb°H&joŽ‚BΗEBv ΖeΉ]γzVΞ ϋ©σxP΅—½’}[‚cM}ΪΦ§YAΛχμAΟρ+&^Mυ£JMOΏq’™Β&s*€ΖBΖ7¦XΪW™Λ-²Oςε ™dύΦ¬υδKi«ƒcrΜ2δ#"Ν—²§kOδΐ.ΐ" Ή€$Π~Ψx!w%j@oIx6€@H!B „)πΊ‘@Ӑ^«ΧC‘‘–m”4|¦ω(N[‰h%ΰ!ν†Βσ¦dšƒIŽώ”7β~eΖzψ‹ΣΦc‡η θP˜^1Ά*ςAΘΐ «ˆ1œ&"_k™ΙΩYŸA#-ˆ£«§7ό C£Ο;θΆέϋΜYŽ’ngr6ǚ©Ζω+vnφjυqΜΨθ{γ€2›κή6χ=“D ΙδW³yc§/ΚZ/­”|:ΨΗy€‰΄M̝Ό!ςέρL{Ρ@‰φ4#TΞλΖΑ_1[‹η:B ˆ!EψOH!B „)R €@Σδςm)sŸ| |e:—“ΉΜ¨αJo9‘ι7ΰAαv%W²Ί Θί@Ύ—ΠTˆaέΥ3§.γgЏٖrQ(’’4,Κbό‚Ζ«>»ˆΥΒΚόm%¨+³₯yG–αΓͺΦω)‰> aί'~ukuU›„„`€•ŽθXŒAΔoΠδWΙλρːη3„«­Τa9“ο­I3.Χρϋ˜ό2q–Oέ”ozςχΘ/ν•όvαJGrFT½ΫbF2KΘ]™j»XΞ€.guAP9σλΟτ+ £οHO 5 7egΓAB „)R €@H―~ 4 @zΘHψ/Α8—ψ ΄.δΧ‘¬βϊˆX €ίbFϋ`LežsER’9Ο-Ϋ”θχόB”ω\šIβ ψ ?1­WatA©^Γ¬„}ΚΪ]]”ΧC9JV­Αχϊέ¨Θψ{씿پDη+Ρmλ)¦ΑŸώΝ‘Ό7Oύ],~1ώΞ0ίτHXί1ζSυw><Η’ωȊaoΞf#§(V`Pΐ Ν“r³\D‹1J2Α^ΐΔvLκ²ψ<ώ<—’»ΐ™φ|³9ύΎ…€…»ϊγpΘίG‰/2΅·ŸΌ*S‡ˆ"vsŽR €@H!B „)πj§@ΣD ±m x^Iη!ι4ω"Ĝ*4;ЈμΔy&΅μŒ,ŸΪ1Κΐ@Rvω ˆΡ•$]@DLΪ«‘˜[9/+£vq™ΉL|:Ϊ–΅ šŸόG&§‹F²―ίΧT|k0RςΆWχa{ή(Ώυ” “ώθΟόζΘ±ΰΐϋΣΉ «θφϋΌ@όύωΰœ>ΫΊ‹ITI2ΑzΕ ψΑΈ•’Y Šξςε8τ@N)>΅ϊSΦϋŽ–ˆCδsιaη™2ΣπΰΠz΅oΚ"Κ8’޽b )R €@H!B „xΥQ`C€T΄/’VnV Ašqœ2§Κβ.Ÿ,fPςQ.ωΘDgΜͺό Œd&V>brΕ€Kƒ"™j)R–£ε‹0&CίΕΠΦ+°oνZ™ΓCΥΕPKr @Α:XέO4šΊΒΪOTΝλ¬εGΎU]Gίν¨}”:Oρ'^Ώ°X‘ΌŸh­ˆ°΅Ί}Νί hQ³~ƒƒ2―R4+εΡ^J£!ŸΡ\ζpΪ—ssΖ”N4–i–@£φX@SΪ*EΌ’γΏ€₯|?΄%}ΤοF¦(ZLyΪ.ω!i°ᩐ!B „)R €ΐλ 0Ξ—π˜ΪC$I½&{’†™ΗόffΎμ' Οΐ,K¦>J`(ŽΤ0€2ΏQˆ]EL:I²@1Ό[1½2Œ,ŒͺΜ}ΔLOΒU «ς‡p("–ΰI2‘ΆΥΐ’ή^(¬€ˆIP€‘Ήth|…ƒΉΒη%Œΐ˜‘a˜Ρ±J‰Έύ΄­dΈR«φ<Ν Λu6σM4θπ(;‘{&΄L§mŒ$’΅w a|z€ Ή8­ŒθeM‰&­‡ήζs€Oω‹(ˆφ_>$’ϊŽ―ΛLΙ*Ξmfža›!B „)R €@HΧ&s7_ζ―D2[ΊνKbερ²€˜Qω„΄§ˆ€”B£Ϊ ˜Fr•?π„‘ž OΙqΩ±φΰ'"Σ­³0·- Μ{ΰX•τN`B>2λSΌ‘€]fB™\ήpύΑjΞ“eΥ­lΏψAOž΅7βΕϋψV £λDμ0αsΆγΛϋΩ`ΌΥŸηCΫqΖ΅άJ[ΥρKφ nύΌœκκρλύ€†¨L˜rti f€ΫΘε"RvJ'<2a•cEΗjY SΐCθQVŠ\–4f±Ή›’½Lν€UI.™η%'Ϊg­L½Ή„ΗC „)R €@H!^ؐδΓΏ3‚αŽ5ͺΉqOE«’Δ\Q†Wf:Κ€=/Ζσ%&8©•΄ r³+FU&;r@—¦δ¦=.Œ«ΐ‚άŽ)€ά•bν‰OWr<ω)Tγ›B‹k)Œ½΅)ν¬ξ£.Mΰ.| ϋ*s¬κZΚg9[(ZΟ_jaΕίS¬u5 +ΪT€F›-’₯²ΠΟ₯Λ°€Q 9›kδ’pΖcS·΄GMhέ^΄L:§?ΥSΎi―€₯RΔ,™Υ)Έ€€hŒHh2½ΣXμθψC%ZXB „)R €@H!^xΰ+rί€•ΪΏΏ§ν`ooλπ°gb+ι<Σ i@`*ύOώ†uΚBθ ӟφB…Γ•)Tπ!“ωP(R•€κϊ.Π"‡si7ψyΘ„GI  d²#ΐ!WφGrˆž€ξ ?™„ 耑ΦΛ™ϊzτΉ?n§ΏGƒ>3ΙμT›ΣrΪφ­ΌηΦw°N€ΣsmΡ―Ά/΄Υ§ο:ΫΘ²)±©FΥƒσ]Ρ¬”ίCQ4–ΆIZŒ±ΩΌ‰l&gsν•B*υ̘ΞiΏfζΛ¦U2™Σž¨Θy]{«¬φ:½VŽ˜φLβ|? 2yyΥπαϐ!B Όn)04d%[}<"yΈfbs₯δΌ oo·Xv‘`9-Ε'WτάDuγγVB!σ[.CCC΄ŸΕΦ€ /ΡωR|Α*aΰ—Ϋw9Ι|ΙΝ%+σαϋkˆ!½zΆ³5[(ΉΩ¨[ŠΗ―–"Σeφ+Χa9EhœX:wφμU VWΠγA˜Χ“m‹©R$qJ±…Ω’Jνƒ=ΉσηgηW·W½]ω|GΚqf}έV7ΧO¦#2OμZσΫHίͺ«kšιJΙ†>9?S΅Ÿηώ:xpvρsŸ³ΔΧΜ¦3Μ}qb«Χά—±\1²ΐ=?::§uWςΔρ½™bχττ΄φ%ςΡtΔρβKχJ‘½|ΏχFζ;kεθ(˜OΝ>΅Ώ—ΟΆτ=o/·Νm§¬ν64μΕΕ–Bά*ΪΉδΒώφ΄_΄Οy–w’sΜ9“–σŠ}Ωω&n€h ί)½ΰYΞ$Ω±wξΑO`izoIΣ•γ£$arε2GΏ!LxΔ°ΆΑΐF£Š¨dY§ε+νE; ¬$κ/-˜πȏDΞκΓδQ½FET—ιVW‡k]ΔΜ«~Y§£U \86X~Ψr—ς XΦx6ε Ÿ£j/‰ζUΥΝόΘhφ‘}ύ}Ώ<šϋΩCε3ph@CW¨Θόκa“EνCηγWrΖFΈΘhH.©½TˆeΠ^(Κ•ΪKλΥέQ6Η’φK³d'ΐ)?™Χ TR¦Pt=σ -56€@H―6 8ΡBό~Όψ>tϋ-ΡBKΊχrXνEˍYv,ηΪlΘm₯δλ±2ŸŸ"eSυ"’₯©7ϊύσH‡Ίγ^kΪJ”2EΫ.¨}”ωxχ΅Er~kG,υp¦}ρ/ηζ¬ικφωΎo m‹οf‰7κ]‘–δ"^™97ŸIl»}K4υί³‹3;k­τqάΐΙΦθάΟdJ₯ο΄“Ι―/οZύdκ ­­‹,,X—ƒξŠ™δ=-nα_}»'Zl](ΖKYh q£γδμΨ’ŸOaέΊ%Ρς©Bgϊo―^]6›ϊhπι̌₯ή•ŒζŠ5"_LΞρ™₯ίxΑ.XnͺτΩφ’υYh©΅6dςŒρͺ?uαD²?)|ΨsόΫcEθ[Jf ΫPέΌxω„o۝ρRρΩνΫ­ίΏpΑ:Γ’*@ο…ΑΆNΫΙ+Άρ­qί)Ψ-Ι΄-άΞΫQ³Gί•π¬ wu~δΨΩ«G9ՈaSΣΊΕ›Ώ+ΛΏΧ*΅Ζ½€7og|'g:Egbοήί9ujζ%o:$*ΧΔέ‘XξQίξ*$R'—IB€™ΗRˆΗμϊ6@’··7e§&MΓΫͺΧ ŸεϋΪlšvΆϊΞιΫϋ­rtΒ:±‘y &[άΕpΈ'Qr2^2ež ±|6ρNwZ>;ͺ G5€Tn*6<6βΎ τ}ΆoδΧ;ΖΕl˜β%‹³›Άγ₯]ίΎβόc·Ά<š³­/žMΛΪG‘λZ6 @ςVςtάϝ•c§²™Λy\p…ΰ•D~Ζ#‹9•ό@TΔΨJϊ~FVτν[γΖάJΎ$’€œΖ•U[Ϊω(y‘4 WιΏ'gœFEΤψ2/’™‘‘κšλt²¦ΎΩ}³Ον3&ΪΥ‘C–χΙίπ^f„3ύ‡cζζ¬ΡL&H †ωΡ―,ŸMδΪ“V΄8°|€ώ·Ο΄~_:#ϊζr •<ΓcV'Yš+˜U)?‹"\ΙA]2§ke/d.'σ9™a plΘ]Η€S]νΡνΓIόyΈŽ=λ€W΄Ο7žUx6€@H― ψΆλ΄ρfΈGεψ°GωMU~ή#—ΤOR2qόοJ]ˆΏV±χ%ί»βΫ‘­Ό^ήaω^Όά@MTψ—φ Άƒq‘§Ηz¦YB² “hͺ5ωOXΌ%αΨοΔgρ τ‰-”`¦h[;wZ_:rΔτ_ΎΙ~ƒj{΅ά;ψύύτί²΄ˆΛΆούClΑHtƒͺΨ…ψ)€ŸwpΰvΦ] }iζ΄΄nΞ₯™ί§+šό²{kμφhΔϊyͺΏ ϊ£]*χ ΩΠzΨζGOCΗYΞojMNγ―FΠbμψ»ΉΆΎ“ ΘΠ! „φ Ψ«Y±ΥnΩ6?·p9–χύΘ½°bp+U°ϊXϊΞ1Ϋ-Š#t‚™› 0ύ­‘δβwψ%]μSwyjεkΨ™HΙώ žβoΣ&ΰhn·=ϋ{™οΞςJ4wϋΟMKϋS6[ά:Ύ5δΩΞύ|v¬\χœθΔ·½Gg#ΖΔ) ΖMκτυY--–υΖ(ο#‘ή —žjγ<Λ½πΧs§ΣgωQ|lλΞ\ςώkωiΨΌϋ¨ΧΒTΜ&π½Nα^΄©gY;<Ϋ{φ܁©–u?}φ¬u‰γ›zžΤŒλdc₯ύΨ±YnΓ§ΤJZ εƒ89š­$ψ)Žœ‘ΕθJλ±g n’Σ)ϋv Rbλ¦i'fW@CΉ'ΤNΐAΙ%™S¬hYκ»™’λ;Α#Ry(VgHΪλ"ͺΪ½ΰpέOυΙ^νŽΕt3-—bΡ}–kξλΛG,Kڍ?ύ΅έΥΗV/9€4ΦΆΥΗΧό._νk_끳9΄IŠf”ΚwCftZηfT2ƒ“ΣΉ‡φn€½Ρc·μασ-%‘”ζκ<Ύ;*ε½#”2 €½WαΥzψgοxa )R €@H(ΰΫ~‰δ΅†Yΰ©Z·δaΒ³ξΜΪ}²Ψ~žΰη/πfJΧm­Ύ}‹mλεΫfmΊΫυξβ8ΘXk•ΎΏΏp₯]οΕΝφo9%ύo§ 3 ›φRĊ½€ΪfEtIή·y^‹Y^VυιζC»8Oπ™ sHί ΛΝ©ώXΒύ9ζρvΦiLΫΚ |Wϋ―xaμΔY"λW1œ ;ό6>YŒ80±¬λκFΛάfΥΏ8>lςEϋΞO4’{Œf­8<ίf­Œ§ΞDМ ^€Ύε…+€Χ+χ΅·oΎœhΜ=ΓΨZΥωœγyߘž^Ι„_u]―d»‹λЍλ֝Mˆiͺ W &“ΆmNμݎkΏλ^–3՜!ΉζΌχΚXζWkIƒ.φ $w@η­dωΠ¨λ[k ϊΰ°?ΟνtŽc/p$,žeb«ξ;I‹·Zžύ I/q;uΚ _GΩ0yθ[ωώsLt1‰φBbhτhο€B±ž&_„†(m’ <Ĝξά7ώ ψ€Θα\&[bhΕΰκΌL}2œPθF*?B_ε—h8h,ω“t΄]–ΞΙLHΡΆ6R¨έ Z‘΅8<ΊΣyΉΊŸx)y‰o­>Άϊ»υΊ˜Gυ½ΊΚ ω-Ϊ άΙ€M‘»@9?$}“Ι›Βζ¦q,—d'9?δΛ£sΪν₯’HžΌdpκΗτΞОk_@εt/½€Ώ%k\ΔwζY†ΩΓR €@HPι°1ΉjD š₯RΤΞσ¨^ΓΎ<5΅P(”0πΧ3tcώvB…Ήo4ζκs2ΏŠΉφ½G’[aZ*Υ0νςνΒΞfͺΨnΙ?ΐΖ*8Ύ€ΈOONύςΉ‚Αυ=‹™ψSΒ½V&±ϊ‹m0/ΙΩS κT΅Α€%QŒό8Tώaw.ŸςσΆηόηΩ{φόΒIŽ―˜Λr½ΧΦ·dΙ…as 1oοϊΕw qk«‘ɚ½€,žζϊΜΥοΒN9ΎsΛξέV;u`6Q><ΝΧ^ί€ψ—ƒhθ΄§›κΏΛ™ίκϊΦ­¬c”².Β%=Ωα pF=§hΜ“V1ο+Φ%φxΧƒ¦―₯ΓΫRχf#‘Βo U ”‹ΞώΘΔ…΅&šΑˆΫ·§ˆ8ϋoΈ~†cƒόL1Ζ;tόχΤΡΨό€οΩ?iΉώO ₯ϊ9*ύη1ηZ黌flΜΟeeΤτό©»n©ZΤΊu+@dG˜ό$fU»%%?3ŽaL«ςA˜Lδ˜]‰Ϊςε#+ΗtEΎΣ;Τ«€vψΐ¨*w„BΆ* –šeŽ₯~’8F+,¬2kOc&tβBΦzÁ@C[™FΝ/ςIΨΊ₯©I ³˜oS˜ϊސ4·f jΙV€I»«λ:τؚMάΌ™Υv?ό υ9΄κϊ•οž£ a b―œ―ώ²9V7«χύτXΞΚσ·YΏΐΓΐC@䎽)λ>hϋςΉ¬!fL˜Όމl%ϊ  θSΞζVι»‹ΐœΜ­€΅Rˆή=ƒq£υ‚ΎWx<[o.αρ!B Ό.)ΰzΌ•½κ>αyCρ†Œθm_‹ΔήΓyρΡ‚κ0"u$’~—]*ή²()σ<¦I,ωRqoά΅o+3`<πΧΏΗs¬;[¬/Ρ»LR6TpΪmΓΎώ  ’Β„ς–™„ :Œ?ΛάκΞ\§H<—.5i²Tέ/ψΎ[ΰ•T—ΆAΏ’.ŸpfΎ7gG~ŠΚΛ qU˜Η£ŽεύφΙ±Μ‹Τ/m^λŸωE·o)εaUΰάθΙڌh)š½θz‰cžγΌz-3靖Ǿ—¦ΫΑ―s8΅†ŸZU}ΕOΗhlρ^r`_a¬WΤαΊ}a‘}WήΓ‚λΗ|;@ŽΙΒψΟ₯Ί0w3ZŒΚx‘Θ¨_,&r€*―ΒoVΞVΎHBŸk;Y‡7¬T+ΩέŸΨ‰°ψƒόΊŸ{Ό’)βΪΌΐ=ς»γ³ιOγRΣίͺήΩχK?Aϋ­ό70Ο ψ³Η;}α…΅ζ“Πφσ]©…·ρϊe겇 ϊΫvŸM[ι«6oΛ‰ΝξՍ—˜?ΟzBΚ9ί‚£ψ.41CΔ”*"’ό1”|pvAω<ΚΧ³".)a‘ςŒ_. Iΰ»pB—ɏ|Iδ‡ œ!JJ¨Ο6œΧ_:›ΕΧΰq)Λ!}pkΐaŒέLm0Ω°D.޽ηΠ!딇ΤE J΅ξΙ 0˜Νυκή”•ξ!—€ΤκRλΨκ:«‹f ψiŒ`Κ&@( ((R <φγp~λ„u]­8ςk±es+%„TέAΞk/fWeI—‰έφKζ[ α«Ίeηt|φi:οΡ2ΖWΟ%όR €@HΧ5σ€lψηٌ/_ίTΓs.xΆ‚'-fBυŠβi>ΌkΧ¦€Μ(ύ½»aC‡£Ξ{ώΑnέ1Τ%‡·ΒƊ瀷!ά;sSy"ΐ;^tγ/]e·οα Σ9£4bŽK˜™L£:f’Oυ%ߐD?Sy+ύk„·φΏ†ιΩG^Λ"pΪκγk„QχbωΪφ­Yb΅>…㽂:¬ΈΎ0«ς\GΑ$0ηL–›ͺpΌ!€.ΟkWgg'Ότϋιο8"€n ƒNβ€σ{ύ3™‡ηηλ—ˆyΣoD†ρΟa2χ«”—l|dαBζο55¨“““ιγg_@¨όy~<ΞR³4žp¬ό ν dΧϋ¬ΑζΦ«Ί|ό‘CΗπexŠϊ2»€Τό"¦T’ͺf†UyAFΔθΚ΄Gs1΅q|R8œ«œΓ΄GΡ―>T`xΡ”“ς)Σ%(<2‚ΦkΕΆ›κu‘)֞‘˜΅}[Τκ‹Z»£h]6Ύ\iKxPή9d U.„ΥƒΞ[Εζvu‹¨Ύv\Ϋ{¦XΛ ‹–)‡|™³i|ύ‰¦ΰθϋFΛ‹8i,ΤT`P}e~=h¬Ά&PpXY‡ή:§,θΪ«€ΰΪCω…( ΐ(Ϊ*ω(ˆΜΊ&0³“™–ζ₯λ€"”ύΕ‡ώŸΣrΪ KH!B π ΎΝ[°~αYZ"Μ‡^ό<‘Χ–‘‹ WJE?•²VΧ„ηΩ›™n@μΥUjώήΦڍωΥ}0ζ MX σI煉΅f05{^>θ»Φ~¬πGK (&;ΆχτΔΤ՚ώžK€―²YO#yhχ%ωjTΗΪΧ—ΨƒυΖ/Pν-Œ˜ypjO!ζόΦίb¦’λͺττLΒ½κί%j@¨\¦³ πšƒ Π·‘ζaK±TžΫ„Ÿ€Ϋ1ڍ@·Ρu·nο.ΰGMΒFϋL_kwήuo£NE˜ κ)ZΕ£DWƒ]Y eWp% ¨yΏ΅Λήύ―ΝƒI₯֞ύa„ο₯”!ΰσ‰B"ύη₯JΝkά€Χύ!€ψώε{K3I•ωΡ+σOr¬YƒjTτxζ‰|‘τ—‡Ή{Ή˜M₯]³ΊͺΦψΊqŽ|©sΗ*~‰ε¨V™V]/™ˆH(B`Ts†Y'’ΥΪ ω(—„΄$}$&”ΖD Ά˜ΰ$μς‘―œ EΩ˜YSΎEezω|–φΕ¦΅ š¦ΒΛ,L9Bτ}3EŒ5Rύ]Q+&u_Ν+ω½hI©ΪC8„}΅*ύΑΟί‡‘ Σ“_HkU5ΗDΧΫbψUΈΠ+bmD‰Ξ)<ΰMδ«Q…ΣE“€΅θΝ>WΪ₯]Pt2 Ρχ"‰"•σC~9h(„ςωI™Ο•ο+iOdΪ&Ώ:9ΆοΕόJωC(γ^ΤώβFζΦ )R €ΐλžKΆ3˜ιΊΜ Μ[/„F~‚ΣψΟC― ^– ΜWœΫΨ ”Ήθ—φΐάdžνD½Ω†ΔόŽΆΆeF­N½‡4žτoη΅!a]YΒΜZ|Χ}†ΐΒX–¬-Ρ"τXO‚tΩΆσRυΊEQά„σ³hΎJmU¨>rυόβc[A«jφΪω*F:βΊb2λ^›œΓΠΘ•΄Ώn'›ΓχΰE‘ϊt”Ÿά‚ρ‰mš±‘ωU$σΨΚ_#¦ŽH²ώ]έέν\ώΰX˜az%>Ξ΄'8![ΟυnϞ£―5 jΟaΛ‹ζ< ΅΅B΄ ΰƒ± {«ΏZΕYœ‰'tω 5φP‘|oΘYάΆ>Ν.~βΤ)AƒύρSιέ„Ρ½!Vi‡μYΌ·_L-ΦΎΏjL“3λKμαη˜ό—Ηk j΄ΫΠ‘FΨ°£+yόΧΕ|*Κ•€σ2ρ‘ΩΥ•9’,q‰’=0Η‚W`DŽιDIΐl+n}η½m֏Ώ³ΫϊΡΊ¬ο~C»υζΫZ`h#&«ΊBΖΚ\JWf ΓX‡_^¬˜s5œάΙꝷγΝτΓ-ΧλzφήΊu]o'λμδ•BˆEϋ֚υΊfR8S ΦT ¬ΜˆΆ‘νΠoi6UIΐγ{ίaά“΄ΆΡNI₯Š[οzs‡υ=oh³ξέ—2ΉB”cd1=$ΏΑ}dM-ύέΜΒMΩEόφšš Νs΄=Ό5ΜCήΑ\λOαT±ͺΔ’^vμζ·Uό))κ•Šξ GƒBΌs)L~;ςηωΫ3vh6ξݟ2`R£•½ ΜζΆ°GΫρ©ΉmWψ„τ³o½Q³oΪΫ[ύδαήZ$rΘη~귎€78έ°zH!^σΐ—ZΆ˜h@₯f)™Μ\Ζ\ζ^† fΒnϊ΁…ζύ@φφ΅φD#ς”44Ώ 6 &ς`‹ί½kfXNΞί‰ ­?>>Ÿώ{Œβ_ΧfΓh²@ΰξ‘O½"ΙΈφ’Qˆλ₯ΞΥ΄g΅ fTžλ‚t›φ!>Ή9ό½€ο%½vΧε£~M$7―l†Υ¨bεœΙ/u οkwq°ΜiΪώΙ„}¨Ί>W\CλŠIkT“n{’Ϋcvδπ»v \T D1f}|δότIΪ6|n YŒΔ“–h#wςάωR.ˆΨ=ωŽζiM;οΤδΒ%²ΦΛ_€αΨKƒlψcCΆ‘«{ΗIε @ΗSqηž[ Γwʟ@™Ξ΅zB™ά"ύ=λώ;[ ΈvA&[* ‘+fV!]￳͘I2―|"WΡ†H/'-˜p―2Λ’df΄=ϋεlŽKΎzL6<ϋn€3fΓ}ΗΉ Ύ^ΐ ˜KαΰΦε¦ntψΏΖΡShMZ]~ κOιJ Ψ@,π.”O‡²Τ«ΞN΄-oD uŸ9­ΛoΕb 2ΧΏ‰Šζ>;>eξŸzν‰dہ‰¬E·;:0΄/ό,cύ3¦!ŸΊtΎβDJΏ}βTV`nι—©UυΟΔΔ@΄Νžλ$€D Ύm%A’zΪ¬ΟFX@»ΡWυzcΏ6±‰υ'0`8Οsτσ ΅Ϋ XΘΰ7€‰•|9δC _9,ŸΓ`~±hέΎ( 8Ρ•« ΪϝX΄;ωμ³&ΌθŠ6u†xE—¬άn€δ―bασ{Α΅Ιχίχ£ωA& ;―Kι}Μςγ‹ }4ŽBΝ+ ΏwrαJ΄θ‘~MŸ3aΫng8pΟ­Νiθ’nl'&FšΐόΚ8V ³ΦŸνΐ‘j_o“ωjJ%wπ±ƒλ$MΣpŸO»-΅Ν―Μ:t5Ιok¦ž‹}Ν5&³ΐ”—ϋ1Ζ|/}q›.έδΓρ ŏΎt&ϋ4ΗκήK㛏v{>‰BΪ“ΨWŸ–|]έϊ Θ©>Š|_χΡhVίu\ΰΩ_¦Ξi.μ,ίΫ’”ΛdJΩ΅ ΔoCκ.ν€Ψ}αΙ9λYLŽ ₯ξdΖzκ₯΄υεΓσΦ/Μ›¨WrP—ΆDω%$΅OΓDK[’>ΒχπΛ0Ψ7ΓαΆ’ΛΪΨζ­,X₯ޏΕΎͺ£¨ύάο{ψαε‹ΰΠ!ΏϋΊ½ΘͺΖ[ρU4‘ζh?7i/β„4VQB i6€U’6I>­hCξΑόJΘΤώθιŒuψxڜ“)έΫοn5SηNœSBB/p87{.:ζΨIZΥΚ‘²b‚Ꮠ!B Ό )ΐ»IL7OI˜šΥŽ ‹py«•ελ0gΙimJ¦UΏψ. :‚ Ku£9«ύ"0εuΕ„Υ)~:—ύi’¬Χ©P9ότΦ–ž‚ν’_Α_2Ώψ°0³ 4H,0ΈΝuβ»©»YL$±8H£‘Μ,`Ά zšπ¦“΄―ΛHJΒλ‡0Ήk™Έ`΅ΰΠnώ̘T:™?:s1χUŽακΠ\Y₯bε₯kyυ8A€πώM_[κAΦ*-u½v‚A6ςYζL7bU]ςz<Ιz“?AΰΧ!FVΞΞ0€Fk‘ό&OΘR§’β]Δ!]NΛ%92ί£{ωj3£Q[…•Y’κ/C&%Ε“ωΥσ8WŸΟ³­USΊ!?v ΕΟύΩ‘½[ƒ>qhΗˆbΧ±―+¦RρΌ?χβήχώι―θώΔ― χξρ†ίΛΕχA.ςETΎΞŸά8ΦYΒŸΓ¬ z2/9–£“Νϊδs£œ:.M•?i€vυΗ­ϋφ·ΰ`ϊEπ"όΩΫ ΎΖΑœΪr:WFτεm9€&εΞa@7ν°jώJ4Ÿ{β:/)μ.€@H― ‘' ‰˜Έϊ₯αΙεf—/_^(zή˜81`u˜h; [rλφνλϋtΨοήg˜(Ό”»4Ξ«βo`ςΎΖ―Ί !Χlώooo_δΐ₯€ΫNFΒΜRΗmΟ}na‘±σ7¬‚hVΆ’ΧδκSgιœμωݘσ^Βϋ>Θ‘nsfωΟaIρρ“'­ŽΥ=KέΌ>Θ߈5΄X)λ…«ό[vš i…ΩϊΚ†φnΧr·―§‘ΫίΣӚp7qέ”Ν―΄υ5Ηρώ–ώΞqeΤ9J$θά=ΠΫ±.ΘY ŽpΧs™ŸΣΆύμτtfŒ1κτ_YM=¦ΏRaιK₯ޞm©ϋ’qλ‘‘|N–4.ώYΗv>69·™€ν"”)‰g£kZyoώτεΤ―άΊ½υ u—Ζ]=Ν›σϋšΘ‡Θχ€Ρΰ_ΐΤΞ)Ρί›Ά†T B!pvrW‘pU„ΟDΘRR;=O”ΜNZ 1Β2±Σ«ΌAΘ]ε‘Δ]Œ±"9ΙμGαh»Ϋ’˜b₯Md-1ή7£0̏bύψρOώϊπώτ7φ~8jŐu?°zl¦9ΔΝχQ7^όͺίΏβαω;¬{ηκzΧσ·h °ΉO£IŠ!Qh]εκΠ>(:Ωm»“d=OΘ+’,σΪ“y4K …,S*™Μ}γ…λ2Λ4@ eW?ή+τ‘s™·N` π’±L΄Ϊ{L–ό½ωόΜυ\SΨWH!^wΐ¬Ω5c”όΟί ΌKλšaΑ»ορητY—Ω0‘qc–œΟ‡`PΜ˚<_Gς₯Μs%§πuŽKCQδ`JΣτ†ž#U­ΛSΘά1φ]τ_f"ιCκ£7Š― ˜TΞR6ςšΧzΊZ~σ™ŸΊ Ρ\σ"ΎuβΘώE΄:λΫΥSηυUκξ^… M]Ÿ9'3ψ=Š}B₯υš/hθ"ήΎΕΆ2θ]szι@>1·›aaΤ—Μ―l|ŸJΦΣNΤ‚==Ξ_]#Ϊpμό>@NΓhXvΙίΝ\oau&8ˆχ οΓNfmΖπ5σ,gXsΈή½½ρaψ*Μ­οΰΚ6€Ÿο—04ό£mWώ?«υΪΦ;><ζΪφo±˜οaI5ih4&Ύυ½|~7Riί°ΩM4+eW6rHlBζ*Š˜’Cφ6έ*xŠ t3Έ{Ζ󳝑1'έsεϋBW²Fή·sΓς"Ξ:ȟkV’ωήνf#‡ͺηpΏRqΧVό') …Η˜ŸΫΦ—ξ&γ?ζλέτybΥ;θΌΰO/ώSΞπ”ΓνΧ©x‡Ι9lϋΤZ&Ώ£²ΰ„”†".·Ρ·ΠεDξγβˍN @8xώ|O_·’Α₯Fi£ˆ7¬ΐ»7¬5œ_p₯uuEλdς\pΉtήΑ«WΊ8§¨EAƒ…J ΉΜ%› aEeE,<Žω~ŽŸt dTίτΙΏ8sF㘠Eω’―ύxΦέOV…ζ qΑεΙυξΑΥ O—iV^ΥΑΆaΙ­bvŽz~z~ξWœ8Ο"}frl³Ξq[ΨύAΊjUw‚2λ(»a™%@˜έ6w+σ*”—€+ψ¦ !·€iΚy:›Ω‚Ω°0Q(πg γlΈIS»Y΅ΰms”λn±pmQ?)7¬œ›ΥDΩ««/s+mδ•μΛ(ίηλ~5΅EΎk^σΤ"=ŽσζψXζI.Y[€žyνjι9„žύΉΏΑ }όQύB ™δΰ­Χ½ΚϊΔ[–j)Τϊ²5P‰dEώ"νŒ’ήνh(qΚp‘ͺΒmJδςcν)§«ˆΔ!«Ε£χW9x΄ΦDc’ΒόΆͺ°Ž”k†κ;F4¬Ž cœ› Ε+ŽΓm›“Ξ;¬2@$ΖjΏŠ²§ΛRŠb]Ώ2ara|ηgύΖIJυkˆ¨οƒδπΓΣΈSψΫšά¬dA’΅ID}Ή·=4‘ΐΡD½B6²$Υγ·{k£ΘX—ϊrλεb₯:~°ΏίωΚ3WƒDΧuLΔυ••dAόݎܷbΩ’°*ΰ?™Œ$θ‡-VVV―u „½ υψ½ήΗ–uά°œ†Β| q;\wgmωŒPΉ©’:RΦήΓ;;ο²t bΰ …Bβ­p§Η±2„)yΌͺ‚ΫA’ΎL*’δp(‹Ε"ZaΖ#€ σ½yEΏβψ…]§’Χ ϋ=Χϋ΅ΖυΚφ> $-€kz¬„Z¨AΦq n/tμ«Ή­dεPa¬Ž2Β­g³>π…n*0$χ 3fΣFξW¨AΑ‘ρxΊ•οΣζysΧ@_:νοη+:πxύ:ά°ξ˜ικ5Α28 €€‰Άƒά―ŽƒζΓζyακηήj,6E«r=ύkJ\‹Cyq<•iB Ή΅1FτΆΦά‡όHτŸTΧ'—έkI¦žBCy_SσΨη~gγv½Ψ#δ xθ‘Ϋʝ˜7b”e­Ί+„λ AK©^Ώ:A,ΟdIŸY—\¨Z»RΞ³‡4gρHeƒ”μΪ*ς†`ύH°ηφ€–eHͺ§!96Ά4£pΛB’Ώίzό₯†\-bϋ„§ΡΜζΫί"šΛκ/βΒ&bΉ8/ "ΛMŸr«Ίwg©Ζ’Ξšlθ˜Έ"™oY[@I9W‘‹84ΓXL4VSΗ8S³`sΉoΐΈ―ΙUNYκuήpŠhY$+|€( ΗS`?¨ψ3s­―[ΑَY X ά΄ΐu£ΦOΈ›IP\ŽxІήEŽέΖΐΟJAž†CΧ_»rUωΓ+]η2ϋŠΦ£ˆ΄t₯Ώ}ΈεZGZJf*;½ΨθI”ω3«DκΟΤ‚}ΌΑ+―Ψΰ\„Λ‘SΌ Έ:QΚWœˆz‰f?ΟRΎͺ׌^ΎšxΡΙDφpΎδ:«d6=^I χ δVΌΣρ΅q7J”­ Ι Ά„x.ΘΊ‡ηJ>8«ςΉ6\#7Πj/ΰΒΝ―fΟ8ˍq½sςƒΥΥCΥΧ·π| 3*\πΟΖΊςUρ’μζlQ‹Ξ©άά$9€οW£@*Πe F/π6_Yώp°χaDΘ3ΡΧ1Τή½€μΪsU:ŸύΝΝΞ 󣉒€{Θ]Ν9SψΉ ‘—c‘Ϋi,t9βw€œj#^Ζ=\~’ ξ»’γ&‘υL+~$’=θΡ3ΜYΪ¦™‰YΡά»λλ«λNŸξΣύœUp„Αηvt¨:Dk,€J>x‘ΗΈ_…Xϊ¦΅;Οr s[K- ¨v’­YηrοξΜΈΑ“[V΄:­½ΗΥΗY-`CΫετιƚš?ˆ•ŽξΟΊΞγΘω Μ!YX¦=ηζ¨RΣπ ~ΔύΰφNχΙ³$~\J€)-;QέϊδΩvυύwΘ,·β6U%Ξ@σσ£&B“@–YΟAl^]›vΆ“M[ΙμΔ[`” Œ`νgDIυ",ί―ΐεGό†U Iηu»+ ψE Eόžε&ͺ“μ"`Λ-KQ²TDXθhn5 οΐ °³Š %€s=E :y6ΗÐ •Ζ=C€K<'—6ρ<6­MπՁ…ιωcCΈa{ƒςΦϋ*MΦr[ISπfόΔ«‘\#4¦Ζ:’£Έ%rο’k›€Ž>Wb½ŒΙΫΟEϊcάνΞ\Ος³}³°Έy%0žίΝD~—&ό†β/[ž’zχπ.Tδ\Ύ Ι%x/‹‡ω=Ÿ7†K’Ϊο'λOβρ~jžηL4΅΄“==Γ›λJŽΰ€ξVSoι… un&³pπ,ΰ`T‰ %‚υΓ]ΓΡ<άƒ1Βι?ί~₯Ώ‹3g­–ŠΰΪP羐ˆ9ηι-œ3[pέ –Ζξ&)α7hC`ΐ§βψ—4°Βl¬"πHŽ'²ƒmμ[ξ,p_δk4ωvΖr'"˜΄ΒL—„³†yΉbολKύœ}Ό)―]ή‡ώΏ#ΦVΒYΧijO&ζ&«ΜΝ‰‘ϋ«@ξ-όžsn’τ€€fM£σέ-Žd―ͺ―Y‘³-\vΊ±•!Ο‡f.ε,tWGσt,xY’RΉ»˜OΈL!¦ 8 ‚Γ$ι.ΤρμHy»W>†+bpϋ ΥβowG2Ϋ@A§΅Hp΅³¬&‘vœ%_Iε ΧεNZά!Λ*#]£½Μ}@xπnΎ―,4ΆΙβπhllτPyΉs ~)δΈyo&ΐ€sΥωΪΊuΙηK½ΰ­žο½—ωπ ΜZp ―Τ%j𨛭ψA½3xqΉ@μμHx΄Ηχ²_Ρ7roοά”du}ΜyΒτj_I[QOu€ΰ{”8·(d/Χ_Κ±ιŠΪ$#…,Z·Έ χο*3ό)α¦pό•Υ“2αxeρˆ°b/EZLj0-‹ΑκqHΤY€JŽp}ΑξW€υλΝ""ΰ·Βι"Š•€Η%r|(ς—ΐ‚ΐ•ΐƒδ‘»εLηΫ°π˜¨Tœ«„²0u#_Y>$C%Τ½%>’b] nρmԎ‡dΆα–Η’4 •A)ΉYΔγ‘λ›2¨ίIx^βΈσ,pžL ₯Ώ>q쇕€•€•ΐυ'7HπΠJί*ή+θ?σ)<$gΦdέι>γ³™²EfEzέ”M ώZ¨σ¨DV­˜’²ΘeeF!ι+¬ NΥ‘#No"X”xwsΌ€—^Ώηœ¬ o:PPΓSmΩΘI74γ‡Ώƒs Grάέ‰TΙFήζλΦ­σbΞΐn?Θ¬δΔς`0Κ’Χ m‹‰~55[ίυŸ'ά)n. εLΔ«0qޏ+Φϋ7lp:;:œ3ŒL β5)—!»oDςΠܜǨԭBΓ@‘η5=ŸNηΞͺ3Ρωή ‘΅κHθΑω£±ΪξJwπ‘’ίΐΆ‚}6Ί’RζΝΘΙ={œρKώέ™td= έOh+ξ‹΅=£gψŽ5aviλν؜L>8οβΨ*Ž($Ϋ5ΔΓ½s¨Μω0†”ΧώfΤΔFδh¬†€ƒ׏»z5₯$™ΛYΔρθp~e¬ŽιΆ‡kZΠR‰€«Y3ω@݊£-C#OΡ‰εθKΠΥ5zŽΊ>ΧΈ6ωtάυE―ώ;ŒϋΆΝ ˆΠpeκ+uφΡ£εθSΑ D–^X!Oyχ):ύcΉν(ΣFψ r’ېIXˆ –8ύp~ήΆqώλΈvΊ†T²ΧΟD>υΎΦ5ϊjΙΚΆk%`%`%0—xj±δš―/‘ρ°ΘIΛŊŽ(^”ͺpcfאτΞ ¬΅pfΩ—t~ΑΞΜΥJΘΨ(’Ρΰv:Ί…·Ÿ±`𙑠˜P‹ΐo\ΎT™Νΰ…)λFΨ8Χ;Qχ6’M•&ό++7{–€ΌΛVw–0ͺ¬μ†bœΩC]«`ΝV)CIXa6㧈Υψ7ŽόWœ"€Μ˜Ή<([uυτ½aΥ/ηvΣ5<ύζ~œ+,?"eάΝΒΖdόμa†ΠΖΤ ±α‚ψwm*[Δ‰β²‹Ό υ Ι€>_ΌxuξWfΫάrq%ΓGΙΣρΧ°“φ‹Ν[±φ<±yσ ξΟ%ƒΖ©W&h97Ϊu¬sψ³ΓNπQΨΏbηψλη/LηΛ…Ν»ssŽG6ΟE‰SC> !ĐCΎωƒM§Ϊ?σ{ŒλŒ@ΑΫξ―t”#dΕZJ°²uΛ!rϊeΒλJαV‘@+ρ"@K‰–ΫΤX?Dͺ–ED«ψr ] c†¨KF Ρ«Υ})RΨsΔlίDΚΙ—&c°\Θ:ίίΧοόν³}D€1ω1d11αe©XuΏREukŒϊS6xeqΗγ©ηœŸ&1YήV$Šj%+†€šά£”x1YβͺΤ‘Γ5k–χϋ€*Y$KYœτš{#°LΖrκQ»Κ`P1] CcV-Yt€Ξ=e ”rβπlήB-E]C²<}όCŸ<ΩΞ[¬¬¬o  κ™w=))s ށš±πWPmνπ• ’m…*ή¨λ3QΏ‘±ΞYρ’χ!)b(Α:ρΎφ‘"Ι9° ₯ι’οΰ₯ΣΕ9™ΩV2ξpΣNZ―ς+l¦Oδΰ–}’ll°…σBAN‘:Y­SΑ“l1-x­]ιN|6OΗ‚«εm¬ρƒμ«ΛJξβwA—B}YŽmκλrΤ³€:ζΫή\ΗΑ=YΤΒ5ή}ξINΥΌ Ή&n)·μNͺk,«Ι3ξWόλ'ˆυy”dsE?G³UΎλζŒP€ ώί>ΝlΪΉ²tϊήΜεj5Α§@Ξ!Z˜‡2>]ςά sΙM7΅ΫzG”Ρθ·ϋί£΅VXγι_"*–ά΅ζ¬?¬’νΖ"Bš…ΏΜ¦³ˆηΝq]ΔQ »§M5<#j3±Š²εκ4ΛW΄΄EΞόd‹ΏυO™@MkVΖKE?:bΐ€peL—DΐBCnE"˜+“·"\­f%Žmdˆθ (ž2y?φϊjˆΤ:6η%@’sXY0αfkPΤ₯œΛ’ ^| (ΦRΰeQPΨ_Ή6 θ<ί»B”½ΐΥvα‚š«E.žΗ‘ Š—ŽΠώΠc U.ŽΖΖΊΘΡ’˜!Μ笳τoq³Α6/žό5ΟwΧ ./fϋ¬‘ς}ˆϋπa:ΙψήΖsΟ•Y΅,lΜΟM½Π_~‰‡U“››Zqž927ͺ›™Έ/ΒZRnjόBΘu~QΩs"Μ±Σά#Έύ½%mJ[\`ηΪ[’λ2Žχsl-½ΡΌ‘œ\½2ΠΕ§Ύ‡–Λ—/•Υ'βπV1QΧfΙ—!Τω‘ρΫHω7 GΜpL{ΫX"vόj ‘ ζwδζ]ώWΑO!0vΈ­‡.n©Oώκ«,²) όVqΒ―m¨©8Ϊ?<ψ},“Λβφ4£sAΛ₯tλͺU«ώhE2έσχŸqΏήNŸ ήΧά₯AlLξm\—β`eF;ͺ’W΄45―΅)ψ4ƒΪΒώ£π/\ρ6΄/ZJΎ”γ5ΈG)Ο„Vϊϋ°Š bQDg)Ρ"_«H(_…>eέ¨βi#°">ƒ¬βGΘ‘wOβΆΖ$mΈΞ~Θμ4aκV=²šH—@νΛ5KZƒ(αNŒU €0’₯ —1™rܝJΖJbZQmΤ¬ΚU4½ψGŒ “³pH‘/₯wP‘©”D1kΪΠ°JsŒ¬=ύι©@Η 4ιs%$}uπ4dΉΫ”δ'w²{w–Ά±.αμaGI•€p!sΥwY•ΤΎΖ*χ4υ_c“LFξ€Ϋ‘hcOšv΅]œ‘»}wm#¬;ήl~Φωάx*ϊι'ΎΌˆ—†Db‹•€•€•ΐ5”Jςq¨θFܚbΚΎΊ„RΖίπήΓΛh+ςοE”Άΰ'Ύλ}ΕI.Gs|άΟνw.tΌόV˜~Κ$ Ešœx]Lίk~‘½jQ žNŽd³-A4ΪΑJεVZ0«ΗΣ›²γν‚':4Y&yŽ€#ιΣ]σ°Lά{iΈηδšδ‘tΤ}ηζξϊ˜η’\χb»¨žbΜέ(0G*‡<°VŒŸ‹drͺΡ4sͺ‚#E΄Ό>ρ•DοΰL­Ϊ(Ή¨X₯Nιαͺͺ‘/@pžOD©υΜS$λ "ήdQ±z^sΣ 63†χ0†MΘpb„JξS,«?εψααm§φ lάzώΌ§S7ΟψNœ©Ι&fμΚύ”˜5}\ξθμeήcήγζΓ>O«Ÿu™ΐˆΉω:ζsKMΉ„†Ί˜Ε`²ξܜ’gΡΑ6pnεή%4‘·›{ƒY°‘{@Κv–ΉuxυΉΑs­‹S¬$·tτ<ρ—Hfά}τ³0eΚοδ™ςxbӊ6§½χΗ΅PL a_tΏT5:_ FcΔ$Šώ[ΔήHωΉ6Y·qΤ‹ΗΦ9i—gΕ’KώA»δŠŠUπxSΛΐ_4mϋΓhΦίF΄«GšWξDύC>V =ύ Ο U6οœ‚-NƒΒʊƒ ’ί'Ό‚τ φQˆŠ”υ1l Ή ˜ΘάM¦υr,R°Ε; »n‰‹{8YL>΄ςοsk HΩοDΒOwΚR mŽύ²δ#kΙZ£m:/j€˜³¨Ÿ†cA”)q6δr¦~κf€Θθΰ‘bδ kˆΐ˜¬1r9S4/Ysδ~₯±)ω ²Α‹TπΉrΟRt―φσc|'α#cTυkIΠ¨ΌΉP½ž±¬(‘ ˆμb"ή |TΡΆΪ‘Χ’\·~L¨cY >V㞦ˆZχαςfΐaΖy&‰ώαoώα‰ΉΖ4@[¬¬¬^u ΄vv ύΝ«lZߝp£ς‚έΜ ωχbψ‘ζ+W‡>e‚φ2)œsΉ°πJς’γζ‘ΎΰΚσ5ξΦ .Œι#πA>ϋ»[>Fξ?CΙΏWά‚ΗGœ}  h,žΙdŒ‹Τ¦ϊ8Ω»+Lx^.«τiη, χJ}<…m} rSπ\cη ”κ‹xο•%£FqΏΛGξFΊΤcΤέ™"WΘΈΩ·}CΒ‰>¬Rκ₯Μχγ%₯]ց1ςŠ(ϊ“€”t‘²&rϋγΆ€Ρ @ΠvξΥ=0dq0@ƒΊ΅- pΠq:Oδo…؍π(Ρy5PšΌW±>ΔΈ*P8ΗV?QL/"ζήL”ΨQKΩαNw CΑυμYˆμ¦‰ψ1ΚΑ’6T°Ό­ΜπošΫRΖύJΫΕΕHy|rOc-δ ρΝ‡›NœΡ~[¬¬¬nT π(6ΟΰWr|XΉf“P'€°ΓN(*!‡„nf%sΈ²€9š Η»‚ ΄γnβ΅Ήu)§ΜΊn{ΤΝ&ln¨ίόΜSQ·₯Τ N£qν ‰<Α|ΚaXp`  ΅Ο›/@qρ^<—S–¬Όd“•Υ¦H‘H†+Ϊ›Δ7~&aΤΙά‹³’b­ ;qΒW¬\±Z9NΣαΊ(AΐΛΎ@A·8t^›.οqά±–SΗΓη&ι‚.ΪBΝΌβΞ”ξνTU V»ΐy(ίσ†`FΞ ηzϊΑ­σ[ύ?ΣΧΧ·₯€δχΐc΄‘γw̐·ΧFΐΗϊΙ{ΣsǏcώ*Κ1™QMώ'ΣGΙΈpζ·ϊΤυšΌfZ$ίόΕΈΉ•ηώ+!nO¨ˆη­~eyσΐπΠwA σΎO u’Ψ6άΓ.£WˆG‚·#’Ιώκ<ζάΠX"Ξb4«δΛPŠήΠΛP΄*~γ­˜LcΣΚύΞM%Fy–²/·&)½"§+7ΘΫɈnςNPƒxOν'”1 AϋeύA.KΊκX΅—Λ•σς2Οi€΄νRξ\Ξ_ΙP!«…ψ$Κ~? ψ­Έ))a‘HξκƒμπrοΊ„k“Ύ« YG€°‹#‘>JρWΞΉEΙZPS#O nZ|Κj‘~HΙ5L@Cύˆγς%²½€άΛTw9ΰFξQW]D§’Λ™ά¨ήpgΉσKo\aϊ&^‡ΪGD.`ZEH²Ž¬hΌ@ގ<ιœκrγΖzΣAΔ+Ι@c±\Φ΅§?—ƒ'q»β‚δ’ ΚΕ+ξάƒK—Σξ3μ_|¨©ν…iΡώ°°°Έ‰$ΐγrΪKx)C™Υc₯Ζ―“ΥzxΈE•ΐb]ΐH=†w'}˜»†VU΅ψ¨qι%t8R™nγϋX±Š§ξ[½zτIOQE1o*“—‰)q=;R>μ;~βΠΩ™ŒOP cΑΏ|ρ's¦œήΡΡί;–ϋk€Ι{,4ƒ;g(:’σX™—ό’0Ii½)‹λŽ+Ψ~ώš’λ{‹ž›ΞP$uŠͺ,tΕύ©σζ)ͺ†ΙΛ±€βz·ΌNygdϊ=€χzεεΗη˜„tAVMυ9|nj'*δLΔ5’M?GhΫΏa―xQRίΒΚφ¨ο?Q[_½Šά†΅ewni({Η–-δκyωώ «wζvqΞγ$ͺϋtVΠΈ;g@p³φΝ¬h>Ώ‹M΄ωœΏΰc>ΠΤ²ŽΕο wΚκVA˜Ž·$Ή?i5_ξOr/’Λ”VωŸ90`”pq€PKΡ—…ANΊβRς₯ά+,­ά»ŒΝv…œ=Κ ΏŽαϊ"J8™₯ B+ύRφχάSa2|ίΉ-iBΧ Œ°DeΪK“νOJΎ@@”ι%%^žsΖ £H[}€}€2ΐwq4’δ ¦σ;/§s§ "|Λ’q™`°Δδ†&+Ι%Ά t x$(A£,Υΐ%ΧN ™¬BF’•ΐŽ,0½΄ω="z‰Πž0β†μΖ$+ ψΗΤgάά#κίi€™„'Y‰t/Πφv…H”^‚ξΓ\+ύ°ΕJΐJΐJΐJ`ιπ£0#\/―ό‡U¨ΧΪ’‹Ÿˆuςkε56i «ŒΧΜvϋύ¬ϊ_α˜y+"Ό§ΗέΓ(νη9iΞΥPtΪ“—8ΕκνΌάhfφ7‘σb–’W¬°:gήl/Φ°uόh$α‘χ][ΓϋJž^$πΔϊͺΔ} !Ωδ_υΖϋ68Θ:|–Ή)·πΒjΏ(Ŏ =»»[žζ>\Γ©šΗ|s_rΖc§κΆu#gic. “λ'λΛhMN&‹†ψ “v Ϊ)χšV‘δA―›&·‹αμ¨ϋτ­gιo1Λ΄­ΰ-ΩΘΨ{.5ΐbZ=ωVΙμ-‰e)–υ'–JάΏ.Δ-|‘OΟ3&·c F©}πςeσ¬@_z)ΠΘ+«†ψρΦoΈΎϋq.Ϊ‘ΟαuUΞn’έ‰—‘0²­¬ή^‚xΚ~aΒ‚!«ς[ˆP} Ή\t9΅‚_ψP¨^)Σ*Rό\Ϊ‰ς€γ" žƒf½|m—―0³wayδžJάΎ°Žμ*‡O! GΜδ.q\nb†,Ξ§’Κ-KnT"¬ ΰΘB’šp“uBΫzq}Rύκ“ά› Hάg+9Mތ ZεΏ…±Κuͺ’»ΘιrSίςEDψw?\MΤ«$wn’ϊΈ±‰C£¨YŠv% #žΗΣX‰z°–H&r){Σέ•$yLκDπwk›\ΐdQDΞT‡ΪŸΆ{°ύ~’Ήυ›ω>ΨO++++₯KΐΖ",1[ΑT#Zν_τ»yεΚ‘ΧΛw½πP€ω‘ΰ ӊgΛK}} °ƒžz-€:ζ:Α€ψƒέ—ϋ°ΚωNψŒfQŠr.c/ΒΊ’ιeο^'3>ύ.Άžο²gŽ•tχΌλ=QΎ¦vΗΞx¦7tόš8ζšΟ’ρB†NΘcLo0E¨…n’:ήΐy‘kΈwΑσζΔΉΑήTFΊy„Τuƒ6ΘCΗ{{ε~εμΩg«,ο{QΉˆP–ΣX§Λ―υrΊΥσΏ€Wζiζo˜ΥRΥγκόΪ₯Ϊδ›π%,Taπ|E•“‰e‘|¬©ϊΚC‚D„_0`Rd=»ε~5γδΆAφ @΅P ―ΉΐžΉ„NYϊ¦χM陦΅Ÿοπ;Λ±4bνΚxU 3%ΧΣ*½Š¬Νν£$HριZ֏sdψ–AŠ΄¬B²άΡXjHΨΊ΄JΚ'·$‘²ΛΨ/Χ)…‘5‘k9GnI"h—fδήT‹5FίeUΈΊv6”RΈΪ{λ’&μκζΏε‘¦½™€WςiΞψχ\˜K5U£8o%“ΏIuY:J θ<†+”BΓ*’”ΐΗ›?εσΠwq"Ά-K–6αv5βt_7– ΉIΡ–«””{)ώš=€’°8ϋš‡œ/ώΰŠσ͟τAψ…θžΖKnW±"”hQE•³€q?VbQh;—2YΪ•…\ryϊ•=+œ_εονeζOΦ”νqν‚g’URςe­1} E2ŠP5ˆ ™ΐ—n}ΝPσ8,­K<ΧΈŠ½γΑJά€b‘q oEγRΆxρMdιH₯3Ž4ΰHEwρL$,υC–˜wΙς„F]αίχφφ[Ÿ90mR›Šμ?VVVVK“€$PExš‡VB4χ?¬ψžˆs’6ΠΕ‹2χzž·Ώ³S9Μ«΄x3φ’έz$Œ7s*άέ"ύ%ϊUčF“_”ϋ•šeQ‘©&dp1ΡEbAΡ–§ώ’΅Ό―©y¬Ν[χi<γ>Ɓ†ς@₯sΚΌΘΦZνWς@ε»ΠˆSΈ0©ΘεHϋ³Sn=•\:/€Γ䴐›‘”μ‹ ΉP‰O!W()αϊ“ —\TJW„πγ³φΉ>ηΛO_5ξ_ƒΓ΄Ο1r“•EZ ²°¨˜ΊψT=γ€$YWdέPΡ1"΄+³ψr{œ‘ŽΓδ09tjΔ„Ύ=ˆUEϋDpW=«”s„ϊ£6T»v’φ7ΓΎ’mεΆ-₯Ξ»+ŒΥ%oΙ_<CfŒt^7tυAν¨MΉˆ)SΌ@”¬:―Η’ςΞ‡ͺ\ΙY˜‹½Pυ™ς?ZŠέ¬š-VVVV‹‘€$PnΓκ φΔ8ύ-›Žj³ΕJΐJΐJΐJ`Y% ’¬εΛΒ!ΕχF"ƒ ­Ž-ϊyL(†dβ‰ψΔy¨βof{ZΝ;Έζς`Gϋ€ΘΎΈ΄Qύ=Τ'€0½n―υ’p`qφΉκpaŽy‘€7¬qLΆΗR^W/­ΰΟλδ1gώœL JIDAT'ΜθΕ£ΰV6>ΐ‘³ϋœ;έ5x4덿γηςαΓ$Q\Βυ˜μΐuό%’ΘΔQY%Pω‘q‘Ex£xqhώ,Ύd²§ƒhW,ζs›L© ₯s(k‡poR4¦E+Œnͺσq­±πΉrEœL£Νi7}–}‹φϊ@§Βs‚οZ‘ŽB―q“™LΡcόl<ωδ‚{04ΥQ—ϊ\°@vZΈ™ί²±€­χlκ§”n¬©)Ε;Y(™Έ†Μοΐy3Ϋn ’Ιm_yΖρ3'π΅ιεbwy„ψέJ²‰7"οG8μσ“ξjΊΖΝ,|Χ ƒ#ίΖΜ9h/ΨΧb_u’Ξ@OΛ7>χρ-¬ύWΖέw£ ˚πΣ—†H?γcP>Βο²Β`±’²Δ)αq”BKωVpΉU‰ } œΉ.ΙνHy2δϊ” dJUΓX5Γ†σ!w‚k2ζ ς›€αqˆ/K‰κ3ʊαp/ʊWρKo$ͺ€uKΡD BξYOΏ0`ܟΔζSΞ YMδŠ$λ‚Š"A)’•’MΙϊ‘’]²D(–ά«€θ Œ( νNψΈ]Ɋ€VΝωRμεf₯c7D(—+“ψ!βΘ-KΡ«ς—\@G.YΚβΎ`#ξΗ:ŽSςΕ,ζ"hε’i©ŽˆΰΚ‹2D=²P¨”AŒ™όο<’Λ ψΘ£pΌ*’’‚I6Κ›"₯ˆY’…@•κQΏ€dΑQFψ_yΣ “ηΠ"ŸΆd£O|²e―©Πώc%`%`%p3KςŌαγι0ωXŸ±kQ?1Ϋ{%΄’Υ±™mε+Dχ :‡.ewβmί΅°Oίw‰ξγh•yΆνcρΜ1‹E»ž¨7rkb‘Lξ4=όε^NΪ‘+z7―ͺ<Η'oΣ%ΉIQΥ )¨Έ¦dΛY„+Άνœ9γ€RΎχ5τ­½ΌH‹*V(m›Xύϋ+7”άoΪiϋή,³Ζύςœ‘Ζ–±DAŠ4#9‡ΦK?zQΞγ;΅h‹ΊŒ…,›=Ζ/ ώ°7η~΅€{`ά)ιΚΊ„€vέY˜A^π2~sΥΰξ|ΌΙ‰kzE°¨UΖθP1ωκδϋ^7ώRIΉW|νδ―ΘψMβΒ_’εοίSζ¬J¦K2'ΎΓ9ψλ+|4΅μ«Ÿψ[Εε.γ»ζ—ξWΞ žγσΡ ϊ/ŽŸωΧΊΐ5βˆe(93Α2T΄\U(Yα“MαΑπ1ˆΰΑΥ©\ ~†%€ …ke —’-«ŸrΆ‘έά„Α•U‚Ž`,TDŒλ’@Λ*ˆθβKHΌ²6œξL"‹ƒBΟξ†W±SΞ•EV ŸK"'Ήhωz/ρ?«0Ζlk‡¬+Κ’Ξά²UKΙ e₯Υα]‰*>¨―XMXΏ‘Cύ―%ia>tο ά“zr’Θ­μ2@AγR?U‡άΝδŠ%!‚όQ,<—ς—©-Yl6―M ˆ@ΠκΪΈ±Π¨]΅©(]wmOή ΅ρ4ϋ,Σν?Έ©­‹ίΆX X X άΤΘΈΡ’~••#ΰžž¦h-ψΩ ΧƒbLŠωKN§„ΗvΎώBg‘r΄γ 3²Τ6ΗΌΪΛqgΰ+ΌυΞπ.ˆJΕΰُ’ιΔβ+†ZωΎ4`@ «Šς9SƒΤ%ήaϊ/N›ο»o΅ώά€)7‹/‰šΏAΟQo†¦Υ‡χ–ςYηt|`nεΈ­{΄cΛ-Ι?–8ΰ?βJοŒSη4EχεδΐŸ^Κ‘šͺ*' W`–"»ψAΝοLΧ=οΊΙ/±xΊ'Λ)x6γΖp8Γa~ LεŠθ…Žy’k£ΐΩΈλt–eS X³ΤyΓ½Ω‡’ςά΅άήΎ‹K1D4Ρ§pΏZ²ΛΟκΥƒΓ½₯Œƒΰ„F†Ρ,¨Σρlϊ(JΠl€^`μa›†Kz28Θ?&K™a̘GΉΔX>έN—Τqaυδ·™€uΡοxΡl%σo—Ά3η5?gΞy©–qι”η*ΛWœ>ίϊžFη³#½‰½Αxτaζολ™Ί·rξ:N­œ·ž=šΠœ₯?Γ5Γ²Ψ•ΕΤύ‰=ΧίA(€%Lꟳ¨#ΧeωRΣς΄?φ^RL~ ξ”υA|εΡχ5(ΪβU\Η5Κ3ah«F0)ξ w+Ύ†rohε_‘f₯°·>Ύ|Ώq­RfpYΟ+kI]mΤyκω¬β»‘x 처 Θκ‘mΊΨβip θ·"V)™β»__m~ TQ΄ςΒ•EBΙ5{ΔΩϋβ Αƒ,ž6VκεŽ₯ό"o#ΌrŒΝJV–‹(Eΰj!q ˆς;°ΤΌ™Šrγj&β—2Δ 8 „Ι£°Όr “%HV€[ Ε+w5~žΰφϋΟψ~υρ¦–ڜ|]NjΫ)++›Vψ?DN¬IόΣ±hδ_"­@Ξ*Ό3ŽΩΥΪ•~†KVvΥζ—Ν’–Q8ԞG²²– ½Ž€pλs©Ε}ο{ΕIJ©OνΫεDš›MΣϋE6–ο·κR;3‹»gY΅Χ οd?f4γ·«ΔmsΘΒ΄‹™ΛX€tj{F΅―͟›ΦΕwΗ½Θq_"*KȌb όχΞ+£m„@£3v.ζ§·‡ωΈχεyθς;ry—γ-³¬=ζ£;e^˜kZΑ=0₯mg eήσˆΉ6g5Ώ‡υγΑ{·Ψ9ΊΟ6:Ρ––Ιϋlς~^½zuYYΩ@mtΜ©£ς΅h€5d±/ $ψi‚G ‚Ηz9‘ΫOηΧ΅Œφμ…KΒ±“uπύ-yωmd)•ξw€σqp£θρQ%Ϊλ$Ζ1BΤJ)('c V„!t ‘Ρ΅J₯χ§χΎΉ†\ΉE'Ή$ν?6lHγr«PI βXHδj% ±ΉΎΔp3Œ[υoΑΒ@Ϋ&η‡Ζ’Δ}β‚œ Θ’’θZJ¨ψΘ(Π1Šp₯θYŠ`%˜ͺ¨\WΨΆK‹Ϊ—»”2΅Λe¬†ΎiΏΝ;IΚ(0τ³ΎύΣ~c9وϋ–ΐΥALΤ΅Ž$‰»ˆζrωκeŸŠ“,*β‡lΔ­l…ƍ]šͺοϊYοϊΔι}κŸ-VVVVΧN NI2SaυοΡjm–₯άώe<9ςΙ—N9ν|ΏfŠ@ΎΨM7™κJή”ˆyΔ€»Υ"§0M‘:D‹Dυ©Αο±yI{Sͺ΅_ob D―χ±θgφύŸ¦†ΔœθGytUUt­HΥz:ΛΚ‘όRΘε%Π!!~„άš”α\y/ς₯λΐ»Ž~„’UΒr d‚yχ(εψ0ΡΉRμ dΝ^)ύ²€˜(V)όrΕ@‘[VB1$ψ$ƒΟt”£—+Y5Τ7΅W‰Ϋ–€”@’ΞWt+Y/d)1n\T!ΰ"‹H&λR½f{ΖX]X!£]ίX{d‘9_Ρ²6pΌ­Μiΐ’"`FυέXiώάχ²φαO΄^ΘΛΑ~Z X X X \C €Jκόxd3ŽIψσ"™U‚.^$O_8΅Ό±φg5c7X ̐€VOΈΞφ1…pJFΞ‡>RΟϊ%ƒGΨ΄dΛ\ΎZϋysKΰeΝό:–ΓΧχφ νή³ϋΉκ €λy•ƒBΦΖ6―-1E§’%’σJ9FRE¨RΤ)iβ*&’ΰ’„‡1rΏΪ²ΔΈ_)+ΈΘνIφ PHΉΏ XPξE₯ͺ$—}Y5΄_€D.T„X3„sšΒΥ*c¬ ¬r£ͺΔΒ!b»ΐ’xrέ2a…9GQΆHnΓULm‹{"b½\ΌιJϋkι‹Βφκo„s5fY=ΤζΊΥ ηvB ΏρΞ c ’£ ύΫ@£³Α[δ―4².WΧρ·]³°Έ‘%ΰUWzo#ͺβϋr‰˜@‚Μ;Ÿ₯Ύ|ΟΉΒ~½Fl±Έ&]S²Εζ7α άΕΤ,δ~υ"Μ›9Ϊ1ώŠΔ+Ξ Έ&ƒΆΌκΈξ- y )_ߟωBΣΆ—²YWρEϊpE©wƒ»Κ½Α†¬!¨Δې5BJ{,J&&,βSœοΙ`±W)εΡPδ))"‡λ»ώ6 ΔοάΑ2»HοΚ8.W*Y'dMΫ”ήŠž%° KŒŽˆδΚH.0 χ)ρT”«€w(Y*ϊ²”ˆ»"bΉΈ)κ§άΎκΰœˆX_YζM‘ΛaKΔ{'°ΝΨδξUŠ›Ω%bΘB£ϊvΑρP$,Ήp±zd ž'4υ_ς²ϋΚίm:Et’ΦΌν§•€•€•€•ΐ5”€V—ί’|€Μ̏σ0ί@Σ<Ή§BbξwXlz²½ΣψΦσ ·ΕJΰΪH ±|U4κ(Mβ~rtf ZY`ύΜΕΤΘΟP;–'ΓΜ&μο›R3Va^;2ψμο4n‰Fˆrώ½ΎEλE²(‘ ΈβJœξJKΖ &dΩPΒ@εήX 7D\Žšͺ!lK  Ȑ+–έ??:l"R΅ QV‚-X\δς%χ(‹MXOδb%ς»¬"Ώψ†κٝ$ϋψSϋLΓNφ Δ½Θ5J–˜3R&g‡BτV(δz%όVBχ*JΧ‰ŽQΆη24>ΤυqΫ†S‡’[m绀‡)$~§‰/bυψ“'šZ[rνΏVVVV―‚Ό+KW'ώ[YϊΟx LλDΕρΎNhž?>Υ9²μ™†_…1Ϋ&_#¨――/-Ννφb™Ώ‹ΊτΊ-ΛάTpΜ*)‰θηΟ Œ|u`ΐdW‘:b‹•ΐ²Hΰ5α‚Uh€_ϋρΥήΗφTώ8Έϋ+‘»’.EΉ"@ Θ’0»²~ˆR΅" αόΒ•1γ:…σ”p•RΖre—ιBQ¦dα8wy|Βς;_ΦΥ)π‘s½rDnP>*ʎ.P# ˆ,#β’Θ LΘC}QRΓς Jœ(Xr£ͺ<ˆˆΞα&k{[χ˜ /¬m7d†7uΐΘ LΙ w7–:χν,u6jœrω"E |…*~/λf?ϋλMν„,΄ΕJΐJΐJΐJΰΥ’ΐŽ΅5ΡΈ1\κ9/ΒiNΙΊΝk…ΧΒIήCŸ‰8Ρ?9Ω5tœ~ZΧ–Wλbέ„ν*{{4|}ε1ζ¦BKYΙ—«l^₯§sδ[½i§?ΏΓ~Z ,—^3.X…όα¦3"C=Iύgn6rηz"lο»°V¬m\Ÿ0Ρ’ΞΖVeWςA)ύ «°ΈβwHΡ—…B%ΕGK—‚`»†0ž"£γ•ΐΌ0αz5€ΫT%‰•D‰–%”K— 8”ˆ_r¬=eφΛ5K`EδuΉu)A’Έ#²ΈΘ]k8E¦υhΜ€Κ…¨δ¦%’ΌΒθΚksΉt ιIAΜμsXEΎνfƒΟfbΩ'δaΖb±°°°xυ$Ždε>+R¬+ΛΑοŸ6ήSΟd‚ΘWΊ†TaψΥλ₯mω¦•€‘2TΑψ'τ@…Ωu/“/γEΒΧ|-3\ς½–«WΟ³?·ΒzΣ Κό•’ΐTΔϋJ΅qΝκˆ`γπξ%οΛ{Yqz ϊ-4^’θRŠb%R·\΄” ύ7¬ $`ΐ†ΒλA²€ά hˆ›!λ„Θμ*ϊ­Μβk8ζ .\ΰ 1\ΐB eωI\™Ϊ±J€q EΎ’{–φ‰.ΰ£XrιRθ`Yg€ΔGiΔΝ«oH‘ӟ­)εοCΔwŠβ4·pψ!•|)σ_°ΐCb±ΕJΐJΐJΰΊ’€»Ή>ωςΡώ―ήξι πqύŸ5vŽ΅}3ηO―W‘-VΧ\›Φ”lŒE#M€ ¬s^7‰κg½ΰΩLdψH{{ΑΜφΧΌΆΑ[7Ι_ͺ¦¦=Ρ­™ŽMηξAk7Ψύ ϊ5zHΡ˜ΠŸ¬ΗΘ0|ʊ.0! ’"Λ†x²’œΗuKE$pεݐ[”ˆΰ:ρ"`CDtYVΔνq\η©NYG΄M΅₯·Žρ:Ώ @$@"’»Θδ"Ώ+Ÿ‰ˆξr Λ•ΰ<&ύ€Ωό–“ ž©nh$GΜΟ`?­¬¬¬# μZWY“‰«²c™α–s£ΉΆ‰Ύ#QΨ\g clπrΙzΌ2ΌŠhΊηΠ“₯ΫZ;³λt#wη† S/Ψ“M•όΎ’Ε[|Η{‡γ·ƒτ«4pY?ΔλθΑ-jœ[O„ς6YEb—ύJJ(<ΟC‘{e)iΰ.‹†Ž‘k”Hοg²xl"kH–•²<‰μζrΓΈ©ΈlΓΒ‘Œζ΅ΥQc11ωG¨T}γό.έ—°Ξ|KΙΣ€‘f›Α\‚±ΕJΐJΐJΐJΐJΐJΐJΐJΰ΅*ιΟ7Kq?έ΄­ΆΤΙήψαζ‚ϋx#Φ낉L’(SΉάY“U]y?DοΔB‘Ό²šΘRQ…ΫU; Dά  Y.”_DarE:/d#!}Xηˆ/’Œμ σ+/*ν/ΗΒ‘€.‘ΡsVμ4N0κψΚq±ς]g?hζ٘ف¦SWς˜δfΉXvœVVVVVVVV7¦n&2y›š―Ρi,ώeΠώwCΌ~ŝψAnΤ`ΦP>σ8ΐ•EŒa€†Bεϊp6ψίΝσœU,P!>‡‹Bτ&βΉ€‡JP¨Δˆ ½Λ9O`a ΗϋKp0ΤAέ/rΜ Y'{Η«3-NΛύ€E[¬¬¬¬¬¬¬¬¬n ά”dζεϋRΣψh:[α$k£Ž»JzΨc“ηλ ‘x $φ5όέΈP†PE3™ό’Hθ·ΎaΈΈ0ΐAΰΑόA(qόΡ΄Ξϋ)Έ7hηπ3'θΒ~=Ψ]Ρ[Ÿ9`Γ0"([¬¬¬¬¬¬¬¬n\ XrmŸΘ~ΉΏ%–ͺJT8―Φsύ¬εΟ-s²nΉγϊe€’2PG9δp>)A@8Ew˜ΜCNΔΒδ1υƒaάΊ†ΰy]ΕBSžJ «jŸΘμΊέl%`%`%`%`%`%`%`%`%pcJΐ%^WY@~ΏΙpѝ7)5‡±€,±V{Ί•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•€•@a όB©QΊ?žJIENDB`‚libjwt-3.3.3/images/LibJWT.svg000066400000000000000000001241371517612317300161120ustar00rootroot00000000000000 image/svg+xmlL I B O N E F A R E libjwt-3.3.3/images/favicon.ico000066400000000000000000021101151517612317300164100ustar00rootroot00000000000000  ΆνΆ lξΐΐ (R…€€ (­R`` ¨”ΥZ@@ (B}ο00 ¨%₯1(( hMW  ¨΅q ˆ ]‚ h勉PNG  IHDRτxΤϊ€IDATxΪμύw΄ν[–†}k­_ά9|ΞΝ/UU'Ί‘C5έ’5΄ˆ‚!Ι’ Xtc ΘΩf`Π°…,Ω ΙH²°l Ι’A€ κn:‡κ**ΧKχέxςΩgητ‹kωΉΦoο}ήχ… ον9Ζyοήswψε9Χ7Ώω}μoύ₯XΕ*V±ŠU¬b­ΰίθ XΕ*V±ŠU¬b_X«XΕ*V±ŠU|cU¬b«XΕ*VρŒU°ŠU¬b«XΕG0¬oτ¬b«xWΑAχ― ΐΰπτ τλ€’~­Mθχ²™Ο“bύΎXŒΎ70ΡΏ„ι7ϊ€¬b«x±X«XΕ7O˜$ν‚’φ:€:(©¬Ψ°₯_γθ+θ7?‘=‘g>Γ|ς(ρ« –ϊg6=CP‘`Š€€ηΞτŸ'ϊ5§Ίϊ΅1€hζ»V±ŠU|ƒbU¬b_Ώ`ςJ €½ΰ(ΙΧάp”ΤsͺΚ Ξ0ŸΔ―‹:±2PrSHL‹ˆ1€¨υŸίp  ΰ¨h˜-*βxV±ŠU`U¬bDP’ίΠ%υƒώ(ΡA‰ή$ψλβͺ•ω72–ύ~ƒ2AΟlόž™?υOΰΐcP‘π€·4υο; δ`«XΕϋ«`«xo‘PΑtυώΐ·cšψλ XίΉζύj°Ζ’’%BC:^ί―œ‚ώ„œŠƒ/8πΤZ‚Ϊ«XΕ*^0Vΐ*V±|ψ6@«ψοpΐwιΏ―ƒVσϋο&ω}˜“ό{‰λ Ž)©±vαυ!(ωŸψ ¨ψ¨΅p o* φAό‚U¬βC«`Ά°Aμόοπ;|€; ytW)ά½―ΑΨtρkVΪiͺΨ`"1 %Fγη½£‰Δ8¬;L1 RD±bράͺΈ½ιβΦ¦ ΰψ<Βσ“™qxv³2c”P“TΡ6)@)ΞΨ Κ°8RIΫa,Ρ$"‰@oΚU9Ϋlšΰ„.4Κ6{νŽΧfpŽξ A*ͺE ΅²€cqδ<ίγŠ3hAκ‘υ_,  ιŽοπ'@δΑ/ψΏB zοf¬bߘX«ψ0„YΙύ€%P1|€μό¬―“}œ*–€ΐx’’ΥOa[ iͺΨ$T#‰/?γ¬#•@š**.%ςΩδ< % šnΫ ‚γ|γΑq8* Πh@£lγΌKΙw™P ¨,s΄ϊw,ŽΌ/0 δe.Β!F έa‚αX"²ŽΞcφΥΗcΔ‰’A’PτŠyΑς>ΗfΝV…œ@9/P) zΕTvlή’`Ά vυΟΏJό_π‹ϊηK VΑ*Vρ-«`ίͺαDw~ΤΟύ- |3šχ$}α+i Œƒ”C‰³v‚ή0ΕY'fAŠqb0‘¨—,<Ψυ 8Γh’β¬#ŒU–8Ν*χ¦ο+εEΆ’―,” Ϊύd©ΌR@΅dΑw9e6”σŜ@g°άgX‚a³nC–΅j% η½xiΈž1*<›Γi`Œ „(Q…αXβθ<`ŒΎΛQπ >Η+·}ΆΥ°Uήγp쌣 €ιyyŸZ³ΕρD>©ώˆHψ ~T œΏ/ίΊŠU|cU¬β[)lΠXήψ½ Q½ML“ώϋ νΟσ€’D‘έOXw˜β¨‘3HY³“`€# Ω_xo»Ÿ`H”ςŽΝαΉaΌΌqžc3” S₯`ΫbΨͺ;θ₯Vπ–Ε°VΆΑ0§‚Αw9Φ«6z£da²T ¨-”σ€$4"ηq”σžΓ1ΦθΔ’Ο(δ6jvVΘδ<:Γq:"°yτC)`4‘M$N”Β$RM<&8Γ8HΡ$(ει³Χ«JyΌΟ•%Xφ]οCA .όΏΰ·κŸ? j ό€Ÿ«6Α*Ύ%bU¬β›=†ύν ’ΦχλΏΟ’ψή—€ŸτΗ Q’X)Œ‰ώ(e‡ΝH}ωјMB"ή™¬ο/ό(a;­œ›agΝΑh,•Ό• Ύ€ο €)Π'(η-TKj% gψΖΌR@)'PΘqH žGπŽΫ›.j% yO`0“€―ŠικŒSμŸFx°λΑu8ͺE γ ZhO$8°³ζΐw9’”ψ–ΕPπ©XζΌ€Τ"€βDαιIˆγσcBΠ±.εͺE‹mΥm΅‹‚Ό/”η°χ!˜E ΎWόiΠΑΰŸ‚ ƒΙ{ώΆU¬βŠU°ŠoΦ¨€VXΏΐοΑύFO}Y雀­@t”²Ξ U‡ΝˆŸΗθ SΆ·αΐ±`Ψ?‹Ωp,3‚ίBψ\9—Γ±ιύJ΅’΅jŠ“Φb_Ζ€ZтŁΑDβΙQˆ» εΌΐVέAg I―ΟfœkΆ`L$:ƒ–`Ψ¨ΩπŽ΅Šαδϊ<»ϊW 8mΗhb '6κΊ9mΗ73¦Ρ(Σgœub|κλ— TΔ,“¨…°V΅‰2Α{f₯Ε ΝN‚³N‚·ŸΜ yŸ£RlgέQ›u[•σ‚Y‚)SΌΗz`Ά(&M~ΐŸπiP1πsžb5ZΈŠo²X«ψf ΐk žώ σφώϋ²7‰;%8›΅z ŽΞc6#vŠ1§,ŒΤ\ϊΑŽΞ)™ΏΕΌη@I$‰B!'°ΣpΠ& αs‚-(½a‚Α„ ‡‚ο£”h”-·γ+?CΘ{Υ"½Ώέ‹il0Vhχl―9hT,œ΄―‡ρm‹V–ϊ£ηέiJmjΡB!'σ8ϊ£λQΗfΨYwa †α8ΕώY„­ΊR^ ”°-†(Ύω€*δ}Ž[.ŸrςΏτ½³(L*Iσ ;Lρτ$b–jE‹}ΟkΤJε‚€οrΈSΆ`Ωq{Αl1°ΰ‚„O@\* ΊοϊV±Šχ1Vΐ*Ύ’ΰ‡@Μί"σΔφ}IϊΑΖ½aʎΞcœE8jF¬=HFRΝΐψl:>F2K k ½‘Σφrvυ'ȚθRœχbΌrΛGήηΨYsπθ0Έ6Ω(sžΛ‘¦@g 8ο%X«Rήj8h’+(Π([pm†0R8ο%ZH8λΖX« Π(ΫΨ? ―ό~³ϊOpŽ&tΊƒa,α9΅’…Α 0ώFΝF9/Jΰ°aJτ†)5ΐ΅ Ύ@+JΆ!nmΈΘyQ¬Ε’Š—&nBAζ ‚-ΏdOŽ"·"86ΓνMWm7lΦ¨XΘΉ\dθ=ζΊ ±©—όqΖΐ?πO@&FΛBV±Šχ9Vΐ*ΎQΑAΊϋ”ψΏ€ΤΠΓσ]?zg‘ύ8QlPyύΙ„½υ<ΐpœ"‘ΣΧšE|‘ύ› {λ.F‰Α$½qυΈCΐ NR΄ϋ NΫ1vΦ¬Ul΄ϋ Z½«“ί,όί§Y.NŽΞ#s_`½bcΏΝs}w½lŒŠυ+ΠjΎέO4qΞΖY'FΟΧYΆΕ°Y£ήDΕ‹ωŽIDΗΣ―QpteΓ‘h εsΐΠι%8ο%`ƁDIδ=ŽRN έΏΩΝw½j£QΆ‘p܊τg x.MΔ©ZHD¨%²Uwΰ9„΄ϋ ž‡ μ­gσ]ŽzΩΒξΊƒ[66J9‘OΕΐ,*XΐŸ΅~€@8xWŸΎŠUΌ‡X«ψzGD˜ϊ—APmΌ«}³“ ’΄cτ‡)”blH$©Β³“έA Ξ―Oψ?Σs)YLB Αr‘θήz>Ήqε MΰΣ:ŒS(G¨ 9[TL\LΎ)οMα‘N°L'τv?ΑzΥΖvΓAwHͺ™²6ͺ΄ςH¨Q±`q.,‘Ϋ ©BΞ£€wx>-"ˆ«@γ†R'­ΡΜθ’”@«£Q±‘ΣͺηέΓπ£ί[V9—α΄CΙ>η Φ₯8iG™°QI F) ‚GWς”’Θ½ œSΒ>lFΘy©T°τDΓ$” ‰ˆ°Qs°Y·η~ΗΨt„dIœEΨ?‹Ψηήd¨Ά»»ν¨έu•‚₯,λ=MΜ¨>ΰ.€ŸέΏ ΰοψ)οκ“W±Šw«`_―Ψ%ό Δθ/λίΏλğ­τυ¨Ψq+Ζ“£==Y«—€3†—oy$‚ZΥΎˆϊI0 @§OΚwwΆ<ΤJ΄J|v^›#Ύ`ΐ0$υ?Ζ(ΙμŸExiΟC1'°έpπτ8˜χΎΥ‰Οsˆ5ί$Σ‰”}܊πκmkUOέίu% ŽΕ`[ $ΗΛ•c3¦π‰ϋ8'!Ϋbxtβ'«—,¬Wm4»qΆŠwl†Ν:%]j]Μ£Œ½i”r²V/ΡΗ‹αގ§^Ύ₯G'Sš’ΨjXhvœχvήM 9—Γw9ϊ£$#τ™ΠΠ<<‡#ŒžŸ†ˆ•I ϋ.Gήηhχo> @΅`αφ¦ ‹³μX{‡ΰΣB6†*ŽΞ» šέ_}θΈΰψW@šόήγjŸkxHvŠρθ ΔΣJϊa¬f …“VŒrήcΐvƒζηo"­™P ΐsh„oIŸG»ΧllΥ ΄œοUe †’^'ι\’iυbT‹6λ66λ6ΊΓdNΨΗν GrnVzίγR)΅Y·«[Wn?ΘMq’πμ8Β›OvڎQ.X(ψDΗͺXΕϋ6€οπΗ@δΎmύϋwŸψ΅lμ8”μΙQˆ/½3ΖρyΜƁΜώύ¦ΥΌvŸCͺi…εΌΐ½m&Χ& yΓ²ΒHχι±ΘŸ†xyΟGήγΈ½ιανύΛ|€’/` † –ιΌΥ/ˆwpβώrΑΒVέΑσΣP@₯hΑ΅yΆΚž-fγ¬㫏ΖΜ±J/³γ½.”š„…±Χ„Β³!$₯œ₯Ώ—˜ωiͺ]ύ›γ> MY«Xh”mœ΄bψΗξΊΫbΧf@•ύgϊYΝΰU,΅^±π`ΧUJA%)#566Τf8οΖ¬7LΖ*σ%pmŽ(N― ά[wP+Y’Ω%₯„Fx†c,Ε!˜mIα£Γ©^2a΅’…ϋ».μΊΨͺΫπ\Μq˜mT@θُ‚ΖXΙ―β}‰U°Šχ#\Bίπc ^ΰ=$}( ˆŒRœwΦ¦xύιϋ§!_—Ο­Ψ2ŽSl7ΤΛΒΨΕ“£ΰΪ™~£AΟ€Μz7“χν%8p#άήrQ/[Ψ ξνΈ¨—,e‰wΥ"0Ε€ΰG@CŸδVΈŠUΌλX«x/αΜQώ Ώ@Mώ…ΏyhΗ©bgνχ·bΦ(Ϋ°Δ4 1Ζ–ω‚ώ½A¨ΨΟ~ΆΗŽΟcάΩςχ9ξIwŜȢyQ?iΕΘy›5{¦OL«ψλόsϋBF“”`tδ}Ξ—tΚSjΙ€ 8c|z‚a»αΐ±Y¦pW-TŠ€ξ·hΫ=‡X– €₯LsρlΡ&1œ΄bΦ₯j½f³ΌΗ•ΰ΄’Ξ ρχξΤ—νgΞεκ;^ΚαΞ–‹ΟΌ>bΟO"Θ™)‚‹dΛυͺ;[ž•Lρθ ΘL“’DκσΚ2ΙιešJAΰξ–—qZž„Ψ? ρ…·Ηl£fαγw}ΌzΫG₯(^΄=0‹|„ όq)H]pόγ*>€±*Vq]ά=DώHΆxΑΔo¨a€XwͺΗG!ϋυ/ΨP―ά—bςλ+EψΓqgΛE₯ π‡ξ0E£b©55Υ’€λpeΔ‚2hx†¨Υ&κΝ§#u>†{Ϋ.Jyϋ;€¦€ˆΟ’•p"žŸ„ΘΉz~_Q’L₯2ƒ‚&j―{`³f£?L.©π]š; ±Δ· ½jM•†?Ϊ1PΗηJy’)ή¬9θnήwΖ€έ5E_P"|—)K,F”ΎόΞ„½ώdΒΎγAε‚€η2&₯R–`¨•-|JΞ–˜Ÿ|7hω€rA¨ωξžŸF8iΕ,Ia6eχΆ=86Γp"ρθpΪrR ’PκΒN,ΡνP _‡»|πH9ε–HIˆΐρyΜ>Φ―έρΩΗξzj½j«rŸœhjΰ{ό4€ΏΰΧ,ηb΅ŠL¬ €U\ŒHŸόOVο2ρχG)λτiŒo4‘l8‘H€ZJ‡ξ³ƒΤΔ­ΦyΞ€[›.j%ίϋ‰ΌΪ¬ΩŠq‚b₯ή›šžC²“Pβ΄Α΅Ιδ§R°p{ΣΓi;ΚΤ“P.\Ε3A,ρτ8ΐ«·sp΅z –[κΩΟεH%‘Τ›aoΓΕPη\χΆΕ°Q³‘”2BK7†ρPJ[υ6βξRέpσω­^‚_ϋ_y4f/νyμχ|΅³ζ(KΌ«B ΰψη@ά€ ΐ–?Z«ψ°ΗͺX… 4ΚχηA0’μσ›‡Xw²ΧŸLπ•GΖ9p{Σƒc1ΈC₯`ᬳόB„ιjζ·ι‡η*Ϊύ” ΗΓ‰Δ½₯œΈ1ΑzΥVΝnΒ”φΟBΞ°³ζ`£j#ηςΜeΞΈθ-Q’   MμmΈxη ΈΩ4”De ‚­Q‚σnŒ{Ϋα¬;x|x΅^R@₯`‘¨e{†ξy6|£b£”Zς—lƒclΤH ΨΘ_΅ύCE“mΡ*ω Αšc°ΔubF}—FΓHΒΧŠΠI”βπ,cfY žΝP.X¨Φͺ6 k ε‚P–˜Žσ-Χ6!4ΰ₯[NZ1{z’V’δο: a¬πψ0@ox™Δ)΅¨η –usuΧ(ΫΩgF±Βi'ΖFΥΎ41{lRόά#ΌρtΒμzμ;_Κ©u[Y‚½›Φ@Dάύ= ’ΰΐσ₯?eΪX«`~€?Rο+ΰ]&ώN?e_{2ΑWΩywͺ`g ‚ν'YVƈωΎΜƒLpγς§gρΩ΄0šœ3Φ$ŒSυΙo/,„Μ…vΦΌρ”$Φ₯–ψ΅­¦Ky LΤ΅ΐK‘Θόg–ΏV±F OO‚λ΅κPπy6ϋή#ΛΰΌOFAUςΈrTQ0¬ΧlpΖ –\ N-ΟaΨͺOΩν¦ΥΖ䟐χ„NΆT°]τ"ΨiΈTx€ ϋg!&‘D)/`‰εXqR…gν­~ŒWnωδ‚˜΄yΤIa˜* 'šΓ„rŸΈλ£^!?ί% ‚jΡRˌ!’ιW―ήρp܊ΩΞY‡±Β;΄±)–ŠZΏyβa½jγξΆΧf"‰Η‡‚˜F…ΩοΡDβ‹Ηx{?`/νzμϋ>‘WλU{©ύ›έdύ=DδύόχXΩ€cU|΄γh–ί°ƒχ°βκγΛ‰ί@Α“hϊ‘ŽME€ΰ Η­hαCΜ¬μ”"tvTο°BAαΦ†‹JΡ‚ΰ€ QμζvΨjΨΚ±3Ώ$UxzΐΆj%KϋH€KœŒ/΄‚_+ΤΛΆ6&aŠ“φΥ¨c@­lΓΆrξ HJ|"<ξ­“mπ`ΖhΚސJ!\bΪΐl'gΐZΝFή#FΊ3¬όσ©– [u{ΏΐXoΦm­D˜ Υ‹‘σŸ/•˜Β˜Z+ΓIŠη§!’TaHTς"k=\όœY·>ΗfΈ³ιΒ±9#Ι#:>g!ξνΈμΫδΤfέV‹ͺ₯€;[ΎΫ hvhjγρa€VοκδΟ΄¬t’uvΥBžiΝ Ϊ>†q@<cžτ"aΞΙ$”ψΚ£1lΑΨ½—mΦmU.ˆεžΘw‚‚"€Ώΰ—±rόHΖΧ`wί ‘π―ψϋώ"(ωk`sq˜δή¦μΧΏkv’μί― ₯ˆ@e †;[.ξθ«›ΎΤlŽ8R‡ΝΟOBH© %Ψ2+v ^Ά˜}3Ζ ΟNBD 1‹9΅Κr5²cσlŽήhΔχ†),Αp[^΅ŸΝQ+wtIfFz[b…œG*³d5ΑΝޏ‰ώhρσ[ŽJš­…mbt/ˆώD±ΒI+‚”@)oeZϊ²Φ†m1Œ&δg`Ϊυ’ΧαK‡cβ6<9 1‰HΒ·7L 0΅BΎξƒgΈ»ε‘^Ά ₯Β`Lϋξ:γPβΣ_α'ΎΝ~γ+C&j!C¦no:’1ΰΡa€fχζUšͺL―‚_₯ζΨ]sqo‹’`œβνύ Ϊƒ$;fΏ–Χ΄€7™Βφ΄ΰυ'ϋβΓ1~±eΗEg. jωύ~? ΰΰώς³ŠK¬ €^|/H9μoψ-ϊw/΄κN$ϋά#φ·Ν~ώs}fzϊΛ$ήg'!ΪςŽί]w‰mm]_8Ο`«V–¦πό$DKŒ&rα£P»υ©υΪε€lVΘ&YήΩςΠ¨Ψ ?―θkα T‘7J1%‘k3άέφχζ“šR@₯(ΰ{€ΨΖ?ζXv‡ ›”ˆΝx£y_)oe³ϋ'ν£Ιr’AΝ°»ζΒ΅9‚HβΘΈμ]8Η­>©rN6ΚN>;kYkθߌΖ1kU+γάR΄½Qρ‘χ©ΣO'ŠΤσW«ƒŸ΅Š ₯€ΣNL2Ώ‰‚c‘|3υΠισφ™―Ψ’²R@ΞηcΉ?EJ…T#"Ξ\QΖpgΣ#ν‹‘7Lρp?@o”fθEΆX>i+.Εύ9„V/Α/}~€Ÿόω6ϋ™ίμρ£σ˜-3rzαc%ˆπΏιό€βŸ°ŠoωXΨ­φ.ˆμαWύRΟO"ό½_찟ωt΄–Lόz䌁l\ξ8ΧλFΝ¦ρ(η θ˜QBf UΧM}τΓσOŽC΄z “KδB‹»kŽΊ8‘χ,νFJ·,\j άplΚ '¨v4I33“œ >Ηέ-ξLΒ ςŸ ΑhE|‘mG­­>υΰ·iΛ^Ϋb)šqΊψ4’Β‘PΥ"%OZ1FΧ(*Ζ‰ΒI;F* iTlΤΛV†œubœwγμ@ΫC£l©e4βX±§Η!;iGsΗp8™»ZΙΊrΔn»ξ`gΈ η]JώΓIŠ0–ΰŒΠƒP%©Βή±v?a y! hTˆ;°(€"@Β>fΰξΆ›m[gΰαώƒΙr²Υמ3³δ+·|¬Uμμ\΄# Η)F‰Ο½1ΒOώ‘pν~ΊΠ!σβξ蟏ψO@‹ƒx›ΌŠo‘Xώ°ό>αηί°‹LόJ΅Ί {ύΙ„Ώω4ΰΗηdΆ²τ fVΠE«λ=ܟΰDsΦ*δœVΚ‹ΉΚVIŒδjoκ-»ΧןLn››­IεZˆ3Z‘><˜`Hx­Ύ*…«a|ΫbΩΆχF)΅t4»1žŸL^/‘R ΰΔδΞϋ΄•Šτψ―²'NRjŒBnmΊΨ¨9Ωμ~³“ ˆ$­H—ΨiΞ‰49§˜MΐWχv?Ag@νέuw΅0Ξpœβ eκΉJΡ ΅Z²χΠ&κΡQp yH€B[«B–rΦάΉHαφ¦ !:ύ΅ΑO’ͺ¬RπEΦ*a ŒR΄zΙΒΒ ”ΕΛ]Τζ\Y‚eΧΗ––nυΘΜκ’Rev°fŽρ’X+ΫxυΆŸιK˜0ΗΞ$ϋώ(Ε§Ύτ}|DJhiͺP.Π*ΗτΓMp½!q’²UΧuaZ gνΕβ9 @΅h‘R˜BΝB0δ4L? R΄ϋ τˆΪƒ]εόόƒ˜Xό$α+%υρ/nζq+ΖY;‚2λ_ΞiDΜΆˆ!ή\mόC¨‰Δώ)%»RNΰήΆ [χώ YnΡ¨αμG¦’ˆ‹ˆƒIͺp|NAΟζΘΉI’°eΠΏ‰R^ θσ…e%pr³+mŽΏH9+E+S¬—©x²τΨαγ£€&τ9ŒS€’ £α`ΞO+Άh»¨=b[ _ …©>„c3Ό΄λa½ͺ[ν&˜\ΓE™S4Ί!8'’—φ<δ<Ž ’BΣ »x/˜BΰΌ›ΰ>Χg?ω mφ•w&γέ0m- Δψ½X‘Ε?΄±*>œαψW@«ώ? ‚%WύfΥέ€μΩ€ύνŸkσ_ψ\ŸλΩ{K0άΫρn„Δ/†Ίhί¦#• ΟOC<Ρ0yΞγxyΟ'˜΄"7+²Tͺ…«K"ςGXfΥΊQ·31Ο!?ΓN7šόOަdΌ—φζWcŒQ!!Γ$"=‚Λsγ OOB΄zΤSί[wpkcΪVθςί ΫΫμΖ8>§–‹ΰ”€Ξ:1=a‘€ΛιζšόYσ£›^Ϋ%θIΡP8λΖ8οΕsο5“ŽΝn‚T@³›°«¦+#IδΑX·τq-ηIB׈σ<> 0œ- t»%Nˆ`:Λ΄ηœΑsΨb&ΰΜ5΄ψβ‘‚”ŠŽŠFcŽΞ#<: ΖΧέ t”JΜJ―ΰώΆ‡;Ϋ„ΈŒBΜ ?!•κJ΄ΘC8jΖψǟκςΏχKώθ0dFΉpΙ0ΣΏΐ " ξ-ύξU|ΛΔͺψπΕK ^ήχYz΄<ΟΎπφ˜ύδΟ·Ω§Ύ<`½aJd±σ([e}WnϋΨΡ+ΩE‘nΘMζΑωp?ΐ8p†ϋ;φ6ˆH%νA*—λYΠd@Μ{@Ξ†ΰP»λŽ2½ζœGVΌq’2Ÿ€’οΣUΛ{/νκv…šΒ ΓFρΥ‡:JžθRXΓ­ Ύ6†1£“‹ŽαΡΉ^y›ρJ½ €$UL.‘ζ±(εΔβοI»ΞteΥ{˜ξŸ[bρ)JRΕ&‘ΜνR„ˆώ=M!)hIb[“ί8Βˆμœ qpvŸΒXer½₯Ό€ΠsςΎΗQ.Xl™β1J(±.“'ωLφNS*dŸžšΕnψγqΈ Η»ΰ Ό|ΛΗf݁Πm˜7žŽΡξ'T0h.Ξ’–α@Ό½ΰΏΕϋΉΟτXwΎ@ =7jώ-P[ΰZŠ«ψΔ Ϊωπ„ ΊA"HΒχ…Ώ”ΐ³γύϊW‡μι%ϋl–Fώ”^/υ*εΞΆ‡œ/πό$\^0ηš8οň‰ϋ;Š9[.r‡―5ω3a ’Y»Ÿ ŒΛ‹›Ÿϋ ΐVέVΎΛΩ( !ΞhF݌γ™8m‘ρ-ymKόΦσ l‹#η‘„owΰΊ•–ςŸxyΟ‡ηyl0Nηζϋ―έVX8ϋςΓIŠQfηgα9`€βwkΓΕ(Ho4:²8qςήR_«ΨztpΊΝΆΕ–—‚©ώ">vΧG«—ΰΌ³σ.‘ £‰DœP0%r.Y,sN*zh–ώͺHυ8`½L’@Ž6ψΩΤώΛh Ηr©VΚzΥΖήΊ“ύύ a,\ZPAϋ\8Wυ’…»Ϊœ*•„π3ΟΈΏλb£f)ΫZZQΠ Ώ ΐΰΰ―Ψ_κέ«ψ¦ŽUπሻώ·ώuL•ό–‚ϋΑ€N?Εg^²―<šd½Ω9ε7P`ΔOšέ‚3ΤKΆκD€{ͺW·ο%zΓo=Ÿΰή6ΝΝ―ιρ;ωb=nHŒC©ς zFJ·^ΆTΕ̌X Ζι₯οS@ΦZΈ³εj[bq"§³ψ Ήn­ΰψ<ΒέmΠ‚c3ŒΓ›Wž–vν3…aΌίΪpρπ`‚8Α’Ξƒ ‚LΎέpπτ8Όφ΅[ ² ) )‘ΣΆ“Rͺ¬w~ΞΑεο*E‘ͺEμΉH%Tœ(6§θ Sœχ4;1+ψŽΝ' Q$ρδ(ΐγ¦Š˜IͺΰΪ¦(SψŽ—rΚ±™ZνιΆΟuΑυ$†ΡA0―„riλζΉc‘QΞΆκ6φΦ]½Οd}€΅Œ˜‘i‡I,k< Χ&΄ιΡAΘZέ„m―ΩͺV²”K) šηI„|ΐ_ ­„Ύ…cU|k‡πc ΖξwγWύa¬ΨO&ψΝ―pΪ‰™ωύU‘H…0&ύφIH-[.6j6*Woωxv’Ω‰/)“ΝBΌ‹ΆiHΌύ|‚Ϋšνώ"ϊξ&<‡a4–¬Q^œ“\‡δΟ» ωτŒϊuΙτΈ1ΰΞ¦‹r^θS@VΕΧΑ³Α9ΰ{"ƒρ‹9{ΫξOζ¦f#SύΣ+Ωƒ³–Ε°»ζ`½jc€I’/XJ₯jήΐfΝAw˜’ӟ'MRa$°ΣpΑ9±ΪΨͺ;Έ³Eά…ZQ Ω₯ΥxΉ`!ο/ίMœm 186SFΧώ ₯ ’T±$Q*ŒΞ» ‹RΙ<—£7$t ŠΥ|kIQŸ… }ηK9Ό|Λ]κΪ‰…I¨ τθάφ‚’οήΊƒ5‚šc F6Ίύτ³9ν;noΊΨ¬Q;m4‘xvBJ„s[Α¦ͺ˜Xς~2QΚ άΩ’[ x~α3o ΩΚƒούxυ²΅°@2—¦hΐί© ώίœ.Ώ5«ψfŠUπ­λ ‚ί @KϊΊƒ›1ϋυ― Ω;ϋυ=<ΐŒ€lϊψˆFnoΈπ\Ž; ΎΐώiHD¨LΒoy_wΣ‹}|"IIx†1ϊ’ͺ…ŒΆΕ1KH…… hΞΘφΰ,Ξζ7™^ ΄ί΅ιφ[‚”εN;΄2ΜΉυ²EΗΛY­~‚8V(δnoΈ_hΈ%%Χ!έ³"ižv"ΤΛJy5½QŠ0R¨–ΔσώέΔEžˆ%˜²ƒοbpoΗEœ\pw έOΠκ₯¬?JDR%©bœCUK‚m5υm|U)ΖσυDš‚ω.ŸΣc0δΠΫ[.Φυ~w˜βΩq€;[\›φ}Ωό?[ —ςυ2 :ΤBz|^©`δIgΗΤΒY―Q»Β[γ„xύQŠγσ˜=; ρ½+ΰχ}εΨK΅Μs¦ΰ/ψ>6€O½ϋ³ΏŠoT¬ €oΝψΠLοΔ ŽφE±bΗη1~ε‹φψ0$‘%ž^ΖΓŒdo9§ΏŸ΄"L‚wΆhDn»α οq<= ίSK I:Γ[ ‚Mg­]›γP―ΪlΞr.Η8,Œ€ΚΉ7g#Ϊ¬ΩΰœΔhΒ|S”rΊχ½V΅I0Έώ½Œ²Ens‘ΒΓύ [›ώΨH…g'σΞ†ao˜ζ'ν8[ύ>= α9wœEΑCKœΕxyΘŒΫ ΟN¨‡Ν°·ξ’\°¦„6r]Ρ„Eή§χ­WmœEX«ΨŠs,»Š\:fGζƒrlΧ¨—ξ︐Š<”RH%ΐηLqΓ]QΛ%(V88‹@rΒΠΧ­i5άίρ2έ…3­<Ζa,ˆ9ΏŠ‰FΩΞξ£γρnš ΰz°?]€‰*χ6¨h1ΖAfΚb–ίμ$ψιOχΨγ£ί‰ΆΧl΅δΎ4ΰwD„ώ}ΛΰΚ\θ[(VSίZ‘πgόmЍ,‘ό3·ΎAΚ^°§ΗγŒ-ΕΰŸ ©kΗb˜•VλSΌω|B=KE¦8―ής3·Ή%Έ{W†c‘sR@JNδ΅;<ϋκ§Ε‰,Ζ4’·θ‹•ͺ%ν5šγΛM½1τΎU ^ΪυIGΰš·»6G½lλsAΔ·g'!šέ8C9vΧέΉDn[ [ ‚ΚΠκNϋΰΓIЧ'Λ!8³Χ‚Δγ8οΡχnΥ§ΒBkU;Sϋ;νD8νΜ«υ΅z ΊZh³ζ  ύή‹Ϊέ‹„1…2Egt.‹)K° ρY I%πΉ7Gμ¨3ΞiΒΕμL΅`α•[>ͺE Rκ1ΏΓ #ε™L!¦z‹Άά‘Ή†!iOŽDρΝ<σIͺp]mcŠΜΧnϋΨΤη±7L³©–(–s(…ΧŸLΨίύΕ6ϋτW‡lHΆ€v€i9nƒFsΠ*ΎEbU|λΔ]PΏνŠPσγ$3Λ~νKCφk_²N?ΝΤχ6λ8_Ž ¬@zˆΝa1z>> πD ηx.Η½χw<ψΞbq•«ΒxΧG‰ΔΓƒ€€g­ΨrΰΕm΄-F}ά8lF ΗΏτχ¨Šžνο —Ι+ζr@š€žH…JQΰ₯=JG<₯HΜ&§u›]ΰS…'Η!zΓ4ΣΨ¨M5e %m›{ܚοa „|pFύ2ϋΚ”m1•JςM$l=–Ψ¨XΨ[§^q”b,ʌ~L$©ΒAsͺ‹pΗ%–ύ»8ΏίΘΰ "…ίψʐύΪ—†l0&Ψέχ8gX―5VΜ Δ Y:?93δΙΐιF `Φ¨ιͺ˜E\=Ω2%ήڟΰθ<Ί€Šx12ULΜOδdŸ―¦|‚Wφ|rI’pЌπφώR©L€λΊQΞή0ΕΟΟώΑ―tΩ³“θFNΠ…0*‚*€Ώ²1ΫΓU|CBόα}£·a‹γwζϊ tc-m*OŽBφ3ΏΩg_z8fη½ŽΝQπ„`¨-xΗ$ZbΥ«€œ'P+YΤ‹οΖsΙaV‘m0NαΉΎCy₯œ€-5 ρšεV¬Υ"ωя‰Γ³­~ΞH­/ηqT βTaΚl+E λU©$ς؝-φyW³<ο&μΌ—±Ξ6ξšƒRA`€xk?@’UϊrίΡDbΦ‰ΞΦΖBΎΛΡ¦8lF2’€ £IŠbNΐsι˜±B*ξνxπŽξ0Ασӫ퓇DA&ŠK7Ɓη'{v1#£[ΥΧA₯`ΑuxΦ'Ύj<Ρ@ζv?¬—-άήr~/@€ΣT‚qΘi=½—ΡΡ Ζ(ρ'RαιIΔ~αs}ώΕ·Η,ŠςΎ@₯h1νx¨ωA$ρψ0ΔIλ2χΔw9j%œΝn2Ο{™ύ^ά`—D€ΜΆ4»1Ο£₯ΠΖ¨hΟϋ½7g£Z²π`ΗΗzΥ†ΰ ΓIŠGGAFZ5’ΣNŒΑθκiσ»v/Α££I ¬U,fΫ/t’6ό(Θkδ Βyσ*ΎΎ±β|sGΐΏ ΰ’η\nΌγ@²ΟΎ>Β?{sČ:]œ(t‡ 6jvφΊšbN`Œ θτΤά vUΈ²μRΌωlŒ½u›5ž&ˆ‘!ΠrΖȍzžRΡƒϋΙq€q(q{sJ<Μyg9ΒΩ5hRa0&4b οqε،έήtΝN|ν[\‡£dˆ[Γa$q،άήtQΚ“˜Λ;τ†ΤO,r"›ο6: οa ρΞiδ}šŒ-δ=$₯ήϋuPš*6#'j)"—™'g ύΓ0£mϋ§aζpUHŸG¨,¬Χ,Ψ[κšόό›#ŒΙΆ,‹θl5[ygΆ=νέ–ϋϋ*˜•sͺ€ΡX²Γ&ωE<: ηδˆΝθ§ηpl7œL£αΙqˆξΰjν "8λΆΚ₯ΛJyξ¬9s#œRќƒ₯φƒQ; š‹cΤ+›a³ξ`§αΐ±RIΧξσΣ]»6Ο&ΜΘ’s5₯ψΕΟχΩσΣΏγ»‹Ψ¬ΩΛ…³ΑO€$…_Nε*>€XίΌqΐΐΏωYάλέ}g~ωσφδ8ΌΔL΄χΊΰ ½Q‚œG«Φ»>* gdωiˆΌΆƒ…ξ0ΕI;ΖzΝZHšrmŽΌΗU)φ`—,ŠΞ£K#Jε<‘IͺОΡώ?<§UύνMŸdƒξO0œ€X―Ϊ°8GW%W ?NρΞα$γxΧI:Ή1!@œ(§ΛqΈm1υ°—Y’0ηΈ?NoΤ` ΔY7ΖΗοyʐΜnŠ8Qx~‘ΣOΑ‡‚b£‰ΔI+a€ς'§ Š₯ͺ‹UŠB9Z›ίή ΙpHφφσ‡ΝˆΗhυΘkΰ"ϊ0K8¨΅ςψ(ΈžΤ© j)Λ&Œξϊ[ΑΈ½ι’^&da8Nρό4D½lc³nƒρεΙƒŒ!γμ˜ϋ°\ ˆͺF.&ΔώY˜‘sζ³]›Α²ΤΜ$Ο2ί§πΞA€r^°o)‡ΝΊ₯L!± $(·ό@Ο±‚°_ΕΧ'Vΐ7g|dβσύXrΆίΜυα­1~σkCΦ^Ά5Lξ$U°C»O°ςν ε‚•‘‡Νθ*˜―g {žζυ§m‚N_Ύεƒ3R;σ]Ύq`Œe½«|ΊƒoΕάΩtQ/ΫX―Ϊ™•―:q’p|γχό…Ϋ*„φ©Χpϊν-ΆΝqpRΒ0―γ΄‚ƒ‘Δp»Ω–`ΰ&ZκxYΨΑ¨O2Ζπψ dύaŠΫ[ς>_fβΓ ίšψ«ώ3£εΎ}_Xί\aψc Ψμ6^ςovφ+_°·ž—χl€R!Jr.έάgΖAŠν†ƒ­Ί£‰]*Eƒ³ƒρt₯.%υ₯-Α–κωš β-)S… q(εφΟ’K²»=π8›’―ΪηqHδΐq(±Σpχ§­†αDB*‚ΞΓXehΒ΅Η@!ΗΥγΓ€ν+~ẃοp<> h•ΜΘ½¨­;ƒδΚ$y|NEΐm]ψ.Y ­ώΝ&w,δ\~δ»KΈ»εβ—>?`‡Ν(;†œΣ$Γή† Χ΄N ΡN.ζ©$R‘πΟ³QΐYΘίωœE8jMGW αOh^Μ²Π†ΉΦ*vF "‰ƒ³§ν˜ΆωΒ{Σ£±XΦλ@ξΣ]I·bφδ8ĝ-―ήφ!ΔR£Ÿ@ΐΏ ΰγ 4ΰ`©^Ε«ΰ›'j ^ŸPΔ’p™Tΐ›O&μWΏ8`gd!±*MΖAŠJAΐ±8„ „σμ„˜θ{λ*Z†·˜8jF8i“W}’*€=xόγKN*v!*“ΩͺΣΩσΣνώ<ϋ^ϋΦŠΨΪWA†@χό”ΨμwΆάΜͺΈZθZ½„uϊ ΆΆZΤh”-Ζ929βυͺFΕ‚mωx|Dβ)Υ’Χζˆβ)όq»ˆ±Ÿ€ w·έL)n0I-θΑ Nr³Νh¨ΪxΌ½™˜§@EΙξΊ³4ΏBJ>·6HΝPJ`,B³ƒs†zΩΒξΊ‹Q ΡΎ Θ9Ý-λUΓ¦‰sΑω?ο&,IM”m@7©Ωτ§JΜωθߏš1ŠΎ…$Ql„°-*jT„Ί»ν²R^¨«ŠΖ ξοΊ¨–,όΒηϊ썧“lςΑŒͺŽ&T­ΧlΈ6΅_†WςΜ†”@œPC>ηr*ΧT VΖ!xvfώζ0†@‚³…E0εXš£αΨL£ žŸ†κ"ύΊ2BERͺ…ΒJ£@kU»kŒŽFšΈβi'ΖWΩΑYŒO~{…άRh€΅1haσ|z©‹uh¬¦Ύ9β>€ΐƒn”₯VύIͺΨgΎ6b?Ω>덖3γQ (ε*n?Χγhυ‚;ΓI δ\Οα(Ι\%J$βhTlΈ6ƒr—ωΞΌΟ±V‘ΡΆη'‘f&3δ|ςn―-XΗ$˜š±ψ G4ΞpڎoΨhum –Α«y_ ˜υ2y,:¨ΆΕ°±“VBjpϊsr1δS©°V‘‡bo”βHΫσ^“P’˜(ψB?ΈΙδe\ΝPŠΪ {.cΨΧ“e=χ†γt…ΐqΦ«6ΦͺΔζ_tέt)λ%ΫiζΐI+ΒA“” Dν9tnzΓ±^Ή2-΄³FDΙ‚Ο©—½θPΐ[Ο–J°[$/Ζ2kσ„‘ΊRύnΊΡ”€jeΪ.K0$Rαρa€ΧŸNΨΓη{vBΪυ²Ε¬k¦>rΗ­ IͺX₯@Σ"€˜βαWkΆEc‹¦A”ŠyrΑ‚m‘’£9Χ'ν˜χΖ—χ«RϊzΒ₯iš«’\Έ³E*›»η§!žŸ„W’g³Α΅^ƒ――ΩV/Ήφ΅ @ΉHνC*Τz£ΟN"MΖ- Z1«-TŠ/4ρw$`vΰMΌ?\ΟUΌΛXίψψ!¦φ?%[‚ZΊ”=:ˆΨ;ϋ;ν$K%bCγK1†gπR±?Ja J9£V€£οΜ³ρ‰_ζkσΎΘŒ}ΞΊ1F‰ή(Α$Pπ=ϊŽRŽvœ*‘DήΨσπ§xαƒŽ1ri+εE6'ν»εΌΧαl«a/<‚3κΑ‡L)zθΕ±B1G‰§ͺΗδ ’ΡΏ’WŠφ{oŠ˜T*8C₯ €οΕ ²-†{;ςžΠ"?!’XB:ξΎΛ‘χc-έΛ¨ »½αB†FΩ‚Ώ¨'Ο€$Q,ŒΑΊC"»%šc`,q«ϊ,!ΊιΨn8Έ΅IίΥξ'π=nm: kš*vΪJXφyΓο™Š‘cΣη]—Ή«•ν¬υtpaŒZ ΐ`$ρψ(da$Ωξš{-GΕ8!J6 NΫ†2S]τŽ0Vθ O–&|O Z΄ΐ9­œƒHβιqˆύ³θZG)Gʎ©T8m'WΚ?›•ώΚ‹{Ϋ䐩OΉκ‘ΠEχ½ uΓqήMΠ»BSπRΌ³IFWf€—sjχ΅ϊΙ’νAЧΗ!³-Ž΅ͺuε$Δa¦~Dύ‹βeήΈŠχ?VB@ίΈΰώe ¦dΏ¦&A5cφΖ“€΅z *E+c/[JυbǜΧϋlτGδΜχ萘ЎͰ]§•1Ιω ΧξRMΙ|JΝ^ŒΧŸJ*ʁWnωΈ³ε"ηΤ@œͺ₯•ωfYσ¦Ϋ­P>€ΝΊρΜJξνύ †ζa¨·ιΊI‰Ωs΅^1ΙDfϊλzΏ½ι]z`’±­ ›ςΗύ5΅·AR½iJΗθΑOά—γΦΤ 'ιΝ«θ™π²M$ž…£ωγ{ή‹q’Ι›λΫu5"΅Y‚‘; h»”K}_*) N‰ώαΎΦ’Χm’‚/°^ΉΪfή¨?’ 4ΛΞΣEŠΉV>ϋΖŸy}x­°ŽR€λ0uoΫ•έAœ)ϋ1fΪc2C~n⹘ΉόΖΤ°ͺ3Hπζ³ Ž[€ΌΎΧ%2‰½κΎeŒ ‘ΧnϋΈ³Iό„Yσ£eξ`*Œεθb蒐™θΩͺΩψΨ]»k΄κŸ„SQ/Σ²ΈΚ)‘kρ ϊ›=φσŸν³ώ(eK.Dfy!ΘΧdί€XߘΘψ_€”ύna U?Ζ€I(Ω/aΐώΡ―uΩI›ŠfΟαx喏ϋΫςK0²A­HIQΘΨH„·"ΌώtŒ“‘Œ 7΄\—”ψ…‘qΩL"‰Η‡ή92UΊ½u·6fN…(YΕ‚t9ϊ•“0ΕY;ΖΟ&hυLBu#£{φsΦ*Κωω±A £lΎλΞΝϋ«k>'ηq4tRkυœΆc<ܟd2Ί;kξo{0sϋΎΛ±Uw΄ep‚σ^©h,ξΦ†£Ϊύ$+*R€sNJuΟNˆ±LFΆ“IJκvƒΙeC)`Œ΄8'Σ£{Ϋ^Ώs8A*j₯Ε €z:q’pή‹ρπ`Jψλ Œc°©‹K5³ Ž>Ξ{λ„: τ%1χύ >†`χω·Ζμ¬߈Ξr»„^˜—I½κ•Ί§ο9μJb‘ksάΫφπςž7η‚xήK2έ‡›"1‰xf΄Οl—ksάήtρκm?σ8λΔxηp:•±΄ι‚ξη}‡μύΘl™ρκ-v}|4U8nΕψΪ“1›l‹Γ„^―)xu+Ÿ}cΔώΑ/wΩa3~‘"ΐπ§@"g―-·S«x?cU|ύ£Νώ?h` ²gΐY'aπW»μΧΏ2`'νOŽ‚l%` †ν5Ώ›ΛΜ{FθΥ0‚Hfv€‹nΨQ ρΞΑo?2!‘bNΰ΅;>φΦη½Ρ―ϋN€ΞRΏ!1θqΑNœRͺlεΞΉšέψΜS˜φ†S…α˜Άq8Nρφώt‹ΜJ«nΤ/{Ϋ“ΐΠtZ-’NόZΕΎ’œΈ^΅α»D4†Γ‰Δ[ΟΙΧ>“4Φ²­Ϋ šΐˆb…Γ¦aŒ3H©P/[ͺ”κ αΩ)ΙΡ–σ€ΚαπΌ_ %_sBψq+B«wύDBSQDΔ­°Γ8 $c8–( Ήε ΐI qltτC™}§I8q’s9iΧΓ΄O¨°5’<­^‚7ŸOπό”d=‡œ―b½Ζ)žŸF ΣΠ«·<Τ+φά΅5 lL6ηΝοq4^»CΫeY Γqͺω 4oΏLςKRmέlFϋέγλUZ‰›{*»ο4eΡeO3@€MΖθΎυ4MΞεΈ»να΅;Ή =μΘΟ㝃I†nε<2ύ #E> φνιqˆΏKφ₯‡cvα6Ώ.L-ςόόΰς{ΆŠχ#VΐΧ7ξ€Vύ&K$ΰαAΘώΑ/wΨ[Ο‚Μ±mΚlU%tƒϊ.ǝ-»“ΓFΝ†ΈF΄#IUζ=οkž›Β$ισ^L}ύzΟ™~ίZΕΞΖ”.†ARg[W}Η8€ήC=ƒ­@+γWnωX«^ω% ‹Σƒ.ˆi%lV'OCΌώxΒ‘­ΐP; GΝ’σB0¬UlN­‘g'δΪ–σ8^ήυpkΓΝτΜκίpZύ$sΣc t;ΰH VK>vΗ'uF½Ϊλ @)lŠ"σŽ­† ©['­©Jaš*τG)RI^ζ±Λδ½ϊυΊ8δLϋ80jΡ JΡRΎ»ΟOCφΞApI*—Έ, Ξ»1ΐ€υͺƒbŽ$y_Ήε£Z’πρ9ιُ]θ p=kΥ>(Eώ7Α„΅»6%‡j” A$!82‡ΕLgΛΝ<(RI…ΪΟ&Dχ–sdœ52²-FS{>^Ϊ£^Ώ”T½ρdŒ“v|IβE‘LQbŠΓ½PΨ]wΰθ’ξρQ€7žΡκι©2‘χ©₯6 %’d9ΑvŸάύΛ%j4ΐθœ|H/ΰγέy‡­β]Δj πλίுͺά₯ϊύiͺπΟή³_ύβ€]d$§©Β`œ’œ"‰ύΣλ5΅"αςΎυa‚Γf„ή0Ι”Α€©‘ @#dœ1,#"Lί7%ΖAŠZΙFΉ χ=΄z›d;Ώ3σ#PΧέέY‘эiΖ\ξŠy—=ηER*‡σ#ƌ` =¬β+\՞ŸF4³[μ[ΏΥ°α:œŠElχR^dEΠA3Bœβξ¦φ6\δ=§'Δ;˜]ύŸΆ£95F3Ίψδ˜V²;Zk@Ϊ!Η­Π-‚οϋD^ΩS¦eπ₯‡c½2ϊΟ›™ό8™ N—ΠΔ±΅ͺ;!©5^Τ2P 'Ό{ΊE‘¦ Œ±lΜνιqˆF™ΔΛT‚==Ž0‰δA™99dr£Z’ρΚ»Τjπ΄'Αa3ΒASχΤρ šέυ²‚O(ΘIk χ+PqΣ¨Xj₯Vp ^ΆΥ¬·UœΠ}UΚ δ}–*ψ·6idRΛlγωi˜:ƒͺl‘•.Bo ©οΞΙιΡΧdH₯¨ΐ<8‹ΠξΗHΝ½raμsΡ(ίlΈ6]+–`Έ― ¦œΣ~žubGYQ7{^,έ€–š\Ίθ0bc_~gΒ* v]ψή£‚ό?μDƒVδΐ8VΐΧ'~ΐί a,•ό‡cΙ>υε>֘]₯oˆ9RQŸDo=› VN°έp2ˆΈ”8ο&8nEsΜσqBXΥB`α(’ #fΕ€]_)$Ψ]wPπ6jT œΆ‰DfμR9ΩΈ.~˜Ύ%@+ Ϋb(ζ6λTά\T*΄#WΠΓκǘΞ{ +ζœEέTKͺE£s™©Ί™™sΓ„ξτ„y4*€ΰΉ9œΆ£™Υ|ν¨dͺυ \‡c»nλΔnα·Ύ–G­d©[›Κ3sν›59—c­j£Z΄*β P±ΗρςžίαL©ε¦H8cΨ¨ΪPJαΙQ˜3“όμzYσδ8@­DΪΫuA€°Q³–υΗ+·=ε،΅ϋΤ#"I€6ύοƒqŠf‡#ΓvŸ„OŽC΄Ίσž Ζ΅n0JQ- lΤ΄z βDs:WχΆ]μ­/žNί%M sΙz@χUή£^­dΝιμΉlsZΗ!i86ƒc³lͺ源’Ό-,Τ΄Œo+œ΄#ŸΗ²χ^–Αf|Οsœξ‘TR;ε°‘7JpTODIG[n'ιR³QΚ ΄z)’8`χw]TŠbΩ"` ΐΏ  RCΏ‡Γ°Š±*>ψψC  ω–”τmυφ³Ÿι³‡ϋAφ»Λ/’»5«”ΡD’©!䡊)ϋmΦ)iœucœΆ"Œ‰P‹λXƒmq„Ρβ™~*΄†¬ϋ£›u›5’&½΅α’^"4ΰΌ—dD'₯[Φ*Π6Ή6½©έOΠκΗΨiΈΨ¨Ω™Ra­Dh@o”κ/ΟH\V d‚rŠqgΛΉωϋI©PmΤl6cζ9€SPΒΝzΨlF‰0ΨYsPπ9r[^F|#>Γ<ς’@Π/΅ ,υڏ­W-Uπ<—Α΄βΏ¨lW.<ΨσsiΪlΗx|`­jγ–œ-θρ­›/0 Mι8 NF2RO5Α°Z€δoψœuι»6kΎ΄λa£f/Ulpυν||➏ ’kq‘σ^‚V/aηA,QΜρμΕ‰Β;Α%"q’pΪ‰PΚ“]oΉ Π₯ΨΥζSΫ [σ‹‘:—Ώ`8‘`³NΕάXλμ7»4Ά7ϋH;7:%Ν›Θ˜9cgT*<:½‡Ν0Ρ{?σ‘J3‡Α8ΕΡ9έ“FdκΊ―ς*ΒgΉ‹Βˆ™b‘Œ%Ύϊ8`;k6no:κ¦6ž "I@Eΐ_Π~οGdWΕͺψΰΒπώ2€ ,™όŸEμη?Χc‡ΝψƁY…‡±„k“ΨΜ#Δ,NΟ#΄ϋδό·Q³΅Ε©ƒFΩΒI;FKH©` Rs.³Gj ?kUJvΟNB΄z vΦΤΛδ|χ`ΟG£’Μ­ωž…4Ξ m"*Vžθ ’Li­‘ΏγD’Ω±•'αΥ_ pp±4Νƒσ›ŸA‚»λΎψpŒjQΐχΘψ§ΩΣ+¦8?M•Φ`'s"£Ί–^`\;6‰mTmμ¬Ωj³n£Q±”ηpu±@ΈΚλέχΈzε–ΗŽΟ Ζ)φΟBνu!MξlΊ/Τ>lFΘyλUΫ R*τF)ξοΜ'f7&~F ρδ(ΐ+·}ΤJV6+ΎΤeCΗL崦ΔZΕΒ+R Ŋ…±DšRA5§₯Ό`Ζ‘OJdm$“±Ϊš[aΜ €€"©ZΈ½εqt‰m γ)Ό­4šΆY›κ MtŒύ³0cΒΟή–¦ν% žΓΰ]!9m”όΜ±6p?c@«γαa%δχ4‘ΐ°Qu°Y§6Tφ=½dΞί`‘¦FNσΒX-Τΰ0‰ΏR ρJA€λγί₯8h†ψΜΧ$ϋ­+ΰ·},Χa‹Π ΐπ?Ω oμΏ·£³Š«bU|0α‚Ζόώ"Θw©ϊυ'φ³ŸιgF>‹"ΡσθΖ‡ήΞτ "JΜη½[u2=ξlΊTΥ3–AθΛ†Ήog`|ΎΙ:§xΈ?ΑyΟΒNΓA©@W%΄›φϐϲΥΗ̜υp’b£FRšƒw‘€Δ¨ςΪ‡‘ΓIŠrαζδ₯@<³’Ί…pΊy¨ΧK)|—C‚΄ωΏλε_0 R²°³6•ŽbΪ:Η&ξMšΎ@ςW—WΠ¦ΐh”-l5¦Ϋ' œQ‹oΘ₯Fa)IΤ,2k8 €#Tς%ώ’ΐ¬[`”(Όsd ΏςΕλRυΟύ–"[ΒPHaͺ•Rπg<|‘λm‹cUΌαψίƒͺVK$)ΑŽš1>ύΥλΉΩΰοΣ<κΫC]Ύ«†“SœublΥ)‚” :ƒd©QσžY³σ£ν~ή%)έ΅Š­†ΦΧ³ξ{NΫρ΅+u€Vœi¬ˆ=σωIJΔ°ξ ΑΚ‹FΩΚ Ξ‰ Χ¦ΈΌRλk)ΤJαζωu£χrc•Ο.š,ΝzΦ׊ΆΧl”σB• ‚Š2ŸwŸΊΝ"δ gO9³³NLΦΐώ­έOpЌπρΞ‡¦}c8 οψΨέ&ŒOŽη“Ώ!7j6ςžP› {) ΰeγβηΞP.U)<Ψu‘JJšA$Υ`œ2ΣΒς†JΑ‚λR’c³μ8/a¬ΠμΖ,ο‘Σ\KqBsοŜ€c3x.C]9©œβŽΝ³Ι’O㝍 }”TΔœEΨn8X«ρq–ƒ°ΔњC,,AάφšƒRNdΘY»Ÿ ΥKΘCπ₯Έ7ΩρS'Ξ‘ζ]<_‚₯IlWKV–ψ‡ZΛΓ΅F“”Zff H*|ώ­NRόΞο)‘Q±–)ΰwψ‚Š€―Ύθυ΅ŠλcUΌΏQΉ]ύY$ΖH–υιq„£σ˜sΓ•½*†“RΆEπκU+`Γΐο S Ηœu,lΥTK86ͺT@œ΄H{>ΎŽ4w,η,3λΉΈ±fυqx‘3HπκmκΥΪ‚αΦ:™Α·"4;1Β+Œ`l‹ιΎ½ΊvΆ}H<<˜ 7²ρ`Ηη”^»ΓY'Ζq+ΊTd$©Bo˜.• l‹©ΊΝΟhum&Μζؚί¨XΨnΨκξΆ‹ΝΊ­›C0:&ζαφ"sΫΧ…ρu§rΜ™1)uσˆε₯}³™ΪnΨ88‹XήγYEΠ0Η‹ΔΈ»[.~ίV”ΰμ}Mώ7νο R <‡ΑsͺE1½`f^σ’ΫΓ0₯ΜΏ››cαοŸ‘ΖώΗοζ΄L΅…ξ ?R’έ±-j―Ν:΅ή γa3Μϊου2=z­t47η@₯ ογ’EvΦΊΐ8:Πι'°m*κ”Βς}|2aΓ#ΩΔΏY·Q+Z™AΡh"q&’ρ+·|$u•Cα[Ο Η’ύθχ–°»α,[ό€Ώ *>‚—Σ*‰UπώE $mω γΊ0ωΗ’}νΙ£‰bfΩs8NΪ1Z½xa!ΐ9ε…±DΞγΘΉ­―—ŠV‹ύQŠ—φΘρ ώi1ηcc”β€Mόλ¦”†‘9f3ΔςŒ5”˜Σμκ΅ νώ}ΰ p-jψ±ΌΆ`Π^=i`”Ξ›όμ«% '¦ΘΠίο»©K%‘ӝŸbŽ+Μ v½¬ΎΥpΤφš ν=ΰ:zεifφŸχ/4@ι1ΌΉ#_π96κΆϊΆϋΉ₯˜ω ΐ|{Aέήt1 %λτS‘Bœ*|Ž]mφσό4$#Hεξ3―°·ξ°ZΩ‚k3c›}ΫYΜ΅ޏοQDP3†@S~„ VΊ₯”siTπ›ω+£€΄<‡γΥ[>\­―FDX$Βόέ@ΑΝqΧUΝN‚£σ˜½s`JΌ΄η£R3E‘ υD› 9/Φ²ΐ 6λ6k–c‚)Α§+Ζ)x·Ηu4‘¬ΩI˜”dˆd&JMξΤΏ―—ΙαΟ΅9ρ..|–Y;έxŒ3x.Ο8 GηΣρΫμ½jͺΛ/΄ΩN|ΣΥ8σOœ»knvŸ''Z  i³«uϊ³Z¨M0Δ'b]ΦJ6kΧ'~SΜ0”σdŒ4KL‚λΉLŒQQω~­Λ~Ηwρ‰ϋ9%–›ψ.tπŸπσ_Χ ηC«ΰ½Η6€Ώΰ` 7?ƈώӟ&υYΟ:$|SΜ‘7C9Oξx›5ΝNŒσ^2½Ρf>OκΉεZ‰΄ΡMsa¨)S]*»2zτŜРΪBˆ",-­EwΨ<’˜Fΐz£ΥυGΛšΉ/ζ}τ† :ƒΆ ψq\½‚0Α9­~¨%ΠΠϋΟ{ ΆΧ-η žΞΠ†k1Δ±ΒhBˆΙ’gηrΌvΧS3Ύνκύ„υ/^f7“TM$λ |εΡ„ Η)BˆξjkΨύΣA,‘€`ν~ I«.Υ¦,I‹BDj% ŒΡuqލ©ΠΜ ₯΄ϋ {σΩ$[­=ܟΜœ1GΨͺ;Ψj^Α`œβιqˆΣvŒrA°Wo“:žΕϊγ”96S @+"†βγE"ΰ7"’T±ύӘ΅ϋ žŸ†8ο&—ψ‘ZγDΑΆ©0SBͺAΑΚyν5΅’•  'ΟNtϊS‹—°ΉχŒζΕ$Δ•hη$»½έpζZ5“ΖZΟΊq&Ο}ρ;‹ΪtJͺΕΣ73Χ‘ηp­€ΙpoΫ£s+nHόϊΗ€5ΐτ1ˆ<‡ /ηg>έg£@β·½–WFQσ† ί€Ώ Bώρz±|ΘcUΌ·ΨIϋώ,)πστ8d?υ=֜±πκMsQ’pΨ )yDζ'ΏQ“8οэ7§7žR€Υ―έΈΓΕΛMD =ŒΦώi;F§Ÿ VΆ°Y3…€FΖi¦jG=Αεtύ޹§΄ΡR*2N₯¨—©YΘ‘pQ₯`e’AαΨ±8ς>ϊΖAš)§u4*g>»˜hθi„$%.D£²ψg˜ΊΞ½ί+ΩΩ‘6)ΑF‰sm€ϋΆ,ˆΘ­οωiHξ‰έ·7]T‹ς|š9O$ήx°ξ0ΕΫΟ'l–ϋ`l’ooΊp™i­3HYO[Κ€†½ξOpΗ#rYΓΙ,r9‡ΆK2+δή(ΕΫϋ^ήυΰ:ΔAως;€—φGήw±^΅Ρκ%hvγL‘k’ m‘|η`΄Ψψ U*i|Ι¬.b χΆzf…@A ”σΖ$ιΊl€zœZτDͺlEoύ'-j3ΤΛ6Άj6ςΎΘ`ΜέuB0tΙ₯9i=Ÿ)΄υgϊFϋόT3ζΧ*6vΦH€ ψ7₯‡οΧu!jζ―Σ˜D’…ιt);ν$xλΩŽΕ°§½N΅T«y―±hήi8Ψ¬ΣΈWA+ ')ή9˜\I₯’ΈΏλgΔq’pЌ¦ΙfΗMΌvΗGΡY»€ΥKπθ0˜ϋHz|βώiΩΏzΫ7‚JŒ%Ο"ΠξΕΈ»=%&fmˆ!ρ:ƒy>BΑ§–Η$”sπμΜ."JNΫqf+ε”˜˜s—‹y·1+π“¦Š &ΟOBžΕ8jE,MiunζΓοm{ΰœ™φ ΑΣγy~CVΫ?£dc$‡HΪ7η ‘œjΘλ0-³ΟTΫbΈ³ιf.³Χͺλ0lΥI£~–q/ΚΏςΑ~ή‹‘χI—!ης,ρ·"G#•λG‡’Xαφ¦ΛΜχw† n­;μξΆ«Šy΅°SB€ΩΦ΄P{Αξ:fΟO#|ζυrBh辘hTl΄Ι•Ÿ«‘I[užΓpΧCΑγπ\Ί ƒˆVΕ'-M€+Σ<Όc Ό‰c γ€€η§I“ψΤ΅τ°ωŽf7Α`”ΰΑoˆ—KΧ&$¦4Ώƒζ~5ŠkςV0άΰ°βπ<"§™mΏϊ»tŸ‘§E-?Ιdt j% ‡Ν˜%)poǁc/%΄ Ba€Ώ½όΥ± `UΌ›ΨπŸbΙδ/π…·Fμ—>?`7UνQ,1₯(x΄*1ΦΆf΄§7JPΜ ¬Wμ ’έ¬Ϋh”-τΗiΆΚφœιςMaXτdKΚ²Υράk.•"Νύ–σVζi_/[8ο%hvbŒ‚tNϊΦ¨ϊ¦ςMw³q5Μ\σ"B5ςΪπ₯T°0₯8ν,qΙvPtε‘UT(|2σ9h†œaoΣQ‹x/³ ?IλR„͈Ζ’½ωtBζ;3΅ŠQkά]sαΪSGΑ@°\„Q…ΠΗ][‡±Μ ‚^ήσΠ,ž“ά3gT€έέrαkbšAΆukδε=ΝΗ-"ϋUŠ·7<” BKΉ¦ŠJAΰ•[>aΞ<Ό7kvVΈ™#ΞA’%ΩctԊເ-PΞ `J1œΕ ˆ1R΄ϊ 󆍺»ŠΎPΆΝ˜Ε‘ΔL?ܜgσ?sόƒHͺ“VΜΎςhΒ†r!%Ή4΄σ`ήLΉλǐΪf§Kzt/ЉKq܎1šLΗJƒ˜DŠ ΧΓΝ£ƒ&)ΧJ΄ ΅ ‰Ό›ΰ΄CίaξO£λΏΜ΅h ο$UΩ”ΉžςG£lc­BςڜQ{,Œh_M›nφάέδjHhΤ`”.eMm‹Ο±Qs2)λΣvΜ’TαξΆƒ%ƒŒΐ€όwoν*L¬ €‹mPς1,Hώ†IόΩ7Fμ—ΏΠg‹n$©Ϋλ5RλΛyFΠ<ˆzΓύQŠ\‹V ΝοΧKVΖΞΟλdw•&ώΕH₯+a­μwc7IΤEΏ+26°ο’ΔπΊ^I5;dlHNœCϋΪc!9Qp–Ή—΅z φOCΤΛ$e\˜α# 'd ›χšh;ά+W[ ¨•¦f>F„h£n±ν†ύžΏ!w)ΠΎ‘D+ Η’u)kυ’μ}Φ‰ρτ8Ό4Γo`f٘b( 3rbn΄Λ ·6μhxwβρQΧaΈ΅α’ΰ libεΡyΗ¦•Όm1‘ΔσΣ§νˆ`λ ε<²t.ζ¨ΏYs²ΆΚY;ΒώY„(–‡{kΤzω–§Η!ΪύeMζ¬iυGΑζ9γώ‡‡ϋΪ2wfΏ­η_-Yp-–)Fމ#=Ύ%΄}σYΐOcμmΈΜ±Ϊύ„¦V|Ξ|—g«yƒ„‘B+6#φζ3j‹˜ΦτωjvγL"»QΆ2KΓη]Žυ‰υ˜€,%pΦ₯ΆΜHe?]΄Ρ‰;ν\Δ™ο0Δ<ƒ„N5»±.¨§2Ε³-—e„Β )Οl·Τ­ΎBžFk% žMHM’*΄‡DφΝ{wΆ\D±ΊQδβώψ‡η0$θoξ+&sλ;s‚θ9Ψ$xύι―?μwΦ2ͺ₯…FB$·ώHόύχr_”bU, ;ίί‡%Vώqͺπ›_±O}iΐΒ%φΐh΅EžΛQΞ[Ω*+{‰ώŒQ 1>!v­Dco­žη9―άςΡκ'huc ƒτ’ŸΈ‰T©]‘A‹7ήhΊ·nV¦ϋg!υΛΆ†m¬•-tG)šΊnœΣT-,l‹Α±˜&υI„±ζ%1κ%jCσ4>h\γ¨°ΩΆ_άOΗb¨ι΅½ašυ1Ξ"šάEΐβ'1Žš›1λ|΅2Ω ΟΎτGif†4‹|‘9ο…‘ΒαyˆbN V²³1Ι΅ ‘Λy‚ςΆ»ιΗΖΔΊή;d˜δ’a’>eŒIΒ·7œBύg]"“ήΩtι*ΫΩ= ΅έmgjI{p"ŒθυΎKΆ½ΓIŠ‚OΕ ”4ΦuΠ 1œHμ4άΪ WΚ—φ|Ό³?ΙψCλŽΦ|PŠ­η§!Ξ:q¦ =Ά!Ÿ£^|šͺΜ(k£F«XΟ‘{%Š€RيYͺ+~z»ƒ›uŽzΩΖq+F”ϊίFΥFM«eT¬mϋf'Ξ$‘/~LI0ͺœΘybNš{φ―•,¬Wlg¬©ΗΑ4ρΟ’|1 Ο΄»ζΒ‹•H€ ζ7£|‘l;ύg]Ϊ§D**F@ˆδRΣD:JyR "y₯’Ω#=½V‘λΫlKFplGx|"IhΑNJύžο/£^^¨hΪ@ΰ§–ήψp¬ €ε’ ΰίπG±dΟΝgϋυ/—Kώ˜:Φ  ίε(ΔωΥβ#ζγ‚Hβπœ¬q²AZ7η9Ψ¬Ωθ4;ΤB0€€Yζι1»Z?}&λ`œ’έOPhΕΩΖw9ΦΚjEZUEΊ(ΥΝ€ι=;6G*§ΚeG E£••’ΘP‹Ϋ›Šy ηڡΌt)Eβ%9O Mɞ׬ΪΪύƒQͺ|ΧΊ±θ™Κ˜y0Œ%ƁBg°/Ώ3ΖΑY”YΫ2 r»ŸΰΥ[~6NΕάΩrQ)Z8λDθ SέήΰxiˆsIͺπμ$ΐI;†ΰ ΅Ω:υtDΉ`eΘA«—ΰΓΙ<„OO()ξ¬9—Π‰‹ζD€³ 33œY€)ˆ$γyTE‚Ψη‚3άΫv3 Z³j?ΠNyζΨ4C˜+ž„Θyχζ=žΫώ(ΝdwwΦ 'ιɍιkύωIˆWoϋΘϋ―έφaYΣΦ1ϊ –χlŽ—oyzŒΦΑσΣπy•ZήΉQΆΰ{Δ«αœΝυί£XαΌG$Υ{Ϋd’TΡ²ΩW…TΐhœBΥlx.Y•ΦΝφΪŸrbβDανύɜΑμ#ƒιΟ¦–Α⇉Al]L— Κy – Ο™„rŽHlΪv‚q vά20>@“…!w#=ώΗ.l !•Τ²ΜΟμ8 "rΑH₯ΒYwžπϋθ0Δ?ωTύΨ”—‘– rφ_ΩςR;πŽU°8JώOώu,1η/°±f;aΎΛΜ<`E*‰QέΠ=AΟαsΎγW…!wclΦ¨ͺ6γAΎΓ5gΐΖh’f³I(³Β"•΄GσZ€HF!z™„1§NŒl·V!69/²ž,g …œΠδ§«‹"Χ¦mc‰ œ_EdmˆnŒώ(ΑΗξζPΚ“Ώ9Aέ6Φ*€[pή‹Ρ駈‰zΙ‚ΰ4f˜rZΒ]z’šΔ™JϊΎI(Ωp,Uw˜ςγσ˜Xκ f½τgηΌ©ε`ΑΡRͺέAΧ¦–ΞzΕB­da8¦F΅DhFšϋ§Q§RΑhώίήt±έp2A%Σs7‰ΘΚ86ΣΣ68Gvœ=‡g=ζΣN„Σ6IΧK€oŒcΖYΰΔ‡…έΙα°eΎCm§šMδ²™δl\Σ™q:ƒ)(άή dόΪ?+Ϊ’T‘3Hp|g‚Bw·hζόξ–‡w&™°ΡΌ()[‚eύβ0Vhχbœvb Ζ”ΜΖιvƒ Οf—zυA(³$ΖΩΝυ »τ½σD¬ ’8h"QΞΣC¨Z ₯>ΫbxyΧCL†<6šy™>n’¨e›gΣ‡M’«]«NωΥ’…q@«Ψj‘ψ­Ι lTl|ΟkyU―ώhkœ(Φξ'8nΕ8jΖ’ε<ίαŒ1Χ2 )ˆd&Ί4[ΰΛWΞh…ωπ §Ή™Υ_Ή0_΅ϊ1N΄Ζ‚QςcŒ$_ $›hΎ†ηπLΆy8‘σ„2λΓ΄ {vBΕ5Uκλοi†8Q(δh–$ds|Ψ$Ψu[ζ^&αύ„ ’θτ4» ϊγ„Vϋϊ˜H X60u7ίίο Ζ¦Πz]CλŸŠhYZƒγ¬γ€Ο‘6—B‘°–moa‘Šίl‘§8UΨ¬Qρ˜‘špΪκS o4™Ÿͺ‰Ε*ΗΌŽΜϋό$ΒO½π= Α? ΰ­₯wθ#«ΰκ°ό[ K_‹’ΏTψ―ŽΨ―}iΐΜ\ό«· ξ$§>†5 ŽCz΄ϊ1†yΙ B±*Ž?ΰ/π±ΐΥ/• Ά—,NhΤ¦?J1+Βρ„ οjΙBΑγz&z΅ύQŠV?Aw(1lKM„Ύ Z¬ϊΔ–¦τPςNκx˜&γώ(Ε`œβπχΠ0αΪSΘ°7œ·5½εv?-Φ+6‘ΤBJΞΎK¨L»—²qfo0κIΞ β˜pl–­p'‘ΔΓύal₯~kXήlΏR@­LΪπγ€Z:EΝφ/户°β°QQP΄PΧ2ȞΝg*ΖbRΖωΠs8ΆΔζ†ώχΑ8…cQ!QΤEΙNβΐx˜‘M3id’λež\«ΨHSJB#A½r#=Η’6B½dγ¬Km­Rž*sTC)ΊŸ‡hv§(V’Npo›Ό n鉂ώ(ΡD51—@Mρ8§xϋy0w4»qΦ»ί¨9˜„Τ~bŒ‘R^ΟΥλ}7Η`4‘‚€Υ1ΤDGΧaš•OB<azY8GqtSιnΤ((ΤKΤkŸ…ΉƒHκb–Š 3yρN‰cBVΩΏΦΘΛC]Y«XX―XYΏ>Šz#BzAς]>G`]šht*Μ½hξsύ»ΟΧI@ό‰v?Ζ`<ΏΐΉ¨δiΰ©ώOΣΕ„iSότoτ؏}²‚ΪβAΰG@#‚?ΰtω'Ψ‡?ΔώαΪ7zΎΩβ_π¨`Aς—Šζόυ Ν°ύS½ ―Ι„εΩIˆcν –Jϊ7ΗζΘ{DΠ"’Φt&7I‘AœA$/^ζ‘Y/Ρ*d4‘Y0ϋ€Š–αD’έ§^g₯hirΣɌŠƒrή#^c›δΌQ³!8­oͺΪ-Α°½ζΒ΅:Γέͺ2ψ_ˌKdBΑΰŒ!‘D€’ŠŽΛFΝA*φΟBα准ΐν yŸ£?NρΖΣIf9Μ9ƒ-HΝ­˜°5©/J¦ϋ(₯Κΰι½u5R!ƒα₯$”’έ'H³R΄ΘO (ΥfϊΉ­–lς;π)ωœ…Ψ? 3’aKδ<BŽƒsκ₯¦’ΆΥ΅yΦΒihq%˜V$―€ξ0%5@WdΪ³Η XΨ DJ9o:†ΕΩΌ ―” ­>ι:˜UwΑ§Φ‹£‘ŒF…8žΛ‘ΐ²σJ€D!¦β0Ζ°ΖxI˜ήpΑ¨•iŸ„Ώ2ξ $χμκA_γ„—"η™v½½κ`oƒΞ™9Nζ\JE*„‡MR&4χD"ιxUŠ\‡]šB0«]K0TuQA&VTΐ γ@βΈΡψd—Ζs7Bo”^Y@+@I…η½$› 0ΙΦΥΣ{*‹ZuΪΈa8Iqڊρτ$ΔI‹dΝ €g3lΤHJ»Ω],Μ€μ˜ Η)N;ɜ‹€ΠF?›5‡ˆ©kξάŸΤ-œΗG!Ξ»1‚π2_αβnT4Κ–Vj€vΩ2 Ζ€Ξ Ε8μφ–›Mm,ˆ—AΣ\Ώ \ζ …X!σρ;ό e©“ΏR€πχ+_ΈzΞΏέO°½&³ρŸ§'!‘ίϊ <½κ­ι$gΰπυͺƒQ@ qcήQΞ pΞ.­HŠ$’ηςZcύΊwe¨ΐ8Νd„›έiЬͺŸ…₯{Γt*Ε sΣίΌMœ3X"#ΨΝ}7@Iα€ER§χwς±*¦ρ= ˜θ$€΄ύισv<Ο@πio˜Β―Ρ*ψuζ™U—[τ žgΊι λ9δ°^΅iBbFΰ…1dύ|cπΖΓ1ι4*dΥlΈ“0E’}ςπ ΐ+{* ΫZg?IςŸYm|Σ'?mαrαtpwΫΛ oŒ$²‰ ’–ί&ΐ­ ŽΕ³Ά„9GIͺΐυμY;ΒΣ“pŽ―2Ϋn[ΣJΝ1Ύ&ΑωlΑκ%;³oΞΉ‚Šgύύ‘„-ς>G”Θ©‹!~ Χτ^\¦νf2e£l‘^²QΦ-.χ+Œ¨­Ρ" R‘τEfHΆ¬r Am€:ύx© ©l_τϋe ηέœƒ½΄ηΒ ‹ΐŸΠ‘ΌΛΉ¦}ˆcUPάiI ’?cΐΓύ€ύάgϋ7jϋ“2 τδ=RΑBS+œΡμΑΌέaŠή(Ε‘ΝPΚQ₯].ˆLΣ±^ήσΡS_Ύ?JDςΚb@Ν$ZΟ‘δ±VSŠŒB˜ώ.₯€Q(1 "œ΄#δq/‡q@θ€!96Οtς[="Ά]e ‰FR<‡X­d!NH]JΧ!γ›–ΎUΩθ‘΅»NϊψΓIŠγ©Ζ‰Bw’7Lq‡»¨,=£Ÿ@pU²mŽœG«0³ν 4οώ±;9ςˆ$ςΎΘŒiͺ23Χ{.θ]|½Qτ» $™δ0¦6HΣ9g˜BΏ³Εƒ1}š]ύ›/4Π1clnbζμΥ΄έ {CηάΦΧ—₯Εc RbHxΓ¦…‚Β큗χ<ŒυΚ‘Ο  fΊ";&3ϋbΞ₯T4q¦~ΎR ·6ά¬υJ…'GΤ.P Η(z.ΗνM­^‚œ†ι=‡¬lΝρ¦ςΌ†Θ—θ‚Θuˆ Pȏδ’&cΐx"3‚_)/p¦EžŒiN9OƈΗΔ$$δ°έ§‘AΣV€ή₯οΝE~@¦π1z ο9ΣΒΚϋδ±Q-Z΄ Β$Mϊ#]€ ¦ϋ?»θ g)w—π1a –Οƒ1-hδH¨ιυTΜqTKšthσ¬ύ§€­πφ~ΐΟ]όΰw”½Έ(ψwψ§‹·ψΓυ ΰίΖΏŒ‘~όOύF]'r1 ά\ΚSOΪw8F7τΊ œ> $F“M₯Z‘.ΛΉͺ0’€ΫΡI7ˆΘ΄%I\‡ΑwΊƒ›QY9`Λέ\Ψ&€^ΣΠT@½lƒ1†V?c±lξ7ηr¬UmDή|*εkΎγͺz$οMm}'W(šπuΕͺ{ΝεΌ@Y?D]›£ΰ±μ;gΈ³εa½JΜXv£l£\°Jΰ°Ν}cΐfΝΞϊώΝnŒw‚υ===`މ!άΩ.CΞΚs O†ΝΊsi_fΓΘΌ†‘Β8€"€7J3βάΕσeHŠΣƒdώq:+žύσ₯+ZMί€fλόw±μ θQW=9 $ژ-¨x λ†ΞΰzLRλΈΣ.•lͺ M)'.£Ά6MN;1z#*¦7kT€– ­ΓHJ@ΟΟ"XM5lΥšΆ8 3{^#₯­@‘Yq›ϋΗΧ―…Γf4msF&L“€4Bΐ.ζ8J—σΔ9)εh΄7ηςLQ2•ΣΥm”βνύI†πΝΆfy4œA“;o^q3θkENyY/”‹Vvο™kK)ΊΏΞ»4-2;|ρϊ-δ¦ͺˆγ`94έ°σ>Χμy]€‹“΅" ωξ΄ 3;!σθ ΐy/&iηNΜ,ΑπίVP “$ΘΥυ―ψcώΩR!ŒrΐόYRԍwc@o˜²_ψά€u“…Υ· γ'Ύ­WςΥ’…Q3Zψ>³1FΪŠF_’T‘¦ΗΕf“ι»Ζ”μ \šs—° 2n‚y˜ί„r>…­›!F9U·+ΠΕ¬Μ ΑΆhΥέ₯™?€1ΚA,υ(Ύά²PŠΜF|—#Υc~½QŠώ8Υw<σ’/ζDF*+ψEŸŽΤώΆΕΐ„Ϊ]―\™VΎM³C”βιq˜=t ܐΐš8γΫ¬¬ΣυcVυ©€Dj~m 3֚Qr}{ηβY1IΨX.Ϋ‚ώlΘ—ΆEθ‘ω±SζagΓI’§Šg½(‘YΑ΄½ν©”œOΩI Dq‚ΐξCΨ³u±θhΗG€Pœ’N$Χ]z¦]Ρ$8:§QΏΝ:1Φ_Ήνγΰ,Bo”BπL U –VΈ3ζBζx2Π*Ώ£Ρ΄α„Šθ΅Š—φ|s€fy‘/ΖD.ΜϋN6a„—Lςςž!pyŸl”ge¦Reg@|£ιΖΧkp˜{Fp-Ω{ӊ[G©―έz‰ žr~†;1³- Tˆ‡1y.λδ«σ;#φD„H-₯Β¨ufŒƒf ͺ‹iΧOjΓ- €Šΐވ€‚Ν„EwHcΤζ8$©Β―yΐ<‡α»_Λ«›#| ΐ $σΎΏΔΦθβ£\όK ‘ „~hž9Κ€D ·θzgŒVσƒQš„΄βεzeŒϊˆq’2=€ύ3%<ςυ*:ιf+pέΫ(– £€ζq―#λΕΙτα΅θ&6ύG“dγ„4έ»Γ– χr^d΅vֈΔ%‰¦}œΠΜ²2G²‹›ΐ9P+’¦L,}S„Dr}£_vSΓάvlςhWϊΨΊ‰˜€fzΏ¦*₯B£b!Mι­WˆPˆb‰F…4φΛ…Λ°Ύ9F©€ίξ[¦J³TΜ©LO`0&DΕΈΖu)λj·E£fi ž R˜„‰.XζΏ]hξE­8-lM1LW„΅]OΔi™J2»6ΟΞ£)†Μu,2Ο³dζ4•6N₯šC‚h‚§7€ΔΌ]wΠΉ 4¨‘Cλ5;s6lυδύ©ƒ§έ §mΊ£]­ΗΕ©€s³^΅3!©qx5oΗLmτsιά͐; Sp†;,έ™Mϊ=μRl7l<‘ΦYψΰ Eέ BΉ΄ΨΑTπF4’j4A%‡Επ zΓ$ΫΞJΡΒzΥ1+ώK:a¬π+_°bNΰΥ;ή2Ώδυςgτ–Ϊ‰Q|T €ΉϋΥ±Xβ—=:Ρι§lwέAήηΩΕxo6”\Κj% E_ ΰSεΊPπTxŒ‚žCcefˆϊۚ<¨‹rAZ”D)rϋψ]*zš(gŠŠY²ž‘&₯Υ#nδΖ’ ζ8ΐTΕ°?JqΪ‰ρmχr(h?©(Ρ{ƒοΩ1•δHgiύq£,fVδ¦NΚ„v€lτiξX1".ε=κύ6#΄ϊ‰†J[pάΪt±Y£β¨?J3vΖ΄Ϊ δ € ˜‚5 ˜gαX»3$1¦pHR•­πz£ι1ΏhLGΡ{ZyGΉ(PΚ UΞ[Ψ¨Y$].e[L™D7sͺk ¬ ΏWjp #w¬8gpfO°ŽrAΠD†!-@!M‘τ •OEf¨Τi;Ζp"ΩlkΓ\ƒζšθkΩwitτε IΡΐޞ`—φΙ¬ΊM‘DIβlh¬;Hρδ8Θ83΄Κ'a¦;[.Ωh`œ uIOblΥm<9³{ΔT(&Ί8ίYs°έ š)L£%Σ㙣@βg“KϋtŸKmj₯'yε… 2•ρ. jc#E^”E9#ipy1ιλΔΐοS!#‰d‰Šαƒ(Ec|‹ϊΊ/Ί9ΝώΟϋΏγΓΧδRšHι€ί$bhδΌ7ͺ6,Aζ^έareα=šHόμg{Μw9no97¦3ς―‚ψ@Όpη?DρQ,ψ« ΫΘQ’Ψηή‘ΩM™1"1³ζαΦ¦θL"™9λΝ]”Œ.Φ ’™IΖ2Β>€fΣlΟθΒzσϊΑztΑs9Άj66κNΦσ«h΄)M –ŽΣ¬ ˜DS8ή¬6Ÿ°»Q—`Άgš©sΤ"‰^³"/ψ"›)vμiΫͺ;¨kaΡ„ϊφ£‰ΜVT†S!ΥόσΡΜwsœθXdβΘΉ εΌΠ" ήޟdϋRπΙ}Ξ΅Rτ5$™s§3ΟWν£«Νu] ε]ls˜ΔKΈŸζ}W4–ͺ)Ωη<Žœ+ΰ:lΊZ7οΏpΘ—Rx{1K ΌϊχΣλQ'εΨΤχ6¦&’©I(Ω$”ŠŠ‚„υ† NZ1λI93Šϊ#*OZτyΆElvΗΦ’A%+32ΊN5―7€© Ζ€»ΎF€ΦϋgΔΪovcδ<ž$΄₯± κRt‡)ž‚ζ9|WΓϋ‚³ ’WŠΠ­P_ζ§^ΆτυΕaq Έπ|` -™r|:Wy°ι4Mz’•Χž₯ά=19S6»SιρKˆ.<—λΙ€›Η=Ν16Ό›TΈζu―¨ΈυŽb^`­bgdΓ\F”%΄³7L³‰ž«όR ‘Rjζ:Γ0Ζ€N?ΕOΊΗώΐo―`«a/*€? ΰmεϋwχ|σΗG­¨ƒVώί‡%Ζc?χζΏό…c xyΟG½le³ΖΎ3…ά#­°ΦјΠ8œ‡ά­ ΣΠ­!-ύQšYήζ<0ΊΊκtΑ {‘λUŠ1œΆ# Χ J:GA μ©kͺRfVf…u]οΟΐ―ΧέTš5σγ‘NˆQL79ηΘμRoo’’˜]›ΓwΝΟ'ƍIŒ*ΓXb³F‚3qͺpŠζήc[4―Ÿσ8ˆΗ‚Θ|—Άξ΅I«ΰ°IςΌ_ρΫβΚύ—™ίy/ΙͺWLƒ (ΪχiZ‘^²ΤΞΊ£κ%‹ΥΚ$‘λΨ,λWΞβf•ΨΎ•βͺνf Θϋ\ε}2’Ί·γ*βeΠTΓy—Z$‡ΝˆΡ(!a, ςg͟΄"Tτg1'²–Η,΅^%ρ$#³sy&cl[€Œ₯0špήγΨ]s29c#aΧNΆΕ°·‰œ˜z\‘ΜΪF“PβνύIf«cΘ\“%ŸKF`Ν[w›gž 9]π— „~Ϊ6ΛZ¨¦%2;9]@Ιf·“3Bml‹T[½δf›tF£Ÿ?χΩ>ϋƒ?TA)£d°PπWψ™δΖψ&ŒR`ψ_ψCXΔψπΥΗφ©/ ™IΤΗ­ε‚€ΰ §AD}ΔΌG+Ε††΅‰KŽe³€·V?Φ–΅d"sή[΅©šΓzݞη L¨κžνθ™VŒ•ZΙΔ΅uWS^c@έ7γ ΕΠOΘο’`β >BΛK* ΚyC’έ„ *―琎@1g οZ/£ΰM˜(C_LΊzc”V‹ζ”ε’έ2›\ŒΟ`¬»L%χdze[΄F•ςJjQQΉι ω,o7CνΌ8oΣΧχ  q"%‚σ„ΕNžηέέΏρϋε―”α9ό΄$`ΤΎ‡O‰{ΰ§)ψKώ%ϊώܟnφχΎΣcY$lw@Υk½L*]χφμEj6«ηοŽΕΙΚ·` Iόˆfœ€”EmΎZΙ$…Ί3DΡBC²’&8Άθ£,>ςΎΆ%ύ½#?€Ήši„}­ΪjžC›h9sξΚΩp0–T:’π¦lTηι ¨M9”η2λΑΞIΖ@š¨+ρμ8•ΥεUGw+Θτ†ΪŸŠ‡n›†ή<‹αͺC˜±©ΦJ$h–3Κ°MJ NŠΜ„1LzR8&KΡRU τ l4l±Ω°±ή°υS(Φ„ϊޞGλώUŠ“κ„9‡ ͺΚ-€·rdΰӏ±sbϋ0bϋ-²#ξKμ€yΒ±IY.ηL|rΞ„/ž¬dn"A †dP@Ξ΄»Γ±όώWkΆ––VΥ΄Š£n„Υš…BΞΐjΝBwO}ΏqJ Ωj‘p““‘ϋˆ΄ HΖϊΪΊSv Τ}˜Aκ:ωY`χ†‰!(€ΗΙ&Θ›Δΰ“nέiί•iN„»β”Šςi[\ΟσSA#G5ΣχŽΥΊ08κD$Kσ‚ω―τRΞͺ9ΐπγ;cδ=?…"38[tu€Ο‚’€Ώ ’ ~­γΣ’|ΐ@§lώ­nŒΏχ‡=Fζ*“S―© ^+™ΪY­?"AΧ"KE>μžΝ‘w .Χr΅@΅DΩyoOy˜}C+½ώz™ΐ`Κ†tQ¨ͺ›AΆκψ΄\―Β(-οjΡΔ›—=˜CD¦24€6^­djΐ–B (ζM‰ϊΙ Ϊ™τ"`΄ΐ&s %iΖD£q2₯n¦fy—ΪπΝN„»»ž5;6G­h`½α€3`ΰS§ΕΰLό²όfε[`‹JšGχ#it”θQCvqU¬λp,WM\ZqΔ₯+5yΟ†τ?P?{)φ‹ΘΔΙkVΘqQΜΩΈΌb#J„θ ΆΧŠp?dΫ‡‘t$Š“μΫ"©XεO?‹b(„ΐa;’Νδ“`[΄ξ·Bj›ƒ’η·\9—ccΩΑνν±NόΒHΰ°IAεΌ©…Τ}ιΣ½i[dF‘†bπ\ͺπσ²εfX[²υ>ž¦΄ΩJD‹—`€xpπ¨ ±Ί~s±-9FΘ‚³ί…Β5‘9Σl !ˆS/™:Ρ’y> έ~ŒΎ€V ܺ䑍χ8ž‘6κό-•ΙΪ»3 `ΰY_ y ?zΰ³[—\qiΕ^t}Τ?ύψŸ8[₯φŠΖ§!Έ 2ψΩΔ)›”²ϊzlχ(z„λΟδΝΧ%¨ m›«fΧi*0 „τ›47½œ§„Aqo¨:ΎuΩƒ/«λΎ¬0:z ]/θI©|ηπΓΕγƒTLΔ}ˆ«ΛœXύ²νx…x° ?NsdΫΡγ€Hτ,<96Η­-—Έϋ’Ϊ§Ϊ’΄­ΰ”M΄  'n?“tΗYj`Υ-4qBŠ€ŠκΙΒZέάοψϊ 8'y››,“!Ι8e€¨KSγΔ—Λ$ψ©?H°Ϋ ΡVίλ‰v0δN·Z³peΝWΦ4*\‡fψΰΥ Ύγ_³ΘŽH ΞP+›’^6ρφUO Ζ)kΆ#άΩ po?`­NŒ ’ΞΥφaˆV7ΖR…0yט²άUτ;Eλ;lGژιϊ†‹’q§cο(Δ֊ƒεЉξΐΒΑρ,ήlΗX©’0ΠjΝg€ΟP›%c]²jΑΆ8L Ψ;Yέ ©PϋŠΥ€$Ώ]•ξjTpήP€D%ς™km›L―₯<5Ά•Α)° ΅wDΐΙQ Ц“f₯Έ(@Έ¦Ytίyί}EŽx’”L›²IΟYΒ0²}±œΛQ/›§u¨[ό!€πάψ%ŽΧ=Θƒ²Έ―β”™œφ;?賏ϊso(hJΊRήD₯` Ω™lΖ± jέϋ!ρΏMƒPΆε<ω—+M_ZZνo8¦d`8N΅¨Ι`L’Ώ9—£›ƒΞ„™ŒX0 ͺˆζIρ‚AsΌ™l‹‘@χ–KΞ±kQ‹UΩΡ‚ΖH@΅0ν)_ωTn˜λKΆFR[]Hξ:΅»Γρ ζ“i24*TY΄‡έv ‰ομQ' °ͺϊ„ j>N ΛUKoώͺ"Œξ0Αa;BGΉfPώ€°R³pmέWΦ D€M_Β.ŠόηΩλ]ΜqQΚ9ΈΊξ`δ§ΨoQ§θΞnΐ”]υΓ2"/ ₯ό<¨4*–«–ƍPWμζ–«Ο0¦šc“λ gdϋmJΐ ΅ͺί±s„Τ—TMƒOΐoΩ±UœŒc‘•3+ECΫρ~τΐŸpλ3‰¨Β$Ω%g΅Π{-1g©[½DœόΌ4β²ΜιΆΎŠ(&;κv?FN³^€ιŽDΑ3`›”Μwρ©ε* NζY'6Uwx6VuœΣ:R+»θΞNΘ\›£γ§1Šώg NΐοŸ}9γuOώE§€ώRόΡ#|£ΡΒƒΡˆ Βjd=—«6ŽϋΙ©”8…Ξ'„>Γ•UqJU­· ’ͺ•σVεΖ4 RŒΖ‰τω¦½θsψtˆΙLΡ’ξs)3˜lb4ΰnΊC „”˜”δ9vG p%HΙΆ°€8*Κy=ͺ$ƒΨdF£xĎE~jCŽbBŽλΧ΅ϋΤ…›tPhΡ6 Z4"QžξJUMh”Ι»ΐ@(!ηΎ#ι]ίξΗdd’Iεu«—M\]wpsΛkKΆήτ?Mΐ½—=²ίCήγβΖ¦ƒkΎ<¦ΐΗ|vo?@w@4ΩΓv„œkh‰ήΌKώ $5ύ„Τ€oΆ{Eή76=ύwYLηL›9)΄{’ „© JΫ`θ Θ[C Κ+γŠp4Nΐ0f'νJΈΚ2,ƒa|ΚFJI½dφdπZ`ΚbZοΒ’Ζc–Ι΄ή΅υF>Uωέa’Ψ,K#D’,ρ)P¦!mΌGAzζM<Ÿ#|U*o1oΛR-“kQ&E;VQ#?ΕΗφζžΝυORPχψ Ψyͺ7ξK―sπKώ5œ’τΗπαCŸύΞϊμ,v–ALsC%[ΚhχΟ†θ‚ΖQbΛ… F³ιM΄£γ)ΡJή@%c œ j›o-;θ cψr3M3ι:HΞ­-SrνΗιά…BdΪ~σdŽΥB§ͺ0$Γ :¬νY&΅UΧκΆVΣzω&u W=}$€BΏWκs½s’<­Hδ60αSς@‹Φ,‡:hΝυTέAL†?²½z,PΜql­8ΈuΙ—Χls†PV¨›ώΛ';o_qρΖ%Wtϊ1nομ£>Ϋm†”Œ΄θ~–ΘxKαMτρδ―L²^βX€36%[¬ζΫ*ΑUΗhχcu"ψ!8₯©ΐ•5Λše·3έ&υfJϊΫY@ωU ƒaL0.σ0!˜ƒeM΄r‰’Y’ ΘΏ!&}₯Ψ™js/Bϋ“1™:—³΄γ-“M΅ΟJfŒT-“ΑRw'γψ¬½Ά%½Τ†Ÿw'ΞϊΎτήέaŒίI°²?ω₯LγTPΰ7όUιέ­/GΌ ΐ56€Uœ2χ?8ŽΩίnŸ ΗgΛJ(ΈV§–|£JΘί³Œβ”4πpœhkf;ΒpLHΩΓv€­qU[π&²’΅ώ¬9HRaD”ΓQ`0’jB-$ΡJΉE 0έαœ-<υο -¬~š$o„O „Jΰ§χFˆ:oΧ!ZPΞ₯ŠŸs† JυΘΐδ$ϊΒΝι\ΕΝΈž:sΩΏd ?L±Σ qpιΕ'۞4ΈV†·.»XšΪ[|–›ΪEΌό‘’.7‘zΩŸΉ‘ΓN3Δχ}άή ΠιΗ̏φ[d4΄^·Ρ¨Zp¬Gmt#ι&8ςSl­Ψh”-€Ψ> q$]>-“αΝ˞φΆhvγ)^}³£^²΄QR+³‘AR~Γ(…+υ:NR~ώ%Mω+ΨΣ‰΄–@–•=@ πεUG»wͺ.„z\²χΆ¦Ψmψq$šN¬Ž­ΊoŽΤΝω§SΙ“ΓΠl΅Vže­ul=6Z½˜: d†„΄&]΅FͺσLO*Kςξ ΑF @ο#κd|ινόif© ΐ?ΰGώ½ηqο>Οx€<ρœ2χ#Α~οGΆαχ¨©πC² ½Όκ V"-…¨?-βX = MλRŽŒDΪ˜FθGρ^ΜΈ²JB&iJzθ9—oΤ"Sτ?ε―n=‡‚l§ΰωb=3ΓάNrs#ΊΠ£—–a"η«’q"€R.,•I]-M‰§ΫΔΪZ–q]©MψAŠ=靠ΜG–«LƒΔ@v’!Υ,T‹ζ‰s₯λq܏±έ 1UΉ₯πl2)zϋͺ'oΈ(ζ9ž/6ύΧ*&žχL\ί Όΐq/Ζ‡χ}|pίgϋΗFγwv}4;Φ—lΤJ¦6σ $tsΩΑƒ’ζ]φ7lτΗ4ήSΒ77=”‹&–+v[‘~œzΓ£ AΑ3°TΆΠξΗS•zMάΛy»<|P'q*ΰ1 θqtεζηHVAή#|ƒ#6U€’f…5ω΄N Ζ Φκ|ϊ)vŽΒωΌ|½Ρͺΰ΄Pšκ™=k‘•  R0ΰΉ€6„$ψ₯‹"9nΜJ/+Κ‘R¬ l-;HRq σ@ Ώϋƒ>[*›Έ±ιˆΟ»ΰψ7όΐ·^Μ]όlβuLώYΡΟ©s‡!’”€j œž G«5ŽΝΠ¨ςχ¬ΡιLj6qΗσ&†γpjΣΝΎœD#BΨ7*Δco ‡ΘΉ r†©yρ–1e±*@-τΌΗᇀΊ6ς ΖK’iC5/œ•*Afeς¦¬π ‡Nd{3@Ιͺ4φ‘•Pہd?”rr΅Q;Z¦ψϊΊ ƒ“ΈͺTVkΙΞf]“<ς^+Dw#I'κ…PΘq\[wπήυœΨ\±αZ“j"^οP }½lβkοΔgnζpo/ΐnΩ}‰ŒΗδX±4œ3ίΉ΅εΒ—Ι―Dw½Ύξβφ1M”‘P΅db­N›όXJε!α~ I{J@iJ€”$Χ$ϋ%2Τr-²ψ6₯τp£b‘Z"g=S N2 SrδJ8”Ζ [ϊΊ«·`ύs₯•1ΉYžž(L±™‚9:J°I·τ₯Ιg»wΕΡΎϊ|a$΄7§'΄]ΗbΈΆN~韜”`ŒSόΖυX)_E£jž&tdO8|χΧ-ψY#.Niύ7Ϋ1v›1«•LxvCŸζCŸ6HΆQ??υzPφΫκQ΅°T6±ίβΊE΅(e0N4Θθΰ8\Xq’ό,eξ(’hM§Ÿΰ¨ΓΰΤζS:β ΤδΪ$ˆΒύό²|ΘS1™³ϋAͺd%πγX ŽΝH\»ΐAs”•ΡΠ,ΙP$²M²ξΟ0 ±%θ Ά\˜υZηΐΪ%U#?ΕΑq$΅ΦIld₯>Α¬Τ,\qœIΫOΞc;ύΝ™h`Ÿ@U‹n]φΔ;Χ<¬ΤLaΙJζ’Ϊτ…Zμσο^σpsΛΕƒƒ?ϊdΔh<@λΑN“όͺEbώ8CޘŒΘͺΪΐΫW=ψ!α”ψVή#£‘v?ΦλIšBnP› ύqSΪ9Ϋ&ιnYiΏuΙ#ƒΦ7ΘβU ƒ_ˆIή›T39$¬"ΣύγŒΖn8u6ΟΰΪLΥN³ .[^št‡ΙTGCmiwΙΡ’LΓΈφXΰ €TYI¦T_nψ~”)bδηb X©Ω:Ϊk…ˆgΰ»#Ρo~―ΟώΤΟVΰΪμ4fΐ/ψΧAέ€³W|/qΌN ΐHΛy§lώϋ­ˆ}χƒ³L.5ΏiζΎ\±§δ>ςιžGmμ(™˜ύ(4y³άζ¨—LŒ›α™N4N:}Βrό‘1ΐ¬P –΅:ΝΖ\‡c0&;Ν4&}E•S`½Λ«.ΦκρŠ1\‡Γ6 aμ˜ ΤΊΧέA|ΩrΑDš a+cκ2P @‘ύΥλR! RθnD"‘ή@ώRΚ›Θ9IBΖ>jƒgŒ*…zΙΤέƒjΡD£Β4ΈG΅ϋ …΄τEwϊ1ŽΊ€ϋ>KΦΛ&ήΉζ‰w―y’^6§Ζρι•άZ&77\Y³±ΫŒπ£Ϋc|ψ`ΜΘφ8ΔΑ1΄GD­τθ²ιXύθ±KWΨ'c₯faΦ4Π†D^Ζ 'Iβšj§τ1ŒDRό‹$Ί©νΎR#œMΜx28‡Άίηtυy}ή3΄Sι©Άζ2 ²MΪΌ‡γDzVΏ„+ΰSΜ΅G±ΐQ7"9ΆΠΊ"™D&{Ξͺ{@ζ_ΙBχUΖ€\5ρ³Ÿ).JhHEφŸπΩΉnΌ—$^—ΐπ―‚l~ηΟύ0§μ7ΎΣc·w¬Τ,άΨpΑ9Y{&©€mrδ=†‚G?EKJνήH sτΗd­Ή\΅°T±pΠŽΞ†pUl€˜Μ²»¦’PE‹ mˆhέό¬¨•:N ΤBΊΏGA‚ œ A+©+n™I\’čš₯eΛ_!]k%ϋ­Œ4›½§«1ΐpœ’Z$«ήƒγΕ“n»…),ιS~VA΅ΖΘ¨DIRΰύ šο^Λ!οq΄Ί1Z]’6U'ŠJhf¨v–Ihΰœόœ¦€oMΞ°Z›|DζgLCώ;›~ )U©@*Ν³’?Jπΰ ΠHκ¬pO΅hΰ½9ρήυ‹"?TΎή°Δj½ŒΟήΜ‰ο}4b?½7fΓ1Iπv‡1Ά–T ζ΄Ί #9νϋϋ–ΚmΈΰŒ lΆCΊχΉ΄).Δ”Ή?F ω ¬T-άάςΘQ:εi Þ4%³ œΛ +<N8ζœT€^Ό°-ΧGŽ7ΖA*&hωmΟζpl¦’ΆΕυHC L|6ΖAͺgψ# γŠ…Υš88ꞝ5 @δYύ+<ΖY(Ϊ#?Εί£>«K•ΙS’€Ο€Ζ]γηqO>«x€› Ε¦2Niύδξ˜}ο£S·8Ψi†(ηMx6GΉ`βΏV7ΦΊΧΚ4GΝ¨l‹fVEwšΙL/­8ΘΉ|ιFBRi¦uς(γν b­ώεΪ§cβDΐŠ9J8fι›g#m:eΟ)ί~*+QΩ·Ί&c‰ΌgŒΥ0 š)n4l]™pN3<ΕΩW:α*YINp„•‘O*€α(ΡΧ†1]1 †\<ͺŠΉi€Ÿ2Ωi†g䃉Γoΰkžψά9±T™΄ϊ/6ώ‹x’“D+υ2ήΉζ‰?ϊ`Θ>ΩφΡξ%ŽΗXZX­YΤ—7γjδ¦›έALΒ9e GX‹Zν‡(ζ=rΏτ8Ž€’¨δύFB>O€ ˜­ξc©J˜—έΌY‘HόŽ’ΝΝώ€ͺπ¨ΖΕΤ3# OVο χΰΪΤ=Μ»$kl™σΑˆ#Ÿ6zΕ< Κ£˜²N# 1ΉuύAzfv•|ΉΆ‚Žbύγπ‘5hξkΩΦχϋμWΏ"ρ n ΠόΫώΟOύΖ{Žρͺ'Θβχ³8τΗ~λϋ}ζΣΎΨύa‚ΓN„M)ͺζM©δ΅|BφrNκpC »ΌDιͺωd8Ά–m­6§Τό‚0Υ”Έ0"πLœˆΙΐ&Υ»‘Ÿ.(`έRΕΤ­΄pž1›hόŸ&rςZeͺ$€Ή›Π•vލ΅–νrΤK¦VνΊ»L $™Γ­KΚyNϊπΑ˜€†B`sΩΑR™IΐN„8ΨXrP›?c”ό΄ϋ1v"τ—ŠΞΗq벋/Ύ•kuK¨Šμb㿈§ˆ&ΩΨhXΈ»ΰ;?²{{!Ά›€ fύyοVͺΔ PΙΏ#-U‹ϋΈc •5Wk6:ύD'Γj“tmƒν΅¦ι€QLΗ(xd™ν@dΟYΘ‡δ€VΆ§ž#εaaphq EAΞKλπlΧq­nO‰†)°°₯;d›•’ ψπΑƒQ2ΑέΜ˜ί δ<%Ή†΄zΡDω΄οTύ7*Tύ·zρ#ςα§>Όο³7Ά|ρΞ5o‘κ—’ώλ ™ΰο=ΣπΖ«žόyL€~g„‚ύζχϊ¬Ω~΄”‚œΏκ%rΫ[_²1iή­h€mΗ4λŽ•w \]wΰΩ‰κœΑuH°˜< jζ§’T*EΗύX;Ο=’™φιΣ;GΞΏΙiƒ₯™£β/ŠET8Ξe%!KΘ;`ϊ΅…ᔉ‰R:S#’œtElv"νhXΞX«[ΊbX­[π‡* ΠΈ₯ӏqp‘3œ ϋU[ρϊšŸy§ ¬ΩB1.6ώ‹x‘='n]rqiΥήχρ‡?π½V„‡‡$3\Ξ›X­[¨LXΖ΄#%±rŒκJκk₯@γΓ–JR ¬•L –3&cΨ*³―ψ /BoξΚS±²c½‚Η‰ϊΛ¨γΆΎdK&—#?.ΉσZ[v CiΊΖ©φ. d#„ΐ­- †~"½IN©Ζε:θ˜ A,Πξ'g΅ ΠΥΞ!Λΰ}™4=V’(·{)λτQ)§ƒπ-½3ΎΕK―rp DωΛcAυ/|χΓ!>|0ΫδGQϊφ#\‘Β>Υ‚‰£ξμΩΡtu,»Aͺ%d“Tΰ“mͺn žΗfSnzΆΕΰΨΖT‹LΗΙ{9Œ}z€B) ’ΠΆ‘Ϋ)Ώήο“Ω8Π"€$_šΥη_©3:ε )ΠδίεXŠβI§…K₯=Σ`*4EΡ#ΚΟj€BΎGΡ# ƒT& {­ι†˜½φ+5 _z+/ήΊκ"ηp‘^lόρœ"€k1|榇+kΆψώG#|ο£λ4;:Β¬7μG€΅ ²εaM©o^Ϋp±\΅F4:SΆΔ–Ι°V§ΆΆ’μVxšΛs¬Τ,-lɍž3ι΅H]‰’J ƒcR=ΌI‘ |9Θά‹F9—:AŒ»»Β8EŸ(XδηU’D‰γΣΒ’8Ζ€h’ŸœiσΟV³³Ž²kFΞ%±§8Έ»²·―Ί°­S₯‚4€Ώΰί}ΪχΩσˆW5p@ΪΜoγ”Φƒƒ}ϋ‡μ4$θαq„₯²‰bΞΐΪ’ξ09SϋI΅Οš+5ʞ=Ηΐƒƒ@ϋ‚«ΌΙ_ίЈ|KfΫΟ@Ρ›‰$ §BsŒ…:“―—L™g<λΕδLκZδ1‘π=ρœ>ςη4CuT‘ͺmΧαZML₯ΤAliΐ‘θŠifΎXΜ¨Jκ”e0άάtα9|β’v⚦)°Σ ππ0Τΐ“NΗϋ7sβ‹oζQ)tΎ‹x‘Ϊθε‚!ΎωΉ"nlΉψφ죇>‚HΰώΎ J±΅μΐ±3Ίςi ­i›L+φe«m€Ϊν«΅Μλ1yή›EΌL!“mρΞ5›Λ6ώπ§C|£;ξ‘ώΖ’ƒΥΊ₯Qτ–IzŸl±Σ qsΣγLΫ+O[—)‘nv"<<˜1άάtQ+™h“)Ό%ω —W„‘ΐ½½ΰJΘυkduόΘrɈΊhTψαβ~>g@1gjVQήw,ͺΐφ Ξπυ!–*δQ7‚kO(ˆ9—Γ±θW΅VžJS‘;€#?Εv3@”HΆSΐώάΟΧP)§©ώ)^1Vΐ«–XώήΗ)­ΫΫϋ£†μq€ ΚΜ£˜s΅ψΞΥύ#QŽΑ(A₯@―mυ’Sg_dœ`₯F3(Οαθ hό ζgκψj“_ͺXxcΛC*―Έ’δ²"7 šΩ«Κ1ΐ` Lšύp°©‡]9©Š8λ<Υ@NcΐΐΔF8ˆ€PB N1Gm½0"$p \Ϋp§:Q,ppaη(„N΄Θ]ΝΕΧή/Š•š)Τy\ΔEΌ¬!δXΰΎPΒΥuΏχΓ»·ΰv?Ζϊ’J‘ΜqΚHž@ΞeX­ΣΊ1§ˆ{5’"§bΒΖQtΑjΙ„- Β²ΌYΉneΣ%b†ΣΏW ΑG?`™\Ϋ"Ÿ–Ψ&—&etާQρ„ 1‘g“Ί‘RUΆ$'Ϋ„†,8Lƒ!οMxŠŠMŸ—dΠ³Ζ4Έ–ϊaб”doT,ΤΛ&’Dΰαa€ƒγH―»GΎυ£~ρΛ₯Ήš$ς +ΰ·A¦A―DΌj ΐ―αΤ?@όχίc0Nu¦wΦV~»£έ'ͺέjΝF«OρΝE”PZΚ(Θ—ϊ΄ρc@_šdxitdpg_Ήp%)~‚ˆŒΩ{Sρς NΥϊZέ†¦Έ³@ѝ―ιu|sς׊& ’ͺΨκƈ%01ŠRδ₯D*άΫ pԍ‘¦y—㝫9”Θδ]WV-2aΤ}θφcμ4Ctj7L|ύύ‚xλŠΫZ¨Ρ}ρR…ΪΌnl8b΅fα; ρŸΩqΪΣΥ’•šZΡ”ΊχΆ~Q‰άέ#,ΑQ7ΒReUlΆ'BcΓ1U{>ˆ¦ει#ι?`pΒΝZ9›l΄‹ž1…ΩQ`δy " ˆ•$ΐθ &iZ„ƒα_ @ͺ˜ΙΉdgμΉžM#ΛdΪ3ΐ4˜΅Δ Œ)Λτ š0Β8•ΆΚ4,δ(Ή9κΖ8κF¬Χ?Ό=b—ΧρφUχ,¬€ΏΰΏƒWD θUJΦόU%,¨ώ`χ0bΝΩVΓΖP~ωa$€<&tϊ0kcŽκ” D[[©YZ˜ζ,qά‹±ΎD›ωRΩό’CΊ9sG)On_σtΆ˜΄ 9ŽΝyS€‰@O<» œkϊ 5C«iώvΠΡμΔSΗδ|"<Τ%Έ³λO£”'5΄α8Egkͺήjέ¦Ή‘ΔT‹մސZ­^¬:²UΟ~¦˜6ͺζ­ο"^ΩH™ }γ3E\Z±ρΫί°ϋϋŽ:1:ύ[+66Ξ#LFΕ`;ΥBwεœϋΈ‘' wKFP!ghό€ ₯›Οd Vœ΅;j™V cyΜ?[Κ‘¨—/υO€ιgXw3±ςGΉ`θͺξΚͺ£……ΤFΟeB}ίμ©Ζ‹C?…L,Ρ•|ςI"€%O<Rl7ΓGΨF’FŽίωAŸ­/Y§Q€ ΐίπŸ<»θΩΖ«”ό Ύ‚S€ν^Βv"ζXΧ6\€‚qΒHθ,0ŒιζB‘Α5Ω€;ŒΡκΖX­[X©Zhv’SΝzΊYό€ι<ΗF­lb·Εœ2KR ;ˆQ/›Θ»Dϊσ2(‚μHβΤ܏AΝιO*†@ΞŘn“)4± …?²ϋX&C₯hθλ–H#’zΩΔruBuΚς‘›wv}νΟ­6JΡΐΧή+ˆχoδΡYΏˆ‹xCu;’Q΅πνπέGl€x°OsωK+ŽΦΨθη žB.–@΅`ΰκΊ«moΰΧ΅™Κ ͺΚUœLgρ”σΥ–ΏjOΝF:ρBΉ&?€.e)oh °Α Ώδ9€hp’2ΪQΜdο-[·ΔV Φ} ­5Fy£Z0§wv΄zΡTΑ0₯>—²WΨk…Žgwkφ#φ­πK_.‹ω“6νΰwmΘC\υ;»ώΜλd€‚ZIͺΟζ¨ μ·NGΑφF4χ·-rΏS>᳂Μ~θ2x6η€’7+”€²Ιρ70eΜqς½U1M©κP&@•}Ξ‘…*ηpΌ}ΕΣΗY‘75Λ½χMίόlQl4,qZ;ς".βU Ia?…6—mόζχϊlΏEL8Έ²ζj . [ςΝ―@Ύ†Α°±dC@nˆςίRTK&­»$Π“ŽgL£ΰ‹9ƒq’σ‘n¨άR£@[ПΥk³l%€ώ\ΜZ\ϋHJ―e2­Zπ8ήΉκ3jγrŸ]²ΟΊRΦη~Hl…l5―t ƒΡx‘‘Νp»Ÿi}VαΩλ œΣΨχΰ8:υ5?ϊdΔ¬9xϋŠ+Ε]€Οψ—@:5gD3Ύ˜x€(£Zhσ+ ώ|V¬kT,€)pΠ¦ΦNNJZ*z9Πε‚΄–•ˆΠT@”«έrΥΰΆXΪn^L©c©θ ΙJΈV4±TΆΠμΠL|^0©7ςST δ;~xΝmu |R4Mš“ΝMRh.cΞΠΚψŠg‡νjZβΩ„ UEή#χΐΌΗQ/[ΪlD‘xgmήB‡νwχ|„±Π³~Χαψβ›yρΥwσπ\~1뿈Χ6Tu}λ²+ΰ{}φΣ{cμ·ΘEτꚫΑs*Zέν~BΞ™eSoώ πεJΘdΨ\ž` ²ΰ\!€΅%’:WέN΅v©Dέ²8nmΉZdH%TΜ)Ρ¨L‰αaΊS¨+βϊ { 2ϊ0Α”x*b–«d[ΌΧŠ°Σ ΄όψά#I)cv$χΣs¨₯~o›\sFu+’kλ.=|ΙΔΰG)d―–Zc5τG‰~XŠ!ϋE τF Κ22₯‡φΌΒT?ψj†5λNεJ L} .d¦P3ΝΛθ‘73ΰ›Z™nΓ`ΈΎα§Φb:AR‹RΡ5)δ dΦΔ)=dΫ‡‘ž ,WMόάηKβK0.xύρ) !€ZΩΏώ΅ Φ—lόξϋμ¨ΓGΈΌκ ^²4z½V’βαa [ιΗ½{­ΆΙQΘX©½PτΈ€ q°Œœ―!Ω;³Ξ‡3hοyη¬~Υbς/՚ΖŽIx„$%_AΖτ+Mɍ4I ρXku«u:χf'cA³Φ4ΣdXZ08Ή%f=GΞrνΛ«5κv’3Ώž3`§β; ρσŸ/-zM  ώ@χYήOη‰—=ΈΰΏΐΕΌΦ??μχ~4˜όŒμ4C\[wQ-‘>χφ!ωΖ‡΄μIž»’Ψ΅MΫ’ωUAͺσALTύ؜V%Σ@“+k.F>©γ% m”‘lg₯Rΐ'MBι ΰΪ$£Ω™ucΚ =ŒR- l[Σ's’=©8¦~6Λιη9Kžέ68£€BqfΥόΟΰΠj*γ68Cœάήρ1'Έ²ζN™|Œ|²Omv"]•0·.»ψω/”ΔrΥΌΰυ_Δ§.€Aψς;y,•MόƒουΨN3ΒΗ}τͺ Φ6)‡Z o\rΡlΗ)l‹Φ£ θτ#u"Έ6ΓrΕΒ8Hρჱξ4˜ΓfΓF£j!ŒΔΔΐ+ΟΠRΒ»GαΜ’ΓΆΦκ6Lƒαα!™|©uN~©'BΎbžΨBΥΘg#λn.…ΤΖg Rή εΌ¬ώΫΡ€[{†0 †%–Ι0Rμ…Ϊ5ρ¬ίΫχ?±kλ;§iό"€?ΰίΪχΟӊ—9ΰ :Εg°ˆφΗ€Ÿήγφφ£‚?ΗΚ’“ΏΎd£;Hfςt q@|~`ΖyϋŠWκξο4ν ˜%¨•Ι9XάV.u00-Ξ3©Δ)V7’Α­9–fΛP¦)mθJ±o}ΙΦΎδ¦ψͺtNt>—Wl.Ϋ0ωδ\Α&>§…DpΤ9©θt †γDΞ-kχiŒip†­eηjξ•5rTτ5ΖΘΞvΏι"'ЍπP8§“X€,ržΟΩ­•Μw$M‚fνώtώ$Už€j^§V>gTd₯ύΟΠ(ήaδ§8ꜞ4dc­N2ηq,°}œ όΛ^u\‹γκΊ ΗβΨ9ŒX­dˆœΓqΚrφίπΧ|λ±Nψ9Δ˚ό)ΝβάλΚp{'ΐnŸ.Έ΄ίŠP)Pλg³a£7$Ιή³zŒό‡ν—WΤK&rΖ#f³Ί‘”΅,η ΨgI;\zέ£\Z!ˆ;Kmt†f'Βq?ΖLή©6—\]wΖ=?"Ρ©Ϊ…οz9˜C»cοhZι*«!0'†#*I)J@ί`œΐΰ «uJP*sϊα΅ύξξ\Ϋ7.Ήψ“_*‰FΕΌhω_ΔEΜ !ΑΊŸΉ™•’‰Ώϋν.Ϋ;ŠππΖ›› η‘5Λ6œ’©₯|Λy76]t‡4ͺ#p.alّˁ΄ύ·ΔΝb ²3€ρ|v2<‡δwIΫ[ΤώwμνSΔ…ˆΕ₯Ι­n|ͺ$qφΊ–ςVͺ6š]ͺS‘υ5QnΆ5ΑC9 ΅)ΜΤ8H±}±›Ž8Έΰ_GOν†y ρ2& 2˜ύ0£ eίώρ€‚ό”<ŠNX ŸlΟδQ ΠΝΧlGXR`₯f£?Ÿ©Šmχc¬7lΨ&C΅hbΰOzL}.Œjηε\ ͺ–ϋ#η$HύJQyΈtκ;)βq`§nrΚ\@2 0©Ϊm‹!οCZπH·\=δ'7 " `gkμƒi2|ρΝΌψϊϋδ/ζύqg !ȁξΟ~³Šίψ£ϋ聏 €εiεΐ$%©[Ϋd°₯&ΘJΝΒrΥ:'ŠΡT)šθτc„ρ„Ι$€ύ·¦ Ÿ 6+ζΣ¬` (z\ͺ ν„:ϋR+ί±©ύίΖ§κ΅3­Ϋ΅εΆΝ΄ž΅&œpRŽΝD-i”Εo©M^ٞΫζD}0λ–šΥ@vš« ±\3q πΧό €ό™ή</cπpŠβπΗwΖΈ·œΊωΚ¨‡¨3—V4Κ&:} ν3Ϊύ‚fψ§ufΎΞOΠΖXX¨•,μGs1%+ƒq‚ΌΗ‘w ζ&*$”!ΐ`³ίΒ^@βδI~Ύk½¨Q6΅{™™•P‘ΐ';c΄Ί“¬Ϊ±Ύώ^Q|ωέΌPΗΈˆ‹Έˆ³…θ‰?υ³όύοτπύGμώA€$Ά–mmσmp†Ξ€„l­»¨—M­œgpΛeϊx弁w―η¦,ΓUP·O­)iJ"…ξ¨γΞάdΙΟ Η αΡ=]u*\²„΄\°ώί£―q-†Ί¬ώΫύC?Υ#Ρ¬`‘i0RdΣ†Aυ²©ιŽWΦ\ΪΰΉR=ό>«@¨ΌWΤz­ΌS†γϋΗ˜,ήŽCώgΎQΉω:&€gσ―ψM­}©xΩ€λ δΏ…ΐΏv/aίω鐝Τm>-φZ!*EεΌ‘Ggn#°ΫHRς¨^*[(δΘi―ӟŸ8€)΅Ϋ—……ΌGtΔ™ηΘ&RŸ¦Μ`YZž`φœU Ν+E’9–¬τεΟΗ FAŠJΑœψgƒΪ`·w|χ&›)oΰO|Ύ(ή»‘»˜χ_ΔEΏμ‘ΰX[²qoΟ?Σ₯6»¦dΤK&φ½³Ήύ)š\Ξ%ӝξ)’@ύeΠΚkΦ<ΪΗ€κ9Ύ˜€ Π-.Χf(xJ9C{a/ULNΣΙλφZ!X―Ϋ0+“ΝΏ3HpwΟΧ†G‚ΠΜψ•―”Σλ›Ξ„κxqO$ΕΝΔ7?W`…Ώωέ>;lG).KΪ­m2άάτА±–cψxϋ0ΔQ'F1gΰkl“ΜΎF>±{r.‡mq)'.7O›Αe'ͺa1Α]ίp5ƒHHό€ν©Bb΅f‘Q™Ώ΅06):‹0O˜TςJa0[έ«ͺœ1eœ¬ΦΥ΅RΏ*Ι`ΕΞBv€ŒΠώ0ͺγ‘ΦΣ“~—V²cNνΓ@9U$)π†μΪ†ƒZi‘B ς΄ω/άΡχπr%ŸYύΞ jε'ΜRV+šδ;―$#gIGκN~=ξΗ8lGX_’l·έΡKͺ» CNJ_{QaŠξ Fή΅Q)š°šα\•?Ζ?œ£ΰhυβ™η’t²σŸBπ*;`₯nτ‚υ†ƒ•šMFRδ˜\3?H1πSτ†1‹(3I*Π&X©ΪX[²ΑέπΝN„ϋ{ό0Υ3•š…_ύjY\Z΅/ͺώ‹Έˆ§BgβKoεαΩυvY”ΰΓ‡c¬Χm\Z!ŒQ£b韯I©άμr†Q ΧR›X¨Υm‹γ­+Š9ϋ-RΕ³-rα#=¦ioI"4΅Omΐ €™Ρ gι*N°—§B±‘5HύLšiM¨φΎ0%Ϊ/ ΅(’hΚρU%¦ΑpcΣ…iϊΓcD ŒŒ¦ώŠMγFC‚;φ[R#ŒΨχ>βΎXZψUxΔ ψ_Όθϋ xyΐ_p ͺ4v›³LŽ·.{Ϊο:Mό(…―œͺ@7ƒμO2j{I μE(ηMδ=Ž­†­ε*η†ΚJA3«f'Ζ֊zΩΒΑqtj @«cΉj#ηŠτθuQd~C… ς.!e9Γ”ZηΤΚ3 &3qj»_^%ʞgsΈΏ[™uo2Ǐ₯Œ±aww˜ΰ£m#Ÿš[—<ύ\ZqΰΉΰ <8°i«QEσϋΥ―–ΕzΓΊΠσΏˆ‹xFρξuO˜&Γίύv—u Ά›l‹ZσΩ°L²ΊΕA€‘Ÿb0JPΚΘ{΄™Ηr3cIιτΆ£© ‘s†wz¨Mμwcμ4=7WIc «uŽƒ»Ν‰P6}ώœ1 Θ;ξvAmΪͺ« WmΈOZ‹gEBi§~2#u>Θ₯Ψm…3ΛDά\ΆIΘ§ ΔΞΉ„›HτhžΎΐΙbͺΰr¬TIοΏΥι<ΖΘΨ`Ά,εI7ΰΑa*ζ‚1 ?Lπ‡?²_―•a𹠁)λφΟψ«xΑS—!°AΐΏΉ’?rώΞ~σ{}φπ Δ₯U+UjwυF‰Β`RO λd2T.εp½L’œ­ΈWjVj“φYφgŒ{–ΚP ~΅f‘‰Ζi_#ƒή¬ey7—™wM >δ ΐ Η•5gͺν–Mt²φ‘A@]εΈ₯Π΅—WΨΓn3›7@Ό+E,όˆ2ΫrΑΐFΓΡͺ~ΩkuΨqp›Zω'AΎͺ₯Ξ4je aLcHε| Πϊ”Y^LfρjΦ?ӜG"νθωϊΜΝVLTτό0%±0ΆΚU/[p,’ώ΅Ίρόcg‚3`΅nΓu8‚<’τl•ΏŠFΥΒr•F™ϋΗŽΊgP dΐG|ΌsΝΓΝMη4₯ΣΏΰ?πέ³ŸΥӏ—!ψ9œ"ϊ|xίǝq"p?€gS•j™ RαNIρ*dθΙJY‰](υ=ۀ쐖•aL&—ˆRΞΙ&Δ”؏ŸΣ:§έ_jΓ6 ¦Ε$²Η”-0­ΐ%y΅©υȎ6\›c­n#Š>x0ΖΠO Υ*SΘΝd¦¦xώjŒ` o\ςP+™ΊβΟ\~χcά?τM-ϊόΚWΚb5ζE\Δ³ˆyj΄ΐ4ξυ΅ !€kŽψυ―Wπ_ύ^‡΄c|²νγ-Ov©Ÿ ’tΚ첍FΩDwHή(J ˆKZ’ϋ¦uC„₯žάH Ξ`ΚΓȟŸpNςΏͺSΰ‹uψ-“a©LtΑξ ֊‡§]—Ržό_ H.ΈFΡ7υϊ‚Η±΅μΐ0Θf»<Pό;?²­eΆ΅° ° ’ώ—<ž€αSŒxς"T°€φ7₯μ»Ž΄ήΏ€Έ»ηγΝΛ<‡γꚫgCi „ΩyΖρ²(ΣK«6”ιm†θτc-ώ`πGΣSƒ‘ΐ c@­h’R0‘€δΫFbŠOΚΐ4RVέ@υ² Χζω)φC$ Νγ³§ͺΌ°―­ϊ΄3 ‡›Ζr He΅fK₯. >αŒΕe$‹ΦU(釕FφIδΎ’χ½³λ#ˆ&Ίώo^vρ+_-‹RώbσΏˆηjγοƒ*§=ۚήΡ¬.cψu %τλ_―ΰoύ^—ν·"|Ό=ΖΝΝIΐΠ&ψ\-šΰœ,{‹9I]’ωeAP+™θ c)„©Ν|VE«4?L‰κ_D«v,*Έ¨s›ˆYœάΘσΉώuγ3UρJτΗΆΘνοΰ8ΩρΙ)O½p₯ΪLw›!*z–*ΩKϊ§¬²’ŒRδ=C;Sν4OχHS[+Τ?κΔ gZ]‰δ΅Mzh’ΜέΔτρ„–U‚>'0βλJU°bΞ@½l’^²²‡Ε$·VύύPš’ ₯k–ό/6‹xΎΑψώ€+ΘamˆΙΪa€@Δίπ/ψ2>έ!€­[όΪΧΚψ/·ΓŽc|ψpŒ.Š9κ2*€έfˆ²ΰι pF˜v,Ž7.yΒ~˜’/ΑΡͺHΠ3Λ+1 LƒXσΐΤ [δXΚŒ’…κœEΠδπ 3|…ιͺIτηΰ8zl·ΏΥš…z™F&»Gα#”Ώ³D |οΓ»Ύαΐ΅ω’.@~CοLτΒψG~φ"ή κίΖ»_EϋϋύaυGrα‡~ Λΰ(ζ δ\ƒTτFΙ©o¬ –3ώjΙ‚'uTΛhξςάˆ€’gΐ4 ՚,Θh³d¨—LX—ΐ»tζ{(ή­ΚΨ[]Rž:y/:ΗrΝ‚Α™ζΉκ–θΛ5?œ|½Χ6ΚSoτΓq‚{ϋr©-ύϋγoϋθ&vΎo\rρ«_}νΫώlΖρβ‚ό―ό?–Ξ†Πι­€[ °Υ§β»+ 4ͺvš!kχt ‹!η’X1o ˆRx‡m14;1IwχcD 4•˜1κδŽr:œ*0 %±M;€© `_½lb̟·3¬Υm” Ζ™ρΜ«Žό·΅βΐ4φŽΘε΄0 †+λ. 9#?Ε½½`‘κκΤ{ʎá –€ ήέ žΘ±”„‹ l4l” ΖΒ°ΰ·<|Κ·Δ™βE&ΏBAΞυSd ψ£ŸŽΨοŒΩΌ,lθ'(Έ†ζΜΖ όΰ1Z6 B›1+>“ST*SβZΙ‚msŒ±pήΔ΅ϋ«%“’SŠR'ƒs`©lΑ0˜FοO[β[' ύQ Ξ)1¨Θ£ΰ`ŒΡη³9B«ΰώ~€ή0ΑεUG* BTβ%puέΑ―}­"*ΕΧvσ§‹CΩx M@χθ§b#y ƒf€ ”œΕL₯κ\ ‹½žw뉨i#ή9ŒUΝ 8£vΏmQ@ϊ€”w؎0πSŒƒ²Σd88ŽΠμĈ>œi‘0W&υQώκeϊ―R άPœ~ % …>€Š†œΓΡ’Z,σG΅šFΩBΛ6||ŠYje[0ιαa°pm=–Ιp}ΓE)Orȟlϋ yΜο—Κ&ΉjDΛ ƒ-zY΄ξό-Ό€±Υ‹x ΦG fΗ½˜ύπφˆ-B~‘ΐ½ύžCˆφ+«.> Η‡goύ(žh9oΒu8Φ–lάή9]!P©όυG1ͺEΛU GΕZq"Π$δ*•#‡ œM­ #ϊY&©φŸ’|ώ8p@όζ2 ™ml2ςπΓέa‚γn ΧaΈΊζ"N„φΙΞ{„ >κFΈ³;-ς³Ήlγ—Ύ\ΥΧsσWU~ΐo€”Ίšςοί9T^΅š_ϋωςK ΐίπΏΞ;ώ_Γ)Άβ―K(`ΰ/₯ŒΏυ{Φ$Έΐ΅9–*“ŽŸ@Ξ™θ‘$)uBIδ‹(oœ08ο‘» ksMTzϋžΓΰ9“χφŽ[—<-₯› IΘw I ž‘G₯œ8£Ί§pOI*`qύ§υ5&r±8‹3Mκn*ΰžN0ΞŒ«uR$TBI½‘T7ΕμΜ_Ω'+`Ή’{Η΅uŽΝΠ$l―‰+k§ £ύiΠΘκwžχ=σ’€oψ‡°ΰ;ψΡνρ#‚9'CΤξΈΎα’\0°΅lγφf·?Εα<8ްΉlcΉbαΈ£Υ=}ώΕΗJyEΟ@Ή`,< τψCiϋΏΖ jƒω?ψ·Œηόœpΐ„<ί‚<Iΐ³ ΰž%ψψ§Έψ”Œ„ ± ()γο~»ΛzΓC\ίp§LrςΗυu+ΥD=‡Γ2΅άuχPθγF±@”έ pm†JΑ„m1μ΅B΄Ί1Q―Mi«kqœζλŽΕ΅ΚδxΦDמΜΚ³¬©RޘP¦gΠ₯ud[«5«΅ieΔΣB­wM~κοδ‘OόS'’Ίκ―„˜Έ&χμ6C\[wN»ω~ ΐgAIλs‹‘|ΐ/.ϊ!€ίγψŒύκ5δ]ŽJΡΔfΓΖ`L›ΰYG~˜b―βΪΊ‹rΑΔRΕΒ^+<υυa,pԍQΘ¨MN± #sr ³gΣd°LM€‹6κTy—ㆬΪΥÚ¦Ž―i0΄Ί1ξνϋB‘%+—+ 3ΫT”€WΞεά{G‘–5‚€ERΫuέόS.χψŒ―ϋA—―¨β" xΦρ8ŸqJ”œ₯|mBxοΊ'ό0ΕίϋΓ;8‘s86φΤΟ0F›¬ͺΞ]‰ˆz±΄Υ³Ο³’\#L“@…B~jέ“ΏšΓ»Wsπl/>Ψ4ΥZι±(π³ηpΤK8§5+I­U—c`ς‰ϋŸbJ-‰ΘnΦJAˆ€—@ΦMΏNdrœιDΔ’*ip`ΉfΑ• Ξv3@³λ±ΖN3`K XS)€54ˆήϊάΦ”η˜ςCΞm‘κκΞΩ«ADx€7%ΰςͺƒξλόŸˆΓv„zΙD΅db}ΙF§ŸŠ'PsσΥ:Y7*ΊΓD·8ΖIΐ’ΎJ¦Ψs άΊD|QΗ&™N%D4Ιΐι}’”Fa$Π'ŒΓΧ7\Ԋ&’„ώτΆ08‰ Q₯ΟpyΥΕJΥ"'Χό¨λމΤ%ψ…/”Δ΅ ηuάόΥ%ϊ4'>ζkSΏ ΰŸ|ΡβS?Ζω(R; „OI Ÿ#‡ώ0ίϊ1Y η\ŽZΙΤkJœbhΑεZ^ύ榇ξ ΖQ7Φςΰ΄0Y6”riš -/|R–Χ1›έA‚ΑxώώΆZ·°TΆ€Ÿlϋ3}V”H18nlΈΘΉέA‚ΑBήΏ‚h"Š’>nr†γnŒ{ϋ–ƒŸ΅ζ)κψ„FNΏΉlΓ’@ΏΓN„‡!uŽe₯ΆΣ ρΑ=?σNώ΄―λΟψχ@χόs‰η|ΐ―ŸφC·w΄3ώςΔδ¨Ψ> quέE₯`bsΩ™kω+ω UσΫΝ…œΌΛ±Z³poZ jJLˆ3(Οϋώ(‘¬ ?œPο‹Ϊa¦DΤ*ƒ€2ΩjibΓ«Œz’ˆΌΈ£X R τξN3ΔN3œ²¬d λ “‘©₯₯ƒ²ΓμgŒSάίχυl™ ?ϋ~AΌ}Ν{]7Τb~܈ό?όŠχυΎJ/6ždφŸ>(Έτ’?Θ‹ΣdβλŸ)²‘ŸŠοΘy€e’€4žζ(2Z§ τϊ)‰͘₯Ζ‰T5@Ρ3ΰڜLήZα£@ιyΧΕ`Ψ\&š‘’ΡΟΰ1ΥghT,\^q`ΔΒΊ·ηk“4ϊ!ZŸt{ΔήΊκ‘˜γ‹Ί—όώ'ΟϊΎΠΧαy½] ό“ VΗάΠ’lmΙΦ>σSWIea"›…M«ν΅Ί1Κω 9Ž΄ϋqFw:γ=-ΫHΩ٘jg•ς–k–Vκ³Μ‰œ&—ϊύδ?ΐ5 DΘJώΪΊ›y?y\ω?jίS{ΘΰΤώoucŒόQLF=Jξ—1ΰ«9”ς†ΦνΞ "M©ώΙχg (x†4,βZζSΣsΈώBΖAŠΫ;$!¬Žχ₯·ςβgήΞ Ε x ƒ6…ΏyŽcό.(S ^ΫΛτBƒ(Ϋη›ϋAŠ Ά˜8²~’YO"P)˜Έ΄β@Θ6Q6αΙnςκAΘ»Ίueο&ƒS½T¦›[΅ϊ…˜8o]Z&..@#“;»Ύv&$𐇯Ώ_О―i0PeytŽc΄A΄―Όθσš΅οΟ3HfΌŠOq’&UψΔ/|±„ή0a{G>z8ƍMκs$€ΗBΨ>Ωρa$ZΆ$QώE‚ΥΊ ?HΡ'Ίυ­”JΥΨ3»Ξr†Τ[IηcP)šF~ΌP)Pu5‹9’ >8ަУEΧ’ΰ‘Hηΐq/Ζ~λρ&LJ¨θϊΊ Oέݝ¨₯Ί$~πρˆίΊδŠœΓΕό«€7@ΑΞ³»#&ρ<€ ΐ,xΗAΚξνLΙO’1mμͺJgϊ¬OOΧ²XEεΨ7λebZ84#R†B4·5I'ΆΒ4/’d$IθχR°bΆ›!ΫΡΤL)›°D±ΐZέΦςΌ³D„T7 d„3†$ƒΚe¬@)g xΩΣ眀ΤV γ”ςŠ9`€Ÿp{ΧG«;΅l­Ψψ…/”„ηςΧ½υ΄βcP7KMp.βιFκԜ'*v^Ÿζ ϊ)~ιΛeόίn³v?ΑΗ}Όq‰’€zΙΤνvΗβp-†ΓNŒN?†%mΟ•)™+5ύ Χl'Λ`ΨZvΠ%ω ‚ˆ@rΆΕ4ύ°7" ς¬%Ψ4©žJZχ(X\‘[&ΓJΥ‚Α‰…uΦκί06—mέιxxœ)q˜zoƒαΚͺƒbή@œάΫχ©ΓΌΰ5Œ»Ν··ΌΓ›W\ dμy<³B]χgύ2ΦAYB^ΟΌ@άσρ»?κ£Z4qm$Èd#ƒXΐΰυž€RήΔj΄;R ši:Ν558ÍM˜ ΖτΐΔ‰ΠΤ“›:@2šυ2ωp—ςφ[α#3wΘ „4«MϊΩγG1*€”ί€˜’ΦJ& lΘq‚ιχχ"δ\R #FΕΒFƒ„2‚PΰφŽ―-.…ͺEΏψ3%Q/βIδ/?₯ρ#P' Ž‹ΰYΔ1 y2ƒ,Η?υ!peΝίόlηχ»l¦Ψi†(z†tRΰ’JyΝn I2R|ψ`,[υΚyω xpkΩF’B‚‘ŒόT;–¦)uD³|-Y.¨’.ζhΜΩξΗH’ωpZ―L”ςζγU +φ%©υΏΧ Ρ<ώάsΩF½2ρ X΄§d#J~ψɈݼδΒ΅Ψ’.ΐ» ₯άψίΟ-ψοažζ?€‘Ÿ²~2b~ pEΰŒακ:ωΨ—‹&>~8ž9_9-Ž{1ιrεI5+₯m–Ψ="ώlIΊgΆ£™s.Q,pΤ‰₯(‰œkΜ•ŽSώ0Ρm8•πœŒPΆζ‹ΐ9¦AŸ'η0 θ‡ΚSl7‰‹'ο^Λ€”9v4Xq§LmώΓρsŸ/‰†ύiΩό€2H‹β<ρ“ΰ"ž~| wΞc\Γ…z£!€χηD»Ÿΰχ~Ψgν~Œf7ΖZ͚πΨAΰΆ‘Ÿ Ω‰υšΔε8²Υ₯ŠΫ4BάάtΡ¨ZΊ½οΪDcv‹&jΕi΅%ͺΌύPβœΒqJj•‚ Λ$@^g°Θg +5ͺώ;ƒΗύ³UžΝ±±A4Ώ£˜¦ΐQ'ΒRΩBή5P)˜S£ƒlVΕB'+U‹2q©¨~^± 8šέχφQͺ3eυ’T 3°΅μ .yϊshu#ς7€w€…ŸBQxΞ§τw4>»fτ£ρ}P‰ ΐΣ Ί¦œσ8%Πΰ"N„@£bŠ?ρωώϊo΅Ωa;B1g`­>K€ˆ’Ž,$Έ΄OEˆα˜Ζ¨œCΣaH(Ρ­‘χχX&ƒcq86œ9GΉ`hR.Yͺm#`IΜω$)i›¨'m₯j!JόP –ž¦pvšRβ²Ρ °υpLΈ•Τœe· †Λ«Šώ3ŠηΪubl.Ÿ Mωeoψα³Ίžuπ&Μ07’ψρν›—M…‰ΐέ]ΊqͺE—WD±83πBEœ <<Pπhƒ½΄β`θ'³Ε+NΎ6¦.€rΩkTLl7ηοΚ%pθ'Ϊ+ϋ¨ΔSͺWΉ6G1ObC Δη9’w+ίsR'a8N°Ρ°5εE]«¬#•΅Ζj%žΓ§‡ΖaŠνΓqJ}΅ΌΛρ'>_υ²ωiέόΫΤAϊώO‚d„/ZΝO7"œί#έΓΕχ27R\ίtΔΧή/ΰ7ΎΣcφδάI›‚\Rm‹c½nsκ,VŠ&ZέΗ½xΚa0K&έͺτΣ”Ί–ͺυF ϊ#ΪMƒαν«ž΄aOpxLοηΨ9‡Ζ–” v,>‘Ϋ°‰O€ԁHε9ΔCEl‹ό „γ–Ι΄J,)ΪΚ£ KλV±ΎdcΉj‘Μο!"Ν]3ΩΜίκk”“’ξA(ΨΘO‘wR7όΓx…€Τ‚› ώ“²Ώwvζ·γτξnϋΡO.―:’ώΩ³0`ΰ“3֍ jηo4ζ«ž<Οv?A»£Q΅°R³qԍ΅sT6D¦²?ξΕπΗΔΊΜ@ ž/c’‘Uξh\ΡμDŒ ύTc*EΕΌ!₯7'΄EΣ g@ ΰ›ΠTΔ)yjdΦΞ8π₯·σβζ–ϋiήό2τYΓω€‡ξx€§ Ξ¬ƒF=1'>w+½V$~|{ΜnοψΈ΅ε’#f@ή5pwΟGEŽ#Σ”€}Υ¦˜έL HΘ4R!¦ΦΚ,ϊίs8ς΄!οDΨmE²°Q#ΐ–bk₯φ,ΨΘϊγ·w|Ό±Eβ ΧΧ]|ψΐΗΐ?;’Ÿ@}ε<΅ςWkΊƒ³Ωώ&‰ΐn+D₯hR»Ύfαή^ ΟOYτΪ&Χ•|)ghΑ¬2 $†\΅ΖaŠεŠΗ&9ΙνΓPWESvjdτΈΛyλ 9ΗΠBD­1(κεΙW»w’Ω™ΜΚήΌμβgήΞΪΙλ$σΘ€γI£ JήΡθ5 ΰ² ΘSκ\έ°)άQ/[Ϊ‰ vŽμ…xσRNwΪJͺŠ”σίψlξ§wξ―B€ξσΈ#?ΐ<..β±bηSj¨ϋθΰ‚Έ0„jeίψlQόΏΣfέA‚;»>n]ς`› WΦέ‰δœhΔ»G![ROίs8¬:X[²ΡRQ5­ψθWΐ9-9#‹τΉ :)'ά¨ˆοΈc4NH}0s;Έυ²I(φ[δ£bπI‘Ζ₯‘‘Α‘έ '… 9ϐl+ςea ϊ5κW*κN’§?„–lW ‚ό;?hχc¬Φ­E”@€‘σŸγ|Œ˜™ρ¬€iμbΑΓwά‹΅―τY£Ω‰ΰΪ4¨L\^%z`rFj€Τΐƒƒ7·ˆίΏΡ°qgΧΧν+Ξ™Φφ·-Κ*-ƒ }ΤΌή΅9ήΨςtυ―"‘­€qHΞ|Œ΅’ !μ^}ΩΩVΨΠO°y—Œ3² ‰ͺξθAΈuΙΣRΗJ51I(ƒ^«ΫδŸ-Hϋޞ―©*ΆΕπυχ X­[ŸφΝ?_έ―g£…ΜŽŸΰb“yΪΡ±,ΞŸZ€Η !€[—\±s+ίρ€΅ϋ1ŽΊΦ%βή4˜–F·LŽώ(ΑΑq„•*6ΥζνZΛ2RžRTd»\a–\‹Δˆ—―,ΜgE½lΒ΅ΉΖ₯™’qV` KΰίQH‚FΊν9MΝΞ ΄qN ΏΌ\λ8lSg•ΛύAΙΗ/Ύ¨@ή3piΕΡTξΓv„Ξ€:ΞI Η ϋΕ/—„RoίuΰiοΟ*xΤ˜I Φ¦μʚƒΫ;>†γ³S*vŽμ\YˆβtΚ±oŠ;*#{³pΞΠ]₯V"zˆšΫ²δΪ|*3ΜΆο³xΰDΡωΖ‰\D1Ν‹l‹#w-GJWyGέhζηŒ$)Ν»›Α—CΣ`¨δ TŠ΄©sι>θ)€Μπ•UΐJΝF­d’ρ†ŸβnƜBΰέk޹Ꝋyψ”ΕeΠFqžΫΗ ju‰ΐӊœώd‚€Η/βŒaΐWή-`·βށέκe²Χ?ΓJ9ι[’ !F1φCΤKͺ%ks΄RήΔ{Χςθb΄ϋ ϊ£A˜’#@,‹—yRνΆΙ°TΆΐΩΔNxΡ^‘„ŒΚ…‰ΩŸν.,xm R \­S·‘Ω‰°wΙδDΜά[ζ…mVΒ2R»-ΚjΩ ύοίπΨζŠ-t–όiΌB ΐ―XΕ‚φ·Ÿ Υ‹Q)˜Έ±ια“νρT°θB' eeŽΝΠ(­o 4Ϋ‘ή΄³Ξ} A:±δ₯ΏSσe 9eφ#©'©˜p\Υ¦Ζ$­k[4³Ώ³λk Iφ3@¦hχcδ\΅’‰k†ΪFώl ω©ζ–ς†Ξΐ•„εήQˆΑ8Ε₯GgΨKrξ/pԍ¨ εοkο„i²‹κΐH.φ< ΐ=L€‹x:ρΞ7»·AίλEœ1ˆ‡ΟΕ7>[ΔQ§Νϊ#βΩ―/ΩSEΟΦ Ρ׎{qμFx¦‘`·b©Lrξ¦Alδ`c₯J#ώˆΠψœ£Qͺm‚gSΉ`"οˆSͺ “dΎ€§-MΜ~š³1Ζ”Α₯Gλ άί¦:³¨Ž³Β4χ΅$Η{G΄ωOYƒΊΡ>π±1Ÿ¨’_πο‚°1O-žEP—'«N~ζ…ώγ;cάΫ °Ήμ R0p}ΓΕέέ@ ζ¨MM6LƒΑ4™ζžrySY_]s°V³&ν{ƒMζfZσ‚ZφκίT&J?₯R'QΖΥO΅ύΧ–lT l‹a8ž}S AΪΦ«5‹4΄s&šG»a$0φ8E+UΒΰqŽc ΰ"Ξ OΗ°b\ΔcηΐήΜ‹{{»·OέΖ+λή•žI½lNδzΩ΄€eppNθώf7Ζ`”ςŸkh½’‚G&ΝqiΥѝΦΑ8Αpœ’;Œa4rH΅γΙώ ₯Ψuc=o?-6ͺEl7zνc_;’―_­QEpLΒmΙ {%4wo/ΐgoζζmš€iρψxŠΚ€O;ΰ 4t t{ƒœ1”σΖΤ¦YΝK”…$bΒی₯ o’+rΚ.΅{`3ΐ8HeΚΚS.~ΩΝp$Θ{$Κ³ή Lt‘ή?c$(ΡκΕX«[hT,G³³Ε(θτsΚyŽΝΗy€‚«E2 2”ώ΅ŽεL­7€s)K`˜œfK—VœGh,£ ΕA+ΤΧmΉjβ+οζ…i\΄ώΔ-œψSωz΄³σΡΞ+΄Ι\|r€―Ώ_‡ν6Ϋ?ŽP)’^­!ƒQ[AΕH½l’ݏuUΠΪΕ©ΖK΅ϋ1Ϊύa,pcΓΠ]WΧαp-ŽœΛw9Dˆ[+ω)ŽΎηpmΛ~Lmp`cΙ& Ubχ(œk?<υy4ΚΦ–ˆοЎ°ίz<‘9€’’­eK6£„εξήιώ5q|xίgo_υωΤΈ{*ρ΄€Λ Ξβ‚+Ψί³‡‡ι_A’‘Keg#R­ϊ)D*d’TJ=*ε&…]_²qeΝ%i‡Σ—/Ϊg2KNΜavš!nlΈ¨L¬Φl<<\Ό€)ppj>l£ja΄?ϋ5ΚβR]Y₯»ΰQ’Ζ~HΒ©Ψ= q܏'ήςΏ B•k\@φ}vBŒd"bš _}οS―φw–Έ ­xpŽcό1ΉΎ„‹MηΌΡΓωg ιβ»x‚HpmΓŸ}#ΗΎυ£ξνπΉγ0Εέ½WΧI"7η;©Υ±Ϋ υhRΙρͺPλn)Gτ?šap¦- 9*Ζlι=Πψκš‹FŠ θbŒ_+žJΡΤ]‰ύγHΛ/ RE½΄Jsώ(ΑΓƒ`!#aV0l4%ku vΣ9RlΆc¬7ζRS[ώ$^βΰη@βsΑGίxτˆ%―Αqΰ`kΕΡϊΠͺεsςjΝ’Xάk…πŽυΊ•šq@›ϊY£ΩŽP-hH―€Ξ ^¨χ¬ZϋΗ=βq6*Ž#=3Rν0ƒ3]ϊ©Hςζi <ΨΰΪΤVΏ΄βΐSuΟ6Η‰‡‡!Šy2¦ΨZ&ΫΰEϊΊ P¦.ΐRΕΔφ!Ω«YWΉ`"οrM%‚^ΧΔ8κΖθHRX΅Ί‚0…mIs Ε—uΈvΐhγ?hGΘΉΥ‚ 0J$μˆeΖY.ψκ»a[­3D€Έυ­s£ \(ž?ξγό’'o‚Μ Zζ†@₯hˆ―½Wΐίό;8ŽτΪθH-5Ϋ#£n€ωϊL*—9—Υ:δΨΤIHR’Α©b)k~‰ΆΤώο |²3†mrΙ&˜¦™Cή#WA…'³LŽ›[’˜:γ E )Ϊq"Θ2cĎZ*K&αΏwσoT,Ϊό άΩ žΘ)π“ν€}ινzΰ3%‹x2R<<ΑΓzΓF£2IN›£„”Ώ»ΐ±9ς.Η•U~8Ζ`tΊg€šλοEΈΊζ V2Ρ¨˜Ψ?^< ꍴϋ1–«Φκ6<)δIlUιQŠ0ΘKu©ύV„CΙ`ςύ“ThΡΥβ―—Ll6lδ%`&ΐέύ~Œw―ενP5'ϊx_x3/Φ–.ΞJπΝs'ι\Δωγ.Ξ—p\Ψ?•PΔ[—\όθΞ;Ν傉JΑ@£b!Œ„ΖVν4Cμ·B¬ΥIŸΕΰ yΟΐΫWi4pΨ&“’G•zΰοδŽ+PΘ^J†γC€hχ‘©έ–ɐsΘΌH½Ÿ <ŽZ‘π$ˆψω‰φ&X©]°3HppN€Ή#d΅’‰«λŽϊx[ΚΣ?ζζ―0Κ` 2Ψ{ι€_΅έfž:gΤ¦ί?Žfnώ*’TΰώAΣ`ZrWΰφ?I™½ˆƒq‚{»>nn‘–υ΅uͺδΟβϊPE_+¨Ml4t‰Jυ₯(œc ˜7“ξ{Ν΅f*]ϋϊ£>’xϋͺG`ΐ‚‘Ω*„ ™X­δ]o^ςP)˜0ŒΙ{§©ΐ`”`}ΙΦ:{G‘vGΨXΆρ™›ΉG聱0ސΗωZΟ„ kΰ§ηυppαψΤΒ±˜ψς»ά?Yo˜ΰ¨(-}ƒΣ†ά&φδ=ZγRiί»! Ίv?Φζ=γ€Š’“ΫcΠώγ Eg?²+=–α8…%΅ΣTΰή~€ L΅j«mqΈƒerΨΡ¦‹Χ i%μζZ 77=ιΡ2ι„±@‘Ν°8 / \[wαΪ#?Ε';γGFۏA$πΡŸ]ίpĜB1» ΐ_Γω™2O-Θψ,hΉ₯ψd;ΠšΚ‹"IξξωΰœΪ+€φ'pΐŸ”Μ š…»‡¨okΩΑέ]gQ #δe›i}ΙΖ½ύ¦δ€*9Χ€k3=ƒW7S’žΰΈc0N(N«Ό{Cš™•ς JΪbb ,ΠιΗ)V$΅d}ΙΖRΩΤ³££Pί”ΆΕπεwς’˜ϋΤkύ?nά)ž'xz(/pO ΤI9―σY/Y I38{%ŸΘTλK–ψμΝ~ϋ}ΦξΣΨ³ΉΞrMƒ@|ΚΨMQΆΪβD Q‘Ρ©ΏΕ‰€ΑβDLQm“i Ξ€ͺυ9p%ξ‹sਛ`―EBAj½Urξ–ΒΈ€ΫR+™ΘΚοΊ€£J „˜Έ¦©@ΙΔ &πωjέFNbθK3£yλξYόnξοθ V).ΤxD΅ηύnŸVpKžΠά>₯μξnpζδ(ŒξμψΰŒa©BvΊqBΏ³ll{-š‘―Φl¬Φ Έ{4˜₯”τ†“ΆώJΈώ9iτ£ΪϊŠ‘0ςS Η βšzά‹qΨ™t:²šέA‚΅ΊΞΛ΄€IDATάΰŽND XŽΝ°\±°V·τC5RμGΨ;"œΑj΄FΕζΗ½ P2ΐΝ-o\Ίώ=AΤ@›νsγh~έΐEΰIcΰ“sγ₯J‚PΰαAΘ 9υ²!l“½r7cΐηήΘα£>Ž#ucl6μ©ί\v„γ0…!Ώα8ΑN3ΔΑ1ΧVΌͺ°©MΌs-‡γ^„V7ΖΠO'ΔεΟΉ€όwά#pτΌΝ³Q₯γΕ‰ΐ~+|D%0IF| ‹@„₯Š©έR›ν~ ΫδpmFtlƒΑ4K`› ŽdOhλY»_C²λ% aL_[AQΣ”Fq"HλFLˆ¬κνq?ΖƒƒΥ’·H  bόƒσ~―O+ψyPϋ6χDO;‹νnφ5A,p{Ηη.j%[+6)α΅ΒS7Έ$%D§g“Žώ֊ƒQ’έ›ΦPPͺ¦(€‰jλg%vΣ”d,G~ŠΑ˜Ό”r•i΅œ§yT»? T#Š JI0ob€¨—ΙšΈ˜3¦«χφv" laZYK]Γ(SrœγKoε…m2qFo€‹ HA›Ζ-ΏyŽγτ@Iΐ_τzEƒ΄ΞK,β%ΡchΆcΦ€θ SΦι'XͺКdμ•ΙΣ π‹oερ·ΏΥa‡ΗδθXuΆΌΛρΖ–‹f'ΒIs›‘ŸbΈΐRά”&j­Y„s”τp΅dΒΰδΎ:‰%@Ζh+U*†Ž{1:ύΩϋ‹’οU2ΑJκw0Jpo?Π’ιœ‘Θš!GΌΆE&pŽΕΰΉLƒTσž1,J<[)gΠQžœ¦τl)JI"0-1ΔjΌ pΤ‰Y’Bœ²WώCώw8ηΈμi$9ΠLβ€8ŸŽTwv„±X8ŸυΕωQ*“•‚Λ«Tœ Ξc »Ε;»>ήΌμ!ηr\]s$T οP/οR[HJ²¦?I*ΑŠ‚ΐ~ιf ’‰² ϊ’ΒX Ω‰PΜ¨δ s†¦’d#ˆΰIΑz™±8§μ°?J€πd΄@ν5cϊσ1b(ΰŸ2ϋΩ\Ά/6'w°ΰ>>CΔΎrΒΌˆ'‹ΞοΈΐ:η1Ξ @œ²V/fjϊ)€8ξ%X™’”Ÿ€½ ρΦ?Ήλΰξn€fgΊ ΅7—™ΧB€΄I8§ΞιΓƒ₯<α­\©“ΚΆώOZΖ3PΗU ν·"μŸ†κ)z†N“Cΰ”ΦŠτtQψυf T(ήΨ +zE=οΈ6u† ΞΰΨ„90$λ‹3ϊ7ۜΰ%fIOα?LΩ6€­Uογœ]€§‘άI©Ξ ΥώΏΏ>.0R_¬‘OIΐ[.Š9WΦ\Δ)p”1yΘ^)eΩ¨Μ&Τ†[π Όs5G\ϊ ¨SHN©€K³ ?L±Ύd£Z4Α9‘<³τŽ“7d«c­ž"η%°3˜tzΓΚ8kε\.Ρ”Αξ‘ψΡ{ΧsΪ¬Θ’~܊‘"NŽ#$C£V2ρω7σ‚ΏB‹‰όμ,Žlλ₯˜~$3>Η1>Α…"ΰyBα(Ξ·@©/τϊ')px#ާνf…ϊ£#?δε‚!yŸVρ½πΘ»\|ι­<}Œœεͺ…ΖΔaP»žΤ³IH@ζΑ'uμ2Ε£J2Lƒ0K6'!£οΡ¨§όofΔρF—ν'ύ>Ο›x ω?ÜωΏ@o˜κΉΛv3\HηΛ~):sδΚHRV7‚k“ΕΝ-‘ά4 %λϊ§³(ՈSΧζ€7pΰΰ8’  θ/κδԐδϊ’εŠ…£N4΅ρž<χ£N„•*Iώ6ͺΜ~Œ₯ŠE’ΑRά'N„nνw šνH?@© Γ’‚ΗQ/Y3ί'ŠI*XeŸΛUο]uhA(p؎Ρξ%L9u5Ϋ1[oXjTχ"BΨ9ž'8mΌ ΟρͺGη3;1A\ιQ,pΨNΨiZτŒΡ,ψ¨“ 7LΩRΕD­dΌ,±™αXL|ρ­<ξξμ ‘\˜πΨΓ~+$?Yν^ZqPΞ›8μD°$r8N'@ έ Σ Κ ΜXo£V$Γ3Χ&|U)o`mIhUΥ‘O2ΐœcτ»!«wεψΰ  ρΒλzΩΔ•5W―Χ·w|g§;ΩEΘ†΄aZœa³α`­nΑ0γwv!Ψ»Χ=œ"γώˆπΫOϊ]ž7ΈŠ€'ISc»Νˆ™“ζ5χφ|νκ€ζ$ΚώΧ‘σΕ³WT;Η"Ύv:~θ/”ϋeŒ¬{G!»¨—,ΤK΄‰gι}<Ο@½d’ΰN΅»Ž{ΤIθHΘΆθaq-ϊΜ#_ΐΆ(TZI"pg/@š Ԋ¦…μ4Cέ΅X©YxϋͺwΞ―ρΩ“IL»—°f;aγ`ΆC”4Ϋ1ΛΉφ‹š… 5πΞyœ¬"ΰy…ŸΆPηUŚI/μCŒ‚”uβ'Ύ‹Gΐψ b~‚εͺ)Jƒρ—Œ9hΐgίΘ‰·}6§Ψo…ΈΆξΒs86W]œμ΅"QŠΝeΫ((δ τF‰.9'Z 2ϊΞ Žθa’Ω‘nΓ[— #KΚ_Ξ%0χr•” ‡>±ϊ£I"°΅lλΦξiδDΥΎ*?S άΫσΡ?ƒͺμ©ΗΔ~ΈΊξ’Z€ ΎΩ&Ϋ`…1‹SΰξΟή½ζ‰SΖίπΏΗκ—œ'0| ΄SA›σ•5GΫFΐRΕΔReςΦY žmŠ?Η£`βψ€ͺy!Φ—l.ΫΪY―Ω!Pά,žzŸ£n„ΌKσ ₯²…Αˆfπ§Εa;ΒRΕB9oh³ ˆΐk(ηM,•M” &“MΌ± όήχ§5―Œ|΄Ψ ώ˜ύ*Sw$ϊc’Ε\ίpΑ9%'nŒSυ_.Ό|Υ?όzΓΝNŒΑ(]Ψ•’¬2HP-/ςγ\lΞ3‡ώ.Ιώςff/g€8Ώ ` €ψb>€kΆcvV#˜Y‘^Χ¦ˆ߰Yͺ€v/K€ΨhΨβ-—}χΓ:ƒDcsC*ˆ±Υ&Έ±ι’&7ω­e μhχXC1G<ϋΞ ~dLύPΙ\”²ΓvΜzƒDtN{v’8lΗ¬γβ$ψ9Ζ›  ς< ΐωϊ.:}œŸ° Jžϋu—Œ'Ρι§O­‰•χΈpν—kσW‘Ί>πΩΨ§Š[ΩρͺΰŒDtΖ!q˜ΞδX ηḟΐR86 ϊtΙ#΄?p¬ ςΏ3ˆΡκΕΪXΝ0Θ Ά$eΦσ. sςέl4lΤJ&†~Šή0ΖH% LΡύYvš!φΟξ,»(j%ΧΦ]-^τπ ΔN3ΐΙβH ν4CTKή"‹ΰ_Ζ H>‡3X*ώ $±ƒ8¨IΤG-ςJ:χδλύŒ@χφΘ7`ΉbacΩA”ˆSm€Γˆ2ΊœKβ?WΦΘ9pfˆcA΄7P%ήξΕX[’±p£bκŽι(Ϊ¨'BΠζ©6Ξƒγi…ΐ$θτ‡ φŽhΔπζeOλ$©€mZ[ΞΣ(:Š 36%ŒSτΗ Β(E£biΓa;Βvσρ³‚1`₯jας*Ψύ0Εύύ‡νhξ±£Dΰώ~ΘήΊβ-‹rΟ€'Ϟ'ψ&¨Υ6WφN€ϊ< Γq‚(Έ²κ ηrάάtqg7xΔη,%”8%z`₯Θχΰ ΐ ₯ΌΝewvό v€3ηp” ΄™r,c2Œ‹b£nŒV—Z\‘l[©wcΉb‘^Ά4γ@©ϊ­Τ,δέ πΈγΑωk_[§ͺ>«Ζ½Q’Η KUo^~yͺ0μ¨γΈ—0%Mό$e@σ8ζ₯œ!ϋ… ‘K δφοŸγ]$π7^ΐωΏΚΡ]»σD/{AUiŠξ y*ΥΏ@ΉΘΕ Ş¦|FvŽ{16κήΨpρ@Ϊ€TθμGhh}\•.ͺ€c1\]s°ίŠΠΖΩo[ ΛU œΗ'(ΠΩο@½―Jΰξξ֊9#zRcΕ± ”r†‘‡±@t%ΕB)«66˜œ —VlΣΊ6νώβύšΖ!ΖAΚςξB‹ΰρXGχϋϋ{Βb3΄μ“φΙ &μ·BDqŠkk.<—γΖ¦ Ï£ΗΊαθ‹Ί½γγ–tΌΊζ"ŠΗdL±ΰ΅Νv„‚G3ύ•ͺ…ώ(ΑQ'†ηrT *Rι³%½PΩϊ A „$ΨmŒΣGZάJά§^ΆPπH>²;ˆQ-šΨ\&EΫKR‘7°ΩݏΑHΊΚύ8e6τά‚1 Rq؎y’žήκ?-όPΰ¨ccωΉ‹Ή)"Ζ8Ÿ—Ό)ώΕηύ^ρθ8o―uλEœxˆ5MŸ,ρ=–Ι°T~y«„°Δ΅ ‡ύρ1Z½›KφΤ9/UHΠΗ±ΈVX&ΖkA$pλ’§q–«jEΗύΗΔxͺˆ€T•ΗΙlS9!»λKΤ‘=κ’ΨP’ΈPΙ»6a―ΘΨMͺΑ y‡im~ΗβΈΉι!ŒR Ζ)†>1;|I+OR*€h~JS"XY°%(₯?Js98c°M AΞα(卩++„°ΘC­dβν«/Oυ/§μZtϊ {ύΟγ^Βͺ%CδέR}@T‘>i|²Άπr―α/S|ΊfOΓρά£ΥMΨp|vnω’ͺ%Cδ_ςκ_…e0Όwέ?τΩΑq„FΩ&΅Ž₯|v<Ν„-}N‚H Υ‹P)˜Z*½V2Ρ$p€\oHλπΌλl K6‹uvšα0˜HχG Ϋ ΞPΚΈ±Iˆ8&ό‰ΚΓ ZœPΝ£XhόΐΠO΄A§Sμ3Ϋ"κϋZ’‘N?Ζνέ€δΫΟxmƒHΰΑ~ˆ«λsq­6ώYσqΏ»'MΎ κΜ `ο(ΒΠ?2ΡΔψθα76]Ή »ΰŒaϋ08“}oφ=;}j£__W’Α>Ωφ5Χ_Οσ9ΡπςG₯@ΆBf|=1ύQΰΐή Ζ8L΅μξXRR”Ηυa;šI Βέ!mςΚΑO‰Wμ4Ct‡1ήΎ’CΞ₯Νu8nlΈ «>Χ( σPΝ·Έ’VzΉT Xͺ’?JΨi–Νg‰088ŽΩεUόω―ƒ+ zλy€]°ΠKτM½Τρΰœ―·°`]z!;μ¨ύδ΄Ώ“a› Kγ•ᐠ\Zu°΅lγφr7d@–-•'φ»5Q…ε( I·NpgΗ'ŠtΥΒrΥ"Υ²IZω²Λ₯AΛI   ?2qώwBν•r2¦^ϋqmŽ4!ώ»Τ φl*Θ”Yœi0X.Cή#™ή$%p{Kω€ŒββD`ΉjiΧf']A(+IΆCF–Ήp$ϊeΠψς±Φ¬'I,_q¦g.υ‰ξο‡L›ι,Κκ>zΰγζρσ/­8ΰxx.δθϊƒγΆIŽOKezάέ ΐ€©I<ŽΕ΅Τ’nέ  έqoΟ'„hF]J;@Fυ’ Χ‘κ^Ρόh €ZΙDΡγϊFUΰ•½Qω Ξ0Rδe+ͺ\0P-LƒίθζρC&.xo^ρΐεHβe !ΘΖ³”7D»ώ9(Π$¬7JjΡ87ηq> €UΠΰΌ@ΐ}Pp§‡ΐω%…σΉžτQ7ΪίΙ¨– x™ςϋS―g3ρξuχφΆί Q“Κ§–ΑΠκFŽ Ϋ€ΠψŒS‘G2ιTπτ† AŒ‡[*›Ψl8Ί£P/[Θ9ZBx0N  Χ&Ήvƒ~‚ƒγ³5“Φ—,¬Φ€dq+Δώq„$%0bΐ^k’RθΪD9χΨ&“N°Œτ_0qsΥ­1Ήώ•σ&Ζ&u biJw’έ6λŽΓvŒξ A£j.Zo@ωΕx’ b)ŒƒaΚφ[Ρ™Κϋθα76Θυo³α€3†ϋϋΑc%iJ΄ jΟ[X©Ω°-ςπΊ!›θ ŒFDCμ’μ-›Θ{œ³Ήϊ $tΨ‰(Ρ¨X8”Αœe}ΙF΅`Β0&7ƒJ,‘΄ΐΒ(Υ`–ΩΤ¦`R·A©_Yw°R5_JΗ?ƒŠ‰ώ0ΡsΎσD’’Dp1Η…ρ86’η ΥR»qΞγ AŠ€_y^'ώ QwΞyœU=ωωτ(eΗέ§όΧfhTΜ—πι^ΐυMR΅Ϋ9аwβΚmψΟ@” #eΧ͍ZΫύ͐$΄ ³qϊR@m}ΙƒQΡ”χ8ςBΈΣqԍΠ&X[²Pπ Δ±ΐv3Π"C‹ΞΉ^’ƒsI?8 α΅“κ°q" FΐQ7g4ϊ°,²Žwϊ΅R0'Š΅ςΆE8€4…ήψύ€|gΒX`0N4ν]‰ά‰Μ(aθ'Ψ= ±\ΛŒ˜μΛΟ<x ŒNθB.šΣΜ|€€}ψpŒλλ.κRJ—s<βΊ”ύΤκ†1€Š`ή5PΘq­:Ε΅…J‚ŒRTw˜`δ“€…΄©η=R&ΌΌκΰΓγGζUΩχ>lGhTΘ’r΅fƒ³+5š[Ω&C*dV› md in`ψϊ’cΑv›!›uΡΟzAƒPhNώJ•x’œ“Λ”mqσrGή5΄Ν°ωΕ©ΐxLU~wμδ έhy#‘JƒσjŽ#”ςδn΅Άd£;LΠ9‘¨Α+99Η@_2—ΟΓv„Γ6Νν… Ξ†Pw‘R4ΡΔX«ΫΈ΄:‘HNeΖυ΅Rμ·"ψUήΌμ ΧyωΜA²AŒ.ͺEηΡCΟήγ@ Υ±Άτ\iΧAτš?>Η1>mj/D˜ζ‹C|ςyβ:hM{ζΧZΡώΤ8οΌΑ,Uh¦όͺή(BυŠ);μ»1%[•UφŒ₯X›¦ΈuΙ#ZžΓρζ%u"$)$V‹ΤQ»‘ΙͺkΰΨ?qiΕѢÍ`Kyc žnυb­=Ήvo6lΤK&”œaΟ#σ[-˜ΈΎι"οrνKsКΠΩ}܁ώ8B¬‹XΞ‘ο² ‚κΈR―@ŸΫ–±ˆxd„υν³žϋγ&+ pΤΜ` #€i χ¬Χ4+²` œ3tϊ1*ͺμ—e…ΝΩό 0&jΗ8  …Ίω€«kj%²uΌ½3ί(–zϋΚuꊍ‘ŸPχAO΅"ν/«ES‹[)u|o/@³MÈ€' žjΑ€΅ι‘Q1apR4Mƒ1ݐΌz-),„ΤΨ|aηœΛ5Cτ†Q σΖQ'arAxωeηMZ $ΰ…pΣ_±Έσ'7πœD€Z„ FOGςW²8x΅«09πΦOόδξ˜υG‰φKΙ†žρ‡©ξfΚΒ77]T &vŽB,•₯Eξ(AϋΔHYύV2RTπγ^ŒJ‘ ΩHΕΖjέΒpLx‚v?&ZΆμ,7»φŽžœyZ/›ΈΎξΒ•†Awv}ΆgοδΝ’€€%ΖΓq:υ39—γʚ ΧζZζΰ8FΉ`Μ;₯bϊžaπ€Λ˜χ€IŠΫj@‚…ςΊJΦ²h>’si†’sΉΞ| Ξτfͺ€`γ E§c€ώq²αg/’ϊuΏj+ίεͺ…Q@­ώy_PŽoΠΝΈZ·±w’R4±R΅P.š:8ςi£—,86ρIO*¦θ¬Τ ΫU ΐΓγW₯ώΑZΝΦγ Ξz5»Ύα R|Ή¨σB€Ή΅’‘ξ·β§’ c£Ξsu τ@–ΎϋΗθ‚$ώΉœρ«‡8Ÿ€ηΔB£ξΣ£ύqFZΛ`―Βγ½0„ «ΰ΅% B6'¨ΫτΊa0Ԋ&FAH\ƒ!I¨im]­OΦX€ΦΙy…D£j‘œ7‘HπχΑqϋˆ ΈzΙDΉ@L­J$€7€„»eR·φαΔ—±Ηοδ4ͺK A άήρŸHΝφ$జ'lB1G›}wΰΏQ°›Ξ’υOαώ}œ1 ~άΰK …qζΑ…Ϊ}’Γ­Τ,δ\Ž{{A&@¦ΙΰΩN†NαΪ\Ϋ+°·ΘώRžͺc?Hρΰ Τ?ΟύOE*Θ8Θ΅9κe[ΛΖΑbΉΰƒvˆ²¬τ7–¨]”χ ˜œŽ7 ΰ¨3iυo4l,•Mμs΄Θcq¦ZWŒ» Ω‰pŸπJtBΫ> Θφ]fΗfxγ²+ ώrQN‹zΕdν~‚ Ύ^ZΈ&7?Lq{ΫG«χΨRόSΧΝ`ΐjέΖΦ²Η¦}bΏbϋ0ΐ8hvbŒ‚”ΛΏ ` @σ,οϋ8 € Μ]Θ’Tΰ˜ l,Ω(ε άΊδ‘Ω‰`pά’ΙΰXL;ͺƒ©VH¦ω)FA‚Αˆ€‚(gΪX[²Q)šΈΆαΰφŽΰŒ-ζP=\'‡ΌΛqeΥ…Œ1π§U™Τ|?η>t*oΫ2$%A³α¨“»•|bΈ‰ώŒφΙ•ΠΆ6δV¨>σ`L]$u§Σ_g*€ή(ΡφΘ«5 λKΦσδΒ?•p,&κe»Νθ©TKq*°sΟεΒ4ž π=°μθΗψ!ΰva ˆRD‘ΐ(˜lψjvΗΣφŒ @ š―ΐΪ’₯2ΒnoϋβΣE8wޏ›3ΰʚƒ’[!$―³”7Π¨Lζϋ t΄ΊnοL”υ±ε¦ήξΗX©YX*[Ψ?Ž`›”΄T‹&α#ΊιΜL΅_ΜZ#[ηXͺͺιζ–+<‡Ών“Q+hχbŒ‚σ ₯HZ :ύSE1žVl€²ισ$Ϋ A kΈθΜ‹ηΧ(β8j?=ڟԭJ&χu !€zΙ—Wmφ£Ϋc΄ϋ1Vλ–^ϋ!`L·ψ‰PΈ œ€ΗbΉf/‘ΚΑq„ύγ`₯5p«£{ νΌZ4u'’Ω‰°{DπΥ’)Eα\›~&’άόξ0AWŽš =»ωŸΥΤ紨 \YuQ.²‹γή^€Ύ€ͺD)φ[ΆVμy‡R8€ΟψώYήϋq€MΠ‚8;™;”ς&„'tU/„Π³ϋTΗ!Z]ͺžOKΗfζ0³ΎLe L’!0sSž­^Œ\3ΔεUn6΄CT‹&–€q)ό6O:<κ`„3΄RiRQ/“Žυ WΫ §)pΨ!Ήΰkλ.αŽ%hώŸqΊƒ‘+rΧ6^ πί¬°-&U’§2ΰ$Z`ςgοO~€ΫΆ v>UθC­¬Λ™°ϋ1v‡‚•r2φ§ώ!¨ͺή‘ώοπΠώ_'ΨΈZΟξύ›Β Ζs7Ύ—δΠχ½œΧΎΚέ?zƒΘΗ;»D8ο…(ηtθ:CΞαθ/ζtαPνΠ“Y‡πWΓI”ξμGS©λ’’Χ©‹j’O1«γϋCg½Γ‰xΟ&8ΙJ œu ΖοΏS—Xb:'eΏσ^KνΥ­TY6ΛΆ*ԁN¨ηγΉQόνj$Fu‰όϋp*πζΜΓx&nΌ―Γi„™Kš2kβ$ |o@7ι»1;νXC‚zOBΔΤ¦ρ‚w,δšydm oΞ|xΑνm4E,ρφœΜ$vͺ&šRJΌ^’ NΌB‚V  Y-€$ˆΟtρςΔ»t.Λ§tΦ QΞΣ}―nb4‹6M1§α A4ωB'»D& "iκΖ(η‘’ΏΔy?D)―#«Fa˜v2Š9 ‡-σ‹_ €ŠYε2£ιύX¦‘bšζ½΅d―‰οAŸΥ΅VΔ+Φύƒ"ΰκƒ:%ΫDωCœJt‡"₯rlJυΉ βΏΫλBcΐ³}KώωOs6ž L\r^G΅Έτ Υ¦(YWλ%#m¦ 9_Ζ!/`j€F΄―t³†Sσώ’(d5μΧ‰%ΠG8ι7~ωb@ ﲄHp^γ©@Ζ!Ίϊς¨@ΔΔN›y4&š*=šHΘK΄χjQΗ“‹Έθ‡xwΎYLpg½Νκ΅]a ςΔψhτΈ66-κvΧύΑT΅QΦ]DoΑ b<Ω±Q)θiλύΝ™ρ|sδ$"AΖZR Œ%IκrF•Ve‰ ͺ)*‰HŒg:£ŽΙqΨ²ΟhΨ©x{ζ―όx!YψΎ8pPΘLκb’U%ΉbΣ έ|L­‘zΙ@)§#csLrΥR†DΙœvC\ 7HvGaJyΩ―›(ζ΄―’E¨i$<ίO€LbVΚ Yό°΄ΐHΘg›ΰ'm<(^ml·s·@»žAΔ]ώv @1χј,Ÿ,$hL[)x/‘Nšϊΐ„1~:φ°Ÿ$•l]OΌ§!Γ1’,ƒΑσcόxδ‘K•L€ͺE₯aˆF™XYI{ύ&s «± ψ›Ί?yΟ ϊ:Λfͺ—Θ…ΦbLT‡`ζΕ¨δuμΥ C„G>ΞzΑΒ‰vƒˆb£Ky-©HΘ`C3³M €@-Ά•XΖ πϊ/I‚ΔρΘΕAΓΒN•ΆΙρκΤCot{4%Ωύz)-d§j"c/co_‚Š…±£?1G©Υ―¦1dlžΎvκΖθίοφ2ΙD΅@&{ ;¨PΉ>νAΗ\ΈBU ¦.i<έ%‹%ψα4BΦ¦9“”΄ϋO>€žξYΠ>OγŸΫΝ<Ι·αΎΊQ$qяxΦαρr ŒAΕοSάeλJτA^χ/>ΔI~αψν–Ηp@€{ ΅^±ήψζΦμmB'Ά‘όΪ…!ƒ Γ–ΙΞ{‘²L§έΏΖ¬žγηcrοΧ©γιΨκErYMθΠ”διυe87˜½qˆZΡ@³²(’φΊ”ΐY/€ ζm’y‘όg._²IΔ2n0uJώ…ΤσEιώςYΜ~b 1p -:ο‡ιΨΌ8λ†,₯Όύχ°†Ι¦ΐΠ—lεΑ€€έ}€Ϊλ"‘ ~sFνφ„γωb߁m.*’›"i³'†@‰…"c„"…zPcELΘ;:TγD@HΔdܐ±ι>jZ˜Ή‚€"Λοzˆ£™@΅h(mBnv‡Τ^šΉ΄PΜ=Ρ,B£DΞ€ƒI„C…^M‚3€@@2Ι κIrmΕ¬†ƒ¦ωU-šY.θr2ξepOςŸ1F“Υ£Rι ΐy‹cΜό€€«B‚@€ΫDFύ»Χˆ%ΠD7dmt±ΘΨLΪͺΎΫΧgΐΣ]Kώ»ίΟΩΜ#ΊίrŽˆc@BB`25ϊ^[#}}GΓΡ…0’¨—ImΥ$:ƒ0Εh‘ΔI7@wD…ΐnITς:Β0F_i$―».κe#Ug{ ν?οQΏ₯έ HjXγAͺηŸ0 l“CS6τα?@γd.RE[?ŒSgΪεχX’ρ‚˜™ΖΪξπ!Έ–]³Iΐόέu„η½Ϋ‰½Δ OΈ9‡γ‰>~wξ#οι’oθ€"XΚΣμ'Ωρ'#§t4ψωΨ»δυ$ηϋνγ;₯π¨iα§γΛ~‹c§j’^&w*‰…Γΰ»ΆI₯JΔΔM­ dŽ9DT4ΘB†ΪF͊Κ`!dκ K`§fΚRξːώέ4€ςΞ,ƒΑ»'%5΅H³|–ίToΐn³|₯^Ορuoόn $4άς8uά³€’ύ±αDά+Δ„1 ŸΥ }₯ΰΏ«AcεΌ†ρ\ΐbdTρ“₯9&Ηԍ•50a§ΒH¦Έ€¬ΝΡ„©­{wbζ^IΘ ΡngH‚l›ΦTΖŠ9 ωŒƒ™'ΠFθŽBΈώj—ΐzi!ολͺΞΔΥδΏ*–Y3—μ|€l0!$&σš†TωΦ65”rxL°3—Ζ3Wΐ %•»dR΅(vDoα†ΡηsPπWλΞ{“ ‹5σ5Ζ?”l<½ύ €pρlΧB1§c·f¦Έ€δ&rNs£œ£‘˜#ιŒ₯A#I}ˆ˜’ψxN–‘­ŠIΤ EΗ;λkΫ+ŒύQ„S‡œ₯j%γΉΐI7€₯ζU-5ZΧ‹Α9KεŒ9gK샡κqZœ!qά pά πl—l#ΣΆ5#‘ ΌΘπxΗ„}YΏ›„i0YΜipϋΡ½,¬I›φΣ¨‚τκοͺΖKθΏΔ` {Ί­Π!θωάΫσ„D§±HάΝΥτΊΠ4BΑ+% 4Ήί0ٟ4‡λӚ˜\Ώm’ιΝλ39GƒμuˆuΥ((+κ_bžv1iΓuεΉ$€π€νώζœ:²bVK7^­ͺξ(BwH…D―υKςΎ?{©ŒύmBΣ€έͺ‰ƒ&1ό€ΊΜƒœΆE~7…¬Ž¬ŠΡ5†b–膱’@φΓcκΓ`ξ ψ‘DcmέmQφwqΐ.h°2(yNά»Νutεοίy8lYh– Τ‹,ƒγ]Ϋ‡1”rτ οdz]šτgΤޟ¨κ2V:ϊ XοQΛ’/σp=‹K‚: ppΏnΒΠYŠόO4¦;Γ'zΊk+!ηύπ%ŸYI Όk8ξψˆc€cˆε˜Ί1„BŒf޽ϊΧΥώO‚1 Σdg±ϋ€6φF‚•σštξΏ΅*A€]lWœ‚άΛψf–b Ί/ΫDχ(ΔyšLοΈ¦]RŽΙ`›_ΎιΟmBΣ€Γ–%βη9N/{΄KΦ5YI|Vζ^ŒŸOλ¨’Ou!£Α29›£έ`α΄`<#λHP«©˜Σ°S5ΡΣ|‰sͺB›Lƒ₯–™·Ϊ …aζŠTό§VΤΣ‡ώ΅ι^38—Sχ~μTϊrt†‚ν7ψ‡p Μ‚θ€ΎΕ1: °ΫFθάo(¦ΨήΈ‰{4[’³`Λc½{ d.5탍ͺ>Λ £4YG#o€ˆΜΟj™kœ$؁ΐ ΜΥi7€‘“˜iζhγ¨M3δύ₯ZχΗ o!Θh8‰Ο(©χ‚Η$Δ~%―“η‹BηΏ:ρ)Wάβ1%ΆΔOwνθέExsζaκΕ+ρΛΧ;™ \°šΖ`κ,U‘-dˆΑf †Α`™ΤΕ°Mε-·κ3/A£ΖAΗ›߁ͺλΥƒρνΜ1RkHNVΐ9‡Ϊ!₯ŒΗ€‘Š“νΌ/!ϊcRζ ΒΛΚK«ZAWΰηcίPeωlΧ†.†+ζ9RRR¨dΞ—P*γυ©ώ$R3%(ϊ OrŽ“~¨.!vλ CΞhTPΞλ菩ϊ­.'χε=π¨eIΛd_Υό9t!—α©φ}E±RNC!w―κjD3ϋC§-Žγb^ξ7―ψ[Όž8ΟχέaΔ\ώŠΣ$8rΏ${ϋ-DΒΪ©ψιΘΓd&P+Ρ8œΠΊW-κ) /ˆr‹šςgItU4NcΧ€ ΰϊ1νξs:b…°ŸΊ—Q Άj8%ž~¦ΗQ-h–IΌ-ζ$Ί.‘ˆ1Ηο ]弎'»D'Odα_Ÿm&QI3GHΜ…Β0€3ς=(ηΙΕ6Cϋ~Hͺ²kβ 3Ήξ6)~…5 [@>£ΙG-‹χΒ•‚Λ¨FCΩ²ςjy˜΅φθ!y!΅€‹ͺ d>šEj&w£hHšχ•2qlŽηϋ~ΞMυ €€X)§‘U5QRΤqLE‡‘3pΖFqšό—Ϊ`LT”jQOQ₯Όήϋε‰GvΒuEe<ρdΗ^XRͺγΜ<šυ€Φa·n|Υή±Œω —>ξM"t†Λ:¦δ|ϋγ]‰η B`›dυ§" πk}Ό·Χ {rΧΠpƒFΙ¦ΑΜύχιφ·Τξeίδ“7 &χκ~|η±Ξ0D₯@’i‘8ιψΘ9Ϊιš ΅’Σn²‘ *©Ύ;χD‡M …Œ†έͺ‰BVGGι±$ΆΐƒλΗ½Ι>scΔ1y$]‚Δω5‘xOζ]Υ9H,ίWεzΙΐ“] ΆIrΓǁς'Έ{$Ω'I)GϊIςŸ{€kπhΗ€S]+&υ4rΌs`α†/WB[8h’ήQ›vΛΛνnΫT?˜Ή1φκ¦βύsdm2KKΔunrk”,“αωΎBVƒoΫ>&Šβ]-PΫ½Z =׏1˜'ΑΔ%•A¨ΝγnΥΈφ{}ζ₯ΕmBΘΩϋ ΅’M[tΒO:‚0Foa§Ί6Wδ@Bfοϋƒ› €Φ΄Χ”{ΧφYΞ!U€ο\ BΜΌ8εΦΫ&W»izˆi—?sγ%eAϊϋŠξΠψ~ΞΕ“]Ί ­ͺ Σΰxyβ½§΅.Ϊ½΅ˆiπbίN¬8ΣΔ?™ \ Bt‡QJ<ΎπlΟF)§£U1qt±ΨόIPq“u40¨½ΞzޜϋiλhζG4cqθƒˆώ„d…5NƒI(°`K}¨ΏφUBטΜΨ'Ψ}Z….ˆCΏW₯΅:Hp›ΰ5€7 qΒWώ„o ²ήζ~„ώom}2ΔάaƒΙ‡ΩύƒΡŒψt¦ΎˆjΚf½­6Xω IκξTΝ΄+*„„3<ή±`+—>š§/Dό0Ζλ3Bθ?ή±‘SEc4jpύx­κŸ‘1<ή!·”ΐI7ΐI‡τgF3Σ.'pw‰ά36GΖ¦‚c:θ#Œ¦"γœςΗλSΓιvΦΐT%γΔ,n48Ίπ1˜Qh»ιP%PώώΧΧύΡ&@εΊ_2ΰξ€€¦ ‰w3ԁΆ%<ΗρŒS—( B!ίVΝσ\EΗ‚”ώͺE·ρςΔΫ₯K²”t+κ˜ζŸ ΄—ς{_ B”ς4ίί­‘ώBΏH¬)λ%γ’‘G/9­0Œ‰ϋͺδΕ0Dg@Ζ ]p¦ζUŒ;5CκΪΧ;O‚sCο³ϋUYKtcfEΏ―,+A‰ζ—ώνΗι8ίz0PkςΥ–Η©@€[=κHHt‹γ‡ΈΨŒΕδ·6OBJ ksY/ιμΌ·ΰαkœ‘U%δ~IΌ;χΡͺ©@‚ 菣K-ψdΣ'(@ΥΎΌc£’Χqά dyUN8‘΄a;j—Žν1N».!rO Ηβ€=“ΣΙ‡@gιΈχ§#χ^X#y‡ΰͺΚ+A(qΦ pΦ R˜dT>™ &b\z– όΎ³ξύn*žb‰Ώ?tHΪXάm΅£₯O€ώ8‚,¨nΙ.kVD’ψςΤCΕΨ­™(εu|wθΰεΙυJ‰n‚eπΤw —Ρ.ίhα§£λ» ‘8j5Π69ζž› σRŸλ+vAΉ £^&0 1k%z_) ρzή t’œ»£0uΌJζO_σόωe.u±λ·‰Ξ0b…‡mςϋ8Έ͚·΅@Υψ?Όχ ώ2Γ±#Ά‰Θ­q«Œ›Μ··«Ύ.4˜ϋ&ΎΪλξΑ~Σ”υΚeΛΎ‰y\Ζθ CLζ/φI+%‘YO0RΛΡ¬˜Θg¨… ΰΨΥQύ²Ž†ήˆτfž X<φH›6xoΞό•Ž΄‰Jl΄LŽRNΓnΝDΞΡ`θ,]§u‘Q1aŒ—Τfεζ…€”δˆΨT»ώΔQv0‰pΤΒΥΝqwΑ b–±Χ‚žΏΓ³› €g ΰZΈv€h‘X˜„‘D₯@ν“Α8ufž|οB6 !djθ$ίοχ<’J.kQεV+ΘΪœΡθ!ΩΑ³²jlqŸt’Qp πdΧF)OΦ“ω 9 F‘Δi/ΐΙE€\FK[ZΥ’Ž“N€jIO%%Ι™θIΧ ŠQRΨ£\ψ Ζ6ŸMHΰQΧ Όwί‘PΉφΧPeξbΔ[γg 5–ϋυΊ˜b{ΐlY‘dAt΄Ώ₯Π4ΛΌWvΚυ’Λd©KήU|#κ€ΰ»C ?4-΅ύTC%kq΄*FͺΩπξ"P/E”€3$ψSΜi8ο‡Έθ‡(η56ˆ‘ΥGxsFΗ[λ_“tόA p¦r‰Δ° –Žvͺ¦nŒα$Β`aξňβ…τόu‘Ο\ήυϋaΛΞzΑZ<ΓLεΪβ&ΐlΥ/o*jλ~ ɎΪϋρΧ§Ywς`Ϋύϋ BSs2Άƒσ^€“ξ’•qΫH<#!ρtΧN=4ξ₯*Kω¬†šΰwL’DB’?₯`ΑΠΎ?$‘ '»v*ΑyΟ‹iLsZΚϟΉ$œpQG3ΑT Q’nCI<ή!^j25†ƒύ,鐡κH TвφΧαώ·IθƒcrιzβƒμΌcrA“ωϋ³]έΔΆΡ €.€ €WΈA«|ƒψTά™SΪ‹{£^ Ϊύ~«σεϋP/Q{ίυHξ7±fƘϊ'‘u΄”š§q†ύΊ Λ`xuκ!%vk4Bb$,­³~ˆαT U5ΠͺΠnϊqΛB£Dώ-šΖ0Qμ°ΫΨΠ'*›#€μΧDΘ:Τa.εHσΏœ#yί½Ί‰ΙœDκ†SΧSŠƒͺσPΟ›•Λ»ώή(ΒΡ…ŸvΆ―=?RΰΕdFΚk"―ώέΊ0@_ΥοΟΘ›ω§#ν~ άβwnγΥ‰‡ΡTΰ°Iόύνάί-΅5ξς!Ί„ρ’xΊk#kkph$Ρ„B‰α$B{b<)0/Œ$^zψαЁm‘₯ΜίljΤ,°Mžz xAŒί½s1UtBͺ^/*yκ|<ί§JΌ<ρP)θhVŒΤ€‚p’Ψκύφκ¦Τ΄ogFΘ‘q?ΤΚ*9׌e‚o/(A’ΐO±]p Β4>ΜUQqŠk¦[Dω/T΄?ΦFV™GB©˜~Ϋ#)Ϋ$€ΫοίΡHΧ2΅T-5ηhh” tG!J9Χv’Ύ^2Π(Π8#ӟ’r^vϊc άσζΜGa―f’R$O©$v»#rƒέ$£QΓ£mάΑXή¦ΐAΓB]I1flp8λ7Ά`ϋ υF ΝO[μ 3έIΟ½½1i=Oέ…ίr2ž Ό>σρl_νΪψιΘ….Ξ§Υp¨θœS’ηœAWjMW?(£©ΐΜ(d5p¦T₯N©;a[ό½ΏχAJP‘Q+.,,Ώ‰`€£Ζ3βš“„ §BVοg΄’πΐo‹c ό5ξYΌζ  ΆKˆ6nθR‹X‚] "ζ‡nχŸ„a°ϋWϊΓΠ™lVtόφdOL€$4μΥMθ:#σ΄θ Ik%Š$šUZ)ζΘ`ξΕ8λού’M"α#—Ρΰ˜q1žE8PφΏw,δ2οΪJ΅iƒ NΪ&ωŒ†Z‰n°Ύd³(%Νμ:φ0‹…ΰ5ο C˜Γ“•‚ŽΓ–—'.!S+&vk&,Sυ†.†!›rΗ~Γ$ΐ‡šΑ(n{J+"IͺΦ–%‹zxBF²G£l|;Ι_…©3Ι>˜8ΊˆΙ-°εRίN‚5AΥώ{ώ[ΗαΎε` Εi[eΔ<¨#sϋ`ΐdΛαδγδeNένofΌ·.šΪɏ¦υΎ‘Hύ6HΥυ‰&F―ΞΩ\ŠΔ~ƒ₯’fB`όΉ†5EςΊ`gέ ‘vΌAx3ŸZ/ηύS7ΖaΛB%―£^2΅5š₯«–Κ{©’Έm.Έ™‰Ρ@mώρLΐΠI22ckhU ΌN’λ qΦ£Šm§JxH K½W"?y ΠξSkFγΐσ}₯i7H(žοΫ)έ/ρ΄fGj(΄ότό0Nυ a|K B5ba‰ˆΖ‡Ζ―1 ΤΛ›_ޏ@;Oo‹cόHQπή lΎΐ°}!”Ε;‘μ’]’μ~ΘxΨύSHωm±4Ή:#Υ”L{8gͺ£JΤl¦(Ϋη=Βb² ι8wl_ψοIξ²%ΊŸpΪ ρφάƒap4Λ4NΘΨdΊV-κθ #΄ϋζ^ ]ω μ*c‘αDΰε©—Ž|oŠ€3ΗH)οQ$‘s4€/ΨqΊΖχΪ©†r4Ν€pPςj &D,±fsΓ±f”ΏnEl€ΪΧφόPΎ·«½)&ΐο\΄ͺφλ€mόbίF>£αψ" DΎš”ι:νφ“YŠcQ»8^jσχF!¦sΣ ₯½jQΗNΥcΐλS7QΜ„x{ζΓ±(ιο( !H°ηψ"Xθτ+κE­₯ο3˜D°Mzο”βΤΪ*+E)Ϋδ)ο4}_‰…QΝͺAϊ›ίΚ―"4 Πσό»C7‹AΔσYM:Ϋίγ_‚ΎοΆ8Ζο@³os‹c|ι! ΆB) γ΄_·Π¬1Œ$Ξϋ!ϊ£Ή u²ŽSg¨tT :ΒΘTN· \φΏI@„Ix~Œ8Γϊ ηc\Γ:ZWT@ΥΓΚ10GlΉm²I0Pυs|`:ρx‡€{Š_ωφάGΕ(εΘoy·EC₯ΟL² }f7ˆρΣ± ΐA΅@Κ} l­!C2R(t˜:OE‹jίΏmϋοyD‘r Μ’BT’ψm“§3/ˆρΛΗXG«BώΤ 0ΉA°ΰΆr†gpŸΉ_BpΞΐΩ­?F·/θ#μ7ΆbŒIЎsΫg Eΐ ΎΝ0RΆ‰Cάι­ξa} ·Ώ5«}γ €$$Ϋβ²RΠρφάgύq„RNWσ€­xHJβΓi„ξ˜[»5š)NΥD½d VαXΌ>σοɎM;+ι~3ŸΤ;£-%b—h½$ΡGxyμΑοΆ9)ε5±šΕYΗR’σ¨o0‰ΠE˜ΞΕ%‡¦eτ§JόtμBμΪ¨— 4Oτυ©·? Υ°_'”¨¦Œ)ˆ³›uΘ θjBfŒ„.!vkf:*πJώaΞΙ"ΉVΤ±S3RχJ"ΨWγCghVtω-¦€σΏ3ύ±`ε‚&ιΠ;Fΐψ—[œN4ώγ}ݟqœ`{ΰCΠΰVeso$ΨάΫ\J|›H$jF‹`Œτ8c©šŸΖJ9HΦ}Σ`xΊk#Œ\˜:G>«C¨Q2)¨z˜ϋ1φλ&²ΗχJ†žμά ±ϊŒ(κ«@κ0™ L•οσ=;?$φΎ;5₯\ˆ› ΖDΚw§j`―nΑ2Iώ½Σ§.Δά‹/}βXbκј έ `›ω¬†bV± LrΛΝ;&šUKšΉ€¨;žE18kΕ΅Up Τ-»U°Vυ,–7"―ΏIκL£ ’gHpƈ*IΉe<8λNΕ₯έώu_¦€xyβA‰–šλ3Ό:ρRΐ’cr΄ͺšβ–&ZΛΗ‹TώΚy‡M ―ΟΌ•»ςεΡB’TΨΰOHο κ’±θ7P†I`™œTοt7Ώό0t|”­XI\τ"ζμά™˜(>ΫςT"ΰΏσα―ϊ³!ΦΈ”m…ΫόρG£ύ-Ηοm}yΑP/Σ¦K.u]λ%#erυΗΔ±w,ŽοU$PNθΒT©οΈνcξ <ή‘Nl"C ‰7g„¬_[|16J8g)ά2θ½5 GΠ†Έ‡Αusω€hxΤ"ο,α/΄AͺψΊβ3 ©31σb\ B˜:G.ΓΣbΐQγdΗ$ν!L‘„iάΈ˜%ϊ%ν«ΏΈΠ±ζΛE;ޘω·0δIΪ:šd, ₯<Ν?YE€ζρ‘@*Α”؁―”ϊ6`„‘Δλ3šω$m"€μ$ 9»52F3”³^ˆσ~€ ”Π΄–I~­ͺ‰™γΌ€Χ`(ΠF«j€^–?ς9Π5†©γθ"ΐaΣ"0Ζh₯φRNCΖζ ίd€:.«;š 6ž Y.hΫ0.ώ&ˆ8ίβt~ *ΎΥζπ@ΈΕλ9Hp㐺Cς ωX9ωaη~HΕz²–΄U$λ~,σ^Mc—€ΥqLsΑ’ϊ„’Δ ]όpθ «Ί{ΙZΜα­VŽ€AŠ‚Ο”rd9|Ϊ πνΣξ_Ρ‹γPέa€ΜξΔ%ό‰=jY©τ{βD›bΘ6Έ7I1 Hά’λŸ±Τ\―RΠ‘ΟκΠ4†Œ~#΅D‚@Λ+3―+ά`YD†ΞΣΉυut)IΛ1—Έ‘Y-EΘ'„α$Jύše;53•ϋ=Ύ „θώΚI(%°[£" Ρ`tΞQD΄“n€™»ω‰8Ί΅isΨ41χi›D_l” 0 e8uΖsΛΤ8Ωύ 5ZHD€"AB’U€κξ›&Α?β*©hΘg8΄»Σ*κm €— EΐΆP±ϋ‚γw[^· ΰϋM˜˜δ!'βH6=ωŒF:-rQ3¨6·rQM ~ΈRtΊβύ8lƒΊΗIς7t†g{ pωUΊ ‰ΡE~ǝ€ΐ‚J2~2wQΘhhUiΤk›D— τΗ!Ϊς-Π8yΈμΦΜθwΪ pΪ ΕŸmΙu†‘ΔtNω†1–ϊ'DBb€”Χ„2φ{/+JΈΑEˆαι.U;g]βς§ L%}Λΰ(f Os™ŠŸd ϊγ0mρ'¨Ο7Ύ™γ°I,';62Ά†£ΆΏrž³ςCjυ'j%–β_JlοQΫΗp½W2PWΰυ™‡_<Κΐ6©ϊ;ΥμΥM”rtΛΊ£/O=Τ”D$ΙAjθ#4ˆZ’|Ψ“YRΞyΏUΓHΎψ›u ϋΨAόα˜υFŠ~Χ1@ΐ ͺί]γ-H ok+Ϋ/0$ΆQj*nϊΗQ ΦξEμ.ΒcqaθLfΞ†Σˆ¨€š2μ`I'X^rόパ3μ7,ΌPI_BU1.I"–τ‘―ϊ€Ϊjήςx‡ζρ;2υyuz½ΰrd-ž<’ΦRr1aHŒΧΞd”Rΰ»Ά'»τώ…Œ]'‘†“n€γ 2jθ#4Λ‚Μ'*fϊα`Σ›(;Jόβjp2΅ΐ· !%ΠF¬”Χ`μΆ·]‚ΎOό—[œΖΐOψφ€€‰ΠpΛγ”pC—2}C,‘‹φχ7‡¦1T‹:ޞΣ: ©?Šipd,ޱ ‘ C' P+κΖλS^°ΰμη2’ˆ γ:ΓύqˆƒΡος ί:hχCw|Η‹…,½ζΝΉ³^°r–‰ύyLζκ%’u―•τtαžϋ1^»NΕ{t½»F.£a§j€χ!9—³^€ήˆtec]ϊHΜWύrέ`mO„|4+lƒθ 5kOΪμ%ύ™w½C:@ίΔψύ;ϋ »U€ψᑃwννώϋL‚ƒŠ±ι$ό€ςΓ2Έ’9ό̍!$pΤ¦„½W·PȐc λΗx{ξ―4–cŒvΞ§½₯Ό‡/Ί­ε‚Ž™£7 ―e ,G%―γΙ.™ΗΕ1©Ύ9#n© ”'+ψ’‰ΛΨ&še3κ I»`•ΣŸ 1 TΠ±W3QΜ‘(\$¨KyΦ 0_oZδ…ςΪNφR4@K–λ €GΨ`WBν}α4ΒhJ E弎]₯κΧͺ’αΒYŒΆ₯ί §Ώ{λβQ‹ψ•)jƒ¦άϊH]) €_ό~ΗAΔΤΖΧ'ΏU5!A²Α±”h–Τ°HΔDG9Ίπ±S5qΨ$~ηx&RS'3‘εNcQUΚΤJΖ₯δΉ(κϊ­ηΠq‘h˜ΜŠΉ[a”΄χ±]pj…k@ΐslΧ9€ηX#T–DwHnŸ:*χ£ Ψ`3O ˆ$,ƒ₯*±‡M+yw†a*ώ&b‰£‹9‡θpΙnΐJΝ…Δ`θιΗδˆb‰™#c“φΚw6:y'ž_ Ϊΰ»U22 BωŸt¨{ͺσŠνϋγy‡£ς“­ΌͺEΣΉΐΕ0Δ`L–ΐIG<οΐ―V"s»8¦ŽΖiχϊ<–S Ι d±’cy]€kV~sβ˜8υΏyγΒS–ΆPsή 1˜DhULμTΙMZ&:N:4Έ*―{›1ψ’‘©ΣξΫ$^Ÿy荒τΓrέ{„Bβυ©M# ήVΕLF£Lr“^γHa D œv”Ύ~έΔx&ΰ1žξΪ S@ΖA‹£\Π‘±H±VΤί;™·1ζώQipŸc|Κ«b έ‹xΖζRΧnUˆΩώΐ΅ΕΫό€?ω„·ΰSD2ϊΈk0άΰH@ޘυGβ3ωr}&§ρ…Ζ,“c2€ξehΔάR-υZ‰δm5ΎΘ~Rš™΅{Ζ&ΐŸ= §Qz| ΐ68žοΫ(ηuΔ1p|ΰ€ ”ΣpΠ°T»žp^§έ…ιc‹Χ4M΄*&8§nΒλ³Υ(2-’Mθx&pjsT‹jEY[C)§‘ΥΰΥcτΗD{/d΅tΞ/%ΙŸv)O&ηqSz±DΕ7ΑΘrXΡΥΏΈ–S ςΨi7dΣyœξt“;‘Μήί΅} &Ρ%”¦‹}•Bˆ“ΞΒ`g“Hf#•‚ŽVΕ NœξX‰νhsˆ†wΣwπ#‰Ÿ—Ό)€v…oΞ=Œ¦ }€ ’jά ΑV΄“HΘΤδ§έ'pΖ‡˜C«jΎgL — ˆΦρS?αΪΘLηδΨ(λ›φαEΐ_mωφ GΌo ΪΑφkUθU-Χ‡ψτ‘¬ι9‡£έ'υ½bNSτqΆƒ°W71™SR5 †ΓIμ&†p-ψ~q`γΥ)m)α'»δ<+ΰqΗOνέ§sͺ™ΥOv¨P8Ύ0šEΘΪžξZ(ηh]θ#Ό9σ1uΧη€x˜y1fžv?@9―£Z$-ΫδΨS#hMI!™!χBxAΌQβOBΔΐdvγΧIuυ/Εͺ€ƒͺ…k#ŒHο¦Οf‹ήHΗ~έB!«©‰Ž³~€σ^’―ϋ˜C9O‰Ώ°”ψGSσ^/Œρ¨i‘”Χ±W'iί7η Νελ?$ΩλzPEΒοήΉπθ UgZ΅ŸTt‡Δˆˆ"Β΄ͺ4Z` φ ΅˜υΤ΄(X…d3\>…ڈA qΕ<Ν$oίƒΡx‹·7XΏφHnξΆ.€yΰΪ7«]Ψg“ό?—σψŒΒ4˜,ε5Θ₯Ι°‘“œoFΉώI)UrΆπ»·.%΅›?ι8두ΫγΫΎΨw`DΉnSγΫΞ°θzά5* όΕΚ"ΙΪύˆ%άρΟ!>—σψœ‚3€¦oI²γ ¨ΌΧ…Ψ―[(ζtΌ8 ©_ZWI’ 59ˆ$žνΪΘ:T,ΤKŠ•2z{ξ§ΐν«1œL]’ύiΉ4*mcΰ¨ν§vΒw)(ZίN•ςYB Oκ9‡Γ2šZU/wGα{8ΧE“Νρ =D+„³+ͺλ.(–Κ gΣJˆQΧΰθ‚Τ˜φλ&jEβυwh£;Τqά‘]»m’ΈB£d λh$©@ν(‚+³/ˆρσ1Ή>4Lu\'m-?0ο i₯τ»Α„Pšϋu Y‡,~&ΑςΧ”ξΑ‚ƒ)Υͺd 2 ψDΦ!@ΛI7HŸ M,h’οόM,ϋ_@t‡‚sšΜΪΡ%HŒζ9€W[Όν;PBό€€ BΪV ˆkl€h“0sοΗν3:θ·fΣύ±Β4˜μ_<­dmΟ"]©΄zBτ‰γŽΙv8‰πϋw.žνΫ(dˆŽU(ΌYAυ^Ζiψ0•όMό a»RάΨFyίԊΩέg.ϋΟ΄ϋb δ3j%εœΛ$άXΉ Γυb §z£ε‚»J`H‚pmλNT”―ώβΊ ΆώΒdjβpۘΞ~:vΡGΨ«›)£Υ0ž‰Τυ(Ρ~ΜΪ}^ŠH(~G>ΒHβ°ΉhΩ¦³.ω‹γ Aκ€šΖD2ε‚ŠJρβΐe2<έ³ργ;W(ΛZ†ƒ!A9#CKόϊcÐ@AYZB™WD‘DΉ §jˆI«?o²ΪCσ3 E „Σ27©τEΐ_ψ'[ΌνΫΛβ~I¨kή&jΈΏδ…έaΔξE†@1―Εa$Ωd³mΖ ŸΝ(β3‹|FSTςΛ«`λK‰£6‘ώΪ_­οLζ½ΩKLα L“#˜‹΅£fΗβx²k₯ξ£ωΊ”r4(d4t†!N{aκ³Ι΅ν©ΝQ’ξ έΏŒ#θ# §lεςW-tt8²aθΪθο\?Ύ¬+ i pCd°bcΏκK΄,U`ρΣSΥτ…2RHPτŽΕΣέp,Ξ(B»OVΐ7‘ϊ—δY/HΡωY‡γρŽ CqM“‚#±}§ό€:―ώ8Β«ΟφˆλωtΧƏG.ΒHβQΛΒnΝLE'ŽΪ>ž(­€½Ί‰α4‚Ζf ό#Q=Υ'€€]?–ώΫ6V†Ο%€αD°rAΘbvc{ζ°B`γψWώϋŸϊϊ?Rœb»‘ @> ΞΥJ ΦDΜσοGοίΤe]žχ"`‹zbβι·₯ΌΞHκw9€‚ˆ~(bEsSλf"Ά³\H―Wa―B!Α9#υΨCo–τω―F1§αɍb–;Cβχ‹X’V2°[3‘U~.ε‚Žv?$°^ψ~—)ΩΨ5+v«&l‹ΊΜ£™ΐq'@…ζ@"7<χcΜ;ΔDΘ9ͺE2Οs,ŽJ^G)§ΓcŒ¦‚Š E½—πCΙT—jΥ%JΠe^ύΕͺ@Η ₯3/~οmRΊΞPΘ 0ΫI~—8δΝ}ΡL\jσlύI„π‹g{J4¨Nυ ηHU₯Ž/‚mΉa]gx²c‘”'±£ ŠΡ,Sςοhζοϊ1Ž;Ύ·ν΄3 žJLFBΒ6ɏ ρ½pΙ@αΎ%τχg‘ Z`ΦζRیψ‡ κz›]νk|;Š€GF[cWŠ.ΐ b9ίν―œΧR+Ϊ‡ψ0a* ΐΥ,η@΅@f;IžHΖ0›$w|ηΒUX­|FΓ³]ΆΕαϊ4Nl|³Ηwή™$ϋ»<Ξ©t<Ϋ³αXœFΆςyIœgΟz±ΩͺFκυrΨ$ψY/DwH΄A0ϊ@–ς:&JyΒ|ωΔyŸΐŠ©|ο5χ"ωy2~NΊ₯œF ε­γT8κ%n@ϋέQˆPΩΟ―ς›YŠh€n(ό@BήάrH#iΗYG9―‘^&ƒCν”έ Nωϋ­ŠΫβ)Gσψ"Hwι·‰™'ΠGΘe΄TˆGJtwHMκΊΒβΌΐ68φκζ΄?%/ŒUΗ DoLκO{u+­δΞzR'©a:˜ LΥlUΔ1Π¨—”Α@ηϊςΤ»Τ5‚„% Y Ά‘¬†§§€0A ΛδW޽&Ωdφυ/ω8€€gKΘαt{Η·X`ω¬&o J)Ν lW\¨?ζ}ϋD±-0’aΎq 6 vσ•UQ/ι6ΩVbΩ¦ί†Σύ-…A LΥκε[ντ-ƒvη§]ڍ3°”ŠύtΟNe…E ΌkϋθŽΒtmοŽ#x‘‹Ηκοw*l“ΑσcΤKt5NDδΦEBkο(΅ΫRŽ,ΰsŽƒ(’ιZ?χ¨;ά„wκ`_dl>ž΅υ¬ Y1pΠ° +:‘‘m”Gή3Z•θ³ΈΑ 0λp”σ:ΖΧ΄θ₯šo²j%² Ά ¦Όžώ<"ΩΔ Qω–;“ΉΐGκ“{ Bκ4,³ϊ₯™ύ{&υžυ’žΎ.±N<ιΘ:{5 Ŝ†οlΌ<]ύ\=NΖ&Qˆ$ωƒ¦I¦=ή2=% ΪJ’<Φq3“°„Φ”τ8 =δνƒZ†¦σψZΊΟ¦ΑΜ½˜uvλΖΊƒIΠwεω–§?πηώξGΌe;€ΐο·ΪƒπNN€Χ…”΄Ζεκ W $œ0μ†S²·ΧΦ7ήΣχYUΨXΣ Ά†_I8·—Ÿ}ˆ5‘Λh(ΊΓΝU&ΧΕ`"X΅€γ›Mΰο`;%Ώ‹Δψ5cBbP§c›ΘΰŠR)RππΆ‘q QΡcCc_νCψœBΧ ό"A@($Ž/|dm2`‚ Φ„XΘνΎUͺ¬₯eΌΉγ΄€ΊωΛ‘ˆώœt¨[›w,/ˆiS·!m$ρ¨δ  —ΌW‘"­©3<ή±‘Λh8λ©ΡΡ]λ€εΝt£L]ρD%1 +pސ±9ώΞ/3`XϋΉέ¨AΊŸ]‘BXV :ŠYγ9ι›:G΅HU›Ζι 9scτΗ!:Γ3oa‹xSeΔΜό?ŸΈM#μ7ΜqΠ°PΘ¨nΐ4‚©S%Ψͺο€”ΐ`α¨`΄„πO€ ΓHβΙξ‚&¨kΪ}”¨δ ’±©εtΤpυQND(”ΘΔοί3 U5ΡͺPκϊ€aPΞS[ˆs†¬sΩ`FK³.ϊΐpv? ΧCЈ§QΡγΙ<ζ~°ύMυ‰ΙLH»|#ΰD άάφkP' ·Ε1>χπ°=°…+χ(y4[οώ©•,‹ΉϋΩύ?ΔϊPˆyi[Œ…C Χ'/•8–ˆ"™‹L -ϋX§D¨~f™ υ²“ŽήwuaD¦m±Ϊˆ™Yο:ΓΫσΕ¬ώΪσUΗ!kaςŒ‰"‰σ~ˆξ(D΅ £^&]?v1ΙΙ6Έέ0)a‘•ršŜ–²Λ\Ÿ$;ΚκX€ΖI7lrΈž½υ€ͺ±—'vλ&™ί(ŠBς°DŒΤ y0QTΉYβΏϊ^q œ+Κ` (ε5dlέQˆ¬β‡2F7ζ¬ =InwΕ{%ΞRΟχντCΑ9CΛFdœBzγ™I—σ:ΖsΓ&I:&€²u–ΠF1Β(QlbίΌ Π}‡”€ΈU-κς΄n}s₯&σ˜W‹ΈΙLώ{`›δφF½~#ϋ/0€3υo›x ^ΊGšF@ΠΰR­W#‘ν^ύή>Δ‡ ƒvΝι&YΠ4JζŽ2ΘαœόF³37†i0<ή±±9‚Ti³6Ηa“φ­'`1vUJ{ΟχsΔ$8U9b§j Y1‰jgr]h\ULdzλE τIΖΛGm&3ϊ‹a„ŠjΙHYυ’v?ΔΕ0\©0»ΛΎ7M%―/m¦;ÝaΧΏœS7όΌfp₯qλ@- Σ`Π–΅ςΥH%J0žW1₯>l#’Υ 8v1žExΌcΓΤv«&α b ;qά R‘†uο7˜DψιΘΓσ}‹γιŽ•RζyKw†α₯לvΨÎr9l”©‚$‰ΙLΰ\ρ7‹ŠΪ(bς0τ…αCβ €A,* ƒ‰ ?ˆ-εRή0ΛKόf‹·κ€\ςφ·8ΖηClοP­O—VR]c2—α˜Ήρy₯¨Ιl†?Ψr|τ`Lγ ¦A :Ϋ ?e<—*¦ξΧ-Ό<ρ°_7SwΏ£ ύq”:ώ6‰ς}!Ί_>£αΕQ΅γ8ξψ8jˆ„Δ+ΦˆύρυŸξΩΘe8ŽΪ\ε#8&Η~c±λ#‰vŸLν-€d}˜Ί/OΪƒ-₯^H  υ²‹A€ξ0z―#θPβ'½š$ρης ήϋΪ‰Ÿΐ QuVΗΊ`ερ$HJΧU€2»!ΙΒ\FC9§ΑΠ ₯Y/htΡJΡ„Ϋ†3I+hι`q,1s\Ol ΌL"Ό>σπ݁C` PΛχηcο= `€p οΞd,Jπ§έΖλS₯2Υ…hV •bΥd&0žEiGΐ΅€Cπχ–Αd£¬ΛwηΑFšΎ7„‚lύψfό1€Ϋο3ι|Ν1Αv6ΐΠXυC RΠd$nM€Φ.C½€ΛgŽŒ‘&JΖζΰŠ:ytA€ΏΓ&±Ί³Q)Πμύb@‚<‘xyμαωƒRN£"@%Ξg{”ό… bαxIΣ? O]Η-ςΨ©šΘΩΉΩN#”s:[VŠXήυ―RΓMtlΖ3ςΈΘhΨ©™¨δuecl£QŽq1ΠFπƒ†ΞP]Jό sm8₯Δί…π#y‰šxΗΨ¨ΐq#IJ׏ٲNq($tΞPΚkhUL”rΝΜmΝrŒse—λ‡·SιJ@Υ"Ήύε-­ 'sΌ£μywld GΔΙ\χΫ©š)Ht J’8Z9—±\€ψΡ!§ξ’’ #‰Ρ4B1«₯X„Ρ,Β^Ν8ΩΞ.kIσ €€06sŒ¦7»Vή7½:)žT4·A ώ)θ;ψ5ζ‘WΒ-^―ψΕͺ_$σΩzωφ㝻5CZζποSΔJ08Ψ7G’$y‹9Β1εΉςφά'Α¦:ΔG.žο«" eA€#έwm§έ`e«|4ψν[ b δ•—Μd.s΄˜Ψ†8j˜ϋL)Έ]·Ά$mωαT`2wQΜιhU Δ·\ ' Y 9‡$‘…θO\ί/Ιίίp%ύΟMίχ8:ξ罐ύεΛyͺœ ˆIλx8)x‘”§BΰιF™f!έαεŠζΊ βŒPω{5 ε‚βτ ‰ή8JΫύωŒ–Ϊ7+d τξάGo^;©δu<Ω%ΉίD–Ψ2Y:ߐVŠIp4ˆKͺn6²)Ύ>σKj]•σ: ξIΦα˜y‹«Œ  ϊθ|°Π5 ^ΦεΜ Ψ]U+ΐ2c›ε…?™Ττ·8νAZωφΗψœγgά]2 lΞΊ?¨—5ι‡1zΓΝ9Z5#ήPHε!>@¬ά)3 ?vtα#η8$$$Ž.mzυη˜yώΠI[θBoΞHπΊH¨t―ψψlΧN‚–IrνΊΖd­€αιž…ή(bύ#ΕΛ_I§‘?Žhs˜£SΜiΘΩ9ΗTZ˜ΜyϊΝε±D$δ­D·.€Ν›ϋ"΅Ό½zΑ"–θŽ" ¦TμT©#PΘP₯Σ(8ο莒KtΐεΘΪ;UβyšKυ”O:Κ>XQBFSίω.φλZU2Qxq`#Ϋε8ικ_ͺηœ\₯›VZžtw|˜:Ησ}j/4E€PbFϋ {ušKu†T\4ΚZUγ9Yώ6+rK“RŽl“Do—ο{`°(d5Y.hθ ĝŒ\ς.ωf °Θ£~›ΰ H(η9ΎΞΐΆσ,Vxš/‡Ζφ†΄ ŽΞ b‰MχΥy)c€m1΄ͺ†,OώR‚I)Ύ¨0ϋrκ:±€„Ζ%‘1–Ί^>u‹ΣΞͺz‰m’βκ:}ΪpO}ορhΗ”ΕœΘԴΕgHΘ0’l4ψΣίΜΤfψπ©R<4tΆΰκ³Εg‘©NwΖ0siT|ϊ Ό# φφ@zξλO-αkφFFͺh%…@–Τ“eσ~Ά:jΩ4Λ$©θX e₯vŸμύπre”TooΞ=Œglδ"uœχI¨RΠ₯ep–±8+f―N²~Άg£ΊTœt4Κ€ΊΔ9yGΏ:υΐ@ΐ”|FΓaƒτώ[U T¨X&ƒeπ…”02Ά–Ά†{θ|θΰŒέ&³˜ωα-ηΒ’:8ŜΆIς— δ+l'tsΰΫ }nΑ@6ΐΫjΤΥΏ΅‘q†VU—…,Η`"0Η,ι)2f›Lζ3Jy –Ή^‡CJΙξh|ϊ[π€Ε’wΤn:ِΝάƒi”>œbVΓ‹}Ω„ΖΤ₯mXΠuŽΧ§Bρ~η9;lZhU μΦ Iΐ@&—ΩΙ3FτΕFYΗ?ό{ω¨e²ο―§μbΌŽΥΏS5SχC!HΌg F‰ιΟγCt‡Δ˜{ρFΈ6‰χ7‰ΫδνήhΉ#0œ ”σ4 )ζt”ςςY£i„σ^MCz“’Δ~1qΦ R©ΰu–ŽέQ„™7ΗχόΑSGV‹Z .±L&c „Κφχ¨ΰψΒg±*³¨xyβ ‡ΒD䧐ӑiJψΔ%‰wη>Ύ;tuH—Zγ ΎΦΛφκζ₯δ‘뗝V•χπœχ€csμΤ ωξ<`·ρ Π5 UΥcCίθμ$HB{ΫΔνψKΑΊ%Ÿ*ˆπfΛγ4@ΐF PΦζ2cs!!bζd`:gDυϋΤwε!\3@βΖh@γΤTΗΆY1Rd½χ6†λΗ(d5<ί'­– ”xuκa<#·ΩZQG«b€3ΰΥ)ω,Ώe΅HμbNΓ³}KξT Ι7 ΦII”ΕΏρΜ‘υ²ŽβŸ ΩY/L7yΊF‰Ÿμξ‰ΞΕ48λi«Ό24Β.+Γ¦…FΩ@oαBρύγx}!pΐσ0wωβ$…@gb8PΞλΨ©ΘgΙo9Ρΰ\Ή!#œφ·Ι2Μ9Π¬ψΓηŽ|Τ2S#€zc€4 ΛdψΕ;5β―¦ψυΟs–Π—‹€JAO₯&§ΐOΗ¦ξbξΤG8οΨo€‘JG3ΞΙrΩμ‡3€%=­‡ `ϋΐrA“adΘ³nΘ―r|―}qΊ!ο0ώΠw*Ίν “·ΗvTΒΟ9ζz[£ˆ[¬YΙ·LΣ¨…‹₯G±ΏΕώυ!―ώ_IVΐ–Α±SU’4 υtαΓ cΌΨ'Ν•G- η½€(|KΙBIρώtμ"–6κ%C ―NΙΝΥΠvk&φκ―—©PHθ›F,VŐυΏ•ΗεŸ XI” :vj&Š9Jό"³uΌ—gόqL¬΄Ρ,B>£‘Y6P)’)ή^Ζΰ}UŒηQ:ώΎtοψΎS°Νμ:ΩΩwΥύ‰Ιa›œΪα*Q»~œ&Mη ŒϋYόƒΏ™—9‡ΈΌΧέ”δη₯Ό&£Ώ[Δ^έΔ?ύΧ#–$w׏Ρ†(ευ΄:MfΈtγcΥuh)6ΔȍΠ$²ΞΒ Œ3ϊ'pUπێ½82ŠSgςΌ±DD#ύεσΙfΈlVtYΜέ φ$δ³Ν¬ϋχ έr_Χ&uŠν)€Xdώ"β‘Έ6€’˜Zφ–‘Α bΌkϋx²c§*S7NQόέaˆœ­aΏAΙ±œΧaκ€ΚχζŒ’?@9!ˆ$^žxΚiΦ$ƒ8Ν¦ΡnΙ@½L†e24M©iwκ€#–ΐ³}[ώύ?Θ£έY₯ ΓΠb…];λθ-aήVaη€€<3™ δϊ!e#UΦmUιΏ‡SRN―Θιί±•zλ`QŸd–‘WάΘjœ©qNJn9GΓχ2θ œυn–Q”x΄cαόα"ωoz>œγ™#GSκߍY…μ Ή˜91F€ΏΉ_B“jͺγθθC£b`2°MΎgi Ές5-ν_@0P' λpLζ±Ο B‰X‚qiκŒr\³šΤ7kϋ―ŠC°]π3HXΒΧυ)ω ΐlΛcόT<”Ξ_QHI3q?”(€ώ{0ŽP-ΤJ:bIν©8b86G­¨Γd Bο.όTΦ= €ΑA(±_'?βΫ+ιψI„‡Φ­rΗͺΠ5ΰo"#ςgΉ>ΡΤΟΦ[Έͺ?ΉΎρŒ σG½d ¦”%•‚ΙLΰb’?‘ΘžίeΥΊSΰΆτυdŸΛhhU ԊD―€$ηyŸΔ‚’~³lΒ6™’έ8ν‘΅β*Ζ@"υψο͜ΜgΈΌ ’1ΰO~Ȑ•δ0Β‹}›Γ$Ž;>κ%…¬†Η;D,ΣφRU΅•Ψ&= ώ˜Z9WηΗτXl9』¦AtžJQ“2&ΏvΘd rKgf   *ώ|‹S€Š€§Ÿϊ^έsœ`»έί‡ψΚB‚Φυ$―H ΑmΡΖ X‰ϊO²΅­₯©Ξʊό”Ψ ²*y=e°υΗή΅}ό{έΪ…KJΐ29Σ8πϊΤCG)ώέeӜ* z1fη>Ξϋ!ͺEIη εΌ†BNΓΜ5ΠFˆbyiάΌiά₯ 5r°»qr›$ώ¬ΝΡ,©Q@B>‰Q‚«~ΔΩμŽ"μVMT‹:²Η³]υ"ΛΐδFύρχYωxΗΊSςO\ΖζςΏω'όφ΅ΗΉΗΧgΪr%όώΠI'A$α1›δΗ<ž Ό9σρt—œοΨΠψϋjJρεΓΰΣD’ΰΕHq,} [–cd’υΗώ‹-Ž3πΧώ£O}Ÿξ9&[ΎήPύ$gώP§А117,“§’μ;5Y[KΝάκ%ƒ37†¦‘2`΅h ŽΓ“] ώΫs²œ„jρ7HνX¬9‡Dƒ²Ώ—Η¬sΘ@Δ8ξμ>쀓—{AŒ“N€‹Aˆr^G£L›Ό’Φλ“ΆΕcy;½›“ψ{'胭J~“±8΅,όκIM ΆΙS[ΖΏ~νβΝ™Ÿ’ϋ—/v2ψιΨΕoίΊ©]o9―αϋ/φ”ΦΎ”„}²gmM©“’ΊΥ’žJό^ B0€δΛžΪε?Ϋ΅ρb_Ή*•©Α$ΒI—Œ$²6αB!1œF©K“” =©Zβ«‹pΗΞΪRό$ό&Η €ώ·­Μq 4^ωΈ±™ΖϊCl±BΣΚνΞ28šeSΝώiΦνX€ Γ9°_7Ι+@{βνΝψσ OvΙ'& κkψώΠΑnΝgΐ`α則©+` /φmδ2Ϊ½x@HšΎ?$FΒ}†”JmvFτA!x6Σ`Œίœ·j‘ A8΅Υr€(ηu4Λ&&σΛNɎ?cρuιX<5ΒιI»y:—―F2Œ#Lf4JθΝЁR^G» έ±W7Q+κχ°›ζ RΧΐ^Ÿy—fI 4'zyβαωρLŽΐI7H½ΊΓΥB„ZQ'/€Ήΐi7P2ŒͺΥ%LΐCώ§ΈΫπέΚοԜoqŒΏ‘ζσŸϊbξ)ΓHψλΛέλ€e ‰Χg>*yϋ ―χΰœςΓΫsO‰π0Ά,T :’/O<ˆX’ZΤρxg‘ϊzήπν“Υχœh‚-Eϋ»―ΘeΘΜ(ŸΡpΪ₯]ϋu‚w›άŸ_–Οh¨uszšW₯$™ ŠΗRI ]>,•« ΄ϋ0―;‘RNΗχ‡6Ό@b0‰Π…©Mc£l ^Z$ώ0"ιήσ^€Ι|Αeάδf$ΤΑσ~ˆΑ$B³bb§bΐ29Δ“¬•tΨΦ}xΎ PΔRΆϋ«΅Δ{£Y›lθΓτš"΅γ―u0u:π‚¦!–ρ™~nΆcΙΘ"–€Œ%γœΙ[ΪMήυ}o#z΅:>Ÿ[Ή ‰ν €3υϊΒguewνUΛXcSώ_fDB²0’ΰμŠJ*SΤΈ)ζT :2Η^Ί“ΉΐΛS/υ–9ι0 ’υ5+Β(†J6­Τ&ϊψΒΗi/D¬ό&ΐο\δ2œ=?0‘qv/ί΅ξ(‚λΗΘΨ$_)θ8Ύ0Ί₯=¨g-ŽJΑ@₯¨#gshΚ»&Š$&@‘?ސs8ώk˜»i­žaΓ Δ5„B"VJiY‡nψΜ‹aκ,Uο #‰ώ$B»`|ΛΔ5¨ƒ΄Ϊ_μΫΘ;,ƒ£Ρn JΌώS»Θ29<²‰Œiύ—ςzj}l4«zuκ#Ž%4‘”ΣΣ‡PΚi€d₯xœ1pΖ Τ …dρΗςIΓ$Ζ3Α&σ‚ž/Σ8)d峄žPήEg1Ά€w}ςΈ8<€_‚vρwsjώ»O}Aχ ΔjoyœΗ 7³ΟδQ?ΔΆ‘lƒPΎ7cJ€qL@ρ‹AˆG- œΡZυϊΤΗlI“%Ž)?XWΖq΄Iγœhέ―N½tœœΎ?ϏρΫ7.ώδ‡ JωT?oŒ7§>ώϊ΅‹Γ¦…r^G΅@¬ƒ‹AˆΣnbήFI7t†bN§έ~VO%δELlΉώ$Bbκƈ„$ΥR{£qΓWm΄WόΡ T¬E2 ΓοήΊΨo(‘‘”[Μεγ˜—§]βΗ₯›―—]Δ 6“Jάτ=²Ž†§»^ϊ—ŠM’2Ž„Δ̍‘ϐσ‘J΅}²Zϊ!’σε8lšp,³˜iXΟ}Ί­ž/!„L«ΊO"–¬;θ#ζςꀍf1:ƒˆ•ςšlU₯SΏρHΨς8>€—Ÿϊbξ1ް½Π#Π½}€Ξ~EEΑ ϋfΖh½“μz±”πΓχ½‚Pβθ‚ΦaC©Ξ½?ΉΝΔ΅γζ™G”»r^ΫΊΊ BΙΪύ¦~οΗh” μΦLdlυ)εtœvΙ7 €»}GC΅ £Z$ d]©U‘Δh₯²ϊΛcχδšg›΄¦ΈEΰΪ°MΪ g,-΅DL.&1cΨ«›(d5Rώ›\>ιΫc@9§γQΛJe‚'sγ‹ƒ‰ŽοmfΫ'¦D„¨V$nλS—>8;UΝ IϋΆϋ!Ž;žο)ΙΰΊ™Ά©taζƘΊ²q uj–Α1χθΓλϊ1’˜ψ£Ÿ"«ŠX²Σ‹ˆu†QΪƒ_υ|D τF‚ΉΎΔaΛ@ΦΎŸ‘ΛWΏ%+‹cό|=Ιn€ν5 Ÿϊ"βώ#ι\ ΖhΤ|ή Sκ8 :±&ΝΨ_zι†EJ²ƒ>hZ©x”―ip°5.έA(ρςΔΗ~γΪ¦χFΑ”toΖΪM€IDAT"!SŒX’θ—u8ωΝi,0χςY ΅"aΫ,uξQLB½q„Α8ΒάKRΐWΧι„uvC"ΩΈΈVΚTh”uΜ\ΊY~(Ρ‘qΐP+κ©±A΅@=χbtG!zγ³ 4Σχ’DίΨ­™Ψ©š0tRΫ#IHj₯Μ<šƒμ֌­Ϋ7q ΅ ‰r^‡υˆγηcL™OhœζRGmŸ4ΟυE<Δύ)FBB»Α–’γφβŸs€¦q²fΩΐp‘«Φ―\FΓ³]₯ΌF²»γ‹#cSΒ•RΎ7X~―_€· ΰKŽΐ»-aαaπUF vΈ\)σA©σYιίsΠ:ωνcζ’7ΜΡE€6ς ΟχHΕ±Έ²…χqή R‰ίŸO\<ίwT‘`γ§ΨΕhJιΝΠΙ°m―fΒΆ8FSί½ρπόΐbŽ΅™,p2Γuβγ_όΥ„%&?ΐ‚Ϊdθ 弞*Κ&ρ‘‡:Νsކ¬­Α$β[¬¦Ξ6iWp]pνμ1™{kμy”|$$ϊγΓiΗβ¨ Τΐ‘œΧPΜi˜yέa„ή(„H”rTΩ’]Ώγ¨ν£; /Ν@–ΐi'ΐΏϊ«ώ[§ΐξ²+ε ψωΘgφϋyZΠτFjE&48ΏL³0t†œ³ύ+ζ¨ΰ9ο…° ~ε©h|ρ‘‰”ώυΗ’'ΖμΐI!v?βΉ —†ώ0 X„Ψ&|ΰ}κ‹Ω"¨υ?Ϊς8UΩO}1q1š ˆ˜D|–ΑΠ“Ή@S9συ'd€Πͺ; QΜ’ŸL₯ §:3‰ ΰrτF8σπlΟFΦζxΎoγη#`ΐAΓBΉ@†o~(qΦ π§Ώ ΩΑkώε±[[Ψ_]δ’7χbφgΏŸγ_υ45“KrHΖ"FB­Hς½§Ν—λΗ菩ΝΟ°[3QΙ(ζ4δƒI€Μπ6€ J²=η7ƒΙί“β^Uά>Κ:’΅}u£Τ ™y1枏σ~€J^G½l€2†Y[C«j²>«‘³“θ#Ϊυ+iΗλ.Oψ‹Ÿημ iΘ_>qn₯ήΕΠEμŸύΕ„ΉK¨šrAO΅1ϋg>a§ }ŸzΙΐAϊG8ξ8lZ(ͺξcΐ»s–©δ)ΠQΨ†ϋ‹ Lƒ₯Ε[:ΧδFB¦Œ€Ή΄‰Xή8,Ϊ$ΊCΑŠ9큰:φA£€Σ-Žρ— ] _nςλhoyŒ4ΎΚπ‚œ9Eσ“@jΓ.ΥςΌ*ΕΥZΡΐaΣZ΄ΌUΥ8ƒΈf¦z1‘u4μΧΝ4)'τνφ D”Ψτͺγ §τOGΜ±8J9₯ΌΖJy :gΘe4„α½ζ^Lϊ.|VΚι΄φƒXΓI„‹aˆΡT  ±ώ$߈Xβbb8Π,hU΄ΑJA_xζρ΅›`M―Yˆh#2½ϊ‹U@ »ξ‘1h[Θ·ΝA.¨κΰg@­€Γ4΄• ΰς»ξ˜“ΉΐϋߎΩx&πχ ‡\†C'γ’τ΅JιŽy~Œ7§ώω―'쬦RΖ•ΌŽ§»δC=™ Ό:υ0ucxAŒJ9 ϋu œ1θCΖβB‰Σn¨F>·μΤ― ρ¨Œ+±xπ@ΖψΨηL‚aλ" ˆ$.ϊ;ά1οUJσ6AΟσ³Λ <ΐvΐ HXϋΤ΄EΈΨžXΑG/“βCG, Œ3Sa­€…+ΰh&`škV Œg΄Ž>Ϋ³a™ŒΊΚ@΅Hκ³SWΰ€sΉα&aΟκ%Jwιϊ+H8ZF_ξ\OέǝΕψ»^’$Qϊ+ζH꽨ζϋ |0¦Δ?/(|Χ-“ T,wτΖZU3•OŒΞΊΊ£At9*ž›bŽZΧkE;4AΧοVHIsσFΩΐ^έ„cρΤψ΄ΐ48%=E(εtŒη"₯Φ­λp4«&4ΞΩo^{Κ©/’Ή|Ωΐά8ν†Π9c–I‰ϋQΣ†qœχΨ&=PΛdπRš*Παά‹ρΣ‘‹ηϋ6J9{u3 ] BŒg€σ^¨4›5|$m$ˆxα A‘* ¬Έ±g[3¨R.MοGDγηΐοCκώΓΥΗθψ+­πK3l§‡5ςCπ•EI6š θ:K7”I‘Δ›3₯œŽΗ- •ΌŽΓ¦…f…¬δη^ŒŸ]Μ=r¬tμ7,Μά8υf€œ­αQΛB₯H]ΧΣ YΖζx±oγ§cοΈ{9j£$뽈%^μ;0•8@ΉmκΈ½;$—ΫM(|WcξΗx}κ‘7 ±«Ί9₯P/8οQ‘v-iΜ¬ωv0Πό=9ξUΐ ]c° ŽΘ—"ρ.εuμ7L”σ πΖy/ΐi/€Π] T šε}œΣPΘ8˜Ίνώ‚9°|lC#ρ‘½:‘ξGSrπλ#–ΕRB*eͺβ‹γΙQ !λ(4陏ΡT\jΧΜύ?yx±o_:v?H»aD:•‚‘>ΤΤιpύ˜ψžœΠšΙΩχG‚‰m-˜:c›c8wb,‡ˆ ˜uK!AάυΏΰ°Εq|ΰKŽίc;„ΰΩ§Ύˆ‡ΈίHΦΚ±ΪελK6 ΏΔƒ_ή 'ΤοŸO< '”ޜω°Mβό?Ϊ±ΰ1‚0F½L£άŒ½˜υΏ=χ1σΖe2Κe4Ό8pπςΨΕπ΅@`±Χ΅MŽZ‘μx—‡’…o4p¦p·‘Ύ¨2u]”ςd†WΚλ(ε4δ3κ}ΚmΦ±n|#%V€ΏTœψŒΝ7nH"rG΅5LƒœρQΡL€ ͺ₯NνŽΔϋΈ˜ΥRγ©+p1ΡFπBβ>έ±P+ιτυ©‡Ι|‘ΰΠ[ΪiχΙΐθQKι5ur苁·η«% €ΔJ6’nu3LΈ—Ε¬NΙ_ΧKFΪ-plΣ`)„ ’δ&Ξ{ Mƒ,η5Œg‚mΫ|`PϊΤcfe[άνΞγ3Œg N€»Ε1ώ-(ψ2wΐ[ΎήΖ—ξŠψ™~8?uˆXJ?ˆ™‘³Λrθ H(JO;ϊŒeB‚|^z) ΛΰwmΟχm2žξΪ£² M£|rάρqή ΣQrβφϊD9Ύ8pπςΔΓ`²ZΕ1·›‹Δr˜Ξj%#Νq–ΑρζάΫΌ·.K)ΫΝͺ* Y •‚ŽBVC‘§DηnXB¬X‡[±ΧΆμ IΗRͺk>άR΅›k%ϋu+υGž{€°¬‡ΌκβΓH’έ'ΑRNC³BZόΕh–EͺΈ—Hξ^ CΌ>σί3σYɌWO2ΘX ώ`Ζζ° /Έ|nR.€ΐ‚@γ‰·ΚŒ’RΠSžΏΖaΐPΆŽ3—>~CΙ¬ΒΗ)BŽΛ¬Ν1Ω‚ΈAΔςώɁŸifόh~}²Ε1^fθ₯O}1· jtmλXΔ'°ΎοψLΗTŸ4fnŒ ’0τχΨε|gκď('L]±2Iw†!²Ά†ύ†I›9£©ΐ›s£ιϋЧν~)‰±9Ύ;°ρ³RμKR›sΕڞ3Βuυ¦4–N’X’3Šπ¨iν―€#cgπφœθλ[o²T±‘Ίβ– μΦ©Π¨—H±V4nz—+ώ+ΪXC?b Πu.%$“ς} B r”r:vλΤξΧ8%τΐ‘’κθF„?#°Fwa8(.€2¨₯+ΝE?Δ«Socοε$y;*ω‡‘„‘3μTMdm ―Οh6”„‘36IΘSΚT;UpήkX –ŠRœvμΦLXΖoΗ9!VΫ}RœΊ1Ζ³ ‹oύAΉM:C£’cξ)…e›πCzFNΣΌc¦ΫFaωΜ–Ω2€=lWŠ€?Α‡―s–±²χcl?Βh€ξαgZγ=Δ]‚‘n>σƒY粨”Τj/f5΄ͺ&Š9ψπjVΜκθ/)ϊ%γεe€:>~:rΣΡςͺΈ¨"`Ο†er<ίwΐ™‡©+.%ώ$ w'Ξ{!F³B,€}ΣΉΐG.v]»uBρ'bEΗ?΅-Ύm$S'ΐy!K;€ dP ~#Fζ+6φΧoΥ;Χν°ab4ΟfήB³lE»_©2tΘaSOδ«“žσt.π|ίA΅Έ°ζeΘ9T­BJ^ Ξ€ύ†‰VΕL?ǝ­Š‘~θ~ρ(ƒwmŸfόhUIΡ0ށΣ.)N]οs[VϊΐΖ3B€š:©.GΞ!Ρ !$Ό Ζά`ψxZ€Oδ4YΞkθŽΔΦ9›θ+dΚyν£w>?"‘JόMz‹γτA’ΐςΞqY^Cb‘Χ―_ωω]ξ.·Υ(`Ν:τ_j0xΚ m9FΣŽ­ΑΠžξΪp,NŸu”σ:²g$ ”Ψ΄6M4Κζ₯,h¦Ξαλ±jaˆXJ<Ϋ³a›$)M—€=˜μύ₯ΔΏ<΅PΒ»Ά©+pΨ$1»½:ιΌmϋN6“^—’ς“i0d ₯%}Ηβ©Λa,4rvSκ§8Β-F=¬1ο`κ%whΧλϊ1Ζ3*’tbίθz1N{”,]“M"ό¨e§ P37†Ζ(d©#πΜ‘}‚”\ΕHΜ}φΔ%패s„―=™z€Άβσgl’‰LL)Ί£ηύ0eό|μβŁƒ|†*YjΧˆ„Δi/@I™#ΡEΠξΫP@$djό±ƒ3 ^Φ1žΕdΫΌe\ "–Λp©t‹γϐlLΆΥ°@8€φ=Ÿ!ƒTπ;fΏ‘ξ6ˆΚψΗrΈ›3‘άγ[Fόdρ—_|Δ±Δ`")‘Lβ8λ…hU‘Κ΄9{sξΑ L<Ϋ³QR˜­v?D!«αɍRŽlΨϋ“ΓI„=5r~Άgγwο\xk8τR8˜‰ΊFλs,©88λΟ&v7ν–z£s/Ζ~ΓD³L›Ι,'έΰ@0}υ?œ“…|!KI?ŸΡ`[ρ•DƒΝ=Ϊqη3ν€ώŠ9-mθuG‹ΞqJœv|δ'•‘ηœ~ώφ|1ͺeΪ½ŽIjz’ ŒρφάO7gΊΖP)*T}†Ž ‰ή$Β`‘Y1SεWCcx}ξΖkΓλKΪτ Ϋμ°i‘R ΞEΖζ8νR‡Έ’Χ‘Οjδ£’~$$&^ŒΡL`4₯‘w(dZ˜,k(VžΤψ΅ ςδ”W‚q―+ϊ kεoH#ψ©δ8 Lά‹#«š2G£bΐhL0˜₯!Ψ XΕοχ‰£ r|ZΖ$Ž’T¬ͺ‡›Λ !οιLs₯pμ-f(Wο#ΚΙp*Π,KJξ ¨tx § X&G«JγΟ'aŠ|†Ίηύ ;Ίtγ—G3Αό@Β2? ήΠZU]Ύ9 Ψ}ƒPβb±~”kϊL³ƒ؞a{ `Tl ΐ?πΌΌΕλώ ΐ ΰ?πίΓζ·{„5£Δ B±ΎθP Άό\?€;F“γΉ@Ζζ0 E)WΈ¬Δ€3ΒK1Άθ\“*«DΞ¦υxζ‘hN|ωcKς0 %:W³ΰ€ΩRΜSW7ρj1uΞz!$F3g{4jή©™ΰœαΝ™GVπ·ΈV `<ψι˜6“;UŽœKξEβ73σbŒ¦dž7scDB^κ<¬Μ•ŒςΟ αμΕί‹λ €)ΦΘK ”r·,x ݜχC΄{!ό0†1dm„ τΤ1£(ž*ϊγ“yΌΎ2Ιڏ[vͺβ4 Ό:υ1œ^Ώ¦€”‰ ՊvT{§”_˜ϋœtƒΤZψΊ—±9 Tλ?ŽΙιQΛ‚m0Ό9χ„$T‘΅9"!ρςΤCΖ’ΆS΅Hs,]#Υ=#qXΖBDb8‘YŽm韬PΜi²˜ΣX΄½8@€ΐbNΘR^ϋ8Χτy.4?ΰŸmqœ Θΰ·8νώgΈ]ςO’ΰΰο0λJΕ€Σ°MΡρ–Ηψ ‚IΎΉlΚWŒ7†λKΤKΪBVž!υƒρ•ΎK1Gζp~(SΡΆ_–Έ^—Beαn«ϋa“4_Š9}“’:½§]§/uη~ŒŸŽ<<Ϋ·Q-θhV θΓ«Sξσ$Ÿ%l†r^On“]|˜ΊoΞό°ρ¦€ΏΔΆΣΦω€#rΎκλtΝN$ ή£dšD$hη<š œhΑ₯b λbSΦζh”Tš±?ŽH—YΝijEZ$ %Aޞϋ˜ϋ›΅©#9Ι³^Σ`ΘΨZΪ:Ρ4–&ρφ8ρατ7ωŒ†(’x}ζcξ‘zT9―£U5aύΝ²²­SϋhΘDͺ_± I:œΔ˜Ί{ul$6ΑŒ‘!ΖԍQ+~Ί<ΖΠ¨θr:Ω=‘u8>> π³ ΰοψίlqŒ€¨·mόηώΙ―5€€hνXχA @Ψ…m" κ |α!Y|?Σ΅―"€:ƒRRR_†ξ'λhwβωžǐΟj0ό8Š˜ω„«*εHv½=ί»Α >Ίπρύ‘Λ`°J΄ΙšΉ1ΞϋWΐι—΅ˆΰ…$4-΄ͺ&j%ΊζΰΥ™™[q]ŒΡ&―!±žbŽ5₯ΤF3Wΐ%Κy2 ΚXυ²?Œ1χ6£°§ηɐβΧΧ€q―+$n ο0@_με‰·²΄]Vΰ[.rUC₯ΌF£‡#λ˜hV Μ½…ŽσNΥ„‘³TπDΝLnσ-βZU3EοΟ\JΒ弎¬ΝρdΧF­dΰΈ ?Ι°A½v§f V$ΏΣ^€ή(DΏηβQς(θ(e‰η«σ$Σ‰7η,“‘€ŠHΖ8@½DZΦζ. %Ϊ½wΜOV¨Ž‹¬•tœuο8™Ε¬?hTΎy@ΰ›έ|‹cό„Ν±qϋO ‘ό3άFΏ{uόοόCθ†σ #£m"~ρq³lΪ·RΉ½jœ!ci—>E^@ ΫυcΜkω ™―iCΞ!°ίq‡wBΏήo-pΩ-/™σW‹Τξ'Kaϊy‘š`’%p]ΒeP{FX³ƒ†‰R^Γ†ƒŸ= • /ͺ/ε6[K z"!1™Fw0‰0σbΔB’˜ΣqΠ4QΚιhU 2Ž;:ƒQΌYΣ8K― ιWύrvλXΣζcLiΪΛ…{Συ»Έƒ Ν8ŒΝΙι†ι)²]΄ŒE w|œt‚;[UOv,θ:ΓΤψιˆ Y {5 e%§ψm£?Φqά 0 eφCκ}½Q„γ‹ ­ξ’„―>‰ γh]’φ‰ώ(J €BVΓYP₯ΆIœNSg"™θ$°8ώτμjIΓx&δԍοEΟ§3ŒX!Η₯½~Nυ΅/Œίƒΐlwi½'ρ;Π(ΐΑν JΖ[܏―ΐΐΐpΓΉΜpƒ§Θ±‹―Β˜Ι{ω2}%„΄)Τ4ςHnβθ:™B~0‰w΄΄u©–ώ™Ϊhw|dl9‡ψφ―N½VΚiΨ«Σ―q Š$¦@.Cνݚ‰™'6θ‰cEBβQΛJE~ή¨p)―£ZΠ _¦6v"¦kN χ6Uένεφ>D/O¨σΟφˆxt`ζ―Υ%h”lί,"w *ή‹uΐΦ0«5 ¨–ty[ZrρaD’>ύqΫδ8lYh”KGκ8–†ž2‡ˆ„Ό±”N:w,θΪ"ω'ŽOΓ‰ΐtξ¦Υa>£‘Q6PΘjθ #”σ,ƒ§ή.Qώ’1ՊzŠ`-fu΄*&ΞϋAJοHh%R’ϊίACIpl-θh~ΥξGBΙLγΣκX“ΝŠΞάΣ[š Bθ’ρƒ¦y}EΑΎκ@‚€l·-.@΄ΊΖ-_ΗΤkΛ{Ό¦Ϊ όV'g²AήΦΰ)ˆŠψιγa~/‘δ|Yo1SΏΒ`θd˜FAH›£„πζάC»¦xώ8ΒΕ Δ^:Θ£©ΐxa·j’U5iL­0V'Γ™ΐnΥΔa‹ωOvlΌ<ρ±σΊ’Ζέa$S’ηϋvκn›l†i€-ΘΜhΎΘ[5ΣO6”oΟΙx.ι4Κς 'νAΈ˜N Θ8$C‰άΗ-G0ΔB p!ŸαΫΖΤΌ€U1PΙΠ/) Lƒ:ŽEΒFIΗԍΡ‡Œ#ΜύΥ,Ζ€έš‰G-Jώ“ΉΐΟWμΖ@»OŒ*}€,ƒγ N¦q ΅}LVΨD2΅’¬­!ŽιX–IΚUšΖpρa)‹”ΤΦ² šσ$&“ΨE’œŸ\?†e~$Πά5‘ψsšμOΆW€Α$F)/PΌΩ°βk,ΘπŸoqŒ(ιώ;ΌφΟp ψŽqεΦόM΄†leΠ>ΰΈ)wjΧύ•0˜ΠZGρ‹FJβΔλŠE΅W7Σ½Δθ£K뇔ΐI'HMβžμZΒL7^γ¬ έ_ΜωOΊ>taΏNJ΅q,ρκΤΏ$#|5€$άXVaΧ’M±Τ½θO¨Mό N `³Ξu Ψ©šΨ©‘<ύΣ]²ž?Ύπ1žΏί l“Α2oτtΰšΡίΊΰTΑ?ΖΚϊ‚‰€ν]’ΡR7>¦PώoΟ}τ'‘β„r” :ͺc.ε4ΥΎ—L#τ†—«,ΞIδηP%ρŒ’rkώ‡‘-8€ύq„οdΒŒ¬‹§ΈpLœ \ALΗOv,δΤυ˜IIF‚¬…χκζ₯ρ€KΧ™+¨ϋPψ΄h²YΥ1uο ‰v/β›Λ•¦G77uΎδHŸoyœ€Τw—χa;!’UρOόp½HΟ ΫΩ@ύžΟωNΑ˜ˆνƒ!MΘ†κ$›$SηΰhVόBHpΞ^L»δP’Ώ„Θ9$ ΓD1ω’œtόtνN^“lμ,ElVLIψ.―»©ΏA8ZΙH-γ(W€σw!H#&1‘»‹ΦM¨Ξc4pΠ΄PΚ“±P>£α΄G`ϋ«€υœ*vΦ„α‡VΖΊ ƒ5Ό”@΅¨Γ6¦šο$g£1 Q!5>Η"―ζΞP‘ό5OΘxπ΄ ”#…bV‡eRΧ ^20sΊCrIͺt.?œ ό|μbζήLو‘0„Π4†feъΉ„ˆ„ηΤaΘ:dψs Π…δΩ©6-Δ±LgZ½1½φ‡GNŠˆ'ΫβπC €Ξδ§Η<%ΘjQ“η½h{@ ˆΏ; 4Κ+<Ύξ@jg·8ƟγvΦΐτ=ώ|€λω7 LΑ/―9——ΨphψαœχC|Β#ΰ’2 ™ξώE,qΦ R‡»ύ†Sr?ξΨ«Ρ|ΌQSW? ΐΥKΔΘJB‚”U_ŸyΧzΞ„‚@€'ΰ~έ$Ωφ=ΓΆjAG₯HL.M΅ψ=ΥβοŽBψ$‘‘ЁZI‡‘“₯πΔ[-hΓ©ΐΜs€έ€mr2tκΌ>σQΞ‘U ΜΘk8j°L†fΩ5q8―•ά žξ’xW₯?&σˆα„όφλ‹kκM‘¦;‹β¬Ό Tω±’^Φεxcζm$κY7[ζgr7ZΪΫoA ύ6ξxΏο;ΞόKPp5$Ά9˜ZΰΌβ‰«ΕμbΑΠ9Jy’tχ‰ώ8B9―(sκg―N<τΖ“#c›©?ΐά‹‘΅9φ›κ%šRLΌbJ9κΜύΥy‰άK_žxΰœhέ‡M+Υ¨”’Π†pΰΖθBτ'Qͺ /•ϋμn”Ώ?tπζάK±]w½O‘8Ύ nΐ~έD₯HΘYΫΑΕ ΔI'€λΗΘe40ΖS1ܐΗΧhρψWώVr6Gots–)½CΕ­—’*·ηFS‘žνΊΧΗ’\φ&s³^ €wdΗk*R’Δ*b’\Χ_–€— (?€vύp)E&‘¨:κ%y‡fΨΊNΨ‚“NV^ ητε‰Σpk\“Μ=qι\˜RΊβœZS½QΧ‹Y.Γ?‹±£©3ΤΛ:άσΰ^Ζ^ ΩΕ ΒAσFοκ―-$€ˆ πv‹γΌSnÍWΨ^UIΡ?Ζ%&wz½½»t)r ΐC|%Α Ζ$ _Pώ1u4₯ϊ(–x}FΙ_*CžFΩ€e’œλΗ8lYΘ*•αDΰέ…3Ό8°‘ΛPφ§#χZ 3u^žxψαQ9‡fξΤY Ua2‰Rz¨FέΛ@u!$ޞ{πΓM2 ϊξΐΑ[c‘V»MŒg?zjγ{uΒ7μΦLs::ΓεΌΆN€hƒ”DWΖΊ@{!QΈ¬uφφ<Έ6{'† {u3εφG‘Δy?$ŸδΰφΒ€’ι•j%#ύ]Iθ:CQyΜ=š«wGajΌ³ό^¦ΞπdΧB1§ΕδΜKwτΐ˜Ρ¬Ψ­™©δ’”δψž"”šύ$m~b#ˆXβέΉŒ­‘ήσσΚXœS7˜O4Ÿ1? °œPΚsŒ¦δp/€ΐ±`₯Ό& ™oΚ'@‚TνΎΓvB<3Pkύοoπ· $Γ{άΐ¦ρkИ°ŒEΐpƒ’膱*šβ+Šφ ‚Δ©™$΅ςοXΘ9΄i10s<3W`8HWu˜g½§~(ΑΟΠ‘V20žΡFρj$x±œ£Qλ^uk#;/ˆqΦ ΡSy#uΌζšbΕπ‚8uM6•GώΦτ«"έX2€ζξ(‚₯@’Y›£|`£Y1nڜ ±FCΗϊ8Η2“„¬ΕςςI'QΚλ8Tτ†Δ9ο¨ν£; oε°tιζ°-jΝΧ 4SΎ„8ξ(d4Τp"ŸΡu4΄ͺϊγaˆΙœl9φλV*φ“P.–#f$:Ovμτ|›ea$q1!”hCΒ°MŽ(’pƒXqT©½”Qφ–I@Jκ&˜:Γ\P·β¬β°in~3>pθ“ΝŠŽιTΌ%ϊς•χνaΝάqΓhL”>)ΰ!ξ/D _LΧXκθšta36OmqM!λh˜ͺΡr, ^+ιζj<xwξc Δx˜’>ιΘ)}™ƒ¦‰©+RX"TΘj¨—¨ΝŸŒ# Ήi0pΖ0χDŠΫ4GυΖ‚ΘΕγ–…J^Η^έ„mqΌ>½y q˜:Ήϋe2<Κ؜F#KΕ…fΒ²ŽΒ5qκ毌› €ί*ˆVΐ“] ΓIŒΉG­ωΉΓ θΑ΅*¦v0ˆ˜δΪ›Λω^w£Ÿηr^GηύoΈ―? \ C³Δν/εhn΄§hEΧp,Žu:ΓπR;jXΚ2’sκ<H±…¬FΧδΕτw%*t²B~Ίk£ZΤqΠ°K©τ§#dl –NΎΣ†Ξ/­$?+€Ίί¬ZΤd»€@Lζ1†!«Ε›>~·9ΡOy—6Ž_‚ΪΪΣ-Žρ36W<ρρ?Tt@]€W~>Ηφΐ"¨Xϊ€‘Xx?ΔvΑΜύ˜΅ϋaJνΎΊaμB8&G.CΨ‹AΞ©‹ΊW·M–ΖψιΨΓt»ΛW¬.Η’€ωdΗΒoίΊ©Mβς—t’=aθ ΟχX&Γσ}.zγΝgω ΐdFX°';6κ%΅’KwπζάΗ`²8Vrν'νƒDΏΥαΨΆΑΐ9KEφbεa3χbx~ŒΙœt4νΖΣϊ5Ά(Ϊ Άγ΅­ΈB6Ρ<ΦΠR'™˜ϋdν…]γ»Ά³ήέύ–£˜Σπt—―„Β?Ί gΎεΉLoa8‰u¨Ϊ« `(€ ͺ FSW ΘqUp―nΡϋΕΐ›s2ƒxά²PTŽY›γνΉΛΰΘΪt^Γ0ΕθIV2ΙKB©s1v«δ2•Ž pΦ 1s+d΅Ο BΦΛ:Ζ3ΑζώνΫYοLν^ΔsŽ&mλ›βWνͺΫhδ”xqsnϊ5ΆoΕ― «†#¬Yt6ŒG ΰ“>€άώ3­c„qŒ#ΤΛΖ%ώ?@¦<―O‰.Xύf ;U’κ%j~œ3J˜Ηt7ž1κ_x²k£Σρ|ί¦F‡Q2Ή1:Γ½Q„Ή/–ς’›Oχlι‘<ύ-3%Πύϋuω¬FΈ€ΆΞ0„Ξ26:y΅Γ· Fͺ²@ͺCγ‡1ό€ §.mύ F($"!±S3€±›ςΔZC› €¨Νχhέ&β˜vΕ†Ξ`θͺ½³4(d5pfb’.$RΈΙ16‰JAΗ³=RaŠ"‰·m’…\΄x4ΘQ+hU©EŸœŸ¦1Tς:΅op,%:A1\τt†!„~χΦΕ~ΓBKQΏ?tΡBo$0œˆTŒβη?*ΉΠΒn– pN‰εx&ΠFŸhŽi04*Ί|wή¨:±IxDwaΏnl°/#$hύΫΠ—ϊpΝί$λΘo±½φMρ§ BΐΔ"Y„ν €ορ>Έπ£Ηητόγψ‚”τ²φeχΊDjwvΆ"&'Ψ_44ϊυ'©ωΡά£λΜ:$tρ¨e₯ΰΗb¨— ΄ϋaZρ_xΊχιυF9―Λα$Ζp"Ψ} {CΑŠYν[Ω]IP’ό€ΗΗψ ά τ@ΙωCΗ+P»Ώ‰ΕZt r0ΌkθJαάβ#EHέZΖ8CΦΉ<Ω‰UΎ` έ” Ša›A =πVY―›:C!㠘ΣQΞλθ Βt— ό@΅h U1s΄Τˆπ>Ž;Α%Pήͺ΅§;’c>Ϋ#@ί‹}?ΉM―·JOπ @Ρ69ς:ΏKψƒR^$]3%y2¨›ͺ€DqΊq^E‰OBΧš•΅ι›(ΗkιΈ7ΛL€•Ε†1ωtΟb“YœŠϊτΗŽ;4“ΟΨy‡,“Γ4TλCι„ΔΟ ¬1s<%₯Iž;UM ¦Ξΰϊ1^Ÿωθ7__Πΰσ=²#’ϋ‰X>«£˜%mώV…’ρ`α°Iκ~‰BΣUΤBQ ’Ώxœ!*"v*ό FL•†F€ŽδξemŽƒ†³”*XΞk8λQEzΤ˜RΚϊ¬6 š4Κ:fnΌ‘~φMA Κ(}ΑA@ΐm"αΨ§XΓ@‚£[χρ΄γo.ύl[ ψιC­CqχPmyvΦ aκ„yZξ"2F³pΖH=ΆΕ‚lΨ:c΄k)C·V…0]QDͺ‚΅"‰%Τj!$F³X岄6ƒ w†T$¨ώϋ~:Ύ\,ΟρM“#§Œ‹ !H<’~Δ0 ²‚άcΟϋ„Xά‡ε{r]HήAΦΎ±KάΑ5&@Il‚Βϊ ,Z|ο…ΪΡΚ—Η>σ‚˜ΠτύaDREs/Fo₯Ά…Y[C.CΥQΖ&)\ΛΠPΜjU cLέ£Y„™£RΤ±S5‘©ΩΞ«S£ΩνΪ1†Ζπ€e‘”#Πΰq'ΐY/H[E₯ΌŽŠBNŽFϊύ&UΞz΅†yΣDΏ:ω@δ2jζsξγΌ(™Jšχ'J9šϋ,ίΓjΡ@gHƒΞ:*͊ώΙe—CJ Ÿε²ZΠΎ…@΅0ˆ{p’ι|φρ΄»nqŒ?νΦρδΖΗ)Ζ ‘Ζ?€Βha;­€Μ“·<ΖC|&ΑpΪ 1™ ²zŠy±g„ΊΟΪJ9ϋ=PΔδ‘"–pc’η Ε¬ŽZ‘ΦτͺBV9 ZΧΟ{$ΤΦ¬xΌCmZ^xρσ/+μ鍬³(Ζ3]cp,r°-fudK%w€vψaDΪ/γΉΐd&0χIdhΏAtψΓ&mOΊn³ QG>{£ ΰoqΓ:³IpB_ΛM³ †ή(Β»Ά‰f°+=KΈ>‘»#ša$T‡dχm›$k[Uυ`9W’ AŒwmγ™ 9:Ϋ¬’Σ8Γ£–…zΩ€ρ5O:AzŽ‘θ hΗ_Ξ¨―˜Υ‘±Έͺά$ˆ„*VΉ2™C«J •‘bμ5H€β©j!1PΛfξΕx}κ)Tλ’|₯Dj|4™ΣΈΰ΄ UΡ?˜V+κMΌ`ϋ³‹c`2۞ιυ9J7Δw ŠΫp‹c >²ΈΎμω ¨HψΠ!A£†¬ώΫyP‘τε<Υ‡Έ6β8n,Κ?Fu>/aͺώw¨F­Œ3/&†”ΞPΜj—ΐ~ Δh– Rpέ±‘qZ_£˜:罃i”Χg½‹c§f’Y61sγ•ϊ«βb@tυ§{‹"`0Rπž‘μΰ%Jߍ1™‘„=u³%DΌo_…πγ:^2>~{ώ~‡y]s,ƒίτύ8Β ~›' ΰαš/$η4_Οčΐ– ‚©'1uΙΜΑΠU£l"kΣΌ<ω{S'₯¦zI`40ž“ρ‚ˆ/χκ{ν7H€ Šwmρ•j‹1jΙt!ζžΐ/gRΞΎ1<ή!ΚαY/ΐ`" Τ|_‚xωŒ!Α11uI’”'Υ¦δν&sΒ;]ψΘڜζA* %`”€`^Ÿωμ_d>:ΰrX&“Š.Ϊ!‚οηδπ ΫΙσžvέϋkήηί~Δλϊ€6XΝώ[― ω,βα#~χ !Ÿ˜½k0tήgŒΔvΞ{ J i 7&ϊτ“ ΥΝωΟϋΔKf^Λ ξdœ0œ’θOβΛ²Μί1πΐ±5””W‹λΗ„ξ_±Ύ&έDΞΙ―…1b ˜:‘χ³ε“8&Jβά‹•±€λ‰ΆŒg[Ζ)tΗΌPι(ΉcqR‘ήL;deC&FJΧόIκή―M €ˆKόG«~™Πύ›c0Ήΰ˜₯εL―o–“€ Œη ΥnIΈ’² $zΔpa4] “›Ν@B? œκώΝ™‡P\OιΡηΤ±8"eœp3+…¬†Α$Βi7ΔxΑ2vͺ†BώG菣Τθχο\Ά,4Κq9%UΆRMδ¬^*’ωΧY—€†'£©`•ΒgEL£\Π0œŒ¦›W­ Ϊ΅ Χ-Ž3ΕυB;τύύGΌίΦˆˆvΈΞ@’σΟ!>P0g]’Ϋ•rdζΠH†i‹ΕγbβΥ©?iG6ŸΡ±hc”±9Z2ί±ŒEFυΒ?»˜^#ά“¨ϋ½>υπ‹Gl‹γρŽ?ŒSMš$ιkœπb…Œ†’zΛ Ν(°`ΆI ΄ϋΤMφB΅]ξ­[HΨθΗ# ­ͺBVÏΌkΣΨ8©― MκJofMnπAͺ‘kc“ ©$ώΡu`θLΦK;ι„wFt3ΤΛ·,JΐBβ¨ΰ΄@Σ€ŒEˆΚb–°–Ι`›δ˜£)+ρ²μΝ^yπΓυ²Γ͊™:K] BΌ>υΐ9C­d€tΏz‰Δ…:ΓP‰δŒπY/Έ„όχΒ―N<‰I ΄*¦sΑ$‚”—uλ0 irΈŠ!qΪ P-8ŸεDη ΝͺΟ½€ί π‹η ξ])z€ρ?ΌζχgΨތη6Ρu~πΫwΦ¦ΐ/σ ‰FΩH…k8[ŠYGϋaŒ7g$ FγΤ ”0 κδ޽Ί•2\?Ζt.P)θ°LŽbNΗΜ»ΎΫlΜޜϋ©€Ϋ“?Ή±DΖβ(fυ΄θ E@ϊ’…uͺGSKμΤHάξΟήI–eibΨwξΣEx舌T•YYΊΊ«Ί{f·{gg9³»‚»F.h Hπ•ρ@ЌΒH‚0#ΠH€FBpI» w±£gΊG΅¨.-2+uhύΙ{ωγΌχάCΉG€Œ¬Žc••ξOΏ{Ο=η₯ΌŽέfΨΆ;₯€}3ΙΪ=f’9–ΐΕiY‡ΕεzώaΑ“’Dέii“= ¦ͺœ$`ΫdξιN3μγ³r¦FnμqυBΰς¬?–KB©TΪkΚΪ»M>Ύ₯ NDεόΩllάκDp}υœsu&+%ΗΔX¨ώΫΈΞπ―βθΰd(§'Ÿ}Cφπxmsΐά3>φσx A`ΥΣνFˆ© #ίΣίΕΫξFΘ8ΜX·λ2Ϊ(ρ‹xœέk…XήτQo‡)M|uΫG!«!k LV ΦwΩ{ΰβtŸ_ŸL¨—§mx!';MΆvt}vy5¦c$@Ύ₯α`ΖΛόώ‰J_Α.‘ύν4ِ(ѨĜΦΛ Ϋd­ι¬#`κZZ–Ϊk…Έ4mCn)$ϋ·#,mψ¨δΟf“-ƒ—7F‹2=ΝxLΒg œ\Γγ9υmΖ?ƒ:όFώόΞλspq±Y0ΰ›‰Œύ―THά]ρ #…r^;Τ³ήn°ΛKsNjx“ΨΖΟΕc²B_mφΦb/UkMJξυvΘ F,ΌέъΗίdW†Ζφπε‚ŽrN‡m‰Τς7ιύο4BV#t%BvΪΟη—gxαxy†ΗοέGKqΉ{«ά˜gv³Έ%Π‰ηΕρ²tηΏγ.=8'MΰΑκ•£~™«EύΔ’‰•ΌŽ‹S,΄Γϊψ}΅§SΩ#)Gk˜q ΑσY&˜ΐςΑω λ ΤJŒp}ξημ4$ͺ$Aο#ΰ‘ ¦¦Η8›νΊL'©•ŒTΨ¨Υ°Ίν£ήŠP.πε­·Xvυ€ΫK=\™‹eΑYηv#ΐXΡH«Ž%ЍAw—]zε’£Δs·E9:€JASv„FGž·FG’xυ1·Σπ€_ψ7―ΐŸ%0‰υxΏ+Ή,τMŠDNθWζυHœ_¬yd[»_²&πΒνώͺΗ꧁DΖ(ηY&wͺb@Χ QΔlΛL8φ: &%°Άν£;ϋM™Έ½Μ¨¬­‘’ηΦpΦ}ύH‘Ρ–hυ"T zlDR₯8“ά©FˆHΊΈλ\šΆADΨΨυ™–ΜΰžΔΒkΧLT dn t\Ι‹Ογ·/ΐ@'’?iΰ{|ηΈX&©ZIΗέoθ₯#b°έΒ€Σ ψϊ¬nο7τ9ρs"―Ζ“j¬ΨΨ Ε2’‹ιε‚Žœ£₯Τ“ρ2―βE,2΄Ί 5+bڟŽrA‡Tόΰ-o±?ΐdΕΔTμ3°0iΓ«JX†ˆ'ψΎee£1uΑ&ΰμhuC”ςZz\γRΦ↏έVH΅’~fΫΊN―θτN'hρ+οΰρ€ ΠoPπ&x2~Φ±Φh=ζvΖπΝcόΚUlύ»έ1VΤχ•AΰQάmw#”ciίJž?ιΙ”²}νWJ1Kκ b^»a}ΧΗό„…±’?΄`₯œΛ Tϊ=ιιο6ΉJF ΝΆŽ+³r —gάzΨƒœά­v―β먇+³6ς —¦,h‚[§―*#v\½›·P+±¬ρ΅yAΘ`Κ›^Η€$NγΗϊ)xΥαΰˆόƒL™Π¨“‚γφ Έ’ΠtνΡd}^΄|FΓ•Y›'Ϋk6χ‚΄D$%—Ω[½k»rΆ@Ή £Vκ›!Fΰ_ž±±ΣPoE©£αΰyΨΫ '@ΑΝX.2q;άk…˜7Q)pβm{‚ξ―Υȁ»­k,T”ξΐxΙΐζ^ΐζV=Œ—Ξ¦(P>TŠšΪΪ{|…ΐ_‘˜ƒέ19GPBΌ Vη{Φ‘ΐΤΖ‘ΘγqgLθ(mφGˆηnlτ,#’ΐνE—ΒP‘ΡŽ₯¬iΫή&Ώ %+‘.Ηεx]c–JžUΆφ‚}‹ŒδΎ΄Ίlœ“(μ%α Oϊ6·~οεv#„mzX˜²QΜjΈ0iαξͺ{€ΙΠQAΔC·—\\ž±QΜiX˜΄ k„εΝΓ ’AΕR"^|:Α4X:8 α%Ί8†.φy $š#’‹d\§InΖΝΰˆY˜¨˜g₯%Χ— p“μϊ—ϋΥ΄,αώš›*ž6bŸz\™΅‘Λhιδ”ΒΣ €°ήfu¦bV‡cq >ŠtR+κ¨δuτ<ξσο4YΤ'φM)νoeλp»’Ω‰πυ’‹Ωq‰Ήq D,ZquΦIΘ94‘”œ™:(‚y¨cE‹›"|½δλW30Ϙ7ΐk¬ΖcΛ`ο (~ΓC©€πx ΐτWή{Žηυ#<Ύϋΰ8x‘qf(€'- Ÿ°Ϋ ιΑšMŽέw‡ #•ό‹•πƊ}<ΥΪN€‡k."5 ΤZg B–=eφbηTC§”š]Ξχ« ©ΦJ, ΤuχΛ LδV·}†ΐlΝΔD…ύiŸL.ΰG£Υc^•Yƴ͍³²αƒ5A€ ƒ-ƒ`[άΘe4Xρδoœ xήbΣ ˆF –IJ;~ώOΞμœΠŒλ4 ΐ0}Τ/•Κy ―_Ι ήβl,’ Ηf?₯Όžφ½w›!ξΈθyύwό4Ω΅ŠŠ+³ Yž{'’wΤuΒΒσO“€‘ήfΡ‰jΑ@.#uXνi²j Ω‰RMθɊ "`k/ΐξ*R\jRΠ5¦¬„±θP1§αšε`m‡[K@PοFXΩςΩp"–NΆ3Vd,?PXέ °Ύ`aΚ<Σ`7Λ$ΤJΊZή Ξ‡ΛΡ‘+ω}όΫH@w ρί;x>ύ$—ώ°ΐ™‰τ|ήςx°ζ£ήŽR„>ΐ>(Rr ;Ϋύζ \©Υ4@#žττκ-ΦvΙΨ΅’Žž+QΞk¨•{•τφ½@A)ΫŠ±UcāC*Ϋ‘V60]3α«Ϋ'#$«ϊ+q{ΙΕΥ9₯{Ψ±]Ǝ ‚4–8N$ξ“ο«Ψ; ’ ~ ΠσΨΠσΊ^„0fΧ]·F ΅|t{uš  \~σ؍i€SPQZ^Ο tσ’ƒΆLVbr}™V <_"ˆ-zο»Ψ plΛ³6J9Fξ/nx'κΉ³5΅χPΦw¬ν°ΜdΗe£\FC­¨£kTΕ―”‚.ψfnϋGb€Œ%P‰«›{Μ8˜Ÿ`Dηό„…bV‡mrΙ+1JRŠΛθK\&ΌΩ„#z{ΩΕό€‰³•’†F;R͎|"–Α'l€V`°Ϋ»~η1ΆΣ;ρύv| ‚;/jœ1€Rκ‘]ΏͺαŠn>μι$E λ;lŒ…ρΟΥT–!0Uε «Ρ>·Ρž/±Σ±-T‹lϊγΨ‘bΌΐvƒι†¦NΈ6ο°V˘‰»+ξ‰ξ_;š1|~Β‚HlΑοœŸ“;Λθ+Υjϊν΅’qθ»‘TθΉ aΘ}7–ξy~ΐI@$Υ!”β48δtπHΐ$N“ΐOό+`π‘γ`₯ΎΈί£BVKΡς—ίΈ‘wςŽH3ŸH*ΈΎB°?rΧeη$Χ—#ώ}²·ŒΝΆΎεΌŽ(b΄ΚΦΙ“6αl5,mzϋϊAa€°Χ Qo…pβ‰<ΡϊOϊTΊF˜3YσΏ{ ΄ Zδā­n4Ϊl 17a₯H₯b c«₯{­kΫ¦ϊ½+!˜Α°έ``β%—ήy9‹bξμj¬ 9^Ρ©λϊ©OΓ³ˆ³|M†ΔEπ;ψh*"ŸΔίΧΑ-νη}RF|MΞTΌ ΟΦs Aΐϊv€•Mε³^έzΒX±OgJθΡ›{&*&*\°-V'J·—΅ΩF>Ρώ7 Nκ[υύ˜-AΌπšη…ήn3κδš~ξΈxiήA.FυGΕn3©ιc 8Ά†œ-q4X—ρEάΣϊσ₯ϋήi„Ψ¬π^Ω‘‚Š[διqΠΡ/Ο-#¦­žτ~6ψ ¬τ5ŽcpΕΣ1JΉ~O¦ήb§@¦fX&!c1β]Χ†AΘ9rΚ…~―(H3$‰Ά!ζΖM”σ:ˆw'™ό˜v8ƒ3šχW=ψαa_€δ’χ<‰εMνžΔΛœΤtˆi€cEυvˆΝݍN”τg0^2Rήj’ЎKC­n„Ωq fμzUΘ°·€λ«C C₯€b–ΛFI₯ΰώš§ήΊš9ΣH"₯8S-4΅]žΙΒόFW½φ½ί|Œm|.½ηΑςΐFςόγ›Hό•ŠH_=θ‘*\©š©M:anάD΅h€.«χVέTA―=βΛ;μ˜s4LT T‹z*”–Μ χVάΤ>}°·/Α=ύRžεƒηΖ-΄»ΌΒ ˜πξJΧζΨ3€yώ>,ƒ±c@R@ρω Ε½΅{ 6μΊ…¬†™1φ£±L‚ηΛC:3'©”r5ΕPΊ6φ Nъ;mpL/?κ—J±IΑλW2p=Υ§Κm²l#4ΪQŠ~Τ4‚©Kƒmρ7M–ΓΥ5‚a²Ά€*ςŠY*Ε"?ΰμ±ηJ˜†HΑ†˜’cΚg4\œΆa1σ`Υ=‘υ’¦&+¬pθω ΙΔzŽΙt½JAG³ac7ΰ‡ΔΡRgΑ€:@ΰ~uΫG!Γ½+(`²jΒ6ξΊΠ¨$LC ŸΡbq ΰΛ{.έXp`œa0 ˆ(ΙΞτ‘>'Xsο/γωφŸD”γŸσx#–E§;ΛŠY}Ÿ\m’Ί7hΌ“Œ μ¨Πqν_-κΘΨc₯ΎιΎΥ βrpςOά2XήτpuŽ1bUKΗ+ύωˆ5"ΩχgID~’c—’ρ/ΡσΩ“ ™πƒHq΅;ήn½"Œ€ω ω SωξΈ) ό€‘k„ι«ε#D`忟j»§ΌΗM°Νθwϋ€iͺtΊ»μaiΣΓΦ^p$-P*@† ~l΄€$)άO±LFxΪ¦HΌ‘ ”Sς Χ2π|’hv"t\‰N/Jϋ(ƒ70ηψΒύUΨΐxIΗXΙ€Rμ)½Ύ°ΆΓηXQGΦΡP-θ(εtH₯ ΨλF¨·£Ci]c(?€¦Α”ΔλFaΘάΣ0£H¨XiΛ[>­lωκ΄u¦Α€ “‘VΦΥκV@O»„ϊ‚*¬(πdχ*˜bϋ¨±NJ8‘ϊאȃϋπΟG`0¦ΐ Ρ~ΊΟcXάZtQo‡Έ2뀫ικ½ΩuHΠ>Ÿ”Hr΅WεΩ΅»AxΎΒV#ΐζnΧ—Έ6ο`¬¨c@HΝ#2—Ι[ƒm2@Δ6u”σθ#υ?Pa€`›~(EΗίw–]Ϊͺg0Q1Ξ4`ΌD­¬«λ“|Κ€@ΣJˆrεψ&8xσžΟΐΐάΗ]ΉΏHό£ηt-&Α ‹3œΧ"NDΐβΊ―Φwͺ• X¦Ψχ»νF€D λεc ™š‰œΣ J0TχVέt OŠ Άͺ”Σ0QfίAўd\μΈΆφΜMX(tΌbf`Ε‚; X/Š7B§'ΡμFpSΊŠˆ¦ͺ&ΖΛ˜- ‘»έ†=\šaΥΐ “tΥ^³Ÿ#―-€Ωš‘LƒFω?;sž8%XK«PΚ±.~«λ=RiV©Xήw–sžJυS Έθy;jJVά3ΟgxLιΔ­€—ζxχjšΝnˆž+α‡}όpΈτΏΧŽ"M€2ΞP-“PΜκ(ε4δ3ΖK!»ζ4ΦΑξEž·›!ό°‡kσ2–@ΞΡ0?i‘Ω)FžΞΤ,4Ϊz1€δ«n*c|–C(ε4ΥΜkΨnDOu}kŏ=«q Όzτώ—ΰqΟώ;`~/ιϋ(q<& DΔ<†‡(ϊτN—"©PΙλϋίEΕΎ\'Έ>Ϋ΅OV ™Π΄~uW׈΅ϋm^™^θ„]UΘjι»]ηͺnBΛ³c»ψB–η Ÿp π[έ(nGπό~Ϋ8ΩHΙs‘1†a²jΒ–cΩi‚ΐo_/φpyΦA1«a¦fΑΠ{ΗJ³c9 μL` O{ί%h€ΥΖΎάLƒΤτ˜‰{#|ŽŠƒΪώ‡&Α³hψ‚ησ 31Vδ‡0‘Μ9\!p,T‹:ΒΘDΟγRO£Γ½MPΏτߎFŠA$ςŒ†F¬σΏΖΌΣJ=ͺ“RU!§ƒΐ=‘z+Ϊμ&^ΣΔ˟ΙΨZJA΄ΟκR)FΩΎy5ƒΆ NBP+λhu%ž bΟ  ΐ 8 xœΰC°όηγD ܎Έ n<`ς9μσ<3Λ›>¬y°M\fΏTΒ |ΐ@Σϊ6Ώ«[>v[!ͺE₯œŽŒ%΅΅C‹/"`§`²ΚmΧɊ‰vWΒΆ(U ΜΪZΊΚOϊ‰ΈkͺτΠ‰’ƒΐρ£V)~¨pwΥ…ˆ½[ζΖMD‘:±PΠ`$¬°[‹=,LZ/3ύΡ2 χV\΄{ϋΫ₯Όf`δώ2˜pͺx”~¦Ψ8ΖΰΒ€‰ŸAG‚4†E9§γΚ,χI₯Ύ“^h"ζJ^˜΄ Ε·—{θΊ¦ΑlƒB†3ÌΝ‚B†m²ΚJ1€- ω'²ΆΗ‰•ςl4I`}7Hε7vμΕτTΕΨgσ[Θjh΄ΩρO)ζό'/ƒH˜Ί8$ψ0^1R«Λzˆ―—\υΩ3Ώ:Q2ΆP΅²Ž•§€(°Ν6(ƒ%ίŒντπψ*|`‡Β|όη‰ΕDžPXΰJΘyΌ`F Οξφ¨ηIL™0u.»ž„cs†ΨάΈ•Δ₯TXάπ±ΆΣο«'»LμΩRoοΗl)ΕςN#D.K{υR–Ι Βd‘•ΠρZݍv„R^Γά8›9¦H]kOJΑσ¦-jšƒRŽΛχ‘TdKΰ φέA¨0=ΖΤφ—b†ΐ XQ%θsΞΘΕ^š?UNj*¬mϋh΄CΌr1ƒŒΕ/ΖD L@1†NΠczγβ†ΗdΣ‘ƒFDƒ1 ψμNOΌrΡQYGœω*T κ­νξ“ $Τ‹H€ΰ-ΰ9ΗΛΰ 8ΰmπŒχ_0œ―Αyœ2ˆxαswΩ…m LT˜ͺζzΦ=\œ²`™„ΙΨ)ΥΠ)νλGΨi)Pό@’Ρ‘±M”²Ό’OU†NΘ9ZΜΰ©K ’ŠWχΝNΏšλza,"Χq#2JysZ=‰vοdΦυ@\©M„‚ζμ”ZβΆο©―Ένρ`έC*̎3MπϊΌƒλ^ΊMM S¦Ž ΈeφH š,ƒυ†”νŒ΅ϊΥԘAλ»Α‰.ςXΡΐ₯i Ά%ΰϊμΈuΒ «ΟjΈ2Ð/qoΕE³»χϋ:LΓλy,!©i„‰²‹Σ6Δ€uGšŽΊD£‘ή Ρξ±°D₯ £˜Σϋ«πθH‹)/ lμ˜ `Ό4ΝζHW¦BC=7Βζ@a¦ΦGϋ+puc}G έ“Xίυρυ’‹·eρ>Ϋ0tR“U]=πqR§­“F¬+q$+ε‰Wπψ@ΐǍ7ΐ“r<ž­¨PΗΰŠΞγ솔 Oow©νJ\žΆQΘrΟ}―ΝνΨd@ΜgXΈΥ°Χ 1]γ…SΦΦΠι1δ#QΟ‚ΩOQΔN‚~¨X/ΗΨ€€έ—$ ŒΥZήb€}8ϊ«Ζfb&ΦόΈ‰―—άSΩ—X°θξŠ›Κ _šΆSόΒ£]?™»ΎΔΒ”Ηb†€©VΆ}d Sc樁m¬{κxΤ πηώ+Η}@Σ€ω S}z§;’>Q1°0Ε+χ+qoΥ=ρUˆ½¦ν>`pχ†%ƒτCA\}Π—fξ­2Z΅”ΣϋZI2P5Πυ$νŜ–·λΗ$:ρΆ1‘{+.D μ«Ψg ˜λ XxB$ΕMΎω•BŸcΥ’Žλ!Œ€owι₯y/J ˜Σ0UUjε j°Φ)CκrO3.¨yΌΟ#,0ϊ?‰WΑ+ςg)+œ'Aηρ‚DάκT7ΊTΜj)09YΘΤΚ: ­/Ϊ³Ή`iΣΣΪ26₯ž1Dΐτ»ϊ½}-+gΖ Zί aθDΟ‚,¨Ζڍ·CgjVJη;X‘=x¬Σua’=&:£1^Gm§Ω‰pg™ύ[l“ηžHφΆΒΑPιŽήžˆΩ D`Α:paΚ†m±1]yΈό/Υ@ο<Κ=|Τΰžε€1ΪU iY#Q;κδgΖLΜM°ub§'qgΕE£}ςΙί2—§ν4c|8P>9iL™¨XG`eΛΗv=HK; ³ ”cξ¨cυ™‰q‘T K 3ζKN׈Q­ Ωι[Svz=Œ•ť1ΥO+Ŝ/` bΧίYŒΓϊŽ/TXΫp{ΙΕ[/myΰΑ+ιͺηIμ4žŒL°e¦ΖŒπc< Αy^ @ ΐΏOαρ‰§iƒ)zξρ"§–O1”>»ΫC׍pύB¦Aι˜8^1ΰXZJ·[έφρp9οqΉ>k 86KόΎrΙΑo~» 2ΆP1{K͎(4¬lXήπi»b·’Υιkk‚py†έχ*y[υα-η΅…,/¬fk&šέ­ Γ Ζn+ΔέeWf8Άΐ•_/υR™ίδ'©ώ&βB†N0uNX„θ>ρ8HZΑ‚ΨHιβ΄Ι‹›αΰ{`[πSΗγ$_ιGG²*ί…I 7φw(™0fΗΝqίκDΈ Nr3S§΄Œ)`i“νvOϊΊͺΨ`az,Άω­Xίαδ!‘±$tΓ­zΣθϋOτ&—σ\)hu#μ6ΓXί_"’@ΞѐuDάο Sτ$Φw΄:/d³Lpe†ΛhΛ›~ZΚJŠJ±Ϋ`.£Α‹U°>ϊΊKWη^œ*€ΐtΝ€(4S (ή–ΚeΔ pζC#ξΑπœφ<ι'¬·*˜’χ8ΐΔG9†,ΞX0θNzύ ΦΆϊβ^Jyε"¦F†η«΄dŸτλx<»8e©ίx» ŠYνPŸ;ηuuΞ‚eΦv}Ϊ©ˆb"`»ΞFB…Œ†©*ϋ³ žϋλΙdm Ά%paΒΒ­ΕήΠο\Α'{£aeΫΓ… +Φ~±±ΣdGB3VrΥ{έ0@‘9C$΄„};αk“Μ‘¦!PΚk  ΰOυ>>NΠπB4tRo\Νΐ2%76%\_₯+cχgΦwκ±ΈŒŸhϋuρ^Y_œ²Q+ Xές±ΌurnfŒNΗ…κΓΓuοHA†>@Ea»Β6j%‘Thv’T?ΊZΰΑυΉE°ΣP-Π5J΅RZέΓHAΣX˜s΄ΤM―Υ‰IΕm PΚλi‹duϋΕΒ1M΄f(/πΕ£R‰€Ιͺ‘*νEžEΐWwC/«Ι΅`’ψCeΰzœ‰HͺršF§κ M#αŸχ =Ατρν.uz^^Θ@Σφ'JR*l7Β΄ύi Π€:½(5{ϋz₯Όv$Θ-)ι/L›ͺV.γ³»=όςf‡vμΠη…ΌΚΪŠ9}$π<)α―lyX˜²Q)πpqc`ξˆ+ΈΙκ\H=j Ο%c‰t’§˜εu΄}l―AήΎTL…”OH„‘нΨϏ.M³݈ς}?κ}|œ`ε‘ΨΑλΘΓ+17³τϊŠ'x]#,LYPʊ­elπƒTΈ'B©ΰΗ₯Ÿ “&*άsZίυ±Έα!ŠN<˜Θπ泐³Βž'‡β’€aͺj¦jU·—\:sP+=ed,N’ ΆΊΡ‘ŽΆI° B$ϋk,“0]5ΣΐΧ`qΓΓΛ2Θ:œhlμ΄]V4όθλ.]·‘{Aͺό²LΧ ΅ΈξΣiξ[Υ’¦Ζˏϋψž©ΈΐΑγΣω%ΎΓ¦Š―=Γγ` Δ™ ]‡2t"ΟWT­Rΰ²―¦ώ»g5ˆ€Υ­_έο!ŸΥφ™ώHZ)wΛ Ρλ«96DS ˜¨θ˜¬#n ŸΡΤχ^ΛβŒ…χΏμΠ—χ{pc χxΩ@)§aͺjb―ΕΚ«Η…RΐκN€|–«ΉΣc&kϋΗώ,YGΐΤELΠ₯εϊ€₯κW‡Jcbύ«‹½ΥΫ,ψJžό'ϋ$ HΔ‡ž?+Κ:')!ώΈ#θ'ΰ δuEδ’΅ju#ZήτQ)τι η]ΪοHœ]%ΓQ’Ϝ\,/PPJ₯%&–q”°MBρŠzΠ !ΉYίέ©ŠZͺφ`»17 L™ΘΨl,΄λB‘BΧυ±± g TŠάΚΨ}yΛR^Η•―$%§¬£A‚Hμ΅Bx±B—•ψ3ΣΧv|\ž±α˜&mάZμ₯.ƒ_ήλαέW²y;Ÿm”σšRΚP»ΝHt]•Š…ŒJΒς‘¦Ζ %Όhμ‰—ΑšΟ:ΘΖϋ>WΐΨ„ΫΟΰptζB”Έo>Z³Jq%TgΫΑσ4FŠ~y«CWβκάaӟͽ+[>+ωΕ±±UϊTΥ@!Η€kΣ ΜŒJΣ0t’σE«ΫΎju"” :M” όνοΥ΅y?ϊ Iλ»V·}δ'ΤWΆφƒϋϋνΆ%`ΗxΙχWηώά@>™€δΉ‡Wη\ΑŽ"^Œφ)œX^=1Ž3uJη’ώA#U d6ΩιI+˜φ<xGW’₯<ܞnuωΉ0aΕRφ6n/»θލ, ©€ZΙP΅²F”—Α’|O’†ϊ'ώe0•θΘΓ½2kS§ΗW$ΩqiΓOσ|ϊ™R(Α₯]cΊΘL“ X”! ™bκœƒ±&d\jI΄ŸύΨΓΉRΠa™¬I½Έι퓨=Μ§iΔ*W›ω¬mϋ©^ΐΎ»―ψ YXής!₯ΒXΡ@Ζ©}pǍ`κό™V7JΫ$μΝ6Η ~Α²Ž€eφYR‚˜½Πh³θΕΦ^€Onwρƒ·σOΰ–>»`Ρ%°§#T­k.΄%ZˆΌ@₯`H]'ΜΤ ™˜.}ƒB€λxD>οcΔ0“ηΰ%΅Α­?yΗPΔuŒ₯ΙUƎΠιI:M Ή²©oΖό/Pψΰf‡z.SπΜxŒ‹Rγ(XW©X鬃²Άγ#k Lj˜G±Ώ@»«s4δ »­χV<,mψTΘjΤμD04‚ezqβ‘±n\p βΏύqZΖ«~Ο﷚uεv‘€υ&Θ8VI€’|+[>±™\)―γꬍ―—\n/ŸπΩ! S#ϋ£η~>‰ΰ°lθ+8¦ P)θ―θXί±Έιac'ž<]Νύί‹”Jݚ Y ΉΨ=ͺފpg₯/Pιδoθ„LlΚcάƒΧ5π8·’vB²}MfkJ9–ŸμΊ2νΣ$hΜ$*՘“Ώ±€ ƒGή@ba#Cο' =Ob}7@%―£V2Q -“±EŠŽZ,©ι³ΈEΦι?Όζ€θφR‘>ΉΣ₯λ 6&«gί)πΠs©k€Š9-ƍθͺέ“¨·"Ρu%ΖΛΊ*ζ΄oΖHzψτžOόΫ8LΏKŽηe°Rα#—O3ΰθLήZS'LTtυpύt–Ί&«Ί4–’Ί/ˆ€―]Ί·β₯5"^¬lξ˜ςΕ2Ω u¬€§΄Άp€’Mό•7Κ*Ÿ9~‚UΞχo›·&a¨πεΧ.8xiΞΒc0—ΞLΔΧN}SVQ#b\Ž_~Fϋ«b~¬ 0ƒ§Ÿ³-εLLTte„υνz±‘W2‘$ύ`".ϋOVuYΚkΔ8«ρΩέ.V·}ΜΦ,ΆKWgν₯ΌCδuΫ«kΫ„ζ'Xœγ―ή}%›JŸχW=DxyΑAΞΡΆκX‰Η>ο]/J=\ŸWω35 s5Ά)@Δ ¬ƒγοQχΆή±΄αᴍJžΪnœής7 )‡>ˆ35šK+C’piΪRŽ5’Ρυs<Γ'Ε£JζΨ6@9Ο|Λ[‹ξ‰΅―όMƒyϊ·—]΄Niΰ Ș “lJΡσXjΈ5 Ψ€kά6pLΑ²’±₯σWg“ε‚Žn/BΫ•hu"τ|™jPσCj@Δ“­cΜoΨΨ‚Kό[{Άκ&ͺ&ͺNfΗΝ>ϋ!.ΐΊΎΔڎbNOι( —Ά˜Υ°ΣΡσ$ή’M³γSΌh€_εPΰ~ό%<»` φ;ξx*ΰ*ΐGOω8.x!VΚεΌ¦²Ά@³‘έ•Τ‹+„ρΔ―rBVΓ7)aeΙߐ>ΈΩ‘|FΓtΝμχΤ₯ΒTΥD₯Ψgw%,€V7J₯Μ5A° ·―eΤԐe²ϊow%-LZ)8/ω|±_½’λq?:Π«_ίρQ-θΘΨά"mw£ι8lμΘg4LT LΧL΄{[“yΩRrΫ¦k&Κqpgεh``R=>Aω?/ΊΫ«γI% ΰΨ6€eΊ:gγΞ²{"ΡφZΙΐεžό»Δ•ή!sŸ`\’Κg΄΄Υ@ο'‚ ~‘ݍ°UG <ΜΔΉŒ)„Ρ21¦` q΅aΐzR!{lξ±Έ‘8pΠl–ΔJTR{νΝ3Ί=ld4LΖ‰@"o;YeΡ‘νFRPΔ@9\ΝŒκ­RΦ=|~·‡wnd_€!υ<Β'ρŒφχŽο½+πψπ΄q Ο ϋπΘa€jeΥ"ΣΓ’~ &H ρΝSŒ"ΰƒ―:ΤμH\Ώΰΐ2ϊ«wΛ¨™bŸrκΓuΦTαο2m[ΰςŒ7f0 ψ'%°Ά η1o>UΣ₯‰G½b+nχ¦$¬1Άηq«5Y͏•t¬οŒv₯ e¬θhΘ9&-τ|ΉoΎ8υ΅LΖβ$€bv€»q¨υ‰FΒ1‘ ό$ξν“J$€ίπ/‚9½‡«¦L³φZΓ/h΅¨γR<ωχ<Άυ=ΞhaX8σJΚUIύΘΟΈ~ ΟP &YΩfλήJAΗό„…©ͺ‘[ΐ6 Z¬e %g¨~¨ΠξFTο舀JώΙ~˜€AΧψό:=Ι™βφD³ΫΓτ˜‰KΣ ŒΞg4\sP-κΨn„,"B§!c±!Q1§#λhhv"Dπώ—Ί8ma¬€Ώp€ΐ_ΡP`ΐέ»ώΓg΄Ορ>‡AΫήKwŸ1ΰΐ IkJ?ΰAρM{Χ_/»τΕ½nBΩέwŽ ˆΫ€[ ’Ό"O\ϊˆ©€KΰΖΛYΘolC,oϊτΡΧ]Ϊn)(;ŠX3 ˜γJηD…Ε~†-κ7χ‚τxgΖLΤ[,Δ6,@Χ•ΈΏΚnY‡[²_/ — ‘dΫ_₯Ψαu8X \³•mŽω1Xη±γIJ©ύΐΧ` ΡγΪκΒ€E»­ξ±“y΅¨γΚ g™ΟώΛυvψHe˜±’Ω#U·!VΆόΏ ¦A˜-+ύPΑ2…ϊή«9\˜²PΚip,1TˆF)¨klκΈRmμτpΝ§‡λ¬Ž%%³Μ‡|0“D"Iˆ΅ 26+ –r:'ΰs2΄Σ5¦ΞX€ŽλBJΖόμσ6ύ­οΥ l”σ« `qžΞSήOΐ·NπΉ0GαS:Ž–6:Q―ψ#‰}m"ζ²&́›{©f΅ƒ LObc rι…^„εXλΛϋ=\΅ιε[}Ώ"qά—Ώχ”χ3žά‡…γ^ΒΣK&β}œΗ ₯€ou°΄ιc²jμ“''°Λ­EnΝfbeΦ„>m™,^ΗΠΩqs€βίΖn@»M<%Άέ0Y5ΰXΜθjvŽg§»Ν[uSU“»ΝπΔfs«[¬U0^f©ΰNO[=>ςΪρ—(KΦK`~ΒD)Η•έ;K| ηΖMT‹#ΕξψΛ'uŸ΄˜ϊοψoKzGVfΗMŒ•t¬mοοΙœόο,χ°σ“?ΐ_b€ΰ Φ\tN¨Ζ”€κ_pΤ•Y ε‚]γ’Μ£d€j ε-d5υΚ%/ΝΫΨΪ ΥΚV@…ŒFnAG»νσ³ΆM‘–Χ\_byΛΗ^;ΒlάLΔ½’f7B1―ƒ˜›°ΰϊ [ž―πΣΟΪ45f ˜{q…CWΓ3xϊ ΐuπΔ;μ©Pΰ–ή+ΰδώiDg˜ψ«Dΐ†Oήκ’&γeϋπ ΔβeνPΆ/J.LZ(ζXHΐά€©r1ψΧιIΪΨ ©Υ°Χ:<ύ1΅΅1Te/’άφ-η5Ψ¦ΐlΝΔ­ΈB:GW)n\r”a{λ‡xLρŸΑx ΐΗρΟ_Γ1 @ΞκΚ¬΅ν€ΝΨΰδο+άYιa»ρhe„vRΞ鐒3έζΙΆ•¨Hύϊλ9υϊ•Œ²L:ΡJ€‘lGΧΣ5ƒ’ΚΊZΪh―Ε<ώέV€ž'SΞ{§'Σ’ݍpΥe‹a›…Žfj&<_¦@$#~»^„NObeΛΗ_uπί*|£(IίΰΘƒΑyO,Λ?&^ΖΪξ@€wΐ`½SΘΰœ8*`Βyœ‘ˆ'[ϊρ'mj΄£tυ΅ίτ&‘όΥc%>€Qμ›Αz~¨ΰΨBMVŒ‘ΟX*ά]φΠs%ŠYΊζΩs·MW/;ͺΥ°²ΠXΙΐβΊ7T”‘ݍ°ΆΰΒ”…JΑ@΅bk/€ˆυb4-V Œ·‘ˆΗι0 ‘V4lSΰ꜍+SyzM£Τ(θΠ5$: x¨²‘γ5~5ƒ‹SΦ(ξΌΘ~bΙς“Nš~œ{Χ.ΨΈω ‡ž―Kυ–A#…₯Mυ6Λ; žŒΥ>ƒ ύ‘–“ μ7°ΎsΌhΟΑmΧJ:~γΫυœ­PήӊΈL¦ζ'M”ςšzΈζΣ^+’Ιͺž'Yw¬ Uί€BͺyLHΕ‚’Ά@²έ¬#0?aαλ%Q€πΡΧ]Z˜²pyΦ:―œνHψ<ξ†F„ΐΡ€ΗΕ%°QΡΞS8–+`;δσ8CρρΧ]ά]qQΘj˜›° ‰ΔΆέΗDΕ„‚(ŒW L– ²}p λIf5uBόΰν<’…ΤQ!Έ·βΡΗ·»47n!λ°ΜΑR}’`²8*Mšh―R³ΕΆΌHٚˆ%β ‚R̜2tΒΕ) γq5™όΛ_ ¨•tΥμHJΜ|@Ξf9βδοι± c’‘|πάΊ&&Χ V6•eo#_xIήη§α§ϊGώϋΰς⑃RΐxYΗw^Νa{/‚SŠ€'b Ϋdυπx Λ6²!O‚aΤΧ‰—JAΌ"‚ΛS[υ†. €J΅Ί07aβ·ΏSTΣ5ζ¨>Λy²˜Σp}ΑV‹>ΦΆCJΕ‰~‚λI4:q‹ ώΨi†h΄CΜOμ׍f…@γ­k»Œ¦ύˏ[4^Φ‘Οž·^€x\ h=₯폸zΒΟͺψ³³x: ΐE<½κΒyœ2D\ϊω²L+³6²ρcuΫOˆ€Ήq†!φ=_βζbv„Χ―fΤ₯ι‘Šψωlξ˜¬š°tFϋ7;Ρ~³Έεπϋ?«ΣoΎST7.Ϊxύjω¬¦ΎΈΧC»+)±οτΡ4^‰SΌ-Λ`Ρ·ƒ!%ΟQΔ‹Λ3–ςC…•ΝΦ}ς|™VAΊΔN³P± a$ϋφΎ‰ξ@$ΒpπDφ‡«ΐΎρpzdόΡί°ϋ$οχΣHΎπgώΗξT#5=f’ΥaM€A`‰cυoΞ>΅Ώ}³z E© 1n,dI•j>‡'aΘS/`‡§ρ²ί|§ jΟ‰2—d·—¦-eκ„»Λ>%ΨJAG1ˁνF€f'JΛUR²(FΧ•Έx@&XΐtΝB½ΝJYK›>~ώEύΫη­€ ¦ΐ+ξ§•ΜΈŒ“ηΉ908ρ“'|œθœΗ"FυψΣ6u]ζό2μ½α {­ΥB_ρ/Υ1i†¬U`ωZΧ“(ζ4|ηΖpΕ?₯€OοtiqΓ#hu"Ψ%6JΫά ΨύΥ° Φ]1MC#lν…Τ™”*λuuΦΒ…I“6vC΅Ί λJάΎ’€±Ώ‹”*Ίξ6C4:!" (©Jžˆ«ͺ=/’ο½–Γ•yK™&α—7;ΤμτιΫυvtβΦς°PJazΜΔ0_π{²Nžh< πOό]piοJ †Œ-°΅bqΓK]™D\Β‚+I‰Fˆ~OEˆΈ{<[&kC'Ϋ–R—rLb‡@i‘$Jω¬ΐυ φPΚ³ 60•iβ˜xγ±ΐμžχ>Ž؎ψ<Ξ@(|t‹Ksγ«ψΕΏ“Ra~‚)ΠΙgλνλ;v›!¦ΖΣ€Ε|ίΊžU“#6wC||»K‰g‹/ЊY ―\ΚΐΠ‰+Έ€;(.έ‘"πά ]#5[3PΞkΈ·βασ{=ͺ·Xύ/±$BΛxyΑIΫ«kΫΑa¬AΌΪ¦¬-Τ·^ΞbaΚT΅’އk>ˆΰβ”?CMαNš ΌΌ`+Λ QL­Ÿ‚ΧO4žF0€ιK°ΉΙ‘§e™€²ŽΐO?λQ£} γ` ωητ₯aΜΨ° zJ³hvBθ:»C%všF±m€HρΉŒΐ•YKζ2#m>Ό„b0ΜΑqΏ΅ΝɊ,ƒπγOΪτεƒ.Š9γ%…,£Y•βδ3J9 ΝnΟη}σO`/…Ν½] ŽώςγM” ” η­€3 <9_~ŠϋxœœŸ¦μώžΌ>Aι)Ÿηyœ0wWρ-<}ό,x2?mά»φ=ΆΙ@Œαδ•ˆσxJΑβ7ύω‡-ςC…«σΦ‘₯ϋžΗΥGC'ψ UΪ·βφͺiή}%;Τκ—9ϊ!ΊΒXQΧϊβgfl£Ύ²ε§6Ύa€β=πύ7σκ¨>~ΒHΈvΑV³γ&>½ΣΓ/ou¨·(Φϋ/ηυTW₯ޏ\ΕΨlHJώKr.Μb³bbΟ—toΥ}dΐψKσ6 ΓqY^ωθiάϋ§•ΐΰΏ ϊ8 X+队΄πΕύή#•Q&+&¦cOκ­F€εM¨Ϋ R@€ψA½8FE’­|Χv\ž±QΚiL=>° %&Η 5?9œmδωŠξ.ϋ”˜—υ<™*’V :.NΩΠ[―7c~3 fkή˜c!8¦sOΧ υϋ³=‘° ‚™f9‡[Πsγn/χŽ\4΍›°Ές%σK΅¨©BΦFΉ A)Π½ΥΣ-ΞΆΦKσ–4’ϋ{VžΖ½š ΐη`S“Ώ{άLΤk—ά^rι΄ZΛ•'šFh΄#ά_υD£•ώΈ7ώΞΛ9e›#ϋ.ϊί½~ϊY+[Ύ˜·0Sc»ΰ΅m?ήΛ€Τ]ΠΠ Q€°ΫŒ¨ήŽPΘj˜3P-φΕ…†«ΜYκϋoε՟Όί^ —A)nw±PΖιwKΐυξ―zxiގι/6€Άκ‚Pαǟ΄iΌlΰΒ€yxφ"AήΏŒ'Ÿό0Ζΰ4w=ΑΌΰ?BΗAΎ‹Σ·"Ξγ πιέ}όu—²ŽΐdΥ8τ™ΥmΧ½ŸΕτd•ΈmK ˜ΣΰΨ‚†T;‰€›{ψρ§Mx±±Ωώρ'Δτ˜„m T ϊ>χWS'Ό{#§†‰š§θζCΦοοΈrŸύ.Ε.­λ;>ζ&,Œuμ6 lΦϋJρόςφυμ±η’·§Ζ ueΦ¦z;ΔΞ)@ ΐ₯i “UcΨψ+lΛO%žfΰψOόΣ`—³#Α€σ“&¦Ζ <\χΉζyαΟjΈJyVβ›7ΡκFι"π­λ5QΞ S XΫΘσ%.MΫΒή‰₯†Mpγ’£ F­ώ Ož}“†xόM Ώπ)ŽΡαQK¨—₯ΰHβΟsiΫπC…‡kήΎ,qTXα•KΞ‘BCƒθΉ’~ψ‹&ύΕG-κΊB°O@Ζb™αυRφWεa€Πυ$v›!Φvά^rΉ5ΏV«Ϋ>~y³C?ώ€-–6‚%ΊFψξ«9uaΚ‚¦!•δLt ΊžΔύ5oŸaEΖ˜›θΏΠ δΉ4m#S-—6|όδΣ6=*ˆε<žzόX&χIΕ°Π£„{όΝ't,ο‚«ηίsˆΨθϊΛΥ[&*j%#ΐΉΎŒΥώΊnMp…3a MVM\ša0ς‘¦Ζ†+ώ1πωσ¦.ŽύΜ^+DΔͺ±Θ:¬ΖWΘjψΞ+YeΗ‹ε_έοαΓ›]¦χ©£'π|n‘B.£₯¦qRσ–zύJfδυΫ‡τ“OΫδϊlΦvqΪ†mžΘ”¦Ζ ΜM˜£l]Ό˜~*ρ΄€-ΌΪ8vΖ½6o£ZΤGN†¦NΈ4Ν=¨0βΙ»œxς—ŠQρ3γζ‰τOύ@џά’Ώξ€YZΦΡ0^ζe§ u„WtΒH~*~I\_bqέΗ½Uάμΰ?Σ]ρήηm BEΓ²F–‹κϋoζΥdΕ„©Xx"Ω?ΤΙyvzRb+ ‘\˜κƒ|>ΉέΕ‡·ΊηΚg3^Ε“U|ΐmUΰŠαίΓ“qοϋ[8¦2xO7±νΓ&=\χ0U5piš[…~ poΥEΟγΑ%Ή/}ήΑ΅y¦ΑCE"ΌY°΄ι‘ZΤΣίΉOΦvΪΨ Θ4hŸpΩΑΟ5Ϊ\OBΧ •«φ½ωRFM™Η—ώΑ=λ;ቔ_ βΖ'$γeΖQ9&α»―fUΞN "ΰ_up{ΩΕ&ό³&-θ#—B―]Ξ¨¬-†ν‚|„'[<|,Osγqό`'±£« (ζ4uύ‚3τ ΑχcE›XΩς±Ύλγ4A.N[ΘZ£9 ιδ˜Nώ‚€ΙŠΫπ…υΰΨ 3 Ϋ(ηΉΣ²Χ α2.K)4;ώμΓύψ“ό@ ­)ΜO˜κ[Χ3*©6dl‘Ύt,†€‡iΣΓνε:=yh;Υ‚©ͺ "XόδΣέ[υθ\ θL…Ϋπώσ=ž$²ώΈ π¨“πpαqβ]ppΟ!ΨεοΣ;=/Έ8msET›{,6–ζδ3Ξ:/ϋ&ψ•-Ÿένβζƒ Y 3γΖΠ§'ρΣOΫΤξ2“ c‹cŸjΧ—¨·Ω¨”γΛ[/e0Μ~]*ΠF ¨’½˜x,\ΩςΡξ²"νάΈ…·―eΥ₯i‹†•εχW=ϊβ^ €υ«[^¬rk`~Β:ΆΝΰwWgGRo³υ€οΎsyšγ6Ψΰψ³%ΰε[Ϊμ1€IDATDŸώ~fΜΔD¬ρΏ΅`yΛ?5υΒ4σ¦5Ρ±HE@ο}Ρ¦0ΆN^†Z‰A2Ϋυνξπ~Oœάΐ±ΒHa§ξ;f" ” ο}Ρ‘χΏμ€+ϊγB0χΩtpuΦΖ+3Έ8e£œΧΈ2 Uκ°ΎΰΛ]μ4φ»kΣ5ΕXΤ£έ•ψ“χ›΄±ž'g'’\ξ_OΊ\Ύœ·π―i³ώMp;βόχŒƒΈ΅θ?iϋΟσδ―ΐζ==_bnΒ„eπΤ k\)άkGΨΨ R v£’έ‹PΜiψξ«YeθΗ—ζΕΏ;Λ.όϋμ…¬6t’άi„©,ο_}3―†Qεˆ€‡λ>yΠ5ΒdΥHΝΤFEΟg•Τ0dEΨοΌ’Sϊs!0φκgŸ·ΡuYΏ&’ΐ↏­H8UεΉκΈc}yΑV' ώέ/žŸjh²šέ΄ΣθΣ’…&­4! Ψ©ΨΪ PoGΘ9΅’©˜― Β[Χ²j’2\ρo}' nvΙΈκYΞλΘX ­ίϋJ± l\™t}……iC͍›CŸ?PXές)’PΜιΈ~Α9Ρ‘ΠΧ†™j€(‹>yΎ’ρ² 8QF,dyΑwaB)μ&–φ1ύΌ”Σπς‚s… ΰΞΣ~&žEΏϋW= x㊣n>θΡ ΗσXΡΐΒχUšχVέTtη4#ˆΐΒ΄\fΈπ°SιΦboŸE)§§8…½`€dΒσ,d5ΘX{:Œ…3ο”w³Όˆ±’‘ςΩαπxYΗΝ‡=άYφPΙλ©B`ΦιΏΜ“UD@½ΖBEL­‰"—ϋΚy΅’Ž΅ΦΈ½δβOΩΒίx§@–q.tFBΡχΐτίΧΐζ\oΰΙ­Έ˜‘ππ―βd’Ε€.€1ώώωγυ ƒ¨·#ϊγχ›ΨkEΈ>ο ημ υxρ —έ^„»+.ό λσ‰ΩΝά„‰7―ηδK ϊό^ΪέŽΝήJ1 yvάB)X₯:‰X›@ΞΡ0S3”¦ §nν±¦B…@ͺ‹r"fΈR;Q>&­ŒVG•Y{6P6υ)‚WflΈ5~ε8‘‘Έ4m©jq(»@ΨπΑ3xGžUPΞQ'&05fͺ+³}z§—‰ΐšη+,oωρĚdm'‰€Ώ0iBΠπ‹J@ΪΫ/f΅i?S3aθ„+±]ϊϋVvι8Ɗ\ŠκΉ²Ÿ y€@!«# 9»Ό6oAӎ/CY&©BVΓΦ^@;¦!PΜj+(tβΙ½˜ΥΡqY@(‘Δ4:ΊžΔTΥ€ζ'-ψa?Sύψv— YMύ•7rΟθΡ8‘ΐοΜlτpς‰< ž …§pLπ·όϋώ°ZΩ݁Οi`α‘ΏΰŸπ7βs9/ύ?Γ zž€~Π€k^_ηΐγ;ΉŒ†RVCΧeΎƒΌ`™οήȍτP!‚zύr圎½V”*ϋžš “1T˜7T!« όχZ}υΐ₯'!₯‚ –€N«Γ"©ͺ^Ώ`+ΣΝF []Ϊά RΫα$YΡν\ Z7 ­wƒpγ’“²Έ†Δ|ό„nΠxV @rRοaHωOΧ€wnδ€R$[’}/0?aBA|Ρ‡λτgθ€ΜγXBͺΌD’KQ―^Μ1‡4Ιθα‹Λ3vκύ¬Σf‚P"ˆˆ­!…ͺEΎΌ­›ϊθ:AΕΦΔ±ωŒ!€‡k>4\_Ξw]˜²T!«Q³Ασ%6bώμ+vK€(Ϊ|FC>£₯@FC'¬,{π‰…)Ά)puΦΑέۍQ€π³ΟΫTΜixν²sΎJ;!ΑΌ,τοhŒψΞeS0jίΒ“Ÿt“gγ·ό¬t ΐρˆχ}pΏ_Ώs>ω?γˆ"য়΅ι‹{ ΨKΤS_ξνF€‡λL‹{ν2+„!—ϊρ5°Ή±`γκœu"ΦxEWΥ’Ž­½Λ>΅Ί2 ·{2R©ήΏη+ΤΚ:ή­d†ŽΧa€θgŸ΅ι£[$Y K;(ηuDxΈαΑŽo(o_ΛͺjI•Θΰފ‹ύ²‰ dΟAϋMιϊνbBΦ˜3SΪd³aaΪΕ. p’ƒυŸz<Λ ΰ?+‘‰DVŠKΧ/ΝΫΨΪΫ―ͺΔΞPΪΐ‡ϋeŠ€ί'٘LόHi†NjTο%΅»’Υ«ƒϊ¦A0 ύθΜuΰ<Ώ”Σρϊε,€Tπ.;UΉ>Συ Y>·έVˆ―šŸ4‘±Ž¦‰(T‹ΝO˜ψμ^/₯ʁk°ΈιΓσ%ΖΛJyfœΐδQΪjΔ žŒΛΰ€ΔΰFΧ“ψ“_4Θ2XWϋΌp&B¨ψŸxΐ ΐM°MθxΒ­%{ίπίχκŸζ€›”ς 3ρΟ_Ζϋ4>w>ρ?‡P ψΕWz‹4‘ξ–Ή_Ž<ŒV6}΄{K@1•؍ sφm‹ρLΛμΎrΙ–§‘5LVuUΘ ,o΄]ΡκHάYξ‘ηυE’ΕΦw_Λͺ㨂wV}|q―/Ϊψƒ^ °Ά Ρ‘«’+Ϋώ±ΗU-κxηF6;·―NOΟΏθPΗ•)F!ύψίێ?³0iA‚c%}h»œόeόσLβY&kF5y4Œ—u΅Σ)ŒxBκΕεPςІβUΖ«j)ϋ7%‘ηΝΤLŒ— ώύˆι?qΉϊκA=_ALΩ(η™zΈΊνΓ$ Λ=†Ξƒ[sU"ώχͺ‘L#Ά38€~Τ"~‹Y ~ PoE*c‹cΦΠH]™³qσ‘KΡΞ ›1λ ή‘΅5LV LV˜ϊW‹“)ϋ›· ΒεiJςχΪ]‰?ωE“XPΘ½ΣΓβΊ·―κL‡ώg¬mϋ0uΒd•Aμ“UcΤδο‚Wν'tϋGΖ³N6ό}°™ΐ1U€rž‘νŸήιbiΣG$Q.θ(ε9λΪk„h΄5ΜM α«hu™ξβϊ Ž%03Ζ“f½bqέK{b@_Β’WΰqOHpο4ƒDVΆ}tέΆΙ/‘ Δ+€ύωΰδ*f5(υV$&«†’c0 ¬ P.h΄΅¦HΞG)>§Hͺ“E\!½Ÿr_pyΦFΈθ’ή ±Σρ‡?oΠ?χύ2j%ύά3ΰlD2ΩΪΰ~ϊ8XSΰgžηδ{ώ€<η n=tιG4 Ό4η ZΤΣEΞΪΆωIΖW΅Ί!,“PΛ訍΄bZ+ιz%ŠΨε΄ZΤΥδΕΏa‘|±˜ΣπΚE†Nκ'Ÿ΄hm'€Œ@ί}%7²Ω]žΒ…‘ΒڎbŽ ΖΛ7φ‹ι)\˜²πΪεαˆόdHΏΌΥ‘HžΞ΅VͺΈ(ΌtΑRšΐ¨ςϋώθ‘oϊ#Δ³N¦7όΛ^ΗqXT1'°±P”LΈ§δ§[¦ΐΒ€Λ`ΰήƒugL5όnΗ}―s05f ηhB•jR>ƒ“gς’\f‚ω’+[+τQϋF†NΈ2k#ŸΡЊ©‚NŒΦŸ›4qœ­¦Rά6xλ₯¬Ί³δQΟ‹D\΅H4ͺ―FF ^ aΆβͺΚDΕ€3 ]©b.NYΈιKτ|φΎώƒχτOzιά3ΰlΕ9’ώ<Ž SΥώψύ&I\›³QΜρP„Š}° ―τ Τb‘€D­ ςtzμΤΧμ²8ΠλWΨλΧ'cᣌ 1K½Ό`czΜΐ‡·Ίψδv—ήΌšQScΓE…6χBϊΰ«γ'δ„ύ΄Ϋ 1^60Q1°έθ3·˜…πWsr”‹”L ‚G{Υ‚P‘œΧ05zυοƒY>{{OΟ#XS^Γ1³±Rΐτ˜‰Ωq_/Ή§–A„ΤΦ2Œ7„ΰΦB­’γυΛΞ±£ΌŒ€υ}NZ"ΩΧ(ε5‘DΟMΐ‰Œ7`Z"λ`o7L™˜ͺšiikP.ψφ’‹H*ά[ρπϋ?kΠίώ΅"†9qΗyœΗσ AΐΚV@ΏϋΣu=‰λσŠΉ~ΉΎΥ`„‰Έ0« ΰΙJ)n΄{n=μΑυeͺ«?VΡσ$v[>ΊΥ%AΐλW3¨45Θ†:M$J°?x+O7l™‹ΑΠǍ1Qϊΰ«ν4†Η‘δ–m)§³%zΕΔύU7]½rΡΑΕι‘Zό¬χί©Ω–taΒ­Ev<ρΉΘXo]Λ(Sκ6€b₯ͺ‹ΣΦ‰&_ ^g4ΜM°k^½±_œ6c>ό±ί·j%՘'»Ύ sB·AΛ¨xάm…θΈΓΏ§ V†Ĉ[wΠΒ‚DπFxh‚π`έΓ§w:ϋάδCΘ:eΖ$³ ft,rΝ;ΒHa―¦€ΚΔP`6– NΆyσaό~ƒΪέσ$ΰ<Ξγ,°Ύού΄A›».NΫ©Ξ`0©χεM_>θbqΓC»Ηšψ@ ’>0VF’)…αΐbcs7ΐό¬!ώρ_μΡƒ5?m;>J¨U„ P΄²P1§γ$ξ±Rk;>zž„i¦ΗL˜:%ΐ?Œώ}v·‹ou°Χ Y†}ΜD9?ZI6ω~ΦxϋZVC4]ΐ ΐg`έgΟ+8γΉ=μ,ƒΤΫΧ²Κ1Ov˜–ΑžχŽ%ΰω 7ά}θΟz;‚ͺ‘g1«αΒ” M#tz JŽM¨tDRaeΫ‡œ Lm„Z‰u£uχο (d4˜†@*vΏ:pŽ>‹b }• u4 V₯"p ‘γFΨi†x°ξαΛϋ=|v·ƒεΝ>–ΐΥ’Ωq35‹iŒΔL€ϋk.V·}ξaΩWfωAŽ;ψμnό~“ΪηIΐyœΗsχ{?«Σ↏jQΗLmΏΒ^‚όβ~_/υΰΜeχC™Ί“±ͺ]όŽ{Α~]3œ’³MBFC9―c¬€cΊf‘ZΠ±ΆΰΣΫ=Zέ (Œ½-p0‚PΡζ.:ajΜD>£!c‰τΗ2t DyΈŠλ£Υe&Φw^Ιbπ/ŒύβΛν5#Ϊ½‹ΜΛg4ΜΗΎ4ΗE‚£zϋzViF­ώ?πŸΚΓq‚x ΐΑψϋώλ`•³#/”‘Ύu-«ξ.{Τu屓j­d`ͺΚ΄•υ½ΰΠΚ=Ρqήn„¨ 1©|FÝeΆλα‰J‰ΨO.£!’l©y1p0„ΰŒT@«+qθ܈Knވ„Θ9<υ'\ΪHaΤ/ΕER‘έS0υ³γ,΄²εCΧ₯ΌΗι‹?Q6bjP/° M.LΨ04ΕMa¨πΩέ.Πίx§€Qr ηqηρδC€e:-m°αΧΕi{ŸΑ Ω}4: sϊ. Iˏˆ₯kœPΖ˜­™°-~5˜†€e0/™fZ5H },ά^ςh§bnΒD)― ₯)LƒΤ»7²q…2€Α6-Π§*!ž#Ι ŒTΌςC…ZYW•‚>Rροφ’‡/ξυϊ`« ŸΡ03fbΌd’ΥeCΈγβΖEGM1IBΏχάVΐσO+Ð ˜©™κϊ‡>ΌuΨ -‘Γ]˜΄ Ε†A‹^ZͺŒ0RXΪπq}ήΖqA8amΫGpBΗAM#Œ— θ‚Ϋ c`X`›l€ΐ.RAΈΤ‘£αΖQΖ-€ψ8ˆΈ8vήF_ΉΥ°ΣaΗmˆΙ*  A1ΒΨ·O!€™qšσb5’.]§Ύφs,]™€ε4\˜΄†š)–N)ύ/ŸΡpyΖN­%“γ΅L‘Ύ¬ΗF,uLΰj ·8>Θ‘’_P]λ«zyD―.αωŒ]#ψŠΝ-x€-‘•β$ ” _ήοAJΠo}§pN<σx!XΩθwR§νzˆΛ3vͺς©3Ÿ6v|\»ΰΪ1‡ΌΜΎ †.RΜXIœ+χˆΓXά <_"’ ΅’Ϋht",{πCy ΪΐeςkσL_Ύ·κβΓ[!ΥΚΎύr7.:Κ6O&!|0E„²ŽPkΫB}πUWlΥŸγ1WΗλDU„K3¦Ζ0βvΚn€Œ­αΖB&­$ΘΈλϊ2½FΆ!pqΚΖ½U7¦JφΗΫ7dΤxY΅ϊΐήλΟσY: ΐC7{°|θ‘ΊSUC½v9C?ώ΄•ώ{Βχ/εtDsΫλ­0υ”¦§&#.o)JevˆxBVΏφz‹λ>«χΖΫ"`ίΚώ¨'—ѐΟxZΏσ[š|‡T :ͺΕΑƒˆ“ƒu„•2—uΌΌΰ cσ~5U=_Β _δ( θΪώδD;ω!χΧΆκκνef eL1 BΎήJ_=θ!ŒύΝοQΙk犁ηqO)ˆ€εΝΏσ“:ν΅B\™΅Q‹)Ο‰’ιΚ–‡jΑHΤͺEϊI-ΙX%e‚PπžΘk%^υ/mxΨ¬ιΒ)1ΚΨμwEŒ[R\ B"Œxό²MH²Γκό¬A·]ϊΞ«95?aͺΈβΌΠ"57a"ŸΡδ/ovθγΫ]ju£4 HΗi\š±Q+ΆϊέkFΈ½δ+₯"M"ˆΨ Ωw>,ζ4Όz)ƒž/ ~(aκ€ήa‘_±Ÿψ>οηι,$[= ρ ή|)£n-φhk/„—έ'+άχw.ΝO°ϊŸm%€NW½W ₯Ž—J%&*:6wCFΓΖe.ΎρύΓ“’Kγ–ΑG3ξ›'e§(:zξ6t6Φ βοΈΎLάδx…`σ#M#V5KΌ΅'ΚFšTX†ΐ΅y‘δžX)—³ΛJΛ°L–Ž€B(tέ9[ΐΤ »Ν{Ν弎+³́ς.Mx#lΉoζrπέ"jΓ³ίσ8σxΔΈ½δύΌ‰v/ΒKsΞ>ͺ_6Ό2γ ‹ϋΈJšΰ‰’ΕP»'qΥEΟc@$Š9 ΅ϋ¦τ&IΔ‹¬Cƒ(~ Πσ"Ψ&³’±H·]¬lωτΪ• Ύu=ϋΨ"B₯Ό†ίψVA]³ρσ/:Έ³μRN•’Kί~9«kψκ?ύδΣ}v·ΣθΟ¦Α-]cq6Ϋ0β pΏΚΐ /"ΰςŒ5J1•τό_μ<ληη`œ•`μ+ώ&ΨΔδΘ*@%―©ΏςF_άλ‘mŠXr—RΕ₯KΣ€C 龌7ŒV·LU :Ό–T@ŠΎΌί‹Λ@*1Ϊwt§-Œ—zžΔΧKμlEϋ=Έ}`²b`¬h Œ¬yhtΒΤO`P2ψΥΛταžΗX/`³ ”Σ‘k”–£4`›qF6YΟΥLLV τ<™J~ŠΨxΐ±5h‚Ε‰vš!J3΅Ύj³γ ό€©DDΐύUψ/χθ·ή-b~ςά@θ<ΞγIσ{τ£šδςΠδŸD1§₯ŸΈ"°Ϋ ΡιEθzWfl”σ:z.γ’όΑ2~tLΟb‘`4‘ŒI…ž―PΗ’d{D,‘ώήηmΊΏκαέY\_p`›τHγERvŸŸ4ΥDΕΐWzψΕ—¬ο€ΐ`ΌKΣΦΠm ξ­0[*y±tpJͺΚZά Ά ΒΕιΎΠR»a¬€cΌ’ͺj€?γ=χΠώΛ?¨<οcHβΨΤδ†$„εΌNRRŒzηi-ιΣ‘BΧ•hΗϊΥ{mV‚ΪŒYɟ‹›>2ΆΐμψρΚNBπJύ‹ϋ=ͺ·Yg?ˆTΚ… #6 š· k„΅[uΪμ+ψΣώM0]1ŸΡΠμJ¬lω©+_’0$‰ΖW2j~Βϊ<)όό‹6έzθ²ω…%°±βήͺΛ«ψVˆvΛϋI‰_ΏΌ¦NΘX1§ ΓŽυ΄ΨΥP1ž@*T :q{ΐ,“AC₯XcΌη±jX«#±ΈαS1§a¬xVςΛσ83Ψζψΰ«ύθƒ&ω‘Β•Y;΅ζόx±ΥΈ‘qk±‡έέΨνo²jΒ46χB° lƒ+‰Μ[ίά ΰQΘ9Σ€#`»™($UΘJΩVΫ1Xοΰ±Ά»wW=ΪͺT+Θ:βԲk„Ι1—glh‘Fΐή* Ÿ=ž³—(ώύρ/΄ΣˆΕΑqH@Ž\Ωu}Χ“(ετΤ`mnΒT΅’>ŠφΧπ―ψόΙ?-p͞χ Δ€38 Θΰ˜$ΐ4H͌hw%yΔꢏz+DάΒx’NžK…Γ[R>ΏΫ£cΡλJ“UC½{#‡ώ’qH’—ˆε%ΉΰΝ½ΰxAƒύΪVύΏΧ d$Μ†…)kdR„Šš±ζ€©σƒξω—;y€MƒπΚΕ ς ›ρ `›„Œ£Α2†ƒ±|₯δ2ΏηΛ}€Β[‹=̌±~‹/q&ό`ΝCΧ“Ψm†ψ½ŸΦΙ Šxυ’£ŠαyœΗyœ<ˆ•ώήηmόμ³6I©ΈŸ]:,ςΣhGΨΨ ΠκDΈ0i!c ΄{QJ/N@Εf ω'«F[RΖF‹·»>―^.*]j5'lψwΈ§?«§g-θψwόμs~$POΐxEWvDς”Ν?¬΅’z+"ΧW°£Ÿ^±ώΪ·ςhv#,mψi‰hΌbΒ6™zΈΉœH[ΣΥ‚UtŽ6β2›ΐW3Jώ@μ4C΄c•+Φΰ ΐ‰.BΌο0ΠπC…Ιͺ„ejΨiΨά ‘wςY¦%J[35“ζΖF>£α₯9χΧ\lνp=‰ά’V'RΏρ­es­€σ8QAlμ…τΗ?oΠύ5cEs&²1ΛΗυΉΝYΚ3Cg» έ‹pεΠ4YŽΌΩ SΫqR@žŒ˜S_+λ)3ΐΤ γ¦L•΅n\²Ήr Ω§dc7ΔΖn€ T$UβcΒΣ‡T}ά@*Μ£˜Y΅EZΪ?τξSΦμD©*αέe—>ΊΥΑw^ΝanόρΨΓ"ŒΧΩΏ`vάLέOO»‹Σ&&«ΖIΖΆΏΰ½'ϋ΄<^œ΅~Ά ώοχ₯€JQW―\rπγOZ§šώcϋIL™θΊΧ|\³†ΚW‹Ίϊ­ορ»?©ΣΪv€\F€ύνfΐ¦?4zΏY›Ew€β Dt„Z WζΖGƒθ€•M~¨PΜ1&BΖΩύiƒΛ„άBaMF;D½ΕxˆŒ%puΞa;aΙ€EΣΨ’qοpyƎUΚH|τu—Z]‰ίψVώ€/ΚyœΗ―lά^ςθ‡4©ή qqΚΖdΥHΑΐέl\)θ+κπ• z:ΕX–˜›ͺš˜­,“ ₯ ]'\š±!ˆs„―θ¨ud,M@€xiž€ZέkΫmΧYεovœ1J©}­ƒ T©"a>£αⴍ p… d‹a)™’J/h΄#dͺΉŒ†Οξv±΄ιΣW™-PΞ?YN4<|r§KSUΥ‚bˆΝ˜Υt’ˆΫΔxϋZvT’"ΐΎ7>€“iΛ?£8‹ @¦Hό-WqΜΌ}-ƒ»+.V·N~Σt0+fυ<‰ΏόΈI»ˆω σΨr“RΐLΝPΤ―•πο5ΘΠ Ž)ΰ*5Ξ΅" R`ΐˆλKΤ[ααΏ.ΟZxχ•άHΕ*ΰz’ϋ€€‚m h’/ΰ‘loίφX܁ΠΝξΕΥMCšP0Κ•ΉΥ„ ‹›rΆ@)―Γ2Ε>M]c„,ΐIΐ4ΑF;€ΏρN—g-5Lέπ<ΞγW-ˆΟσΙν.ώβ£I\Ώΰ€«l…xΕΊΑΪcEƒWΠΜOZ°MJΕpTά£Ÿ(© Ι  Š«Sc†š¬lΉNn|ΗΠς„JyMε³ͺΕP=XσE«Α\NLAsύέ0MΩ˜7Sz΄ŠϋšRφezP΅LŽ­j ήŽπΛ›zΈξγλY\»`?‘VbRϊΩηmZί ΅5sfk&ZhŸά°0tΒw^ΙͺΠώBπœvλρ#.;ζ³:Ό@₯@€NOβήͺGDœ9kΪ){7ηqίΐˆ©qτgΆπΣOΫd™/Ν9(ζφ―Οˆyν“U£ΟΨΡx1Βb]}―Ž‘ю:v›¬βXŜ†+s–š¬ΚΠθΤ‰x"Œ“±Ύ^rιΞrŸqΤκΖ,¬n„ž/a›‚Ψv<g ‘pθc”‹Ρf ±Ι±’Œ%PoEΤξIΚΪ–%ΫΕξ—7;τɝ.…'V•{’Hv8ςϋJΧζόϊωQTmΰ'ώ έΗ~XžpœΥ`·ΐ_0΄ΐ½fH»αΠUΈ—ΰ/Ο0Θm―βα:gΣ»­†N˜›΄Fω2Ά@5.ί|θR³³Ώuό”Σ15fDΨi„ˆb‘Šœ£‘ΥπΌίόvAFDg}'$]š¨πδŸπσ«΅²ρ?΅’‘Še //8ψώ›yY+°MAΕ¬ŽB–AŠ"ζξŠΨDcE”σzZ=Iθ‘]/B9Η•€D4Ih\r,fcš /) 7|κτ$Ζ+eFIŸΗy|ƒƒXέ θ~Φ /ξχ¨˜ΣquΦA.Ά» ]§ΈΗƒJ*΄ΊΆ›!Άκ‚P!ηhπC…―{Xέφ±Σ ±Ϋ ΡξE˜­YΈqΡ–§MV}Μpb τβΊG+Ϋ:=.γο΅xŸv„bŽ[ ۍ·]lξΨnp²Πμ°oJ§Η’CIε2QMD‹lSΐ1El_Q’ϊιDΐΖn@ςA“zŠ™ΆΑX§Œ%ΠκΚ#Y I$,­ίώNΝ…†μ<ιλ>xβΟˆ³œtΐJI€c’=ζ’ί]ρΘυwΰΣpqΚF)Ο}³»«ξ>ŠΜζ^H•‚>R2’·E(tT‹:\_Q§ΰœmr6›Οh(f5T‹&+&&+ΜΏ…βΙw²b`Όb`Ίf⍫υφ΅¬Κg΅]1ϋ«Ύˆbσ !hŸQ‚ρKΨ"ώL’¬’`ΤμΈ©&«ΚQ’­ gα΅²‰‰²ZΙD)―₯ξ€ΊΖŒMpv― B1§CJ…₯Mž―RΥ¬b^G1«#ΉΧEΐΪv@k;U :Š9ν±ψΏηq/Z±kηχzτο5he+@΅¨γκœ ηΏωHr%Ν TJε»Ώζα~¬χΡμD¨t³:Δr¬/’ΔΒ”…οΏ•WOΓ;λL™Xέφ©έ•ϋΈσ2Φ (dΩ%u}7€η«΄*ΨκFi°έ°ΉΐυͺD„Υmλ;>zά*šˆφZ!i‚)Μβε€H*ϊ‹[toΕο·*'₯Όžb)φZ!Ž«*ί}5§^»œ5Z 0žνnœΉ8Λ ΐβ@Wΐ Η^μΔ†χαΊwδ“­ΐ6·³5ϋ±₯d7χί°±Π̘‰BNΓ¨ °ήώΥ9σ“&&ʍ ԊρŠ»d Z4PΚλΘ9ŒΦMN@hΣ¨u\ž΅δiΛαR‚~ϊY›>»Ϋ₯­zˆνzˆR–χ±ΌεαήͺΛ† »‰Ώ`v”ώlξXί 07aͺΔ ¬”ΣTΟ“δϊά£ B•θnΓˆΝ‹4Α•Σ+ς9ΦJFœ‘σο{ΎΔΓu^ PΘ²˜m ”σ: 9Αa€ΠhGΈ·κ‘¦jeƒτσ–ΐyό ³€$ύψγύωΗ-κω“§mΨΖαΙ«ΰώͺ‡•m0Λgx’Έξ"Œ[t†N˜©q‹q»b§Ασ πΚEGύφw‹ͺZ©RχH‘Λ”σΊΊΏζ“7°K°•"· w›a*/|Pdΰq:ˆT:w\‰Ε ¦οΤCl7ψg«ΞξΕu¦ ΪQ>£Ρ¨D€ΨiDXZΘ±ΨhMΔ²λ^ΐBf₯ΌΗJXΡ‘m(ΜM˜ψΝoΨ…uΘm°ΰy&γ¬'€ϋ~@C|ͺEΦΆΪmE‡ͺŒ%piƁmVωΕ4l bξκ^+’ωIK9ΦΙJM#” :¦ΗL5^6T!«AΧΩƒ ’Š‚PAkJsK©ZY§Λ3–œ©™*γœ›Eά[υθOΩ€f'BΟ“ ψ©˜‚°Όιsi>¦υω±₯₯λ3Ο·V2`κ„₯MŽ-Τk—3iΙΝ2yΥ―k„NOε–6=4ΪIɎWοΆ% _Œ2Ά ώ7n΅h(ζΨZXΣXqΰͺB!«!—ΡΨ¨(Pπ|…λ>Υ[—Y;ό<Ξγ›ΙΈ΄΄ιγχΦ_>θQ!«γ΄ιš3ΦρπCϋ°ΞΗν%ζψΊΐό„C§΄”πζX³5 B6vƒψσ„w^Ξα―»JΦ>­(ηuH,{΄_ •P+0tΆ oχδΠV­”,XTΚι04Βn‹Ε’σŒ’d<“hv"¬lωtgΩ£'©RΰΙϋΈBEχV|圎J1΅’‘*ϊ™:W[ΔΤΔύˆHΫψ/½[P35sπOψία9ΫύŽŠ³ž,ž`ψλ4 B>«αξ²Gƒκz “ͺE.Aί[qΡqe @Ιg5”σ\Ο©YΘX’H‘\Πθ4=&"ž@ 9 c%΅o³Z1=f`Ίf`ͺͺc~’gΐ$γ4ϋΨkEτ‡ο5h§ξΓLT H©2Ϋ‘,›˜’7Y1!β ―Ύ™Wε‚Ά/«4B)―!ŸΡΤΖn@Λ[A*―άθDhυ"ŒωeΩΪ πpέKK“œρ ΑIB.£Ω§s,rή@*τ\ΖlμxΈξS–₯FGfσηq/R$ͺ~ΏΌΩ‘?ϊyS4»¦,\˜΄Λh`AŸΕ VΣ,fy΅ώ0^@­¨c²j"Œ{θ ΌηŜŽρ²H*,oω‚πƒ·ςκΧ_ΟΑ6ŸΎώP-θ΄²P=^„%Ί$εγό@a·5ΌžH‘3X™«…­ΞώEέΑ±Ν –7},ϋ”Οhͺ”ΧH;˜χρΧ=ϊς~ό@!Rœœ$†?¬W ₯ψ ]#²:l‹MΣΟ™7fΤ;/ηԈž₯ΣΩuν§{ε/^„Ύπ.€‹ (εtψ‘Β†O‰Me­d`~Β‚ BΧc?ηρ²‰™š‰ιš‰‰ —νKyY›σ^ ¨Σ“”ΛhΚ2N_–¦Ψ4Β‰UΉ[€SBΠ©'ώd›=OΡ’;ΛξΎm”β¦η)¬mϋ‡zΎjŽ%0QαlόΖEG σB`*Ž /P΄Σΰ~XR1)εψZ΅z2­8μΔ Ϋ…‘‚λ ΰœ³Ε˜ΨH`\Γ½U\_’Vκ{œΗyΌΘA¬οτ'Ώh_u)λΌ4k£R0ϊ~&‘ΒύuۍsγK λJlΥdmnŸMVΝΤ^JY •’±’ޱ’Α \p_ώ{―ζΤ›W3J'lι{–Α4Δ;+^ͺ¬–ψ$ι;p6α¨γˆ"Ωeγjΰn3N‰ŽΌΩ•Ψά Ι6el‘ΐsόϋΓχ΄Ά`§™΄‚„Ψ‹ε΁ώxeκ„bNC΅ΐ­Ξ‹ΣήΉ‘Εˆκp’χ?πΛΗΌ€O=^”  ` <Φ'@ ZԱی ˆ(‘ό±FΎipi)ŸΥ` š–Alx•»Σ ±±λγΑš‡₯ γer™Ρ˜€§D€η+ϊ‹ΫτρםCfC“U…Œ†Ž'±Ύλϋ²8ΆΐDΕΔΜΈ‘.NYjT"βΨ§-dmΝ½Ό‹ŽJΕ/tΌΏ0β—§Rΰ‰ύΊ‹υW²ƒΦ =i @±=©RLΙYΩςiy3 |VC)―Ÿ δsηqV"αφ|»Gψσ­lω˜·pyΪ>τ.°v>0=f’3g4P+2·ZΤSO"Ϋ]Κ3θ/ŸepR@.£©7_ΚΰΒ€y’5’Τ·Ίm솴ΆΠζnˆΥ퀂PQΖ'r$ε[£{+^ LpΥ’M0ΈnXΰͺSŒ"ΤΫ£Ώ“œ‹ηsΛΥ em ›#ώQ‹¬ω)ώQJΈτ\lξ΅K΅έΡθ„° {@]Χ ΧlU-Ždi €#Έ…}¦γEIΖL€Ν‚޽ΆΙσρ"%¬€τΧLaH±ΒH‘Ω‘ۍ˛>VΆx²ί¬Ψm†huYυΙχc$…ΐXΡD@P[Ήέ=ς₯6u.Υac/`@:Zp¬¨γΧ^Ο!—9ύdZΚkΈ4m)Mό”Λh©VΕ G+$Ι9άΔ’|)Jy `s—ΥΤ™auX_!ck/‘Βς–OKΩ¦@%―ΡΉxΠyœετ\I~έ₯?zΏA‹λ>œXF»«χ ₯ϊŒAόN­lXίρ±ΆΛŒ₯ŒΝ‚9υvˆ›{)³g»’λIΌΌ`γε[e3bτδO¬Λρ‹/;τΣΟΪβΑšG{Ν~¨Rd|’(κω<Žζ³'IΒ=Oau; A)φ )ε™c„j¨1ΐ—(’ Y›ιΤBvcν”Q‘`ςކR^ƒ¦ώβγmξ…'b?&IλKhΕ‰„†Χ―8£€αΐπ?π‡υ=Γx‘¨ƒAΏ ΐφΑ¬£Q«+i»βφ²‹F›πHξGώ€’$‘τΊ/LZ ψβ~¬ωT)θΘ9§π&’ŠΕ½Uώΰ½έYήOo”λΜΨ3΅X`¨€<α¬Γt!Φ#`€Π»7²jvόd₯Α£Β1Š9‚”˜²,:4Qf<ΕDΩ€mrΛΔΤ 9ξOs¬Qž±(™Ά‰½Vˆ¬Ν*`¬M‘\0`Π›έχ–]ͺ·#*η9³šΧ<Ξγ΄‘$έΦ<ϊß7ι£[RŠ05f€vΩΩH*¬mXήτ°Uc.Βn+ΒέεZ] ΧWlΐ5fBΧ λ;ΌxI€t…ήΈšΑ»7rΚΆFƒύˆ€­zHτσ†ψΰf‡v[Z]V μΈΥ"³„nxό~6#¬νψΨΪ if܍Λ!@‘ A•‚Žj'ΠD‘”ˆΠˆ‘ύ鱁?H~W-0°έγŠΗIή{)ωΪΪ¦ z3’­½ZέΣWγ{.cΖn\΄ΥdΥ•X ΐœΌq½FΕ?3ώ% ©X&©Ή ήκλμΑΩwa4Šρ„Λ`·ž'±²εΣΫΧ²xε’ƒ|†Υ΄žΒ6qΖς|Ew–=ϊ“_4Po…i)-±ξM„xlK ’Χ!bώέμΈ…™š!ϊŸKΞ{²ͺ««σφ#©(ά_ρhs/€+a”j„’A±‰ΨΠ ΎBq`ΰKDŠ”ςY ―\Μ Σ‹R°δZš:avœ…‡7<μ4BxΒΗ_w±ΈξΣ·_Ξβ΅+²θ~ηρ€"ygχZ>ψͺCŸάξ’”ό.Ž—Ή5— α»ρ8”¬$W·}<\χI`ͺΚ’·Q€°±Λ@ή$©Θg4X±^£Σ§ώ™α»―ζΤχ^Ν)Λ€­όW·όώΟXΩςS°$"© ₯J}ΊDΧεeχn3ΔxΕΐ_y=7ϊš ―eA'Η›Π―/dΠκ†θy ]—©Μ~¨Eϋ+±μ˜Ε‚j:vN"ωN„”Ί¬—Xpm« ηŸΐ²} ΌPa¬¨«ω‰‘ΖlΐCkœqΤΑxΜ―ό€λ8Ζ,H) RΠΥ•Y k;>f’ΰΥ?—”Φw}Έ>ΏΌΫυ?όEƒΎΌίΓW2Έ2g‘Υ”4Σ8e$/zΗ•΄ΧаΉ†‹Ev2–H•MS@φyrXκxp’U1§Έ˜Υ0?iB£G;>AΐΚ¦OΏχ³:%BWfmŒ— ΄½w–Ωޚ/MVLs,KΪκDΠ4‚&Ψ“άŒ52–HyGݟΔ^xΥαφM)μ6ωϊ½θβ»―fqiΖVΊφδ’°σ8“†  λIϊςΎ‹_|Ω¦έf„Z)¦Ϋ"%ƒ!ΣΤΪ½—gμ˜Ξby“'zC#Œ— hΨmE¨·ϊ«U"DŠX§$™³ŽΐχίΜ«·e”žό`k/€ΎκΠκΆδ‚HΖ<€ƒŸ‘ Έ½δ·g`›ΗΛxŒΌΉΨƒ²ŽΗd”Ώχ9G ο˜Pΰ^]/‚λ+φπdœ0(;©b:Ά†φ(ό@‘Φw”c)βρ²ΕxL=I(̌›ψήk9θϊΠλK6^ΤΑxψ ΐΏΰίΰ`+ΰY,oϊΈ»βΈ `θ„©13€lξυ œεMkΫ>UΏ2peΦ’+sΆ/λΚ±Ρ1ώ‰Dο`E v/Βζ^ˆΕuŸΌŠΞ9^½˜‰•ͺΎΏ€Q쿍xΕέυΝκω/„ό{Λψ[ί+ͺΜc–ƒXP(ˆνD­Δ‡Τσdϊοˆo† JΕG{θΈQͺ(X-κΈ0Ι–Α]WB¦n†ύ„&Ή^ΊΦ7Qz°ζΑυ-}ΝΓϊN@Χ/Ψτφυ¬š3Ω7ό<Ξγ4A„‘’;k>ή’MΦ=8–†kσΫρŠώb ’ +[>6χ\˜δΔ Š€z+β2(mΧIΕ†YμŠΗ=x]#δ2œΨ·ΊQj\σ›οΤυ μΈ9JŒ>” «[-oΤσŽp²h ΰ~hu’τψ†νs«bm;Ψ'Anθlžθ±΄{Q*»k™Ϋδ©HV HΙ=x~ΧUZν¨ttzΡΎξ°{Τh‡Ψi†άš¬Ψn0#iΤ4T*ώκ9UΞkjDՁό€πΙ>eΟ&^ΤώS0 π_Œ~Ψν–­%ΥήΞc§R½=:{T`*a)§CJ`m‡ϋκΏ–$›{Μψθλ.UŠ:MW \š±0^1 k€"©(™ΨNnΒFθτ"4;’ν~ΐ¨ψδψ°[*žJ΅ΐ]Ÿϋβ]is/ΝΩp,vΌ·κφ5¨ΐ Π·ήΞͺΉΡ%¬‘α°W8Bκkg'Β?–A_BΜνBS'δV7‚Rœ@a€JΑ@)NJ€w–]h‹qLUM¦&Χ9ώ3)§οψΨkχowqoΥ£Χ―8xλ₯¬*΄τޟΗy<ΙHJω«[}p³C7φΰ &¬}΄±$”βρd’b€ώDΐμΈ "3ήnί£c²ΚRβ,ˆΓοTς½|FΓΫΧ²xύŠs’wšΈ’χΏh£έU”₯:ͺ’εŒz^j0‚Hρ‚)ώl’…Wο*W¬yπΫ$δ2{¨8¬X15i ΪOUΉ%ΫqΩm0 K" ¬νψ(ΗςΎγeΦFW<UWfνQ“Rϊίh<κsυ<γENzώ·ήp8~Υ=S3Υ―½žΓΏί€Α~σQaι„ιͺ—γBlΧƒ‘cςΠυ<‰₯ λ;‚΄΅Αυ%΅{ŠY¦AiV„*₯«$ΚWPŒ¦'—ωό‰δ₯λΛτσƒT–ŒΝˆ]©€ΛeΓ€R πς‚ƒo_ΟβqWΖ‰Έˆ\Ÿ7”Όx‰’"z2­)^Ωχ< ΛΠPΘκlŒΎοΒΦ^€b–BlS`·Ε¬Œž'ρςv¬Φq#8Ϋ²rŽΧg”­:«6;~ςi›n>tιΝ«υκe…¬φDρηρ«I‹nk/€Ύξβσ{]ju%l“W΅“/>kDό~Ί–‚v9AP}S€ŸΫοMKήcΪ7φΜO˜Έ2g©¬s2°Ÿλ+ϊΩgmϊπVΧζ}faG’—ΰ‡RA°ώGΖ>~υO4;’ΦΆƒ#σ„vŒχ1 BΖhvΈ>,ΜΩpΗ)ΐ6λ”(φΝΤΜ”U”΄DšxΌ9˜΄ΊΆ¦ΗLL”MlΧΓ‘4D₯€Λ³,ψ3bάLP6€χŸΞ“χτγENζ\ώ›ώ― ―_Ι`e+ΐ'·»C³Ψρ2[λ†ρκ? P«l=ξkηBFCΞΦϊyY=τ’²|^ Ρυ$<ŸΉΌ‚(΅*ήͺ3m1=ώ2˜ΙώsŽC#ΘΈ"0xlγί3/mλdύΑQaόbΆ»ΌΧ—π™RfBrŒR±Ui1§!λdm‘—(πΔξωvœ™χΌώv7φΜMXΠ56Ωk†˜¨˜˜c1‘ŒΕšθγe[{ΦwΈΎΔv=ď>h1>γε‹O¨yΏ:‘L€;>½ΣΓgw»ΤμDΘ9.NY¨tdνHΪ­°MΆλI²μq!°4 ν °πΟDΕ€η+ά]qα‡2ΦΗθόδZYW—f,eŸμΧs%ξ,ϋ„ΐυ ™ΤaΠ‰MΉ’Υsxxηό—X=Όo`Fΐ₯ikdαΊ‡Fη°5{²(θΊ’ρU9›»ΑΎ;Šz1§Bγ#[Γεi–L–±€»™³&*ˆKνn„V―_!BVG­δYΦwjΜ@g9:ς*ΕtΕοΏUP9Gœ€τ;ώοΟθq|*ρ’'πό€5ώϋαVΣ υƒ·ςj«ΠκVp$'Τ±&ͺ&ƒt<ρ NΈIOΛ4l“ϋv›ΛU‰‰ΔΑΑΐm,;L―IϜQ·}·B]£Ψ%―οδ5,l“uχ»Μdߎ%πƒ·ςͺV~Bξ_ρJ?#š†A F9―CΣΆΑζ?‰όo.^-dm ―\ΚΪ¬©σοke₯<―’’ΚˆFΐLΝ„ex ˆ”rzzƒmS`nΒB΅d`5S«6vτΩ½ήΌšΑ΅yΉσDΰ;nκ­FΦΈXσ°Ή€n€Y›Ϋ‰Y‡el_‘”Σφ-*’ͺŠλ»©κhrό―_Ιΰ•KΞ¨λL`iϊ ΐ'Οπρ|*ρMH– ώ_ψT1„xuΞVί}%‡?ϋ°IΙːΌŒγeχL]ΰβ΄ΞfάƒNΠψ Iͺί‡jχ"Œ Œ•τЎ'ςΑΙώ¨0uv2T` άQ8€WαŽΝίιΊQ:A^™΅ρWNήχBuˆςsTTKϊ>Ωίdϋ¬«Ν ΐHΖlˆ9Ε₯—?;φώ<ΘΦ4ΝΒ~Οϋνg_ςδΎέ­κΦΦU½―3=ϋh€ΑΖΆ±Ϋ8 &L „@0–%aΐ6Œ‡mlHb€Q·FH£ι™ικι­Ίk½kξΫΙ<ϋ9ίώϊη}Ώ<™73ΟΙͺκ™κͺ|"ͺͺϋήΜsΎυ}Ÿε·ŒR4;QΦυH%ƒg«JyaΔΰ!ΝCDg<βDfαη錺;3SfΚΟΞQˆγn„0bα§ν£{ΗϊΑƒ!^Ήγαώš‡JΡΈ²šΉ‰ONβttαΝΗ#ΌυtD­^‚Ό+poΩΓL…%aΗ“Π8‘Ψ:pΤ‰±:ηdωφQˆ‘ŸB ηͺ5…X΄έ;επ³…ΉΣ€β9Ϋm,η όΜ«…t}ΑžκR ϊρ£΄M8λβ'΄ϊ¬Εo™„ύfˆf;bzž#24Λ€LιOJN؟_υD)j%―ή˝ Œy}ηνAFΖ₯?Η»9—ΝΐN&¨jΗ R΄ϋ j\Εο‡κύ–ψƒγ‚4Uz\ΝUcJύΎΧJ&<7‡ή€―{w`Άjαg^-Hk2εό?Τ??υρqIΰ7όŸό9ΰgΰ³/δq؊πΖ£ Αϋς¬ Gέό²šQi0Ž¦έF£ν)ϋ£CtŽζ©Ή4ΐ’Γ Ε4Κΐƒ]Ύ‰v?Ξˆ«~Η΅EΦΪŒ8“­—M|ύΣΕ©@Boώ»G–fyόpUθγ98‰²F­Δ.„ύQ‚χΆFΩ<1U@');K.ςT2κ<]P£›ΰ°‘;H²„©3πβΊΟaoξύŽΝžέŠ…rαY“¦œκ,ΜXθτ“Lς9Š%φŽ#œDτύχ†xaέ£ϋkœ­Z™ŽΐM.πΙ ˜‡‘€ν£?~<’‡[ΊΓ$Sή[jΨΩμόimΙN£s5ϋΤNς(―ξšϋ«ΜzΩΚΦ ζχs‹„§_Π¨˜ψ₯/”εέegͺs‘ΌωΣ7_ο`8Φ=Μώ;φ³a$Ρξ'§ΐ;EΡσ‘αͺ%.2f<·κHΫ’KΧ­€ΈaRD±DwΐΙU)gdcΟI‘¦@³a¦lfΗΉ=ΣuŒΖυ† N’μ܊žrΑD)ΟJ€y•όΜV-ά_we©`LZ7 ΐwΐΈ3}?|‘ψ8% €lόΗqΩ(€k“όΩO',i«³D ₯Ά'q*11_U+R鍏Qϋc›433³ΑmΆ£‰›ΈoΣ¬u8)tVΕ ΄-ΒΧ^-ΘΕ†5uλχ(’£vLσuKšΖΥϋσύ<Ψ!Q•‘ά…ΰο|φ/%—€’η£Ž-%Ι™‰Ύ˜[\/™θIvF¬Α°6η ”ηΕβ¨ΔΏwΝC1g Ž%ΫάΤ¬‚‚Η3Γωš…Ύκ>wbΕ ˆΡόAίo@w—\zιΆ'—6<‡υ’nΊίΠΟg˜“½o>Ρζ~€0–Θ9K3vFτμ"’ίΆΆuŠξg;WξΐY- Aΐ|ΝΖ|νΤ”,•2sπs,60σƒ•"sό—¦|γDζ~Ho>Ωό/ yf™€IȝL Π‹jcvl’·—li[—WΕ έO¨ΩJ¨ΰθΚδTΡο¦Aš2?Άf±Ώ+Π™‚žMΔγƒή0A­h’Q±ΠlΗ¬…rΙ=΄~I‚N?Αξqˆωš;K.ΐZά]qε\m*—Ώ#Έγό±ˆSΗΰΐ}·qΕ( ^6ε/~Ύ„wžϊ*δk€xύaŠξ0†―$*ΗηDΐ³b>ΆI˜)[tϊŒBVtˆgm|:ύδL…|YqΒΖ)’Dβ3χσςεΫήT‹Ψ: ι»ο(N€[‹6\g2`°3˜Ά€~PΏ{Ž%`tf< c0°Θ2DΨ&§tA0κΏΣO²¬~ϋ(D<φ9‡­ / 3jά‘Ρ½ή’ Γ XαΙ^Ϋ"¬Ν;¨ψš Αžή₯Ό…:»Ά#f_ YGΰν-ΞΨxρ–‡ΫK*VvœFvτ&>ϊ‘«Δ8ŽΪ½·εγέ ŸŽΪ1,ƒΫγμρad@^ΰ΄+€_ev₯‹3]ΩͺΫ"D‘ΔώIˆ$αQ™ β‚ΐ™¨ ˆA­S€?•ˆ14³UΦΕΈ½lΛR~b%šEK΄zΣ­ΚYpό€Ζ‘ώ<)ωΊ‰΅[ζ&ˆώH#δs«U“[ŽZ,ΐΣ&’³svΠ&£-PΞ›θ ¦Σιc‰γc2JΚy¨}ΥύΧχσ¨‘^6Q+™ͺ‹iΘωΪΔd‹Δώ]{Ί;σΣ·`9Ζ¬XΐI@΅hΘΥ9wJR`c/ΐώIψμ†?‘_-ςβ§Όa%Ιdοjύ»Ϊ9oRϋœvh)q€7ί/ΎTΐη^ΘM’¬ΜΞε¨Σίώ½œπΜμ /ζΠ¨˜WΆ$XΊΧ±₯&¦υ ΄ΪΧω…E»j‚Ŝ‘΅JΟwHF@λŠ`ΎΖ•Φplf@΅’‰ΧsJiπμuͺ—-xΚϋ[Σ3@‘ϊΎœ#°Ύΰ Q΅°{Δ,Ϊρμρn€ύ€ͺEw–z~Ν• 36\›n@ƒ?₯‘εΉ£”6φCΌ»1’§{,Ι[π ¬Ν9¨—MΈΆΘζΓd]Ό8fx<FΆ}FκK`‘fΑ Nέ9 ±ydeήhT”λe+Δ“½€…ΐΟ½˜ηο‚Πρζw{ΡΑeG:M’Ÿ ΟςΦ’·ŸŽθ‚}ύz‘:{ wWœIσπ,‹°Ψ°δŒ%Ÿ[uhHtϋ š˜N”Νz7FίO+t~˜Β³*;MbμΟ„ Ž»1κ)ςž@£l’£ΦΜi#ŠyιΪ•’Wξz0&K‰€Ώξ0¬V‚c/Ÿπ'qf,9 RϊΡ£ŽΡΊΧaŽιx·ϊ ΪύΙ©Žρφ$Οθ\o’zŽ₯YyOΐs—χ^Όε¦W tdί %ώα{ΩόŒA4Sψl‚Η#²Ÿg­νΣhβ(fΥΓhΙΖ& ΤaŽ/Ÿ$Ο#o/Ίg}–ζ/‹‚k<»ŽΝφυ žΐe΅RŒ£v„ώˆ•γD’Ω‰ΡμΔψαΓ!-ΞΨΈ»μΰφ’ƒzΙδ7ΙΐG9τ3γ‡'=άπxΗ§Γ'{Οΐέ%3v½oΥ@o”ΰιKWί]φ`žQ?έpΤζwήXžu`¬ιΏžι 6ͺV&d΅rͺ%"c‰ΈΚr7N$lωΈ³δΰފ#% ;ƒ9Wdͺ‘ΣD½lΚמΛa8"­§q]σ3)ωΈΎς©‚ΌΏζΒ2θZ,"ύ³¦A²”'”ςK³–Œb—FAŠv/Αa+’#N~‚š4‘σΨ&Έ7₯Ζ¦8ξDΘ{j% Ήγhj}]Z½ϋΗ!>{Ώ2DΊπ&ΈυίΎήUύθΗΗ5Α@—ό"H ¬ΜΩςGCΊLτη²Π€Αrž©4GνΛ…ƒ. Ϋb$,΄{ͺ΅¨*O!YK9# šΖ©VΎNTVηlY.ΣmJΔΆΖο<υi<Ρθ ‰i-I:6‘žyΖ ‘έ ubΚ$=s.k&€’MM^ΎmdΖ@ϊ¬ΞΫ²ΣOθ¨ΕT¨H ”€ςTψΓ`žošςu·χ4 ΒBέ‚kσ’ΫμD™„ͺkŸ§Ι„!·‘[ύ#‚;}w‘ΔγOχ*Όi`eΦ¦;KŽ\·Q)˜R‰»έ$Θ}ά"¦§{!nϋΨmFδŒΘχ•ͺΩ*SΙŒη™ˆ‰jΡΔRΓF΅Θοfw`θ',–ΘΜμ'ˆ$6‘ΜήKΟf”:ΐΝ8¦‡ί (Od@βύ“o?υρξ¦O{Η!½|;'Ώφj¦AS=]R/ής¦ί}g@ώY™άμCεψ|’¬qP?χΩ’|υnNj ίχγο„e’΄-ε’½zOΚώ(₯v/ΖΠgџzΩ€Ÿ°"π Ž8ΫΖovbΜΧm86a¦ΜώΧ9Άœ+π…—ςrvΊΉΐΏ ΰΗΰ’|dγγšΐ€? ` ΐ]\6 ΰ:$Ώϊ©[΅¦―ΰ Αs@Σ τF N:Σ~ιΞ |ŒψΏ``ΎnɟϋL λ[mšFˆGJ gΊ`*£V<ΥC¨7BΫbΰ !˜³:ηπ†/N©‡a,α)z£„ΈόQ$q{ΙΕ\Ν’k Ž4Mάt€H<Ω ¨{pΓ3dͺK‘R0)§tΊ‹y†κΘ/ΞΨg²w­•(.Ύk„ l8ξ0z—–ˆ_ψ\IΜΩ²˜3d³‹ƒ“θ Šxθ§8ιΖXjؘ)›Ψ?μ―ώ~8B₯ΐ›ψŒv/Ζ(`…Η»>LƒP-šΘ»ŽZO"”‹&V6[Œ·0Q+™¨Mψs‹[L}LSVykυGxλ '‹ ›ΦζmΉ<Λ£λΤ›ΣMwΰΓ ½ι+ΗΈR4‘wO«Q ψά²κτ€©Δύ5α€#œ‚9ΐy&>b~jΎo˜oΏ[ρ’Df<ŽΰͺV2!ΔtΕ¨pԎ³ω¦n»š‘pΑ§HΙ €£±M“χ–|ωε‚4/‘I0Λ‘ρυ Ά"œΔ4n¦"%ΟZΓ±ΡCI”ςΌHH)±uΐ‹Ήώyέ^œ±YΔ%a°–ή˜ό0ΕΪΌ£ζΔΐSΥ՘­ZXœ9­πτ5v,·Βέ ?dΣ“N?Τnœt΅bΆ"zλ©[ιW‹ͺE“f«¦lT-s|?LR+9vA~ςƒ‹μ«Σ”ŸΏ0–Τκ%ŒXͺυ¨Σq—ΩA˜"J$ˆ˜ER/qu―Y0z³ΟJDyͺ@y*°ΓF)HΩκ‚gχ|@όŸΌ+πά ‚’˜]σ„~Šv­hμ,δ ΜVΩ%΄Ω‰Ξθφλ΄^6a[?dj”BΠ©YMΑ3°Τ°³$ΐ2Α^/›ˆ?E·Ο8=JπCΆ έάρΝοtθ₯" ήdΊ/ΐΟψ꼍_ϊBY~γΫJUΏΆfΛ₯†…IΨ!)½f„<£mΙcJΔ¨‘’ΕKΦΛ& 9‘>h2 ΑΚΏυ½³αgοX)Ολ”NͺE•2 pΉ` V΄2GE½FΈΆΐ/~$ο,9Σ€ώΰŽŸr‹ίλΔ')€o€)@W$ε‚!ωσeόυίnΡQ{ έ/5kd½o‘ζΫg7}_)ΝijΩH)β₯X¬[,‹K6Ήγη)ΊηQ+‚η²°?χ{Η!φO˜%βX<ΎΡ6±']~ίr8φ9”=;ž2ΑρΓ]%=Λο;WΟ{Ν ύ&'+·νGc> ‰’χƒͺk·ϋ‰2«a+ρŠ€)²ξSYYξϋέ Ÿςn~ισ%ιX4Υ-ΦΈ¦ LΡξ₯toΕ‘ͺyε#’!m„΄u’QαΞG»γ€£3HΠμDτξ†Ϋ$*ζ 4*¦\ž³qgΡEΉ`ΐ²†ΐ΅Α°Dœt|γΫ]ΪΨ²χU‹‰΅#ΈΆJŠ&JyNΊΌά]vΡθ›Π e’J|…Σƒύύ°Γμ'">i ΐށwό ΈB$HJ`±aΙ_ϊBΏρ­6u B)ε Μ©Δ™?«…Qΐ‹†žηϋAŠδœͺ i5%ά%™cΰU!ψάύΌΌΏ6Τ/ΐ|7©¬΄ρ₯D†’G †Ls›©˜©L~\[HΫ:=b}@¦θςΛ™%@š2ψΪsΉt©aM­_@ζκ¦|ΈMτζγω[FfΣάκVb ¨…:D~ΩCE™›΅’μ>$ pԊPτΈ|oΩEš"S4 ΚΎΣ³ˆZCΚy%₯=c£?JΠκΖhυY‘Ω‰ΡlΗτή¦ΓΫ1ά)‰βσuu<†19!8jΗτwΎέ‘ύπ™d['CεΎzԊΰͺQk£be&? 5Κ…)κ%C~ϊω¦˜t°΅οŸλύbβ“˜„ώ-°>ΐ?¦ώμ$ΰފ#ε‹e|χUU8ήξ•ΒI/Fo0¦}M‹ZδLSΙΥBœ\Ν6Έ³μΰ‹/ε§‘¬TJW =έ ιξ²{ζx…8;Žh«—8Œ$–f-ΌpΛΕ€jά0ˆςCΔ™t(ψϟId4.ΒT@A>Β—^.ΘηV§s:#6χCϊξ;ΚΉOvτ―Q6Q/±+˜.ΞXΈ½δΚΓV„(NΙ±y)νρ’b_0Zœ©θYΥ₯[Βϊ>r βnϋMc€δ…{qΖFA‰ u‡ φC€’“ΒFΕzf‘Φ4²ΌΗ.d~ΘζOΊ;’β’”7Ξ J³€AJΞ$7φ qΪή&MS³-ξΞh "ξ,X&'5Ϊ3AˆSM}ŸτυKΤ1π?Ȏ'MΉ­> ψΈt¦ΘώΔ6’S0¦ήόʊ2Λν|Κ:FϊνΣ€K)Y`Jg~ζό³U)š(Μμ“κτ‡ „ HH,ΞΨXn8΄€ͺQδA"‘s9χΤ‰rs?`#©œ@)—a4²kTΚ›xρVƒQŠV?F·Ï$f*Œμο(dϊ3 ½bXŠy ©Έιψ†ΦfηΊ•YG―ψ:•ΨBέΒΐO±ίŒθΡv€ηV§ημ‚dή½ΊεΟ­χ˜ώξwΊτηW=δ]‘­oΊυ^+²QR,Ρ$8ξFΠΒCA‚J‘Ω ?~4 ¦=6*&6κμyχžMDNbz²P’\Ω Ν’ΧTςΈf0 ΡιΗxιv%”6 k ά[™Š&-lψίx{Ϊkϊq‰Ob-0(pΐΧqEλ[Jΰ…uW–ržμ†”ΡP­¨;ΆιOτ  R4`›lœΣκ_M/U~ψϊgJi~ΚΩ_Kl„(ε ŒΪ$)SžŽ»±κLΘ¬u=n)<)LƒiWηc| 7—Ό+x‘ΞΘΉFζΦw{qJύžβίξΠφQA§ίq‰P/™Θ{ ž@»Ο`¬[‹~αsEι‡#?•½aBε‚Aυ)H{DŠ^i™™»MΖ Δ‰ΜLQΦ,ΤY+ΐ4{'Ρ©lμ ƝeΡή„τSΊΌδΠU5ϋΕ+•Bωl ?Jd¦›>πycψiΖ'π&Η›6W\ƒQͺ*,™ωϊsiμίηY 矹KŽ:«Υ›rŒCΑ33 [Ξ0Ν³Ο‡‘(°γμ—σί₯ρGν­^Μz &R‰ ωΝΟ'ββάϋV/™(ε ·ψ)ͺŒmA§ΟςΎγ*ΆEXcΘΐηδNΣV[}@ ΔLΕΒ½‚΄Z.ΘΉ¦<ι&T/›jΌ“dtήγn|‘(‘J$Ώg~8fΩ«ώ•αd€Ζο$Ψ9 •(CΚj¬uΤJ¨ZŠΡ¨˜S'“6ΓˆΎωz‡6B *Iα8ζ1›!•‚ZΙB1Ο£·Β?LΡκqηC)†"ηhυb4Ϋ1ŽΪ1ήήπΙ6¬χK_(ΙΥ9LF±€ο½;D³SΑγ9ΑIt‘Λί3Η­ώ5πΩαseΦFšp‡f}Α–¦1±τΧJΐoM{-?NρIM`ΐΏΰΏpW0`‘a!Œ₯ά:)NΈΥxά‰/¬τ/ Σ ΤŠάώο ŒόδlW‚©―ΎZ”‹3SΆΚμEtάIΘY Μ2Y7€•ΙB‘|6Q! ?J)NδDωQSpU2.`’«7Σ ¬M].0RΣ‡Ι³[‹ΆtνΙ›?ΐ^νΏσƒv›Ρ™jšh«9²ηp«v৊ήτ)σBΊΆjɐ‹ ‰Q Ρισ,zϋ0Δή1'o–IxnΕΛRzΓδDdUa­dbeΞΙα<Η@!wΊΡ bͺΡ™{8ΦΒ>‚(ΝXΫπ”ΝψωΩͺυŸχf`"I˜q [:J₯κ$œ4h¬1ΰ“+Λ―q’*ϋ$Qγ›2ή»–Ÿ>\¦)c"΄Μ³©Ί —Ε4³ΰTJœt#tϊŠΆV·›’Έϊ{Η!’˜χ₯†Όk0hoΔΟΉηπ±X‘drΛzόϊWŠΊ…E‘ΐBέFΉ`"IΓΰ+]]½:w 9!—„f{1JΫΜπ'%Ετ`·»ΣΝά0₯ί„ΎΉsŸ¦œ€ ’8jG8jGg@p,ϋ-πd'$Η’ιeΐ―ˆGΫΎρz'SA•jœ)%`šάAŒψ™=lGΘ9LΏ¬–X½Σs<ΗΞήƒ8Ρο βΜ,L½ΟΨ?‰Π$$ˆδΐOθ[oτιυ·˜­XΈ»Μ NΞwR. )YH*^½ηIΟ™X0Xιο/΅b>‘ρINΰu<€LΌ4 Ή:oQ’HωΖ£Mγa=Rr«ΉH$³’τςāΌz7'?uΧ›κυ&v"|έ!iΡ?Lq{ΡE­ˆL‘ο²οψ oΖ„jA@ζ=έεΥ#Η"Ό°ξe‚ζρŽ^ {Γ_zΉp-ύ‚­Γv‚gŽXJ6Ρ lsMkυXδ$Σc$‹9B1ΗΎλ‹ Sn˜τd/ΐξQDGν u²‰VΟΚL_ ωΊmj‘Έ½θ"J$\KœΩXΗ»'i*qγΏήθηjκ%Nώd μGθφcr D,ζžέ₯³δLOυŒ±]φliζw4ή@%tŠιΠ@EΝυv,‘‰π\υ|ŸίΤ/Ί§iΚ‘ήˆ“*νΌ§_Οι‰Έƒ΄Τΰφ·ΖR„›π¨Ρ λ;,7؈§?Lπ`ΫGo˜dhϋͺRΤJDPvΠ‚ˆ­§~‚…:ΟͺΫΫρ™λGΔ؁WξxXš΅e)/²Δψ Ÿ~π`€$fΚά₯Πέ―zΩD΅hb$huΉ=ή₯p,Ύ©d›Λ ΗΖ=5†ώiw0ˆRΆXlΜ³YH¬^6aΠ ·\佉†6Fš?~<€φ»=:Ώαjρ1Ϋp,²8OSξNτF φŽCδ=zΙBU6υs±Ψ°‘wŽ:1:ύ8λ¨έZpδέWvϊ ~λΊτγΗC€)w5¦«Ν3^“‚iƒ šŸ{!'+Ε‰k Χϊ Ψ*ύMŠOzΏΰρ3ΑK™o$·mŸ%ND@­dΒTόσφ”ΐ꜍―|ͺ€)ΪXΌubϊΝίοΠΞQxFˆΘ±EΦK/QΚ"ΓQŠ8ƒΚ_ρe’+JΑ@©`b¦l±Ÿ`ͺSšr+Wƒ!5βϋ₯۞Ό½δΘiJ"nΫξ7cΚΉμ¦MΆB6P)š₯Š«e#›£ΫΦ‡%υ²‰™2Kv‡ šμGύQŠ΅9]Ε*`Z0lEΣϊ :ΉρU‚3 Yε­Q΅@ΔΘνύc'Hπω,5R,ΟΪπ\»K.Β(…eŠg<θΗ[χΌi0O@¦ 9>??/IΆ8Ε]\φό‘‹Uι—ύžžŸ§ήΞ ΑΦa?™­.;PrΜsoœ#ΖlyO―…agx#iυbΨ&a}ΑΝτ3lϋθ•LH }‰Ήš€aπΨ`―"I%*3λVΈ5)ωIސ Ύ³UχΧ<ωΒΊ+=6KͺΒHλo¨έγwW²yύq'ΞMύΟ|έBoΘΏFσF//κΩ2ωύ KbΌ['%0R όΓ A1gΠΓνΟ­:πœλ'ίoHοΊ4>’ΠF₯cφ:0Οέcύ³q"Ρξ1΅Ω±Κσ5›™ςje CŸ›ΝNŒ“nŒ?αέMŸnϋΩηi΅§%<ΥyH ΤΚ&~αs%Ή03•`’Fόy0ο7 Η_° ž™Έb 4M’_z₯€V/¦·ŸϊSwKdξb­^Œ |v!°LΦθ. όάgK²\˜\-”ΕοzΨ> ΟTn¦ΑH^^Ό¬ŠΊ(˜GŸR!w5RX‚εD_Ύ“?cτ“¦ΐq7Βq‡!,Τ-ω³―αΪSκ zg# (–]«ΰ±ζw΅h2:y ΐFΰͺdϋ0„m>bξΚοΠ-[!€jѐ΅’DB†‘€ώ0‘σ3&υ‡)€WΈZyˆ7ε‡Ϋ>‚ˆι~zζͺκΌ1l°M^ ͺΚ—’Η;Άj·Δ©D"EοΪ„™ŠKuRβ„ΫΑΊBΜ9ΌQκλ5~MGjώ­%lKŠrYh'νΈXπ.·’b‰έfˆ“.·ŠgμŒΪ¦7v€7F²L’2οΰͺ…vb$*9ͺ TKfφ½~Γ`ΐlΑ(xL­1…”ύtΙ΄ψlΥΒBέptα龏$,#ΜFSZJκώ―Ν;˜―[H₯Δڜ“ήZt¨˜ηwΰ< Α0}tBo™,ώdΟG³E½dfη>Ž=I%'†ΐ³έ8•ΘZ&'/ΡΙ:ά˜9qIπϊ›ϊό‹yLam{&‹.\J()–pm¨ηνςχΰ„a„ίωRήΛ45,“M™΄Rb»ΣΌ3 “nœ„ Ό~œtcΜT,δ=BΞ@«;Ω\Α™~υ‹εi%“€ίKΓ7§ΏZΟΈI8b6€ €< žΏό…2‚Hγ`ͺ‡΄\`“‘8‘ΠxΥ—χ~ισe)Ppyv:ύo ΰ{οθΝ'§ΏϊΟuϋ7M(si/8#?½‚ΘwΪYm0J'yΧ@§xΌγg–Ζ:ς.λΟT¦Σ/ˆbIΏσFŸϊΓ³Uvϋ*εϊ+%ͺΛΠξΗΘ9*ΕSΦ λnΦ˜&Ζ₯G‹€[11S1eKτ‡)Z½»Νοhvb,Τys/zΌ¨ [§"BQ,ρdΧ‡)υ²™Ν™΅\²¦_F±T|>£ ΕΓm}%uK`±₯υ Μ”-”σf¦Ω@ άEa”ΒU¨½aw9 «©.‰ΊΕgΖŒP”4ε¬8W΅²Z·{₯”Y²%²Ωz₯Θΰ4 wγŒj©ηΥEσ;#ά€€vPΝ¦FΕΒ­'syάΪ°AdτΈ™Š™9π±•3eBNν~Œ ”J)Ёi:ƒ›Af/'ŒπƒT΅ͺ9ivmΆ’ž«™²ΰ€,ž/}NMƒδ—^*ΰ°ΣI'FE±Ζu ŽU•«[ΩΪαS Ϊ<Ώκ‘ΣOpԎΠΦ­ρΣΟ±&όP^ ‡Ο’οψΡ£‚Hβη?[_’w—' ύΌΏ^γ?φ2ΏΣΔMpC°d ΐ?Ž •’!υ‹eόΖοΆisj'*C@ΟμΠλsΛx1οX„Υ9·Ωk>•rͺ Lπx7 ίρ€΄ΒίιAredφ»—'U ϊ ¦Κμ…Ψ<PΞΈ·β1τȎOŸ!»+ξTηCΌ·ιcχ(Β\ΝΊζΘΉ§ΐ€N”rιG)e ₯Ό‡œΛR‘·ixίζ&ϊ8•1‘¬ ,̘X›·±‘<βDf”--IJΔ:z£Φ磕ΫB₯TΨι'θ ˜ώΉ<λ`NρΤΧξ(„)Ν\θaίξΗΒS<πψ‡Ρ©£ή¬Ϊ :ƒ~ 1W³2½'»A†Ώΰ1oυ²™%XIΚvΌŠ©ΐŸά^.ε9ΑB‰½ ³ŽΆζj¬ΔΗ]6ηΧ\Y)R½‹Ÿ­ ςλ_-γυ·˜–š€Θπγέ7?L±Ϋ Ρ%xω6Sq5(3;φQ‚Γv„“nŒaΒ±Y I$’8Ε„ΊB‰Žρ5ωƒ·”χΎόrANΫ•$>χBύQŠoΏΩ?σŽ*‰fԊP’Λ4ΥΨ3RΒWžΓϊ­½­^¬žS]€’Φ¨³PΧq'Fw˜ έ‹‘wmT œτ]ζ°ͺΧ†ŸlIΎxk*œ”πΐ?ΰ{Σ]‘ά$g£n ΝψL 6ͺ¦ό΅/WπίόN›vŽ.N€ržRήTΥYΔΚrPp ΤΚ&κ% ž#πήF@k‹RΦΗf—…ζϋƒοχ²„β|ΈΛ§}nη]…9H~q§Ρχ† ϊ£y%²rΡg>·ββσ/ζ₯!0y”A@wΠI7‘[ ξΝƒv/ΖA‹ωΖη)—šGο9μΦΆ ŒΑοψH֐―•L<Ώκa€¨ Œ—¦ά֐YΝ ΑΧ_Ο“#ήάΛήΤ Υ)Π`ΐύΝN”!Σw›„Ήš•U̚Šp’πdΧΗ‰¦uhχ¬€^ΓΙξ …‰(ε™zη)*E·Ζ΄.Άa¦Β#ήΐ­l|ΗOχΆNυχ₯z~o-Ίά9St΄ή0A­ΔΨ“‚j-ΌΣъ–κ=s\‘Ž»1‚ˆΕ”” 桞‰εY[V‹¦|ΊΦAHW!Φ΅χEœπρsΐIW)Οc‘Ε™ΝNΜέΕ¬I«#“XVγ·8‘ψΦ}*z^ΉλιӞ–Iςk―0₯ψΡ£avRr[_™ΡVΚ‰II¬ά>uΘΆό(EίOΡχμŸ„(L4Κ<&q•žΖlΥBw(M~ΦΛ'Ο ₯±αη>S”―=—›&αŽΑΤοΏ?υΝώ„ρίϋzνϊ>jΡπ]°iΠ &ΌH…/,ϋΗυ†Ο>¬D,Ώ;S6(`X)o`uΞΕʜƒZ‰[ci*Ρμ&xλρˆΪύŠEΔuQ$‰Δί~ήΩ8ΫϊΧ!ˆ[Ί₯œή0Αώ]‡”ܝ(²―=Φͺ—'s‹nΤμΔ(xf*βDβΰ$ΚΈΐ3Ώφ岬–¦oύ?ά hθ³jάΠO!Ο9·ΓLμG_SψKγg,Ή6οL]]'τ)Κμ©”7P―˜Xž΅±Ύ`c¦l‘ap»ΫO°aο8DΞplώ‡ν„eV)&)WŠšn¦Uα”43Z½ΫGΆBΖ(ηÜΛί―}n/:X˜q2 ’²^L(£ΛΩLΕΔ|ΝΞ ŽtZ(τ½0Β(EK=ώόΉš C I΄"Œ‚T  TςΌ±k½ϋœk Ž%ΆB<Ω ²ΆI—%p΅ΰιX‚`Y|,A$3Jβ%—νwS`γ ΐώ1'Οέ![έφGIvέt8Ά@Ξ1΄ο@ζ°:η ZbξώγΫG!ήέ θα–O΅2ΣλlΛm 7LιΡ; ^τάΝΥ!„œˆ΅zάΑκRH)72Η_K£ǝψJΦNή5ΠΠο]+Κt#v›5*¬Ρ?mX&a©a‘ΥOΠκΖ€ }Η"V-ΐQ'FNφ,a ΒLΩ‚aœΆυ΅R§ξ,θg!Š$LƒŸ£q·PDŸτΞ*+JΕ8ϊΩO—δη^ΜΛ)xM—όηογΥXΗMpq4Α~Π_°€ I@1o`Ύncο\ Α²°kσεPΞσβ[πΘ„,~²y²PO'ΖΦaHG­˜fΚ¦,δ.^˜~ψpDΏϋ£>]&ή£iU-²v>&Ώτυ²…Υy+³ͺj^\―˜r;%αι^@{Νθ™ I8;εΟ—ΣΫKΞΤ³ψ­ƒˆ6χC:κΔΨ<°Σd«OΟζΝθδ’y #σyfΈΐ0ϋ'ZLΑŒΨΌIΡ½•ι•υΖί±™Š Λ"ΪSΙΙωΨ|έF!ΗZϊzΌ‘m‚½H™ƒ–uJΧ΄-RβB2«ˆΟoΌ:Hv#Τ0%φO"Zš±QΚOŸΤ8ΆΐʜMRω!'Θ-Y5t²lΉ&ΥΛ&[dθώ‹~&YώϊDω'8ν˜h΅MΗ6”:'2άΜΧ?]”_x± Εdh‚v<€΄^>‰q“\ϋ`ΐΘ—ΐξW.%•μEΤS­YΣΰVλlΝfΓ EΝJS‰ξ0ΕN3Δζ>·>‡ώYΪΟq'ΖΖ~HΪ­oœtpΡίωύ.ιΩσEa[<Ά”z]odκsσ5;SΈ+ͺYσ(HΕRΜΪS½δ{Νϋ!εΟw$πω ς /¦bHOχBϊ‡?θΡγέΣk‘€…œRŽ-X›ψβd‚˜oΎ0cγφ’#―κšθHSΠΈΠΙ5dΥ―<Ϋ$TŠξ,ΉΈΏζbuή–†`{Χ™ΈNΞΈ΅ΰfˆτTωtI¦e`„J΄r!o)Οθs‘vΓ(–x²ΰι~™ S΄ΒˆrŽ-PΚσ_‚7σ§{vŽBŒeά£œ)σ.'2yι\q*±sβρξYΑ?”jdaΒa3ˆ¬’7=PΒ;B°ψΞϊ‚Σ$΄ ήΫa8ΒΐO™ΗoiŸnο ŽΪžμΟΠΑο’Qa ίΗ»>ΆBD‰ΜΈλ:¨MΈ–ΐ0HρxΧgχMhEHΆΊΏξf˜‹λ„)K [VІά;ŽΘΞͺ .Ο:°LB³£ΥKΞΌΗά­‘hυΈ›Q-Yj„Γc™zΙΜ6ρσ:Yβ­:2IrΪŒR4;1­ΞΫ<ή™2\[`¦bΒ4ε^ 9–0fΠνtΪ'©’^ζ]Φ>Πnœ½3'Ό½±ΐ†««dΤΐη_ΜΛ/ΎTΖt›ΐΏ ¦xΗγ7€«γχό)°PΠ\‘AJ ,5,ω'ΎZΖ7_ο’φΧ’ΌΏΔ­~Œf;βΕ]Ώ΄ΐ…£ƒ“nŒ7ϋdΒʜ Η&INb΄ϋρ•3}Οf]xmG\-šhTX½ΛUσε8aE½γN„f;F­dη^ΘΑsΔΔj¨˜3.œΝέZ`‹ίi} ŽZ1ΎρννŸDYuwF §¬ƒQpΑ Rq¦Ms'Λ%kѐ7ϋb$B½lΘυŠ ΟφΎpRύ‹²€άέξ­Έrθ§ΐH₯Ό`L†κιμŸ„ΩΖ= nWMά]vρ`Λ‡¦™ΊΦ’Πs_]1eT?}ˆαμZςY'ppΒχ|Έ¦₯ŒyΤr:g!"‚”=³Μ\Ή³Δ~)€υy•’ δ 4ΫΜι.εθh\M>άeβ2G­­.+Ν;Ω¦₯uŠž@GU‘ZRΨsζjŠς§σ’ͺ„ΊQ±Π¨ZΘ9"³ΦbG•N]*Γ€‚ήΟ-Ο€―/έςPπ ωΝΧ;΄ΧδJί6ω»―bαθj8ŒNŸνLS ΗΈ’ržΥN˜‚Ž1mδ%ŸΉΉβοΎή₯?ρՊœVF\J œ7δ½GJ QΟn“2~έ.‹4εsFR•|]υ{€°Η ά_υ0Saά”.€>w?'Wζl)ΔΔχ“ΐž/,τΎŸ{ϋIˆ›ΐδxFώ ˜&xε³W.XŸwΰX‚˜²ΕύQ+ΒΓνNΖͺ}\ύ2ΉΆΐς¬‘/ιι~H†ΑνfΗ΄ΫŒT#¬ΉB’«ώEEI3 φ!8ξr«}λ D»ΟΰΫ"ΌxΛƒ7φ£@hτΦ“ε\ώž(‘ΒΏό…²lTΝ©6βQ7ΎέOχ‚Œ;>–²Y‚pά‰ΟΘλnIήXlΨΈΏξMεfHφObjv:lEψαƒ!½»ιΣ“½€NΨɍϋ¬8Οϋ } l+“H–ͺ‰JΑ@*Ao>αιΎΟώκ‡ϋ ΠYʝŠΧrn-Έ(ε jopυ]5Ž 7L'|]Φ\¬ΜΪ°,ήΈ΅£₯mŠ ”:π“Μ¦yqΖΖνEΓVΥΝv ™r+Ά”3P.ˆ"f””rξ-{(L, ρxΧG³Γΰ*LC­lqβ"Ές°5Β`œrͺΖ‚˜ΔA„‘mAIDATΛοΨά•α9»‰•YζκίYvρεW ςή² €Θ±Y‘ξюͺκu"£Ξ΅7`ΫhΛδ‡Λ1‰ξXξT)DΦJœΰυG ξ.9rmΑž¦νO`eΏ+˜Υ5όΐ7φc7 ΐtρ€mpPΔ„$ΐSΎξέ~JQΜΖ2w|τΥh`šAJ™«ΩH₯Δ›‡xϋ©O¦A˜―[Ψ9Šh5 œfηžΓΘڜΤ8Jam€™%κήqxfγxΑ}ι–w‘ΩΟx€‘ŸΫO}rLeoόΒΊ'οMιR&Όώζ€Ύχξ€.ϋΠ¨ς£7LΠςυ‚[ Λ³Φζ v{ΡΎRπFGIzo‹]ΗLƒr»|ϋ0€έfDa(‘€ TUB9ξ}ΰB!ΈΝ=Sf[ζG;₯c”o φ‰°,V•Σ€CC0Unη(T΄»DΝPcΨ¦@ή3χ δΆEΈ½θ*q%<Ϊρ±}ΒΣ „§Β(J±:οbΉΑνyΆ °uΰD΅­sJ ™yτ<ێb·m1ο>Mžy₯’™.œLρ\w8Δ `ί†rΡΔlΕΒRΓΖνE―=——w–,Τ-,6,Ή0ΓΒ>K ·Ή6oΛjΙ@Ξ5¨ΣOΙSΦυΟzjNb؟ΠκΕ™3a)ΟZφB~ ±Ψ°qoΕύΰ7:ρr(ŒRJSNΨ£4sŠΌ, žΩͺ₯ƒ,ϋC5Σ (§ΒXτΰ$Dœ^Ό!΄"""Zž΅3[γi’3¨;HpԊɱ”-°²w,N5xτό§j€kMαΠ:}ž”.II%;·ykΙ–SŒhtNωŸ‚Ω\½ε¦~Œγf0}όΐΜζΏ  Š γ€Rΐϯ;x΄ΓmzήDP ?0r 9Œ$ώξwΊτγΗάI―†…ΰΕΆQ1Q/[pUŸJ ?`α‘“nœ –\¦υ>Mχ[S΄K9X³ενegͺ͟hΆbόπΑ.COk—0JαZ<ΫQ„bΞΘtυ₯,θΩ\aO%™άρ`ΛΗ²B«—ςŽ;±R*c‘"’­ΓwΚΉ<ΥBNŜ!•`Μϋ6aQχKή[uι†—o&πxeΌ Cΰς»[#τ•FΊFΠΣΛ’τ”NX-™Πζ+!v›§&P‡ ΑkΑ层b¨h €“.cτ,6ynήι'X³‘χŒΜτ(%οϊΈMn{³Κ!kσΟTΉ“a›$-“pέA*Ω1NW•¦Α";ΟZž½ΔZAΐ4ΑNsJˆι|˜&a‘nΓTΙγƒ-¦Ακ…υ2o-Έ¨—Ψ’vβ3‹ιΖB,!ΝBa›ϋ![1ωaz©mO(­G 3‡Ž;1ͺ%σ5ΖΊΆΕͺ‘lύl‡!IoΈ‚'π™ϋω©Α―A>Ώζbΰ§πI‚NΉχΛ³6UΝvŒΓV”u‘Ξ{ t JЦi™4ρŒGIlψς+ω܊;mεO`cŸ @gκ/ϋΗMp½ψΟ8ώΰqΐεI€Rސϭ:x²λSš^―‚Τόj€ΫΒϊεŽb‰Νύ0[‘ Α,„Y₯»νŒιΏΈβΪΨ2U/ΰςγΜWžΌΦI η™s A(ηVζ-˜SΞύGAJOχBš΄ Δ ƒΜ΄”θ½uE›˜ξΦlΗΈ·βHΛ€©d“·Cμ5CVΙΛ³vyEy86ξ(Hq؊pp‘R4q'v±wΣώqΗ"Ί΅δΘe~ΫΉN¨ΡŒόGΆŠΏχ]Nκ\›Ϋπσ5[E‘€86‘’70%gΎK'JέA‚Ήͺ„Z-Qβ鞏ύ“θ™{ήUΌϋkJ9#Ϋό›Ά|„‘Μž/(Άϊ,ΆSUς·JyP αdκ‹…œΘ\ω\‡yφ† y₯±Κ8υ(`š0I‹I#ΝΟ_[νH™ͺŠΪΉD~Έγγ ex ΝΰΈ*‚P’”ή”R»Šͺ&ο¬8(δŽΪi-€Λƒ£Ζ‰Bύ?·κΟON±K 52 ξφΜT,μ3F`< p’ψΫίοQ₯hbJΕ<Ε'|ζωl2«dο8„!³5£,ΟΪhT,wω]ιΖœ4%kU$)1q“\?$€ψ‘ϋ·0EP/›ς₯ŒίϊαǏG“Yκ…6 Κfϊ³,“P)r+°œg©_)yΓ8ξΔ8l…(Έ²‰bN¦νϋY–@MηJΐ€œ#eρϋφŸNbΖ6]\o@σ5^XτgϋaŠ£6oόŸ—ηl©eƒ']ΣV7A³ΣbΓF­hf§©Mu˜?W² ·˜cρJΑΜDLzΓ­^Bύa ξ+ δ=Ά₯sβEΗ4±N€n“& s󷏂, y²ΐZ(xkσŽ’ψ±•πΪΌƒΊJbϊ£[! žΐRΓQΊ.lϋ™΄eΦ|κnOHΛ"i"G΅ν‰ς’ήδ ΒΈ΄ΌΤτψƎ±sό7ωI‘YyOΰj1ΒΦaˆώε œDΟ€ο4Π쨑˜W&’šfωζγ<[ΠΧ^+\Ϋy―Q5εW>U zΩΔƒmΖίτΗμn ΘήξL—„όN쇨—Y]Pϋ?΄{ vCtϋ,(bwΖΫ½°ξ^‹ΰΪB>ΏζΘ{+l‹°±φa€0–˜«ΩhTNύt"°Βύa ―"PΚ™0ŒizυwΥJ&~υK%ywy*,‘ήό:XίοZΡMά€?@|,/ω59LXώ\[`}Α―„:ϊYC–gm䁓^Œƒ“–šυέZp°ΨpPp•6%Ψi20LΛ½ΞΦ,nϋ)φ•:ί€`cσuk*4=H)…)”ώ4ŸΏΉo}·G%Ε-nχ“ υ#§fŒλ .ϋ'ŒΉώ=Ωe ›ζqΐΛ·=z~ ΰ‘ΦOπCΠBέΞΖJ‚XΡνdFE;MQŠͺσa fΖ ά^t±<λ¨9sŠχΆϊρ£!Ε QK$‰$ u‰Φ€’AR«›„ΟΊϊΫ‡‚1z)Ύ½»/Έμ†Έ>ο’Rΰ*π¨αᢏv?Aw˜BWˆ9Wΐ³:ƒ–!p{ΡΕκœƒϋkœ­š²”η„ΕUt9KHιQ‚ϋη£Dΐ“ݐ~τhHŽΕʌ}DΐlΕBΞθlμ—‚οl‹°2η`qΖBι%@"ΰπ$¦w7}*L€ (οΩΈhΪpl~Wl“Θ΅9ΉχNb΄`PΞθ YxR•λ`3γ°±£RΜ{μΫΰΉ\„‘DΞaΈŸkCL‚˜nϊξ†OΏων΅ΊLcnχb΄{1 €©οζΚ•±/ a(o‡δb9a)Ωͺ‰_Z…mΓ§x Τ+άlώο;n:ο?$€§N‚3˜Π π_ό| ¦Aς»ο θ’™ ώΉ‚ΗZκ?E£jaΎn£”cP`"9›?lEŠκsϊ΅¦A™£ΫΠO_xcšQ,IYΓ^ω‹Ζ8LσΉΚβΰϋ=jχbΠ‚“ ηθ ιZ³U s5+ΣΌΧ(χS*…Ψamή–‚€IESš‚όPR)Οסَ‘€¬Υ Η-½αΕ-Κ0b!’ΌΪdn/Ί¨9!Π-εν£ sy΄L‘Ο«λa;B9/θΦ’#UR—^Ijχ¬Ζ<“„ΠιΗxΊΰΌgΰΆgdΆ­;G τ‹S©ͺ[‰v©\j(ŸB0$Š%^k@θ•;žœΦ©ρ*Ζϊ<‘ θ,Τm,ΜΨ°OΟ Τ¦x™GG)gd³W…₯ΌAyΧΐI7ΑΦχzτιηrrivrηiόϋ\›δ½UG:6‘kՊ&vC₯ΒΘ$ϋiͺ‹"J$vCwYaf«.š…ZΡΔa+Bσ:qԊq؊θg^+Lm!,μFψϋίλΡq'>“Πφύƒ=‡-Ω±ŽΐrΓFœςΟ691ϊΟv$ΩdΙΖ―}©,—f­iŽGη¦%xζΏΎ.ΪMά$0$€¬8υοXΒ„$ΐ΅Iώόg‹δ9$οΗ} .ΠΧ.εΉB˜W€ν!ήξ'8hE8ξDςŠM“³pv€Kxή8%ΦdΥ:Δ){ŸX'’Ύυ£>6φφ;OO۞ΪmaΖFΑ32 £ωaŠΧs°-γŒΉzΝΧ­‰Υ)[₯]ΥΆί;ΡlΗpmRζ4όίΛm23_η{±P·3Ώσ½cθ{!ΑΖ?΅£ί ΐwήΰ{οimΑΖ―~±ŒzΩ”@₯ςΰ$’ ’Θ»s5ǝψBΡ) Κ•χε£DβᢟΙ<Nš2=O+πUKόͺ'©rrάΖ)†~JΏφεςOΔ?aš«iό„ώ'N€Ζ€Β;H]Uζ\‘iZlθτc¬Ξ9¨Νμzρsœ\0Τ”^ύUηΞ–³έ]φ`™ό}οlŒ°}Π―}Ή‚΅…ιl»S‹ξυEŽ%δΖ~H9Χ@wΓ±„2ΰ™Μ±ΧΗ₯―ΫΈžˆN;±’SΆ²ΝXΛπφSDΐ/|ΆΘkΝχ'Š%mDΨ: Iƒ‹ΟόŒϊoίO1Ψυqxr6’―w£b‘7LΞ€6₯n/:ψ•/–εlmͺDTσόνψϋq“|8ρ0+O­cB`›$Ώϊ©"•ς†ό{ίνR_ωh—«q`ZμΕΨ?‰Ξ |/λX&!‘Θt¦ ClΕοM)IQμ>ho>φρƒχ†€ς’8…ƒ^XχP)0';N˜/ΌΫŒΠΔ™ H¬Ϊ†ΊZΣΗ΅2g£ΰM? ΰ¨γέMϋ'§”ΈQΘ@₯™²‰JΡΐnσYΛSFCσζlŽ•=,Υ|J—ίΘFAŠύ“ife υRŒ“^?Ψ?Ž©Z2₯ –@ώΑƒ\›}βσΐΚ¬ƒ‡;£gΖ6•’‰υΦπΧN|z1Ώ,β„υ f+†ΑΙS˜`ϋ0P1ΒQ;BœH²Μχ§„7᲏ fΧ3MTJŠΐS9ςSκRΔ‰δη=‘δ‡[‡!‚0•sU‹΄€μύ5Ο―ΊS4T­LΨξ'0MΖΏβηf}ήEή5°u<“T96ΫG˜8ΒJ%Θ6I™ΩH‚ppΣίόVΏϊΕ2ξNIΥ!riΦ‚c“|Ό !ΜμΪ$©œNnOΚΣMϋ‚ŸΥ Gνσu³+£ @όΓCΚ{B~ωε‹e»΅¬π·ή`Ο¦Α 4/!Ψ=“΄ ΜΧ,4*<¨•LxN­‡'ά‘xωއ_ψlI–§W€,ςσηpCυϋΐq“|xρ7p*?ω&P…€|νΉ‘¬vkΑ‘†˜άώ—Ψ> i8Μ*,€'έ΅’™Ήμ[»΅"£συ±κEͺ7L.΅aΙΡsVf팭„q,Ι4HΎ»9B_i<μGŠVe’Σ·°―ψν€*§[ .›Η‡ν(σT_Ÿwα‡<‹=,³U+“ίM$‹£<Wjα_ιKΨ&]λ†_ΦVηηV"MA\ΑCv 5;1£DΉυρ¨ic?ΐ“½ ΛbI «³6[ΐ ‚g€Οο­§#Ϊ= 1[³€ηΨΆFόŒ³rœ Cπζ§=ζλ žΐΖΑιˆFJf•ΈΆΰΓ[”Θή=Kuמ[υ°sΔ’ΓλwΫτ«_,γω΅λ› ΝTLX&Ι‡[Af"ΆP·‘¦<:ΊΒ;»ΐ)ZγΩψlοάlGHO°άpw ΌσΤ₯Ό!_Ύνω–"Oθ·ΎΣΑ{[ž_u‘sD†ƒΉͺ\ύ·?Jπh‡q>w—Ωk!η ¬Ο³τv)oH-=>Εζ/ψΰυυ‡‘Ÿ%n€7~ΐΐΏΰS˜ΰ>%%πόš+sΐ{›ZC?IΨΰe|!˜8«$ήΘuD“ύ»soͺ Ϋ$€’C4Tυ@ΰ{=jvβLMn<Α‘Γ»ΝΝΞΕ ŽNdόσ(¨ ,ΜLnλxνΉœ\˜±°±bc/ Γ;΅z1‚0…«όΗ»ƒD#Ÿ±Τ°1Wγκ%Vθ| |œ)›Ψ? /½VA(±Χ ‘_φΨ·^%:̍fΝύέ£ˆτbΊΣ PΚ3‹`iΦΙ\—6–6L“„Μν?lE(δΈ{βΪΌ Ύ£>s5 ·]X&ΑRl†¨—LΤΛ&Vηl–§m†ΐ°›,°pr'Rϊ‘€0’Ωhjθ§΄±ΰ€ΛQ’œ7IYωRw˜ΰΡΆ JqΝCΑcWΔwžŽ˜u‚Σ{ΎΒR¬Ν;™`bΔ †ΆφCz~Ν=£yQπ Ԋ,θspΒVΜ‹36”ίs+φš!vš!βD2x•ΈZυyιž&ΑIψσXπξ.qηjσ ΐίϊ½6Q ―ά™Κ›ώLT †ΌΏξβρn@'9Wd6ΘΫ‡AζπΜq&1d8•Qΰk1+L-ε μF΄ΐΰ_©G'{͈Ύρνm쳌ώPyδπN³FθΓjυbψ‘Dήc1 Σ Ό|Ϋ“Λs6 i7˜uυΑ#Χ›ψβ&ψπγwό/ΐφ“ŸΕ΅”ΐʜ-gΚ¦|o+ “NBBpφ|ΨbοiΆenχΠO/I0bwΚάΈωJqΎQύ`Fš―Ώ5ΐΓmΆI˜­ZX¨Ϋ,3¬Ϊ½A‚w7G™Γάeη%2S=³-ΒΠ獱”Ÿž~θ9Bή^tpkΡΑ(ȣَ±±bλ Μ€x+{Ν₯<ΣλtΥί&Ψ: ΡμD™9KΞeJ Ϊο"λnEΖ³WΧcϋ(€cL#/gάΥ‚Pbλ0@ΞεQΐκœ€«x‘ψμOφxΦ p"±±ΰΞ+ϊ­Ν9xΈγ#M%ζλ6n-° έ(HρpΫΗI7F§Γ2½μόΒ(Eo”ΒSLjωθ„ξο ιέM£ ₯εYΥ’‰$žξωΨ> ‘J$`gl¬Ξ9Θ»χV\„‘DΑc‹ήνΓΰR€^Ku3^Xχΐ~ΐBέB1Υυ‡C΅# Ζ€΅rβPAΘˆή ΑΪ‚‹‚'°2砐3p€h©d3,yΥ™Kǚ{ l…h”™f8WγΟζA€ίϊƒ.…‘ΔgξOεQζY)δ„ΌΏζβι^HΆ8Ά@½ΜtΎύ“{Ν~tv„qέρ‰ΚeF―yοΩ ύΡv@ί|½›Iλ$ΤΈI~2ρ:€ œ|UύΩ•I€η °j`ˆ£[‡&Χ@kl ΊΡbη«iΛ€3£"%©„k Δ©D‹M@ήw€xη©Oί}g@Υ’‰εYε<Οω#εoξΨ€€~''8’RΥ AΓ άZtiΪγ‘Φ³…\³±2g#Œ€ϊ)£”Jmƒ ƒ«ΣΠU„£0›!wάϊ―ُ=ο 6ΒL=η0_ΏQ±N7VΕj˜―[2Ov'2K4½πΰ$Κ::Ž;1οϊΟψ±΅x°8c£Q΅0πωž―Ο³¦ΠηΝ_o¨CŸsž_υΈ»ΰβюQ t&\Λ$•jΰ£.xd œ„Ψ=K„Τ¦±«ͺν[ .<[ΐsψΟχŽC΄Ί—»Y Bf”€€[Cί[ρΰX<6xΈΝG"žMkκj«c$ΩΖΥμΖC¬Μ:¬–©,v΅Ž~·_­‘O€₯€‚~ΐœϋγv„…fδ\{+[Ύύζ€’Dβ /ζ₯q,@½—ςφ’v?ΖƒΝ€4ˆteΦA₯`bϋ(ΔI'B"OG_«i]ϊ$ΐέDπ†ώxΧΗlΥΒσkj%3σ!xύ­wΟRΚ%RέΑdQŸρχn―ΙβE_x1/Wζ¦N 0Υϊρ΅W¦›˜*nt~rqΰ/` 9Λ TKάwcD}:-l~b#I$vΒ¬Βbΰ/ͺ·—\,Ξ8pΑφ›έOv}€)Ν†>ƒ±Φχe~£Ήνπ‡=ͺ-¬Ν9ΌQHΦ™ΌhΫQΔ±ΔQηjR3N $κ ˜ψκ§ »†ΧωωΠλ!(3άiT-¬ΞΩ( H€6φlμ™ ±691 f δ\/Ό˜—w—]Ό³α“rkωފ‡ͺ:ιΖc™IδVŠ,‹πϊ›:Ώ‘kλSnOσ_œDx΄γΓΏ Q’`kγΌg ܘ&‘?Lπ`ΫGϋ¦A·ό΅·AΑ30[cϋή+ο+˜JyάIΘ³*Eή [}Ύ§—ρ»£©ΔtώI/FοŠΦv©ΐΨΓ €£ŒͺY)²Q”d›αœšΕ‰ΔΣ=uΏΖΐ‡Q"Ρι³2^Ξ°L‘˜!lΟ}»(—νIG­˜Fc/Ϊ}–·e5ΑŽΝ: ΕίƒνÈ<[ΘZΩΌφϋ#ˆ₯ ΰ퍅‘„ηžš0ΉΆν+w9MRNR£xςΈ 9Ά©"6λτ<·βΘΕ†…­ƒˆ6φ"αΩ"£‹Ρ©aX΅hΒ³ΩΞΊέΏžΉΟʜŸϋtQ.6΅ω?Σόώ3L§ήΔϋ‹›ΰ'-pPπiπC}eb₯?ΧΨ?ŽΘ§AιΪ<ίMSS‘΅y€Ι«ΝΈέgΣ—ν#ΦI―—YY°3ΰξΉUηZξa:βDϋ$H³½Q‚Νύ€•Ϊό4SΤ‹S¨1Ηδsc›Xn©ί^rδs«ήΤΖ&Σ†Φ&(ζY~yΦΞ\“„gήIΚ]ŒjΡΔʜ%Χωd7 ·žŒhaΖΖ­EKΕ‰ΔΦAˆ'{‚0E½ΔΞh›!}χ!΅.E­—MάZtΩ{]ύΩq'ζ ώλΝBE΅’Ε>DθͺΝИ#NAr•SUiβOŠD‚Άφyd’uλn³Λεe ²V9pκδ(qΪ₯C«σΌ!ϋͺJmυτG <Η@NΝ°‹­€λ .\[ΰDIŸ9pbΡ2ΐ΄ͺlfMƒΤ»agc°gB‡'1ϊ£”΄RδΈtt»«ž2‹Κ›ϊ)%©D1gΠu:γΧ«R0ρξ¦O‡'{+¨$£R0³jΏ^Ά2M‹i:iJšΥΏ{ΝN„8Z½„φš1ύπΑ„_gΆ―†c Ge₯X™€ŒΕ˜΄‘KΙcΙWοζπ«_,Λzyj½ ΰ 4€Ώu­ x׊›ΐO>Žό‹ϊ`­j²Y"ΰ•»ž¬– ωΝΧ»΄}b%ο|0J«ͺsΎΞ’ Ž’υ† φ£Σͺ”E­#`š„‚'΄>ύϋμ5YŸ 粬πͺΰό Νn4cB\‰`Φ‘€~(QΘυ’‰»Λ ρακΛλΠ’Ά† YS ΉΦ=τG‰ά?Žhχ(’Ÿb}Ρ–·™ώ΅ΫŒ°2λ`q†uε‡>S°š©:ƒXα*ΨΟ}ϋ0`l‡ΎίfkΦηι„μΉ^pωώιŠω’g@dQšv7τΣ‰ξ“­^Œ‘Ϟ~0]qe–Ε†Q„S€ή0Ήp#%{Βk·½ΓV€lˆΉΒ·Mύ uqυo’ΪΡ­(Ϋp»ƒοmްΎΰ`¦laΚόφΞ€š’”©ž—ΉKκ›kVeΤΗ[QΛΑ4•”¦ (–Ο$:Z*zcŸΑz7"%°sQ’Hά[u!G°άYvdή«ΘoΎή₯·žiiΖΖ\ΝΞ@‚π©GΣF¬π4ŽE°Mžε7Ϋ1šν8{.4^'η2ΆR00r7ΗUkE^~Zz¬ω΅OΟήΟ³ΉΥtΈAπm+ί»ξu»‰λΕMΰ'BΜ[ύ €¦˜±W Vηmϊ)wb(IοgB+ι-Ο2Zό€Γu ά^r1SΆ2Z φ’oυγ3ψS–gά[qε ·\,7μL‚wΪ ­nBwCŠ"έξχqpe΄>Ε·ͺ“Tβ ΕUθφΌΆš]™·3ψΔγϊ€m}\[`¦lb}Ρ‘χV\Ω¨p«=ˆ$šνDδ”FA»γ᎟ωŸλ„'I‘uΒY \°<λ`}ήQGžΣ΅#TKά 2ϋٟOx4mlmΑΙfΪ:™σΙ›η%ΧdeΦΑL…7fΟΤ¨LnYϊΓTτF)Β8…iŠy!Ίˆ(Ή6oV9G 7Jπ`k„“^ŒΌ+ΰΉ\Ρw,RU-/8™bά“=Φ+ΠΗ¬[ω@1gΒsJ [°ΎΑU› w”Ψξ³iNΉ`biΦΚΜ΄ΞGš‚Nb:ξ0>γ²€s€8ιΖΘΉf,Ήά°1W·`[$ίο#XΜX_p¨7LιΑv€ξ †mρH@KYKp—Θ§Z&γ%„ 4;Ρ©ό5z$°ΗEœ=χA8ΆP]&Φ]'Σ9MόςηKς΅ησ™¨Ω„ paτ_ƒ₯}ί|Ÿ—ν&7 ΐ^ΔΰΜφ)€/¨bB ,γ‚ppQ|Q…#y“œ―Y1ϊ\£’΅θγέΝvt¦ςΤαΨ uvΌ«”LιΪΧδ„…)lβ¨Ν’΅[‡α₯ DΞάΎTf-͏₯<υtΏ½δ"οpeU)XlX˜Ψΰ‡’Έjc»kvc/ΌgΞ›€v/Αa+&)ύ“ΑzηDgt₯˜wς» žtcHπ†΄:ηΐ0Ζζφ}VόcΑž»Ž‰ΑXJfμŒηίι'xΌΛ4/ΟΘ9:ύαΧvqΖΖΪΌ Aœ¨+σφΔ‘θ Sz²ΰюΗΘ»Ŝ‰4•θΞ&+³ NLR¦΄v¬ί$Θ9§I€iΊύ•‚•YD„­Γ K’ΖΏ?•ά `# #c tϊ ŽΪΡ•χ.ο ,7ψZο6Cμ…HR‰Φ½KuργtxΡξq€Υ³Ο)ΐΟτ­EŸΊλΙηW]Y-™Τυ Χa"ΰι^@ΊΛ‘s8yDϋ!˜DΝ#vόlTlN*»Ι3ΐRZηΏ7Ja+S φ­θ^•Ί΅θΰΧΏ:΅¦?ΐ-,­ώ/Ψϊΐξ&¦Š›ΰ?ήΟ·^°0Ν/˜&aeΦA΅dβ°ΣE/ν\ΝΚ€\Κ«ν΄vOΥοΞ‡ζPΟΥ,τ)½³α#犩fΒ:τ`+?~<Β“έ€©UWHη\#K['…œ;‹.glV6L%Hg,Y-™°{Ρƒ­P<έ θ½ ŸLƒΰ9<—5¦vIΌ*φš‘hχRμσΌ20άω.@’JԊ&–„ΰ μΑΆ¦Υ? S”σ&XυŽ΅οc₯ν΄P·qk‘7ξ ΑƒνΊJ; ͺ| ƒΠξΞΩ%ψϋ΅>@o˜ΰ=e‚tέ›ΨU!b>ώwήPoΘsωbNΟΎ Dρι\ΏR0pkΡ…iΫ1vƒμΎD1Ϋ1»–@N%Ž-2{ίή0ΑΣύΰJlH” ο(¨–»λ½Qz)‘¦Κ`Α(f|FJ86α•;¬§pQD‰€έfD›ϋα™,•§βC―ήΛαη>S”Ÿ{!Ωͺ%§1ΗΊNX&auŽU wŽB:jΗJΛΐΚXΥ’AάA؟gξΌVΨaΰ§θτ“K8νl±„g‹¬Sβ)œΛ(”ˆΧ2 Ÿ½ŸΗ/‘tέyΐΐΏ¦ώχMό!ΕMπGOόk`Υΐ‰+†-5ltϋ ΅ΤΒn›„ωϊ©<ΐ3ΰΝƒΑτeQ.Šϊ­§Cz°ι“m 4*ζT£€ύ㈾σφ€νψ—n€γα:30Žu$xF;_³3~»F΄"ΤK&ΦY%nR„‘€·7|J 7L±ΧŒ' ξ ₯ή0‘φ $`[ζϋL’Xζ~Ha,Ρ$8ι^Φγ.@ŠΌk ο(zJyn»wb<άVƒ±ˆ Ix“qmHζ•ȏ©6ρΫ~Ά91Φ‚;9Χ@Kτ‡ά6/ε ά[φΰ:EΤ3φoy27U!+;ώθѐ£Ε<«κrŒ'‰Ϋ‹.Š9#5ΖPκΪΧΎ;ˆa›9…hω'-“πζγ΅ϋΙ•·Δ±ΉšΧΙ‘!εΌ Cπ5IΞiΦ‚ΗO 3H°wΜψŒbNΰ΅{ω «uE‘₯νÈ6XτIk<,5l|ι₯‚όΩOρmOV ΖϋΝNDl˜S+›88ŽhJ4* AHSvΤ ½ ΊΌ@D¨—,Fσ+!¬Iί›*Šv?†ks‡Ι4΅"'§~˜ΒsΎώι’όΚ§ 2ηNg5 ήό·ΐUΏ ψ‰]ΐ›Έ0n@€tρ6X0θίπO` p ”ΐRΓ’θΧ«ψφρd7 ΦkO³αΙnωΏO\“ς;¦ F)ώΞοwh―α+―P)^,ΈCtϋ 6φCͺΚkš5P*i$HNIΜ9‡pf* eL΄Ϋd§;Η"Ό|›+ΖI‹‹ΪTεΦAHσJο ¨€rν~‚7q؎(η Zœ±εΪ< ΦTK΄&ώ4ίq؊°s‘œ7P-™pšβŒίωHΰΈ³«ΰ.ΝΑI„§{g7Θρο8ιΕ8ι2€p‘nΑάϊ7MΒ`Δ›ψΈ₯²σμΛΖY,7lτTgΰφ’‹œ+FOv}tΥο…QΚ"LžIι*0T*“½a‚‡Ϋ>ž[ρ²6x»ΟŽ©vCn3Ÿ~Dφ%~ΐ,)O?ŸΓlΥ”a(©;L$ΆKΙΝ9—«Π'{jEl.6ςx/Θ€§œ0ή iΘΜ”ešHΗ2^„•όœƒΌΗ|«cσ0`Π—d„rΑ¦AS΅7BjχΜUefφ& ‚μρό=œtGτφΣ λΖΏ|ΫΓκΌƒœK0 p]†pwΣ§'{>^ΎCΞas™ύγˁQ9W`felˆ J±u…"ΐκmΫG!Jyξ¬ΜρDX¨[0 ^ψRo=ρΡκ&0”jή΄‘}Œ2ž­Z˜―σ’Ε2Σlη6‚Ϋ΅ΣDKκZ™΅!H¬ΥSmv”ލ©€e~Œξ ‘NŸ«½4•hTM9W·2₯?Lis?D”’?JQ-¨•,΅’g½ωί[ρP)œϊ X ― αi)βV/fλc%Λϊ`ΛG»_ŠςομX_p3lˆ”ΐΞQ€½s\ω$•Ω¨hRδ!Mƒ(•Z­€θΩΎωΉΆΝcOίΛ‘R‹rž#€eY¦€c‘c”NK?γx²ησfuξZsl„”*€$a—ΎΗ»>’TfφΗΟ w| F Κ6 κ Σ쐂t“ΰΒηΤs_x)'=[H­p8MΕ<¦@[!ήzβΣΣ½Ν*‘ύQBA(εΪ‚ ηšΞ›’AΏς…uΗ±τΓDΈMƈτ6¬Ξ9YG$η μ…88‰+§ΑP‰ϋΨ«jN›Ό8Ήρ΅*ε ωςOξEτ£G#ςΓλ f™&Α²υ? Ncž#°Ψ°1_³` ΒƒΝ€žξΈΏζ’Q1e¬ `.…&QωΖC‡!·Έ6;Œυ†,€ςγmνJQ‰ΥLњχC‰œcΐ1OUήύP^™‘*Υ4Έ-Œ$žμω$τς휜Ÿ±Π¨˜ΆΈmzΤbξ4; F¨δYa-§@lΩ±+ρ•{ΛΚiΚ-ϊΌg R00W΅q¬Œn.ΌV@6Β€Τη—ςwLΈΞϋ'je‹mo%WδΫ‡α3›M’re7iΐόqξ(4ͺŠžbN 3dήc—?¦‹‘ΦΓ'!Hf€Kyζγ₯ώH‘;=RD³J ωɞπ~ Vf5ΐ‘ŸžqAΤγ€(–,?]0π܊‹νΓΕ<γIΊΓδΜ΅6•Mςea$ ƒΞŒ.&= ΐMθΑ–·Ÿϊ΄«L—τΘd€XŸw¦ QeGkv‡kŸb,$δ₯y6š|mm›πΗΎT–† 9ήM9Ώ‘«SΰgγΟΗΠOζjμφψdχtΰΪ5ΥΡ8ιΖ8Ÿπ¦)›*…±ΔΊζΉ»μΒPΎZΉ/ΣΐxŸ³ψσΟ § Α ΑN3Β·~Ψ£ύVΉtΦ,ͺ?LπήΦK36βΔFKΊ³δΘjizζΝψ—›#ϊγ„ύ2‚Xbη(DoΘέ€jΡΔlΥBΑcγ"?d# =Šι 'Kμs7Dΰ³χσς /ζQΜ 9ε;―ηύίπ―€Soβ#7,€^tό·`¬W§ύΕjΡΐϊ‚«UΡθ2:Πx0νaOΊ1ζk6Φζx `ΕZτ§Ά€ύaŠΗ»…«σ‘€Tr΅9IŽT·ΒW•?ΐΥμΣύΫ‡ŠBwΑοΫα+―εLٜΈH lFbλ ΔΓm±BΡ¬7iT‘¦|Œ•‚™Ν«ϋ#FΪo†tg‰7•oύ°O'έ„ρœΎ˜3ψœˆpά‰‘€ΘlhKy#“Φb5‘’λyΆα€wVdF‚wχVΈsΕ›ϋAζ©nY¬%pΡ¦-Α‹υe—₯[Υœs „‘Μ”ρŸ/ηMznΥΕ$ ›V<γa€Σ±Ξ )AίoHέA’]SΣ`ˆ4³Κοbγ Μ€~η£?JΖΕΌ Ϋβγω)Ά‚3cΉš…nΉςύ"ψƒlτh; ΓVL{͘žμςχ\H±S‚;ΪςΩu t ±χ‡’fθ§τΞ†OίψvWόψρˆΖY8~$ΡRΟHΞ5ΰ*/ΫbiaΣ τ—σωΗξ g,ω+_,ΛΟήΟ_gd!ΐ>ΐ? ΰχ?ψrfάt>š‘q?πoƒ5€I m ΤΚ†ό•/–°Τ°π­7ϊtά‰―|Ή=‡Ϋο‚ΐΏsڎί:qάε™φx vθ§ψφh©Αt½4εΚλͺRŠΤ+&VηNεR₯d@ΪώρΥ•l­dbnMά`΄ Ρ»›>ήΫ!Œ$,“εKu΅sΥ@‚“œΓ‚ζη0₯0 ¨.…ΔώI”i%)W£υ²…‚'χlvoΩΝ6ύ»Ν0ϋά(–8Tn~傁bΞ<ΣΞΆMΒνE56Ψ> ±}"ˆ%wrLΫm>«}o*E=mΈ΄q Z4Q+±ΏAw£N%pΰ'HvΎϋ06ςχ†Α–Οοmω0Siύ¬ΤΛ :Γδ ϋα’8lqRuo…;ΆΕΕ‡'Ρ©”‘娧έζB‰Ϋ>}ον6#άZ`9θ$•Sm©d–ΗR$wBJS`©a.Πβ:JμGΤ$Œ$mμΨ9 /μœΕ‰Μ€€Zͺx¦tšHΫ–Έςέ³-Β+wrψΚ+ΤJŒ»ΈΖζίπWό%άπϋ?’q“|΄γ`εΐΐ|Ώ&ŽLƒπΪs9Ή0cγ[oτθ Ÿm@/RεΣ € δ\eΫŠx£S>ρΡΣƁ(‘*  μf°ΛΩRC‹ϊpΒq:SΌ:Vζl<1hD<٠蝍›4΅1Jα:,izιuWά·Ykž?uό5W>MίωA,SP8ζΟ‘π~ΘΰΑΕ:k”τΌΟbL珸cΎž"ο2²;ˆ5ΐkσκe¦ν4Cμ4ƒL‘Υ‹Q/›μp NΔJ3e ξ³β]”’ΰ1+`yΦΑƒνQV +FβDJ\ ‰ϋΓ C@μΈI~:’ |ΐ_{ S$ŽIς³χsXžε‘ΐ»>R ,Φ-,Ν:™Z«γρŽApqΥ>ΘdAγDfδxΤΛ&Φηΐ–*ϋΡ§{ˆ€₯op“f•‚…™)ΪΔ࿝ΓπΜG&©D₯ δ=ρŒπ‰ƒο-»(δ¨·}ΘξϊD\‹0&W›ΪO·ψ7Ψόυw7Ϋ1»5Ϊ„™Š‰rl`YΙ΅#%‰{ϊ ¬{Οβ@s5 s5 ΝN„Α(EΑcŠ™₯D‚žξŸEΠο³ωMΉ``eΦFo˜p—‡€zΙϊΠμ•Ο8ζ;ί4₯R"M!“θŠΙ£“œ!N΄'αG,vtoΩE₯ΘIδ0H3TύU!ί[AΐI?ΑΦaΐόψ‚΅y»β]υ F±€7ŽπγΗCμ5#Χ³?δω½›έ^r3Ešb:d½<5αΡΟj₯`ΚjɐQ,Ρ¦ΤlΕτt/ =’?L!Δ) PwΟt`ͺ€C‰O‚pwΩeΠo…ι‚Oχπ₯— ς…uχ:τ>€7cΈνίϊ ΟΡMόδγ&ψι ΰο€;ΐ? ‡I#υ―Ήš%ύ«ά^a·‘kΩB’Jž—όkNΙΖ`άV]kωG1‹Ωμ6CΔ1/φΩηL8φε†-5fΰΚγ°{ΡIχΩΉπ`”BV9a1 B8Ζ-―Μ eΟσ;GŠž8±αXlΰ3πΣ+•ιςžΐ|ΝΞZΕ½a‚½γπΚΔ…ΐ³χV—9ώ uNŠ΄7ΐΥΝ8΅I μ‡ "tζͺ6Ά"ζόη=‘)ŒgψžYoΘ{ ž…Ov}” άI8ΟΉŸt½Ο˜ι„‘€(–#)~BύaŠ0’(ζ €)(ŒS„‘€Α(Ε[O†)rΟΏ˜ΗgžΟΙBN@d¬‡Qβ q· \ΥΟVLμŸDW£cq…+ΑχCγ9ξ.q2±:η`Ύ~ωΘξŽ ~ϋ]κ ΞnΎΏ3A”βΞ’Η*ƒͺRΎΦuTΥΏ~PvŽ"zύ­6φ2ˆP-Y°-ϋ«ž*Š,ԏkώ>[k4oF³>„`…ΚbΞΐΧ?]Δ¬%Λγ:UΏώ¬cςί`štΈI~ϊβ X=π;`υΐۘr$`™$_{.‡ηΧRΉ±n3"··GSzΒλ b?q€€zΑΘΉ\…Ξ¨6x”bcΟΗqχϊc@Σ€²Ίάώ—‚0E1/Π€Y{|Υ’u,Η"NjΚGΛγnμΨ?αYύ(L„),%:s™Σ\&ς£xώzΡt¬SΙά«B"Υ·]Iξψ—Yx'A³aqΖF£jΒ±ΰ¦19Χ1†ΰ°ΕΏ7W΅Π&<f¦©–|)aRJΔ©DoΠζA(;ύΓ ΑΘ—4 SψAJq"ΩΤGJ¬Ξ;Xn8Ω±l…hvbΥ=Iρ­φθΦ’s:—Ž΅\―ͺδEφ±].Ώ/yOΐΆε@?Εƒmw–X )ο]N½S#Ε’Δ%π‘v?Α»›#ά]vQΚρg• Ž;t‘ΌσEχdœ»α›―w(I5v†ηφšQΒ ΩIΚϊ:αΊω>Eh-‰Q@‚ež[u₯Β\·κ‚5Lώ §ώΝ›ψHΔMπΣ>Ψ:σ»` Ν―°0Eζ­ωΌχV\Y)Ψ=Šι°qU|0ΥΖ«*žjΡ„^ΐSΙνν§ϋώ₯Ύτ“޳”3°<;Ήύ―ώε۞\™΅±ΣŒπt7 ­Γν^‚‘Ο¦AΩΨb¦bαΆ!ςƒχϋ #Ž%z£Ε›χ=#v$qͺπW.H έQ.(‡Όœf;žΨU‰†‚ …Ψ &"άΣ”©—υ’Χp*Œo88‰°{^ώ{’gί•·}o/Ή° NΫύD,ΜXŸ‘$•τx' “. G=Ωσ±uyКVZΤ±s’œ7³D)Vύή{Γo=‘η 9~Σ›i™œΐΨc3n/Ί}υ’η³θ±C$1 N―η0ΰ±Βν%w–τͺφy₯t•>‚μ…(¬zhΡ4vž΅†Ύμ3Ξ " β‘ΐΦa€QΘΒAΪk!ηˆ3n‰¦I0AbrΒ‘ΓSl…xυ^NΎtΛE1Ύͺώ‡ΰΡδaŸŸΚΈI~Ίγ{ώ'ώil/ξ―9 ².OΒι(}¦2ΦΡQ+™0„‡G;>z£ΙͺWmΎΝv?Hqk‘E}”EΆnγŠΕs•ψχ˜αξ²#ΏτrA.ΟΪ—bž"€ΐo€ρHߟϊ7oβ#7 ΐO΄ό›~¬΄υ ΰ—tͺn€c’|ρ–‡jΡΔ·ίμΣ»›ώύea‚‘:33³)6φ΅£Œσ~Πβ,+sΆόάύ<¦5?'…–•’jΡΐ λ cIƒaЙЁή0₯0’θτc<Ψφ/B鍒L]-οθNqΜΣη9Mν£›,ςΣM9Ο’+±ζΌ―/Έ¨•L“0MB£b±aΡ„σ6 ʐηDŒuπΓιΊ-ΗέK 9—#V­“rπ`ͺ•CΥψΡdO ¨—”Ž?ΝΜhοϊlml άYtρξζ(“`–\›ΰ9ά‰κτ8σ8‘Ϋΰ)t©Œ‘¦SυΔ-ε¨ι)Ϊύ„JŠψᎏΞ`Š$ΰŠΏλ Ό·ι³ sΕB£beTWœSΌπ³Υ‡ΟΥ,|αΕΌ|ρ–']›ΓλΧUδχWΑ<›ψ)ŽιάUnβ§!ώ€1ˆ³Ύ·χ ^—f-ω|­"ύkΉ2k_‰*ΦsXSUsάj%΄{1ήΩe,ο'LAψΚ+ωλ_­Θٚy­Ν’γΤΨΫ$Y+ς…uWΎφœ'_ΊνΚΉΊ%Ω>UaΖC"Ζψa CΰŒB›ipa¦Βγ‰έfˆΝƒ0ϋύv=\[drΚηƒXn0'`€½γμ{s‰£…;S9„δLΑ›cšύ"λՊ&‚0=Γ8Έ*l“ιsž#°:οdΟΒeaœΨΕbКύΕΌυyΦΏ―΅΄Ž«ΗJŽΚξwΩ,(ορ(ΓsEzΝ{l‹¨η•uΥ‘ΈόœΓhr€ˆΝͺ8©`ζΣ½a$³ΩύLωκZ‹GςΚοЌˆ}ξςXκpευΧJ_~₯ ‡ΏX“Ÿ~>'‹#ί-ΐ\ώίπEΚn6AάHΌbNώΐ2€u¦δv ΑϊλχV\ΈŽ@«“œΞiuhΪΨL…7/)ƒVΔ3Ο)˜ΆΕΆΈ‚ΝN|†}@” &εy~K†A0¦α%^# Aπ\… χΧ=ά]rΡ¨ςρD #ΨS•<”rf¦\ΨμΔΔ*{±Ώβι^Ρ Iρ³k ‘ΕςBΞϊlΥΒΪΌΓ œtc<Ωσα‡)κe ŽΝW§ρΖ%%WΣ·\˜‚Π&™η=@Wrδ%XόιΞ’—k„ }¬tkΑΉR0IŸco“έ€K η ΄^~Ό΅’‰Ε¬θ§©hεΌ Οeπœ–›?ΨFΕb†‚R΄Σ6Δϊ’Κ„‰εm;–Ύ]lΨ(嘽‘Ο‡ΐύ5/sYΌθ<ντd/ΌR‚ΐ˜’RŽ»D‡­½a‚ ’(ζψ9¨LΔ‰δ.X86Ώ B³]ωώθ‘Ho˜ %ςJ&™ˆοcwœQνLU’~ΝΓ―|±$_}.'sΈNrNΰΝ ςϋsLύΫ7ρ‘›ΰγOόm°ŸΐσΚΧωeΗ&¬ΜΩΈ΅ΰ€ˆΠξ'€©sŒ°±>ο(`λ0ΐζ~Ug“ΒΆζυ’׎Ο,zυ²…RΞD·ŸΠΑIL6}κi*‰Xc‚{ΫuΓ4xVΌNΗθψαΕχB°:Η*ƒ‘:'DŽ-0[cpΰU!8κΔψέ7ϊδ9,}μΉl*sΡχXŸwQΜρΟlHήΐ][ ΰ±ζΏJ¦[κί3+s @§Ÿ`―=“ΙF ₯vqƒψψFΐl,τ§ό16¦Δΐ\έ’μKeά_sρϊ[Ϊ> 1_³±0s*%D)φOΒ‰²¬γqVζ΄r^œ±±2Λ€Έaβ‰BζA”rζglά_sε­EžC0 ’„ιόΩ§9_Σ ΜΥL9_3ρκ]ν~‚γN¬[θξ2oΊDL?{²ηŸ™YK ΜT-ό#_«Θƒ“ˆZ½”[؊ bΦΐϊ<ƒ%ƒνk‡cRΓGν3e”σ&[g} VfνLfxSYΌJDhT-Φ¨Ωθ GΟljΊŸ­Z€~Ψ?aΖΐ—7!hͺ«i κmΘ{\}―Ξ9xםρ——Θη ” JΒ·#R²Τ‘ςHЌ‰΅y~˜rηƒΟ¦ŒQ2ήώ?N;͎MX¨Ϋ?η$ Θyρ —KKπ(Αœ@CeJ,ΞωŸcΓ&¦ζ=ΆR6aη(ΐ5΄ŸύNp"α‡œ`ΐœ’ nυbΌ°ξΚOέΝΙ‚'3ηΧM`½‘ΏFψwί‘ήΔG9n€wH08πŸπOψη<§ώnͺD€Έ³δΘ₯†έf„v/A§ŸP’ΚLb5M―Ω‘ΧKŒwΣ |ζωœ\˜±πξ&CŠ9•‚‰γNœiΡλΝϋɞN?>3ώθτG)*6ϋ9ξFgάλf«ζͺv6viv’Lͺφ¨qu_2±οΟ€-“2q¦Αˆ™:ι¨—MΤK&βx²°ξB86wvŽBάZ`^ύ|έΖΦapz«-ΞV¨υf'ΚΐκŒΠgyZκ__pρξΖ~(Q)˜°•T»9Ι=Mύ¦Βh\DKτFΙ₯'2VΒe±Τ°±:ο`λ ΌA€’αQœ>ΖoυcΌ³9Κ#«σ Ψά>ξr’"Σ™ΠXˆΧžΛΙFΕDήR3+¦ }Kzΰj/‚εΗoβc7#€OF`α ίλάΰNϋΛjCD­d ^α–γΠOIJΆX=Έ&θΟΥmO'½sU;Ϋό»ƒΆ|t‡gQΣμ„FΘ»Υ’‰Ÿβ;o荇#zΊ ;HH‚Θ2‰2a”!4H’™΅’)U‹36J9ή=RΙvΐ_|© ?χB^މίώA€δω4hu,5lΜ)­Γ{ΗΟςυΙ€ΉJΡ„eΪ}žχ‚ˆxgΙ…c³=ξγ]Irzœ‘²vΈ―έ?Ϋϊ^˜±±P·‘J`cίG»Ο B’*άBΙD­l’˜ΏΪ—žq ·žŒh€ϊl‚”χ δ\ύ±Q€ksΗΓ2 G­ˆ;η>+9‰¬x^nBo”`yΦAήhχ“ ―Υ™λ–ςl<εΠO±w|ρ³)ΑΧωε;Μ€ΉμρumAυ²‰FΥΒn3’θS-Σ$ΜΧl˜α¨gl„μΑuo˜ΐsςŽ@1gΒPBQ3 tΝp°ΚΤWWΞΧ-ιΨמ‘ι·εΫΰnα_°wέΉ‰ŸΎΈι|²βm°^ΐίπΟψ ¦pΤ‘muΧlΉP7q؊ρΖΓ„4‡ωΊ³yaΉagϋ“n žjΐδŸ­…zΪ½σuZΡΔξQˆFΥBMΩο…gFc—­3ξΜV­¬]j8™δρΞα³€M­¨ηο“.) σA@”Ιo†™Δξ|ΝΖήqˆzΩTΤΏ„»:—άΫTΫςŽ@΅df,‹0–Ο²&„FΛ;αΦ’‹(=S•ΠX ΟT›F΅{ ΅c F)ͺ% Kδ,«@j)^ή|―’Qj큇Ϋ#€E£be “iή½ρ{ΆΐeŸy>'Wfmi™ΧβσλC!0΅οί3‡nβ7 ΐ'7Žΐ2ž άψ¨` %AŒύ@₯hȟy΅€oΉxσρ?z4š˜°h e*™Ώ±°jΰU‹ Κζ‚+/Ž α(^Œ‡Ϋ>FaŠο½;€JΡ ϋkž|ρ–'KyΫd)ΚόΕ ŒFaJϋl Ϋ&ΠΤ«QftΏ«NS;'6*L‘[Qs}‘ψο—΅Γ ŒŠ?ξΔXjΨ¨—Mμ 8–@CuNB₯‘gwθ§Ψ= ρ©»ήdU?AgLNβ*EΖ.,ΜX0 ζŸ'κ|’ χ7ˆΨ>ΩSψ­v8ς“©»K=7ΑΖSw–X(h4vέ%ψΨ‹cΒΓD@KΪkΕx{c„χ6|)n«ΔfmΞA*ύ1—GΛΧς•ΰzeΞΙ|φ>™‚E@@¦˜’,¬Μςζ/8ξΖxΈγÏLSύ¨#MG$ˆΘ2 έaŒFΕΒΚƒΖ,σƒ3 ˆ€£VΜϊΰσΈΐΝn“+μi”φ4°\0°PgΉV?LO₯+ξΗa+B£ΒΛ f˜ ψ·w=RΛ~ΐQ'¦ ’πlΊ2/rg±gFΆΘlϋ£νώdOν°₯: b“Jrzς!uL‚€žŸΰ€gr·<Ψ>em0?ή•#€φ,ˆbIν^"Ώξ~όxx†³hΗΟ ŸΦ瀩ār#Τ#ΔNqœΰΞΖ£Άζž―±s£b‘έO²QŸ2Ϋ (?ΐϊύΐ_ †έΔ'8n€›x,π›~ΐΐ?ΰUL)) œMΎώZŸΊ“Γ›OFψργ5ΫΜƒ/ε ά[q³ΆgKμŸDSλθοΡ˜‘τΧ—g™A WΘw|ψηœτH-ΠI*!#ΰρN€?x{@Οΐ|έΒ­E+sΆœ)³³ΩυFΐζ~˜Ήψ-5l˜½€"J$Ž;λΩ+ ήφaˆώ]yݎ?ξΖX¨[ΨR{Œθ>θB§πγΚ“'ΑXΛ%τwο6™ χνγN4ΡqόώκƒaΪ’…ωZ‚f8ρw ƒωπPη±}ΐ„₯Y3Ku|Δ °Φ°εgξη%œtΪk†BP§ŸΠΫ#τFιyέΑ(ΕΓΟ©ηχφ’ΛLŒ“SšfœH6ŒšβYV φš!f”d΅hβή²‹‡ΫŒƒαξ…ƒWοmυ_sγΧνώ#%€ΐ[Χϊ„›ψΨΖMpγΡπψ˜:ψ?pWύέ΅jɐ_ϋT―άρπ[>•σ,U›¦Θ6‡4nΑ<ύ|™iί;aiΦΑΚάΏ½3ύ‘,ΝΞϊο½{μ[ξY•UΥΥUέΣξφŒΛ‹AƒΑ2Ν@‚oπ !ώΎ ΑbσΠ  ƒ166 {Ϋ03Ζ3νž^jΝΚ¬ά—Xξϊςαά{#"+—Θ¬κκξχ‘’2+"ξ{o^Ε9ο9Οy™ (H„£θy&΅RΒĎbM5 ύBUνpςΡγ‘ͺWmuοnMί\nCΰ+Ϛ™DFZέ*+Ψ­Μye/Ω²„εώt;šν \KI<Σξ88JΨά‹gΨP‚ύζnDO*(„XΈ}\x©GQVŽ7^„Z ώ'ϋή›ΉKa»!‰^˜ΝΜ ±-h7d―σsΏΆΰs?BF‚/οΛmπ₯…I NΓ#DDθΧ€Ώό5`1νR‰@«nλŸ§Ζ{·+§¬o%κΙVD-°gΩΝσϋeΌ0]μΈΉͺ¨τ}όdTΎOCœκ²xjŠA―΄k6IͺΥ§λ{G ‡ύ„ΥOέZφυbΧΥ΅Šτ₯O« ϊτ»1šΝ­};€ R–{^)˜ΣŸΑ"ΦsΛ=·\…ΪΦ¬ρ±1Π0Μπ\±)~ΊqΪΫΙν’DΣf,΄/¨ζ ΐI¨Ι~Ά”Άaς_Α 9γ±τrL-°Kά?žΝŸΠPρm\Wdq‘ά¦Iͺyπ4$p-Ϊ ›λ "6΄sπkߊS ΐ·–%‰Œ²³ š rŸέΉ”IΓρ0ΝE€τΜ^ Ε΅ISρFπ=‹zΕβΖ²―»Ž.§τΥ„Θ‚$‘7}~ƒη`ƒσπcΰo!₯ΓΏ όE`Žω0ΡΗτ,]ιYt›‹=‡ƒ£Tmξ%yOφB­‘2+”D±£AΚGO†ΞPg™”hW$»/΄]/Š©ΝξaΒ‡†Œ"ΝƒˆχάWσm—ŸϋZΥyWΧ Ο³”cM“ vέ•€Š/ŒϋϋOεΉωΆ‹οŠ©¦|τX8_H–(Κ{yχM¦5Γ(γ֊―o_σiΥm]ώKΆŽŠΐ#šΏό:βj`p*L`p2D δίEΖΏΓ%&(ή$ζ$zuήeΉη²2Ÿ’΅ζƒ29f³Ωšϊψ )ΛώδΡhΚPθΌm‡‘lμδžY&ςΈ7W\G΄ω?YΖzjΌp};Rόΐ樟©(ΙŒRΦ–|Vη]ΪuGgZ«G›‘ZΙϊ „½£ΗVŒ’Œf Έ΅ŸyΡ4ΠΫ,3ϋG ΎkQ Dΰ<£ŸΆ­X™σπ\U*-.v]Άβ3ηΤ $©}ύF?o₯0^•[–γ«ι4‘€ΥyΓγδάκ‡eA«.Σ…Ž~(ΦΚ+s‹£AZ’ο¦·UT»”ȝ βJ‰΅σ€βΰ­ε€…Ά%ΑΕωΟΒδί=7ΒΫ«Θs±£_q‚TOΦ=ή½]Ρ7—ύιQ«ώψ>Bπϋwΐ³KνΕΰ+ “̊))~ψ€"πΛ@3}f |UͺΫ ›_όΩχήͺςρ“}:TλΫ‘(ίqzU Σp¨ζγg…°ΚΡ`Ά11­Ε―]3žέ|Ε­eί• ύιΣύασΙ„Ξ?/Ν4£Pσ‡ωΑOͺYwXwΥ\ΛΡI"+w₯rύ TI*Ξ~ͺM½*eκ³Hqž£X[γŒ2>y²Πu©νΊΜχ’μάsμ6EΦW< šU1Ϋι4œ)ΪYΫ‡ρΕμΗBˆζνίp@’jβD—Ξw ΓΗ)oί¨P ,V|>z<<3ΐyN^ώGŽ;Ie>ορ3™,hΥmΦ}£lJζXηΧ­–ΫFYΙ3) dκΑfΘΛ>­ά†ψ£'#,%S©œ5%q[ϋ1–oδɣ爰ΠI!«b΅o[ς·Ήs=ΠοάΣ)ΟQWE όό3ΰίλ—ή“ΑWF Ψΰ²HObΡϋΘΘΰ PΉκ+ΎΕκœΛέ΅ Χ<\G©Q”‰DμD{ ΣpD 7/gο&<ݎ.E"¬½¦Έ―υ‡)k‹>­Ί8γ}ς$<»Δž ΎΜ΅\,K”σ†‘fflξ&μ€jmΡ§’λγόdD”θrœΛΆ₯ξΨΒW8‹«°:ο³Τ­ϋr< R―žkΡΚxΰYAάsΕo –»σ}όxD­"–%퍳‚– ?}»ΚB>=p,Kq}ΑΣwΧ}sΩgc'VŠΝ\Ϋ%΍Šϋ)kΡ¬ŠJΰp€O­Φh-•εžG–IωΏΈFIͺŝΊKΰ[xŽή”+u-3ύ‹Ή­ο“νθΜλΫ¦XVα(mŠ0ΚXμΊΨ–βιφεδx£¬”0vlUZ'eψ7–<ΎυnCΒ½?u«’Ϋu₯ΤU©γιœ šύισ]~w_e˜ €ΑU1@$…©όuΰϝόυKU4xJΏyΝη抯χυΡγŽXߎ”οJοΆθkCžΜPͺžD”hLtΰo.ϋΤͺyΈ²΅>Λ>Œ4qͺρEΕ³8@V‘ž«Έ΅2-Σ;€rR^‹*`³f³wB§_khΥmVςφAΜΦήXeοx˜Ρ©Ϋt[[ϋρ©ej Μ΅Δ—>Ν„ψw<“ fέ¦Y“ΗYIN»aσΞΝ o¬ϊεsgΒ‚œ¦ͺ^’aΕεB+'Λυ‡)Q.lΧmU±]>$ΟU@”ΚΛ₯ 1i’tp,c}·–ΊMρbxΈ96ͺU$‡‘– Ι9ΗύψYDΥ·™kΛ~OΆΥšsϋ§οpš€ΧmŠXΠƒ¦AυΫ7*,ΝΉž*ΛόWΠ›(ξφ όψ·ˆŒ―Α•`ƒΕψΟH{ΰO £ƒίζσΧgOΘέΕάDχZίΈSεΙVΔΞAŠΦ(1ΗΙhζκ3jΔ””·“Lη%c™DΨά‰.4›QJ¬Γ(Γw…䦔θΥ9™χŸμϋŸ,?‡qΖρ0₯š'Ά₯¦Dc\Gq}AD{FQΖ£Ν¨ΤGˆSΝξaL»fΣ¬‰:ΰizg±<'’A»‡ ;bAΌs³q hΤlR ;ΉφƒRRVό,*gθ—{6Β©ΟwΕKAζΦϊ Ρ)\…˜F~«σžθΘ΅.HύQJŸ/*§βΔθΉš5»Tγ‹=ee<+LΪi&BWοΌQαήΫU½ΨuiΦl]Œ‚^Qqr’Υˆ€Οΐ˜υΌ˜ΐΰea„T~ψYDGΰ/ΧςΧg& ΒψΛs·W}}kΒXλ§Ϋ‘ΪάM”B.cD€1·,Σ(€όΊ}σ`3,-wΟCšΙκ²U“Ρ4₯dΕ·|Jί$²LΤύζZ.΅ΐ&πύΡ8P-t\I"rMώγ‰0’IO4/‰K§. ΐI,u]jE’hžlΗώ’X³s˜P―  ~ŠU0ˆIΠƒάΗΰΣυPmξΖ ΒL…QF―ι°Άθ§š ΩήOΚUΆΚys5ΐ±…»°ίŸ^ΑοΖl8,v]–Ί{GIΙΒΧΉΜmΕ·H΅\§Σώ¦I&m…Z`S«X¬-ϊτGI’K 0Κ.Ε+d?}ςφZί9£(–*ΝeE©6vbln―ϊ抧λUǚdϊΟzΧO‘Pξλ#Ό›ο"·­+νΝΐΰ˜ΐΰe#B7πΏΌ…|©]*€ρ¨˜»ψϊΖ’―GQ¦z-›8ΝΤγgύaF‘)t^ΩΊθΥ’ ?HΉ4,{υG&εψ…Ž‹ηZ΄κ7–„v<Μx΄ž«j(β4ΟΕΊώ0C+¨Β’/Vξ'Yξβ$'zs-‡NΓαιN\: Τƒ±αΠΞa2%½«ΒΪbΧ%π,ζZb4 ΗVΔ‰§όΡ§ƒ©λ2 3Zu‡fΝfuΞγ°?Ν΄χέ1ωoο(!>Y•―ΑΈςQρ…eο:B,ΈΦΠn8\[πPJ‰R^?-ξ”‚$₯D6π,rδrίk‰`š‰ΐI^!}«΄ί&Œ2ކΆ Χζ}jΕώqΚζ9ν…˜*ΥΐΒwυŠC¦5λΫΡΤΉ_„α(ˏΗΒ±-©ΤœHŽτDΊΠuυ»oTωφΧ|λ½:o―ΊΫtJ3 +’ φ<ώπ·Ÿαχk`p.Lΐΰσΐΰοψ3ΐ_Eˆƒ½όυKW ]ΗV,v]½Τuω™»Uvύp#RŸ¬‡jc'ζx(’°ž«ΈΉδ—*sNnβ2σj-_‰Η‰ΞƒŽ”Χ·E9𒐀š£AJ«&ΗV΄s-a―?έ9έ©―ψμƒγ„Qn/άi8e©ΌQ³™ΟϋΨΟφcŽOID2-U€ωΆKΕMΗ[‘DKZŽ-†A;‡ΟŸ‹B4ύ;n©S°{˜§+o³-8:ΞΞΛάά‹ι4Ί ‡•yŸ½cα2#|‡ύ”‹δτ "_£*€Ζ^ΛΕϊ‘ΎTπ—+,*Χζ=aΖ³|\χ½–ΓΝ%_ίZρYκΉΊX₯Tρ ΊIA?ώπ«ˆUχ‡Θ΄Αg “|žΨFΎδ~Έόe„'πγ{qf`β‹ΨuK=—εž«ζ­ͺή;LΥϊvΔ'λ‘Ž2:M'7l‘ΥœοΙh\6#ρ«XΕ&©$…*ά”?όΗy4WΜΛ_›χ°m |O/XωŽ"™―ζ ΐ“­ˆ4Σ¬ΜyψbflμDd<@ ΕΔƒ~Κ|ΛaΎνςlOLz97$IΟΠˆbΝӝˆFU”ωΊ-‡˜j`Ρͺ9h(“‚³bp ?‘Q±©+=—γa†η wᰟ0Λ ~αŒψΦZΧχπγδr·mΙ8£ψRHByηZ@―e³ΨqυeŸ…ŽCşφ„xΧΘΙ2.π?ωύ†qη3ψœaƒWBό]€Μωˈ αΟ!mΈBUΖΙ€c+ΊŽ^μ:ΌχfU|εCΝΦ^Μζn’G‰QNaΦ3γͺΡ*μγ•Œ>Ψ…u>ΛφωH_k\GqcIFEφ6$Ό€½že_Ÿo»T‹ZΕB!+ΤΒx0:[i/Mak/¦ΣψVMF …Σ ύχνƒ³ν‚ ν…Γ~B§α°œW:u/7Ϊ;:?€κ†ΟφcQχλz΄’ Λ’ώώy^§νg};βΖ’Œ-†‰ž]Š7ΏO’T’­=:« žξ4l|O•ΡΕ{_Δ*šιΥώ'Hόο…M£ΣoπJ`ƒWO‚τ=ο!‰ΐŸn3Ύ?_(°ΊU·iΥa‘γpχ†Φa˜±{˜ͺ0ΞΤϊ–”ή£xμΜvZRΐrΟ-Η“TF³³Ζ’4 Γίqlο'2›Ρφ ϊβ_ „ΜηΉJJχ£ŒΝ½ψάΕ³R"`ΤJbΎγ0 SΊωκχ097©€lμΖ4sgΗŎK;Ÿύ?¦ F«2fZΪ&Όχξ:r=ι…RΕ'Ύ»‡ «σ­d:£rϊˆdq/8T«6s-‡ΥyO―Ξ»Ei_ΉΞxVr›+br΅Ώ…hτ*Bξ{Δ οήΐΰΕ`ƒΧ‡Ϋωw€λΐ/ ψ“ˆ¦@AΌ—ζ€xη(|Χ¦Y·υυ%OR΅{˜πh3bsW*ΗÐyϊVΝamQ”κβDͺ#1θ'§ ΊM‡λ‹~Ι£ΨΙύ.dΰ#cxλΫ·–ƒ“α ?ƒŽ­ςͺ T<ΡΧπᨔ ψ•ŠE·ιθ₯Λ΅Ήv톍η(­Ζγ€IωΟ‚Ι ?D ΅~ ψ D²Χ¬φ ^˜ΐΰuƒψΧΐOϊi 1ρΎ+]_τ–Λβv],|Ε 'Σ[ϋ ;±ΪΨ‰ΥΦ~L˜1ί’\’jlKαXŠŠoΡΞn_˜Ÿl?ΎpΥ=‰LKι{‘땆FΗΓ”­½Ωmήw–{™ŒΆέRiοh8›§B’h6vbZuGŽΕGΙΜΧ€e1ΧriΥmβTΔ„.‹ZΕλAέ¦Λr/εpnΨ¬ΜyzΎγ°:ηιz՚r,I|—Ψ“˜ ϊ)2ρςΫHΠ2 c`πΪΑ$―3†ˆίΐϋΐ?D8ί~Ρ(ό^8(6Ά-E«nΣΫάΉξλ8Ρzj΅s03’D«g{2c_hΏgZ„…ΞΣ (²β[Μ΅œR<'Ντ₯V½…'ύ(Μ¨Udlmc'fΟ–Dct{G +s^™lνΗ€ιŒ‚Jyύ ―€$ΓhφDr(£…›8žΤ'8νoUώΜ‰OΆ#;.½–C―eλwnϊΈ’^•~‘ πrΚϊ“—²8έ x‚ϋίBˆ}χ1L~ƒΧ&0ψ’`ψ/ωcψ&RψΣ_ šΏο…’˜Z‚zUιFΥ+V:N΄ cM’hZ ‹…ŽΓΦ~’ŽbςΕΣ–²Eb`)XξybB“?ί¨Ϊε vVdΩX³>г™,‚Ožίφ~ΒBΫΕqΗƒτ9ω⋐€’.Ψi8₯Lr6Cω“Rζν₯ΗΞARŽNkEžpωbϋ;Χrθ6m=ŸώFΥ¦SΏΛΕ5Eερ(Θ|βΌχϋΘ=ω;Θψ^|Εύ|ξ0 €Α›‹ϊ?KΐΟ#ΔΑow™N&^ 'W£΄ηJ”ι4+Όw»Β(ΜcΝ΁HάξI afτ‡ƒ0Γ±Eο>ΣΗΎgQυE˜η’ €ΙciΧκ«δ!žΕ`4{βδΡΩε/PΑ₯(>²]wπάhfŸΦ"ͺδ:’ΰ—iQH\žσ­plE½jx’Y°Ψqu½*-‹Z`δ,ύΙσ™Lά^"Nτ"ΜύŠύ©ƒ/L`πE†FLQ~1H™G& ~ ψπ2VhMΌ₯„‡“+φŠoιJ† ͺ\₯λ4EτΣΖ·?ӜþV/ύλVΝaϋ &›ΰ NΔσό…ց»Χ9–ˆ ]¦  τrEA­‘^»ή3­Oc‹* ωJ½^±ι5E’ψ4ƒ¦20畐bσΩ^ΜbΟ͍Žl}kΕγ›_«βΉr^Ύ«΄m+ςA©ΐ Žεkβχτ ϊΏ‡Œρu>ƒ/a,xVΩ»/Ž³Χ’$bjI}Ϊ9hγIŒL=‘»ΰ±s(‰ˆη(\Wˆ’ΎgQ―Ψ΄Άφ=±Rξ4U©žE%ΧΡ/G0O¨μ½δ2ώiWgς’ν"Aώ揋Ψξ^Χb`πšΓ$_Vμ!«΅ίώ>°†TΎ΄ ξ “ΥΙŸ/ ΕLω$[iΧ”’^±XwΛAΗ$•!Ν4Y&ͺwDZލ²-₯ϊ£ŒͺoΡnΨΔIΖρHζί“t¬XXμ#Σ 3ω‘ ΅ƒΦšFΝ¦ΧtΩͺΕb€DπΘ²„aΫΰΪ2ςhε„ΟQΨT+υŠ₯{-Gκc+j‹Z ΖK–% ‚λ(]χ© =Ρb9νZ}8πCd.οŠχCƒ/-Τwξ›―ϊ >O( ‹TΎθ άV€ζΔϋ^j…ΰͺzr·Θ²lΊΪ ύo]$*N…€8NtΞψ—ΚHήRRЈ•n1‘`Y’” ΐX9QΛQŒ¬0 ‚ σ₯)’Α+WΌ9-ΰο }D‘ςGΘ*?Ίτή Ύ 0 €ΑW° Ό‰ŒήCτV€Ӂγ•'³βLWΒΧ§Ό~κ Ύϊ >σ©Ÿrͺ!ΒΉΨTψ²κ?~Υl`πͺ`Z_u$H x„”=€Bp!~ IήDΔφ―eRpVύ’}νNδ|œ\ΩƒΜήβή}dLοΘj)&ΰ”0 €Α4"Δ•mtω€5°†θ |Έ‰T 沑wb―eRπ%ΐΙ€―}ΰψcd$ο‡ˆ΅ξ„jJϊgΐ$η#C‚Μ>\~ ™$θ ΐ{ΐ-ΰ]$A˜C¦ <¦ΗΙΰΔψύ«>±ΧκŒί5²²ίGVρϐ2ώ§H°Ώ0χ^υ |‘`ƒΛ#f\%ψaώœ‹-!‚%ΰλΐ DΉπPGƒ€Σe{Ύ •ƒΣΚφdξΎθΩ?D‚ύ‘`ΏŽ¬μ1¦:/ “ΌΔH)Ί(G°ξΐ<.XCψ]$IΈ‹ˆωH«‘ΑŚ~zΖη>K¨K>_ DVς$ΨίΟ{Hΐ °°τw0*{ŸL``πΩ"EΚΣ»ωΏ7ρš‡T$ XE¦κH‹α&p I*ωσ­ό½6γΥ΄•?.γΕσ’Θ&Eεb€ςΓόχˆ±¨ΞS€DΏ‹ϊ­ό=ΕγΛ^ω00xν`ƒW‡"@‚”·tβu τ’$Τ‘ΰίF’βΉRUθ2Ν=°€ZΎIl¦ς$=aΊ?‰>²BίΛGH9>DyΡ‹/€bΏ―L``πϊ’XaΗHέCΖ/ —ι*Aρσ4’έδη&ωOƒ/!L``π凱¨500xΦ‹οΒΐΐΐΐΐΐΰ‹†ύi!čކͺIENDB`‚‰PNG  IHDR\r¨f€IDATxΪμύweλšζ…ύΎεΧφ;½Οςuκ˜{ϋφ½νn›™6ΣΣ Œ&f@d BΨ(P IHBˆ(’B#ƒf†ž™φΣ}»ονλ+›•ήο½s»ε?ύρ΅rg–;ΎκtŸ7’*«r»΅Φ^ίϋ½ζyŸGύϋ³|a_ΨφΗӌ—}_Ψφ…½<³^φ|aŸŠ™€‹|Ώ.ΰη?Uώ˜“4ςίe@ Δω!Qώ»/쏐}α>Ÿζ   Μsΐbώs¨³@π€ZώS!‹ήœψ7Θ‚Ο8w Œ8zΐ1°Lό<Νηορ…}Nμ πj›LΛΐUΰFώgYπSˆ#pϋCΎ·Ύτυ!_Ÿrξ$Ίˆ3Ψχ€‡ΐ6β0Ζ/ϋB~aO·/ΐ«c ΩΡׁ;ΐ—€7€kœοκO[δΕBώΈ;―ώΟ7H€‚D·&KΗplο?ήFΓ ’V|a/ΩΎp/Χ¦€›ΐ?†,ϊu ΕΕοζΉ‹\ε{·šxςδΏuώκ,F‘ΠZ“κσ'«ό} ₯0ŒKο«.Iώžzβ#.›D&M$bω₯όΨϋHTπ6πMΰ[ΐ{ˆ£HωΒ>sϋΒ|Άζ" ό«ΐΟ_# ώ2»ΈΨ<€g$©VQ¬ γŒQ‘˜†β€—pKGq’Ι2Tgh λ .a€yΈ ΅,pΛ”…o™ŠΕiGΟΆ,φO₯ζη»Ž­¨ωžcPυ ͺΛ@+CaηN"w6ΊψyιHTσπ‘(α1πශίξΓ—ύEύq±/ΐ§oΰ5dΑ<π$/ύSww₯δΦfF™™†0<Ϊ 8ξ%j0Κ)a€ ’ŒfΥδφZ…{ΫcφN"Τ%ΏbΫ5Ο$J4;Gιε˜Bή_…‘ζϋ† FYy,¦!N’Y3ωυ*ύqͺϊΓ„fΝ­ΊI«f¬šΤ*&žchΣΜƒD Os UΞΒ?ˆΤ ~όπkHΪΠ}Ω_ΰeϋΒ|:ζ!yό/Ώ όR•/μΒ―ΤωŸeŚξ Q'½„ΓNΒq7Q~B”²4ν0Υ°ωήύ!Γ E©‹KΌΨΙgš6Η½„,;_oZ+¦κŽm`ΫΠͺYœž%η»7Pρ f[6†νΊΕp•§™&IΑ2 ’D³wσx?@)₯”ΛP8Ά’^1y󚯦›–ŽSΝTέ’Y3ρ=C[ΖωgεiDq€ ©%όBώη_@j ψUΰ{ΐΩΛώb¨Ωΰ“3©Τ"πgGnθžΊΓ§)Œ‚Lž%ulSqάMΤwο Iθσ;mƒλ(¦l6φ/nίJΑTΓ¦;H¨xS ‹£N\ΎΦ4`Άmsά‹1 Εό”<·¨(`~Κ&J4~ΒTΓb$&ΝΞ·nί5XšΆ σhΓ6…I3Ν(Πh g̽“±zρΗ6¨W fZΆZœ±υβ΄Ν\Ϋ¦βΪ,‚Όl2:¨?™ω§πΧ€ΏΌ‹ΰΎ°i_8€oMΰ§€Ώ€»Φ9ﯟοςε_'Zž%μΕlDμΔͺ7HˆΝ­UŸzΕ$Ν$τ7ΤωλLSQ«˜œž%Μ΄l:ύ„ξ •T¨ΈΟΰΑN@«f²4νΠν'Δ‰¬«jΕ€βlξ‡άZυ©ω&gΓ”Ό~¦iσψ ddάΉβSυ zƒ΄,,.Ν:Δ‰fσ0βΚ‚‹η Γ¬ŒBLSj Ž­ˆΓPŒΓŒq˜qpšπΞ£±²-ŝ+>Χ–\•fZΟ΄,fZΎcθβ\.E $…ϊ9ΰŸ~ψΏŽΰΎ°h_8€nWΏψϋ’^5}ή•u ŒƒŒN?Ua¬ΩΨ ΥwξY–οξ LΆ₯pmΕϊ‚Λ½­ΰ|χΥΰ;Ž₯Έ»0ίΆYwc’TφΞVΝ"I5ύQΚ8̘nΪ,N;vcLVη ι%ΜOΩT\“α8+£ΗV\[ς°,‰€%A˜±}±}©o½§hΥMήΊ^α΅uͺt΄‘(Rβ:ΫHmεG€ψ―ψ]Ύ}`ϋΒ|0s―]ΰWψ-Lξφy!/Νΰτ,Qο<s;T‡˜0’Εnζ9«freΡγΑΞΕή³ Gݘq˜quΡe0NΛB]£j2§€©f”hvŽBVη]Ί}Ωψ|Χ`σ ”œ^Αݐυy—}­‚RηωušΒίϊζ™ρήFΐλW}ζ§YˆQFg’(Ψ€,Ο**žΙÝPύθν ΟΠλ λ‹ZC’jΎϊZEχ©ŠΝ(Μ8%*I5™†ZΕΰ°#θΣ€΅yΗR<ά X[p±-ƒ0J%ΥβTsKΨ=ŠΥh¬Ω; YœqΈ΅ζ±8mγ9J?%EXώΰο~ψχ€ΏΙEΓΪΰωζψΗ€?…τλαςn―‘7HΥΞQLk΅uρέ{C2-9|α CaYнγˆzΥdyVvΛ’η{FΉ{wcκ“+‹.γ0#Ν4UΟ`ϋ(*{χ‡έ˜VέbmήeeQΖpœ• xdΌύh¬^Ώζiί1ΞϋZ« ̈’ŒύӘλKZΓ½mI'ŠΧ‡QFw°<λ0Υ°°-₯ΛJ]ώf¦‘hΦLZ5SΛ{Γkλž‡™ŠθφfZ;G‘²MƒVΝβήφ˜ Μ@»ΈΆb0qΑMW=f[’šlFlμGκ;w‡,NΫάZσΉ±β2Υ°΄a”Έƒβϋ¨#Ψ?…DO€pΨ}Ω7«j_8€§›‹œώ δfjp)Μ7$)œΖκέΗcξnͺs–rmΙe¦e3Σ²9ξ F:Ϋ’ό7Œ3ͺ™Αήešν£T=“ Κ$§ΆB*žΟ•E—γn‚a(ΙΧΛΆl„άY―Π›ΎO,`τ a¬ρ]ΚEkJ[–Bκφ%eγ¬,(¦5wcζΪ6­Ί©MC]ΈHEaσrωή2ͺ8„ι¦Ι΅e—  ½­ΆQ…£σœσH)X™s₯ϋpQ―˜˜¦"Ӛ(Φ<Ϊ‹xΌ©ίΫδ«―UyγͺO½bhΫR— ‡.JόiΰΐΏ ό—|Η½„T_D+-ΏYœv8¦ePυMlS]ΐλ+ΔX¦byΦᴟΰ:σS6{Rt,zώΛ³Γ £κ]δŽ1lμG<άΥό΄­ΊƒD;–bΆm3Υ0©Wδ|Ν‰—Žmmι_ώ‰ϋ' ί~o€ C:Λ³{R@¬WL΄–λY΄ ΅Ο5ΈΉβΡͺ[μDάέ Έ»5V S6oζ…ΓfžŽ\rΏ„8χΏό[ˆCψcί5ψΒHιΛ¬ηΏ»ΠΖ™z3ΰ{wGJŠε‡vέbFvDaš8Ρl„ ¦–κR=?e7%ZˎΪ[zc/TŽ₯ΈΊδε@šμ Μ8ΚHSΝLΣβΈ+}ϋΒιxŽδՏBfšΛ³χe›¦bΎm“ƒ/©e*fš6žcπφ£υŠΙΪΌΛαiΜ0Θ0 XsHΝξIΔΧΏT½pL:wDΨ;Žι Sυp'ΐ4ε˜κ“ω)[½~ΥΧ­šIΕ3¨ϊ†.Ξί4+sΆBΞ Q m›­ƒˆΓŽ€Mi¦ΛH₯ˆ&*žΑ€Σ3&4 ‰pvŽbv{κΫοως _ΊQ‘Vy""π‘BαΟ βή}Ω7ΰΛ4σΟ‰©—} /Λ|d·?#8τ²π5ΘΒ‡™ϊαΓ±ϊ[ίIχ·Ζx‰©ΞAq½£ŒέγH™†‘² Lε9ΖδυΤΘ|Ə! ΈΛΣ΄ΰ+'ΰWR%ώZώ»2άΟ2Έ·¨Ώόk§κΏϊ;]΅y‘iPω]”€2H3ΧΆΉΆδJ>οˆ¦yžsk ;Η{!ύQv΄―,Ο:Ψ–"Ν€ f™Šk‹.ž{^±7 hΥ-Ίύ”ΫZk.ΊX†Β43-‹N_P„§g²˜Χ\jž„τ~"@Ι³W’.hΰΰ$BIŽνŸnXΜΆmVζ;1έ~ΚLΣΒsŒ ΑNœhξoκΈ—Π€(CQ―ž‡ν«s.ν†ΕΓέ€4…ή εo|£«~ψ`¬&›eI«π¨{‘m,Λ ΛδšΘ€“OgάΫD°θb¨€΅€œ,x$©ζoλLύGΏzͺώΰ‘Ž3&όNΑ~tψ7€qζΛΎ1?kϋγ榀 AŽύύH›/t±πχŽcυΞ£±ρΝwGjc7*[y…ο“^Μέ­1υŠΙ­UΏ¬f+%Θ·Ιη?ήΉ»yqƒΡωξ]«˜¦’κl†dnxΈΆΚohƒŠkΠ$±ζΑnHΥ3YwhQC7ΙΗν`λ0$Ν4·Χ}ͺžΙήq,PΰKi…m)v#ΒXηΗ §ύ„QqsΕ#Ξ§Q0ΫΆ/δςJv^UΤ ‚(c0J™nΨ¨άΉ,LΩ<Ϊ 8κΖQF«nJρτΰbΪ€΅œŠσ-,Λ4Iͺ™mΩά\υ9&άίˆςsΉLB 5Τ|ƒΫk>­šI–Iύδΰ$ζWΏ§ώςί>5~π`¬βδBt•!kΰO1πΌμ›τ³΄?Nΰg‘Όο¬2±π•‚£N’ώΖ7zκ?ω›§κύΝ€ΉΆΝκœΓ₯Ξ:ŸZA)zƒ”χ7ǘ&ά^χiT­Ό=xρφΜ4lμE*Š΅:¨W =Ϋ²qm)ȝž%<Ψ 0 ΕΝΗV4ͺ&i¦Œ,3§<ά ˜iΪ\_φθΣ|*Pή7Š5χCό­·w<*oxΰΒΞ;ίΆ9œOZ¦bqF°ϊ:Σ\]zΑ嘹(ϊu6GέΛR\Yp){'17W<¦–©¨WŒ'^ο9†^›wX[HpœhTs»!)ΚI/QύQŠ‘ί§~Ό‘―-»zr1kΘΡ‹BSf[Š΅y FιΡBω: mpcΩ£Y3y|r˜;ΓδT2Ÿc0?νΠY|οήHuΏ“π£―Ux㊯νσ$C»ώ2ύ―Dَ¨:ΑνΛHkοBOj΅}ρλί>S»Η¦q1,MσβΣ`œςξγλ ·Χ|Ά#ϊ£τ©tΊI*aπό”Νς¬ƒe)ΆΒ²ΰ:ύQΚόΤω%Χΐό΄Νό”Ν»γraK?γ(‡Ο΄lzΓ΄œͺslΕlK†€,Kq}ΕγύΝ€ώ(eΆ!G#’Ds{Ν—βάδρ*‡)GݘΥy‡Α8e--ΑwŽ3Ž{1K32=θ^*–M8CΛTΪ2ΑsM¦š>Zϋ$©Φq’Λ @ΫΊ˜ηœ&κ°“(Ο1Π™ζΪ²GΥ3Ή·=Ζ±‡`ŠμrT•ΟFΌΏ9–‘ζάLCΠƒΕgi-˜†υ—fΝΔ4αδ,aη(d4VΆC~ϊK5¦m}iϊπGψ·#BfϊGΚώ(ΆΧ€)φΝ0YέΧπώγ@ύζwϊjjUρL’XBοIsmƒ©†@yΓHΣν'dVfUAΞub’‹%ͺΎI£j±u2Χ’Vαp,αϋό”e*•,_c›Š³aͺξoRέΞ2 X™ŒΏη4ͺOS˜iΩ΄λφBNϋ ŠΙ\KΖvWηΊƒ”ΓNœ“€\Yt™i;žˆ€ΎωξH΅κ³-›FUvΡn_vέq€™kΫάZυτ\λβ>‘¦š4C)₯0Τ9gA1ξ[,QπΛίθ¨σξƘ0–BΫκΌCΕΊνΙΧ,Ώaœεœϊ¦Š“‹x€ͺgθι¦ΕΓݐ£ˆΥ9—Š'ΰŸI³rΞ(ΡάZσhδΘ»ͺo2Χ–š…ΚNJ―/ ›ΞΪΌ+‚ —N€V1˜i ΠΩ0ερ~ˆc)Vη\Vf]fš6Γ Ε4.₯)ͺY³Τ(p}ͺnQσΝ2ήjT…{!?|8RυwΊκο|oPGΕ3τ/~΅ozϊξΦ˜Νƒ4ΥR YΜΆ©¨xiέί3Ξ§!Σμ\Θ€ˆ„fZ―_©ΠnXtσhν2¬Ϊ± ιXdς=U=ƒ+>Χ—=’8+™GšoΎ;TΩotΤζA4 :,ΐCπ!ΞΰskŸgπSԟ‡‹Γ.ΆCυŸώΪ©zοqΐκœ#•π<οΞ1<²PσVRρϋ“^Β;#ŽΊ1†!㩍ΚEtθd‘kfάί³Ή2Χvh7¬ςƚ|~Ν7ιRή{αLC齓˜“žD£ γρ~ΘΒ΄Ν¬ΤLmšΟ%Œ3v"ξJΫmde·`Ίiq{Ν'ˆ2Ίύ„VΝ,ιΟΎυήPtb5Α ¨WζlA§2;Π¨˜e1qmσΪΊηœ SφOs8v~,IͺΛ…ο»ΌΆδΡι'u„Ιψς9+%”(8­Ξ9Ό~₯‚k+ξnJz–dΊLC”‚ΗϋΩotΤwή©4+G₯‹2SςΉ΄Ο«ψsH{ζ'˜@τ₯™xνβ·:JBϋ˜$“/ύΞΊΟΥEί‘•$5½LH%šνÈαXςβΧΦύ’εΆΈŸ PtφOcξnŽ‰βŒ…)‡υy·ly³τΓq&xν1vΓ'"’ΕiΧ1pmƒͺo²ub(Εkλ>ν†E£";λώ‰t&μχbn,ϋ΄j‡§1Λ³σS–φ₯N#|Χ ΛtYX,MŽ]ωN>ߟ»mΉƒΣ$‰f¦e]pT Ψ?‰ΉΏ'qͺΩ> iTM/{\_φ89ˆτξqD³fQυ$|Ξ4DΡ9Χ@¦aΊiιω)›,Ӝ SͺΎQ―/{% ΚγύΗV:'p>-Έ<γπϊΥ žcpw+`c/$N2žΪ·Dκ-Χΰυ+ζZ6ΫGοnŒι R*žA’ΘυšΙCOύα{#•€ϊr4p© ό3|ΡƒŸ·" ϋώuDh£ ωGA¦~λ»}ΎύώH%‰ΖPŠαXΖh%Ό5ς‚“ΝώiΔQ7&J2\ηI–›L‹sΨ=‰Œ•Y‡©ΊΕφQ”χ—/Ϊr’,ƒΞ™ Τ΄λ[‡!£ Γ΅ † ΣT`©?r³rΨ3Υ0u«fͺΐ²{,˜ω΅y—Λ^Ξ΅Ÿ ΐ(άΑ8₯U7™iYϊΦΊΛό”%»αŠΗΑiΒώIŒλ(–g„HO]ΚhfΫ’WoDΜΆ„•ws?€β™ά^χ™ŸΊX¬Τΐά”Ν/DSubŽ»‰κηd( SχwφŽ#4Π€„qΖ\ΫA©˜7ϊΜOY“ΨLCˆJΡr.kΆΛuŸ(Vuϊ ͺɌ ME2/ςΩ– w#Nγ Δ£zβΈ2yXυL,S±±w„YžJH:PΠ―]xm9wυΞ£€υE‡f͜DNMά“:Ÿ#i³Ο“p\‚Pt•‹Ώs–ͺ_ύƒžΊ»PόdH%Ν4Ύc°w—Τ…i›Ω–-€‘Œ§–Κ‹ͺυA'¦7Ldg_]Qι/’€θ‚‚έ“ˆδP³2λr}ΩŸ<Δ.Žνΰ$V£ £V1J޽¨’ ‘(‘μ$©+ Ch―x,LYzyΦanΚ¦Q1E‚‹σ<ϊŠΛξqΜΓέΣήS’CoFL7lͺžTϋ·"v#Kρcν͚yq!ihΥLύΥΧ*e%=ˆ4iΞT¬”¦β)Υ€Œ‚ŒN?αʂǍU—[«žžœr”λ¨ #MΕ3Yœ ρ£ΜCΉ{Ÿ§jƒqFΕ•φhQpέ:ŒΨ;Ž.H©]Άšg°8#έΗ2ΔQεSηΈ qF'gΙΤ₯Ÿ₯Μ΅Ώρ{?π­χ”ϊ₯k°ΆΰL:ψ#b02pϊ²Μ±Ο‹π‘‹ϊ/r>Α'ΕΎa¦Ύsw€ξ„Ύ8*SΘMΈy )Ε•Evέβκ’ΗξqΔ`,Θΐbš-Iu)ΌyzfqmΙ--ϋ§Q,αno˜R―œ/₯ΰυ«>οnlξKŠPρ₯2犧―,ΊΤ*F¨Σ“΅ˆIN>…8‰p4:ΞΨΙ#c"ƒu,ήž –g]Ž{1ΉθνuŸΫkžv¬’·΄I e*]―Θ{Άκ&Λ³‚yΒ¬Τ<¨UL|Wa]f%Κ™­xγͺ_ͺ]nΡΕ©—6ͺ&^N;'š½°l>Λ<Η`aJψΗ‘D:+³NNHΚΗ/ΧΥ(΅ηΜ΅e£HRru Jϊ+ΏΥQΏτcMξ\ρŠσʐυτ?@ Δpψ²Ξ‹μσΠ¬Kδ‚ΊL΄}l‡κχί*ΫVžxQ!.  ͺ)Ψx]PwkΊ!՘ΛQpνΊU of%r”χIk,CŠz™–’œη„qVb–ŠΊ H£*οSυEu§@΄^_–yωΒrΏ #Ν¬ΝW+|ύK5Ύv§ΖΪ‚£k©ˆ-Ή sκόOœhΒH«ύ“Xw%rωΉ―ΤυTΓ™Φ ­T–i₯5zeΞΡ™F=ή©WLlK•“{SM›ή UiŠ2 ₯΄Fιg|@vRΧ1¨Uΰ: γ)OV Ž;‰κτS΅³±’¦’–œœIkOŠŸŠ©†Ε\ΫΖwMN…_a0N™jΘβμ]"3mηνΩ™–cKaσ *Η‹Ίρ…ξ€tRŒ²υ:ΫΆΉΊθα9{'1[!­šΕpœqΪ—vrj6φBεڊ…)gςσB/wψ;ΌβD€―zΠDrͺ>Γ<?|0Vσ›=„š/]―`ΫΒZœ"‹“^Lk€—+Š:At1> #)Μ=Ϊ hT-,Έ,NΫμŸΔη›ΓΔN!„ŠQ˜ρήγ1͚Y‘’Ηfy@!»JAεέ$,Ν8\YpΡFVY&ΕK(•~σΊ‡eͺ'`΅O,ψόίIgύTυG‚"|ϋΡXυiγυρ\E˜ρW§«FA¦ͺΎΑ|Ϋ!'ΐ»#φN€nquInzΧ6ψΑύ‘zΌͺ[ά^συŠΰι ƒœβΛΔ4ΞΟ‘8Ξς˜Ÿρ₯ζ…5υ`'Tο=s6JΛ:€‘wMNγ„vέbiΖ‘YΘφϋ₯ϋQ|^’κ±WDa²kΛm½{,΅ž¨εεκβu­zΒIp£ΰB8Ž8鉣π\ί5Ψ?Κϋ‘HλώΦ7ΟΤ8Τ|ύ­š6ΞJ ιNωΘ$κ£—½že―²h&"ψPΆω΄†οΌ?TΏφ‡}5Ξ 8½aŠηlμΜ΄lg¦mŽ:qyΓxxΚ›΅h"!ώ݀ƒS£Μυ[Ρν }r·°L©€©ζΈ+Sx3 ‹+‹­šΕ•Εs^=ίmΌΑXδ»7r”ίν5ŸΜ(Η> ψλδ"*~_X–IΑsο$ζ¨cJusΠO·/ωs¦εί·Χ…¨δέGcu' M5Ύg€ί³aΒi_ζϊ»C:Ο·mFaΖ½νa1 "!q8fκ7ΏΣg$Βs ήΊ^‘Y•αš>;™’LH{•'š;‘ϊΞϋ#Υ¬Y%ΪR)r]ƒ”…)§œOθφ6$’I'κ5ZKK²¨_Μ΄$JΠ™txFaΖ$ΕXΑC˜ιάδŸY«˜e¨_ *OΟ.’j9>aRs‘xί0Ό»1V‹Σ6W—\LS(#ς§ό πG”‹Ύμυ4{US€΅όG™Xόi¦ωΖΫCυλίξ«0:Ο׍\υφ°sάKθœI₯|6ηηwmEι $ yέ|Ϋ‘?ήΉ8•ΑŸN?‘⚴σjΎeJ:I53-Aβηύs­!ˆ8§ψΑⴃη 1¦R°w,7b‘ο7Υ°y΄2?mΣ™Oέ)‹”iΡŒ3΅wœ¨­ΓΘψύ·‡κ·ΏΫWχΆBuK™ΝCέQΞ½―΅Tλ+€>­š€u .xh„₯¨κΛJ(ΌΌΌ(Π[‹Q˜¬™Μ·E9Θ4ϋ'1~Κpœ1§8–©zƒTmμEκ›οΥ{•iAξŸ$je*MQύq¦vcυί93~οuΤI¨η³'ΚG3MtGšύ€έcΩ…ηΪLOΜ_Τ«Β_0έ΄©x‡§1ςŽcχ.Ξ Τ*ΒV|ԍiTDPeeΞ)Η¨Oz [‡ύ[ρEH‡ΰ sώ=*u>ΐ΄<λ€κ 3Σ²”c_HyoΏΕ+(Pς*FUΰ_γβΧΎυξHύζ·ϋκ‚ψ…’Π±ΐyΓŒ0­ΉΓNL».LΉ¨ζ¨Λhm"ZχIͺ±s0Pρ΅‚Œa “A½(ρΞO9tϊ UΟ(‰@ αOΗ’>υξ‘€|¦ς! fΝb€4kVIΧ]ˆmnF<ή YŸwΚσ(hΙΒX”{φŽcή}<ζ°+ί1Y™uP†83Λ’IΌ…i›Q²*―_©Εžkp;ΰτ,‘UΪ²ω)›0ΞxwcLo ΐ‘;λ•œoOσήγ13ΏΆζσΦυ*hΉρχObfΫ6λ ξψq¦T³u²{£Ρœ SuuΡ£;HΚΪΜΩHj Ϋ‡q‰K8<Ή±β±8#τf“ίίήqD§/)AœdDωnz&ƒ\sm›™–•GtΞίW£/h.@~Η’ϊΔνUυG)χ·†γ”;W*Œ£'GώeΖΑടf`’²<›OdZ¦Β4α½ΗcNΟuKτŸϊρ†ͺxΖd$π‹ΘHρ?μΌμvαό^±ΐEzώiςi>…,ŠΝƒH=Ϊ‰Τ0HIR.°ΰ€eΑi’%6Λ ?Ξ0dP%ŸŒs˜nΪX–"Iu©¨ϋD!©na(Ε£½“Ό-Χͺ[4j~J³sŒzEŠˆ{ω„Ω0έqΊi§‰γPqοHΝkζ§l’D«ΓN’νEjο8QΫ‘Ϊ=ŠΥwοΤύPΖΝͺ•₯"USΒδΆμ|χwŽ»1γPŠ\•Όέ–εΕξι†° χb %E5Χ1X˜–*ϊώi\¨ω’―aSρDˆΤ4~Bo aqαP›5a zΈ’fd ’ Λ”χoΥ-U‹ƒΣ¨<ΎfU ƒ³ΫR4«ΣM‹vΝbfl„μΕ4«²°z9ζ‘`+jΧε}—gΕivϊ žc°y„η›B£"Χͺ ―ζQΩⴃe*Ί>οDŒ‚ Ϋ–Το¨{Ž €σ"ςβ΄ΓI/‘ꛬ/x,ΝΘηοΛ ˜‘T9žΖj0ΚX[p.G·nŠ_F/{‘φ*E62ΓΟεΗ₯dšίύΑ@=ΨΥΪΌΛλW* Ζ©„ϊύDΖBσ‘›02I₯:M)ωςgš’σ7Dλ'^7iq’98ιœ%ΌqM<λσ.ٜάRɈγσ€βdάέcΒ«·”£ύZΉ:Že*Ύw¬Ž:‰ϊξ½!γ@Ϊ]·Χ}΄–IΉFΥ$Š3fΫ’6œFT}“;W*ΈΆAšiΦζ]ΪuIW’8γ½Νͺgp%ΏY•ϋ';Gβ<.z¬Ξ9 ϋ'G9ίϊ‚K3οZlΘ‘Qb—ι¦…mΙηœΖ΄jΒUΕG˜©ΊΕ+>΅ΩΖ^ΘLKzη‚½‡έ“˜Ϋk7W}*žδΞ†2Ψ³} 5ͺοω);¬¦ςTΜw ‚(γήVΐΩPϋLΣ UHP:ι¦ΕtCj E 7 2ξ6ΗR9ζ »Pc0 rν:ΏΟΆB…€ϊ΄t’‰ΦεŒ ω'žˆώ²ψ^‘tΰUr$λ/[}iίψαPύΞwJS ›8ΞGK9\o(TΨγ@†{*žQ’Zΐyq %`’N?a3”›»Y3Y™u™mYψ^EΒί~ςYfρ>䈱ΝÈώ0eͺi1Σ°ΚlaΪ‘A’0“]-H "IΖQJ­b `ٝνFΚΆ•ηE§™–MfάΫpƒυy—ΉΆ΄»fšΆ₯hΥ-πΞΖ₯ΰϊ²ΟκœΜ!QΖlΣΖse.Έ'»ϋ|Ϋ.)Ύ²LθΚλ“Ε'EIQtχ8=i‡ͺgΰδNΖ±D:lϋ(fο$bqΪ)•γ%Ζa†λlFχbϊ£”Ϋk>kσnΙ‰ ΞΠfσ@œYšΑW+‚JΜY†‡AŠc;ΌΆξΛη§2 c’T€E ηζΣz†Κy+&΅Š8Ίώ(εΡn@w²:οΰε““ΡžλœC¦UώVΝdΊiΣ¬š±fχ(Κy ΞaΖ͚‰kœφΓ'ξ—<)ΫRϊOύxCεxŠ’;π#cΔ―€Α«βώA$τ/'ϊ4πΝw₯ΨU°Αœφb¦›6χΆvŽ"Z5 !o,‹ͺŽc+Ϊu‹ώ0-+Ζ ΩΑ“Dη#§“^’Ϋ§”ΝI/‘]—άrfΨ–L α>H>¨ E‹οξQΔI7ζkι1·m–fΖaFΥ788•‘’4•°Τw ήέ3 ξύφšGšIΘ-»·¦Y5Ω<”ΠΆ4¦ ΫG½AΒςŒΓυe4•šεΣTψŽ*΅ζZv9ΐ”ε£Αy¦—Wά3%ΕΟ’jη 8NήF³L©ζΟ9mζ¨>Ρ7tσ]Ί'Ž%ΰ€‡»έ~Β΅|(Η±-z‚kσ.a$†»Η2νh‚«Y ω]eΤ|I,S^_p1f™¦βUhTD#A#Eα0–!"=mη©‹QΦ ξnιS‘.Sηzˆ“V΄3- Ί]·hV-IR’TŠ‹;ΗQ :*j?νΊE˜^/·BφOb΅±ιλ+"ύ6αώq„Xδ $ΌD{ΐ/!β SLτωΏo€~λ;g%»FBΓ…i ‹OzI^υ)D'ηςXσM:}iэƒ΄œπ*ΒΞŠ±R­%ŸΫ=––ΟTCh²|ΧβΞ• έAB·Ÿ`[‚₯+0ι(Α†bs7`0Ξ¨ϋ&‹36Ž%H²fΥβl$…«Q•;ˆ—dήίFšΕ©&ΓŒωΆ@O %‘4•\Χu©vΪO˜mYΜMΩε]Υ¬ ϋog„1₯βoρ™ˆGj‚PPΪ(₯Γ eAT~‘N\l5ΕMi›’$d[‚y―ωΏˆLC’ˆsŒ³|χTd1ZλεΏͺgΰ9¦!ιˆeJΊ1ηΨ€™μθΕcI*Χ€P9κΖT\ΛRάXφ…½AΒΞqΔLΣbλ0β,ηœŸ²™nΚ–eŠΰJ½brηŠΰLj A$Œq(υ fυ΄₯}>'‘‡ώ­ΊE»n¬ŠSslΕi/fc_‰ e§©†DR£πΙΎκIδΣι§²θ+&Su‹fΝΔΘ•’3­yηј ΞTe|ύ­Zš*˜‡WΗΰοe-ΐ—ι–¦Υ7˜Xόέ~ͺ6χcε»’ϋsϋΕΒ=ι%¬/ΊxŽQ’y7ϊ0qr&’V5_"ƒ™¦]R[­Ο»t)£@sρΔ„ΩδOΣΔί£έˊ¨Έ+sB)½Ύΰ’i‘ΠΆ-Ρ0 …ahlSΡ¬™2ΧίΩ,ί•›uηH)‹ΒΌ~΅‚i(l[1₯\[ςς°]•„%Y>cδ‹ε$WΞς†΅mIνcqΪ‘U3u³&-΅zΕΐse±:Ά*oLΣT\ζ:ѐQiJΎ°4γP’ˆΑH”Ίq4gΓTvβrnΎ^1iΥ¬\αΗ`Ί!ΨΗR\_™.€§Φζ]@ΩŠvƒ| ͺΒβŒΓ8 0r€Τ"D\΄$iΙ‡€ϊ#ὡ*ή¬pzY>*lͺΜιkΎD …pι8Φε~~Ν»ΓTDQ'†ŠjΎ`γ$»pPE—§mjΎD%£0cDήσκ’Λp,νd­αο|Ώ―ͺΎΑά¬LΞΜ"x—]ΰ[/cΎ,PxΏ_`‚Έs4VΏρνΎjV-^[χ…·o,δύQJeτ† YζΠͺ™μ\τΜq’‡)ΝͺU’τΊΓˈrΚ'vŽO3Ν`$;¦iΚYˆΘΝi‚LΞ₯Ίφ€”½€ͺg–9£ΦπΖ• a,»‡kKͺPυΝ²κp7ΰ$ZL³±23―x8ΗΜΆμr―¨;μ Ά ₯nŠZΕ`}ΡΡΕ”ΪTΓ’ΕξΊΣ˘υο‰O˜—S€ςϊΌΒΕBΥν'uφOcuM8θH8l™Šι†Εtξx][`ΨGέΈl‡†±ζ suΡc}AŠuY&5 ί1°Μ‚·ΠΐO4{'ƒ±°§™.#ΐ"₯ς]£\ΐΕM±8γ`™Pqe'·-Ew A˜‘f θo2ΜWJζ ²XÐοUœΜJΘP•ΤzzΓ$%†©Ί΄!…„τ1ψkί:SUΟΰ֚79Ex ‘$ϋ‡€­Οz!Ύ  €©†jr2ή0UΏϊϋgκαNΘΥ%7ο— /ώκΌ„ΐ£PΒσ(ΦL5ν'Tq²LςΔvΓΒ4%§ΉiΟ†i)›5³œΊJBAΧ6rύ9 £GA†i*π’ς―ο‘δΥ£ΌΧίͺ[l†D±.«κ™Φ,ΝΊ¬ΜΙMlŠΕιήZ1Q†’]7Y˜–Η‰τΧ5;,§g{ΟςhyΦΦ+σΛΉΪoΥ3΄•·―J"ϋόX'ωϊ?¬]ž£ΏψΩU+Ο`nΚβΦ€:ˆ2Υι ΙκΦAΘώI¬DYΘ Q³¨ω2VλXR|γͺ_Φ_–fl2m—ΧΏβ ¬»7LYžΓΓάΉœτ$ΏwUnΕ‰.₯ΞλyŠβ: -XΓS©Ο\Yt 㬄τͺΌ†£”*[Έ:«H•’XŽ‘U“"pAΘMόώ֘ξ )GΚ²‘Ν΅mϊ£‹’m…ΰΛίόƒ3UΝΏO­ΛόYόφOρs Ό πηχΟΞ½c_˜rud7Œ“Œχ·"\[ε4ήEqN*½Χ–m6Λξ˜hAœΝO .}κ2=Hς°ΦΙ%ΈGAΖΑ©8˜ΧΦ}#Ι;Wj"DQΐΦ2α֏i7uqω­Υ|οFA”ε6wƒ\Δ)uςL–¦'Y ΒnΩEHSGšU“7ωϊΪ’Η¬M³f–ςβΕbΏ<3πYY±H&cΕ5tΥ3X™³ωΚ­ Γόϊnμ…<ޏΤήq$Κ<9Ξί΅₯npΨrΞ©†Εώ©01έΙΫ£PF”_[χ™nڜ ²L¬υy·δQ¨ϊ΅<έŽSvŽ₯MyԍΩΞ™  AQU¬ΤόEΞ$՘¦ΒsΞο5ίHqIMd4b0J™›nIhyq]ͺžLŸ^ΖΦι'Όϋh¬¦›ž£&1-ΰ=dψν3ϋV?kπ"ΞΩ&Οϋ³ ΎρÁϊαΓQI΅4 ₯p·0νpΪO cM DΥΚI"o,{Μδβ  鏲uWTέΛ„+]=[•NAC R9θHξVδΣ7–%―lΥ€5hB(9?%‘aI!/Νδ&΄- -ΐ&fΎΛKξœ0Ϋ²Q†H»ŽQ>οτ,α¨3Ž2κΎΑkλ·V=½:οΠ¨ ΩG±Π³—°Ψ?¨•HΎ κC7*.7V€³qp’po;ΰαn¨Ž6β=Ω¬JΡΜΆ7–}zC©Ύ―Μ αό1―δ 0 ΑKœζ°ε~L|wS EŽξο‰t¨ψ©”HˆU}Cψη][¦F ξΏ‚Ž}0ΚΚB¨a@³*ƒTI¦ŸθL7…‘—+Bξ+“©†…RŠ{›‘Ί½ξ2°‘ρm>Γ’ΰg馐Ε›‰’ίŒΥ7ή¨IΒG­αΰ4ζΞŸfΥ,©±Ά{r&tQχ·ƒR9§Ρr,ΕκΌC­b2ΛIe9˜Q~S{ι²Έ%šlœ‘ε΄\GέΫTL·lΦζ\Ξ†)¦©˜ͺ[Τ«‚Ό»΅κ m”₯H3xύŠ_Vά“Tσζ΅JΉΣΤ}Q¬9μΔ Η)J)ζ§mξ¬{ϊΖͺΗtΓ–5±θ?§Št“$%Ύcθ«KWγL?ήΥ;χC•eš₯Ω<*p{ ΤgSM™θά>ŒXœ‘YŒ½0­Ν»l„ Η°šiΪ8Άb9―ƒkŸσ˜†`φ][˜’«Ύο8ŽQΞ œδΰ₯‚θ΄Pc*£¬|Θw vΟGƒ!_Αyνγ¨+Qb£*€€Fž–X¦Μ"ucή~4β΄_αgΏ\g’30…`ξ"Ρΐ§nŸ•0:―?“_+γ€κ»χF*.†8&f­‡ykk~Κ~Bh$”*h½Nςΐ4ΐΞΉ„@B—Μ΄…ή_–Αό”€}’X†FησχEWμYA>>DϋBa=έ΄Έfάέ'š•Yq8{B’Ή<λpp*…©†΄ΓΊ} O»ύΟQά\σxλzE―/8T<£zϊΌ.ϊgΩd}’V1xσš―o―{ž&ΌσhΜϋ›:ξ ό·]—9… Jς Ž%šq")׌ΓtΓ*•…γ|£€uΫ–’^5Ή±βαΪ)`5δΡ—teκU“{ΫΙDGΘΟΗΗ/άwωΐY–Λ΅ί—‘ƒŒfZDjηrk–)ΐ`œ²uQυ fZ6χC†γŒoόp ¦›o^σ'‹‚o"8Π΄Ώ›ΟΚό=ΐqY^QοnΜ·κ“Α(+ 'Q,Ένύӈ›+>Uί€?|² R θτs5›,_€ΎI<Μgΰ]Ηΐχ„^kͺa±2ηb¨²υ…λHΟΩwEΔ4UΩΫ.Ψ}kSڎZnΚv]nΎQα؊zUŽΓ4U9H4Σ΄'"‰„³‘zΎr»’Ώt£ΒŒ­K½΄\ώeXI·f(–fm½8cσ£―Uyχј·• <₯UZP©Υ}™φƒ;W|ΒHω¬C#η¨Έ•άρ‘zαγ”Q'cΆ%ίΗέΝ1YξhWη~b”­CςcσςΊΨ”Šp¦Y•’¨&›T=“šo”€!…Φ€HΙIδ§R·Xš©HΊf₯$άoόa_M7,g.<ό7>νογ³pΧεžΖ?…ίώ^Ÿwκυ+>–©π\ƒvCz«Έeœηπσm›α8½Pέ–T ‘]3Ω=>ί5…k.+η΅"›r–3ζΤ|“»[c²ά1T}“ΗΙ{εFE(Ki‰aRq 2­yγZ ½~΅rN„aZΜ·m £(₯lμ…œεύκΉYΡ_ΉUeqΖΦy΅σϊOΫ §7Υ0υOΉΖ[7|ή~4ζ{wGꝍ1«sN9λ? J<Χ²8M₯n²0ε %¦Ύ-ΘΛΗϋ!ύ‘ΔάXρΨ:ˆ„q)ΠyQ^σ"7Ώ\P5MΩΡ‹ιFΧ–ϋ³Ψέ•‘xύͺ™KΙg ‚ŒQ(5«‡»'½stoΡ₯)"‚ƒ Κ8₯D₯ψΧπLύΉ?ΡΦU•id]ώ ΐΏρi~ŸΆpίa"οϋΡX}χξHE±fο8Κ'έ²LkjžδN3mΛP₯tυ8`Ε8Οz62 ί‘ύ’†εάξU?Ηώυƒ$+ΓΡa•c»σmα‡?νΕ†RΜ:lμ…dZη@‡“ŒΔ6σIΈνΓH@&9XΥ7hΩ£@ΨhφOdΰ­k>_»SΥ+sΞ )V,ΌFΥΤ?υfΧ―ψ|οވ>«γ^Ββ΄-˜ [‘€ ”p/;υή±Θ€·λfιx“\WΠsŒ$™ΎΘ©˜‡ξ hΫ’"`£*Ÿ΅:η²6ŸΟθσΆαφaΔΩ(!5q"½Υ9™ι Σ'*ͺρ°—ΚF… μ„|ϋ½‘ϊ™/Χ&ABσΘΖωƒOλΪΪΰ/"ν2ο?8Υo}§― Κ%aQ±™Ÿ²ΩΨ γ΄œζ“Aƒ[«­H3E£κ”_HšI‘geNΠeaœηƒ‰„aUΟΌ@§Ίμρ>yΚNŸδω~iŽ{Β$ΐώ $ ψΥOγZZΐAζο0αΉΎswΔϋ›Α.w₯ί?Χ–›;ΑΕwR2Σ>Ÿsψ—J΄y}`f\_φΈ·XΗψh½b2?eημ΅F[/ωάΚ¬{ΚΩ΅…νviΖ)k†Ζy\εlBΆP‚ΞA?i¦9μΔlξ 3Ξ—oϊόΤ[u=?eiψbα+φeW/ΝΨ|χξˆoΏ?R½AʌD‚½a’σFBev₯Βq7f$bΊ%Σ‘ο?%Βͺ΄6οςώΦX΄@θΠ’Lx σΟ΅s’˜IO!)ΆΥ‹.ς (ΡDmΖs½’ν(έ(™AΈ½&CL–u7aίΨ 8κ ]ݟώΙ¦,’’5ψ―ίεSΠψ΄ΐŸώ&B³aͺο…Κ΅Ό°¦Λ’^œΚ ΜeΓŠτ^/LζΉΥlώ(Ϋ…HΎ—ι<ΧƌCΠHΡ―Λy£–©Έ½κ3Σ’Λu ΦζφOešΠΚQf‡g '½˜ZE*ο=γ؊Ϋk>†!=ήξ@FWOΟ$Bω™/ΧτλW}]–Ύ°OΖ2ΑϊλŸz«Ζϊ‚Λo·―ήΩ±0%4_†!Έ4ͺχFΥdϋH— δ…aΗ:—+ΙaΥD;?Ώ§Η(‹ΞE `xμΖ9Άΐ΅e,Έ?ιvί5σ4Eΐa­ˆc‰&ƒ(“:@^ΓJ3ΝΝŸ ’•4ƒοί©υ‡7―ϋ“©ΐO i~’φi8€edχ―2ϊΏύ0P3M›VN|Q΄KŠ‹'š Ζ`<ΎΠ Χ<ψƊGΕpšH!†γŒVΝ,ŠsρOί1θdyŽŸΟΘΗωl€Fd²Y‡N?εl˜PρDτγΈΣ€L5νBȒ馍m*¬ŠΙήIΔ£½,ΣάΉβσs_©λΉΆδo_,ώOފkΊ4kλ?χ'Ϊόα{Cώΰν‘ "ΑψϋQNΌ~₯"B.9’•οΘ…Z³ΜπΛta1u)i €˜C€εg™2,T0-Ν:2½™X[–Κ)ΕL<Χ N2‚HΣΘζΡͺ™ΌσxΜ(Ÿ œΌ7Šυ½ΗγRΜ&N4ΏσύZšu˜j\Hώπ_ΏI^ΧOΓό%ΰ« ;ίΏ?β·ΎsΖ΅ejŽ„sςa‹zΕ.soι­Βk†OI>ΖE₯U’†™–Ε8L/ΰể„₯œί―ο-ΈιόB.Ώπ (?΄|Dv…‚XΔΆδ¦)†@²LTh-K‘¦°s²Ήβ:_«ΏϊZWpέ_Ψ§lZƒg+ύυ·j,ΝΨόϊφΥ½­€υ·ΤφslEέ7‰“„8Ρ,L9΄λr«;Ά΄w₯&€K£VMF°ς]ΈB"ž# $ΓpΟ0ŸY˜rŒRξ9Y­. ‰ΣΝ Ηέ‹s“iης¬ΓA'Ύ°‘)%lΙίψα€?ύΝ₯˜‹ΘΖϊίαϊ€ΐO *>ŠπsΤIΤοΏ=TA¬Ω:ym½6φΒ2Œ*^lK¦ζΪ5‹ξ ₯ξ˜ζω ΈcΛγ͚Ube©Pd{\Π0Wͺ΅.'Ί¦μ’ώͺβŠΕ•E!ετ Υnx¨|ΆžΌBμδ³ώ˜…i‡8g=8•šΔ/|­‘―/»Ί$œψΒ>+.υ΅%W·λΏωΎzsΜ⴨8ό…ΠιΥ%»[c’TscΩ'Œ3φOc”’φ]œhφO$zτΕΪ‚Λ£]Α©Βkλ>‡˜£¨Μ [SŽ{ “δ5 €#Ύc”\—ϋNK36Y&d­O³>«;W<-Ή:;Oώ B,ϊ|RΧς“t>^X /ό%©ζ?pšWύy|yΦαl˜0ŸομAt>o^YυΩ=‘άέΚ€eΚbΎΊδ'2Yΰν ²ω)› †Ÿbww,ƒΥ9WδZ4ΨΆB‘ΚJ±aΘgξΑΕκΌΛ`”²ur{MΨk—fzƒ”G{£0γφšΗ/~­‘g[–Ξž3_…}Ί–·ωτίυSMύο Υ7~8Pγ0ω27V>ΛχiχyŽ`σ‹«Υ¬š\[ςxs\G¬Ν»xβ½ΗRgXžLωήI$QH~³ά^σiΥDx’s–p{L’i~όυͺώΉ©SΙΫ{_ΨΛ΅’-όΣ_ͺιvέδΧ°―6BΦζ]κΉ`«ΦεyΝΒsdC©ωa¬sXrρf`Β#Qπό@av>/L<‰"ϋv>3 fΎ»5. ‰“r+³ ŒfΥΔ±T™vΈyρ°V1ι26"umٝ˜cδ+Ȝΐ'Rό€ΐ4Βu.=ƒq¦~ο‡DUZ’΄H|fZ6y(VX–sΚέ^σiV…[― δΦyqξΚ’‡οε’sΠF«fb(qγ RΘ’6 ΊpηΘ.ί•4ceNς}ΧQ(e”­ΐΣ³„{[(ψ“?ΪΠ?ρzU[_Tω_)+ΎŠ7ωΊV1ωΥί漢»RˆΝI/fqΪΙΩUίδυ«•Όm,tmW…ΊΌ¨φΧ+&N,Ρi£"Ρ’i()e ΡE—nŠ‚G»‘ϊαƒqή]Ή˜…±\Μ…i›Ξ -§° +0ϋυ|Έ΄œΈaΆe“$šΑθ"%Ψά”C˜2ŽΞ‰@ζZ6ΓqFe89;­ΐJ%΄Ÿjδ†AΕ3η¬4§1χ·lSρΛ?ΡΤ_½SΥ†‘ψΒ^]kΥ…AκΡn¨Άe°¨Q•Exx³y1έ°8μĜζ EE”Pθ ΈΆA#Χ˜iIηΚ±SM›ωΆ]²6ϋŽD3-»Τ‘œkΙTh’a¬Ÿ“§±j»aε„!G]!<Ω?88BΧ1πsοηEΝυ―ΈΧ5Β§π7ψ˜θ'¬ h%‹bχeκΈ›ͺΧ―_~œJHUxΉ‚ηΏ˜Ν>8J«,tΦi?αΪ’[φX Ӛ’ΈΣΟs²Όƒ 3ο΄rE)π¬Ν;Ιϋ² ήΉέΆCNz o\­ˆγρM6BΆeφό—’©ο\ρΎΨσ?š]¦γψTMk˜o[ϊΟώL‹Ώφ{]uo;ΰΞΊήΒ3½“HŠΜ¦βύ­1Y&Z ΣM›ϋΫc™Κ1…Ψ΄7H9ιΕ(C€‹3’&Ό±'hΑ‚*LŠΤ&οnȘΈF£3©W,͈s(h銫S‘‹)ΘΝύπBgΰέGzγj8Yψϋ€7π»ηz}ΰF˜~ΚyφoΎ;δν‡cn­ϊŒ£Œ“^Œk₯ΰDΑΟΕs-»¬άStYŽτ±MΕΝUο Ι.ΫTΨΆ!“yZ—νΛTΜ»F©χ—fς€9έVΖό”‘οnŒJΒNΛT\]rρ=Ψ=‰Ψ>ε ?σS-}cΥύ’Εχα¬Ψς4!l7η:ŸͺeΪ S=?έβo|C›+‚Β+tηZ’2εX +/§yχ `kΚ49©ˆ‰v’`°:οΠ9βΩΒΓY¦δξΗέδ’=‚.]œΆ98d θ)Cλ‹’‹p؍/αFaΖΌ3TΛ³Ά₯4ηŒΒ$26ρνγ:€kHψ_ΆύNbυ½{#Uδ0Λ³ΫaΖήI\ϊ&‘TW=jΉΐe1Η fίΜi€σό–’φΛpœ–πY&αΥlΣβέΗc’X“iAZ₯™Μθœ{ΞΆΐse|Τ΅E$ΣΙα™G=α±kΦLώξŸnιλ˟ΩβŸ\4Ÿgw£ςWΏŠP^_EΪWbβ?UΣZ†ŠώΜO5ωλίθ©ϋ;Χ—=t¦9μΖ,Ν8¬Ξ»J€>W]zΡ)„σ1^Ϋ–ZP81ΕηΉmp6 Οιεδσp,ΕΙ₯™@¦…άδiIδΚ¬ (mDeα°0CΑݐ‡;!wxL΄,20τ·?κuϊΈΰB†~J~Ώoί•PήύӈͺopuΙ㽍1A|^΄ΣZ<ξΞaȝ+ͺΎΙήρEGΦ œΧ4G‹ZοΟ κ™94e±oΎm—$kΗεŸ£Ξ™c―šxΆ*™‡gNΊ1v|ΧΰΟ|ύ3[όΕΒ#Β‘‚’ό<:ΔΧύ–‹*Έ BxYlŸ‰¨WMύ+?Ωδ―ύnO½χxčeŸ©œΚ}χ8bfά\ρΛ‚]QxνJEˆ;ςΝΚ± άTη2oR,ΔL‹‚ςLSθΜFωL@q‚Ο`Άe³}–ζ“6έ΄˜iYάίΚqαΛΟ2 ΕQ7αF"δ₯ωSšˆΜΨο!Α>Nπ*ΒX2 hCΑξq¬~γΟT419‹²NΥ7ιζ½ΦΒ”‚(ύ§Ίύœh1ΏθEΆ˜‹nΖι$ΨB•ta§»FB»Q  £LHFr΅–v]/k!κά:ρ\‘Ώͺω’Κσ`'ΔqΏς“-}{έϋ¬ό§ΐΏ ό_BΘ1θρωr²ύ³<‰Vί~™uΜΞΛsDΤeσ R{Ηκ*τ:ύ„FM6ŸGϋ!–%Όg©ξ7«’ά¨ZΜ΅E’½έ°°LiΫ5kR3’α3§ρŠy[[<Ηΰ°cYFής“?‚mρc™|­ω2X«΄υΒb΅<ηβ9†ς=|™°Uΰχ€GεΪ|πO σώ€ΜOφwϋjc?R“…ς$š•Y§XLšBRG£h@ξ bΝtSu{ƒσΧ&™tLEξΚ’έ°¨WMfΫ Σ’Šγ^ΒώiLΕZπ$Wσυƒqqw;ΐ4ΰ—’©ίΌζ7§RDιŸGΨ`χ‡ΐ_GΠΟ"“•Ÿ+Ύυ ψ­g<η αΌϋ1>cΗζηΚNwCu6FgΟ1hΧ…L4Š…k°κIΥώήvΐq/Α΅…AθώΆθ„‘΄ι†9ˆΝsL‘›kJ-Ι6e\|*F™o suΑT<›w Š? 9„]‘hΥLΪu;ΧQ0ρ#OU΄–’e·ŸͺΥyΫ,™˜ΐΙGΰ ψ¨)ΐ2’θ{ω=Υ½­@]_ςτ)Ϋ‡‚Œ%δ.-_δΫG!Χ–«S!;βΏ \š&ώΰη‘ΙΚΟK Žμyφ©±Ϋ<Ο„˜Γϊ'›ό—ΏΣU{'KΣQ’‘E°0-c»“υ©$ΥX¦lPύQ><ζ,g’υp6™rΣTάΉβ3elΧ CtKσh/Έ(Ί’E feΞεΑN@o˜”ί²¦Π‹Χ6Έ·=¦Ϋ—ΊΪΪΌΓ—nψ“οχ+ΐאHΰCΩGuΡτ++έ~Κς¬K’‡ιYv>QχΜΌ₯rKΚΓPεOΫTάXρ#]ͺٚf1v)pa,LQœ1ΛθηώiL˜JW!g–έ;‰d0ϊL7mfšτ9¦Ψ¦z<ΪYλŸx£¦μυκg½Π~‘‰~š…ΐ +‹ ϊ«l πβ™υκΛ:ΐLΓΚ¬­αk ώϊοu•RŠvΝ€;Nρ\ƒ(AΗVά^χι d:΄7Θ£R-…ι,W›.ΤZ>οΏ±'9~Q¬z’^nμ‡7=€κ?έš°£nόΔΌ€Φ0ΫΆYœΆΩΨ₯Ϋ $’ώξ½7ΧΌ’₯3ΐ™όPQΐGqmdχ7)vn’ήΩΤLΣ"Œ…YY\<% ½AB£b²2'ΨϊB₯(vE(ŠΣ’Ž+Ν70Χv¨Έ2:η|omπζ΅ aά’ΊηΉΆΜΈΆ€;*ΑΥ—T "03ͺΎΙ£έύ“˜Χxόμ—k%ΥΨgh£<ώ Η9πγU·3ΰτ9ΐΛ<ΐLÍWτ—κόΪ·Ξ”cyΜO»tϋ‰Μ›Δ3-›š'l?–₯θRZ5ΉΗΣT— ΗνΊ(=—*ς‚τ”Cgt&t- [šƒ#)|?m^ΰΚ‚Λώi|‘s`(Ψ>ŒΤ£έΧ―x“Έ€? όΫΌ8»`Εό“γΎ~pΔΫG¬Ξ»Μ·… ³;Hžϊβι†Ε΅eƒΣ¨˜΄Bθq4Ύ€ΗΞ2»Ž"Θ…Ž’ŒQ(_ΚI/Ž%‚·Φ<)Βδμο=3ΥF˜…‡½γˆέγˆΕ›_όZCϋžρ2zύ³/x| ‘žβՏ@vήswyΙ °ΉYΡ'½„χU½"»ώ•—ή0!MσY ―_­δjSŠ₯Ω„ ^[―0 S‚0cΊi•x€"ϊ­x’ρψ ,£b8oΞ΅mν…e$Q˜FŠ–Χ–<ΞF)ΫGOΆψ£Dσύ{#u}ٝΔ¬ ΰ OΥΈΙ§GΎϋwϋ©zw#PZΓΞQˆc)-ΉΌΏ)!ϊeΟ'Š>1k .ƒ\±g*ΆwρϊΥ ³M«ΩTΐ0ŸΞšiΪ=δΛa8Θi‰dw½b–“[IͺΩ: ¨ϋRqn0 ‰vŽ€Eω‹_k虦υ²{ξ !ρ³ζ»OϋHΊυy°}ž¬gLZ˜{Ω ’ZώΜ—kœτ„ΥιΚ’K£j– ΅fΥ*7±£nΜqW¨Η^ΏZ‘ΣΡ’Šgˆ(©+χ\³j–D7#ψ΄°S²λ†₯7d!\%7Mrωy‘MOΣsPΐ ;Η'½„Ε{ςυψw‘MγΩ‡u?όΙβ? Έ»”]YχCnx\_φysD?©ŸΆ}Q―Z¬Ξ9%Ρgρ~£\·}aΪαδ,9βΡβ<–g€Sˆ8Φ|ί5ΘΠν'œŠs9ξζ”^Ή.όΝ;'τΨ:‰βŒ_ό±¦Ύz^ωYΫdA<«…?Dj.ŸΫɏωYΦδIg΄†ŠgθŸjΏς[]u˜³SœΖΜ΄,/{ Ζ©H½ηό…bΤΑiΜ /T_Ι§ 7B\[(ζjΎY¦λ‹^Ι9–€²jΎΤ. ƒQAaž€P―HGαρ~ˆηH›ε£μEΚ‘€₯—n_”³&f^GΪ¬ή½Φό€οŸε‹U½ύh¬2MIτ§š‡»2KmIΘ: PNa"ΣpkΥg&/„”¦-5›:φsQŠ'ϊjΎkp}Ιc¦ ΗΫƒˆ•Y‡έγˆύΣCIE·κ¬Ο ΡgI]bΆe³{qΠ‰yσš―τvε³A€<γDŠ7Χx~χ@‚Τ\^υ4`ϋΟWε<΄†…i[ύ­λzΚΆ€§΅Μ’ˆJ³Εڜƒ—ϐd™0UάσυŠI§Ÿ”€’X™U£χKbΫ’ kuΞαΈΕZδΚ\3ο$xެ fβeΕ……/NH•Β%ΗέD­ΜgΤ+F1)h!­ωΏŒ`I^hΖ,#i1gCΡΧ»0ν‘ΟMίίs{Νguή-&Jι%SBχN?a-—y6ΈŽ‘+τΘ[›wKΩν ’"MΑ€ϊξγqιQΫu™ΏVˆŸeJΎ6 ²R?ΎκœœΕ<>˜iZόμΤqμ—Jγ₯‘πužεΌ‹δΥΣΌ" η)V`v_πΌy$}|eLkxγͺ―·#ξmκΝ«,KC6"U‹q”1•O‘fZ˜~;ύDΊSŽAχΰΌυg›"gv’KΠOξ0­šΙ ΘΈŸ3X-G¨ΰφšΟΑiΜξI$±I"ΐ2ΰκ’0WέέΖB“o– όΒπ†„>Œψyΰfq:i ›ϋ‘Z›wΙ΄ΐv|&Ϊ2D½εl˜²4mcδσψ­JŸ‚εΗ΅ n―zŒΡϊ γŒξ 娳2ηr܍Ω:KQQ˜qcYZ I’Ιg2έ΄ΈΎβΡΞINϋ wBnzLΥ-βTso;ΐPŠŸωr]Ϝ 0Όl{λo#‘υτΛ>ΠXΘ‹#€d0θ•’?5Mψϊ—jμεŽ‹32Ϊ ²N₯¨}kΥ§^1™m …½Φ”3ώŽ-|”Νͺt & j5Rψ+X€βδbQΠ4ΞIBΆCI{/…¦†W= CqwsLo˜’΅ζν‡#υ₯>Χ(›HΚψ‰:,΄Ι‹γ0SƒQšχη½œΜ€ Γi¦…‹ΣN)ε%  ‹0HteΡ-Cσβ’€p±Ο4%lΟΙΑ#!clΧ-4)QWUΟ$N4›‘°eš©†E½bζΪ’#ε›}ηκgσύ φPCzθO³pψΛ>ΠηX8~ΑσV^φ>Ν΄†vΝΤ_«ΞίώΦ™jΥe&`Ί)„΅UOΒ|‚ΰΦ‘¨ _[rΕΥE,Ÿ π]‘Ξ2Y΄ΕΟ₯αͺ8}FK°β›Ό·1ΊΰΚβŸ’ΒΰTΓβήφΈ”SJqΨIΨ:ˆxmέ›,ώ]ΒtEηώAΐkΐΧ'ρήγ€w6$ΝhΥ,ζ§lφO"ŽσΚf–εμ;ΐʜΓtΓfη(d0Ύθό %žΕ‡Ξ )G ™iΪμG˜9˜(Iu)ξ‘i]*τ>ήkP•6ΛLKœΘ8ΜΨ> i7,ΎώΦKιχ?Ο <ŠχŸρx‚ή—} /°.pςœΗ $|%-ΣpkΝΣvο‡κζŠΗq7¦^5YwΚΣΩ0%Ž3ˆγΨ<ιjΎΙLS ΌQœρFŽO)fšUYΌ…χ_»a±ƒ}žΦ5+Ί³-›ϋΫA *,J4ο=ΤΝUOOo?ƒΜ˜<Χ>¨ψe&Θ>ƒH«·ŽΤQ7ΖPŠN?!ӚΉΆΝΩ0yβ ·"όΌ·ωήζψ‰ωώέγˆVΝbiF9‹ZBeœτ¦₯Ω¨J/¨Bι&Δ7―U¨xž#…ζΐtC*΄A”ρ'τ• ύ‹/kΈΞ³ˆˆσολΥ9ϊ‹vΔσυμ}^ ΐ³Μ4α'ί¬ρ—φ){' @ 'd¦₯??Υ°JrPΛBΠQ.4λΉΆςp'ΐΝ»TυŠI«f•΄cK3κC©Ÿ­Ξ (ξ4GΗNή›J ½X‘›yΪOžθ¨)ΰρ^H§Ÿ¨ιfIζ"ΐ ©Ν<Σ>ˆ¨"Xc@r’ύ“˜ύΣΈ/Κ=a„e(n¬ϊάέ_PχI2Ν£=α\_pyΈ\Μ "α ΌΊδΡνKšPP‚΅jκ³g'g ϋγ0γΦͺ/B‘Ζ²€Ε²ΎΰεΊmŠ8qΠΓ΄―-Ή"υυj-,ŒΧΡ‡gΩ]d‡εU;ƒs;ΰω•ηβμ>Άe™r|Bk˜iYϊ«―Uω½ Τ\ΫΖqdƒΫ<ε>΄7WύR—’«9–bΊaqԍιRϊ#8κ&,M‹²υΓέ v™:Ϋ²©ω‚\3 ΕλW}’X¦XΓψ\ΣbuΞeη8δ€—ŠF—7°ξ0εαNΘLӚΌ&? ¬#ΓeΟ΄βή@ϊr‘€ΫA€/hόeω"ΏnžύΝ1Γ<€QAηΓ]iύ-LKΫ ςrσ±IΓ­ΆB‘wfžΖŒ*Βάςh/,/x”ͺ[τΗ‹S"9 2μ¬ΜΉΜ4E;ΰΰTΨ~ς͚φ]υͺ2ωΎΕσgδwΫ‹ƒ/ΣΆtεYΦBΩΠgj$aͺa¬™X&ŸxDχΦuŸ»›‰ζaI*χϋΓ]Aφ]_φ¨x―­ϋœτ! 5UΙaY¨ώ.L;vbNzΕ₯I@Α┍;ο²±f’`ε:Ύg¬I{Π6…‘Έ`͊S‘ΈS©Ÿ₯Ωy-mο$VqͺuΎ)kdLψgψΐ/0Ωϋ2υh/|*3f’iξάXρΈ±"‘@AdζSUEλΟw₯έη倉i&σΠΝͺEo°Ή —`& wψ4*&§}Ρ’ŒΉΆ[.ό³aJšI5_Π\έaJ˜ς₯}eρΣό€©V¦©>ξ;Ώ† δΞρx‰ΎςɟΑ'f/jΞ!QΐGΎVi‡§‰κυε{­W =7e©zΕΤ9UίΗΆ\r\νN•_ϋΦ™šn iμΒ΄ƒ‘¨υG)I*b"Ε({­"hΏVέ’΅jŠƒΞ9Ε—*Α¬ΰό:qyΰΕsš5“[«>»˜“^Œmετ«m‹Μyέ₯cΦcΕ7‡ZΥ+j𧁐η€/rUΰ—Κ)ΡΊΆeΘR>€ΞEw#n­ϊά\•ήs ΞF΄†H?=Λ€HΰοdΞΰ΅°υ‚η- ιΞGϋέAͺzy}Ikθ 25G4λ&sm‹Šg|"ίp>0ΔHjeΞ)Υ ,ΈΈŽP‚νGw:}!” ’Œ…ΆΝςŒƒΤ|a΅ŽγsέΓ€Υy—(Ξ$ . y>θ\Yπ8¦<ήsέEi±sZ=!$ΉΎμqΤ‰y°­ψ‘[•ΙSωIδήz&ΠμEΰν'­aϋ0bΎ-$'½Χ ­βgΡγ/D›UΙ‹NΟ‚0cœ3ρήXˆδq/ΎΪ?˜n {ΟΖ^˜ΛtIεqΪ‘QΎ€‡»Λ3Z ¨β‰S:¦yVΎ˜―έ©κΕiϋΩύ•όCwͺ£N’†c9—C+‘β9OTp? i$ΒΊΌœηύs‚ΝW-‘σbόω9sτGω€(Φu’ |y’Ϋ'½Tυ‡ν†ΙlΫΒ΅?vD†c)ύΥΧ*όΏΥUνΊE³*  0Φ¬Ξ:₯Δ7κ\8δώΆ„συŠΙκœ‹kKΡΠw+τ†)½ABΥ3iTLήΟ‹α“χŒm*-IλΡnP²c]Ά’ώ0U7ΉΊ(ŒΕvΒ8So\σ΅e^H~œαΎŽn4@’j5΅‘ήZ˜’ώώ(Ȉ“ŒώHP{a$€ΗV\_φ‰bΎ)d½ mΐΫk>K3N9 rwŽ"ΦXυL «΄δ;'g‰ IdPχM¦6ŠE«fD‚§ŽbΝφaHΝ7ψΚ­JΙ6όQM!»ΒΩ0U‡§)ύQͺ §₯τϊ©κΥSΪ’ζϊaM#θΈ7€ΏφœηέC0Ÿ)ΦΌ=;Χ(>jΎΙ½ν€Ξ„"QΥКo%+9θG°‚1γ,οB(Vηfš‚ (ΰΖερfπx/T?r³2 Ί†D—Ϊ|ρΪq΄yIΪ“/‚q˜qokΜυ[k>χΆϊΓτ‰ErΨ‰K (‘ΑžΊ/mœbœΧs€¨rΪ—! ­5¦ι³0mΣ&R'Θ]O1ξϋώ昫K.‹Σ"ίTTh»ύ”Χ―zzαΚύ[ Sχυ’›π¨“¨fΥΤσ‘’€d‘tŸu?"u€WΡφψ0ς}fκτ,}αξ_υ Ϊ σύKρζ5_ϊφΥLKΔ@νά¨Κ½; 3ξnŽKeŸZEs³& Τ†©Xs8=KθεZ—I dZ³< Ϋ‡!!­­ωfžϊΚ¦&d2Χ¬šμEτGU€9ν^qβ»Η1ύQͺςHHηΧώ§€_Ϊω=Οό‚(Κ”ΚσίK’J‰ηύ퀫‹·V=aO`ο5 γŽ‚Γ°ym½B’Θ‘‚”γ΄YξqZ:’›p{ΝgΆ%s9η‰$“PƒΉΜΆmΙ(IDήΌ^Αϊvu˜ι¦₯wβηވa€9ξ&jyΞώ°Ÿͺ‘ωMΰέη<οmdθΖαΥͺlσ|Δِ·ύž(–]6CΑlΫԎ₯>q§ΦpuΙεήrpΣ¬™D‰¦^ŽJ₯(wϋ ΚhT-ŠιχΫk>Γ #I4Άe°s$Έβ\[Ιh{±u•ŠDΗέ€TΊr,ƒfΝd}Α%M5ƒqVj&9 ˆ€Έ„ΒT|z–ΘXσωikω ν€g9€ R=δ€N“’aRt»ΏpuΡεƊΟγ½ΌHW(dΑΆ:3[8Νί{<Κwϊs•ήυy—αX.dA fš+r‘ΆΒX΄ϋjΎQ‚/βDsΤ‰Y™sXs>±ΆΐTΓ€s–2 3žηNΞRΥͺ›Ά-Xΐ7ίDtžeχ– E^-π"­ϊΞΕN>ΕΥ³Aͺž·ψ΅†ZΕ U7?„wή·Χ―­{|λέ‘ ΕξQDe\]ςrΎ Ή―U“G{B’Sσ%"˜Ÿ²‰Νς¬ΓI>”–iΝΪΌ‹i ω势Φδs1͚Γ0Ήa†wέ$ ¨κO0b=Υ f[–ώ4Ό4psΥγ{χΖ„‘¦ζ έWo˜Ζ² ο¬ϋ±tͺzƒTFδσΙΥή ε°1Υ°Ή±βΕA¬iΧd@¨άT.9€ŠgH»Έ·5f”“Ž&‘>ε|½–;£G;‘Z_p&ہ‹άό;€7˜ΐG±VέAͺn―ωμD9Α†μμ­0 EšjΖQΖγ=‘ΦšjΨμGΘΐ0glμ‡\_–]ύΰT Iͺιœ%¬Ν;L5„yuχ(€ΣOΈΊδ1έ’…š/’^¦‘Έ·5¦^5ΉΊ(αQ˜ͺ™\_q?yœ8Π›ϊ΄—ͺ˲䓦τ©:¦²+}ΈΉ…Πf=‹Yχ )ώΔ'|zΗ^Λh„"μU±ͺπ‘Ζ€ΓH«£΄ύ,fΫ&¦ωρpΔLn­yόνoυ™ŸΙϋ†Ζέ~Κβ΄όϋΦͺt΅\Ϋ ?JKψΊΞDŽ­8μΔμΘl»n•iBo0g,ΝJ‹πήΆDOΫp σΣ+³N9°FΊ  cΊy‘ψ€΅‘uπ4ΰ01ό£€γnΒ£έ0/δ‰(ΪrύάKOς‘ 9h€ΒγϊŠΗύ\Υ€™& ^ΌsΕ'ŒeχίΜ)”_[—ΒίζAX‹˜¦b!‹μτ^ΏβscΕΗse,¬¨άZσ>‘ΦίΣLkhΥM}zfΠdκyQΐ`”qz–ƒ2>ΰΫ#3·x~΅mdΧuy5κ§ΰYf!ŽνΫQχΕm?ΙύM]«|Ί»ωyΐrΞυΧι'’k§2ΟΏ:'*Γύ|½"E»FΥδ°‹ό\²―Ξ‰.αύ|Wο Rv̈ŠgΠ¬šΜΆmVηL”άfΥb`Hͺ‘N$†­X[piΧ-Ά#φOΟρŜΒν΅ μk―!Qύ…™§9€Y€]žψΖ~ΘΞQHqǏŒ«‹.―]©°±LL:[–Ιλ/y<Ψ ˆr&Ÿι†…λŒ‚ Ο1ŒS弁 b kσ.gΓ΄$ ‘΁ζΈ—#‘ʐYνzE.t»a²<λ|ͺ«Β4a¦m1EΟu2"˜¬™Ϊ±?P ηϋπŸ=ηyΠΝ2―†xΐγRη)β Ϋ~ Ή»nΚXπgα4T}C―Ν;<ά • eǞnXψžΙցΠyuϋ σSBΧm[Š7V8κΖ„ρΨg"€O3-D#‰fΊesz–pzΣΘ™³ CΖ2πv6”βκœ‹ij°w‰CkΨ?U’’E*D–Wψ`ά(ΉOcEΣ2‰wo+`eΞαϊ’‡ηDμŸ/ˆ‚ΠCηj+­ΊΕ+•’ΉΫOΨΨŽSU‹›«³9%3ΘnΎ8νπΪ•sρΩ0)#ƒŠgˆΪπ@½‘δOo\υuΝt>΄†FΕΤՊΑΩσ’ ₯-Έ4ϋ‘Ϊ‚oρόBΰ>π˜W‡]g—ηcκ|@τb¦QΏ B«U>[1\[rΉ· ‚­CιΌ~₯ΒTΓ’“‡ϋυŠΙέMΗΝ4-g18 ςa*Ÿb,rώ$Ράί‘°4ΖΆΞ1ͺt )½ƒœ“Γw^œx'½„q˜©Ϊ9cp )^ΰ |šΈiEλN\β1SˆΧΪά—Άάϊ‚‹η<ήΙ2η4ͺVΙΦ›€dpmƒ{[cΊ9N@&ΌφN"VηάRo}yVΔ; {Η1{Η!ξ R,J«p4b~J.Ζƞt.Ή%Ϋ§i¦)»Oψβ:ιI[°κ}ΰΆΰM$x΄ΆΌΗ%ŠΆ—h;<ΏΈ7ŸΟs­™ι½ νyψο4²ϊΔL#”σΟ`eΤ-“fΥ€Ÿ·Έƒ(γφš_ξθg#ι˜tbUυD±€ΈgΓ”ƒND˜bΫ7W$’ΈΏ\˜ˆM§ŸΠ&¬ΜΉT=“ƒnLšiα%\–‘Ί0–™ιΌ₯‘¦'#ΣE˜h ]¦ φ4πzώδLgΓ”Α({j/&ΣR “^½OΥ3H2rω$Ή§ύ‘,ψ+k .ΑV ½ώόΛά;ŽiΧ,^[—NΡ8ΘxkΜLΣf¦e ’0§XRJΈ,S±8-―ŒS5“…iϋ3 λS;v’’ψωεmΑυ…ά\Ι<ΛΌj…ΐ1 @’ΘuJS^x”‚ZΕ|‚BλΣΆBLd~Κ¦s–ͺzEiΫu™x}Έ°:ο²Ύ Εm/Os§›­ΊUJŒ·j&σS6·V|†a–ΛƒΓ½ΝρS₯Β[T†[5‹G{‡8gΗ­ŒzΕ€κ4kN”}]8a·‘”¬ToΊμ€UZAηDη»ψΰZE<`Ν7Ρ™œ°m<ήΨ?‰σJύy˜σ`'ΰφͺύe»[c’XΤ{η§D^Ι΅ ŽΊ1χΆΗ€ωTߝ+•RΆ©φlT`€rbα8εϊЧλΥΟ¦ Dώ₯T}C‡Ρσw¬bgkΧ?P[P#mΐ[ΐχžσΌwaQŸ—WPHEωƒP{/z£Σ³T FΩ w„\Εϋ„@>€†ς6φΜOiNz S YFE \lxwTΨΟ1-oHxήι'΄λ·V}Μ<ǟŸ²99KiΕV<ιο;Ά΄½»Γ œ7sf%Ϋp£jrmΙΓ΅ :g +sφδα―#΄αεθφeΠ@ €\ίq˜qcΕ/Α<5_rΧ‘θQr؍KFž΅y—ΉΆS Lφ.ΓHƒ…jPΑ¦’€šΗϋ!Ά₯Xœv¨Έ2σΖ²ΰ—gedψρ~ΘκœΛʜ“Λ)I„%BψIA?θPσ :gι Ÿ›¦pΨIT­b`ϝU/F8ίώ?Οyή€ψΆΖΛ-†ΰσl‘`‚X«£Ξ‹Ϋ~ ›λ(uy '¬5,ΞΨd™€q 6«Ω–MšIjΈ{$ϊK3λ .J ­Ψ 2Α»d<Ϊ ρ]ƒ™–Ε\Ϋf€w’|=XƒQπlό‰™·—gdDώφˆ³‘£^Ώζλ κΎΉόϋx¦˜c’b›Ιl³²L A@rΓNΜΞQΔ0ΚεdΞύ`'`mΑεƊwabIημ>†R„±–Ύg¬ΩΨ9ξΖΔ‰Ζ4…ώkuήas?dyΞ₯κ₯δψ$›πΑiΜΒ”Γq7Ζ±K36Ÿ΅U}‘rJΣηߊE[°s–2Ϋ²>Ȋ}“§τl'μΨ@ΐΛ2…“^δ^Ψ<ξ&Ρ_Ξ£ ξ»ΟάςΙ>έ›jfΜ΅lΖ‘`ω—g4šξ %N%w_˜ΐΟ΅%š/½$Υ¬Ν94kχΆ€ŠίιΛΠ\½b–Ϊ„Ε½υ`' H5 'R²­Ν»T}“½“ˆƒS™Rμτ’(SώΉhHΉgΎ]Όώ²XABΠΌ Υp,ΤEγPδ‘š5“4•Cš^”7)nμΔ±ΓΥEΫΠCΝώfΥdflμ…2ά%!BšΒΦaΔλW|ήΈZažΛzΟO9Ψ¦b.o―΄j™₯nΦ,¦ha}’7‚c+νXJRΝ‹nΗLΓQ'Uš‰c½±ζ&ͺ= `3@††~ξ3<ε§Y‡ηˁ[<‡@!\ §½·ύ&_δ:ΖgžOšm)ζ§m½wœ¨χrΨ‰hVEtiΖaλ0dyV"α{ΫcΪu‹εY‡vέb€΄‹šΐD /Ν4έA‚η(¦6GΣ’₯ϋtϊ Γ #M3ίΆYžΌχŒΟ μΓqΖ(Μπ=tΩfΎvω š΄5ς|MεόοlŒ9ι%yž& ͺ«s’ˆϊx?€?NŸΈω³L°ύJIδ0Χ…•ΑX¨‹z!UŒΝκœCg9½˜„1fŽλήΨι εΉσm›•9—νΓ°,Ό ™“žmYψξgΫrm8₯GA9©όL+˜‘Orι©ηXΡ³]αω»Wa4ψk<³˜i™φ‹’;ΠΒRy™&|ύ6χ’R/`yF:aΫG!νΊE½RΑΆTYλ*δΕnψ9g`.0šw­ŠteVΖΫ7CφO€ϋUq Ϊω=?ΧΆ "U})ών h²€ZΤΗ£Œ™ζ…<ρκδΉ\vλω5ΞβAΖ9b―ψΒNcγ”υy—ΧΦ}ΆC;q™Hn,詆EœH‘―7HŸE<8psi0Ο‘q_p«-NΫΜΆlϊ£”zΕΔ²ƒqV’ˆ€€#i¦Y˜Άυ§…ώ{žJςΡcΗέT΅κ¦ΈΖσ"–&R±ύφsήκ„Š«ΒΛ«μ2QQ~Ζy<TΜLtι‡š™RJŠΠ/Σrύ’T—iι⌝+PEœτ„$΄άr¬c υ·lŽ;¦μDŒ‚Œ•9™1xt‰μcd Ζ»Ηuίδκ’Η•EW”Šs(}ΝXςdα=Ι#υK„σ«L€—“@1™―)žΘ»‹/`dάέ X˜’h ^1Ω;2ƒ™\π ˆ2φO„ ΄κK%s}Αec/,%Γ²L@?σS6Χ—=φN"6χC‚œσόΪ’‡RνΊ%ƒ@Aϊ5«2λ<gJ1›³ζΛ@ $σΓάΑQ>εΆΆΰθgΌ t~ ψŸσV‘ψκK8σΒφx> –Ÿ°$Ν§ύ>@ΫoT‚y©&`0lK1 $B΅-!Ε΅L M3™νΏ΅κ³yr6LΉΆμε¨WΑΛΐžΫ«>q*3χ·Y{w£9WΆLΡΘ8 TΈU—τ:I₯υή$ Ζ)a€9€—οŽEdΣθΑEΰr‰Έρl˜ΚœςS.@’ RΙ0λσBc€s–ί{[QɝqF–ω@<Ϊ QJˆ ¦œάsΙϋΖy>]@#§ξœΖάΉ"αΣ(Μ¨(ƒξ@†vύγ“@~Tϋ°Ε(Eήl€/β―{ΙΩ’g<~ˆ―ςςlσΟ!…§ g©€ΞYͺž¦…χAμ#²/b¦Χ1t£jͺB™ΊPω½±βa˜ύx?dqΪfmήEηχφΖ0+ΨD―_©ΰηΨ™’+Φ₯Ψ²Ϋu‹+‹ς>χΆzƒ$§FOΩ9VT\ƒFUdΘ.zh­ι3LS]ŽŒgΘμ ΰ3!A]p±ΨbšPq₯ΨΡnX8–βδ,.ΗavNα5ΡμτξnΉ™Σ‡Y&Ψ–Π€I‘Πΰ֚ΟBΰpԍY›†Τ8•vK±R’e™6ƒ±Sͺώ§ υΝ4ψΠ©$Ÿ¬ϊ¦~N8{aΡyΦ¨ν)ώόK8νπ"*πeΔ‰]°0ΦuR5Iρύy3Σ€ι¦₯·bε»Fήβ—’7φ’T³}$Ϊ‹Sύ‘hdDIZ‘ΉΆθ‘Όύh„‘‹3·Χ|ϊΓ”ύSi½Ο·mg„Rlλ0,§‹υ•ε’:ύQΚξ± ­Ν»ΜΛ„­Κ4“­ΐ:​ Ιm“ΦP―ŠBIQ`hΥeα{Ž! ρ,Ι9ό€ς8Χ–” κ™lμε-ΐ‚Η}Ά%Žβݍ1ύœe¨7LΩ>ŒXžu˜iYX¦βήVΐtSͺͺ͚IΥ7ASFY&**ύ±D9>ž}Δ¬?ΚθφS5ΣzjP8¬ςόYϋοσςΒ€«=pάMΤψΜJ―Ό)ιωoμJ€¦‘ •ύ\Ϋf8ΞJqΠ»AI†³sά‹KύέΝ ¬ήŸ κU“ωΆΓ­UT /αγύέγθ‰6ΰδρ UY/UΟ`λ0δ £ΈsΕSŽh%h•YΦe&@-–ΔI7QS ‹™–U²vc6B†γ,W-™υˆB“tg½ΒΓ]Χ*&K9qηΩ0eο±,τω))œ$yŒDΒβΨ&o?ΡιKπΖΥ ΅ŠΙ£έ€ωΆΝTΓβl$¬+­š©?‹yπOΪ€-˜¨FΥΐ~z[°Œp~σ9oσ.RόPt[Ÿ€)$„|‘ΐϊε ƒL|˜Άί«jšΉκo– 2φΚ’GΥ3ΨΨ ˜iΩά\υπ‘¬ΫΝηYfσ.ڌ“|FΨ΄3 έ~ŠiΔ΄κ&:ΥΔ Μ΄€@~ΪKγμ GPσ –fZu‹ή ε½Η²ΉΞ΄,’Dγ:%c’ΓΔlΖ€˜ζ΄Τu :ύ8χdRΑŒ].ώ§ρž SήΫqeΡ“P&wA˜εϊζ’‘H υΩ–ΝΚ¬ΓΙ™Pz·σ₯!©„vΞf[B‹!)Ψ€?o@!mΦ“^ΚΒτ#Ω9ίzΑΫl @œλ|φ‘@—g3ƒTš&‘;½rξσl'Σ:oig2 –‡αgΓ”Χ―ŠLΧύν|Τ='Γ™m‰˜­aΐtΛ&J"ϊ(0,Ξ:,Ν8w%δ·ςβίΒ”Νβ΄Cη,α¨+ιmŠnα\[IE} θΚE±&Ž3dΌ§Ό―ΚΦμεΐ…s’Ο{[[!i&ΰ‡ΉΆΐtSHΊƒ‹RM…W2sΊbΗ–ο ξm«δ- ξo‹h£jb™ŠνΌŸ9U·Έ–sώΝ΄lzΓί5X™i°’¬±Λ—kκc5 Ž»‰jΦ *ξSӘΧy›knGΟΫυ—pβϋΌX  ,*Μέώ‹§ύžg―’ίπ\#.‘vΉBΊ¦©°,YZ §ΰΓΈΊδα:Šw6F8ΆΑκœ€ƒΆς¨zu^ώΏy–C?Q’y| Έ€vΓΚω2}Ριt†Rl„χβ PΜί$©&ŒŸ¨Α–©ώ€¨“» TΞΨOH³σžβΞqD§/η+B{΄s•εZΕ,Cτ0–V!ΐϊΌΛΥ%G{Α…Fq#Τ+aάˁ'g ΣΝ”υQPέΨG±<λ&Τ}“ΑXΨ‰^f°ΈšΗΒXsάIYY0žφ^7ΘμYΉφΑόŸ½νσlΗ²‘”EεΌνGς!Ϋ~O³WΑ hΙΝ΅ο*M5S ‹LkT¦ΈΎ,‘Q7ζΰ4ζΪ’DΓB`kLPη ~±žt&Qe’β|ΓX˜~ΒH—g¦%qߍ‚X„DΚA”]ή€ΚΦμ€˜e’`“fΊμΧO^ψQ˜ρp'ΰ€' ΎwΦePΘs Z5‹ ΚJΪ’Fδ,Ύ·ΧόΧΌ<+aΛI/!ˆ²ς§‚‡zYΘΆXY€IDATQœ•θηyΕ•”Β±…ωsύ?qMOϋ©j5LΥ hF„Πλ<ΏΨφ>’ΰζΗ΄m^ŒhηΨνgͺ‚i?₯^FϊUXγ/΄‚ŒvΤIΩ=‰xmΝΟΥ©γ|0gΜλW+,Ξ₯]oB<'ˆ2Ίƒ„ΩΆUςšU‹ Μ.πh-˜“ΕY'gΓ”£ˆ4η3έΥ’b¨7Lr­Œ¬tΡ”"-“ :yr²ΰxΒέ*r‘ΜQΒaGΤL―.Ι΄ηζAX Nξπύ‘%-»" ’jLν…œδ_JΑΪΌ[¦ƒqΖώiΜς¬CαaζΫ6–)ΣTΆυα‘x―’%’κ9Ϋ‚u€ψ{Οyω»H(ώDΏύS4Ν‹Η€Θ‹“Q’9κ$Οmϋεόϋ4k¦ή;~Ύ‹z ―§˜i@Ε7τh¬š²iAηΥ+ˆkΦ,LCfbfsA‚Ak!Η u€PΨ¬ ΨmΊi±{,¨ΒLk¦›Β=¨”Hττβr}Ž#φOΞ‰wΰΠ€tϊΙ.Αάͺδœ—@r€Ί€*©c+¦κ³mQλ9ιΕtϊ)ΣMΙMT³w“\RsI3Mi¦κ>Ϊ 8κΔεsv#κΡ:?μΉB¦5͚PοD g9qυ²¦Β>¨)ž£BύΜ{ΆΜ)ӍRΰBη_‹ ‘B`ƒΟfY(D ΰƒ΄έB7ρEm?CΑάΤ‹Ωœ_uαJΨ¦"I3at­I‹|8ŽŠυύX˜­‹έ㈹–ΝκΌKΕ•Vϊ\Ϋfχ(bχDBp*ΑΒ”ΓκΌΜΡΔ‰ Ί1»ΗΡ8”¬―N?‘;Hd6lVggjΎqΉHξπPF)p¬ΜΉμŸη™ο›Μζψ~”βτ,ζaG˜‚3 §ύ8―δ»4λ›ϋ!g£CΑTΑœjέ·ηHΛ"ΝΡ„ΣM›ͺg2ΞR ²”RJINLς}{Ϊͺob[κ3ϊ°ΦnXΊs–ͺη© MΆ-σB[πu.±Έ\²c„ΰ&Ÿx±X!ΏΙΖa¦&a—MFl έͺ›ϊEό «‚ψ › &‘δε£0₯Y΅xgc$ Ά@ΰN㲇Ώ%B fηύύΌE¨ςΏΒH³ub2€q »ω‹¨ C8[5SΊ½˜nΫΌLα#ΡrPZ’j¦³M‹qθ„2άι Mq”Tΰϋ'B ²6οr{Νηΰ4Ξ½‘ΕΙ™ ƒP†‹βDΘ,K‘e°2λ°wsrskΥg}Α­΅Š.Ν8RoΟΑDIͺ±,u9d~ε¬Θέζ¦L½ΉŸ=“Ε’h Η™τϟw ΙٞrUψ―|F§TπœΌΰyε\‰a¨ηVξ,ζ¦,¬Wό»|Ϊ•π]αωΛ΄.+πΆ₯P†΄―‹aΈŠ+…λ’3&ΉΖlΛΞ§£2²­x«sΒ‚΅±Πe,LΩάZυι dx¨Ÿσ -pΛT΄ Sv9|w7ηX˜±/Χ*διΏu~*kΕΒΦH±Ch‹_ό4 œ?Ϊ Έ΅κsuΙ%Λΰαn pβ=χN"Pp5Η7‹τΈxΙG»·Χ…*ιΑŽ €ήΌVA‘‡2 %šάW―”΅λ–>ν₯κl˜=w' γ .B#=Ϋ+mΏOΫLS•Rί–©Κ.Y½bRρLήέ3?%  ύΕœώξήVΐ(HEΨcNžΏuRυLVζ’DσώζΈ\θΕΰόΓkλ>~’w2Zu‹…iIΙ;ύ„=aάΞτ3o†'ΐε“iΚ"DœjZU“…i‡Χ―Θ‡οΔ Ηih-£ΐS !>°-™XͺεϊηIͺ9κΚΨ°Φ’eΦΜyώŠοΒ›•τβ9ηYk’DΊQ"€iͺ%xMΉΛιa©η±OΒ jH!πwžσο"»r“ΟΖ^„¨’crΚk=Ϋ298MΚT@ηΦ*†žŸΆΟ'#?g^@!χ½‘ ŒDΐσϊ²ΗΒ”Γέ­1ΎLζέ\υxγŠΟ(ΜxsΜ0GνG F)Χ–<Ύ|£J½*ωϊΦAˆižοπZΛ<ΝΩ0‘Y½€7Uˆ“ Η28θΔ₯ΨΘ$υ˜@ζŸπV~θO—“’”T%‹Κνq/‘3HiΧLg€ύwz–°1Ž2jΎT/U³„>ŽΙηgΦζ]š5³$2˜kΩ±ζνG#BωΩNΆδΏ£L9ξKGζœ‰cj(ωχ8ΨG@ΰϊyK2 Aςυ«)Œνή»7Ζ7F4š„ΡλρkΒPΒMαΧRz(*6 }S<Κ0y’€ΡHΌ“4{>ΊΓ…¬‚Ή²Žkk©D,t4αέ­? ’tίΩδ³QVρ_ΝK]γ”). v:ξψΖΉυ‹€<Ψ³‘(„k««6ld# ‘«°!)!Ζα½Θ;ΰC<”€Ή²&Wb8Ž\†£σ^Q€zY•ΦÁΧΑiΫψOέ7―|BŸz ίhJ8΅ T ͺ,ζ9]+^"ŒH;—L>ΑΜWtxΎD₯ΐcΐΦΗ,ΎΔx˜ώ(@£ΜΒ%KNςEώβ²Θ₯UόΏz”Žπώ†.Πμy‰φ_.­ Qpe…‘χ‡m/‘μƒ|ό…zδπ8ί»Xx › K)P*ρΌlΟφΐk—ΣςWΎ˜ƒipw[FYΕυ5vϊω‡ίιP«η#$R†‚#›%ΕγΡaΪdρU‘dc‰e‘eR„Όΐψ•·‘Vηtw}9‡†Ί.PΙ³Λν#~m ΤΪ|ΔΟ]p#π7?O+ρδ @Œ8JΤϋζΚΦζ Tσ*vŽ]\Y5λίJ`uNΗφ‘‹ίaβ†B6_DΨ9fXρυ΅TB"RUV9 ε³aRς?³υyΗ΄uψc^2ζp_π‡yΊ[ΰF`α9Ών1―Q°Έ¬ΐG€(ΦφτPr)cθBZ‘ĝe0£υήφ²ŽΥ9λϋΚ9+ ­ž‡α8ΐυs)dRⱟ;κa‘ͺΓσΓDPτQί[ρ…%£+cΈςτێž6Ω$¦κΛΈΩvu•=Μ&NˆbN…BΐQΧΗqΗƒνΝΪ‚ά±gACkσ^9ŸΒ……ΗšΒAr4 hl Ahυ<Μ•5€ nψΩO4••…σŒ~‚όx£/ `l3RMΖŸ%δΣ6‰ž’ωψ75αɍΐmpj^|&―ψθχ1ΐ“1σOρ\Ÿ‹π< A””ΐχwm\[±Π(kΈ»Ν6^c'ΔΕE ΧVΩύj―ΙfΊΜ²ΰΥ‹ zFd0 Dδ6ΤφpΨ>‘#Ϊ„ri•‚†\Šύ8›]͞LŠpqɘΎ)&ˆΜg§3€ατ Ϊ.›Ζbƒ1–ΉΣχΰx!vΫKpGΣΤ4•0˜„Nž|H 4ΚΊ¬\Šη¨L’ρ°R7plόb5 Me†πΖπQξψ0Ά=wЉKŠŠ9σ κ“υϋ?ΙξΓUp&0zΔΟΫΟ3š`ΐ£BΗ§ΗΉψΉ†”HΖn1‘ΗΠ(‘΅w=ΎχΗ6cgΚy ϋMwFΩη°γαΈλ#c=ήΦ~cίΕΖ¨5ΜWu”²*vŽΨnˆR–Ι@šJŒ¬οΫ‰cVβ8{LŽΑpξ‡oμz£«"˜hpm5…ώ8ΐQ‡Q±0ˆ” ŽωΝ‡mvR„ΔΕ%γ‘,20 ƒ–GηζY&9—Vπ`?Dl#Άίbs’σ &BΙτGǍψ 1hv}4ύ™U„,έ-%δRCΗ§ˆj° ξ¬?βηΈψgŸσϋ8Β£§oROeώyΗ ™δK€L–ΠΩ ήYͺπCK5ͺBΨ<°Q-h¨—tD 7)Ν}‡–κ:qΆ­%pΨφι½{cςC`―ε‘?pqΡΒΥΥ‚€{-ΖμΨN˜ΐηγ ύτ؏Ψf°ζž/qg›Gz§ G‘Νq­Θ2ήndΦπ±TΧΐέmVώaS‡vŽ\,7tω(Μ{χΗxχή+ ΛuΝ.›(ψw8Λy–^Š•†U… «Ϋ Ζtzͺπ‰V/¦|Θ"oχΚ₯”ςŸœαθcB‚§ηπθ ΰF ¦u?―wύ$/€¦t>Ο!7‰εΑωζΦ5ΒΖ>ϋ²Γ•Ϋ qg›§Ηf8<Γ—XͺŒB|x9EΉ΄’΅‘φŽ=ϊ½χΡμω0"X}΅ΐ§}«ηA‰41Α£υΣχ3`hgz’ώΜ#7Ua Aό$>~wΰ'ΛuΛu@U ͞υ=;‘|"£Ώγ>ύ‰―εε\Y;I™‰Υqo<˜ΠύtHΊ*K)θτ=Xc‘ΪL0κ|TςάX‰ΩŠBp=Ά>*AωPw{$”@žhi*6AaCOν)Jη}―α€ψ{yά°V_ΟoΨ~ΒΟ«ψδI/4‚ΝkS†€iˆ€/N%₯†&"h.#φš.4•εΓƒ8ξxΨ9vΰz’ξο:Έ°h œW‘2lWβήR³λc₯n RP!ˆΠξGp_;‘œS1_ΥQΞ©Ψo{8ξx3<¦qζ&θΠΒž\4Σ₯Ž#žΏO\,`κ°γIdS «Ž:.FSx€­Cίw(Ύp1%…ΰ/eμ„p\‰wξŒ) Ω%Ε8λΘ₯Ψύ€”c1[›6eSlχ}Άo Άϋα΅0K@’ƒ"ŠΙ9Νn€ΉŠϊτOώ|γi»x~'πΣ`j`ΆΩη>|δΩ›‚΄ϋ>4•°XΥa‚I>Ά‡Ή²Žή tΕ,[|ΉχΥb"`ηΘΕΞ‘K‚ΛΈΩˆΕ€’xοΈαHβ¨Γs­¨aΎΜξBϋM­>[ϊ©gλΨ&NM&wρΏ±:οΓΧG>£`©Ζϊη{Mv#˜P/j(ηSθ |ΆΉaK…ޏϋΤξϋ‰λi9―b±j$" 77ΨG­Ωσ‘k...±6€γ±Ϊbυd¦ͺEškƒ³ΦGOΊJ “λqX³/mΎ@ιρ“Έζ< ‡ίpΐ+Οα΅ 8zR0Φ–x._Χ§₯%CΔυΏλqI*%πCΩ}άΩ™@Jΰʊ…Υ9#iͺ·ž­ΤΔ><^C±΅^½€ΑΠ/aκ=›Kπι“}ϊ½x>{΄zμHΌά0P-jθτ}Xζ™1c7ώι `ΥΈΛnι³ΏhκsφμλάάΟΜ$ΫZ=… ‡¬XCv1½·c£έχ$‘§?₯œŠrNƒ”!‘₯˜„|FΑ` k)Xοš™OšJ x’?>­¦( MŽ]zœ§ λ±ZΟʜώ‘ΉςΩ­…pƒνQ€fώžςω¦ρ$'oχΡίθO–_Βsf%~Z8 qMΏŸLJIΐ@ύ1Ÿμ―‹ΛΛ\Ÿ­Ύ[]!€½cnΤ (‚;ψ²ŽB†}ώμΪθŽm»Ϊ0pmΥΒΖ>λlœŽ˜\εD–|`ΎΚζ Ήτ Q?ώι   Ύΐ©*$/-[$‘?bσ|€Ζσ`σi‰'Š”Iš=ΐΕE+ι’#‘Π*,wI™29FΪRp>ςPC m)Έ΅9©ΞΟ³Wϊέν J9 2χT…ΠΙTJ Ÿ‰Θ9ύGT²I@…a€bξ£5ŸQκ7ΟƒqŠΐ_„άχΉ ξ.ϋ )œρΔ:OΪ~&0D‘wfΐ’œέ ƒΰ&Nˆc•Ό†fΧƒ©³šυ`Μχ2ξD₯τ~ΛMΘp±%Ψ½½‘Ÿθ ΄ϋ>&NΘ:+φš,–Œΐδ3lBb™a(qΤv!α —’Š,VsJN'ρ_[^ΙjA£₯šΑM;_b#š1Κψœxˆ&@£Δ²G͞‡c1‰αΪj*!1TςœI<Ψc3ΔVίΗΘ°6NJͺ›‡†γc¨”σˆ’]²Δ]PCθς|)? ±$’‘Β`ž1AŽ Œ‚–κ‹#°Hπζ|ΐο<ζqwΐ)^ήψ&ψχΑ€έθ±9ΐΏ ;žήŽyΚ=" °ΠΗϊŸ•θ ˜Ίˆ¬Έ%ribwྏ”ΑVwŠ wy$ΎPΥ±:oΒρ'Œ€L¦Κ—r*ϊ#¦!ΨZoθ#˜ζΣχάξνLP-²κV6₯ΰ°Ν†Ό±[WΜΡ9h»IoaΎͺ%%J>Qτΐ`’δf,ξ ~Βω΄‚…*γ‹ϋ#–(ŒƒΘ€ƒG K5ξbξ»8hΉ$«χ"Ύΐ|€jͺ Βƒ}gΖ ΅7 ’šŠΥˆbΔ΄₯ 3π±\7˜$$?―©œΨnHΊφαO瘫^)(ΨoϊmŽ&!š½€eυEί£/αρ)φNτ§ϊ˜3π―ψ{§~ΦπŸ‚‘ΎΈ™8½ ΔYβ£"ύ˜Χ}fAτΒ§2!Π‰šJ¨δUH)ωΰgΒΉ”ŠΝC›$€ν#†&p~ήDwθ£RΠΰz, ΣΘgœ›7!„‰}'1Κεd„6ŒΤKΚy R²TψΦ‘sΖ\FP`uvH6c9ΜncLν "’kήݞ° WΆΉƒŸΟ(lή₯-Ρ$D£¬%ž~έ)B,Zxάυ6ζ*¬xR/²ˆh«η!”ΐRΝ€’76Ζ¨4\\΄„Γ §Eksκe‡m₯g½‘ώ(H,Γ?JT ͺμ Cُ|‚‰Η'WΑ ΐύGόΌ nΎφˆŸ€ ΐσ˜Χψmΐ_Εμf³ƒ'λTπ3^ ΡdJ’Yιωυ’ŽrŽxΝ{X¨ E¦ΔΘP+²3ΠΖΎύ(•'b? ?˜ΰό‚‰‹K&μ:pΌ¦.PΘ²gΚ`wΝΎ ΅"―Ο—mfSŠœšζN­σι `‚i–±Μq”φ˜ν†˜΄dκ₯œŠΕš=Jw›n2š“§˜Ε*«œή‹ΈΠsef,•σ*b›εy88ΏhaΎ’‘wΐ φΐG½¬CSΈΖΙ€X)΅Υσ±TΧ?rώ¨k„zI•›ϋo:QCpΉ1Σό€k‚e0έφQ@nώ…‡όL€Oρά'xTH €άΤ‹Ώ•'±«xήκΔωIιž=ς-0±CMBδΣΌ„:ƒ’Q1œΈ½=A2hΎ’£3π±T32v›.ςi¦!z;4Ξ‚ooMpiΙΒ•6Ι¦Ψ€7 °wμ&½~]Ό―­₯°wμβ°γ%²ό`Ρ•Σ"!M„ \]IaλΠαΝG!άؘ m ¬Ν™Π5m†Ζ†$¬Ά*pΠφΘσ₯|ζω©C! ^R1|RC0ŽZά|Š6,~ΐ?}Μγξ‚1uœέώ&M‡Fώyπεrπδ `Ο@ΰӰȟτΪD"ŽΓ†Ÿ#Ε¬Š=έ…eˆΔΜ6ΩΗv؏˜ƒηLψ‘Ρ$HLC]_β ν’7 P-j(ηT ΗŽΊg“ΆxςΆ{̏_ͺρψύ Ν˜€|F9}5v0…ϊ=½l€/΄ i„”)Πψ βN’ͺζΚ:ζΚό·έδC1:O’ΩυΡκ±BΙεe Ή΄€οK2Œ€NΈ§ *„΅yD„[›<€X¨κΈΈhBDE'N₯A–k2–ΐ`Δ£?Eat«ηc0¨”{²±Δ£"n–σ Zi0œ„h½Ψ†ΰΛx<ί~ Ψ™&εΔυߏ>ΔλΌN‹Ρο=αρ ψ䔉_Xp?ΜC1r¦Φ#PΪΦ‘Ηe΄ί₯% ¦Ξ*½›‡6ΞΝ›˜+kΨ8p’S|dsΖ»Ϊΰζv»ο³TΨ8€B#;€λκXi0 #~(g6ΙψžNάί³±X3°0±P M;ϋφgΈ$§7€]π8°,©kBΞδΈ’ ;TΒrΝ€i°‘ΑqΧ›©σ“ˆˆ’Ž ”ΈΉ1†„zρD·μ¨ΓVFKΑν­I7Ψ>rK+P"Kδ±`4 ‘K«hφ|”sJY•υΞBΚΰ>ΐq‡IC·;W-ͺ药πΈ“θΈγS>£<(ε9t ―€kνξ#~ή—―Ο^)ΓOΰ£½ΦΣ€€>ΧAFvHA@•f4α1cΚHΐ|1ΰ±ΐΈIP˜ΏPΥ₯η%’„νCύQψ³oΨ4Ξ/˜ΠU-ƒΉΤξyΘ¦Τ‹:.-±BL󍟣Q!αζΖ•ΌŠ‹‹L―TΰΞ–΄%pyΩJTƒ-C G}yεΙβ#O ]#Y/©ΨάwI>EC°”!φδK`Ω­ξ#~‚™§γ.ž¬ζ3m°ΠΛΡσXΟτiΐ[?.b`ŽλτΏΦχm”σk:4…XΊ>’‹°νΎrŽiΌ^ΐτα½–‡vŸ…=ηΚ:³iC™ΐ‚§Ώ“γžΗ›ΰβ’‰+‘"wΪH™¬Dδϊγ ›†ŒlΆ+?·`@™ŽΑ›z§7€Xρυ2p’yξBŽ;Ο< *jEv7ŒτG§*žDΖβΕ/Α6Η±u8ΐ›Ew@U6vŽάDάΤυ€‘"Ÿ‘¨δ5l:Ψ9v±\70WΦΡ0tΞ†cH Ωτc✬ύ– "†K u8»V‚₯3τ=—fuaS'δΖvˆν#ƒqΈg'Ζ’(f9"πα>ΣΗ9½Lΐ)β―Η’^Τpsέƍυ FΡbΦTN½si%‘! C.2›}ά‰>ΰΜ…eψ-ΦζL΅Ό`θυ’†•†]# Η 0N& ±Ρεe ­>7_:nΌ弊fΧgMŠφ±OEœ4ύΰq A‰f' π /ψŒO5 Fά½ΰΏ{ΜγξOνΉψνxχ#Όή»Ροξ‚' Š"~0^ ±}θ’iˆλnŽ!νž/ъ²ƒƒΆ‹k«)\Z6‘28ΰΗσ$.,YΙAGά@'B²βRΒΠD‚‡Ω:dןB–Au)CDψY P‰ΦΗΤύ·SrnγΉΞŒˆ…ίΨ`Β5KI8Ξΐ‡LZi¨4ΨN]cFTo ;τ„Rœt‡>ΆŽΨtdl‡Ψ:p`‚hšΐ• »Η.Fv€ΉŠΞ¨Η.VV"£υ}ΊΚ Ε¬Š½¦‡­CσνcŸΕ‘"’,>¦!ΰ±ΔsŽ'5χΑ<ήzΰ¬ΰΓΖpο` +γX”ΤWD@wΐ.ΞK5­Ύ‡|Z…eάί³1_ΦPΘͺ¬‘‘ΦJYχχwN°ϋ›6ΞΟ›ی§‘HJ,›R"δamΞ„λIμ·\t‡&v/89αG6—Ξ« iKΑϊΎh|H—σκι«q§²Έ‡m·‘‚€„΄ !σ…š=Μ—p^QΞ«ΘZŒl:κx°"δR1Λf…Ž’7 PΜͺp<‰υ}'+υ²Ž΄ΙΝ@/˜―θΈ°`Β‹ΤΫlΡOΉ΄Š΄₯ œΣ0DΚT «„υ=‡Ύt9%•1œŽjAEΘ’#ŸΒ”τ"Ψ μQϊ|½θZ~%ΊLΫxΌ¬ψ£bΌ <‰άΐ3ΐ|šƒΨ>t‘«¬΄K€ΒΠv]΅=˜±4~VMΞJAƒŒΤβ5ΣμωHV4•6²i5’Η π`Χ† Μ•5ΈΎD/κ·Εο!ŽVIBksf2>ovU›Ά ™3θΨχO¦‡mΐέήRS ΅’&οο:3k Ζώ―4 2*6’©8n€ξ0€ͺπ,΄Vd1 €μσe큏± —V±XΥ±sδ’‘ŒξνΨ¨4\^bΥ”ZQΓ^Σ…erΧύ νa1Yλ£n§Ι’Υχ©^žΙAbh$k%[o>)žΣ™Ά»=j˜½ΰ7ρx1ΟGΕΐρδζα".―XXiX߷Ϝςm~(±6gBQxΑΰ#Σ`ΡΛ0")~€ΧΣκœ~ϊ[Ί‡‡dq»{‘Ν””Ε¬ŠW/€Ρ‰D@,C ”ΐA‹%txζ9₯%£© Χ54»Ϋ“™E(™*ιxaRοT Zδ£ς9ΠκΗ%OΖϋ^[M%Αγ—tM«EϋMM«sϊG 9RKΘR^ΑQΫ΄΅^+?κd?ΐIν~χcΌΞ“@&Έπρ"Ύ^ŸΆo€νIΊΏcS1Λά}„ΕΊΧ αΈ!FΕu>«œŽ« ΑΤ‘ΞρBμ;IŠ£Jμ9ΈΈhΒρtμF*A †§«ΑσX(d±Ζε6{,†π|ΦΦδρ8{yθα΅ΛgdίΕCFΐΪ~ +ΰ>€ŒxΖdhΝM ! Ytμπ1qBΜUXρΞφΓh‚Η\YG₯ βήϋ LJ[ ΞΝ™Θ€…°X5pάevS΅ α°να νb±j`Ύͺ£?ςqάυΟ(¨4”rvŽ\άڜ`Ή‘?Σ ZT#—$ω‘οΟηΨΨΎVΰ}”SΟάΐσρα@6ž™ΐ£„f^dbω±-±6―’7  ›εΎ«:ςi•Υ« t±4μ΅\¬οΩΩa‹/η5wf>ΎΝ«sŒπ|fΊ¦M&½ρψ±Ωυ±άίaΘp2Ψθ€4ΰ’!“RN#ό°Οφ¨ `ά¨ΌS­ΝλxλΦχ7Ζ菃Δp@Χ8‰QIεŸΖ±ΖY)«BWCLv*)εT,Tul2Ψ'Ι Bž««*Ì=_’VΤΐ‘¦š=Ž'±s젘S‘±\Xδ,Γ$,ΆΈ ψΚ΅ΜG–πzX˜ΙZQΕφ‘χ‘‚Ορ^^7ί΅HπfήΗγAΧγIBΪRpaΑD£¬cdΟJπμ”7_Ρ€qˆ‹@ο=μ³=j肉 _‰Α2ΆnφExΟ—p=ζξƒ­―/-YBΒA‹υύ‹9²@(%lW"k)Ntœ΅Ζ‹IΐrΤ(Ω=vα, R)h87o’3‡ύ– ]e/Ά{;6κ%fP΄=d-rŽ5ξlΫψΪυτ3+%€bN•έAˆήπι‚&P=‡ΰ…w ―οίΓ“xWΐrco|ΔχRΑ3ΐ|ƒhφ|Ϊ=φh©Ζ'τ~‹χΙX«QζΖ^³`ϋЁγK%-iξ\Ο—"–¬πZP"±qΤΜX J9{Η.:Γ Τ‰ο α˜υΞ/˜ΈΊb%Ϊρύ¨ `±¦C`ʈη6α{&'x€"%d&₯°qΗ ˜9шbΒ…E ͺBΈ³Εi?στ>ΌRgOtΣΈ~Žλύή0@δ#—V‘M±hά ε †wΏƒ6­¦„ŽrΣpΰ•s)δΣ ‚³†£Ž‡χοιεσR¦xfY€7£δΣή@Ϊσ±ΰ“ϋ%ΏΗ<ξmpΓπqρπ ώQ7€y<# ΐ§qΉΉ>a°ŽΞάvίGΪbKSQ™Κ΄\Η‹•€]”WS(ηUV³Ξ¨Θ§™β«jο·`ΗW ςQ¦ΕŸ[0q{+κM½—XπΞφks&.-YXίg‘^)LZA£| ϋ‘$-πθx<: 0u’KuύΜυ‰u/F䞸ζOά„‰P2Έ=πρώƒ1n¬±}θFJ­₯pnž)‘ŠB‰Sͺ’°q{ΰcϋΨō v›.R¦€e Τ‹,œ„ά`I‚Υ‹«:Ž:>ξο8Ο4ύ–Θ¦„,η”§ήS”H»π9ήΩΧρψΌ‰'›y|Μό¨Μ¦9‘‰šMH ά9Eώxp~Α‚„»;ν—|Ι&_]±M³‹‘CPwθ# ysy°g’ηΣέΦ…*Οc…ΰM½¨a1²HΪ;ψΙέ1]\6aj Ηs&j%Ξ†“Η#%8kP•gϋϊ§βψτ~WQ‘gΕθOσ#<ΗsχxA`W*E²iϋ-΅’†”Α]/jB‰΄%0WΡδΉ~ I‰Ζά»b’Ϋ^ΣMRrΫ‘ΈΆja±¦c}¬Δ’Hάί³qiΙΒωwΆ' οΰB€d3 `mΞ€‘Ξ/rΚjœΐtξwυ·L|SΔ FIE­ΘΔ›0R=Ώΐͺ?χwl؞<Ή d$ψ1gΐΤ‰9Σxθ«yf8έΪcω¬ε2*Κ9…Œ ?šbΩπ8₯z°gΓΤΦζM³όψ±"€¦pΙ±}θβώŽ—ΞYΟ΄oθ$ͺΦχ\zœzΒ²γΟ[9hάό¨@ΐΨqh~x†vΰŸ*Πρι_/ιPΧτ‚€{œr#œ/^ΆδΪΌ!A˜+kxχξ˜~rgŒα$ΐΉθώώΌ΄dαΒ’…£Ά—Έui*A2eA”Έ.Χ \Z:C‰ ι=©:ύΈƒœϊςΛW3Ψ>dh¬‘ hΑ•4Έžδ?>»φ.Tuδ*nΗ=Μ’ ‹Ys›†‘ΗΠ1˜Έ@TZw#Gβ‚Ζ„)pΠς„όΨ±ΝΪμεΌ ]°0ρLί9rρΦ­1_0aκΟξ–Θ€„œ«¨Ψ9ς(6p8΅’*Λωηͺ$Α|€Kΰ’ν£ΔE0W›‚|Ψη1pB8ϊxM–—V xϊ§ό8qc…=S&³ρš]…,‹ΞΊαΛWSrmώ€4.dω•λi™K+τ£#:h{ΈΊb‘”Sq45ώkχ}2>V"5 ALσ5 ύι/lEa½ΑRVΕΨ `;< °έΓ ―· p}‰…ͺŽ”™ž>ύ%XΞΤg|π>N”e€ φ ˜8 ilφΌx PΘ¨Π‚tβJͺ³ h₯ "“R`;!ϋ©ωšΒ<‚vίgFΤΙ=ΐde mΫ‡.ΤHϊk©Ζ«Z‘Ρ­žLJΑQΗΓQΧΓωy3ͺ΅BδΣ,Π°}θβΦΦ―]L=σΣ₯œW₯ͺΊύΓIHwΒΦ*εY/«ς9ΫXΙθΎ –ϊώ(ρ*Θ°”ψίύΏŸΕ³Ea”°NΟ|XΙό UyΎΎD¬υπώƒ 5J:ΣΟG6dR «ΜC)ηU,T΅“ίΫΚΏwo EώΨΛωoυιΈλaΎ’'@Ά”Α£σlJAΪRp}-Χg‘ΧgΣέα$€γq³[Ξ€]OβξΞ/Ο[R―^T₯Ρtύnζ?2ž΄΄|‘΄”σjLw·ι$φE1:IU« ωŒŠΝŠΰYg>- ͺ[sC¬Τκ1ΈΑρΒMΨ(k‰TRά鏂Δ[ ; P+h‰&z«ηΓvB΄ϊ,4RΙkPΦ.lχ}ΌycDηLdSΟn"ί(Ε¬"σΛh­ξ  i‘ͺ%VζŸ@\ŸΰvŽ―€7€8^?ŒhH!ϊσ±#Ξ¬²)ή0<3jU3O•ηΪSεχρΝ1ΒπΔΙ: y mœe΄=\X6€‘σ‚‹ΉoήSo`}ΟF)Η“­”Ι‹ύϊš… d‡-Η Ρψhφ<,TuwΨ=( %σ»O}ΐ{ΔΕ%ηζMάί΅Οΐ pnΑ8݈yO@€>Ν€κwόe))!Σ¦A(±uδ°τψ”˜ΘΔτΰώΝμ@b$•M!a©nΐ2t#ΥΣF™Ρ„ΆΛ©M΅ΐμΏ 2•Θ₯dS ξnΫh|wψ‹[ͺX¬κH[œ’1±ΘΓΉyΞ–jnmNπξέ1~αΥΜsΉYˆ/€4 ₯<+Ύ(Οω”:ΐΐΓω{E°ΡΘτσΤqJ6κ QΑ3τPa±Ζ{Ω`&ώ“šΚή …μΣO`>JϋMξοΨ΄T3τφΆΤ5žΩw}²Š<7oΘp{ΣA»ο£^ԐΆ £ol3d½Qqg‚A„ΰ›ώέΨ; ™ιŸΪόbΟΐΈ18½ „’»υ’6 —ΰ΅ϋΨΝόi6€·ΑΌς/Dΐ\…­½‚S`ϋωŠŽΕͺŽ͞7³9‘š‘+‘°‘ΓŽ—  SQJΤ(i’TΜ©Ϋ,9VŒ„z#.gX¦ŒεΔχ[.κ%Ε,»ͺŽ',8_ΡQΘ¨Θ₯ΌukD— <+ͺπΓBJήμπΙ.~ n.γΓo˘Υύ―ƒ{β9ζqRB<“0 !Χζ™U!\_K‘UN\³’υqΠv#Vk,S„&Ό³=ΑΕ©M Ά;Ώ`HΣHn ώ“>οΣlMίo–j:Κy5IΡ`’c±¦cλΐ™ivΔ!ΑhΒsσΜ>Œ4Οb4aΌ+ΦKμ—ΆXΣεB•qΥR2³3`ΖΦ‘C~€\JE«η‘ΩυΡΈ²b!ŸVpe5H™pe ·6&ψαϋ#ϊΝoδε'˜šR‘£ωήόΏwœΎΗόΈ ψέρsΰς#όΏσΔP’…¬Βπ»{ή«_psΫ¦£ΆOks<ΪΆΖ'°γς¨ϊښ%ηΚ'‰λI|οέξlρ$¬ZP±PΡα'v]žΟΪύkσZ=½„ΐ恃++–λμΩοWΕ›ΐ‹ƒΖ›€ͺΞ/žΩƒί#O‹Qϋ- @ާBž_4pΠςˆˆk£₯¨αvΠ~xΚ<ŸυΣO@K'Όz1%//›Θ₯ihg»Α•Ό‚ ‹,†xΠςΠξhφ<❘ϋ »Η.\­”Ι›F½€aΎ’γζΖ zιœ%ŸSπS\ΛΏτ~χΥθw§οkxΌΤΨιxv4ΰΣμΌFρΨοFTΚ©PfκέΩΆqnΑdϋϊη ΜW΄™ί;jϋ΄ΎοΠ0ΒΐΔv]εΌ†έγˆEM@«ο‘œgœΫ“ ‚πδ9&NˆΝfŽl–ΑˆΘp#.·ΩV\b―ιbuŽ7MjEuΊωψ'˜2yT<νπ“θΟ/ƒMJqyΩčυ ¦‚•†ύ¦‹Vίƒ²A(ΉŽΗ~K5–.pksΗ;aΤI°/}!+_»œJ@ 1–`ζ†ˆώ?ey~ΑΐR]’ZRq{Σ¦£ŽSΨ›Έ8ŠΨŠ+ Z›qKuƒI€οΏ7$ΆPzvD‘OI\δœ§|Όΰ•‡όϋUpVΠ~ŠηxRΰŸ†CΰGŒ8šXeΣΜΚSaβ„Xnθ3ΏΞ  ϋ»10$/Ϊ•9]–σ*:Ÿ7ŒFz„ώ˜@–άՏΗ}šJΘDά€ΨJ,n¬Hz!|Λςͺ C&Χ]Y5OƒΆΐNOŒ§έώ1€o PBΞU4ω—³Τ‰H=₯ΌŠbN… ή‚@rG3ϊ’ςΆ7*η5δ!όp}ζ.ςk9yeΥδ5‹2n ͺ a₯‘ΛbVΕέm›ϊΓσUφP$$Λu†ΞΣ‰όΰ§CόΖWσŸΠ<ωŠσ`aΞ'Α~㨃›~§c9ϊσ4ΐ3ρxΡ!Έ½mΣΖΎC« 3IΟ ξW© ϋWdSBΦK'ξSaΌρΑ{ΗLς9ξz‰ΐAΛ£―Ώ” Λy›.ν%vb‹U#υ1f­™σ%μΉdκLΎ³]ž@„RF₯πlσ°ZTρ΅—§?οƒΩΌOŒCSωm:u&U…P+iς'wΗ4±,EZι‚(Ω½J’―ΩσYp!T¨\ςϊySΞWΞ6ζ¦iΒρ‡ΡσOΧƒRΉ΄WWMΌί¦ƒvˆ₯:Γ"m—G-< Π‘Ο¨¨©΅\Χρyλσ’Hp-ΎŒ§ί⎿<υΜpœVόKρ?δ3žΞ44’7NνeιmμΫI6 ˆ π ―dgš)ΣΡκωΤ1ΐF†€«„bN‘εΌ*SζΙρqδΥUχv&τώƒΞΝ›(η5\[εΩλΔeVα|ECwΰγ;?P­€MΧNŸυΘ‚Sϊ>εγΏnϊMί^1°θΛώΛ§xŽ9<#3~ ρύχ† °o0ž#“ YΗ $Ύp)%S•ηIlμ»0"ΜΏα„Ω¬Ϋοz_Όœ’¦!dlvmΝ”Ε¬‚o½Ω§υ=;GΞ-˜hχΥΔcℐ‘D9§ΘBFA₯ BDο?ŸyίŒPΌΊΚ²zαΙπ€ο=νη0Ip¦ŽP4›——WL7'aLpaΑ„νrΣ/œJ[b]Αλη­™ƒ’ ςΖ#ϊΏί‘›λ6½{w‚έϋ&ΈΉiγέ»zοξDlμ3zԘM+ςΧΏ’—ω΄‚‰Γ§~Λƒ’p62šΠ5‹K&ϊγπVŸl'όHbŸŸ²Ρ΅ό&žŽΡgϋ9Šo ²‡{BΌΖ|&·P"ΰέ»Ϊάw¨^βΖ^«ογώž ί—0uε†‰Εš†₯Ί.§Eo7\ϊή{Ί±>Ζέm‡— @«|ιJš³Υθρ»Η.½ys„Ρ„Λφΐš…:cϋπΪ₯΄΄L!ヲRPε•SΦŠΪ™χ.%°άΠ1WΡN7΄<]ωΰΓmο,?FœˆpuΥB&5KYTauή„Pλ{v’ί?WVLY<Ոσ‰?όΙ€~χΝΕ͏½¦‹f—e“οnO°‰’|λΝύΦztΨφhz¨Uω+_ΚΙBF…γ²Ϋ½;qJQ‘˜Q±6gβώŽƒΎ?šM±>Ϋρ<1ηΈΫ°ΰLβWŸπ€|}ζ6AΐζΎKoέΡBΝHττ<_’^ΤŽ^ΡP+¨8Ώ`H]‹nyF“šL:ωA]%δ3*^Ώš–•‚:3&όαϋ#zϋφˆŽ»\„! |ͺ*‘QΦp~Ρ”ΧΞY2ώ&[.½swLΛu#RŞϊςΒKη,©ŸΝΈωχ?Τχπ!Ώ·€ΏNIJ Vδ…Θ 0ώ‚–κz‚œ<ΔTΓΠXπΰ΄ΠΑϋχ'τΖ#TfUv<Ψ^8#yTΜͺN΄<Ό{wLθ;]ŠΗ‘§B—LyyΕ”Ω”‚ω γΆύ@βΑ£%ΘύθƐ>XŸ|^²€Uφ)ϋΤππ…+ΑΣ„oυυ§M…^τ°Α°έ€Ύχξ€j YK 7 @ΔbΥΛΚίߡᇕΒΙβ BΰΝ›#τF2Φ‰ρKƒxυb /Ÿ·fΎ•νC—QβάCζ]_b―ιa₯nΰ›―eaκ‰Œ7lWβήβή3ΟΝH["i6ΚΦζΣMσί—κOʟϋζ‡–r;οόU’ΉΟ„Ϋ[6ω°^Τρ`ΧFoœ™εK 4Κ:Ύz= mjWŽCϊ7zΤϊX¨° ΆA¦Z¦!°\7°ίς0š°λ`’hmŽ΅ΣfŒš έcR¦‚j9½a€φΐG)Η£Α΄%ΠμϊΨ:piΎΒHΒΟάέ< ψtMλύž,α΅ΎΖίΕΩyς—ό?ΑMΗΟΤWΟάοΗ}’’¨ZΤ"ήpg‚fΧC>£bdψε/ζd!«Θψwš}η₯M%bς‘”Ο¨Θg|ιJZζ W޳…{Ϋ.iš@1«’qXbθn6₯ΰό‚!—'ŒB†#ϋtΨς©˜U‘iĊYј0c)xύjZ.Υυxύψpώ7ραPœiθΩ_Ώ„hj—I)NB(Š •:Ο7%Ψ¬£œg~9§’Ω…]\2±:oΜΤT­žOmŸ ’Η A`Ϋ$Cgzd΅ !e±CœΆ+”rZΒΊOr]ckςχξΙυe$Ι€’a±γžU YF4ξ5=Z™30έ\ό †ŸΪWΐb §•€ΐ¦?©π!p)π%œΐ}―ψίψ?‚€?sΕSJόαΫC:hω΄XcA™fΧΓΨ !₯ΔΖΎU¨5\\2εΕesfƒS’RN$ΘΠΩ‹"e(,ƒj!ά`€»;I)‘6μ5Ωk8 Π0uΒ.§`L†A@ίωΙ€N€τΩΓ2ΨHw’γε ©i²™πOόM<†ϊϋ°ψ¨jux° ΤTΒW₯ρΑ–ωφ|~³@4Ζ‹ρ*Ή΄"OgάΝA@½€!’ OhΏ7ρb?φ+Λό@&2–‚ϋ»ΝU4δ3άW\\2πΞέqdΛΔb£šΚ2cω4»Ή2*./[Έ½5ΑoQώΜ/M¦ABΐ―ψΰ›β=πu~ ΐo‚;χO³pc„αŸˆώŒΐ7Z,8™[όRo|0’{Ϋ6[0!#‘Ϊυ}'qΪ]Œ4,ͺEΧΟYς΄ΜQΚςʊ‰~%ΐϊž‹οΎ3 ξΠG9―β›―e*³ ΰφCoήλφ \[eέΚÈώ.πΥki™9γ! 7oŒpsƒ9<Σ₯iΪdμ««ζiΥί1€Oό;uΈž5ώ«ρΛƟ!ή0†”ς  GJ ZАϰ0Β΅5sζg›vŽ˜ρ`λžOΐΰ–# ₯P²ž€± ©@θ±>@>y°X¨κςό‚A­?ΧΔ ±ίςΑΚ-:2yο,άޞΰ[oφιO~=ΛxΆΤαO0b\9kœ΅Ϋψ0 WNύ~κ#όώ§&ΐ»χΖtcΏν†Mx”ΆR7PΜrφXΜ©C`‘ͺΙDœdκ>ˆ3ŸQδKη-h*πΓχ‡τΚ…Tψ#γ~ψΣ!9“Φb›˜υηΈMy}ͺρc nnL(ώϋt 'Ž{~₯œ™Άύ&0η‰ΔŸ‡ΕG)β87œ²ˆz~ q{Λ¦ΰΤ-{ ^X΄pΨρΰz!]]3₯˜ϊ„χw2uA/±{Δξ(1@‚/ˆΗγ‘β8γλ δ3*&nˆ››cx>θςΙσj*η°‚b₯MεWΒ­MV{9ېΐm;‚|τœ₯ΌžwL/ή‡ύύg&ˆ€Φ'τγ›cZ¬2$έσ%R¦’l:a―ε%Vw₯œŠί‘ν„TΞ«‰μΦtj% ——-#PγΧϋιύ ½}{4³†m—' —"ΏρΥ<7£Ÿ»ž€;[m™°^OŽΧ―¦εΕ%sψγψwΑ_:>NΑϋ(ώK(΅yηζ3–\,Β»ξ^ΣeuUoV,g‘’#c)Ψ=v1½°5kE Β8+`Ouξΐ‡οKu—ύQ€zIG£¬γέ»cϊƒ·ϊp\ωy˜όLpsέ¦οΏ7€zI‡ixL”«ξlΫΈ·c³‘§& Ύƒ–OvϊοΠ£τέ.ν5½X’&βΓ->,b%αN? „Χύ™Έ!φ"1Ρ―^ΟΘ₯ΊžΜπ‰€χLπγ›CT **ωYiοφϋςωΛ/ΏώιGύ~>Žb}ΰοψηΑ#₯ΠΠH~ιjϋΕϊθŸή–!pssΜH«Q€Α8„ΊD@½¬α½ϋμ:ΰ8ͺEvŽyΤ1Y(“R@ΰξ>ΐb‹Ž"›Š|q<_Β $6μH/PΓ…EΩ47c’‡p~ή„~rgLΘ_ωRŽbςΗΟγ³DΐΝ ›ΎύvŸκ%iS xΌ'ˆ)μc;€Q€Ι'P/ς½ͺ©„₯Ί?H‚nΫ°F’Nρξœε―Δ@·σ &NΠήΉ·%‘M+xύjJ δ@kχzγƐŽ:>,ΓΓRέΐΘOMA Š{\ˆΤΑόGψhΆο>ή0(θψ_œ¬4tyqΩ€χξMΈι—g+π{v" :v8¨—O櫦Np\VŽg₯BpφPΙ³/_΅ Ν *-ωBΣ‹ŠΜœΨ‘°¨‘GσΣ€=ήGv?`ύυΨήΉZΠJ EauUEoίS(!υK9:}ΡŸξ >x0‘?zDσUšJθ |’CΈΌlAΧLƒaλ~ξQƒmbpΧφ„ wοŽq~Ρΐ•SΙv₯Κ9Uf.*²œW’”žG֊Β&9η ib†Τ³ίτPΜ¨Hά(T°:gβΑ Η 1_Ρq}νΜι}0νχ#ΗΗι|οψΣ`uZ© B&₯ΰώŽCΊΖu?7\B³*J9Noς…qΙΨN@U MP<>Œη¦q’3&/τ΄₯ ŸV‘K«α Y²ŽΥyZ\―ΰ Η‘€©¬ΈšΆxl“K+θC Ζ΄ΘΜac߁¦²ιH6ΝΎνw6mΪ!k:Εh°ŸΗ§;€ή»7¦7oŽiΎ’#k)θίω΄Šlн:c;DΪTpoΧΖφ‘‹fΟC1«β¨γcσΠAw`d¨δ5l:xοώ˜š]Ω΄BΉ΄ςPEhU!s¬*΄sμβΞΆMϋMω¬"_»œ’Σύ‚ν#—ήΌ1"" e*‘(γT*0ιΛWΣ²qΒ›!pǯᣫAψψΐΐ :`"%⦚Λ€k¬œMρΒS~έa@΅"«< %荆΄{μβ°ν‘;τQΜͺΨ=vρ r_9κz8κ°SΖRpksŒύ–‡ΓŽS'\[³’/W°Χτhλΐ%U%؎„iδ LM ŸfΡ΄₯ΐΠZ}#‡mœ\O"ŸQJΰΑžM͞O‹Uύ<ψtCl%~tcDoίΣb•qδ†°6΄]δ*vŽέDˆ³”ΧpΠt1‰ 8Κ9M:§Ό0K9nΨuŽ»>έΫ±Ιq%jE푇C.Γ£»bN…νJϊΪKTςj’“a»’~ηG}Ί»m'"‘Η]v½žΨ!J9 •‚Š++&¦RΜΞύπΡ ]|ό ŽΐŸC0ΈΌb’ΣχρΣ8n˜ΨΗΤ^2δςˆ‚%M^Z6ρύŸ (ηυD ΨgmΉ ‘UΣΘ>ι.Υg\QGm#;Lœ‰. ¦pάρΰϊ!ri)Cΰβ’… δQδ3ΈcήDΖR°±gγ~§CΏρΥ<ζ*ΟOWπηρΡ‚°Iί{o€;[6­6LX§ϋφl€ Ω”ΐ~Σ…•ŠŽFΩ%A!ΐ2B q⍡”€/‘"cFe¦†γίo@ž/qύœ…jA…‘Ρ 9GF›Ο+,yiΩ”ΊzR61ΧeχΨMΌ€ΙeΘaΗƒ‘ Ό|!/UuFξ» ΰoαρŽΟOΟjΈΰoψΏRBZΙ|VAδSžirΝ/©;u!€―ΏœAwΰzdτιxrζχ ] —Ri1 `Ύ’ακκ¬.šm– sΌ0AΖ͘Α8@«ο±Ώ€•B³λcμh”tԊZdΨΐš‚¦NΈ³mγΏύΓύϊWrΈ°hώ| ψ”„ˆΡsο ¨ΣpaΑΒΨ %›uΖ,#/ΑΏ΄Ε|₯š+–²ŠΕšŽ/]MΑ$:¦‘·Ί>δ‚™^¦NH›œ5Ϊ^˜έξ»π}γxύj U]ŠSε‘§Aςχρ‡νCj ›‡g…œΈΟ₯Κja†²Nώk°\ǎgQΔq\,#’ +dΪoyΤœΥ Xn˜PΒζCksT…‰ΊFXͺιΜ³φ$mμ;<Œv]  Z`†νCώY>­ΰ7Ύš—σΥ““™Œϊɝ1ε ό€΅Ψu+y Ά&ςe₯ΘZl―ιΒυ%ŠYΫG.Ÿ!œ–Ι>ξϋ-··lRB½Δώ?DΐΦ‘Kίz³OaHX¨κ±ž_ΖR «"³£Α YΧΟYς• –dG”)I)¨U4JšL[έa@±¦ X†‚BFE)«’VΤP-jΘ₯T˜:a0±{μ@Θe”ΗβH€ΎσΞ€ξl9΄XΣ1œ°έYz{)§β7Ύ–G&•Lλ€m[<½πΛcγYnc0Oΰ7ΩQλξm;δMг*–jl Άyΰΐ2k'Φ†.°PΣαϋϋ-ΒPˆ€Γsis#―Νψζ³rmޘ9‘™Έα“νJŠω₯+Uς Π(λψΖ+YΘ¨ Y†’τ/2–‚Α8@ΤμA°I9―bb‡Έ΅iΣ` QΦΘήψ€#6Œyηξ„ώπνεά0xδ–±Ψn˜t‘χ[.ͺΊός΅4JyU Ag]<šΛ¦„!πΦνν»lη•Uqάυ°yΰ ;dΑ±ΝξXK‰1%Τ€BΚg b1CπΫo(f³jbρ πβ›―eOƒ~ΰo€ΉΟ$žε°Ω%°Ϊ¬” c;ΔΞ‘KDΌ)œ_`έ΅½&#ώŽ;>U άωŸΎΐ΅’†‹Λ&–κ:ζΚ:jExΗUM+ΈΆfΚW.€δτοΕΏΫτΟ~Ψ££3»6φD[`8 K«MΌtή’Λ žFtΩNCη9p1§’Uahaτ†> ΎΡT…poΫ¦Ν—ŠYžBό4τΙ„  ? πwtsέ¦FYG.­@α°γacΟA.£`Ώιb·ιFpqΒQΗΓλW3ς—^ΛΚ§%}U‹ό»λϋωM+PƒΆΗ•;a‚]I™··mΆ=μ»Έ»mΣaΫ£LЧNqxΔύ—D‹7™ržp‡“aœ_2ρΛ―ε¦ˆΐώχ†Οκ»|Φ@ΆSˆτζ…Κ•Ά]NB,Υ ”r:}ω¬ŠΉ²ŽJA…λ‚R¦@ښ½0–!P)¨h”4ΤJ*j%σU σMsκ™œˆ!•πγ>έΪ΄‘k„RNΓΞ‘‹‰&:νse —MY/i‘v‘ΐϋ&΄ΉΟ–fΊΖ£ΑΡ„'鈭*„\JA&ΕΘΕ››6I΅‚–¨"<ž}PTWίίuθήΗ•΄XgsΝvί‡‘s“Ο2J9 ύqΛTP/2ύϋ₯σ–όΖ+γBβη8›€dΡΞ™ΧP)h΄wμQ«Η8‚rNE³ηΟ Rύ¨uΨn˜x\؎ΔAΫΗύ‡ οcU!ότή„~|sD|Η= ΦTQΚ)ψΕ/dd)―NΣ}ΗΰΕΖ³όNŸυ0U+ΚD²˜U•σœ¦™Ρ)λz2ΙξlΩTΜͺ3΄ήι‹―«œφΗ&€»A\Owίΰ­Ϋ#ŠΛ΄Qˆ£‚‘Ύt%-/-™3xδRNΕJƒεΓϋ£€ŠY ;ΗΪƒ rˆξν°_|*ζ3 †γwΆl:h»(dΥGΞ†=DD°ωΑ{zϋ֘x<Ζ›w2βSΈς•oMKΖR^ΕΛ,yyŜ™ΏKΙ~~›ϋ.νωΤμω€©‚b&kΊFπ}ΰξΆC@½€£7b£d $2F₯έ?qώ!O’Ωσ©U!τΟ~Ψ£ΓΆή­Α›=­ž”ΙδΆ«k¦\3¦¬Ρψβ)Ε>Ÿ6žΗ°•Ψλ`©j πBTΒƒ]‡ξνΪΨoρ¬Ώέg—”‰Β%tUΠ` ›RΘΤϚƒ<*b φ·ήμγ­Ϋ#Š;ώ΅’EaΈ°Ή².7 |εj›έfR"α3H J› ςvqM› —%Ν3)…)Μˆ›H{Mn¬Ϋδωε‚F¦φσlΰγF,ŸugΫ¦ίqŸŽΊ-Χ dRά—‰›"ˆ}#ϋ>ςΫ‡μΩ‚πυ—2²^>±i'β‘ήχήΠώd@;‡.i*ΡΞ‘G›₯-Ε쬴’ͺυ‡\ΧηR Ό(]N ιΠ(ιθ}ΈώΙؚ¦¦.¨Υ pgێ§bE`φ\¬ιΈΊfΙS\{`ζνžq<― `ξVώ&€ "OASτή½1΅½™Y}όe,Φ hͺΐ>ζKŠBΘ¦Eb£(pΖ)Ευ$5»ύΰ½!mμ³IC%―‘^QΞ©° rŽU U_{9Γͺ-X77lΊ·ν© „R&^m–!K«0tJ\ S㝿”ΧΰΈ!nlΨ΄uΰ’i³J2αψy<}ΔΧφ°νΡwίνM›ςYΎ†ƒ1mu<¬ο³ owθcηΨEΪδ†Ϊζ‘‹zIßόz~ANJ@vHΏχfŸήΈ9’‘Νea%2€έ8pΠ…tyΩJκοHEˆφ[e,ΊΖχA1’7"°›λΛ,Δc'Ÿ'”ΜΜ₯UŠmΖNg‰†.πW2Σ=­οžy<― 6Ας_Š>t₯—μžRτKˆ―6Lμ³bJΰήΆCφκ CDŠBδy’)Ι$νŽΪ>έίqiΏι(f5d’šŠ™Z Ϊv›Z=WVMΉ6g<Ησγ›#ρώƒ ƒ&μρο¦,ΞnoMΠω(ηΈΑΩωΠ5]%£¦αaΫΓ­Ν w}Κ¦yΊπ93"y._ϊCΦκΑ{C""š«H“›ŸΆXΠ₯©L!’τŸG³εΌ"ΔWσ3²οDΐAΛ£;[έήrhd‡‰ύV£€ad3d\;g%’6B°€θwήΠQ+fΩ H‹y­¨‘’WaθΜ+p½π‰α€γ…I6KΗ‘࿐•ΧΦ¬ι[S€gώ|LΔί£βYΐ ΐ/‚j€”ΐ…ES~ωZί}gμ`ΎΜ ”Vοδ‹ B‰£ΆήpD͏Ή2#5•E>G“ΓI\¨υ=vR‰•‚‘/ϋqΗCoδγΥ‹)ymΝzμβdRŠ”δpΪ–,άα8@½Δϊ‚ΆΓ"ΒΞ‘ Ο—X¨θhυ}dS ^ΉF»ηaλΐΕζΎCWΧ,Όv)…zI“Sb?(βΜn0 ιΦΖ¬ΫΔ>2‘ζΘfδ^9―‘ΩσΰεZ}?§!€L%qΈΎΌlΑυ{2³όΧhž–LδΣμί —W-|ρrzZ$Nύ=pπΉΔσά¦όwΑN3sˆ`Β_½––ϋMk!°[P!«b}Ο†@1₯"c1(#¦fjͺΐQΗCΔΔ Ϋ αϊΌΛ^Y±0šΌ«Ζ".°La(a»Μ¦ϊζkΉΔmψqQ+hXͺ1Žά2­¦ @U‹πZ dωsU%Όl₯η’΄Εeƒ‘ ΜUt”σφ[.ήΉ3¦[6­™xυb ΅’&3l²Ÿ΅ˆ³ΐα8€Ϋ[6nmN( YOΠύΛmχ†>Φχ¬4 LlΞΒ M Q±uθ ΩυΛ¨xεBJ^X4€"0ΓΆϋ`}B<˜*Έ,›―θ¨Ω‰zβ„Qƒ™2^½˜J¬Ά‰€fΧ§{Ρ½Χσc'@!Γ³{?`Ίωh’Ωυ ©C#컉–EάόvΌŠB˜―2Ωρ$ͺEΏόΕ¬œ’ΈŒώχΑڎΟ-žg ΗxSϋUD¦šF¨TΪάw)%ΦζL€LVλ™―(ηUθšΐΔጠ”,ώykk‚vίηq^ΐπLΛda½¦Ϋ gκͺz‰_‡“ςkyΉTΣgκώ ”p\‰Δ1)©ΣH‚ͺ tl_ήωH z£;G.Z}iSΐq%Ά "οΓ‰ΓnIšΒb¦Ή4«ΖΊ~ˆΝ—nnΨΤξ0 A“»ΧOΫμόΌD •ν zηΘΎσΞ€φšUσάέ75β“έηL; `θ„z‘³,Χ“¨FϊύΫGŒοε/ζδυs–œ.΅ΒτΦ­ύξ=:hϋθ}”svš.š]ξE™#όri/_HΙ—ΞYˆU₯€dΙ―Ϋ[NΈ“’Ω«₯hλ]Ζ?‹εοφ[.Ž»Lπiυ}Œμ ιmδS ΫζeUό±W²¬π;ΫυΟόu<γιψ$6€w±‹` k 0Κͺ’W‘©‚R¦ΐhΒ)q‡Α-Ζθ;ΔBΥ@»ΟιM5ώ’cΚετŽOΜW Έ^ˆkk¦όΒ₯τ™ƒΞ–Cέ³§oΜή0 ?x»O#;D>­βήξA€α$D6₯@J‰cc;ΰΡSJΑφ!+±Μ± Q(‘K)8κϊP`‘j ’g`ΙζΎC?½?αή€΄yμόΌ&q}ο»Η½ysD?Ύ9¦f7`5θ’CB‰ώ8„ΖM`Ξ4B­Θ*9¦.P+j(eU`Ώ_όBF^?g͌uγ&βοΏΥ§ήˆλ}EπσwύdՌζϋWV,yyŐΪΆΔσ%Z½@‘4œΪκ%ύρ,„—ˆ§aTz#^ΏAΐ]ώξ_OUΕ¬†++¦Ό°hœϋίwύ[Οϋš<ο Ž!€\ Ό ώώ°6oHA„ο½7€Ν'c Iγκ*αΈ{Ά"ΌΥdD ‰kΑŒ%°6§ΛΣκDΐϊžCτ]ΊΈΔ*«ρsJ0ιCSΉ«KΔ©Ύ F6 “δΣάh4 ΄ΙΒΟ£ Mΰ%#ΝΟF@)«&¦!°PΥQ-h8h»Ψ:t±ΎηP)§βⲉ‹K&jUκΡρ³ή+ˆ7μ `€εΖΎƒ;Ϋ6υ‡ŒΖœ+λΠ5^(G]Υ‚†ΝνΎΛΛΪ}λϋ6ri—–,<Ψ΅1˜(f³αΈ!Ύv=#σqζ›ŠΝhK9Ν?3Nξ1M!œ_4δΕeγΜ¬k„―\O‡―^΄¨;dCšc—ŽΪ>ΒP‚mΑ}”d~ qάυ1Wζ,ΐΤ±¦AG;ΗV:–ϊτ[Žΐϊώ›ŸΔυω€6€KώXΎΈ„H]v‘¦!› σn:V§ρ݁ΖaHΚE%Πϊh”Xq8₯Τ±aΓ₯†N3Θ―±χί볇‘ΛΙHΒΠ…4u’Α˜ΑωŒŠlšρεΉ4γ,3ux‘¦Λ\ZΑ-›φ['1АXiB`λpΒPβ"sΝγQεΨΠιϋxλֈ޺9B£¬ΡωESΞι(εx3ˆ7°ΟΒ†0½θϋ\.ΡΖΎ‹£ŽGΎ/‘M«X›7“+ U0`Hm.mΐ4vލ ‘VΠ0œhχ}ξΏ(܈]ίwΠDϊΝoΞΨΝ₯L!ύ+9d,…vy1ρχJΎ¦ίόbV~ρRZ zτη± !ΉάΤπκΕ”Ϋ!μGm¦A8l{4ΆΉΛ?1Λt’£”Σ°ίtgJS)Y)λΪ9SN5*cΟΏΰw?©kυI•q܍>θ7υ…P/jΨoyԝšJΙ<‚F™OΗ=ΩEu•Λ¨X¨°†;CˆΈΎD«η1Ώš€Χ―€e1§œΡo»»νΠ{χ&δy!LCΰ₯s–œV}ePQHi‹αΎΩ¨†ΐΨaθ„νCλϋ£ΐ‰xϊ‚€ω §ί˜,ΈŒΚg”Θβϋ$R&— ΎΚ₯˜Q™aόυΌ|εB*)=ώ» ±Ψ¨γʊ‰Λ+&.-[ςςЉύ¦GέΘ+°”SΡκω3εi1£ΰ7ΏQ˜vƎ_ρΏπΖsω=,>Ι ώώώΨaζ}!²”Sδ―%‡ψ‡]jGuΎˆNώ(ΐ(υΕ_YK@Q˜ΦΫμyΨ;v“ωp\_X4dυ!ΦίφΪ>tΙσY€ΐσ%\_’i yl„Λ–Η›\“ EΫ^’)δΜ π‰ε†!5•δΪΌαWKψß θ¨ΝΧοΒ’ K¨*αβ‹DΖ./₯œŠNτyσ†η2*ΚyΦ"ΰšΡΗ›7GτΓχ‡Θ¦4JΝWuY/i(f€L!5•‘Šψγ>λL!–ΔM€q£Ρ™ν„ΤρΒέoΊhφ|²©6 Μ•u€Ν „λKΨ^ˆb†7ΔƒΆ‹z‘©ΩwΆY΄υ²…0τqoΧ†*€ε†E°„χΉy3ynΗ“(dŒ&!R&c/φ[.ύϊWr2eΞjξ²Šœ«ͺψώ»Cš―θ8Ώ`ββ’!Kω“"”\ TςšL™Šxxζ5ύwE!T ͺτ}no94_5O«°½)SA!£ΰΈηƒΐ%ΰ―Ύž“Λ }Z8$ΦχϋwπG~‹OzXΕδί{Ού"J`±¦Λ_JέχΊ4š°ή!Γ³‹KVbΔ8œΨ9vY†|Ξΐ^ΣEw`*ƒΗΉy―\HM›'0oόΐ₯·n)c 3,GVΞ©8½έύ‘υ=™TAΘ'OLAρWV-|ωj:;V‹ͺό3ΏX{ΗέίuHW {-ύ(<7g&›I\Σv"›θ΅9…¬ŠήЏ|ΰΈ·PΞ«ΙΜy0°ίς±qΰ2EZ(dͺδUYΞ«(ζTδR¬]`hE!9mQύАxψim&aȟΩσ%Ωnˆα˜YνΎNߧވ›·q½ΝΦn"QZΩΌy'Ύ‡\ZE­ aμ°tλk)š@ ›VΛπ‚Ή³=ΑΔ‘i]ΨkΊΨk²³ΣBΕ@½€Α2.-Yπ|Ρτ‰Ϋ›θΡ―½žƒ¦IoGM9š„π}ΠΥUSfΣ"υλ Ό}{LΗ]ͺ*εTΉPε:½œS‘©'ίηιρνΝ ›ΎυFŸ†γΉ΄‚bNE)§AS‹5œ=~γUnVžκψ―ψ+ΰ‰Ω'/b&όΏ. j ^Z6ε―ΎžΓ[·FT-hPUN³ϊ£ϋάόq=n¬Τ 8Ο^ΕTΩPΜ*ψ•/εdzΚn‰ΐrQ77l24ŠτXvy―ε’;π‘Oλ3MΒLJ$':ΕWΑψTzωΌ)OK†»ž€α„ΙMμd’Ωγ†P6†Ϋa4Y›30_Ρ“ξq£€σϋjΊ°LΉ”‚‰Λsκ΅yvTφΖ6τ†<šlυ|ŠΗO1ε:Έ Œ₯HC#Φ=ΤcgZ$ͺΛBIPωDΝ΄ΗΆΛž8!M7\Η¦‹5ͺseώμšBP”-|ΟgΫΫ5{<±Š™¨ks¬X¨U9έp/ώ.Ψkρ‡/b!Ύ¨ ΰQΗ_λ V5Ώp1%KYλ{.έί΅Ρμy3©=ΐk₯ά cϊίαΥ¬\¨ΞjφI[‡nβ#xάυ±yΰΐυΒ·}Ϊ*“R@ΔΘ0](Dέδ\ZE6%p}Ν”εόl‰αωπvοή“”ΌΘͺyc;ΐΧ_ΞΘsσ†ŽCΊ°dRwΐe/ΰΡί½b©n ›bφ’©0xQ8.έڜΰκJ 'ΔQΗe1ΞΌ†Ή²Ξ#qΧΑΫ·Η€k„―ΏœΑΧ_ΚΰGŒΠdNIΗοz‡-ώ.Zςκͺ9­Yγό}Ž»^Β˜nf-vcmGΘΏxΌσΚ…”|εΒLz"ΰΦ¦Mί~k@ΓI€ΛΛϊ#? I‰„Υ•„dœB1«@S2‹•Lœνž‡ΉŠ•ψΐMΏΞξ±GχvŠΗ}SŒS¦‚R¦iKΘZI•'€£ˆQHDmΞ€OΪzIΓKηRэǛT.₯b·ι ΩυQ/±½τ`ΜιuNS A° Š& „Ί©%]vφD‰#Ξt·;ˆ °šJΙΟ€δt‘„VόpΧ—8l{Θ€xΔ²dS|vŽ]/2\w}'!—–-(‚bO<ΈΎDΚXί·!,7tΌ~%-/,±Νϋ?ώN‡Ž;>..3(ηκŠ…a„QΒ α 4…³„ή0@«ογ°ΝΩ“γ…dhi” g{A±Η?ω^‡6φ]€HΖ νΓ‰ƒ½–‹¬₯ œWaκ<κmυX±ΧvB|λ>ήΎ3’ωŠŽJž»ύ~0ϋBaτ^^ao‚Sκ>ά{a³½μl2;PHAΐ΅5 ;Η.ήΉ3Ϋa£P&αŒν,Ί2gΘ―^K'$ ψ±‡m~οΝ>5»R¦Elχδϋ–γ§3†b–]ƒ₯δt3φ$<7oΰϊš%Oχv=Zίu¨Q Vt¦«†œZw‡>U :©S†——M\\βΜαάƒ£v›. Η›λ{NδXd0Σ,§‹#!%°±ο`μ‘Γ-§―Fy₯„ 'ΖN˜¨ΕΡfΓ8`ΛlCBAo ”,“^)¨ΠTΓ6§ρεΌ–œΘA(QΚiX¨p9΅Ύηΐ%*yΖrάΩΆ1Θg\\²`κ¬ΛΟ(X¨h°Lžε{>ϋ8( ›ΕάޜΐΠΉ2_Ρ‘*ˆ8ά(U£&¨λΙhΌΗΌώ(ΐ[·ΗtmΝΔRm¦ιΖ׍_‹Ϋ ’₯Κ9 C.‡:έ!7πŠ9–)peΕ‚γJ:h»P6™+³΅]ŒοψώX›7πk―ηdΚ§;ώάρЎΎΟ2>ι1ΰΓ"π#U°†€ͺ²8hΠqη„ dhKum&ΰԊ:^>ŸΒ—―¦‘M)³΄O'Δ?ϋQŸΆ]""dR"Αζ{ΡN-₯D9―₯ε1Zώθ§C CNq:JYκYΟ8Η“τώƒ Ή; £~ηˆ›Vω ΧΊ±Bρύ¨~o•ΫRη ϋ€ '!YΊ@.R$*fΉ1ΊΎο$Δ£ΈY—Mqf‹—܍δ©R¦‚\šiΡ'±qΐΨω”Α#HΛΫ!ξοΪhφ}δRΜ°K™A€{6B‰€γ>vdSLΉX4eγΐΑpF '&ΜΔ¦•h$z‰²π$GA₯¨Κλη,ΤJͺœ¦L+ a‘fΐ2μ»tΨφ0qΨΔƒ' Mh”Y‡ΑΤΚ»ίrLΑrcκπ­Ν ­4˜Ϋ1–ΙV`[‡.μ€α½Ρ(φ§Œ7ϊΈοq{“υϋy|Ν|UPD#ΔS,)₯ΊŽίόF•}f›~ίπ—Α ŸŸ† ΰΉη¬‚αΒ"…ກސ7  šW‹°…*3Εv\άX·)qΑγ“φήOξŒ“γ˜cΨπ~“1ΰiS`l`Ήa`±ͺΟΐH₯ύτή„TE0ŒΣ ρΗΏ’›iŒ‡{Ϋ­ο;δω\‡ίٚ`d‡ΙMtm5%Χτ3N£14vϊ`R‘QP<Ξ/ςϋ %h}ΟI6ž£Ž"†ΚΦ  YΖ₯ίί³Ρκs':›βΌ™žx>χ3F“†Ξd«Α$„οKhͺ€λσ)wέ;C>­λ%•‚†Γ–‡ϋ»6Ϊ}²ΜGjΛZ$ƒV/rgώΞφ-Γ ³'Α¦šΚΥ庁â‡λMB¬Ξ8ύέ:CvG<υ‘ δήΗ|EΗq—K Ϋ ‘K)¨5"ŒΛP]"&°yΰ’; hmΞ8ƒΘe’ήμϊδx Ξκ ‚Y)ϊ¨?T/ιθ|tGzC†!oh±ΉŒν† ωμO£pz-ΐ‡έάωαρiΩf?},*z9ώGC#,Χ τΗArV * Σ=hΉΨ>δ“°Σ°qΰPνΗ¨έχιw~Τ§iœv½¨%Β Λu# !Œν«sΊΤ§HA‚χwl’ Δ…C~ύεΜΜ"&n¬Oθ[?ξΣΞ;ΜΔTΥX‘HJΰε j‘-t/i}Ο₯α$$S'ŠΡ‹ΐ,dΩ2Xv¬QΦ°XΧ‘±J9–+η/Η‚Qχ™YrY‹A/¬Ύμ’; Λ°~6₯bϋΘΑϊžVίG.κ€§ ΫGN’‘˜Ο¨ pFBΌHŠ9χwlμ»‘‘¦\Z˜:Ÿ¦–!p{kΒΏWΤ0_Φ!°sδ’? zωœυPϋmήδυX{‘„ΉŠŽΓΆΗ% &Ÿ7‘4KYδp=™ŒP{ΓνMΊ:g@=%Χ]Κ©h”tψHS‰©»φ ±Œ2r’”Έaδ-Ρσ1š(εεΉXΣρK_ΘΚZιΜβΐΏ ΰύ½Ψβψ4ms~ΞΞΗhθ„΅yK%Ϋ•Έ»=ΑΦ‘ƒα8<™ΗRl$θΑžMiSΑΦ ‘Ό‘ΜUX=6ŸζcηΨMnτληS˜Φ‚‹τζa;!ΝWu|υzz&…ŒΕ%~λ=jΈ!%+w†­buΞ@α”τ4b8‘‡ϊ­t)Έϋ›2–λLχέ8`2KΖβR£ZΤπυ—3ΠN5ΈξlΩτή½1ν·˜n»aβrOκ%ΆΛΞΆG]½aU΄±οΠνM›Vκl7€·n)Ζ Δ Ο”ΙΎςΊJΈ·Γ©}Œw(fUΜWu4»>~ψΑΚ9  3τ¦y(ΆΑ²fu|jυ5’½¦‡ŸήŸ”²Ž0dΟ>Η Ιύ’s ͺQ\4š„τ`Ο‘ϋ»6«ϊώΨ’-’š'A„fΟΓxκT&b¬€η37Ώ3ΰ>D6₯ VβχrwΫ¦r^•Ωh<Λn½έήtĝ-ΆΛ ©ώ(HΠ‹±m\žβ•‹)ωλ_Ιό Α‹}pϋ‡/z=.>Ν@χΑ_δίπΟœ h αλ/gd&%pkΣ‘b†!·Ϋ‡.:ƒˆp|§Mξπ€ws` Υ‚š¨Έ>*€γJ|ϋmv ]›ηΕο Φχl΄>ό€p «]i2eyϊ$)8΄CτF¬pάυK)Xn04ΞTΪ}3U³Z.ΦζMψΎDΰΈγαΦζηLπ†`£ZΠ0_Φ=ΊΉŠž”EυKhu‡lt’±œ>Ϊ₯&nΧ“$ˆΑBν>«ζ!°}ΘΣ–γŽ{6ΌH›A:Όιœ_0Ψ~KrFΧθ—–Lμ·\΅=³*|φ[w\nμV―AμG=όΪλ9< yΉPΣ€±ΧΔbΝΐT(‘”"Σx`8αώΓΕE YKΑ­ [δ3Š4u!omΨτϋoυi>ru§ϊnδάΈΎ–ΒΕE•Bš-Ώ΅„x |ςͺ~‹ΟΒ0yθ/G…C0pKΖδŽΕš»ΫύδŸ– §; M<Άέδί‘–`1«Bcι& BωΘn΄π“;cjv}\?—BΪdΝΒ;[“$}'πψID§πκœ>ΓHψ}½v9%―­Y8ξzθŒνΚθ ™δ(k¨YΉέ³J]%Ψ«!oμ;‰#WW,\_΅@μc‡γΛΈΊja©ΖφYs•΅‹‹Ξ/˜¬­8ύώΨ^H?xoD1 ϋΖΖ$’;87oΒ2Ž;>nnL’f˜νΊ(dXγVΤpΧ‘ ”<Ο/p ½{μ’VdΑΥrމύΡΩζ‹ν2Ÿ QΤΰ‡ί}gHίx5#kEυΜ&]+ͺRΣŽ7!]5ΡϊΨ=ζiΖι ΎέaΗ αxͺͺDΩ€CΏύΓυ†<ΞK›gݝˆ6ήϊψς΅΄\ΣeΜΕΙβ>Έαχ\Ε<ŸU|ΪK€ιψ}0gΰKˆ`Γ/ΆŒ%°sδ&zqHΙ#žRVΕnΣ…"@΄:gΰy΄¦1τs©n]ΆYς)N‹95*1NZ|1PαβŠ)Σ–8sbMwŽγ“W$³)Βεη t†,V/i²Ωυi₯nbμΈ΅ΙŒΑΘ’ŒΖ6χΞGΒ#ATNtr+Χ¬1he8 ’SΡυCΨο\‘”€Ε½?¨ IMεwšΆZ}$„‘zIC3gΌΌlαξφΓI€ω²Žξ0ΐa›Ε\—λF’“x܍›£/tβ2ϊPΚΉΤl–δGΰ)Ϋ qw‡Λšk«υ†Μ¦•3žRεΌ*ρΥ¬όώ{:hy΄P5`κnΗΕι#ͺ²₯ άΫ΅±ίτ(m*X¬ιΈΌl%€ ]#Œν“¦ρΉόΛΉ§!p½οψ»Ρ½yψ’Ι‡‰ΟR‡ΰ{`υWΑ›€X-vmžkθƒΆGn$±PΥQˆτ»>6φlτFAb ΉI‘η3κχžPοGn;Ηn²hŒˆλ}άυARNΕΉyiKΑrCgM(ψt icί₯±’eR•‡~ΰGΧφ›>­ο;τ`ΟI|‚Pb’CJ`eΞ€λ2₯v0f0Pμ3·T3Π(kΨΨwψ΄M)θ ωT[ˆtρ»Φζ L£ ‰wΆmΊ»mc±Ζ ™ώ(ΐ\…ΏΗ{;6š]ΖεΟ•5Xϋ'ο9p’^JwθCWΩΔc0fe#€?g&₯ QqwΗF1§`Ή'R[­^@?}0‘±@U% ΧΟYς• ¦3•‡…‘3jtlΈ½e“eδΣjΤ‰!Β2b{†HŒh\O’=πΩ½'Ν NΧηRKQ_Όœ–ΏρΥ<‚λM;ψ€ϊLΕg-ˆ#cvΐ_ώUΔX•›ƒ•‚Šο½;$]%2*š=/aτ'7‚‘ '!ώΡw»τΚVψ‰™[`ΏιΡ7FtΨ9ι-LŸήŸŒ‹5Vϊ³Š\Z9“>nμ;Ψ>τˆΈ·ν ‹5σ KIτμγίŒjυ}š8|bΖ%F\Þ[0qΨv±±Οι΅λ8κxX¨κHG:xλϋœφμW—-Τ‹:\Ÿ7Šc›%Κβ†]ό݌μ@v\ŠEM‘ΝΊƒα$Έ·kγΒ’‰_x5#οnΫŒšΞp„ Œ&!J9D&—>ΛxΉΎΔhrΆώΫ!€”Έ²bΙλη¬Κ,Α隞΅ιLΉ§«„oΌ’•Ω”‚}—ό@b¬'"1υΫρ$ςA„@ΚδΊ6»>£WV,¬Τ ”²*–Ί|εΌ%UuΖTF€OϋΐίLŸΉψ¬nqό6€=ΐNΖΧ—–M9WΦ±uΰ^ΣΓζ/ώΣ'ˆ©sύίψή»r=‰?φr™”­^@χwJΧ8(1C4E(rCλΑŸŒ_Ή––†>‹dσ|‰ΓΆOΊFθτ}Ό·η`ↀ)„bNΑ/§i‘ͺΛlJΘΨ^|}ΟΑΦ‘‹J^ΕQΗKЊŌ‚TδztΠ:Ι@$€ƒh΄8_ΡqΟΖqΧKΐG»MK5>mΪŽ:tΕεiBΖbLCgΰ#c \X`6­ΰΥRJf-i‹7™Εš.ϋ£€ς%ΡΑ·tΆΊŽ…W..ZPςiύ‘?"ψΔ/Ξ†*ώό/e£¬I]=‘F―[«ηΣ½mc'€Υ†!—κΪ “0Ξ$^½˜’K5?½?Αύ]‡ WV,μ»8h»°]ΦPb9ϊ©ΟξxG]Υ’†Χ.§aΩSΝΎχόU<'ΣΞO*>λΌΰ ή‰η D}lZΘΛ«†TUЍ .rOg¦!ώόbΝ„οτztuΥD!ΛγΑ Ά~‰#Ί_T•°:g’έχqχΠΖΔ !0WΡ0Νύ'W’ 8κ Ψ.K™‘ΔQΗΗ&hχ24’ZI• ΉΎηβ¨γαΪͺ…Œ)Π±ςΝΪΌγ™aͺΙ©Fΰ†§ͺΠL-Ÿn₯Ίΐ—؏ψ±ψθi΄•εΌ*Σ‘6a.­Dˆΐ΄LρΒ7b/,˜ )r$ %zCnήήβqεΥ šJΨ9vΕwͺιZ+ͺSY»ϋt‡>ήΊ5Ζ­Ν υ†lΘ²ίτh8Iα⒁ΨΚk:*EU~γΥ YΏϋFŸŠ9 UlΕΝbM%ΨξloFΧ+ ]ΎrΑB&5λίμΰΰƒ}σάψF­¨!mŠΩρx!Z†ΐqΧΓ{χΗ4q2Ψ=vil3‰¦Ω₯­Ν3•vϋΠA5©΄˜/_Κ©X›3pΠr‘M+˜+λΈΏΛzŠB<τ%„Κ9ϋ-/ηL‡”ΐ\E“σUνρΘΐΈoAΐ8²C»°hαΑžJ$Ω›« ƌŽΌ)Q=Ξb―|†ˆNβϋ»¬β Όu{”d;~ΐ )– €M!c“γItνΉψώO£+ kσFΒe˜ώLΥ’Š_ϊBV^Y±€’©χ6€+>מO">‹MΐG…ΰ ?pΐβτ‹YM( ‘Ωυ™(dpΠΠYRz}ο€LπNΫσi‡ˆ ‘˜04.Ψ·έΔλ]‚έŽ^»œš‘ ΔΌέ›,„™±φ₯‹~^)¨Xi˜PJΆϋ>Ά\E+Ua%άBV‰œi„@βk§Ι™'ΧΪ U9.χΚy wΆ'p}vένF§σbMΗJγμ¦υ0d`ά΄€©?BϊΓ€~ψΑ,]`1Ϊ·έz/Ϊ\ZEΪβΡήhΒ0αzI›ϋΆz>½woBλϋΨ9t©Σχ!!Φ„˜~ΉH“`ˆτΨιΖϊ„ΎύΦ@άΩrΘσA;Gl‰·DcMB.}μAxω|Jώs_ΟceΘn6N=ΐΌ|.βσ’LΗοψ `ιρ Ω/m ωΝ/f±Π#qGK'άέ±qA„§Of]#„’%£Αfse†ΡΆϊ.-Y3#)A¬ς«)4“ώwνρ8jb‡¨ζΩ7.τ%jE « ‡/rΔa±;En‘RBΧ»ΗΌψγ›Ωυ$š]²ŽzQb0 °uΰ ”@wΰc8 ΩzKυ0WΦ±yΐΠθ‰ΓΰŚŽ­C—%ΖρeJπζz’Obβ„ Ίo4 °}δ’© bRΚd‚Σ)Ής„cσΐAΖRpiΩB6₯Μ4ί»7¦oΏ= ήˆeΓΟ-˜X¬±\ZψM/Ea‰·ƒΆ‡ΰh8ιΖϊ{M•‚Šrž';Σ ?~ ±uθΐ2ͺ …¬‚ωŠ&/―̈vΌπCpoxϋEίάΟ:>ΐϊκ*X}ε―8‡¨$ η ΉXΣε^Σ£υ=—zΓΰ j ΰϊ0 y#X›Θ¦lpWύ4>]ς“Œ΄fžG#Όt.%Χχς"k*](η,Υtμ6]μ»˜+λ¨—Έ‘Ÿj•‚Š₯Ί‘hם^Tέa€₯:wΫΧ#CRίπ{M——L² Ž;~τ|v3ΎΈhα’€Bœ’Οˆ…†’v<μ·<άΫ±iΙ„;QζteΩΒΘπΣϋc€-oΌ’•ŠΰΜ‰³!Φ9Ό»mcacMΖvίΗaΫΓω–I›ώH»ΗKnEΎχΆ'Έ²šb‘Φ¨¬˜½ΦŒΰ,`©nDΘΟ‚X_Α;uUΒθ|\Z6ε₯妐αΩF_ ,Ϊω·΄_τMύ<βσΊ€ΟΌ6&ύΣ4D BMεFO.₯ ;πpkΣ&Χ—3‹@lzyΩB"α?μΈ΄ W.€ΞH…K μ|4ΆC4»LΪΡu"φlDNBΓI€E‡© ΖάH;7oβ¨Γώz‰…:<Ÿ_@‰‹EδUœbč&Μe6ptΘIDAT‚°Ϋ<‘cλ3–΅ͺul9teΝ”Ζ4jQBΆzΈ½i'‡q¨Q†“6T ϊƒ·ϊ4νŠ{{ΛΖRMΗωEwΆ&p=‰\Z‰ Έ!{DcΘJώDΧΠυ$Ε:Δ'hFφQ8Ώ`BQœ³„0 ΜvC¬6L”₯ E9‘]‹a»B°X'K΅λR™ΚΨΐ§>όX΄σwπω5lώ\oqΌΰ_Oώu+ˆΨ¨PΚ+ςOB.-ΫςGŒh7²‘—e°ξζ‘sRλŸΚΒhž•kiX|OΣL.A2gηttLƒb[+š8lo7 ΟΟ›hφX‘8ΆΩΚX'μ…˜³±oσΟR N$ΠJ4M@JΙjΑξ L:v6– xΎ$sΚδDφD¨δ;œœmΊ "uvφ=mp©‘Ms?`’c±¦!Λ³jrΌ’Ž_z-+χš.© [©―Ν™8h{¬οmNυ’ΞeΈ°Δ`Ϋ‡Œœ―θMΨή+“R°:g0(¦ε"—V°2Η₯G±—β­M›ͺ ;ŒYε7m l:π!V Ό9 AΘ₯UμΉ‰fŸγ±ΉΙ|•…QvŽ]ψΡΚΣUΒ.¦ΉtA\ru ΖadϊA¨—t΄z~δ5Θ%ΔBΥ`ΌΎΚο9†τž|.‰²ik †όϊK\[΅Nσ3β.؜ζίγJ>·)ιψYΙ¦c ΰ? 5ό+`—β2’&!ΐΔ"VβUαx!ϊ#Ÿ†“0…Ε„*{ήμy 7†σNœc;Δέ›ή4GxεB K5†N¨—ΨyvΊTˆ³!ΈTH[:ͺšMB5ΒQΫΗ½M\\΄Πψ؍NS"ξϊ/Vu”r*L7š­C!xαφGevZ¬κΫ!Ž»Μ„Ϋ:t{ΫΗAΔ ’±bηΨΕbUΗΘQŽJ'šΗΫnˆυ}—–,”sΪ}o&gϋ-­žFYG>κD™WΒAˆ :+/ŸOΙώh@£I5e¦Ž{>‚ΠΖΉ¦F8>΅ψC ˜αά‚/]IΙ₯Ί.cØSιώΜΰϋψ pχŸGό¬eΣΡ§z?P{Μhw›ΊΐrΓΐjΓ€ΐ`ΉΟ”rμ’sΨφ°Ύο$έw Ρ―ƒͺ t>ζ+:L]Α[·Gτ“ΫcΪ=φHSϊγ€A€kβY7‚Έ~ΥUΒOξŽιώCυ’†0”Έ»3œΌf2¨iΎͺ#e*ΨΨw0 ΠoD’αλϋv’cΐ'ͺŽΉŠvͺQνΝ lV™―θPa됉Iρ†h{Ό{U"νΌΑ©ŒIΠ(λ‘‹Š±bb‡X¬ις΅Λi)ΑΞJί~{@ί{w@Ab ώŠ`€£Ž—€ŠΡλ(dU±y¨pwqΙΔ―½ž—_{)#+yυ΄η@œξ\ώuΌWήOKό,fΣ‚3ƒΥ†ώ_  Κ‹5MΞU xν’‡wοqΤρ©Qΰ`7šΰ¬Ξ`i•3„jAΓ½Hu’ρϊ{.=Ψ³A¬ΜιψΒ…4 9–.€ͺΜfŽ'iσΐ‘zQCΚPΠρΝ>ƒNŽ„.jφ#ρΛiy,VΓ °PΥ±}δ$M»ψ½v‡§¦’EST…½Ά\Ό|.…Α˜-Ζf>dz1$7Ϋ=& Π"΄ε恃lJΑΉy7F9―βƒMBΪ9vq{ӎάzm\\²pqΡL@X1r0Ξz4»>ͺzδ=(εΛηSXn°ΗC(ρ°ξώm0}χ…;σΌθψYίβψ‚3‚,Av |ΣΘP²ϊΠ|U“r£IˆƒΆ‡ύ¦7cΛ=a( ςύ]– ‹ωπA(J U!2¦€ή0Α~ΛE6₯Π΅5K.Χuiκ]8>vαϋ DΪo±νΈe Η'‹XξpΗό‚ΣΌ‡0δS3Œ83οYΓq@Ρ―ΕΛPU‚νIφ ”Œω· ΑΖΡc‰XηΏ7dΔήrΓΐύ β»9η':¦A8Ώ`βΖϊ„~r{Œ««V‚ΐŒε·ξοΨΈΈdb΅aΒσΓΒpωχ‚Ŝ"ΏxΕB&₯HUΰQ ;ΊΖ1Xfξ灟νΰa1§†ΐ1N\ΖΙMΔόνΙkEω΄/4ΆCxΑΙcΚy ™”ΐύέHxdϊU$ΫVΉ‘(ΕrΓΐΖΎƒύ¦‡Γއf/ Η‘τΞ½1 FŽ»>tUP«οcηȍ,―δLŠ_Ξ«˜+λθY©ˆ‘sΙΛ!e ,7Ψ’;πσNuςU^]³f²"Πφ‘K£¨Ρg^ΐσN–«©Μ3Ψoy8ξzX¬ιB`‘”ͺšJŒΦ $“Υ"λ 'ά›hυό“M\σΖ ͺ„£λW’V0qYξ›ˆ΅²Ρ¨ρގ Sθ NΖ•D@`σΐΑΕHΞ,nπΕ+ϋΊ~UΎώrFfSΕ¬:Σ#™ϊΪβΰ€:Ίf?ΕΟΠHο£ΔΟ3€§‹Ψ³πΈ Ζθ˜Βl9]Θ*¨•ΨΕ8›±Y%y‘€—ͺ:B άݞΐ?9‘ς… g Ϋ‡'œι ΤJF“0Β.QΧ?V;’δ”₯Δκ«ξΉN‘+-)J9~@ί{o@χvlκB2u›ϋΊƒυHG1Φ˜Ψ\h*a8±Tc=ΐΨƒ/Œ@@’†LdPzΠ:uΒ#φΣIΙb;ό-:‘QρκEK~εz—— T‹ͺLEΙ©Ορ}πb›ώM??ρŸ*~ž|ΈΨ7‘ώ>Ψ­θΰΧΐϊΐ–@„bN‘με Ύt%fΧΗƁƒ=‡E —Q1šΒ³MΔ0ςτ«5μΉLβ™zŽΗ‚žεΌ~²A@δCJΎp=fήٚ$τVΟG£Δ’θέ‘RŽm³<Ÿy큏F™U…vŽ vŽέDSΟρd‚ t\ΆδύΕ‹{λΘΕ₯%Ž+YτL£O(Mt>kΊ\›7P/©I]?׍Ÿ>~¦.xcώ{`ΜώΑ‹ΎA>kρσ ΰ£Eά(όmpIπgΑπβλΜθ1RFPwM%,T5ΉPΥπε«iωoοlzγ¦’0ό\Ϋσαx:MΣ¦M«4ii] $XΑŠ+ώ?φύˆeW€Ψ ›.ˆͺB΄©šL&d’ω²}/‹χzΖ3J€΄~%Λ#Ϋcδ9ηž{Ο9ο;Z³wΣνεlο₯f{O££³E½ζε£±˜{ζ ‰¬UZoγJΑΨςϋ£ΩkΖ™›°Ο!Έ_Κ Η–nOεΔ΅Ι„o/sluRn¬5T+νεΞΚσσΞ~ΚΚyτKλ δhRvΟG΄ΌΪnΦL<νvΘΥ՚[Ώ\cm%VΝCmqι4Συ— ­βί>G)άώi!Ξ**π|Ȑζϋ}ΰS€fό1π°κ ΐ§Aαw»Ίv+dύ ά^oΠω+c«#ጧέΤΖp±ΙψXœfμrŒ1lu#ΖημξgάٌɭγαΦ`2zη·χRξlƜ[jπhgLQΰžΓ`?γΚ…λ« žμŽ4ιX«Ξ»•sύ‘©Τ+žαœςš€Λ v{—–#wν’ˆPW—#’8ta8ϋF ιΏEΣ°/y…‹wN•89μ_ ΧψQ—_cϊgžL ΣΑΝ΅:ΉMTοξ{οϋCΛ`€"™ώΠ2Nν„™hΉ₯W7Nφ¬xV_²\’ΦεNΎβόΑ ηp`9—„tφ#χΘrΗΣnκσϋ ψŒžfŽ₯f@Ν ²#q3PCjΝmΥyλvLIά³ΠJ,;Mο:μμ †§{H`σgΤζ]α„P9€“‡Eͺ°Ώw[(2ψxΥΤύ΅“iΘΐΤψ“pk½α#kφsφzθλυ-ν$4a ΩώaNž;­'ψ›&ΝhFyw‘@‰Γαœ›jι•Ξ—I ’8ΐu™0ϊ ’8$Šΰr»F·ηVΪΪbJš΅ΘΈωθd¦§lτ9ιο#ƒψ‰*ΔΟ`ξ~rϋωοRα8ˆ€λHΦμ}ΰ=Τ‘ΈL)CΘ‚΄ΥD‚Ϋ'Ί¬Σ[ΜhlιJ_^?g8ΎΩXN"3ΞΔΘ;[‘†X‡΅j³½΅ή€«}WšŠ†0Τ4EωwΥ3D!ξΙnJ³nˆ­%wΚγ7’P†^f ώ±ΥωQώugώ|ƒ ±ΓΣ~a―*pzΈΌŽzήήDλ癝ϋ.t fœƒΏΊX5·Ξ睅΅§υN ΄W\cΜTέ8τΖ†Ζz‰χΟ)~Τ3T•4?s€Št~D$ί‘Πώ)―Hώ‹„j pzθ"ψψ •ίDŽΰm”QΈ¬"AΤyC[w1…XβzQhfΔqΰŽzΉωϊδQsϋ2ˆKοΚ ¦Ώ’ Λ” §ŠΚΌ°Θ Ά‘CHρίD‘ΒhΚp!΅QΚρYοp¦Ή§Π0ύ—ίbŽy¬@ŽζzhΡξO”¦ϋuή=@ωωή1ž]αFε^\ϊν!π•?VC†Έκ·η‹¨g!FS‰:zΗufΉ…ζ…qaxŒύ>E΅}Ήμ ΕΊΗ¨Λξ1*’ΪφΧUσχ3‚Κœ-€ˆͺΊƒFΨ2ΔsΨD νχKώs‚ŒΎζ―‹˜Φ)X¦_€Ω¨ϊΠ+ΐΠoG•=+œ9TΰεEF;@£τKΟh[αωρ7 φhΠάRtIENDB`‚(ΐ€ @;;$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’ $~’ $~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’$~’/$~’D$~’Y$~’m$~’€$~’‘$~’œ$~’¬$~’±$~’΅$~’Ί$~’Ό$~’Ό$~’Ί$~’Ά$~’±$~’$~’Ÿ$~’“$~’ƒ$~’p$~’\$~’G$~’2$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’;$~’`$~’…$~’¨$~’Ε$~’Ϋ$~’λ$~’φ$~’ό$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ό$~’χ$~’ν$~’ή$~’Ι$~’­$~’‹$~’f$~’A$~’!$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’-$~’Z$~’Œ$~’Ή$~’Ϋ$~’ρ$~’ύ$~’$~’$~’$~’$~’$£ώ$£ώ$€ύ$€ύ$£ύ$£ύ$€€ύ$€ύ$£ύ$£ύ$~’ύ$~£ύ$£ύ$£ύ$€ύ$€€ύ$€ύ$£ύ$€ύ$€ύ$£ώ$£ώ$~’ώ$~’$~’$~’$~’$~’ώ$~’τ$~’ΰ$~’Ώ$~’”$~’b$~’3$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’"$~’T$~’$~’Δ$~’ι$~’ϋ$~’$~’$~’$~’ώ$£ώ$€ύ$€€ύ$£ύ$}‘ύ#{žώ"u—ώ oώiˆώdώiˆώdώTmώPgώLbώI_ώUnώ^yώNdώKaώOfώSkώώiˆώi‡ώh†ώ nŽώ!t–ώ#yœώ$| ύ$£ύ$€€ύ$€€ύ$£ύ$~£ώ$~’$~’$~’$~’ύ$~’ν$~’Λ$~’˜$~’]$~’($~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’,$~’j$~’¬$~’ί$~’ω$~’$~’$~’$£ώ$€ύ$£ύ$~’ύ#y›ώ pώdώWpώTmώZuBV,9 &2 "- %0EZ7G % % $ $6G@S ( $ % $+8H^,: !, &1+86FSlώVnώb~ώ nŽώ"w™ώ$| ύ$£ύ$€ύ$£ώ$~’ώ$~’$~’$~’ό$~’ε$~’Ά$~’t$~’4$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’&$~’h$~’²$~’η$~’ώ$~’$~’$~’ώ$£ύ$€ύ#|Ÿύ!s”ώe‚ώa}ώώ9J &2 * % '3F[)5 $ % % (@S7G & & & &9JBV * & & %-;F[ $/ % % $ *CX/> % ) &10?Ndc€ώe‚ώ!q‘ώ#{žύ$£ύ$€ύ$~£ώ$~’$~’$~’$~’μ$~’Ό$~’t$~’.$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’O$~’ $~’α$~’ύ$~’$~’$£ώ$€€ύ$~’ύ#yœώ oώRjώ;Lώ*7 *2AEZ "- % & % #.F[5E & & % %0BVAU $0 % % $/?S@T,: % & ) % & %,9?R?R (4 % %1@6G3C6G & %2B6F,:;M ' %-;;M-;;M ' & !,>P;M7H & & % (4G]2A % % $ $6FOfG\ώZtώ p‘ώ$} ύ$€ύ$£ύ$~’$~’$~’ϊ$~’Σ$~’ƒ$~’0$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’6$~’‘$~’ί$~’ώ$~’$~’ώ$€ύ$£ύ#y›ώiˆώDXώ+8 ( $-;EZ %0 % & %,:@T?R '3 % &6G0?-;Q '3 )DY1@ %1?R*7 )>Q &1 %4D6G &1>Q + % !+=OPώ\wώ"v˜ώ$£ύ$€ύ$~’ώ$~’$~’$~’η$~’ $~’C$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’>$~’ $~’κ$~’$~’$~’ύ$€ύ#{žύh…ώLbώLbCX ( % & % (5G]P * %0?9J/=:L ' &G\ώ!q‘ώmŒώ l‹ώώLbώ?R2A '3?R #. (Q?RH^ώFZ5E '4=P ) % %0?R=O3C % & *=PDY*7 % % (4!r’ώ%€€ύ$€ύ#yœώAUώ,9?R>Q/= % %4C3C,9>Q !, *>P %0 %/=Q %1 &=PH^Rjώ mώ$| ύ$£ύ$£ύ$~£ύ%€₯ύb~ώ)6G\/= % & %+8H^1@ & & (:LDY0> % $3C#yœώ$~’ύ$€ύg…ώ !+ %0EZ:L ' & & ",EZ3C & & %0?=O?R)6:Kώl‹ώ]yώ0> !+9K6F2A6F % & % !+@S:K )6EYώj‰ώ$}‘ύ$£ύ$~’ώ$~’$~’ν$~’—$~’+$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’b$~’$~’$~’$£ύ$£ύ"v˜ώPgώ )5 % % (@TCW)6 % % )5:K (9JSkYrώ!r’ώ$| ύ$€ύ$£ύ$~£ύ$£ύ$£ύ#{žύ!t•ώ!q’ώ4DCW?R #- % '9J6F?R '3 $)6=P*6?R #. %F[ώ$}‘ύ$~’ύ$€€ύ_zώ *:L5F>Q %1 % &4CG]1@ % & %)6H^/> % )5!s”ώ$£ύ!t•ώ^yώQ !,.;=O ",:K/= %4D7H (4\wώ$~’ύ$~’ύ$€€ύUnώ0>;M (4D4D %-:=P/= !,=O?R #. % & (=O &1+8Xrώbώ!t•ώ$~’ύ$€€ύ$£ύ$£ύ$£ύ$£ύ#zώh†ώPgώ9JCX3C=P &2 *AU-: (9K5E4D5E % '7H>Q=O * % !+>PAU]yώ$£ύ$~’ύ$£ύZtώ>Q &1 % %1>Q+9?S '4 )>P '2 (8I8I;M,: % #.kŠώ$€ύ#zύ4D $ % '3P3C (:L+8 % & &/>E[+9+8Skώ"w™ώ$€ύ$~’ώ$~’$~’ο$~’Ž$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’:$~’Ί$~’ό$~’$£ύ$~’ύl‹ώ;L ) % %/>EZ>Q)6 & (=O '2 )Lcώ$} ύ$£ύ$~’ύ$~’ύ$~’ύ"v˜ώj‰ώ^yώNf/> $ $/=P *,:?R-:>P #- % ",=PEZ &2 % % #.F\5E % & %5EF[]wώ$€ύ$~’ύ$~’ύ`|ώ2A # $ %8IEZ-; ) (4D5E5E;L )0?6G % $/kŠώ$€ύ#|Ÿύ9I $ % $/CWAT0> ' &;M+8 $ )4CDX@S ( % '4Da}ώ#|Ÿύ$£ύ$~’$~’$~’Λ$~’M$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’q$~’ε$~’$~’ώ$£ύ"v˜ώbώDY & % & %-;9J+8?R1@ *=O '3 $ $/kŠώ$£ύ$~’ύ$~’ύXrώ.<3C6F)6?R+8.<8I & &.<F[:L & & %0?H^+9 % %*6BW@S %0 % #.>Q?R lŒώ$£ύ$~’ύ$~’ύ oώWqώBUώ9J1@CXH^ %1G[ώ1@ &1F[Qώ " %-:G].= & & &;L0? )69J8I.<;M ' & & #.<ώ"v—ώ$£ύ$~’ώ$~’$~’ο$~’†$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’%$~’§$~’ϊ$~’$£ύ$}‘ύb~ώ3B/=EZ1@ ( % %)6:K & %0;N:L@T &2 % &Tlώ$€ύ$~’ύ$€ύSkώ #5F0? $ (5?RBW.< % & '>QBW %1 % (;M6G?R (4 (0?I_,9 % & )>Q?R:Lf„ώ$€ύ$~’ύg…ώ>Pώ5D?RBV $0 % & &8JF[ mώ^yώ0?,99J & & % !+=O@T4CZtώ#{Ÿύ$£ύ$~’$~’ώ$~’»$~’5$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’I$~’Π$~’$~’ώ$£ύ"u—ώJ`ώ #- $ '>QCW:L %0 '7G?R ( % )4DG].< & $:K#{Ÿύ$~’ύ$£ύ pώ1@;N)6 % % (4G]3B8Iώ2A #.>Q3C?R &1)6=O ),:?R4D;M ( '7H?R=O * &1 oώ$£ύ$~’ύ$~’ύ$£ύ$€€ύ$£ύ$£ύ$€ύ$£ύ$£ύ%€€ύ!s“ώ;M=P7H7G & % "-CWQH^*7 $ *BUώ q‘ώ$£ύ$~’ώ$~’$~’ί$~’^$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’p$~’κ$~’$~’ύ$£ύ!s”ώAT % % & &8I/>/>CWUnώi‡ώBU ) & & )@SCW4C ) '2 oώ$£ύ$~’ύ$| ώTlDY %0 $ # '3I_Unώ pώQiώ0?7G &.=?R?R.< % &0?J`-; % % %1H^6F $,9"u–ώ$£ύ$£ύ!t•ώPgώUnώh…ώ pώ nŽώ!t–ώ#y›ύ$}‘ύ!t•ώCW $0 #.?R "- $/Q:K (_zώ$€€ύ$~’ύ$| ύ$£ύ$€€ύ$~’ύ"wšώZtώ5D %0;Mfƒώ$} ύ$~’ύ$~’ύ$£ύ$£ύkŠώ8H2B?R/=>Q %0 % & %0?fƒώ$~’ύ$£ύ$~’$~’τ$~’ˆ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’•$~’ψ$~’$£ύ#{žύZuώJ`=O !+ % & %3C2A.;eƒώ$€ύ#zύQh ) % & )P1@ #.>Q $/ώ$€€ύ$~’ύ\vώPgώ oŽώ$}‘ύ$€€ύ$€ύ#x›ώi‡ώ!p‘ώ$~’ύ$~’ύ$~’ύ$£ύ#y›ύώBV=P9J #. "->Q !, & & % )5J`^yώ"xšώ$£ύ$~’$~’ύ$~’¬$~’"$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’%$~’³$~’ώ$~’ώ$£ύ"u–ώDXώ ) '3F\@S-: ( $-;Skώ pώ$£ύ$~’ύ$£ύ!r“ώ;L !+ % *=P #. '.<@S[v$}‘ύ$~’ύ$£ύ!t•ώώiˆώ"v˜ώ$}‘ύ$€ύ$£ύ$€ύ$€€ύ$} ύTm)5 % &7H;M?R+8 $0?R '23BPH]$} ύ$~’ύ$€ύf„ώ.<?R+81@9K '/>?REZ,9 % %2AI`.< & &9J/>ώ$€€ύ$£ύVoώ ) (4CWώg…ώ#|Ÿύ$~’ύ$£ύ$£ύ$~’ύ$~’ύ$£ύ!t•ώDXώQ #. % %+8Of"v˜ώ$£ύ$~’ύ$~’ύ$~’ύ$£ύ$£ύ$£ύ$£ύ#{žύl‹ώWpώf„ώ\vώ?R.< (5@T #. (5>QAU2B % '6GJ`,: % %4C`|ώ$~’ύ$~’ύ$£ύh†ώH^.= % );M=O=P $/*7=O !+0??RBU*6 % %.<EZe‚ώ$£ύ$£ύ_{ώ %1 $ $/@Tdώ$}‘ύ$~’ύ$~’ύ$~’ύ$£ύ nŽώDXQ=PG] pώ$£ύ$~’ύ$~’ύ$~’ύ$| ύRjώPAU ", % %,9;M]xώ$€ύ$~’ύ$~’ύ$~’ύ$£ύ#y›ώ pώa}ώRj1@ #.DY@S (4=OCXKa:Kώ #0?J`5E ( (:L@SQF[\wώ$£ύ$£ύc€ώ0?/>>QLcώ"u—ύ$~’ύ$~’ύ$~’ύ$£ύ mŒώH^=P+95F0? % & %/=:LH]a}ώ5F "-=P %0 % & $ )5a}ώ$~’ύ$~£ύ$~’$~’η$~’^$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Q$~’γ$~’$~£ύ$} ύώEZ@T (4 ' % %/>7H % % !+2BOf#x›ώ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!s•ώ6F1@H]7H $/ %1A3BBUώ$~‘ύ$~’ύ$~’ύ#x›ώPhώ4C@S-;*7=P@T7H % $,9EZQhWpώ #.>P/=:K9J6G9J *2A?Q?R/=Wpώ$€€ύ$~’ύ$~’ύ"t–ώg„ώg…ώRiώQiώTmώLbBU '3 (5@SF[6FH]ώ !,>P7G?R/=8Ja}ώ$£ύ$£ύc€ώF[:LDY!s”ώ$£ύ$~’ύ$~’ύ$~’ύ mŒώMc4C ", $5E0> % % *9JEZVpώ#|ŸύYsώ/==O ) & % %,9Ja^zώ#zύ$£ύ$~’$~’ο$~’j$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’[$~’θ$~’$£ύ#{žύOeώ !+ #-DXBV:K)6 ' '3P !, % &2F[@T*7 )@S "- % & %Ka$~’ύ$~’ύ$~£ύ"u—ώ"v˜ώ$£ύ$~’ύ$~’ύ]yώ=O ' %07GH^7H $/`|ώ$€ύ$~’ύ$~£ύVpώCWCW &1 %-;9J.<J`Tmώk‰ώ!t•ώ$} ύ$~‘ύYtQ4D>Q2A;M4D-;Vp oώ pώ!q‘ώ"v˜ώ#{Ÿύ$~’ύ$£ύ$€ύ$€€ύ$£ύ$£ύ$£ύ$€ύ$£ύ$£ύ$£ύ$€ύWqώ>P5E?R %0 $ !,\wώ$£ύ$€ύ_zώUnώ#zύ$£ύ$~’ύ$£ύ#zœύVoώ-: )5Q*72AQi[vώNeώPgώ]xώ pώ!r’ώ!r’ώ"w™ώ#|Ÿύ$~’ύ$£ύ$€€ύYsώ '3 %3B7H (49Kώ$~£ύ$~’ύ"v˜ώ#yœώ$£ύ$~’ύ$£ύ"v˜ώMdώ !+ $ $/=P ) (*7BVBU,: ' '3h†ώ$€ύ$~’ύ$~’ύ#{žύ`|ώLbEZ5E $/ '3=O ) & & %Q4D $0Ofώ$€ύ$~’ύ$€ύQhώ:LWpώ$}‘ύ$~’ύ$£ύ!q’ώ0> # %1=P * %0BV#yœύ$~’ύ$~£ύ#x›ώMd6FRjώ!q‘ώ#zžύ$~£ύ$€ύ$£ύ$£ύ$£ύ#zύ"t•ώZtώ '2 #.?R=P=P2A=O4C1@@S>Q=O (59JQ0?;M=O@S/> # "-ώ$~£ύ$~’ύ$~’ύ$~’ύe‚ώI_5E #. & %2A5E % & % %2AVp"w™ώ$£ύ$~’$~’υ$~’q$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’L$~’ε$~’$£ύ"wšώATώ ",=OF[=O0? $/Qdώ$£ύ$~’ύ$~£ύG\ώ8J-:a|ώ$€ύ$~’ύ$£ύg…ώ5E2A9J % $/>!p‘ώ$£ύ$~’ύ$~’ύ"u—ώ#x›ώ$£ύ$£ύ$£ύ$€ύ$~£ύ#{žώ pώSkώLc=P4D@TEZ:L *3BH^DY0>+9AUAU=P,:8HCXCX/= &2AUJ`;M !,4D=P7G=PAT4C % )5BV:L=P=O:K 'F[ώ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ`|ώ *6 *>Q #- !+0>G]>Q,: (4D0> (Rjώ$~’ύ$~’ύ$~’ύ$~’ύb~ώ9K@S * % & ';L+8 $ ' &25FEZ8I=O!r’ώ$£ύ$~’$~’ρ$~’f$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’=$~’ή$~’$£ύ#x›ώBVώ & %,9=O*79Jώ#y›ύ$£ύ$£ύ!r“ώ1@ $ (5P=OCWF[.< (4@T:K>Q@TEZ4D1?G]G]@S-;@TG]F\1?4DG]G\Q:LAU*7 $ %4D2BH]ώ#|Ÿύ$~’ύ$~’ύ$£ύb~ώ &2 (4;N ' & & "->Q &2+8:K>P?S=P ' $8I!s”ώ$£ύ$~’$~’ν$~’W$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’-$~’Ρ$~’$~’ύ#{žύG[ώ & & & !+>Q %0 (6Gb~ώ$£ύ$~’ύ$€ύdώ %1 ",>P !, % ",h†ώ$€ύ$~’ύ#{žώMdF[6F %1AUώ#zύ$~’ύ$~£ύ"x›ώUnώ5E9J@SF[F[#yœώ$£ύ$£ύ$| ύ"v˜ώj‰ώTmώLcEZ?R %01@@S3BCWG\EZ5E@SEZAUH^H^I_@SJaLbLcAUF[KbKaDY@SG\>QE[CXEY,:7HBW:LATG\8I !,9J4D (4>QNfOfώ^yώ"wšώ%€₯ύ_{ώ.<=O-;9KF[?R &2 '7H.= $ $3BUmώ"xšύ$£ύ$~’ύ$£ύ!r’ώ-; #.=7H % % '-;F[>Q@S6F *8I/> % & %Q-:/=:K & $1@5E %12AQiώ#zœώ$£ύ$~’ύ$~’ύ$~£ύ#yœώLbώ *3C2B ",.<:LF[;L $01@^yώ5E>P #. & & % )Pgώ#{žύ$£ύ$~’$~’Τ$~’.$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’£$~’$~’ώ$}‘ύWpώPF\:K9JH^@SI_KbF[/=1@8I@RώEYώJ`ώMdώPhώRjώSkώQhώOfώMcώG\ώATώ=P:K5E1@7H?RDYBUF[KbG\EZF[>P.<@S (4*8CW4C;LI_EZ0?8I4C $ ",>Q %0 &29KF[Q:L2BBV)6 % % 'Riώ$~’ύ$~’ύ$£ύ nŽώFZ7H/>Ka#|Ÿύ$~’ύ$€ύi‡ώ )5=P #- $ #.QJaLcF\9K.<-;1?:KH]ώXqώe‚ώ oώ"v˜ώ#zύ$}‘ύ$~’ύ$€ύ$€ύ$€ύ$€€ύ$€€ύ$€ύ$€ύ$€ύ$£ύ$}‘ύ#{žύ"w™ύ!q’ώh†ώ]wώPgώBV6G6F=PEZDXCWI_=ODYF[AU@SF[.<0?:L & &1>Q '3-:DYAU=O;L?S/=g…ώ$£ύ$~’ύ$~£ύ"x›ύOfώ`|ώ#{Ÿύ$£ύ$~’ύ l‹ώBVPώ$}‘ύ$~’ύ$£ύi‡ώ@TG\6F+90?PG\EZF[JaKa@T5E.<.<:KOfώc€ώ!s”ώ#{Ÿύ$£ύ$€€ύ$€ύ$£ύ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$€ύ$€€ύ$£ύ$| ύ"u—ώh†ώWpώEYώ7G7HCWKbG\>QDX+8=O5F)6CX8I8IG]CW9J=O:L ( *CWdώ$£ύ$~’ύ$~’ύ$~’ύ\wώ?RG]Ofώ!t•ώ$€ύ$~’ύ"u—ώ#zœύ$£ύ$€€ύ$£ύ$~’ύ$~’ύ$~’ύ$£ύ$£ύ$~’ύ!s”ύXrώ1@1A=P ( % #-]xώ$£ύ$~’ώ$~’ϊ$~’x$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’4$~’ή$~’$£ύ!s”ώ1@ $ & & !+>Q (4 % % % '3CW5E:L>Q=PTm#x›ώ$£ύ$~’ύ$£ύUmώ %G[ώ$£ύ$~’ύ$€€ύUnώ (4BV5E9KDXEZ;MVoώ\wώ4C.;BV/>+9CW1@:LH^AUF[=O/=,9=OXqώ oŽώ#{žύ$€ύ$€ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$€ύ$€ύ$} ύ!s”ώ`|ώJ`ώ;M8I@TKbI_EZF[DXQ !+ & & % (G\"wšώ$£ύ$~’$~’Σ$~’'$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Š$~’ώ$~’ώ$}‘ύQhώ6FG]@S:L2B)6 (5@S $/ $ % %2A6F % & $3B6FUnώ$£ύ$~’ύ$£ύ!s”ώ!p‘ώ$£ύ$~’ύ$~’ύMcώ3C?R &2 %0>Q*7 *;M/= $0AU2A8JI_BW@S2A+9?Rb~ώ#y›ώ$€ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$€€ύ#|ŸύjˆώMdώ7H;NJ`KbF[F[CW@SG]9J>P>Q4Ceƒώ$£ύ$~’ύ$£ύi‡ώ*6 #)6;L ", &23CPh!pώ$£ύ$£ύ!r“ώ3C ( $ !+>Q $. & & &5E3B $ & !+ (47HH^Wqώ#{žύ$~’ύ$~’$~’§$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’R$~’ρ$~’$€ύ`{ώ "- &;L5F+84D;M>QF[;N,: &1 * '3>P ) % $+89J '3h†ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{ŸύH^>QEY=P@SH^@S@TH]@SEYDYG]MdE[0? (4DWώi‡ώ$| ύ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$~’ύ pώQiώQ+8 %1>P *-:iˆώ$~£ύ$~’ύ$~’ύeώ9J:LF\>Q0?9K>Q@SG\-; #.Umώ$~£ύ$~’ώ$~’ϊ$~’p$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’"$~’Π$~’$£ύ pώ.; % % '4>Q !+ % & #-7GTmVpWqOfCWF[5E+8 &1)6>Q )4D!t–ώ$£ύ$~’ύ$~’ύ$~’ύ$~£ύ"w™ώ-;1@4C &/>:L "-9K8I/>G]BUCW5E*7BUώi‡ώ$}‘ύ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$£ύ!q’ώQhώ7G?RLcG\EZDY;MG\?Q;MLce‚ώ#| ύ$£ύ$£ύ!t•ώNe?R $/ (0?5F $Vnώ$€ύ$€ύh†ώ "- $6F3C #.*72B>QF\=O6F-: $/4D7H & % &2g…ώ$€ύ$~’$~’δ$~’8$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’˜$~’$~’ύ#{žύ@Sώ $ & & &7H2B (6FXrώ pώ#{žύ$| ύ$}‘ύ#|Ÿώ!s”ώa}ώG]8J=O?RG]=P8IZtώ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u—ώ5D:L6F)5P;L5FDX-; ( % % #->Q %0 % & $5E"v—ώ$£ύ$~’$~’΅$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’T$~’σ$~’ώ$£ύj‰ώ5E #. ) & % $/FZYsώ#x›ώ$€€ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$~£ύkŠώ6F ( ",=O5F-;3Bb~ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ]xώG]>P=OF\7HBWBVCWEZ0?.;Voώ#y›ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$} ύd€ώ>Q9JH^H]8IDY-;1@PEZCW=O:K3C9Jl‹ώ$€€ύ$~£ύ$~’ύ$£ύ$£ύ$~’ύ$£ύ$£ύ$~’ύ$~’ύ$€ύ!t•ώ:K $4D1@ $ $>Q"u–ώ$£ύ$£ύ#{ŸύWpώ.<>Q #.,:AU2AG\Ja8I &1ASώ oŽώ$£ύ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύ"v˜ώPhώ9KG\LbBUG\?RG]?R@SXrώ!t•ώ$£ύ$£ύ$} ύ oŽώa~ώa}ώ"t–ώ$£ύ$~’ύ$£ύmŒώ %0.<7H % & %5E3C % & $ $/ώeƒώ %0 ) $/*7=OLc nώ$£ύ$~’$~’α$~’0$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’†$~’$~’ώ#{žύ?Rώ $0?>Q '4*7AU!s”ώ$£ύ$~’ύ$£ύ#zύ oώeƒώa~ώfƒώ!s”ώ$~’ύ$£ύ$~’ύ$€ύ pώ/</=8I ( (5FPgώ#zύ#yœώXqώ-;3BF[;MDYCXJaI`3C+8Xqώ#{žύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$~’ύfƒώ?R=PBVG\/=8I4D %1?R8Ih†ώ$£ύ$~’ύ$£ύ$~£ύ$~’ύ$~£ύ$~’ύ$~’ύ$}‘ύH]ώ %8I-; $ % *>P &1 & ).<Zuώ#|Ÿύ$}‘ύVpώ=O=PEZAU+89J"v˜ώ$£ύ$~’$~’₯$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’9$~’θ$~’$€ύώ * % );M.= $/c€ώ$£ύ$~’ύ$~£ύh†ώ9I,:.=5EF[AUSlώ"v—ώ$£ύ$~’ύ$£ύbώAUF[P %0EYώ"v—ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ#|ŸύWqώ:LH^CXCWBVCWDY=PJ`_zώ!t•ώ$| ύ$£ύ$~’ύ#zώf„ώBVQ=O;LEZPF[7G9JF\CW3B*6]wώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύkŠώ;MBVKbCWF[,:7H3B #6F,9 !+98I % %6F0> # $/Kaώ"v˜ώ$£ύ$~£ύ$~’ύ$~’ύ$~£ύ nŽώKaώmŒώ$£ύ$€ύh†ώ %0 & ) !+*7F[ lŒώ$£ύ$~’$~’Ω$~’$$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’e$~’ϊ$~’ώ#|ŸύATώ #.AU7H,9/>@S"w™ώ$£ύ$~’ύYsώ;M=P?REZDX=OQBV;MDXDY=O?RPha}ώ#y›ύ$€ύ$~’ύ$~’ύ$~’ύ$~‘ύ!pώTm?RQ !+ )6!t•ώ$£ύ$£ύKaώ:K=O9KF[>P>QEYCW1@-:g…ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!t•ώ@R@TKb@SDY &22A4C %6F1A )5Phώ"w™ώ$£ύ$~£ύ$~’ύ$~£ύ$£ύ$~’ύ$}‘ύ^yώ,: * ) '3BKa"v˜ύ$£ύ$£ύXqώ0?=O !+ & %1?"u—ώ$£ύ$~’$~’Œ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Λ$~’$€ύa~ώ * % % % '9J4D^zώ$€€ύ$€ύdώ6F7H & % $)5=O ) ' !+Q3CF[=PPh#yœύ$€€ύ$~’ύ$~’ύ$£ύ$~‘ύ nώ:K,9 nώ$£ύ$£ύTlώ & %7G3B $ (4mŒώ$£ύ$€ύi‡ώ %0 $ % % (AU"xšώ$~£ύ$~’$~’„$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Α$~’$£ύf„ώ;MH^>Q:L;M:L9K=Pj‰ώ$£ύ$~£ύ"w™ώEY=PF\8H4D1@8I@T)6 $/)5Lc"t–ώ$£ύ$€ύUnώ "-:LCXBVDY@SQ ",9Jώ$}‘ύ$~’ύ$~’ύ!t•ώ\wώLc:L7GUnώ$}‘ύ$£ύ"w™ώ>Q0>DY0>+8*7Mdώ$}‘ύ$~’ύ$}‘ύOfώ/=2B3CQ $/ # $/f„ώ$£ύ$~’ύ#zώOf=PEZ5F2BKbCW $/Neώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’€$~’$~’$~’$~’$~’$~’T$~’ς$~’ώ$~’ύ$~’ύ$~’ύ$~’ώ$~’ύ$~’˜$~’$~’$~’$~’$~’q$~’χ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύcώ:KKaG]F[1@;M6Gf„ώ$£ύ$€ύa}ώ5EP oώ$£ύ$£ύ nŽώLb>Q8I9J8IBU nŽώ$£ύ$£ύ"wšώDX3CCX?S,:;L"w™ώ$~£ώ$~’ώ$~’q$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’«$~’$€ύh†ώ #. % (7H8I ( & & $8I#{žύ$~’ύ$£ύ oŽώ.;*7Q $/ $ (]wώ$€ύ$~’$~’Θ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’6$~’λ$~’$~’ύFZώ $ & & *;M3C & % % "-fƒώ$€ύ$~’ύ$£ύj‰ώ9Jώ?R1@+82AATUnl‹ώ$~’ύ$~’ύ$£ύe‚ώ1@DYAUH^3C2A!r“ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ό$~’ $~’$~’$~’$~’$~’$~’$~’b$~’ό$~’ώ$~’ύ$~’ύ$~’$~’w$~’$~’$~’$~’$~’$~’$~’Z$~’ϊ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{ŸύG[ώ;MLc4D5E=P;Miˆώ$£ύ$£ύ!r“ώ1@ ' %0>P !,Rjώ$£ύ$£ύ!r’ώ@Sώ &2 %0?;L )Qhώ$~’ύ$£ύ#{žύQi '3 % & $:K#{žύ$~’ώ$~’ψ$~’S$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ˆ$~’$£ύ!r“ώ+8 % & ' ' %0@S/= "- %1 '3H]$| ύ$~£ύ$~’ύ$£ύ"xšύj‰ώa~ώ]yώ`}ώ nŽώ#{žύ$£ύ$~’ύ$£ύ pώ6F4CH];MDYDY9J '2e‚ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’*$~’ζ$~’$~’ύ$~’ώ$~’ο$~’7$~’$~’$~’$~’$~’$~’$~’)$~’ζ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!s”ώ=OF\H^DX5E !,Lc"u—ώ$£ύ$~’ύ_zώ=O@SBV,94D!r“ώ$€ύ$}‘ύ`|ώ+7 $/?R %0 #/<"wšώ$|Ÿύg…ώ3C % & & % "-g„ώ$€ύ$~’$~’©$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Σ$~’$£ύg…ώ>P8I9J;MQ4D?R?R,9)5I_ώkŠώVp9J !, !+ * ) ( 'I^ώ$~’ύ$~’$~’η$~’/$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’W$~’ω$~’ώ#y›ώ>P;LDX-:)6 (5 &1 $/.<AT &1 ' & (EZώ"v˜ύ$£ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$€€ύ#{ŸύfƒώDYCW,9 &1EZF[Lc2A8I"xšώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ι$~’,$~’$~’$~’$~’$~’$~’$~’$~’$~’˜$~’$~’ύ$~’$~’¨$~’$~’$~’$~’$~’$~’$~’$~’$~’Ή$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύOfώ8IDXBV9JG\AT oώ$£ύ$£ύbώ@S !+ $=O^yώ/= '3+8 &7G8I>PEZ@SP1A %;L#{Ÿύ$~’ώ$~’ς$~’@$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’d$~’ύ$~£ώ"wšώ2A $ & % )9J6F ( & ) "-.<EZ9J:L>Q=O>QBV '3 ) +=O %1 &1@F[>Q>Q9J6FMd8J0>!t•ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ$~’ύ#|Ÿώ$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’z$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Χ$~’$~’β$~’$$~’$~’$~’$~’$~’$~’$~’$~’$~’h$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ!pώ^zYt\x mώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύH]ώ@S@SF[>PAT8I!q’ώ$£ύ$£ύ\vώ@TF[Q1A ' % %1mŒώ$£ύ$~’$~’†$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’«$~’$£ύi‡ώ@S (4 !+ $/ '30>F[=P:K=P>QP=O8IP !+;M5EAUAUAU0?6F#x›ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ#x›ώbώYsVpUoWr oώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’η$~’*$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’‚$~’$~’’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’5$~’ο$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύi‡ώUoVpVpVpUod‚ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύNdώ?RJa2B?S2AF[!s”ώ$£ύ$£ύ"v˜ύa}ώKaώ,9>Q #. !+ &17HEZ9JP>P;M8IBVBV-; (5 &1 #. );M#{Ÿύ$~’ώ$~’ρ$~’=$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Z$~’ϋ$£ώ"v˜ώ8I '3-;BV0> ( & % "-=O0? & & & (9K2B ) &23CG]CX4C '3;M,9 "-@SBW6FI_CX $0]xώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#|Ÿύc€ώUoVpVpVpVpZu"s•ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ι$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’S$~’ω$~’b$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’!$~’ΰ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύe‚ώUoVpVpVpUo`}$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ pώ;MJ`H^DX ",7GJ`!r“ώ$}‘ύ!pώEY "-8I0? % % !+=O,: % ( !+ $/-;EZ9K5E9J;M=P=P@TH^"t•ώ$£ύ$~’$~’|$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’™$~’$€ύd€ώ * % % '4?R.< & & % $0?R-; % & !+/>G\?R=P5E1@>Q * #/=BV>P@T8J6GMd5E7G#yœώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύiˆώVpVpVpVpVpVpUobώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’+$~’Ω$~’8$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Ξ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύe‚ώUoVpVpVpUo`}$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύOfώ=O?RF[=PAT '20?Tmώ:K;M@SF[-; !+ '5E6G ' & & % *:L5E ' % & ' ()6BV5FZtώ$€ύ$~’$~’Ή$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Ο$~’$£ύLbώ % & & % &2?R0> & % %*7CW4D8I>Q;N9KBV $/ % &8I1A,:?RG]*7*7G\G\F\ '3ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"t–ώYtVpVpVpVpVpVpVo^z#{Ÿύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’u$~’$~’$~’$~’$~’$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’·$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύe‚ώUoVpVpVpUo`}$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ nŽώ5EG\CX4DH^5E-:;M ' )=PP %?R$}‘ύ$~’$~’ε$~’)$~’$~’$~’$~’$~’$~’$~’$~’$~’;$~’ρ$~’ώ#{Ÿύ:L $ & % % % '2AU4D0>9J=P@SG]6F $/ ( '7H4D & )5EI_Q !+ ' )5DYP=O6G-:8IQ=P@S4D % %3C8H ' * '31@EZF\?S9J2A*7 $/1@?R '2 $ % % *dώ$€ύ$~’$~’’$~’$~’$~’$~’$~’$~’$~’$~’$~’₯$~’$£ύh†ώDXG\EZ>Q6G0? )5 ", %0=P0> & & &4C:K !+ '36FCXG\+8 &*6=P4DBW@S-;J`@S*7 oώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#yœώ]yVoVpVpVpVpVpVpVpVpYt"w™ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ζ$~’$~’$~’$~’$~’$~’ $~’ΐ$~’t$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’e$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύeƒώUoVpVpVpUo`}$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{žύATAU>QF\7G=P !+-:G]@S4D-;?R #. % & %.;>P %1 %0-:4D & & &1CWCW>P2A %1:K0> &+8H^P?STm$}‘ύ$~’$~’ζ$~’)$~’$~’$~’$~’$~’$~’$~’3$~’ν$~’ώ#{žύ6F # % )5E>P &2 % & & $ &1AU5E9J>Q8IAU0? % $ &1@S9J>P;M6G )5F[>QAU $/_zώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u—ώYtVpVpVpVpVpVpVpVpVpVpYt"w™ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’r$~’$~’$~’$~’$~’$~’B$~’χ$~’Μ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’V$~’$~’$~’$~’$~’$~’3$~’ξ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύf„ώUoVpVpVpUo`}ώ$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!q’ώ:KKb:L6G@T?RCX )5 #+8=P.<:L>Q8IBW.< % % % )8H:K !+ % % % % )3CCW>P"u—ώ$£ώ$~’ω$~’Q$~’$~’$~’$~’$~’$~’$~’[$~’ό$£ώ!r’ώ )5 % & & '.=?R*7 ' #..<9JAUG]:L "- & '3?R &2 *1AF\AU ", #.CW@S@TI`9J-;"u–ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύc€ώUoVpVpVpVpVpVpVpVpVpVpYt"wšώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’φ$~’G$~’$~’$~’$~’$~’$~’l$~’$~’κ$~’.$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’($~’”$~’$~’$~’$~’$~’$~’ $~’ί$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύf„ώUoVpVpVpUo`}ώ$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύG\ώDYI_F[ (50>H^;M*7=O*7 $ & )5EZAU>Q6F*7 #.8J8J ) % & & % !+7H=O &2 ",h†ώ$€ύ$~’$~’~$~’$~’$~’$~’$~’$~’$~’‡$~’$€ύf„ώ !+ % % % & )3CG\?R>Q9J.< #-)6?R (4 % %1@BV>Q8I+8>Q '30?H^2A7HMd.<DXώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!oώWqVpVpVpVpVpVpVpVpVpVpVpYt"wšώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’β$~’$$~’$~’$~’$~’$~’$~’™$~’$~’ϋ$~’W$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’M$~’Α$~’$~’$~’$~’$~’$~’$~’Μ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύf„ώUoVpVpVpUo`}ώ$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€€ύ\wώ9JATF[5F8H3B/=DXEY &2 % '7H6G ) &11@>PF[G\0? $/ ( % % &2=P6G !+ % &Xrώ$€€ύ$~’$~’©$~’$~’$~’$~’$~’$~’$~’―$~’$£ύdώ5E #. $0.;7H=P=O6GAT8I ( % & %+8?R (5.<>PDYPG\ '3 )>Q9J>Q4D4CQ & % & $H]ώ$£ύ$~’$~’Μ$~’$~’$~’$~’$~’$~’$~’Π$~’$~’ύWqώF\EZDY9J/= &2 ) % "-;M7G ) % % "->PI_=O )5 #.=P,9 '4>QG\ (4+8G\?R:K )6!q’ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύiˆώVpVpVpVpVpVo^zj‰ώVpVpVpVpVpZu#xšώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’š$~’$~’$~’$~’$~’$~’#$~’α$~’$~’$~’΅$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ͺ$~’ο$~’/$~’$~’$~’$~’$~’$~’›$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύf„ώUoVpVpVpUo`}ώ$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#|ŸύBVF\BV-;F\;M6F8J ' #.;MJa;M &1 & )9J8H ) % & !+,9EYEZBV:L3B*7 #. &9J#|Ÿύ$~’$~’ζ$~’($~’$~’$~’$~’$~’)$~’η$~’#|ŸύI^-;.<@S5E ) % & & % *8I9J (44D?R7H8I:L ( $+9EZ@S-:3BQ8JPQ0> #. & &2>P4D ) % & % % ',:DXCX!q‘ώ$£ύ$~’ώ$~’d$~’$~’$~’$~’$~’a$~’ύ$£ύ nŽώ &1 % & & '.<?R/> &13B>Q;M.;5E;M ", % % '3F[DY.< #.=O4C>QAU8IF[F\ &1a}ώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!p‘ώWrVpVpVpVpVpYt"t–ώ$€ύ!oώVpVpVpVpVpZu#x›ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ΰ$~’!$~’$~’$~’$~’$~’$~’$~’$~’ύ$~’ύ$~’$~’{$~’$~’$~’$~’$~’$~’$~’$~’m$~’ώ$~’$~’|$~’$~’$~’$~’$~’$~’H$~’χ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύg…ώUoVpVpVpUo`}ώ$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!s”ώ6GDYDYAUCW,9 );MJa2A ( &4C;M #-)68I>Q:LCW1@ & % & & % *4C?R.< ",d€ώ$€ύ$~’$~’„$~’$~’$~’$~’$~’~$~’$€ύe‚ώ * % & % & #-7HI^G]:K '2 ( % '3CQ:K@T &2 %5FJ`-:+8H]CWP (4 &.<=O3C>Q?R0?7GG]BW3B2A#yœώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύj‰ώVpVpVpVpVpVo\x#y›ώ$~’ύ$£ύ!oύVpVpVpVpVpZu#x›ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’—$~’$~’$~’$~’$~’$~’&$~’δ$~’$~’ύ$~’ύ$~’ώ$~’υ$~’X$~’$~’$~’$~’$~’$~’M$~’π$~’ώ$~’$~’²$~’$~’$~’$~’$~’$~’$~’ή$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύg…ώUoVpVpVpUo`|ώ$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύMcώBWH]P &1 ( (45E=P * '4D:L*7=P8I>Q*7.<H^3CQ@T-; % % '3EZH^7H #. & % (1@?R-; ( *)65E=P=O3CG\$}‘ύ$~’$~’ά$~’$~’$~’$~’$~’Τ$~’$~’ύCVώ $ % !,4C?R0> ) % ' (48J?R?R &*7DX?R0?DXF[F[ $/Ztώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!q’ώWrVpVpVpVpVpYs"t•ώ$£ύ$~’ύ$~’ύ$£ύ!oύVpVpVpVpVp[v#y›ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’έ$~’$~’$~’$~’$~’$~’$~’‘$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’$~’$~’ύ$~’ύ$~’ύ$~’ώ$~’μ$~’1$~’$~’$~’$~’$~’$~’˜$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύg†ώUoVpVpVpUo_|$| ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ nŽώ8ILc:LP0> !+ (4DF[AUώATώCW;MQ>Q "-dώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύcώUoVpVpVpVpVpg…ώ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!oύVpVpVpVpVp[v#yœώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ό$~’ $~’$~’$~’$~’$~’$~’Θ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’χ$~’H$~’$~’$~’$~’$~’$~’|$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύg†ώUoVpVpVpUo_{$|Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!u–ώPH^EY*6 & % & & % $/6G>Q/=3B"w™ώ$~£ώ$~’π$~’6$~’$~’$~’*$~’θ$~’#{žύ5E $ & % % !+0?EZG]@T $/ $ % 'H\ώ"w™ώ$~’ύ$~’ύ#xšώI^ώ #-Q-;>Q=PAUI_?S %1lŠώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύ_|UoVpVpVpVp\w#x›ώ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!oύVpVpVpVpVp[v#yœώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’“$~’$~’$~’$~’$~’$~’)$~’ζ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’b$~’$~’$~’$~’$~’$~’`$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύg†ώUoVpVpVpUo_{$|Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#yœώ>PG\H^?R $/>QF\ &1 $ #.CXG]1@ (+8EZώRjώWqώ5E0?>Q:L+8 ) !+2A?R4D "- $+8"u–ώ$£ώ$~’φ$~’E$~’$~’$~’1$~’ν$~’ώ#zœώ;L ' ' %04C>Q:K*6 %08I=O (4 $9J#yœώ$£ύ$~’ύ$~’ύ$£ύ#yœώ;L5EKa0? $9JDY+8J`>P )6!r’ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύf„ώUoVpVpVpVp mώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!oύVpVpVpVpVp[v#yœώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’f$~’$~’$~’$~’$~’$~’M$~’ψ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’~$~’$~’$~’$~’$~’$~’F$~’φ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύg†ώUoVpVpVpUo_{$|Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύ@S@TCXAU %0=OBV6F "-9J7G (5;MLb oώ$£ύ$€ύ$~’ύfƒώ-: *-;=PATCW=P %0 % % % (4!q‘ώ$£ώ$~’ϊ$~’N$~’$~’$~’8$~’ρ$~’ώ#x›ώKb>QQ3C\wώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύf„ώ;M/>>Q0>@SAT=OKb8I,9"u–ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ"w™ώ]yVoUoWqf„ώ$|Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!oύVpVpVpVpVp[v#yœώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ς$~’<$~’$~’$~’$~’$~’$~’y$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’š$~’$~’$~’$~’$~’$~’/$~’λ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύg†ώUoVpVpVpUo_{$|Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~‘ύDXώBWEZ:LDX7H !,8JEZ;L ) $ *6 pώ$€€ύ$~’ύ$~’ύ$~’ύ%€€ύ]xώ * &1Q9J?R7H)6 ) % %0 nŽώ$£ώ$~’ϋ$~’W$~’$~’$~’B$~’υ$~’ώ"xšώJ`=O>Q@T,: ( % & & % '4CI_ mώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύg„ώ #. %5EI_+81@F\@T1A0?#x›ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#x›ώ l‹ώh‡ώ!pώ$| ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ nŽώVpVpVpVpVp[v#yœώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ϋ$~’$~’$~’$~’$~’$~’$~’₯$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’΅$~’$~’$~’$~’$~’$~’$~’ά$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύg†ώUoVpVpVpUo_{$|Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύKaώDXAU+8I_2B &4DDY=P %1 $?R$| ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"v—ώAT>Q0> ) & #.1?=O=P1@+9 mώ$£ύ$~’ώ$~’b$~’$~’$~’J$~’ψ$£ώ"v˜ύ2A & (*7QBV2A %0CW?R9JMd2B4C#zύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ nώVpVpVpVpVp[v#yœώ$~’ύ$~’ύ#y›ώ nώ lŒώ"u–ώ$~‘ύ$~’ύ$~’ύ$~’ύ$~’$~’Ž$~’$~’$~’$~’$~’$~’+$~’θ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ί$~’$~’$~’$~’$~’$~’$~’±$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύh†ώUoVpVpVpUo_{$|Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύNeώ=P=PF[ ",0?Kb/> $ (;MH^Lb#y›ώ$~£ύ$~’ύ$~’ύ$~’ύ$£ύ!r“ώ>Q '2 & % & % *-;;NPF\,9 !,CW>P6GMd1@5D#zύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ mώVpVpVpVpVp[v#yœώ$£ύ"u—ώ]yVpVoYs lŒώ$~’ύ$~’ύ$~’ώ$~’ύ$~’b$~’$~’$~’$~’$~’$~’Q$~’ω$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ν$~’3$~’$~’$~’$~’$~’$~’•$~’$~’ύ$~’ύ$~’ύ#{žύ#yœύ$} ύ$~’ύ$~’ύ$~’ύh†ώUoVpVpVpUo_{$|Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύPgώAUG\DY5E=P6G>Q*77G:L '3:Lf„ώ$~’ύ$£ύ$£ύ$€€ύ#zώDXώ/>?R7H %1 !+/==P;M+8 ( ",jˆώ$€ύ$~’$~’l$~’$~’$~’K$~’ω$£ώ!t•ώ,: $ & $/5E?R4D #- !+2A?R3C ", (5=O7H.<:KBV,::L4D*7?R=O7GQ ( % !+6FF[DYAT)6 ' % % #.j‰ώ$€ύ$~’$~’l$~’$~’$~’J$~’ψ$~’ώ#xšύG\3C6F?S5E $/ & & & % $.9KDYDY.< & $ $/>J`>Q ) %6GI_ &22AF[CW-;3B#zύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ mώVpVpVpVpVp[v#zœώ nώVpVpVpVpVpVp!q‘ύ$£ύ$~’$~’Ψ$~’$~’$~’$~’$~’$~’$~’¨$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’e$~’$~’$~’$~’$~’$~’]$~’ύ$~’ύ mώWqUoVpUo]y#x›ύ$£ύiˆύUoVpVpVpUo_{#|Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύOfώBVG]6FDY;M #.8I>Q?R)6 & (4=P8IAUBU '2 $ % */=>P9K4D>Q7H '3 ' % #.l‹ώ$£ύ$~’$~’k$~’$~’$~’C$~’υ$~£ώ"wšώKbDYDY@S+8 ) % & & & &2Q8I=P?RBULc4D2A#yœύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ mώVpVpVpVpVp[w"t–ώ]xVoVpVpVpVpWr"s•ώ$£ύ$~’$~’΅$~’$~’$~’$~’$~’$~’$~’Ο$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’$~’$~’$~’$~’D$~’φ$| ώ`|UoVpVpVpVog…ώ$~’ύiˆύUoVpVpVpUo_{#|Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύLbώ>PBVF[ (58IDX7H )*7?R8I>Q,: & *4C>Q-:-;=P:K (4 ' % ",1@>Q9K)5 &1mŒώ$£ύ$~’ώ$~’b$~’$~’$~’9$~’ρ$~’ώ#x›ώ=O ", !,.< !, *2A?R/= ( )1@?R5E>Q0? & "-=OG].< '?R?R0>Md9J/="w™ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ mώVpVpVpVpVp[vdVpVpVpVpVpUo`|#{Ÿώ$~’ύ$~’$~’‹$~’$~’$~’$~’$~’$~’/$~’κ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’œ$~’$~’$~’$~’$~’$~’.$~’κ#|Ÿ^zUoVpVpVpVpYt"u—ώiˆύUoVpVpVpUo_{#|Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύH]ώAUDYEZ %07HH^/> % !,>QI_5E & & % '6FI_H^1? & % & & & % */>BVDY!r“ώ$£ώ$~’ϋ$~’W$~’$~’$~’1$~’ν$~’ώ"xšώ0? $ & % ()59JBUBV>Q $/ % & & %3BI_BW &2 % *Q0?=O5E (4=P4D ) &29K=O-;2B?R0> ) % % % *+88I@SCW"t–ώ$£ώ$~’ϊ$~’N$~’$~’$~’*$~’ι$~’#{žύ5E $ & & % ",6GAT:K?R5E %0 & '0??R*7/>?R0?8I7G ",8IF[2B,9G\Q;N/= ",+8!u–ώ$£ώ$~’χ$~’F$~’$~’$~’$~’ή$~’#|Ÿύ:K # % (.<?R6F "- & $/4D>Q5F7H=O %0 % % (4F[F[ %1 $-;H^7H0?G\DY?S $/i‡ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ mώVpVpVpVpVpVpVpVpVpVpVpYt"u—ώ$£ύ$~’ύ$~’$~’Φ$~’$~’$~’$~’$~’$~’$~’¬$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ΰ$~’!$~’$~’$~’$~’$~’$~’$~’$~’ύiˆώVpVpVpVpVpVpVpVpVpVpVpVo^z#{Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ"xšώ:KDYEZBV8I;L0?>Q6G>P $/ ',:?R@S@S &2 % & & $ !,;MH^G\;M &2 ' % $/="w™ώ$~£ώ$~’π$~’7$~’$~’$~’$~’Υ$~’$~’ύPhώ,9*7;M;M (4 & & & % %*7F[G\9J #. % '3CQ,::LF[0?EZG\ %0`|ώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ mŒώVpVpVpVpVpVpVpVpVpVpVph†ώ$~’ύ$~’ύ$~’ύ$~’$~’²$~’$~’$~’$~’$~’$~’$~’$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ξ$~’5$~’$~’$~’$~’$~’$~’“$~’$~’ύ#yœώ]xVoVpVpVpVpVpVpVpVpVpVo^z#{Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!r“ώ7HCWDX9J )AUEY &2 &1@?R:L=O)6 (.=@S-: ' "-0?=P;M.=4D?R0? * % $5E#zύ$~’$~’κ$~’,$~’$~’$~’ $~’Δ$~’$~’ύZuώG]F\EZ1@ #- & % % &*7?R1@ $05E?R2A4CP4D?R@T '3 '/>F[EZ &2 $ & % (4BU=P?R8I )5 ( % & &29K>P-: &;L$| ύ$~’$~’έ$~’$~’$~’$~’$~’²$~’$£ύ`|ώ1@ %0,98I?Q9K,9 "-1@>Q+8 & % & &2CWJ`3B ( %0?>Q=P5EQ9KQ $0 ",@SEY !,6GDYCW-;:K#| ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ k‹ώVoVpVpVpVpVpVpVpVo_{#{žώ$~’ύ$~’ύ$~’ύ$~’ώ$~’ν$~’3$~’$~’$~’$~’$~’$~’…$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ƒ$~’$~’$~’$~’$~’$~’B$~’υ$~’ώ$~’ύ$£ύ!r“ώXrVpVpVpVpVpVpVpVpUo^z#{Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύSkώ;MI_>PDX=O (*7G\BV ", % &2A@S9J>Q2B #- (/>@S.< ' % % ' $/-;;MEZ`|ώ$£ύ$~’$~’»$~’$~’$~’$~’$~’€$~’$€ύeώ * & & & &+8?R4D2A=PP?R;L>Q>QLb9J.;"v˜ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύi‡ώUoVpVpVpVpVpVpVpWq!p‘ώ$£ύ$~’ύ$~’ύ$~’ύ$~’$~’Σ$~’$~’$~’$~’$~’$~’$~’°$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ÿ$~’$~’$~’$~’$~’$~’,$~’ι$~’$~’ύ$~’ύ$}‘ύd‚ώUoVpVpVpVpVpVpVpVo]y#{žώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύEYώ=P>QF[)6;M;M>Q-;;M1@ & %08IDXF[+8 % & & % '2;M>Q9J.< $/Ysώ$€€ύ$~’$~’’$~’$~’$~’$~’$~’c$~’ύ$£ύ nώ %0 % % !+5F>Q*6 & % **7;MF[G\+8 & % *;L5E7H=O:K7H );MDY*7H^BV &2k‰ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύd‚ώUoVpVpVpVpVpVpUoc€ώ$| ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’$~’$~’$~’$~’$~’Τ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ή$~’$~’$~’$~’$~’$~’$~’Ω$~’$~’ύ$~’ύ$~£ύ"v˜ώZuVpVpVpVpVpVpVpVp\w#zύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#x›ώ=OG]G]CW %1Q2B "--;?R)5 % % ' $/5EG]H]BV+9 !, & % )c€ώ$€€ύ$~’$~’…$~’$~’$~’$~’$~’E$~’φ$~£ώ"w˜ώ8H #.)6=O6G ", % & & % *9J;M4D>Q8J )57G7H ' &2BKa7G !+:KAU@SG]EZ #.Ztώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#|Ÿύ^{UoVpVpVpVpVpVpYs"t–ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’‚$~’$~’$~’$~’$~’$~’5$~’ξ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ο$~’$~’$~’$~’$~’$~’ $~’Δ$~’$~’ύ$~’ύ$~’ύ$~’ύi‡ώVpVpVpVpVpVpVpVpZu#xšώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ nώ8ILc8I:KCW8IBVG].< % % %+8?R.=.;;L>Q6G)6+8=P6F ", % % %0 mώ$£ύ$~’ώ$~’f$~’$~’$~’$~’$~’*$~’θ$~’$| ύRjEZG]BW-; #. ' % % #-;M7G ) % ",1@EZH]-; ' (:L4D8I@S>Q #-?R@TBV '3EZώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ"wšώZtVpVpVpVpVpVpVog…ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ϋ$~’V$~’$~’$~’$~’$~’$~’\$~’ό$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’β$~’"$~’$~’$~’$~’$~’$~’¬$~’$~’ύ$~’ύ$~’ύ$~’ύ#y›ώ\xVoVpVpVpVpVpVpWr"t•ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€€ύ]xώ7GLc9J@SAU ) (4BV=P:L &2-:>Q %0 % ))6?RI_DY-; !+ & % % !,6F>Q,9 &,:"u—ώ$£ώ$~’φ$~’F$~’$~’$~’$~’$~’$~’Ρ$~’$~’ύZtώ7G)60?:K>Q;M2A,9>Q3C ' % & %/=>Q0?=O:K6G;M ( *AUDX*7;MEZJa5E2A#x›ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!pώVpVpVpVpVpVpVp[v#xšώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’λ$~’0$~’$~’$~’$~’$~’$~’‰$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’π$~’7$~’$~’$~’$~’$~’$~’$~’$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ mώVpVpVpVpVpVpVpVp mŒώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύI_ώ;M?SG]6G>Q*64DG\=P ( % %0?>Q2A=O (5Q )5 & '27HEZG].; ( % % !,9J:L "- % % ( $/*77HG\^yώ$~’ύ$~’$~’Ξ$~’$~’$~’$~’$~’$~’$~’‰$~’$€ύd€ώ * & & & &/=?R+8 &11@P:KDX+9 % % );M2A0??REZ/> #3CG]6GF\H^ $0Slώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#yœώ[wVpVpVpVpVpVo^z#zύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ͺ$~’$~’$~’$~’$~’$~’$~’Χ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’i$~’$~’$~’$~’$~’$~’Y$~’ό$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!q’ώXrVpVpVpVpVpVp\x#zώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύi‡ώ7HLcQ9J@TCW #. $-;@T9K>Q2B $05E;M !+ % & % (5F@S0>5EQ:L3C*7\vώ$€ύ$~’$~’«$~’$~’$~’$~’$~’$~’$~’^$~’ό$£ώ!q’ώ (4 % % *5F=P &1 % % % '0?F[>Q>P4D '24C9J ' %3CDY>Q/=?RCWAU,99J#{Ÿύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ mώVpVpVpVpVpVpWq!pώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’~$~’$~’$~’$~’$~’$~’8$~’π$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’†$~’$~’$~’$~’$~’$~’@$~’τ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύdώUoVpVpVpVpVpWq!r’ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύQiώ:LLc1@?SAU %06G3C)5;MF\?R ", % % (6F:K !+ ",*75E=OCWG]?R (5 !+ ' % !+g…ώ$€ύ$~’$~’€$~’$~’$~’$~’$~’$~’$~’5$~’ξ$~’ώ#zύ;L ) $/;L8I !+ % & & % '4?R+8 ( &23CBWI_3C !+ $/?R '3 (4@TF[ %00?G]G\Q*7 % % ' '3BVCW?R;M2B (5 !+ '3=P4D ) % %,9!t•ώ$£ώ$~’ϊ$~’S$~’$~’$~’$~’$~’$~’$~’$~’$~’$~£ύώAUEZF[2B)5 #. ( % '3?R,9 & & % $/@S2B9J>QAU8I & %8J?R>Q@T5ECXI_ &2Sjώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ lŒώVpVpVpVpVpVpXs"t•ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ι$~’-$~’$~’$~’$~’$~’$~’Œ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’»$~’$~’$~’$~’$~’$~’$~’Χ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύh†ώVpVpVpVpVpVpZu"v˜ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύh†ώ5EH]EZP?R4D % $*7>Q)61?;N>Q7H;M?R "- % % & % ",9JQQ ",+8H^5F;MMd0?5D#yœώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#yœώ\xVoVpVpVpVpVof„ώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ν$~’$~’$~’$~’$~’$~’$~’·$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ρ$~’$~’$~’$~’$~’$~’ $~’Β$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#x›ώ\wVpVpVpVpVpVof„ώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύNdώ>PKa=PF\>Q ", $0>Q %0 #.0?EZG]8I*7 !+ & (6FQ9J/=9J9K ' $ "->Q*7 ",2AG\AU &1 )5?R;MG]@SQ8I,9PJ`l‹ώ$£ύ$~’$~’”$~’$~’$~’$~’$~’$~’$~’$~’$~’>$~’ς$~’ώ#zœώ5D $ & & %*7?R+8 & ) %0.<CWG\?R6F+88J5E % $ %0?S4D>QBV4D !+CWCXH^)5CWώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ#xšώ[vVpVpVpVpVpVp jŠώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’z$~’$~’$~’$~’$~’$~’;$~’ρ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ρ$~’9$~’$~’$~’$~’$~’$~’Ž$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{žύ_{UoVpVpVpVpUodώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύώ2ACWEYAUEZ (4 '=P8IQQ '2 &21@BVI_;M-; #-7H2A $ %1EZAU4D?R9KLbQ=P8I8IEZ0> !+ ( & #=O$} ύ$~’$~’η$~’+$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€ύc€ώ $/ )/=?R '3 $ % % % '3@S)6 % % $/?R,9-;9KAUG]/> ))6QEZ,9F[H^ %0Kaώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύd‚ώWqVoVpVpVpWq!oώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’η$~’*$~’$~’$~’$~’$~’$~’‘$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’l$~’$~’$~’$~’$~’$~’W$~’ϋ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$} ύc€ώUoVpVpVpVpUoa~ώ$| ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύb~ώ5FLcAUAU)69KH^6G)6>Q %1 $ ';M4C,:7G=OCWH^6G*7 $/ ) & &-;?R)6 % & &Voώ$€€ύ$~’$~’Ό$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’]$~’ϋ$~£ώ"xšώJ`AUH]@S4D0>+8 &1 '3?R.; % % );M1@ % % (BVAUEZAU2B *7 p‘ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#|Ÿύ!oώ^zVpVpUoa~ώ$|Ÿύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Κ$~’$~’$~’$~’$~’$~’ $~’»$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ˆ$~’$~’$~’$~’$~’$~’>$~’σ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u–ώYtVpVpVpVpVoWr!s”ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{žύ?Q?RKa,:?RCW9K@T "- #2B8I )54C@SI_>P0> '3 !,6F8I ' % & & & &*7@S.; % %0l‹ώ$£ύ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’&$~’γ$~’$~‘ύZtώ=O*7,:1@6F:K@SG]EZ9K3C,96GP-; )5G\CXF[ %0Lbώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ#zύ l‹ώ[wXs"s”ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’£$~’$~’$~’$~’$~’$~’$~’ά$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’€$~’$~’$~’$~’$~’$~’($~’η$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύg…ώVoVpVpVo[vj‰ώ#zύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύcώ0?BWDYAUF[3B &9J0>)6:LI_?R3C (43B:K ' % % *;L4D ' & & % % $ &2>P0?9J#zύ$~’ώ$~’ς$~’@$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€ύeƒώ #. % % % % *@S$~’σ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’½$~’ $~’$~’$~’$~’$~’$~’Υ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ#xšώ[wUoYtg…ώ"wšώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#zώ?QATF[G\2B2B6F &2=PG\ % % $ ",>P0> + #. '3*7-;0?9KH^a}ώ$£ύ$~’$~’Λ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’h$~’ύ$£ώ!t•ώ,9 % & & )8I7H ( % $ $0?R*7 #.*72ACXF[>P6G.<?S (5 # '3>Q1@BVBV,:G]H] $/FZώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’χ$~’K$~’$~’$~’$~’$~’$~’h$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Σ$~’$~’$~’$~’$~’$~’ $~’ΐ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ mώdώ"u–ώ$~’ύ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύ\wώ4DLcAUBV*73CG\>P6FAT $0 $ #-?R %0 % % (5AU+9+91@6F@SH]BV=PAUG]DXAUEZ@S6G $0fƒώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ε$~’'$~’$~’$~’$~’$~’$~’•$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’δ$~’&$~’$~’$~’$~’$~’$~’§$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύ$}‘ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u–ώ6EAUJ`-;>QBW=PBW $0 %7H/> % )8I*7-:BV-: ( ' & % #9I#{žύ$~’ώ$~’σ$~’C$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’©$~’$€ύdώ %0 ",5F=P #- ' ' (7H6F & % % '9K1A % % (9J1@ '3EZDYI`+88I#y›ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Η$~’$~’$~’$~’$~’$~’ $~’Ύ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ς$~’;$~’$~’$~’$~’$~’$~’Œ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύOfώ4DAUDYAUG\2B );M )5 )2BBW9J=P>QG\;M,: '2 #.:K3C % % % %+8@S '3 % & & 'Wpώ$€ύ$~’$~’Η$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’[$~’ϊ$~’ώ#zώNeDYF\@S-: (41@?R "- & %,:;M ' $ &2>Q,97HG]=O-;?R7GJ`CW #.Tmώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ÿ$~’$~’$~’$~’$~’$~’ $~’ί$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ϊ$~’S$~’$~’$~’$~’$~’$~’p$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύh†ώ3CH^F\F[,:6G1? #.=PAU=P=OEZ6F %0 )/>:K ' % % #.?R*7 % & & &-;?R %1 % % *6!q’ώ$£ύ$~’$~’}$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Φ$~’$£ύcώ2A5E9J?RH^AU=O:L5FBV6F #. )3C4D $ *?R5E>QF\/=BUJa1@ (4kŠώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’r$~’$~’$~’$~’$~’$~’B$~’τ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’n$~’$~’$~’$~’$~’$~’T$~’ϋ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"xšώP>QAU &1 (1@7H % % )Q #. % % % %/=>Q $0 $EYώ$~’ύ$~’$~’κ$~’2$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Œ$~’$£ύ!s”ώ,9 $ & % '3?R (4 % % % '9J4D ", &2*7P>PF\8J (5+8=O ' &1CW>QG\=PCX '2:Kώ#y›ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’φ$~’G$~’$~’$~’$~’$~’$~’k$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Š$~’$~’$~’$~’$~’$~’<$~’ς$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύOfώ0?H^CW.<F[@S?S>Q ", "->Q #- $ ",>Q %0 ( */>@S)6+8-;0>CW?S4D7H7H7H7HEZCWP>QDYEZ;L8I6F4C?RBV0?.<-:,9*73CWq$| ύ$~’ώ$~’ω$~’X$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’°$~’$€ύf„ώ ", !+ $ (:L7H4DBUF[3CP+9 $ % % % )_{ώ$€ύ$~’$~’Μ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’V$~’ψ$~’ώ#{žύ@S;L@T-:,9,9,9+8>P>Q,9,9*7*7AU0? #. !, &2?R #. % *=P $/ #1@P8HMd9J6F8J0>F[@S=OEZ7H (4 (4?R #. % &7H1@ % & %0?;M ( & & % (4@S '2 % & %1?"v˜ώ$£ύ$~’ώ$~’v$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Ε$~’$£ύ mŒώBV;L;L9J8I7HDYAU7H9J:L;MEZCX=P=P>QCXF[:L6G8HBV*7 #-7H/> #6FQ !, % % (;M/= % % % %.<>P "- % &Umώ$€ύ$~’$~’έ$~’$$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’h$~’ό$~’ώ#{žύ:K % & & % (5?R $0 % & & %1?S &1 ) * &1AT.<*7/=@TAUQG\>Q1@=O1@ ",AU?RKaDY $/@Sώ#yœώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Χ$~’"$~’$~’$~’$~’$~’™$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’σ$~’>$~’$~’$~’$~’$~’$~’$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύTmώ3BJ`DYF[:K?R/= %:L)6 $-;:L ", $.4C>P*6*7,:BU8I.</=.<7GDY-;*6*7 (5 '2;M!t•ώ$£ύ$~’$~’‰$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Ο$~’$€ύ^zώ * & & ",>Q-: % & & '8I3B % & %-;:L ' % 'Q9J?RH]>Q>Q=PG]?S9J8I9JG\;N7H7H7H=OG];M;MQEYEYa}ώ$~£ύ$~’$~’δ$~’.$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’q$~’ύ$~’ώ#zώ9J $ (8I5E & % % %*6=P * % % ( & ' ( ) "-H]#yœώ$~’ύ$~’$~’’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Π$~’$€ύb~ώ !+0?=O "- !+ #. %1 (4@S:K.<0>0>6GF[6F4D3C=OAU0?/=7H?R )5 &1=P*7 &:L.</=G\F\Lc:L ",Neώ#|Ÿύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’έ$~’$~’v$~’©$~’σ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ_{ώ2ADXDYBVCXDY>Q+9P * & % %1?R #. % & % '2?S %1 % & & 'Vpώ$€ύ$~’$~’δ$~’0$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’k$~’ό$~’ώ#{žύMcώF[AUP>Q=OEZBV8I7H6F5EEZ8I1@2A4CEZ7H4C6GCXAU;N>QH]@S;MDY7H,:AT,:CWKb4D *Lbώ#{žύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ]xώ/=CXKbCWDY '36G0? #6G/= '*7=O ", *.=QQI_;M.<?S+8>Q=P7HCXCWQG]?R>Q@SH]>QP !+ $ $/=O ( $7H+8 &:L7G7GF\G\LdP=P>QH^JaDYCX,9=O-; &:L (4 "0>5E $ %8I-; $ %.<8I & % %2B6F % % % *=P-; ) #. &2*72BMd!s•ώ$£ύ$~’$~’Λ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’>$~’λ$~’$£ύYsώ ( #.>Q (4 ' !+ $0 )5>Q@T7H;L=OBVF[>P;M;LEY=P5E5F?R@T5E6FDX>P:KBVEZ>QF[QCXAUAT (4,9`{ώ$~’ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύlŒώQ ", % % #.?R $/ % & %+8=P * % % % &Unώ$£ύ$~’ώ$~’χ$~’[$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Œ$~’$~’ύ#zύ@S9KCX7HP=PCWCX3B.<*7 '3>P/= ( ' )=O '3 $ %5E1? $ &:L )5 $0>9J !,4D@S5EEZEZLcH^.< #.Ndώ"xšώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$} ύ]wώ2BQ;MF[>Q;MATF\=P>QAUF[;M9J6FDY4D '3 #. )6G3C % % % '9J2A & & $2A!u–ώ$£ύ$~’$~’«$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Ρ$~’$£ύ!s”ώH^5E/=)5 $/ ",Q !, % % &2=P ) % &:L*7 % )=O)6 *0>:K !+-;Q !+ )P "- !+ '3AU.;,90?:LF\=O>Q=OATEZ1?)6 $/ ) %0?R %1 $ #-b~ώ$€ύ$~’$~’δ$~’5$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Z$~’υ$~’ώ$£ύWpώ ' % % %,:QBWF[PI_AU)5 (4Sjώ"xšώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$| ύ`{ώ7G6FCXBUBW*7@S+8-:>P #.,9=O * (;M '3 $ !,>P ", % ';M)6 $ % "-?R %0 !+ %0)6Q=P9JCW6FDXCW>PPDY1@,:-;AU (5 "-.<QCWF\=O;MEZ9J/=,9@T (4 ' %3C3B % & &8I/> % % $ &2>Q #- !+ &1,:4CBURk"w™ώ$£ύ$~’$~’»$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’&$~’Υ$~’$£ύ nŽώ,9 $0>9K ( !+ (4/>;MG]?RQ $/;M0? ):L/= )1@:L &2*6@T:L6G;MF[BV;M6F:L>Q #. ( %*7;M ( & & &8I1@ % % % $.< oώ$£ύ$~’$~’θ$~’=$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Y$~’σ$~’ώ$£ύ]xώ )5BW;M:K>QQDYEY?RF[DYKbKa;M #. '3J`ώ oώ$~’ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$€ύ"u—ώVnώ3B4CF\Kb>PG\4D?S:L.<BV-: $/>P '3 #/>4D $ %9K+9 $ &6F6F (4/>7HF\@T)61@=OF\>QQBV.< )5:L4C **7=O * (4>Q "-2A>Q.=F[EZBV6G &1 )6I^ώkŠώ$} ύ$€ύ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύ$£ύ!r“ώTlώ6F0?=PJaG]>QG]8I;MDY6G?RF[=O?SH^=O6F>P9J #- (7G-; $ %/=7G % % &:L0? '30>8ICWCX8I/> &2 *7H2B % %?R#zώ$~£ύ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Α$~’$~£ύ#zώ>P $ % % ':K.= % & % #.>Q $/ $/,:6GF\@T;M4D3BDXKb>QEZ5E3BPQDY %12@!q’ώ$£ύ$~’$~’Ψ$~’,$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’:$~’β$~’$£ύ oŽώ.< % % '3>Q * % & !+3CF[Q9K:L?R "- ' %5E1? % %+88I ' ",6GAT8I=PH]@S9J?R?S.<8J>Q)5=O=O4DH^CXCW;M+9 $.2AOfώj‰ώ#zύ$€ύ$€ύ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$€€ύ$| ύ pώXqώQ-: $*7:K % $3C2A !+ '3:KDX=P=P>QKbl‹ώ$£ύ$~’$~’π$~’T$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’b$~’τ$~’ώ$£ύdώ &2 %7H2B #..<9J?RG]7H (5 !+ %1@5E % & &9K+8 % !,4CCW;M>QBVAU.< '2:L.< $ (5;M & &1@S+86GDY7HEZCXF[LcKb@S.< &1 &26FOgώg…ώ"w˜ώ$~’ύ$€€ύ$€ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$£ύ$€€ύ$£ύ#yœώl‹ώVoώ?R/=-;=PJ`Lc>QEZ5F0?=P *2A9J ",4C?S1A;LH^@S9JDYBVQ8J-;,9?R !+ % & ':L+9 $ % *?R7H9J>QCX?R)6 ",-;:K % $2B3C )+8DX:L=PF[CW6G>Q?S+8P7H>P3B & $*7:L & % %7H2A (43CQ %0 &12A=PG\9J-: #-2B3C $ %*7:L ( #.7HDY>P=ODX8I %1-;;N & $/?R*75EF\=OCWG\DX@TJaEZCXCW:K-; $/ %0,96FCWώPgώώdώkŠώ!q’ώ!t•ώ"v˜ώ#y›ύ#yœύ#yœύ#yœύ"w™ώ!t–ώ!r“ώmŒώg„ώ^yώSkώG\ώ+8/>8I>QAUKbKaH]BVG]4D8I9K )6F8H '2:LDX=O>QF\2A ",0>6G % $6G1@ $//=AUEY:L/=-;=O ' % %0>6G % % (,9F[=O>Q7H+84D8I & &EZώ#zžύ$~£ύ$~’$~’Δ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’Ε$~’$~’ύ$| ύJ_ώ & % & )=O )5 % % &-:F[=P>P5E3B=P ( % %4D2A $ &-:CW;M>Q?RAU &2 (2A4D # !,@S3C8IF[EZ6G8HAU %10>?S-;BVEZDYH^LbG]BWCX?R6F+8 (4 )5 '4 '2 *6-:0>2A2A3C4C1?-:-:-:,9)6.<7G=P@SBWLbLdH^>QF[.<6GAT1?@TG]?R9KCX)5 ':L,9 '0?BV:K>QDY9K "- &8I,9 $ $4C7G+98I@TF[/> "- % '3;MAUF\*7?Qώ"w™ώ$£ύ$~’$~’Ω$~’5$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’3$~’Χ$~’$£ύ#yœώCWώ & %)5Q0>;MF[AU-;+9?R !+ (=P7H9JF[G\6F7HBV,9Q=OCWH^I_CWF[LcKbDY@SBV/=@SDY?R@SF\0? $/>P*7 %1@TAU>PQ8IAU+8 $ $3C4C $ & $/BV>Q>Q8H.=@S #. % & %5E3C % % ' %08IXr"w™ώ$£ύ$~’$~’η$~’K$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’D$~’γ$~’$£ύ"w™ώ?Q %7H;M6F?Q9K.<?R (5 $ & %4D2A $ ( (5ATCX9K,:,:;M ' % ",>Q %1+8;MI_:K+8.<;M & &:K9J:KEYG]0? %0Q9JDY1@3BH^EYBVF[BV@S;MBV %1 '3BW7GQ #. "-=OCX>Q5E@S)5 $ )=P %1 #.0?F[AT2B $/1A4D % & ';M)6 #.0>Q !+ & & &:L0>.<QEY,9 & $ '3;M ' & &2CXAT;M0>?R '3 $ !+>Q+83CBVF\9JZtώb~ώCW *66GG]?R2A;M7H !+9JH^BV3C9J=P0?BVEYDX,98IH^H]7G,:EZG\BV,9;M?R;M?RCW7G *5FDY?R:L?S2A $+8AU7G>QCW9J ' )=P (4 %06GI_;N+8 &2>P !+ % (QCW9J ( % %8I.< $ % '5EEZ>Q9J*7 ",=O (4 % %4D pώ$£ύ$~’$~’τ$~’n$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’^$~’ξ$~’$£ύ#{žώOf * % % %/=8I & % & &2CXBV9J*7 "-=P %0 % % '3Q7H?R %0 )Q $/ % ",7GG]Q "- % (0>G\>Q1@ #.;M*7 % $2AQ6G>Q6F?R0?5E>Q:KQ0?4D@SCW/= %-;H]DX2A8HXrώVpώb~ώg„ώ\vώ4D '1A6G *.<EYBW*6 &3C3C $ (3CF\>Q0> %0>Q $/ % %*7;M+8:L=P>P:K & & & ",>Q #. % ()6:LDYEY pώ$£ύ$~’$~’ω$~’‚$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’j$~’π$~’$£ύ"xšώEYώ ' ",@S0>:K>Q0?2A9J & & % %0=O !,+8;MCW?R !+ % %8I,: & )5?RF[/= * &2=P ) *4DMd!q’ώ$£ύ$~’ύ$~’ύ$£ύ$£ύ$£ύ$£ύ$€ύ$~’ύ#{Ÿώ oώ]xώZtώMdBV !+ %1BVJ`/> &,:H^CW #. &9JKb9J & #.AUEZ>Q6FRkώbώl‹ώ"v˜ώ#zœώ$~’ύ$£ύ$£ύ$£ύ$~’ύ"v˜ύTmώCW '2 $ (=P5E=P:K?S+8 % %0?6G (49K@SDY %1 % % (5;M ' ' (4:LF[3C #. % &:K,9 % & % 'Ofώ#zώ$£ύ$~’$~’ψ$~’„$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’d$~’μ$~’$£ύ#zύKaώ2BH]=P.< !+ $4D2A % & $ (5CXP/>>Q.=F[EZSlώd€ώh†ώ"w™ώ#zύ$~’ύ$£ύ$£ύ$£ύ$£ύ$£ύ$£ύ$£ύ$~’ύ$~’ύ$£ύ$£ύb~ώ4C * &2=P ) *1@H^9J $/ %4D1@ $ '*7F[?S.< ) %1=O ) & % ",AU;M?R3C "-0?6G & % 'BUώ"v—ώ$£ύ$~’$~’υ$~’}$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Z$~’θ$~’$~£ύ$| ύf„ώ8H ( % & ';M*6 $ ' (5>QCX-; ) $,9:L & % #.?RDY0? * ",>Q ", % &2CXBU*8 %DX$~’ύ$~’ύ$£ύ nŽώEZ )62@G\ώh†ώ"v˜ώ#zώ$£ύ$€ύ$£ύ$~£ύ$£ύ%¦ύWqώ % ",b~ώ%¦ύ$€ύ$£ύQiώBVH^)6 !,Tlώ#zώ$~£ύ$£ύ$€ύ$£ύ$£ύ$£ύ$€ύ$£ύ$~‘ύ#y›ώ q‘ώmŒώ"v˜ώ$}‘ύ$~’ύ$~’ύ$£ύ!t–ώCWQ * & & (Q #- %19J>P@T3C $ & %-:7H *1@?RBV3C % & )=O)62A?R>Q6G % &Unώ$€ύ$~’ύ$£ύQiώQF\*7 & & &7H/= $ & %17HE[7GUnώ#|Ÿύ$£ύ$~’$~’λ$~’g$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’>$~’Ρ$~’$~’ώ$£ύi‡ώ3B $ (5@T6G?R2A !+7G.= % & %.<@S=O9K %01@4D % & '=OCW8J $/ (4Q !, #)6MdLcYsώ!q’ώ9JDXATf„ώ$€ύ$~’ύ$}‘ύRj &2 )7HAT=OZtώ$€ύ$~’ύ$£ύ]xώ1? &1-;EZ=O %0 'Q*72B4D % % )@SCW7H #. *=O #- % % !,AUCW6F #. $0?6G % & % %@S oώ$~’ύ$~’ύ$~’$~’α$~’T$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’+$~’»$~’$~’ώ$€ύ!s“ώATώ7HF\6F #. % ';M)6 % % #.=OCX+9 ' $0?6F % !+4DG]5E ' % ",>Q &1@R#yœώ$~’ύ$£ύ q‘ώ (3 $/EZ?S (5 &6G3B*6?R4D=O3BYsώ4DF[=Od€ώ$€ύ$~’ύ$}‘ύFZώ % %)6I_9JF[ώ$~’ύ$~’ύ$£ύc€ώ (4 ';M.<.<?R6GQEZ.< $ & )=O)64C?R2A?R #. & & ';M/=4D?R/=+8$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Ÿ$~’ϋ$~’$£ύ#{žύeƒώ4C $ % & *>P $/ (/=?RCX2A $ & %0>8I (4=P7G8I2A % & '=OAUYsώ$~’ύ$~’ύ$€€ύ_zώ #.8JG\1@ % % %1CW@T*7 %3CQ (4>Q pώ$£ύ$~’ύ#{žώPh,9 !+=O1@8JMd#{žώ$~’ύ$£ύ!p‘ώCX7H;M ) %)6G\6G *?Q"v˜ώ$€ύ#zώWqώ,93C4D % % #.CX@S '3 % !+>Q #. % (4=PG\ (5 % & &8I-; % '3;L@TCW !+ !+I^ώ"w˜ώ$£ύ$~’ώ$~’ώ$~’΅$~’($~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’z$~’ο$~’$~’ύ$~’ύdώ2A % % $/>P )5:LPQEZ+8 % & *>Q4D?R/> #.>P ", & % ",CWBV.= ( %4C2B % % (.<DX@S\wώ$} ύ$£ύ$~’$~’χ$~’’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’R$~’Χ$~’$~’ώ$€ύ!s•ώF[ώ !+ (5F[@S1@ ) %8I-; % % %0?RAT $/ % %+99K )4D=P8I=PkŠώ$£ύ$~’ύ$|ŸύSkώ/> ' *>Q '30>?R0?=P !+ %,9EZ!q’ώ$£ύ$~’ύ#{žύLbώSlYsώWpώe‚ώ!r“ώ#{Ÿύ$~’ύ$€ύ$~’ύ$~’ύh†ώ@Rώ %0 %0G\:K !+ % $/>P * &1Q * & & (Q7G % & % '4@S;M9K ", '3Ph#yœώ$~’ύ$£ύ"w™ώAT & & %4CAU=P %0 &:L-;)6@S+8=O+8 %4D"t•ώ$£ύ$£ύ!t•ώ2A=P>Q6F & )Q8IQ8I;M & $ *6Voώ#zύ$£ύ$~’ώ$~’$~’Γ$~’=$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’{$~’κ$~’$~’ώ$€ύ#y›ώOfώ #- $ & (Q (4-:7H & & %+8H]4D ( % "-\wώ$£ύ$~’ύ$£ύdώ?R * & &4DG] &1 % %+8AT@S*7 $,:P,:/>9JG\ώ$~’ύ$~’ύ$~’ύ$~£ύ$€ύ$€€ύ$£ύ$}‘ύ#y›ώlŒώ_{ώUmώ]xώ!q’ώ$}‘ύ$~’ύ$€ύ!t•ώQ7G8I & & % &1EZ@T.< & '?SAT '3 % % %0H]3B % & (Q4D )9J+8 % & $ $/Ogg„ώ#{žύ$£ύ$~’ώ$~’$~’$~’V$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’„$~’λ$~’$~’ώ$€ύ"xšώVnώ7HEZ2A ( & %.<7H &0>?R-;=P #- & % &2 nŽώ$£ύ$~’ύ#x›ώ2A5F0>-;?R %04C3C % *;LAU6G & & (=OAU.Q $/Qiώ$€€ύ$~’ύ$£ύI^ώ $ & %6GF\.< & % '3;M ' ",:K:K=O-; $ % (5Ofώ"w™ώ$€ύ$~’ώ$~’$~’σ$~’˜$~’#$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’@$~’Ή$~’ϋ$~’$~£ύ$£ύ"wšώ]yώ*6 $ % %/=9K3C=P %0 )>P %0 % &AT#{žώ$~’ύ$£ύl‹ώ $/-:BV>Q &2 $ (4Q ( % $/?S@S/> !+f„ώ$€ύ$~’ύ#|Ÿύ=P #0>8H '3C;L,9P2A & (4;M ' % )4CH^1? $/EZώ mώ$~£ύ$£ύ$~’$~’ώ$~’Ι$~’R$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’l$~’Ω$~’$~’$£ύ$~’ύ mŒώG\ώ '2 $/=H^;L "- % (=O &2 '2A`|ώ$£ύ$~’ύ$€€ύYrώ %-;G] )5 % & *=P:KPFZώ"v—ύ$~£ύ$£ύ"w™ώCV ) & ';M )5 #.=O3B*6:L ' & % %:LXrώi‡ώ$}‘ύ$£ύ$~’ώ$~’$~’δ$~’€$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’%$~’$~’κ$~’$~’ώ$£ύ$~’ύl‹ώH]ώCW=O ) % & ';L)65EYs!r“ώ%€₯ύ$~£ύ$~’ύBUώ %1@TCX $/ % & &8JDY $/ % %)6?R>Q-; % (J`$| ώ$~’ύ$€ύe‚ώ-;=P*6?R #. %1?:KNeώ$£ύ$~’ύ$£ύe‚ώBV@T '3,99JMcώjˆώ!s”ώ$} ύ$£ύ$£ύ$}‘ύQiώ8J9J ) (=O '2 % "-;M@S;L & $ %0ATώi‡ώ$~’ύ$€ύ$~’ώ$~’$~’ρ$~’‘$~’2$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’9$~’₯$~’ρ$~’$~’ώ$£ύ$~’ύ"v˜ώUnώ,9 ' $ &;L?SQ.<:K,9 % % $0CW=O ' & & *CW9K ' & $;Lώ#|Ÿύ$~’ύ$€€ύcώ *8IEZ2A % & );LWq$| ύ$~’ύ$£ύ oŽώ]xώh†ώjˆώ"u–ώ#|Ÿύ$£ύ$£ύ$£ύ$£ύ$~£ύ pώUnώ4D )9K6G ",=P $/ % % !+Q #. & %)6G\6F & & $9J#|Ÿύ$~’ύ$€€ύ`{ώ '*7H] &2 % & %0?Rk#xšώ$~’ύ$~’ύ$~’ύ$~£ύ$£ύ$€ύ$£ύ$€ύ$€ύ$£ύ#zώ!r“ώVoώ+87H.< $ *:L:K?R ", % $ (9Idώ!r“ώ$~’ύ$€ύ$~’ώ$~’$~’χ$~’Ό$~’U$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’H$~’ͺ$~’ο$~’$~’$£ύ$€ύ#yœώg„ώ^yώ7H & $ % *>P>Q5E ' %+8:L '5E8J (:K,: % !+=P4D>P !+ & %H]$~’ύ$~’ύ$€€ύ\wώ &5FEZ4C & & (;M@T!q‘ώ$£ύ$£ύ$£ύ$€ύ$£ύ$} ύ"v˜ώi‡ώe‚ώTlώ5E1?>Q %0;M (5 % % ",>QBV !+ (4ASώ`{ώ"w™ώ$£ύ$£ύ$~’$~’$~’υ$~’Ή$~’V$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’?$~’œ$~’ε$~’$~’$~’ώ$€ύ$~’ύ!s”ώώ>Pώ (4 *@S;M ) & % $0=P0>>Q ", %0?6G &5E7H (;M,9 $.<i‡ώ#zώ#|Ÿύ$}‘ύkŠώ8I>P*7?R $0 % '3=P/= nŽώ$} ύ!t•ώ oώa}ώH]ώCWG] &29J,: # %1@?R@T #. % $ %/=Vpώ oώ$}‘ύ$€ύ$~£ώ$~’$~’$~’ν$~’ͺ$~’M$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’.$~’$~’Ρ$~’ϊ$~’$~’$£ύ$€€ύ$} ύ pώ^yώώ7G ) $ $ )@SCX (5 % % '2=O+8?R #- %/=8I '=O=P2AEYLb>P-; # &8I6G=P &1 % & '7HCW #- )5QCW-; % & #.>Q1?=O ) # $0=O &1>P %0 % #.?R)6>P &1 % &7H7G>Q #. & % #-AUAT ( $ ( %1;M_zώb~ώ!q’ώ$| ύ$€ύ$£ύ$~’ώ$~’$~’$~’ν$~’·$~’f$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’.$~’s$~’Ό$~’μ$~’$~’$~’$£ώ$€ύ$£ύ#{žύ!r’ώ nώUnώ % ' * #.ATG]8ICWώPhώ^yώ mŒώ#yœώ$| ύ$£ύ$€€ύ$£ύ$~’ώ$~’$~’$~’ώ$~’κ$~’ΐ$~’€$~’=$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’)$~’^$~’š$~’Ν$~’ξ$~’ύ$~’$~’$~’$~£ώ$£ύ$€€ύ$£ύ$~’ύ#|Ÿύ"xšώ!s”ώl‹ώ mŒώjˆώZtώRjώOfώKaώMdώ\wώG\ώBUώDXώG[ώLbώa}ώώXqώ^yώe‚ώkŠώ"u–ώ#zύ#{Ÿύ$~’ύ$€ύ$€€ύ$£ύ$~’ώ$~’$~’$~’$~’$~’ς$~’Τ$~’£$~’h$~’1$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’6$~’e$~’—$~’Γ$~’β$~’φ$~’$~’$~’$~’$~’$~’ώ$£ώ$£ύ$£ύ$£ύ$€€ύ$€€ύ$€ύ$£ύ$£ύ$~’ύ$~’ύ$~’ύ$~£ύ$£ύ$£ύ$£ύ$€ύ$€€ύ$€€ύ$€ύ$€ύ$£ώ$~’ώ$~’$~’$~’$~’$~’$~’ψ$~’ζ$~’Ι$~’Ÿ$~’m$~’=$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’$$~’E$~’k$~’‘$~’³$~’Ξ$~’β$~’π$~’ω$~’ώ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ώ$~’ϊ$~’ς$~’ε$~’$~’Έ$~’—$~’q$~’K$~’)$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’#$~’8$~’O$~’e$~’z$~’$~’ž$~’©$~’Έ$~’½$~’ΐ$~’Ε$~’Η$~’Η$~’Ε$~’Α$~’½$~’Ί$~’«$~’Ÿ$~’$~’|$~’h$~’R$~’;$~’&$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’ $~’$~’$~’ $~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’(€ ;;$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’*$~’5$~’>$~’C$~’G$~’G$~’D$~’?$~’7$~’+$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’6$~’X$~’{$~’š$~’΄$~’Ι$~’Ψ$~’γ$~£κ$£ο$£π$£ς$£ς$£ρ$£ο$£κ$~’δ$~’Ω$~’Λ$~’·$~’$~’~$~’[$~’9$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’M$~’‚$~’³$~’Χ$£ο$€ϋ$€€$£$£$}‘#{ž#z"xš!t•ώ!q’ώ!r“ώ"t–ώ!q’ώ!s”ώ"v˜#z#{ž$}‘$£$£$€$€ό$£ρ$~’Ϋ$~’·$~’‡$~’R$~’$$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’0$~’n$~’$~’ή$£ψ$€€$£$} "v—ώkŠώa}ώc€ώOfώ>Pώ7GG\=O *6 '37H>Q (4 )65EJ`8I=OώI^ώa}ώb~ώjˆώ!t–ώ#|Ÿ$£$€€$£ω$~’β$~’΄$~’u$~’6$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’'$~’m$~’·$~’κ$€ώ$€$| !q’ώ`{ώQiώTl2A #. *;M (5 # $6G2A $ $2B8I & $,9Q "- ' '3J_Ysώf„ώ"x›$~£$£$~’ζ$~’§$~’P$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’^$~’»$~’τ$€#|Ÿ!p‘ώ`|ώ7G #- *=O (5 % !+8I6F !+ %12B0?+9*6.=)51@-;,:+8G\AT?Q3B0? &23C.<,9 (4D:K &2 $ #.>Q $0 !,2AWpώ pώ#{ž$€$£χ$~’Γ$~’h$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’c$~’Ζ$£ϊ$€#yœώ_zώQ %0 $ *9J6G "- '3?RBV4D/=+8 *6F8I $0 '5E:L !+ *`|ώ$~’ύ!s”ώAT7H8I $/ $/3C/>-;+8-: *5E8J %1 $ *Q ) %.<Q,9 % *>Q/=,:!q’ώfƒώG[+82A %0 &.=>Q !++8Oeώ!t•ώ$€$£ω$~’Έ$~’D$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’‚$~’θ$£"x›ώZtώKa-: $ %2A4D8I9Jώh†ώ#zώ%€€ύ$€€ύ#yœύk‰ώa}ώJ`1@G\3B5E &25E $05E1@0? ",5EKb"v˜ώ$€ύh†ώ0? # &2=P-; !+4D/>3B/=,9 %0 nŽώ#zύ1? #.< *5E ( #-9K7G '3B`{ώ$| $£$~’Ο$~’S$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’μ$€!r“ώXqώQ ) &9J7H ()60> % #.<Xqώ p‘ώ$£$~’ς$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’+$~’±$£ύ$}‘`|ώ0> "->Q4D ",/=2B &,:@S*6 $Rjώ$€€ύ#zύ>Q4D ) #->Q2B-;+8;M0? '33C.<4C5F #.1@9J+8?RUnώ pώI_ &1*7CW.< (4>QAU nŽώ$~’ύ$~£ύ$€ύ%€₯ύ$£ύ#{Ÿύ#y›ώ!q’ώ!p‘ώ oώώ4DAU %0 %1h†ώ$£ύZtώRkώ"w™ώ$€ύ#|Ÿύ\wώ@S '4 #,:/=/=9KRj"v˜ώ$~’ύg„ώ.< %14D>Q (4G[ώ"x›ώ$£$~’°$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’£$£ώ$} ώMdώ ' $*70?,:3C?R-: ' (4!q‘ώ$€€ύl‹ώfƒώ$£ύ$}‘ύUnώ ' &2>Q6Gc€ώ$€€ύ"w™ώH]9J4CFZPgώkŠώ#yœώ$£ύ#zώBV6GP:K:KTlKaώAT.</=BW.<Wpώ$€€ύ$£ύ$€ύ nŽώ@S1@ $.<:L4D8J*7*7jˆώ$£ύ$~’ύbώ@S &1 &,:+9 $ )2AUnώ"w™ώ$£$~’­$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~£ό#yœώFZώ '6F6G:L^zώ$~’ύkŠώ )5 &10? !+=O#zœώ$€€ύXrώ3B6F!t–ώ$€€ύ oώF[7H $/@T"v˜ώ$£ύ$~’ύ$€€ύ$£ύ"u—ώg…ώPgώG]?R.<?RQPjˆώ%€₯ύ$~’ύ mώ7G *9K3B;L7G (+84Db~ώ$€ύ$~’ύZtώ/=1@ % %3C*7-;7H>Q %0?Qώ"w™ώ$£$~’’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’{$~’ω$~’ώOfώ & $ )5/> #.Kaώ#{Ÿύ$£ύώ,94D $8H#|Ÿύ$£ύUnώ?R1?Qiώ$}‘ύ$~£ύdώ2A6GCWk‰ώ$£ύ!r“ώdώK`ώF[@S2B=P:LDXBVBVEZDXEZATCWDX?SCXEYBUDXDYEY=O>Q>P (4-; )*7>Q6F>P.<1@ % %DWώ#zώ$£ύ$~’Ž$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’_$~’ς$} Ztώ>Q/= %0 ",5E ) )Xqώ$£ύ$}‘ύXrώ?S/=H^ώ$~’ύ$}‘ύATώ5E )5:Kg…ώ$£ύ#|ŸύMdώ5E0?NdώNeBV@T5E>Q;LF[DYDY>Q9K6G4DOgQ8I`|ώ$~’ύ$~’ύ#{žύ$~’ύc€ώ?R8I4DP.< ) )6l‹ώ$€€ύ"u—ώLb,:Vnώ$€ύ#{žύDX7G *.<7Gl‹ώ"v˜ώSkώCX6F=P4DQ5E3BPh#{žώ$€ύ oŽώ *6Tlώ%€₯ύ"v˜ώ=P=P4D?R6GWpώH^0?7H4DQDXATAU,9 $ #-^yώ$£$~’Ψ$~’-$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’ $£!t•ώJ`-; &1 *2B '3 $ (5E "- #.5FXrώ#| ύ$~’ύZtώeƒώ%€₯ύ pώ2A2A !+7H)6 %1 #-Ztώ$}‘ύ$£ύ pώOfώ9J;L (5 # )5E * & )@S!s•ώ$£$~’³$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’j$~£ω#zœώ?Qώ+9=O2A4D9J9J '3 !,1@ (5 # (43B\vώ$£ύ$}‘ύ#|Ÿύ$£ύ mŒώ>P=O6G?R6F>Q9KBVDY@S3CDXώe‚ώ#zύ$€ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$€ύ#|ŸύkŠώPgώDXCXDY:K4D8I!r“ώ$€€ύ nώ:K9K8I6F?SUnώ$~’ύi‡ώ $. &4D * %+87G,92A2A8I4C!q‘ώ$£ύ$~’ύ$€€ύ`|ώ0>/=/=5E7H;MDY?S5FBVώfƒώ#| ύ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$}‘ύ mώNeώAUEZCX=O?R7HJ`h†ώ$£ύ"w™ώUoώ,9 $/3B,9"u–ώ$| ύP2BJ_#zύ$~£ύ$€ύ mŒώDX8I>Q;NCWDYQ8H4CFZ!s”ώ%€₯ύ$£ύ#zώ"wšώ#|Ÿύ$€ύ$£ύi‡ώ+82B ", $.^yώ$~’ύ!t•ώDXώ:L0?>Q@SDY2AJ`ώ!t•ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύ"xšώXqώDXEYCWQ_zώ#{žύ$} ύ nŽώiˆώ"xšώ$£ύ#yœύ7H2B #. #.<*6 $ #.WpώZtώ*7.<:LJ`"u—ώ$£ύ$~’|$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$$~’Χ$£Rjώ &+81@5E!t•ώ%€€ύ!q’ώJ`ώ>QEZPhe‚ώ$}‘ύ$€ύ_zώ>Q6F4DI_cώMd6G>Q>PEY=O7H^zώ$}‘ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ$~’ύi‡ώDXCX?SQ9KPhc€ώ!r’ώmŒώ^yώ:K9J>P1@6GF[`{ώ#{Ÿώ$€€ύ$€ύ$€€ύi‡ώ;M ", $ $/g„ώ$£$~’£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’8$~’ι$} Vpώ6F/>+9H]ώ$~’ύ"v—ώ7G+85F !, #-7H $/;L#{žύ$} ύNe5E1@>P8I>P@TDX6FEYώ"u—ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ#zύSlώAUCW>Q0?5E (58I '25E (-;*7 !+Kaώ!t•ώ$~’ύ$£ύ#zœύa}ώ!t•ώ$€ύPgώ ( !+ &2Qh$| ώ$~’ς$~’K$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’’$€dώ )5:L/=-;g„ώ%€₯ύ]xώ1@4C>Q8I2AQ?R9J=O2AQ@TCX5EKaώ#zύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ώ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύZtώATBV=P/>8H-;:L;Ldώ#zώ$€ύ$€ύ$£ύ"w™ώCW)5 (5>Q mώ%€₯ύ\wώ3C-; #4C"w™ώ$~£χ$~’T$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’£$€f„ώ %0 ) ).<DY#y›ύ#zύDX1@ !+ $/9J*6+8;NEY#{žύ"xšύDX:K3C=OEZ8HH]ώ#zύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ύ$~’υ$~’ύ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’$~’$~’$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύZtώBVDX>Q>P5EZtώ nŽώ$~’ύ$£ύ#|Ÿύ`{ώ oώ$~’ύI^ώ # &21@Q9J3B:K;N-;8Ifƒώ%€₯ύe‚ώ-;*6a}ώ%€₯ύi‡ώ/=+81@Of#zώ$~’τ$~’K$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’’$€dώ #.2A/> ) (*7 q‘ώ%€₯ύ]xώ*73C ' !+4D (CVώ#{žύ$}‘ύUnώ7HP/>-;AT!t–ώ$€ύ$} ύ!p‘ώh†ώh†ώ!t•ώ$~’ύ$€€ύ l‹ώ;M?R;MF[1@Ztώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’$~’$~’$~’$~’₯$~’$~’$~’°$~’$~’$~’$~’$~’!$~’α$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύh†ώCWEZ;M3Ca~ώ$£ύjˆώP8I0>.<0>>Q.< %18I nώ$£ύ$€€ύ$€€ύ$€€ύ%€₯ύ#|ŸύdώG]1@QBW>PEZ!t•ώ$| ύRjώ.<*7VoώBUώ2A=P;M4DDXQi=O3B2A1@2AVpώ$~’$~’Ρ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’=$~£π"w™ώ1@ $/6G $/ $ % )52B ' $4D]yώ nŽώ"t•ώ pώYrώH^ώ-:0?;MBV@S5D pώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’υ$~’D$~’$~’$~’$~’$~’$~’E$~’φ$~’ω$~’O$~’$~’$~’$~’$~’$~’³$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"w™ώG\EZQf„ώ$€€ύ`{ώ?S8I-;8I-; ( &15E ) % % !,5F (4 'ώ$€€$~’œ$~’$~’$~’$~’$~’$~’$~’$~’$~’Η$~’ώ5F,9.<9J@S8I3C1?;M1@ * '32A )3B=O6F:K1@CX@SQLb#|Ÿύ#y›ύTmώ?Q8IQ,: $/*77H ", $ ",5E #. '3>P:L2A9J &2=P '2+83B@S9J4D4D4CAU"v—ώ$£ψ$~’O$~’$~’$~’$~’$~’$~’$~’v$€eƒώ !+ %*74D !+ $)55E $/)6:K@S2A-;5E !+9J:L;M=PBV=O#yœύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u—ώZuVpVpVpUoj‰ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’j$~’$~’$~’$~’$~’$~’$~’$~’^$~’f$~’$~’$~’$~’$~’$~’$~’G$~’χ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύa}UoVpUoiˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύOfώ@TAT>P.<DX4D9J?R,9,:4D ' $ (3C*7 & ( "-6G5E_{ώ$€$~’$~’$~’$~’$~’$~’$~’$~’±$€Rjώ % % &,:8J+80>=O@S0? &23B*7 ):L:L5F5E;LDY3Bώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύb€ώUoVpVpVpUoe‚ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’τ$~’@$~’$~’$~’$~’+$~’$~’$~’$~’&$~’*$~’$~’$~’$~’$~’$~’$~’0$~’μ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύa~UoVpUoiˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύjˆώAU@S.< % '3>Q7G3C5F*7@T;MDY7G"v—ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!oώWqVpVpVpVpUob$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ή$~’$~’$~’$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ά$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύa~UoVpUoiˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{ŸύKaEY?Q1@9J9K;M1@ * %1@"xš$~£κ$~’.$~’$~’$~’$~’$~’F$£φ!t–ώ;M6F=O (4 ) & (44D !+ !,:L9J4C4D3B !+=P8I:KCW:LOeώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#zœώ]yVoVpVpVpVpUob$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’½$~’ $~’$~’$~’$~’Γ$~’+$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Ι$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύa~UoVpUoiˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύ`{ώ>QAU@S-;3C2A8I@S)6 (,91? ( )+8=P3B2B4D4DQ6G1@:K &2 (:L9K4D6F>PCX1@iˆώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύiˆώVpVpVpVpVpVpUob$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’“$~’$~’$~’$~’<$~’ν$~’R$~’$~’$~’$~’$~’$~’$~’3$~’$$~’$~’$~’$~’±$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύb~UoVpUoiˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!t•ώDYCW;M9J>Q #.3C.<1@:L?R (5 ( $05E %1 % & !+5E7H_zώ$€$~’Œ$~’$~’$~’$~’$~’’$€€Tmώ % % &+9=P5F5E0?1@5F ' &2:L5E5F5F+8AT:LCW;M#zύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u—ώZtVpVpVpVpVpVpUoc€$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’f$~’$~’$~’$~’d$~’$~’$~’$~’$~’$~’$~’$~’$~’n$~’E$~’$~’$~’$~’–$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύbUoVpUoiˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~‘ύOfώBV@S3B6G:L;L ) #.7H,:2A9J?S0> * & #-4D-; %I_ώ$£$~’·$~’$~’$~’$~’$~’Ζ$~’Unώ1@/>4C4D0?9K-; % %/=7G3C:K5E );M9J7HDX8JOfώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$} ύc€ώUoVpVpXs\wVpVpUoc€$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ς$~’=$~’$~’$~’$~’‘$~’$~’°$~’$~’$~’$~’$~’$~’$~’¦$~’`$~’$~’$~’$~’z$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύbUoVpUoiˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύ`|ώ@S?RAT,95E3C5F5E7H>Q0? * $9J#|Ÿ$~’Χ$~’$~’$~’$~’!$~’α#{žG\6F=P*7 ' % *3C.<*75E7H,:1@4D3B?R"xš$~£ν$~’1$~’$~’$~’:$£ρ!t•ώ+7 $ &15E+8 ( $/2A@S;M #. (4D4D7H:K (4@S8IF[5E!t•ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#zώ^zVoVpVpZu"w™ώh†ώUoVpUoc€$~‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ί$~’$~’$~’$~’$~’έ$~’$~’ρ$~’<$~’$~’$~’$~’$~’5$~’ς$~’•$~’$~’$~’$~’D$~’φ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύbUoVpUoiˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{žύF[CWP8I1@ '42A0? ( % % $/8I>P pώ$£ω$~’N$~’$~’$~’U$£ϋl‹ώ #. $ & &1P7G)6 !+0?/= '37H?R &21??R2BCW>P>P#|Ÿύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύj‰ώVpVpVpVp kŠώ$£ύg…ώUoVpUoc$~‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’$~’$~’?$~’σ$~’ώ$~’$~’|$~’$~’$~’$~’$~’s$~’$~’―$~’$~’$~’$~’.$~’λ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύbUoVpUoiˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύRjώCX;L?S '2:K7H0?6G &2 ',9@S=P/= #. ()65F)6 !+dώ$€$~’k$~’$~’$~’o$£j‰ώ4C,92B4D-;-;6F $0 % &2?R>P $0 '3;M6F8I8IDY7HKaώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ"v˜ώZuVpVpVo_{#zώ$£ύg…ώUoVpUoc$~‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ύ$~’b$~’$~’$~’$~’h$~’ώ$~’ύ$~’$~’Υ$~’($~’$~’$~’"$~’Ο$~’$~’Η$~’$~’$~’$~’$~’Ϋ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύbUoVpUoi‡ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύ_zώCWAU5E?R/> !+=OQ )5 ' %Ztώ$€€$~’†$~’$~’$~’†$£e‚ώ:L>P4D * $ $ %0:K7H4D '31?/=/>=O0?4D=PBU6GYsώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$} ύdώUoVpVpWr!q‘ώ$£ύ$~’ύg…ώUoVpUoc$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ρ$~’:$~’$~’$~’$~’•$~’$~’ύ$~’ύ$~’$~’Η$~’j$~’h$~’Β$~’ώ$~’$~’Ϋ$~’$~’$~’$~’$~’Η$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύbUoVpUoh‡ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύi‡ώ=PDY5E8I5F8I-; !+5EBV3C ( % (46G,9+93C4D.<Xqώ$€$~’$~’$~’$~’š$€Tlώ & */=4D &1 %01@5F8I0> $. )5@T7G !+=P6G;MEY0?dώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!r“ώWrVpVpUodώ$}‘ύ$~’ύ$~’ύg…ώUoVpUod$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ω$~’$~’$~’$~’ $~’Ώ$~’$~’ύ$~’ύ$~’ύ$~’$~’ώ$~’ώ$~’$~’ώ$~’$~’λ$~’.$~’$~’$~’$~’―$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύc€UoVpUoh‡ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ q‘ώBV@S@S0>-;?R0? '45E (5.<5E6G6G ", % % '-:=OXrώ$£$~’°$~’$~’$~’ͺ$€Kaώ # % (0?@T?R+8 & (4_zώ nώi‡ώ>P3C5F7H8I=PEY0?l‹ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύiˆώUoVpVpZu"v˜ώ$~£ύ$~’ύ$~’ύg…ώUoVpUod$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ά$~’$~’$~’$~’!$~’ί$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’φ$~’D$~’$~’$~’$~’”$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύc€UoVpUoh†ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ"v˜ώDYE[8I7HQ9JEZ3B!r’ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!pώWqUoVp kŠώ$~’ύ$~’ύ$~’ύ$~’ύg…ώUoVpUod‚$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’‹$~’$~’$~’$~’B$~’τ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ύ$~’^$~’$~’$~’$~’x$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύc€UoVpUoh†ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#zœύDXDY:K6G8J1?5E )5?R@S2A ) "=O$}‘$~’Η$~’$~’ $~’½$~’Xqώ=O?R,: ' $ %*6BV nŽώ$£ύ$~’ύ$~’ύ#{žύP6G?R '3@T:LCX5E"xšώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύf„ώUoVpUod‚$~’ύ!r“ώ_{]x mŒώ$}‘ύ$~’$~’Φ$~’$~’$~’$~’ $~’Β$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’±$~’$~’$~’$~’,$~’ι$~’$~’ύ#zύ#{žύ$~’ύ$~‘ύc€UoVpUoh†ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$} ύLbώCW=O4D2B3B.<:K8I1@-;>Q3CBV>Q4C"xšώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύf„ώUoVpUoe‚#x›ώ\xUoUoYt"w™ώ$~£$~’²$~’$~’$~’$~’#$~’β$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Θ$~’$~’$~’$~’$~’Ω$}‘ kŠώ\w^z!r“ώ$~’ύcώUoVpUoh†ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$} ύMdώCX9JQ?R,9 ' % &,9>Q?R3C ' *5E@T:L "- $ % & (59K7H,9 !++85E*6 &21@5E,:G\ώ$~’$~’Γ$~’$~’$~’ $€Rjώ ( %14C0> !+ ",/=9K=O+8 $ )5BW4C %0=P7H=PDY1?j‰ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύf„ώUoVpVpVpVpVpUoe‚ώ$}‘ύ$~’$~’Τ$~’$~’$~’$~’ $~’Ε$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’`$~’$~’$~’$~’u$£!r“ώXrVpVpVpVpVpVpUog…ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u–ώ@SDX9J7H7H2A4D (43C8H8I $/ % *1@@S@S0> ( #F[ώ$£$~’΅$~’$~’$~’Ž$£dώ>Q@S1@ * % &+87H2A4D,:5E (4/=AT+88I:LDY3Ca}ώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύf„ώUoVpVpVpVpVpZu"v˜ώ$~£ύ$~’$~’―$~’$~’$~’$~’&$~’δ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’|$~’$~’$~’$~’Z$~’ό$}‘ώd‚ώUoVpVpVpVpVpUog…ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ oώAUEY6F9K9K *6FBW+8 % %19J5E5F.< "- &24D0? +Neώ$€$~’€$~’$~’$~’x$€g„ώ+9 '30?5E1@5E3C ) $ (5@T:L %0.<6G7H8I7HEZ2BUnώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύf„ώUoVpVpVpVpVpiˆώ$~’ύ$~’ύ$~’$~’ƒ$~’$~’$~’$~’I$~’χ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’™$~’$~’$~’$~’@$~’τ$~£ώ"v—ώZtVpVpVpVpVpUog…ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύfƒώBV=Pa}ώ$£$~’$~’$~’$~’^$€ύh†ώ !+ % %)5=O9J5E+8 &25E '3 %1;M>Q "-5EPBW6F6G5F9J (5 ",9JBV/= ' &+86F)6,93C4D1@eƒώ$€$~’u$~’$~’$~’D$£φ!q‘ώ )5 (-;4D $/ & "-4DBV8I #. $05F.=9K8I)6AU:LCW:L#zύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύ`|UoVpVpVpVq mώ$~£ύ$~’ύ$~’$~’μ$~’0$~’$~’$~’$~’‘$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Κ$~’$~’$~’$~’$~’Ψ$~’$~’ύ#y›ώ\xVpVpVpVpUoe‚ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύOfώDY?R4CAU '2 %0?R9J )5 '45E %0 ",,9:K>Q3BP7G/> (45E+9 & % % '49KF[#z$~’ΰ$~’!$~’$~’$~’$~’°$€Lbώ $ % '2A8I1@4D2B9K.< $ '2:L4D;M.<1@>Q@T:LH]ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύg…ώUoVpVpUodώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’$~’$~’M$~’ψ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’χ$~’I$~’$~’$~’$~’$~’$~’ύ$~’ύ$£ύ!q’ώWrVpVpVpWq!r“ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύώBW@T6G?Q1A $/9J2B4D3B7H * $ )4D4D,:2A4D3BRiώ$~’$~’Δ$~’ $~’$~’$~’$~’†$€€^yώ ( *2A/= ' % !+9J8H5E1A:K %0 %1Q5E"w™ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#x›ώ[vVpVpVpYt"u—ώ$£ύ$~’ύ$~’ύ$~’ώ$~’ϊ$~’S$~’$~’$~’$~’x$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’c$~’$~’$~’$~’s$~’$~’ύ$~’ύ$~’ύ$} ύcώUoVpVpUog†ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#|ŸύG\DX;N?R)68I2BQ+8 ) &Tmώ$€€$~’$~’$~’$~’$~’$~’W$£ϋ!q’ώ=P=O9J &2 !+ )2A,: % !+9K9K4D;M )5 '3?S6GQEZ8I7G4D?R2A (3C-:,94D:L?R*6 ) & '35F '3 !+f„ώ$€$~’m$~’$~’$~’$~’$~’,$~’θ#{žH]*6,91@6F>Q &0?;M4D:K,93C>PBW9JEYώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ"w™ώZuVpVpVp\x#y›ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ξ$~’$~’$~’$~’$~’Μ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’›$~’$~’$~’$~’>$~’σ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύh†ώVpVpVpVpjˆώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύXrώCW>Q:K=O5E #.6G,97GAU1@ #. '*74C * % & %08I>P"u–ώ$£ς$~’>$~’$~’$~’$~’$~’ $~’Δ$£G\ώ # % )4D/> (4/=;LAT1@*77G * &2=P6F;L0>BUAU2A pώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύg…ώVoVpVpVp mŒώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’§$~’$~’$~’$~’+$~’θ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’΅$~’$~’$~’$~’)$~’η$~’$~’ύ$~’ύ$~’ύ$~’ύ#x›ώ\wVpVpVp[v"wšώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ"xšώATCW=P>P (48I1@=P:K #. (43C ( ' !+3B;M2A3C4D4DPh$}‘$~’Υ$~’$~’$~’$~’$~’$~’$~’$€€^yώ ( *3C+9 % $ $/6G &1+8@S:K0>6G+8 &1>Q8I;MCW6GQiώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ"w™ώYtUoVpUo_|#{žύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’{$~’$~’$~’$~’P$~’ω$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Μ$~’$~’$~’$~’$~’Φ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ lŒώVpVpVpVog…ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύb~ώ?REZ4D7H6F?R1@ !+4D $/ #.8I;L4D4D1@1@Q.<>QAU>Q3C!t•ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{žώ kŠώ[vUoWq!q’ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ω$~’O$~’$~’$~’$~’|$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ί$~’ $~’$~’$~’ $~’Α$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{žώ_{UoVpUoZu"wšώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#zύFZEZ9K3B *9K7H>Q;MCX2A!q’ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ$~‘ύ$| ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Λ$~’$~’$~’$~’$~’Ο$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ψ$~’K$~’$~’$~’$~’Œ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύf„ώi‡ώ#yœώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ#y›ώEYEZAT0>=O6G>Q*7 '23B & #.9J)6*63B@S7G4D4D4C5E_{ώ$£$~’΅$~’$~’$~’$~’$~’$~’$~’$~’$~’V$£ϊ!q’ώ *6 '2B-; % (4C '3 $ *6F '3*7>Q8I6F9K '3;L (5=P8I4D8J?R/=)6)6:K (4 ( ' %0kŠώ$£ώ$~’m$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Φ$}‘Qiώ:L>Q2A0?9J:L*7 &23C0? ' &22A (3B8I9J;M3C?REZ0?e‚ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’w$~’$~’$~’$~’T$~’ϊ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’‚$~’$~’$~’$~’U$~’ϋ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ pώ?REY?R8H-;4D8I7G@T0?-;9J ", '/=-: $ $ %15E "- #;L#{Ÿ$~’γ$~’)$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Ž$£ mŒώ3C #. %06F6G*7-;8I>Q5E5E?R6G+88I $0-:4D:L,: ( #.8J*7 $/ $//>:L (4\wώ$€$~’€$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’<$~’ο#yœώ5E # )54C ( $ )5E $/ &*76F '34D>Q4D>Q2A4C2B>QF[4DKaώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ε$~’($~’$~’$~’$~’¬$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’·$~’$~’$~’$~’'$~’ζ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύώ;MDX>P ) *5E &1 %0> (4 *8I-;>P9J=O:LF[-;\wώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Θ$~’$~’$~’$~’$~’$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ξ$~’$~’$~’$~’$~’Τ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύi‡ώ=PE[@S/>8I1@?S5E>P7H,99K-: ",,:3C ( & )54D ( % %Rjώ$€$~’Ζ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’W$£ψ"v˜ώI^9J4D3C:L>Q5E5E;M?R4D5E?S1@1@9J $/5F (4;L;MCX>Q1?h‡ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ί$~’$~’$~’$~’2$~’ν$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’α$~’!$~’$~’$~’ $~’Ώ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!r“ώ?QAU?R>P9J>Q+97H #- '30? # '31@ % '3C (4 % %-;0> % )5 oώ$£ύ$~’m$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Δ$€Unώ ) ( $/7H #. ' "-7H %0 !+2A2A '38I7H4DAT5E=P0?=PBV=O4D oώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’δ$~’<$~’$~’$~’‰$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ρ$~’9$~’$~’$~’$~’»$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"v˜ώFZCWDY7H9J '37G '38H1A0>>Q2A2A?R5F2A7H>Q1@0?0>>Q1ANeώ$~’$~’Υ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’d$£ϋ!t•ώ.< &3C (4 $ %.<-; % )5E "- '4D ", $/3C $/:L3C?R>PDY6F9J!r“ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ϋ$~’–$~’­$~’τ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’‘$~’ $~’$~’E$~’θ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"xšώH]ώ=OBV;L7G>Q6G?S4D6G8J)65E2B $0,:8I %1 $/0>8I '4 (4*6BU"v˜ώ$£ώ$~’y$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Ζ$£Voώ2A9J*7-;1@?R4D2A8J>Q4C7H?R3B9J;M0>;M+89K0?@SEZ7H:K!r“ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’χ$~’»$~’¦$~’β$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"xšώJ`ώ@TEZ=P=P-;7G "-2A %1 "-3C % $/3C & &3B %1 $ '3B (4 $ $Mdώ$£$~’Φ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’]$~’ψ#yœώI_/>-;+9;M,: $/ %19J '3 !,2A.< "-5E.<,:;N1@?R8I>Q=PDY4D9J oώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’$~’$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"v˜ώG\ώ % (5E #. *6F %1 (55E #.6G &29J2BATF[9J4Ch†ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύ pώDXAUDY>Q?R4DQ9J*78I '37H*6 (45F ) &22B % '4D !, $ "-5E * ' (F[$| ώ$~’φ$~’Y$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’•$£ nώATQ2B>P1@Q7GQ (5Ofώ$~’$~’β$~’3$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’]$~’φ#zώ?Qώ $,9.< & *1@9J0?5F@S4D2A=P,9,:7H #.4C*7,:2A.<7H7H>QF[:K-;I^ώ p‘ώ$£ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ$€ύ"u—ώSkώ9KCWDY?R.< $ #.3B & $-:0> "- '4/>Qi#yœώ$~£ϋ$~’r$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’œ$£ oώ3B;M3B3C6G?R.< &2-;1@ % ",3B % %14D %07H4D6F=P6G?R:K>Q>QDXEZ6F1?Qiώ!s”ώ$£ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$€ύ"w™ύZtώ?Q@SCWBU:L6F8H,:3C '3*7-; )7G &2,:Q3C@S7G;M8I*78I "- *4C ' )7G)6+87H>Q3C-;5E/> *Ysώ$£$~’Ϋ$~’.$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’H$~’λ$~’Qhώ ' '4D #. ' %0>Q8IQ8I9K.<4D !+5E !+0>4D.<>Q8I2B (4 $ *7G '3+83C>QTmώ#|Ÿ$~’σ$~’Z$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’r$~£ω#{žώCWώ (49K/=4DQP)50>*7 #2A (5 %19J:L3C8I5E ( %/=*7 $ $DX#|Ÿώ$~£ύ$~’†$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’—$£"v˜ώOg5E*7 ",3B &1 $ !+5F %0-;>Q7H.<9J %1 )4D !,1?:L5E@T1@9J-;3C2B:L;MAUDXEZBV8I5E2A9IFZώSjώ^zώh…ώ nŽώ!r“ώ"u–ώ"w™ώ"w˜ώ"u—ώ!s”ώ oώi‡ώa}ώWpώJ_ώ?R;M8I?RE[DYBV9J8H4D8I7H?R5E-;6F &4C!r’ώ$£$~’ͺ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’³$£!s”ώ4D # ",4D ( ",1A?R3C.<8I * %3C %0)6>Q6F6G7H !+3B '31@;M7H@S/>:K/=>P:LBVBVDXDXAU?R5E5E5E3B6F8I7H:K9J6F9J7H6G?R?RAUDYDYCX8I;M2B>Q7H@S.<4D '3-;9J3C@T0?,:1? #-:2A,:;M:L*6)62A % %1@+8 (52B>Q>Pl‹ώ$£$~’Δ$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$$~’Ζ$£ nώ0>,:7H2A4DP?R1?9K/=?R;N>Q=P?SE[CWEZCWEZEZAUEZEZBVDYEZEY=PAT@T:L;M0??Q8I=P/=.<2A1?AU2A6G (4 *7G,99J=O)6.<,9 # (55F.<7H>Q '3 ' '30? % $3C!q’ώ$£$~’Τ$~’1$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’0$~’Π$£mŒώI^2B &2 *4D !+ $ (4:L3C6F;L !, (3C #.-;@T2B1@0? %5E5E9J=OI^ώd€ώFZώI_BV.=8I1@@S:L3C>P;M;N;M=O?R:L=O=O;M;M4D?R;M.<:L5E=P.<+86G3CAU,:,:.< '3?R6G1@3C $)64D.=$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’8$~’Φ$€ oώ1@ # %02B !+,:=O6G $/ #.3C & #.0>DY6F;MTlώWpώSk.<)64D0?AT.< #.4C #.5E?R,9.<-; #)6:K4D5E8J ( $-:,9 "-.==O=Of„ώ$£$~’β$~’G$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’;$~’Υ$£ nŽώ5D.=;M5E-;6G $0 $ $06G/=7HQ5E %0 &12A % $6F!r“ώ$£$~’ΰ$~’K$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’6$~’Ξ$£!s”ώRjώ.; ) (4D ) *3C>P+8 #-5E ( "-=P7H )54D !+ $0?S4D-; nώ$€€ύ"t–ώLbDXώ]xώ"t–ώ#zώ$€€ύ$€€ύ$~’ύ!q‘ώ0>dώ"u–ώ#zœώ$£ύ%¦ύ%€₯ύ$} ύ"u—ώ pώ#xšώ$~’ύ$€€ύ!s”ώ=O5E.= $1?;M2A4D )5 #,9:K5E1@3C % %2B/>3C5E:L )7G nŽώ$£$~’Ϊ$~’D$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’-$~’Β$£#x›ώG[ώ ( #-5F,:5E:K,: $ *6F.<6F;M #. $2A4D5E:K $/.<"w™ώ$€€ύώ4D ",4DEY6FJ`ώjˆώ!t•ώ mŒώ7HBU#zώ$€€ύ\wώ5E5E0>^yώ$€ύ$~’ύ oŽώZtώXqώOg.;3CCVg…ώ$£ύ#x›ώ5E;M8I "-1@ &2 '3>Q3C (*7,9 !+2A?R (4 %-;*7 & '3;NNeώ!t•ώ$£$~’Ο$~’:$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’­$£ώ#|ŸώTmώ5E>Q/= !+0> '3 %)6@S/> *2B #. $/=O,90?+80?QJ`#yœύ$€ύYsώ ()6BVH]ώ#| ύ$£ύPgώ !,4D2B2B5F )I_ώ$€€ύ!t•ώ,:4C,96F9J6G & %3C4D4D4C,9 $+8@Sc€ώ$€€ύ"v˜ώ9J8I8I & &1AU,: ",:L?R*7G\$| ύ$£ύXrώ-;4C.<EZ#yœώ$€ύa}ώ;M/= $3BCX)68I?Rl‹ώ%€€ύ!p‘ώ:L #.3C )54D:L '3 )Q3B ",G\#{žύ$£ύdώ (4 $-:>Q (5 %05E3C.<5E $/Kaώ$~‘ύ$~‘ύKaώ6G6F "-4Dfƒώ$€ύ$| ύ#zώ$£ύ%€₯ύ$£ύ#zύ"v—ώ#{žύ$}‘ύ oώKaώ4D4D-:0? % %1?S-; & (4/= #.4D>P '3*7Xqώ#zώ$£$~’Ν$~’J$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’Œ$~’π$€!s”ώH]ώ #. )5=O3C "-1@ $0 )6F;M ( $Mdώ$£ύ$| ύLcώ,: *7H:K ' (=O2A %*7 %+9>QH]ώ$~’ύ$~’ύI^ώ % )?R,9=O$}‘ύ$£ύJ`ώ *5E3B-;+8,:^yώ%₯ύ pώ &2 $0>=P '3 (4C !+-:;L3C (7Gc€ώ$~’$£$~’Ρ$~’Y$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’€$~’ε$€$} ώ`{ώ6F )5E;M '3 *4D )9J"t–ώ%€₯ύe‚ώ %0?R,9 %+88I3C "-5E (45E-:Wpώ$~’ύ#|ŸύMc %0+83B4D5E"w˜ώ$€€ύ_zώ,90? &2A@S>Q pώ%€₯ύi‡ώ (4 $0>-;5E,94D ) $,9Kaώ#y›ώ$€$~’λ$~’$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’3$~’‘$~’π$€#y›ώ^yώOf+8 # (6F5EVoώ"v˜ώ$€€ύVoώ1@=P %0 $ '3@S "- %/==P &2 'Unώ$€ύ#zœύ=O5F6G !+ '3>Q!r’ώ$€€ύ mώKaATEYώYrώ pώ#zœύ$€ύ!t•ώCW5E $/1@ %0 *6F;M ",4DYsώ#yœώ$€$~£υ$~’¬$~’=$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’E$~’$~£σ$€#{žcώ@Sώ )5=O/= $/5EUmώTmώ1@-;+8 )5F;L ", %0?;M ' $Mdώ$€€ύ#y›ύ1@6G4D % &;M nŽώ$£ύ#{žύ"wšώ#| ύ$€€ύ%€₯ύ$} ύ"u–ώXrώ=O)6 %06G8J ", $ )5Qib~ώ"x›ώ$€$~’φ$~’Έ$~’P$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’H$~’ͺ$~’ξ$€$}  oώ_{ώ6E !+ (;M3B ' '31@0?,9.<)6 $/6F6G #. !+_zώ%₯ύ#zœώ7H7H8H ) !+8I`{ώ$€€ύ$} ύ"v˜ώ nώa~ώUnώBV/=5E5E %1 # &2AU6FMcώj‰ώ#|Ÿ$€$~£ς$~’΄$~’R$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’<$~’”$~’ή$£ύ$£#y›f„ώPgώLc (4 % *Q/> & &6G4D % %1@:L * !+0>F[5E?RώNeώg„ώl‹ώ"v˜$}‘$£$£ώ$~£μ$~’Β$~’$~’<$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’-$~’c$~’œ$~’Μ$~’λ$£ϋ$€€$€$~’#z"u— oώ pώf„ώ^yώZtώ`{ώ\wώTlώVoώ_zώf„ώcώi‡ώ pώ"xšώ#z$}‘$£$£$£ό$£ξ$~’Π$~’’$~’i$~’2$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’0$~’X$~’‚$~’©$~’Θ$~’ή$£ν$£χ$£ό$€$€€$€€$€$€$€€$€€$€$€$€€$€ό$£χ$~£ο$~’ΰ$~’Λ$~’¬$~’‡$~’\$~’4$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’2$~’F$~’Y$~’j$~’x$~’ƒ$~’ˆ$~’Œ$~’Œ$~’ˆ$~’„$~’z$~’l$~’[$~’H$~’4$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’(`ΐ ;;$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’$~’1$~’F$~’X$~’g$~’p$~£u$~’v$~’q$~’h$~’Y$~’G$~’2$~’$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’C$~’p$£›$€€½$€Φ$€η$£ρ$~’χ$}‘ϊ#|Ÿό#{Ÿύ#|Ÿύ#|Ÿό$} ϋ$~’χ$£ς$€€θ$€Ψ$€€ΐ$£ž$~£t$~’G$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’2$~’p$£­$€€Ϋ$£υ$| !t•iˆg…WpI^OfF[8HAUEZ8HBVQiI^Tlf„iˆ!s”#{ž$£φ$€€ή$£²$~’u$~’7$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’&$~’n$£Ί$€λ$| "u—_{J`Lb0? ",5F)6 "0?.< #.<2A #*74D $ %08I #-,9J`K`]w!r“$| $€ξ$£Ώ$~’t$~’+$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’>$£˜$€€α$}‘ώ!t•Wp=O@T %1 $3C,9 '2B2A "-0?0? &1/>3B.;4D3B #./>4D ))67H & !+?Q=OSl p$}‘$€€δ$£Ÿ$~’E$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’D$£ͺ$€ο#z`|AT@S %0 $2B0> "-;M>Q-:-: '35E*7 $/8H '3.<kŠώi‡ώ=P5E*7*6.;/=/= #..<5E & !+>P@S]x"xš$€ς$£±$~’L$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’6$££$£ρ"v—XrI_ (4 #0?2A %0;MLbώb~ώ"v˜ώg…ώ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’„$€η"xše‚7H %.<5F '3+8/=.<>Q$| ύi‡ώ2B2A '3-;6G (,96F )6!q’ώ`|ώ)6.< #.2A4C &1?`|"wš$€μ$~’Ž$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’L$£Θ$~’d5E.<5F ",+8,:Xqώ"xšώ#| ύ!t•ώf„ώFZώ:K2A0?1@ '38I &2 '3:L ),:Sl$~‘ύl‹ώ0> !+6G,:,9/=1?0? (4!q’ώYrώ $1?3C (5.= (/>3C3B_{$} $€Π$~’U$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’…$£ο!r’Qhώ8H & $00?/=5E #-CWώ$€ύh†ώ5E.</=2B )4D1@ )8I,9)56F*6.=Qiώ$£ύ#zώd€ώWqώ\wώPgώ5E9J ).<9J!q’ώg…ώ2A:K &2 ':KI^ώ:K+8 #/=Qiώ o$£σ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’,$£΅$~£ώg…/= )6G4CEZώ0? '5E0>/="u–ώ"u—ώBU #. (4I^G\ώ1@0>3C*7.;8I !+7H-;Mcώ$€€ύ nŽώl‹ώ!t•ώ"v˜ώ!s”ώ:K1@ %05F4Djˆώ$}‘ύ"u—ώd€ώ:K-;_{ώ$} ύ oώBV,99J %0+8_{$~’$£Ώ$~’4$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’G$£Τ"x›OgP *8J-;,:5E-;1@0?\wώ$€€ύLbώ4D9J5ELb (5+88I (43Cj‰ώkŠώG[ώg„ώ"v˜ώ!r“ώ$~’ύ#y›ύYsώ=P '3.< !+ #-:LOgώ"v˜$£ά$~’Q$£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’]$£ζ"wšBVώ %+82A/=DX"wšώ$€ύ"u–ώ?R5E "- &2Wqώ$~’ύ$} ύ#y›ώ!q‘ώZtώMdώ?Q4D8I/>9K $/:L,:/>kŠώ$~’ύWqώ+8.=7G &13B4C3B $.=O nŽώl‹ώ,9@S"u–ώ%€₯ύ"xšώOfώ7H)5 %2A=O7G1@ &;L!s•$€μ$~’i$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’j$£οlŠ?R7H '3 (4*7 (>P#y›ώ$~£ύ$€ύb~ώPlŒώ%€₯ύ"u—ώj‰ώfƒώ_zώNeώWqώLbώ5F5F0> mŒώ oώG\h†ώ$£ύ!s•ώNf &2 (5)6*6DX nώ^yώ1@ *0>CWi‡$£τ$~’w$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’o$€σ mŒ.< &2A0?3C5F )7H#|Ÿύ!s”ώ oώ$~’ύWpώ $/5F7Hi‡ώ$}‘ύPg5E7HLbώa~ώ!t•ώ"w™ώBU4C3B6G5E:KWpώUnώfƒώf„ώ p‘ώ"u–ώ"xšώ$}‘ύg…ώ0?1@,9iˆώ"u—ώ pώ$£ύj‰ώ5E.= #-0?6F0>dώ$€ύ"t•ώF[/=6F ", *6fƒ$€χ$~’|$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’g$£ςg…@S1@ '3J`ώQhώ ",6F0>G\$~’ύd€ώBU!r“ώ#y›ύ>Q1@ %1Voώ$€ύlŒώa}ώ"w™ώ#{Ÿύ"v˜ώg„ώOfώ7G8I8I8I8I:L5E:L5F;L;M=OATKb>Q2A7H5Ecώ%€₯ύ$~’ύZtώ6F $/4D3C3B+8Qiώ$~’ύ!r“ώJ`)6 */= * '3@Tfƒ$£φ$~’u$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’W$€€νjˆ+7 #.2B8I pώ#y›ύ:L-; !+G\ώ$€€ύa}ώ5EG\ώ$| ύ!s”ώDY/>J`#{žύ$} ύ!t•ώc€ώSkώ=P>Q9K?R?S@T@TAU@SAU?SAU?R>Q=O:K7H8I8I0>ATa}ώ#y›ύ^zώ1@4D5E2B '3)5Skώ#|Ÿύ#yœύ )@Sώ#{žύ p‘ώDY.<Rjώ%€₯ύSkώ3C1@bώ$£ύ`|ώ6G;MZtώNeBU9K=PAU@S?S>P@SATFZF[J`I^J`F[F[AUAUAU@T?R>PCWYsώLcώ "- )>P p$£κ$~’L$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$$£Ν!t•5E+83C-;8I0? &2Zuώ$€€ύf„ώ3B]xώ$€€ύQhώ3C*7:Kjˆώώ?R6G:LP@SI_ώXqώdώ oŽώ"u—ώ#y›ύ#{žύ#|Ÿύ#|Ÿύ#{žύ#yœύ"v˜ώ pώh†ώ\vώQhώF[BUAU?S=O5F4D6F4C:K0>I_"u—ώ$}‘ύ\vώώ"xšώi‡ώ`{ώ pώ#{žύ$€€ύ"v—ώH^ώ5F3B4C p‘$£Ψ$~’.$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~£©$| Ndώ !+ !+/= ' $/5E+9?R oώ$~’ύMdώbώ$}‘ύDX1@3C6FFZ8I9K=PAU>Q>PLbώa}ώ!t•ώ$} ύ$€ύ$€ύ$£ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ$£ύ$€ύ$€ύ$}‘ύ"v—ώg…ώTlώF[BV@T=O7G4D4DDX!r“ώ$€€ύZtώ0>,:AUώ#y›ώ%€₯ύ"w™ώdώWpώ>Q,9/= $/ $CWώ#{ž$£·$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’v$~’ϋTl5E5E.<6G-; #.0> * &2@S!s”ώ#zύ#zœύ#yœύDY5E6G4D9JQ>QUnώ pώ$}‘ύ$€ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$€ύ$~’ύ!t•ώ]xώI_BV@TQ1@8I9J@T@TQ:L;MYsώ#zύl‹ώ9J)5-:g„ώ!r“ώ2A7H/=7H3C '30? '3 !,`|$€ο$~’J$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$£Έ"w™I^.=)5F[ pώ$£ύ$~£ύ$€ύ$£ύcώ/=3B+8a~ώ$€€ύ nώCW6G=PBV;MI^ώmŒώ$£ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$£ύ!s”ώSlώCXAT:K8IUnώ#zύkŠώNeώUnώ"xšώ!s”ώ;L/= !,0? ( "-I^ώ '3 $/CW"w™$£Ζ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’n$~’ϋMc &13CCV#x›ώ"v˜ώTlώLbXqώ mŒώ$€ύ]xώ9J-:F[c€ώCW9K>QAT.< nŽώ"xšώCV*75E3C7H?R@S?Qh†ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ oώMcBV>P8IEZYsώa}ώUnώ4D8J-:*7 (5/=Pgώ$} ύI_2A9K?R>QDX!s”ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"x›ύQhώBV=P7H4D9JAUfƒώ#zύ%€₯ύ$~‘ύVoώ-;4Dh†ώ#zœώCW1@ "-\v$€μ$~’;$~’$~’$~’$~’$~’$~’$~’$~’$~’$}‘$~’$| EZ %0 '3;L pώ p‘ώQ@SBU!s”ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’κ$~’Τ$~’τ$~’ώ$~’ύ$~’ύ$~’$~’ϋ$~’ω$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"xšώQhώBV=P7GRjώ!t•ώ$£ύ"v˜ώYsώ"w™ώZtώ *.<7H"v˜ώh†ώ '3 %;M#z$~£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’&$€ίd6F5E*7/>k‰ώ#yœώ@S5E (44C '3EY$|Ÿύdώ7HP %.< $0 $Neώ$€€ύ_zώ:L*74DI_ώ pώ!t•ώFZ8HBV;Mfƒώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’|$~’$~’$~’ $~’Έ$~’$~’ϊ$~’`$~’$~’$~’O$~’φ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ oώEZ@T;MZtώ#|ŸύJ`ώ $0:KmŒώ pώ0> &29JlŒώ!r’ώ:K )8I#z$£‡$~’$~’$~’$~’$~’$~’$~’$~’$£Θ!q‘4D*6/=9K0>9Jl‹ώ$£ύ!t•ώkŠώ!pώ$}‘ύ#zώOf:K@S;MVoώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’τ$~’@$~’$~’$~’$~’z$~’$~’ΰ$~’"$~’$~’$~’$~’ή$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύc€ώCX=P>Q oώ pώ@S4DUnώ mώ@R5F+8Umώ^yώ,9 * &1h†$€€Υ$~’$~’$~’$~’$~’$~’$~’$~’J$£φPh3C0> $/ '33C !,-:cώ#yœώ$}‘ύ"w™ώfƒώCW7H;N@SEY#yœύ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’έ$~’$~’$~’$~’$~’J$~’ϋ$~’Ό$~’ $~’$~’$~’$~’Θ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύRjώAU;MOfώ$| ύYsώ %1=O*71@1@,9?R3B-;-;6FTm$~’ϊ$~’Z$~’$~’$~’$~’$~’$~’$£•#x›2A '/> '3 ).<3C+8:LDX?Q:K/=5E;MAU:Li‡ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ$|Ÿύ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ό$~’ $~’$~’$~’$~’$$~’ζ$~’$~’$~’$~’$~’$~’°$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύ!q‘ώ j‰ώ#xšώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!r“ώG\@T:Kdώ"w™ώEZ6G+84D !, (4,9 % %)6,:-;!t•$£¦$~’$~’$~’$~’$~’$~’$£Σ lŒ;M0>1@:L5E,93C/= "-1@ (49J3C7H=O=POeώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{Ÿύ k‹ώ_| k‹ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’’$~’$~’$~’$~’$~’ $~’Ώ$~’a$~’$~’$~’$~’$~’–$~’$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u—ώYsUoc€ώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ\wώAU+90?6G &1 $/a}$€€ί$~’"$~’$~’$~’$~’$~’G$£φNd &24D '3 !+0> #. "-6F0>6F4C/=4D;MAT;M oŽώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύh‡ώVpUoXs"s”ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’e$~’$~’$~’$~’$~’$~’ƒ$~’7$~’$~’$~’$~’$~’y$~’$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!pώVpVo]y#{Ÿώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"v˜ώI^AT8HJ`ώώ=O5F "-0> $0 */=4C*6,96GSk$~‘ϊ$~’W$~’$~’$~’$~’$£ƒ#z5E # #.4D*7/>;M2A-;3B $07H4C8I0?/=7G8H*7+92A ) &+8+80>"v˜$£”$~’$~’$~’$~’$£Ή!r“>Q2A/=0?8I,9 %10? $/5F6G1@2B:L@T;Ljˆώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{Ÿώ`}UoVpVpUoh‡ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ϋ$~’$~’$~’$~’l$~’$~’$~’$~’$~’$~’$~’$~’$~’D$~’φ$~’ώ$~’ύ$~’ύ$~’ύ$£ύ!p‘ώVpVo]y#{žώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!s”ώFZ?S7H4D:K+81@ !,,:8I0>0?7G6F &1 '2i‡$€€Η$~’$~’$~’$~’ $€€ί^y '32A+8 & !+3B,:5F9J (42B1?:K9J@TCW#{žύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ mŒώVpVpVpVpUoh‡ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Έ$~’$~’$~’*$~’΄$~’$~’$~’$~’$~’$~’$~’$~’$~’-$~’κ$~’$~’ύ$~’ύ$~’ύ$£ύ!q‘ώVpVo]y#{žύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύSkώATQ2A ) &28I2A6F*79K6FAU:KmŒώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύf„ώVoVpYt\wVpUoi‡ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ύ$~’a$~’$~’$~’w$~’ώ$~’X$~’$~’$~’$~’ $~’ $~’&$~’$~’ $~’Ζ$~’$~’ύ$~’ύ$~’ύ$£ύ!q‘ώVqVo]yώ#{žύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u–ώF[?R8I3C/=8J0? !+1?,9+85E:L1? "-6F#zœ$£z$~’$~’$£Ž"w™6F,:1@ !+ &.<9J1@-;0?.<;M0?;MAU@R#yœύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"s”ώXsVpVpi‡ώcώUoUoiˆώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’π$~’8$~’$~’$~’£$~’$~’‰$~’$~’$~’$~’"$~’$~’8$~’$~’$~’$~’$~’ύ$~’ύ$~’ύ$£ύ!q’ώVqVo]yώ#{žύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$} ύPgώAU7G9J.=0>,:;M2B !+ )5/= $. &21@BV"u–$£Ÿ$~’$~’$€¬ o %0 % )58I5E-;+80? &27H5E0>8I;N>QLbώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#|Ÿύa}UoVo]y#yœώdώUoUoiˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ψ$~’$~’$~’$~’Κ$~’$~’Β$~’ $~’$~’$~’S$~’τ$~’N$~’$~’$~’“$~’$~’ύ$~’ύ$~’ύ$£ύ!q’ώWqVo]yώ#{žύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύώ@T=O/>9J0?0?)6 )59J9J (4 * (5.=*6jˆ$€€»$~’ $~’$€Γ m7H2A.<)6/=+8 #-3C;L &24C6F7G>Q;MYsώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ mώVqVpWq!oώ$~’ύdώUoUoiˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’΅$~’$~’$~’*$~’η$~’$~’υ$~’f$~’$~’$~’Ή$~’$~’i$~’$~’$~’w$~’$~’ύ$~’ύ$~’ύ$£ύ!q’ώWqVo]y#{žύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύg…ώBV;M:K.=0?7H-:0>)6 "-0>:L8I (4 !+a|%€€Ρ$~’$~’$€€Τc€-:2A+8 ( #.6G:K '3 '48I0?5E8I@S9Ke‚ώ$€ύ$~’ύ$~’ύ$~’ύ#x›ώ\wVpUobώ$| ύ$~’ύdώUoUojˆώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Š$~’$~’$~’O$~’ω$~’ώ$~’$~’ο$~’Ύ$~’Σ$~’ύ$~’$~’…$~’$~’$~’[$~’ό$~’ώ$~’ύ$~’ύ$£ύ!q’ώWqVo]y#{žώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ oώCW>Q5E4D7H #.5E5E*7*6/> $/ #-,97Hb~$€ί$~’&$~’&%€€ίXq $ (0?:K5E $/4DώZtώ?Q2A6F7HAU8HmŒώ$£ύ$~’ύ$~’ύ$£ύ!oώVpVpYt"u–ώ$£ύ$~’ύdώUoUoj‰ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ό$~’]$~’$~’$~’z$~’$~’ύ$~’ύ$~’ώ$~’$~’$~’ώ$~’$~’ $~’$~’$~’B$~’υ$~’ώ$~’ύ$~’ύ$£ύ!q’ώWqVo]x#{žώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u—ώG\?R7G5E,9;M-;0>F[>P/= #. %1.=*7Tl$€ι$~’3$~’/$€ζ]x/=1@,9 &1-;/=_zώ%€₯ύ%€₯ύb~ώ9K2A:L@T:L!r“ώ$£ύ$~’ύ$~’ύ$~£ύ"u–ώZuWrj‰ώ$~’ύ$~’ύ$~’ύdώUoUoj‰ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ξ$~’5$~’$~’$~’§$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ί$~’$~’$~’,$~’ι$~’$~’ύ$~’ύ$£ύ!q’ώWqVo]x#{žώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ"x›ώH]?R7G4C5E)6G\"u—ώ#|ŸύXrώ-:9K:K-: 'Ka$€ξ$~’>$~’7$€λZt/=3B )5 * )59JkŠώ$€€ύ$€€ύ mŒώ-;9K7HBV9J"u—ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ"v™ώ"t•ώ$| ύ$~’ύ$~’ύ$~’ύcώUoUoj‰ώ$£ύ$~’ύ$~’ύ$~’ύ$~’$~’Υ$~’$~’$~’$~’Ν$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ρ$~’$~’$~’$~’Ω$~’$~’ύ$~’ύ$£ύ!q’ώWqVo]x#{žώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#zύLb>Q8I2B4D/=`|ώ%€₯ύ$£ύ"w™ώ;L #. !+*74DVo$£ς$~’G$~’:$€€μNe " *3B;M4C )ATώ!s”ώ!r“ώFZώ;M0?Q:K/>;M %12ASkώPhώ+8 (49J9K.< &G\$£σ$~’I$~’3$€ι]x2B3C)6 "-+91@0?-;0?/=6F3B;MBV;M!u–ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύc€UoVpa~ZuVpVoj‰ώ$~’ϋ$~’Y$~’$~’$~’$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ϊ$~’P$~’$~’$£‘ nUoUo^z nώWqVo]x#{žώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#zύJ`@T5E8J )5;M0> *0?8I1@ ", *+82BTl$£π$~’C$~’+$€€γUm $ )1@;M5E ", %07H3C,:4D5F8JBV9I!q’ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύc€UoVpWqVpVp\w#x›$~’ν$~’2$~’$~’$~’«$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’k$~’$~’$£t"t–YsVpVq^zώWqVo\x#{žώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ"xšώI_>Q8I1@8I)51@2A.<*6/>)6 &2-;0>Wp$£μ$~’9$~’ $€€Ϊ_z (4/>,9 !+ &27G9K %0)6;M.<6F9J@S9JkŠώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύc€UoVpVpVpVp lŒώ$~’$~’$~’$~’$~’$~’Π$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’‡$~’$~’$~’Y$}‘όf„ώVoVpVpVpVo\x#zώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!t•ώDX?R7G4D1?0?1@3C,9 !+,:8I9J+8 &Sl$€€ε$~’-$~’$€ΝkŠ8I4D,9 %0-:,: '34D8I %07H4D7H?R9Kbώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύc€UoVpVpUo_{#{žώ$~’$~’­$~’$~’$~’0$~’λ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’£$~’$~’$~’?$~£τ"w™ώ[vVpVpVpVp\x#zώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ nώDX=P5F3C0?7H+8 "-6F;M,: ( !+.<1@`{$€€Ω$~’$~’ $€€ΉkŠ #- '+9:K7G)6 (40?*78I1@2A8J=P;MVoώ$€€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύa~UoVpVpWr!q‘ώ$£ύ$~’$~’‚$~’$~’$~’V$~’ϋ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’½$~’ $~’$~’*$~’θ$~’ kŠώVpVpVpVp\x#zώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύdώAT ", )1@;M/=*70?0?9J2B=O?RH^ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#{Ÿύ^zVoVpUoc€ώ$} ύ$~’ώ$~’ϋ$~’U$~’$~’$~’ƒ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’$~’$~’Χ$~’#zώ^zVoVpVp[v#yœώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύYsώAU:K:K*74D9J &2,:.; )51@7H6G $/ %0 n$€€―$~’$~’$~£}#{žI_6F0?)6-:/= )+9;M/>1@/>;L7GAU=O"wšώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ"w™ώYtVpVpYt"t–ώ$£ύ$~’$~’λ$~’/$~’$~’$~’$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’δ$~’%$~’$~’ $~’Β$~’$£ύ!oώWqVpVpXs"u—ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#|ŸύKaAT:L0?;M)5.<.<.<7G7G #. % %10?8H"v˜$£Ž$~’$~’$~’W$~’ϋBV $ #-5E6G0?.<4D #-.<7H4D1@:K@S9Ki‡ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ mώVpVpVog…ώ$~’ύ$~’ύ$~’$~’Ο$~’$~’$~’$~’Σ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ρ$~’:$~’$~’$~’©$~’$~’ύ$|Ÿύa~UoVpVp mώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!r“ώEY?R8H6F.<1@0>7H-; & (43B*7,91@Lb$| ώ$~’h$~’$~’$~’1$€μSl #.0? )5 % $/6F0>2B7H '35E4D7H=P;MSkώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#|Ÿύ`|UoVp[w#xšώ$~£ύ$~’ύ$~’$~’ͺ$~’$~’$~’3$~’ν$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ϊ$~’R$~’$~’$~’Ž$~’$~’ύ$£ύ"s”ώXsVpUobώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύa|ώ@T>P3C6F2B7H &2 !+5E2A/=1@8H-: 'K`$£σ$~’?$~’$~’$~’$€Ο lŒ;M5E.<-;6F '2 *1@,9:K2A1@4D9K2B+8.=)6:K4C7HAU7Hdώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#zώ^zVoVo^z#zžώ$~’ύ$~’ύ$~’ώ$~’ϊ$~’Q$~’$~’$~’‡$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Š$~’$~’$~’V$~’ϋ$~’ώ$~’ύ$~£ύ"w™ώZuVpUoc€ώ$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ nŽώAU?R8I3C/>;L0>,:-; ' #.5E1?,:/=>Q!s”$£±$~’$~’$~’$~’$~’f$} ώ@R %02A #. %+8,9)69K1@6F,:3C6G=P?RG[ώ$} ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!r“ώXrUoWq!pώ$£ύ$~’ύ$~’ύ$~’$~’ι$~’,$~’$~’$~’²$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’₯$~’$~’$~’>$~’σ$~’ώ$~’ύ$~’ύ$~’ύj‰ώVpVpWr!q’ώ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύVpώAU:K8J5E3C '31@ (48I6G.<+92B1@ )8I#{ž$~£w$~’$~’$~’$~’$~’.$£ιc€8J2A.=4D8I (42A '3 %13B0>:K2B8IBV7Hi‡ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύ!pώ^{c€ώ$| ύ$~’ύ$~’ύ$~’ύ$~’$~’Ν$~’$~’$~’$~’Φ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ώ$~’ $~’$~’($~’η$~’$~’ύ$~’ύ$~’ύ#zœώ]yUoYs mώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!q’ώBV@T:K4D,:7H2A7H2A #.0> %1 $ ',9-;Rj$€ρ$~’<$~’$~’$~’$~’$~’ $£Ή!q‘ )5 %)61@ %15E4D/>:K/>/>-:5E7H>P?RFZώ#|Ÿύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ#{žώ#zώ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’¦$~’$~’$~’6$~’ο$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Τ$~’$~’$~’$~’Υ$~’$~’ύ$~’ύ$~’ύ$~£ύ!oώdώ"t–ώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύUnώBU;M8I5E6G,:.< !,3B '3,99J0?.</=;M p$£Η$~’$~’$~’$~’$~’$~’$~’q#|Ÿ?Q '33C "- '3/= ' (5-; (48J2A8J2A8JBU7Ha}ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’y$~’$~’$~’^$~’ό$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ζ$~’'$~’$~’ $~’ΐ$~’$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύ$}‘ύ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύkŠώ@T@S:K5F+94D-;:L2B1A8J)5 (44D %1 &8H#z$£ƒ$~’$~’$~’$~’$~’$~’$~’+$£εg…9J/=3C:K1@1@:L-;0?.=*70?5E7H=OAT9K5E.<2BBV"u–$£΄$~’ $~’$~’$~’$~’$~’$~’$~’$~’M$£υRj4D.< %0-;4D %1/=.< %01@ &13C1@8I;MBV6Fώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Λ$~’$~’$~’$~’Ω$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’p$~’$~’$~’o$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύfƒώAUAT7H7G8I3C8I-:2A+9 $/2A !+ !+1@ "- $Lb$£ϊ$~’]$~’$~’$~’$~’$~’$~’$~’$~’$~’$£½"t–:K)6/=7H*7/=8I,:7H4D5E6G5E2B7H:LAU8Ieƒώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’$~’H$~’τ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’$~’$~’Y$~’ό$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ nŽώCXAU;M4D3C-;-:.;-;*74D &22A0? $0+93C+8l‹$€Λ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’]$~’ωLb &.= #. %-; &2 )1@ !+/= '32A.<8H8I>Q@S8Ij‰ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ϊ$~’¬$~’w$~’Ο$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Η$~’$~’ $~’Ž$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!q’ώEYAU ' !+/= ' '3 nŽ$€Ν$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’U$£φ %1 $03C #. !+0? * (4+8 $/0? (41A1?3C9K?R?R9Ke‚ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’$~’$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύmŒώEZAU>Q8I9J6F4D7G2A6G3B2A9J/=8I5E-:5E2APg$~’ϊ$~’e$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $£¬"w™5D*7,9 ",.;4D+88I2A5E6G5E7H7G5E9J9J?R@T6Gώ$| ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$~’ύdώATAU=O7H1A3C.<.;-;*6 '3,: &/= "- *3B %1 $/@T#x›$£»$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’8$£ηh†=O/>/>8I (5*72A */> $/,9*6.=,:4D2A8I>PBV6FKaώ!t•ώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$€ύ"xšώUnώ@TBV;M7H7H1@6F0?6F1@8I0?:L/=4D2A #.+8,9 *^y$€ξ$~’F$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’}$~’ύNd &)6 (5 %,:-; )58I/>9J2A8I1@8I1@7H8H;MBV;N;L`|ώ#|Ÿύ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$}‘ύg„ώG]@TAT '-:*6 %06G/>/>8IOgώ#|Ÿ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$£»"v˜;L6F.<1?:K-;0>0? ",1? !+0? (55E/=8I6F8IQ8H6G3B,:3B )55E,99J0>9K/=.=0? ' '3*7 $6F"w™$£Θ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’9$£γ p8I #.+9*6 $,:)6*68I0>:K.<6F)63C,:4D6F7H=PBV>P8IEYώcώ"xšώ$£ύ$€ύ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$£ύ#zœύh†ώOfώAT@T@S9J7H3C3C7H2B:K/=5F $/0? **7.< (58I2A/=7H,9e‚$£κ$~’E$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’e$£φ\w #.1@ )5-;:K/=1A.< !+0> "-4D/=:K2A7H1?3C7G7H>QBV>Q9J=ORjώg…ώ"v˜ώ$}‘ύ$€ύ$€€ύ$€ύ$£ύ$£ύ$£ύ$£ύ$£ύ$£ύ$£ύ$€ύ$€ύ$~’ύ"xšώkŠώXqώFZ@S@T?S:L9J5E8H7H1@4D %11? %06F/=9J0?,:0> $ (4+8 ",0?c€$~’ϊ$~’t$€€$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$}‘ύYs8I+8.<-: $,9*7,:9K/>7H %11@ &25F1@9J4D4D7H7H>PAUAT=O8I=PG\ώUnώa|ώjˆώ pώ!s”ώ"u—ώ"u—ώ!s•ώ p‘ώkŠώc€ώXrώMcώCW>P@SAU?R9K9J6F8I5F-;2A )57H1?9K*72A * )5.<*79K0?+82B )Kaώ$} $~£›$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~£©$} Kaώ &-; '3)69K/>/>,: (1A*69J0?6F '32B.<9K4D5E5E6FQ=O@S=O>Q=O=P?R@T@T@S=P7H8I6G7H5E+84D/=:L.=2B *2A)68I2A.<.< $+8,9 )56FPgώ#yœ$£·$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$£»#yœJ`ώ9J/>.<0? $*6.</=9K)61? ",1A2A9J,:1@-:9KBVI^8I9J8I6G=O=O?R?SAU@SBV@SAU?R?R>Q=O8I;L5E2B7G5E6F*76F2B8H )5/= '49J0?6F **7*7*7:K-;*7.< %BVώ#z$£Ζ$~’%$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’%$£Γ#|ŸMcώ ' (4*7 '38I0> )5.; (5E2A6F (4*70?6G2A-:G]ώ"xšύ!s”ώh…ώNdώLc6F8J5F7H6F9J4D:L6G8I6F5F4C?R8HMdNe?R,94D5F1@)6/=2B7G)6.< !+6G1@3C+8 $/=*7.<9JF[ώ"w™$£Ξ$~’.$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’)$£Β#zœKaώ6F3C,92B ' %06F0>7H ",*60?4D3C %11@0?]yώ$£ύ"xšώ!t–ώ$| ύ$|Ÿύ oŽώfƒώOfώ9JDXI_ώQi3B9J8I $/.< #-+89K+8-; '3 'Lcώ#{Ÿ$£Μ$~’2$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$$£Έ$} ]x &2 */> '36G1@ )/= '36G1@ $0/>-::L '3bώ$~’ύRjώ0>J`ώfƒώ#y›ώ#{žύ@SJ_ώ$£ύfƒώ>P.<Xrώ$}‘ύ$| ύ!t–ώ oώ]wώPgώc€ώ#|Ÿύ"w˜ώ0>DXSkώATTmώ$£ύa~ώ %06GKa$| ύ nώ4C7H1@/>+9l‹ώ"u—ώ2A3B1@4D '/=4D/>.< %/>5F+91@ '*7d$~’ώ$£°$~’"$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’†$£σ!r“@S &-;.<1@5E & (47G.<1@ )2ANe$}‘ύi‡ώ4D6F !+7G0> &2>P+9Pgώ%€€ύ]xώ1@.<=O#y›ώ!t•ώAT-;.<JaRjώ!t•ώOfώ6G '3 #.9K+9/= #.+89J #. )5 )5 '38I>Qi‡$~£χ$~’‘$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’\$£έ"xšQh=O,: ",.< $/6F0> &0?1@1?ώ$€€ύ_zώ $0+84D.=.=,97H #.Neώ%€₯ύUnώ:K '4. $/6FXrώ$€€ύZtώ '32A3B\wώ%€€ύ"w™ώh†ώdώI_ώDYώdώ$€€ύXrώ %17G,: $2A3C)5.< &.<I^e‚$}‘ύ$£Ί$~’9$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’o$£ί#yœ`{BV ( %12A/>2A ",.<"u—ώ!r“ώ5E5E+8/=)65E,9 $/9JXqώ%€₯ύVoώ '0?3BJ_ώ%€₯ύYsώ)61@,:,:CWώ$£ύ_{ώ &,97H %0-; $//>6F/=Wp#z$€δ$~’z$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’,$£œ$€€π"u—Tl4D */=\w"u–$£σ$£₯$~’4$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’D$£―$£σ#x›5E2A5E3BRjώVoώ1@/> *5E/= %4D-; %Zsώ%€₯ύCWώ7H (4 (F[#zώ#zύ pώ!s”ώ#yœώ#zœώ mŒώLbώ,9.<4D !+ #.G\Yr!s”$£φ$£Ά$~’L$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’I$£©$€μ#yœl‹Lb+81@3B '.<1@)6/= '32B.< $0b~ώ#zώI_ώ6F,9 !,5E ", ",BVI^c#y›$€€π$£°$~’P$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’8$£Œ$€Υ$~’ϊ"u–i‡Nd3B7H1@ $.<4C *.<3C1@>P=O (4.<0>,9;M=P %1 $07G #- &1F[Lb`{"u—$~’ϋ$€€Ω$£“$~’>$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’V$£ž$€Χ$£φ#yœ!r“a}McJ`?R )63B7H (*77G ( (4:L #. (5AU4D>PYr_{mŒ#yœ$£ψ$€€Ϋ$£€$~’\$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’I$£€$£΄$€€Ω$€π$~’ό#zœ!t•!q‘l‹d€c€e‚]xa~j‰h† n"v˜#yœ$}‘ό$£ρ$€€Ϋ$€·$£…$~’M$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’8$~’Y$£y$£–$€¬$€½%€€Θ$€€Ξ$€€%€₯$€€Ο$€Ι$€€Ύ$€€$£˜$£|$~’\$~’:$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ $~’$~’$~’$~’$~’$~’$~’ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’(@€ @;;$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€€%€₯%‚§8%‚§Y%‚§x%¦‘%€₯‘%€€¨%€€¨%€₯‘%¦’%‚§z%‚¦[%‚§9%₯$€$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€ %‚§4%¦o$£¨#zΡ q‘λkŠψ_{ύUmRjSlSk\w^yώkŠψ pμ#zΣ$£ͺ%¦r%‚§7$€€ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’%¦%€₯#%¦n$~‘Ό!q’νe‚J`BV/=0>)5*7)6 )5+8 '3,: '31@-:CVH]c€ q‘ξ$} Ώ%¦r%€₯&#yœ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’%€₯$€€+%€₯‰#zέb~ώOf/=-: (43B5E+8,:,:+9,9-:Md`|"x›ΰ%€₯%€₯/`|$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~£$€%€₯€#zœαBV*7*77HH]ώ`|ώ nŽώVoώ0> '3/=)6,:G\ώ q‘ώ7G)6-;)5,:5ELbώ2A*8 '3BVYr"xšδ%€₯†$€€$£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$}‘%€₯Q$}‘Λa~@S-: &26F^yώ oŽώl‹ώVoώDX:K.</>*70>*7]xώ pώ2A/=/=,:/>0>j‰ώ2A-:-; (5 (4@S_z$| Π%₯X$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~£$£%₯Œ!q‘ςKa1A (5-;0>-:kŠώ`{ώ/>/=/=2A*71?-:/=.<^yώ#zώe‚ώdώPgώ4C '39J mŒώTlώ=O $/H^Ogώ,9.<Ka oŽυ%€₯“$€$£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$£%€€)$~‘Άd?R #->Pdώ:K (5-;ώ!r“ώJ`ώYrώg„ώ5E0?,:2A-;2AdώdώF[LcώJ_ώ+9/>4DkŠώ`{ώdώ`|ώ"w™ώh†ώ9J-: "-:Ld$} ½%€€/$£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$£$€€9#|ŸΞ^y*6+8*7Rjώ$€€ύi‡ώ8I '4FZ#zύ nŽώYsώH^5E2B5D pώiˆώ?Q?Q6F:L1?6F nώEZYsώ$£ύa~ώ6G &10>H]3C &2Zt#{ŸΤ$€€@$€$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€$€€>$| ΨOf*71@0? %0Ndώ#yœώ"v˜ώZtώ-;8I pώ\vώ3CCWVoώh†ώ=O4C3C;M\wώg…ώjˆώ mŒώ mŒώa}ώ5E1@k‰ώk‰ώ"u—ώSlώ1?*6.=Ogώ#x›ώKaώ-:.;J`#{žή%€₯F$€€$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$£%€₯6#zΧNe1@:KYsώ/=-;Wqώl‹ώLbώ!s”ώI^ώ.=_{ώ"w™ώk‰ώ nώbώNe;L:K:L;L;L;M=P?RDXAU4D9JkŠώ"xšώI^ώ.<1@-;AU!s”ώZtώ/= '3 )5.=Ne"x›έ%€₯>$£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€€%#|ŸΛXq '3+83C nώXrώ/>^yώe‚ώ3BZtώ!s”ώ>QJ``{ώNeCW=O=PATDXG]I_J`I^F[BV>QQEYSkώa~ώmŒώ!t•ώ"xšώ#yœύ#yœύ"x›ώ"u–ώ oώe‚ώXqώJ`@T;M8I5E4D?R oώi‡ώNeώh†ώj‰ώ!r’ώ!t•ώYsώ4D,9Tl$£Έ$£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$}‘$€€‚g„ώ8H)60? (4,:+8Ysώ!r“ώ"v˜ώTmώ2A5F:L=O?RLcc€ώ"v˜ώ$~’ύ$€ύ$£ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$£ύ$£ύ$~’ύ"xšώh‡ώSkώCWQI^fƒώ#{žύ$€ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ$£ύ#|ŸύkŠώPh@S:KKa nŽώTlώ4C]xώ_zώ1@-;.<*7+92A!t•ς%€₯P$£$~’$~’$~’$~’$~’$~’$~’$~’$€€$} ΐMc/>Kaώ!r’ώ_{ώa}ώ!t•ώ\vώ1@BVb~ώATQ"xšά%₯%$~’$~’$~’$~’$~’$£%€₯ug…/=+9^zώcώ/=/=-;I_ nŽώ>PPVoώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’·$~’$~’$~’O$~’φ$~’U$~’$~’$~’Ϋ$~’$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ`|ώ?RKa oώ?RDXPgώ3C7HRjώ,:+9jˆό%¦a$~’$~’$~’$£$€₯Of (5)6 '3.<1?PhώRjώCW7H=OF["v˜ώ$£ύ$~’ύ$~’ύ$~’ύ$}‘ύ$| ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Œ$~’$~’$~’)$~’Π$~’-$~’$~’ $~’Ε$~’$~’ύ$~’ύ$~’ύ"w™ώ!r”ώ$}‘ύ$~’ύ$~’ύ$~’ύ$~’ύ#zœύPg.=,9-;.</>3C9K>Qbώ$€ύ$~’ύ$~’ύ$~’ύ#xšώcώdώ#{žώ$~’ύ$~’ύ$~’ύ$~’ώ$~’ύ$~’_$~’$~’$~’$~’$~’$~’$~’$~’­$~’$~’ύ$~’ύ$| ύa}Xs"u–ώ$£ύ$~’ύ$~’ύ$~’ύ$£ύk‰ώBVBVj‰ώMdώ3B.<0?+82A+89J"w˜ε%¦($~’$~’%‚§Si‡ϊ &1+8+80>.<1@/=3B6F=OH]#yœύ$~’ύ$~’ύ$~’ύ$} ύcώUoVq!r’ώ$£ύ$~’ύ$~’ύ$~’ώ$~’ο$~’7$~’$~’ $~’$~’9$~’$~’$~’$~’’$~’$~’ύ$~’ύ#{Ÿώ]yVp!r“ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ#|ŸύRjώP^zώ$€ύ$~’ύ$~’ύ$£ύ!pώWqVpVp!oώ$£ύ$~’ύ$~’ύ$~’$~’Χ$~’$~’$~’Q$~’$~’$~’$~’$~’$~’v$~’$~’ύ$~’ύ#{Ÿώ^zVp!r“ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύh†ώAT7H3C1A+8/=,90>1@ )5Vo%€€•$~‘$€€ $}‘ΈCV #..=*71@/>0?1@4D;MAU!r“ώ$£ύ$~’ύ$~’ύ#zώ^zUoVpVp!oώ$£ύ$~’ύ$~’ύ$~’$~’³$~’$~’8$~’›$~’$~’$~’$~’7$~’$~’Z$~’ό$~’ώ$~’ύ#|Ÿώ^zVp!r“ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ"w™ώJ`:L4D0?0>/>.<,9 #.,9DX#{ŸΒ%€₯%₯#y›ΨBV/= )5.<)61@1@2B6F,9 (41A/=+9h†ω%‚§]%‚§fd€ϋ $/,:0>,:>QK`ώ;M3C;L>Q nŽώ$£ύ$£ύ"t–ώWrXs"s•ώ$}‘ύ`}ώVo!pώ$£ύ$~’ύ$~’$~’Τ$~’$~’$~’Ψ$~’$~’ώ$~’φ$~’$~’ι$~’*$~’ $~’Δ$~’$~’ύ#|Ÿώ^zVp!r’ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u–ώF\8I3B1@2A=O6G '3 '3/>cύ%‚§s%¦teƒύ2A,9 '22Biˆώ%₯ύVoώ4C;M@S!s”ώ$£ύ$~’ύ#x›ώbώ kŠώ$~‘ύ$} ύ`}ώVo!pώ$€ύ$£ύ$~’$~’°$~’$~’8$~’π$~’ώ$~’ύ$~’ώ$~’ώ$~’υ$~’A$~’$~’«$~’$~’ύ#|Ÿώ^zVp!r’ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ"xšώI_9J4D0>Xrώ#zύTlώ0>0> (5]wώ%‚¦%‚§|^zώ $/-;1@,:Xrώ!s”ώK`ώ4D (4Zu%¦‡%‚§pb~ό %1-:2A*7,:2A0?5Ebώ%¦}%‚§`i‡ω1@-: %00>0?-;2A4D:L>Q mώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύ`|UoVpXs"t•$£Ρ$~’$~’$~’Ϊ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’­%‚§$€?#x›τ\xVoVpWq!q’ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ!t•ώEZ8J2B2A.<.=+8.=/> (5a}ό%‚§m%‚§I nσ+9*72B,:+90?1@3C9J=Odώ$€ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$| ύ_{UoVof„ώ$}‘$~’¬$~’$~’;$~’ρ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ε$~’ $~’($~£η mŒVpVpVq!q’ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ mŒώBV7H4C.<1@-:-;)6 (44Dl‹χ%‚§U%‚§0!t•ζ8H.< %0-:0>/>0>4D7H=OXqώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ#zώ\wUo[v"w™ώ$~£$~’€$~’$~’d$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ϊ$~’$~’$~’Χ#{ž_|UoVp!oώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύbώ?R7G1@2B+80?-;-;.<.< pμ%‚§9%€₯#{žΟ>P &21@/>,9.<1@3B6F=OJ_ώ#|Ÿύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"s”ώWrVp j‰ώ$~’ώ$~’ϊ$~’T$~’$~’‘$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’κ$~’,$~’$~’Α$£!q’ώWrUoh†ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύTmώ,9 '3/= (4/=^y%€₯…$~’$~’%‚§B nτ3B.< &1.<,90>1@2A6F=ODX"w™ώ$~£ύ$~’ύ$~’ύ!oώXsa~$|Ÿύ$~’ύ$~’$~’¨$~’$~’>$~’σ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’x$~’$~’q$~’$~’ύ$~’ύh†ώUn^z#{žώ$~’ύ$~’ύ$~’ύ#zύNe/=1@,: (4.<+8j‰ψ%‚§L$~’$~’$€€#|ŸΟBV %00?.;2A.;0?1@3C9K=P]xώ$£ύ$~’ύ$~’ύ$}‘ύ"u–ώ"v™ώ$~’ύ$~’ύ$~’$~’|$~’$~’h$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’•$~’$~’V$~’ϋ$~’ώ$~’ύ#xšώc€ώ!oώ$} ύ$~’ύ$~’ύ$£ύfƒώAT9J4D1@.</= )50?)5*7EY#yœΧ%₯$~’$~’$~’%€₯Ys/=,9/=)6/=,91@3B6F=OBV!s“ώ$£ύ$~’ύ$~’ύ$~£ύ$~’ύ$~’ύ$~’ώ$~’ω$~’P$~’$~’•$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’―$~’$~’<$~’σ$~’ώ$~’ύ$~’ύ$} ύ$~’ύ$~’ύ$~’ύ$£ύ"w™ώKa &2.< #-Sk%€₯˜$~‘$~’$~’$~’%₯?!s•ρ2A,: )5-;-;0?/>2A4D8I=POfώ#|Ÿύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’θ$~’*$~’$~’Ώ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Η$~’ $~’'$~’ζ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$}‘ύYsώ?R8I3C0?0?.<.=/=/=,99J oυ%¦H$~’$~’$~’$~’$€€ $}‘΅Qh.<+81@,90?/=/>2B5E;M=O\wώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Σ$~’$~’$~’ΰ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Ϋ$~’$~’$~’Υ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύe‚ώBV:L4D2A1@.;+8-; &1+8 %0G[$~’Ώ$£$~’$~’$~’$~’$~’%¦V mŒψ,9-: $/.< (4/=.<0?3B6G=O>Pcώ$£ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ο$~’u$~’$~’ϊ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ρ$~’H$~’)$~’ά$~’$~’ύ$~’ύ$~’ύ$~’ύ$£ύjˆώEY1@4C7H=P>Qcώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’ύ$~’ώ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’α$~’Χ$~’ό$~’ώ$~’ύ$~’ύ$~’ύ$£ύjˆώFZ+80>0>0?2B4D7H=P>P\vώ#|Ÿύ$£ύ$~’ύ$~’ύ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’$~’ώ$~’ύ$~’ύ$£ύ$}‘ύc€ώDY)59K!q‘φ%€₯V$~£$~’$~’$~’$~’$~’$~’$~’$~£$£œ`|-;.<)6-: )5/=.<0?2A4D7H=O=OOfώ!r“ώ$£ύ$~£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ"u—ώWpώAU;N6G3C1?0?/=-;1@.</=,9,:Vn$€¦$~£$~’$~’$~’$~’$~’$~’$~’$~’$~’%€₯&#zΦEY.<*71@-;.</=-;0?2A4C6G;N=PAU\wώ"w™ώ$£ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$£ύ#y›ύbώH^>Q:L5F3B1@0?1@/=-;.< %0,: %0H]#{žά$€€-$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€%€₯V"t–ς:K)5 '3+9,:1@/=.<0?1@3B5E8J=O=ODXYsώ oώ#{žύ$£ύ$€ύ$£ύ$£ύ$£ύ$£ύ$£ύ$£ύ$€ύ$£ύ#|Ÿύ!r’ώ_zώJ`?R &2-:-;/=0?0>0?2B4D6F:K=O=O?SI_Wpώd€ώmŒώ!r’ώ!t•ώ!t–ώ!r“ώ nώfƒώώNeώCX>Q0?.<0>2A3B3C8I:L:L/>1@0?CWe‚ώ\vώJ`?R:L9J:L:K:L9K8I9J=ODYEZ6F2A1A0>0?/=.<-:/=.= $//>,94D$~£΅$€$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~£$€$~£¬b~;L)5+8 (40?/> (50?0?,:0>Ofώ#zώc€ώ mŒώ nώh†ώFZJ`ώWpώ8IAT\wώfƒώ oώ nŽώ"w™ώe‚ώ4D.;2A-;+81@,:)6,:.<.<,:c$£΄$€$~£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$£%€₯œjˆϋ:K/=.< &2.<.<-:,:/=.<\vώfƒώ3B6F?RXqώKa`{ώkŠώ1@I_#{žύWpώCV7GMdώ!r“ώ:K.=-;-:.<-: (41@+8 &2;LkŠύ$~£€$£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’ %€€|"v—οH]-:-:/= $/1A,:*79J!q‘ώVoώ/=,:0>/>1@^yώf„ώ2A7G"u–ώWpώ>QRjώh†ώώ4D '30?.< &21@)6*7+8Mc pς%€₯„$£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$}‘%€₯O#{žΠc€4C-;,:,9 (5.=:K"xšώDX*7.=-;-;/=cώdώ.<2Ai‡ώ"v˜ώh‡ώ^zώ\wώ pώEYώ.< (4-;,:+8 '3=PZt#{žΥ%₯V$}‘$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$£%€₯!$€’!s”ξWq.;/>+8 )5Mdώ q‘ώ8I+8-;.<+81@f„ώa~ώ (41@ώiˆώ3B/==O!r“ώJ`ώ &2/=+8 &1:KMd!s“ρ%€₯™$€€%$£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’%¦B$~’― pσVo2A3CG\ώYsώ3C &11A $02A &2g„ώώ1@ $/Unώ#yœώ`|ώbώ mώ^yώ3C-; &1 (4,9-:,9XqώPhώ0? '3DXcώQiώJ_3B4C/=I_^y!s”λ$€«%¦M$£ $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€%¦1%₯z$}‘ΐ!r“λc€ώVoATAT.<7H)66F '35E,9;M4DH]Pgdώ!r“ν#|ŸΓ%¦~%¦4$£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€ %¦1%‚§c$€€•$} ½"xšΨ!r’θ oρh†φjˆψfƒψl‹φl‹ς!s”ι"w™Ω#| Ώ%€₯˜%¦f%¦3%€₯$~£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$}‘$€€ %¦%‚§2%‚§E%‚¨S%‚§Y%ƒ¨Y%‚§S%‚¨F%‚§3%¦%€₯ $}‘$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’(0` $;;$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’#yœ'‹² &‡­,%‚§W$£#z‘"xšΆ"u—ΐ"u—ΐ"wš·#z’$~£‚%‚§Y&‡­.'‹² "x›$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’'‹²&…«2$}‘x!t•ΉdγWqχKaAT?R9J9J>Q@SKaWpψc€δ!s”Ό$} {&…ͺ4'‹²$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$£'‰°%‚§H#x›¨bκKa7H/>7G+8*7*7+8=OAT+8)6,9,:8IJ`b~μ"w™¬%‚§K'ˆ― $£$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$£jˆ%ƒ©5"xš§_{σ@S0>P nώQiώ=O3C.<.<.<-;e‚ώ`|ώF[@SKaώ*75El‹ώLbώQiώG\ώ.</=/=2Ae‚ώώTlώDX-:6Fh…ώ\vώVoώ mŒώMcώ+8.<Wpύ"w™ͺ&„ͺ!$€€#|Ÿ$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€€&„©)!s”ΏLb*7*7Ztώ#zœώF[,:`|ώ mŒώMcώ@SBU6G1@8I mώZuώJ`ώFZ;L6Fc€ώTlώ"u—ώPhώ.<3BMcώ.<J_!r“Δ%ƒ©-$€$} $~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€€%ƒ©(!r“ΖEZ5E8I+8ώi‡ώf„ώ7HKaώl‹ώRjώ`|ώ_{ώYsώe‚ώ1@ (5BU!r’Μ%‚¨-$€$~’$~’$~’$~’$~’$~’$~’$~’$~’$€%ƒ©"u—ΌEY*7DXώa}ώ5Fa}ώKaώUnώ`|ώ@Sb~ώVpώH]@SAUFZH]H]EZAU=P9K:KTmώFZ0>0?Skώ"u—ώF[ώ2ADY7HAT"u–Β%ƒ¨$£$~’$~’$~’$~’$~’$~’$~’$£&…« #{žŸJ`*7)6.;^yώ]yώh†ώCW7HNeώQf„ώ6F+8+9-;Umό$£r!t•$~’$~’$~’$~’$~’$£&„ͺ-i‡ί6FK`ώe‚ώd‚ώk‰ώATDX_{ώ>P?RXrώ"v˜ώ$£ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ$£ύ"x›ώ^zώAUDXb~ώf„ώf„ώ4C.<?RKaώ5Eh†δ%ƒ©3$£$~’$~’$~’$~’(ŽΆ#yœ›G\9Ibώ8H-:Pgώ^yώ4D;LBVdώ$}‘ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’$~’ώ$~’ύ$~’ώ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~£ύ$~’ύjˆώF[?RKbώQcώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’Κ$~’+$~’‹$~’ψ$~’o$~’h$~’υ$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύiˆώBVWpώa}ώDX`{ώ4DώI^ώAT"wš‘*“½$~’$~’&…«%h†α1@+81@ώ lŒώi‡ώRjώ$~’Μ$~’$~’$~’Ϊ$~’$~’ύ$~’ύ$~‘ύ$~’ύ$~’ύ$~’ύ$~’ύ]yώAUcώCWF[ώ4D;M:L-:g…ε&…ͺ*$~’$}‘%€₯eSlώ+9,9-;1@=O9J8IFZ!t–ώ$£ύ$~’ύ$| ύ!q’ώ"wšώ$~’ύ$~’ύ$~’ώ$~’ό$~’\$~’$~’$~’‹$~’$~’ $~’Δ$~’$~’ύ#zώfƒώ"t–ώ$~£ύ$~’ύ$~£ύ"xšώKaLc`|ώ7H-;-: (4+8Nd$€m$} *•ΐ"w™¦;M+9-;-;/=0?4D2A8HDX!t•ώ$£ύ$~£ύ"w™ώZvUoa}$}‘ύ$~’ύ$~’$~’Υ$~’$~’G$~’$~’$~’$~’$~’$~’$£ύ"u—ώXr l‹ώ$£ύ$~’ύ$~’ύ$~£ύ"xšώI_6G2A.<.<,:,:0?jˆΪ&‡!&„ͺ?`{ο+8-;-:/>1@3C:KRiώ$}‘ύ$~’ύ$}‘ύeƒώWqWqa}$}‘ύ$~’ύ$~’$~’±$~’ $~’“$~’3$~’$~’9$~’$~’s$~’$£ύ"u—ώXr l‹ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύZtώ:K2B0>.<-;+9+9ς&„ͺG%¦dRjϊ*6,9-;.=2A5EQl‹ώ$€ύ#{žώ_{[v"v˜ώ^{a}$}‘ύ$~’ώ$~’ϋ$~’V$~’($~’λ$~’Κ$~’z$~’Ϋ$~’C$~’<$~’τ$£ώ"v—ώXr k‹ώ$£ύ$~’ύ$~’ύ$~’ύ$£ύ!r’ώBV5E1@/=,9-:*7I^$}‘Œ$| –EY*6,:?Rf„ώEY6GAT!r“ώ$€ύ"w™ώ\w mώ$| ύ^za~$}‘ύ$£ώ$~’ν$~’.$~’N$~’ϊ$~’$~’$~’ώ$~’]$~’%$~’θ$£"v˜ώXr k‹ώ$£ύ$~’ύ$~’ύ$~’ύ$£ύ"v˜ώF\5E2AI_ώSkώ0>+8BU#z #{ž BV*7+9DX!r’ώI^7GBV!t–ώ$£ύ$}‘ύ#x›ώ$}‘ύ$|Ÿύ^za~"u—ώ"u—$~’$~’$~’|$~’$~’ύ$~’ύ$~’$~’z$~’$~‘Χ#{Ÿ"u—ώXr k‹ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ#y›ώI^5F3Cg…ώ oώ3B (5CW#zœͺ#{ŸžFZ+8+80>6F4C8IBV!t–ώ$£ύ$~’ύ$~’ύ$~’ύ#|Ÿώ^z]x\xb$} ­%€₯$~’ͺ$~’$~’ύ$~’ύ$~’$~’—&ˆ― "u–Β_|h‡ώXs kŠώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ#x›ώI_6F1@:K1A6G>Pk‰ώ$€ύ$~’ύ$~’ύ$~’ύ#|Ÿώ^zUoa~$|Ÿϋ$£R$~’+$~’λ$~’$~’ύ$~’ύ$~’$~’Κ$~’ $£ nŽVpUo kŠώ$£ύ$~’ύ$~’ύ$~’ύ$£ύ!q‘ώBU5E1@/=-;+9)6Lb$~’…%‚§[Wpψ,9+8.</=1@5E;M_zώ$€ύ$~’ύ$~’ύ$~’ύ#yœώ[vXr!s”$£λ$~’+$~’R$~’ϋ$~’ώ$~’ύ$~’ύ$~’$~’έ$~’$~£p#|Ÿ`}Uoh‡ώ$~£ύ$~’ύ$~’ύ$~’ύ$£ύg„ώ=P4C0?.<.<+8+8Rjϋ%¦e&†¬6`|κ+8,:-;.=1@3C:KOgώ$} ύ$~’ύ$~’ύ$£ύ!p‘ώVpeƒώ$}‘$~’Ο$~’$~’€$~’$~’ύ$~’ύ$~’ύ$~’ώ$~’μ$~’,$~’S$£ϋ!r“ώWq`}$| ύ$~’ύ$~’ύ$~’ύ$~’ύWqώ:K3C/=.<,:-;,9`{ξ&…ͺ>'ˆ― oΜ4C,9-;.=0?2A8HBU!r’ώ$£ύ$~’ύ#{Ÿύ`|Zt"v˜ώ$~£$~’©$~’$~’­$~’$~’ύ$~’ύ$~’ύ$~’ώ$~’χ$~’D$~’9$~’σ$}‘ώd‚ώWr!r“ώ$~£ύ$~’ύ$£ύ"v˜ώG]7H2A0>,9-;)64Dl‹'ˆ―L#y›˜CW+8,:/=/=1@5E;MZtώ$£ύ$~’ύ#zœώb~ j‰ώ$~’ύ$~’$~’|$~’$~’Σ$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’_$~’$$~’η$~£"v˜ώZtf…ώ$~’ύ$~’ύ$£ύb~ώ=O4D1@/=.<)6+8?Q"wš - Ν$~’%‚§TVoϊ*7-:-;.<0>3B9JCW!r’ώ$£ύ$~’ύ$|Ÿύ$| ύ$~’ώ$~’ω$~’N$~’.$~’ν$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’|$~’$~’Υ$~’$~‘ύ"s•ώ#yœώ$~’ύ$£ύ"v—ώI_8I3B0?.<-:-; (4Unό%₯\$~’$~’&†¬ nŽΣ5D,:,9.</>1@5E;MQiώ#|Ÿύ$~’ύ$~’ύ$~’ύ$~’$~’θ$~’'$~’V$~’ό$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’™$~’ $~’ΐ$~’$~’ύ$~£ύ$~’ύ$~’ύ$}‘ύYsώ.<-;+8+8G[$| ‹Nf$~’$~’$£&…«)h†ΰ3B*7-;.;/=1?3C9J?Rb~ώ$~’ύ$~’ύ$~’ώ$~’ψ$~’Δ$~’ι$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ζ$~’}$~’Υ$~’$~’ύ$~’ύ$~’ύh…ώCW8I3B0?/=-;,9,9/=i‡ε%„©/$~£$~’$~’$~’fƒ$~’€Ne+9*7-;.</>1@4D9K?R]xώ#|Ÿύ$£ύ$~’ώ$~’$~’$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’$~’ώ$~’ύ$£ύ$} ύc€ώCW8J3C1@/>-;-:-:*7Ne#{Ÿˆ@ζ$~’$~’$~’$~’$£&„ͺ!r’Κ;L+9+8-;.=0>1@4C9J=PQhώ!q’ώ$£ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ύ$£ύ!t–ώWpώ?S8I3C1@/>.<-;-:*89J nŽΠ&…«$£$~’$~’$~’$~’$~’$~£%¦Lcο1@,9+8-;.=/>1@3C7H;MCWYsώ!q’ώ$} ύ$£ύ$€ύ$£ύ$£ύ$£ύ$£ύ$£ύ$£ύ$}‘ύ!s•ώ^zώG\;M6G3B1@/>.<-;-;+8/=`|ς%‚§S$~£$~’$~’$~’$~’$~’$~’$~£)’»$~’{Voό.<,:+9-;.=/>1@2B5E9J;MATOfώ^zώj‰ώ!q’ώ!t–ώ!t–ώ!r’ώl‹ώa}ώSkώEYP;L9J6F4D2B1@0>/=-;-;-;*7+8Ph#y› &†¬ $€$~’$~’$~’$~’$~’$~’$~’$~’$~’$€%„©#z’Pg.<,9+8-;.<.</>/=DX pώcώZtώKb=PDX9JATMcWqώ`|ώPgώ2B0>/=.<-;-:-;*7,9Qh"w™©&…«$€€$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€%„©#{ž—Wqϋ2A+8*7-;-;.<-;Qhώ_{ώ=PLbώZtώNeώg„ώ7Ha~ώe‚ώLbώMdώkŠώ9J.;-;-;+9-:*7/>Wqό#y›&…«%€₯$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$€&…« $~’wdνRiώI^AT]xώ_{ώYrώ?QiˆώώώG\8I;MCWI^MdEY8Ih†ώVoώ1@2A^zώRjώ+80>Unτ#{ŸjCσ%¦$~’$~’$~’$~’$~’"t–#z%€€MZtλ.=-;YsώPhώ`|ώ>QWpώF[H^G\H^Rjώ\wώa}ώa}ώ\wώTlώH^?RBV7G4DYsώg…ώTlώTmώUnώ3BXrξ$£R"xš%‚§$~’$~’$~’$~’$€€&†¬&dΤ4D7G8I9Jg„ώl‹ώ9K:K@SPhώh†ώ"wšώ$}‘ύ$£ύ$£ύ$£ύ$£ύ$~‘ύ#y›ώl‹ώUnώ?S>Qe‚ώEZPgώ`|ώ8I,:1@cΩ&…«+$€$~’$~’$~’$€+—Α!r’ž@SI^ώ`{ώfƒώKaώF[\wώQZuώ:Ll‹Ή(· $~’$}‘%‚§?Tmς*79KbώSlώ_{ώKbG\!t•ώ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’ζ$~’*$~’Q$~’Μ$~’$~’$~’$~’ύ$~’ύ$£ύ$~’ύ$£ύ"w™ώLcVoώNeώPgώPf„ώ$£ύ$~’ύ#zώ#y›ώ$~’ύ$~’ύ$~’$~’Δ$~’ $~’%$~’†$~’$~’f$~’ώ$~’ύ#zώ!p‘ώ$| ύ$~’ύ$£ύkŠώFZ]xώ@S/>.<*6-;-;.<0?7HOfώ#{Ÿύ$~£ύ#{žώa~`}#|Ÿύ$~’ύ$~’$~’œ$~’$~’$~’3$~’$~’L$~’ω$£ώ!q’ώ[v#y›ώ$~’ύ$~’ύ$} ύTmώDY>Q/=,9+9/>c€Π(΄&„ͺ<Vnν+8,:/=0?4CP"u—–!s”¦:K+83BPgώ=O8IVoώ$£ύ#wšώ[w!pώ!oώ\w#zώ$£$~’ΐ$~’$~’Θ$~’ϊ$~’μ$~’Τ$~’$~’΅$£!q’ώZu#x›ώ$~’ύ$~’ύ$~’ύ$£ύ]yώ8I2A@S=O*79J!q‘!q‘²8I*79Jl‹ώG\8IZtώ$£ύ$| ύ"u—ώ$}‘ύ nŽώ\w"t•ώ#wš$~’–$~’($~’ζ$~’$~’$~’ζ$~’'$~’š$|Ÿ!q‘ώZv#xšώ$~’ύ$~’ύ$~’ύ$£ύb~ώ8I4Dg„ώZtώ*77H oΊ!q’°9J+8.<5E4D9JZtώ$£ύ$~’ύ$£ύ$£ύ nŽώYt\xg†$~’g$~’H$~’ψ$~’ώ$~’ώ$~’σ$£:#wš}c€dώ[v#xšώ$~’ύ$~’ύ$~’ύ$£ύb~ώ9J2A:L6F+87H oΈ!t•’;M+8-;/=2A8JVoώ$~’ύ$~’ύ$~’ύ$£ύ nŽώVpYt"t•υ$€€>$~’t$~’$~’ύ$~’ώ$~’ϋ$~’Q#|Ÿ`eƒVpZu#xšώ$~’ύ$~’ύ$~’ύ$£ύ]xώ8I1@.<,:+8:K!r’ͺ#x›‡@T+8-;/=2A7HMd#|Ÿύ$~’ύ$~’ύ$£ύ lŒώUog†$~’ί$~’"$~’£$~’$~’ύ$~’ύ$~’$~’m$€€F"v˜ψZuYt"wšώ$~£ύ$~’ύ$~’ύ$}‘ύTlώ6F1@.=-:*7?R"w™$£`Kaϊ*7-:.=1@6FCW!t–ώ$£ύ$~’ύ$~‘ύdώ[v#xš$£½$~’$~’Λ$~’$~’ύ$~’ύ$~’$~’Š$~’0$~’ξiˆWq!r“ώ$£ύ$~’ύ$~£ύ"xšώH]5E0>.<-:*7J_ϋ$}‘h&†¬3Ysθ+8,:.<1?3C;Mc€ώ$£ύ$~£ύ"u—ώYt k‹ώ$~’$~’’$~’*$~’θ$~’$~’ύ$~’ύ$~’$~’§$~’"$~’ί#yœ\xd‚ώ$}‘ύ$~’ύ$£ύiˆώ=P3C0>,:,:+8Wpμ&„ͺ:)’»h†ΐ2A,9.=/=2A8HLb#zύ$£ύ"t–ώeƒώ#zώ$~’ώ$~’c$~’L$~’ω$~’ώ$~’ύ$~’ύ$~’$~’Α$~’$~’Λ$~£ nŽώ_{#yœώ$~£ύ#|ŸύRjώ7H2A/=-;)61@f„Ζ)Ήh†"wš}AU,9-;.<0?4DP"v˜„$~’&„ͺ2Ztκ-:,9-;/>2A7HDY q‘ώ$£ύ$~’ύ$~’$~’ή$~’ $~’§$~’$~’ύ$~’ύ$~’ύ$~’$~’η$~’&$~’–$~’$~’ύ$~’ύ$£ύ!t–ώI_7G2A/=-;,9+8Xrν%ƒ¨7$~’$~’-ŸΜ!r’ .<-:+8:L p¦+™Ε$~’$~’$~’%‚¨8ι-;+9-;/=1@4D:KKa q‘ώ$£ύ$~’ώ$~’$~’ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ώ$~’χ$~’ϊ$~’ώ$£ύ!t•ώPg:K3C0?.=-;,9-:Ysν%‚§=$~’$~’$~’$£=ά"w™…FZ+8,:-;/=1@4D9KDXbώ#zύ$£ύ$£ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$~’ύ$£ώ$£ώ#{žύg„ώH]9J3C1?/=-;,:*7DX"v—Œ1ί$£$~’$~’$~’%€₯'ˆl‹Ύ9J+8-:-;/=1@3C7HP6G3B0?/=.;,:+88IjˆΔ'ˆ―%€€$~’$~’$~’$~’$~’$~’%‚§4c€Ϊ4D+8-:-;/=0?2A4D8J.=-;,:+83Ca}ή%ƒ¨8$~’$~’$~’$~’$~’$~’$~’&„ͺ"w™$€F`|α4D+8,:-;.</>0>?Q`{ώTlώH]=O>Q:L?QG\PgώF[2B0?/=.<-;,:+84C^yδ%€₯K"xš%¦$~’$~’$~’$~’$~’$~’$~’%‚§ p$€EdΩ:K+8,9-;-;-;Kaώ^yώH]WpώNeώ]xώP-;/>`|ώ8I,9,9+—Βfƒ$£#z$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’%‚§ oŽ'‹²!t•f^yΌLbνDXύ8I/>.<P/>:L`|ώ_zώ:LDXEZXrώi‡ώ!t•ώ"wšώ"wšώ!t•ώkŠώώF[7HUnώUnώXrώZtώ6G;Ml‹‘.€Σ%ƒ¨$~’$~‘!q‘#y›PKaσG\ώQhώJ`ώXqώ=OVpώ!s•ώ$~’ύ$£ύ$£ύ$~£ύ$~£ύ$£ύ$£ύ$~’ύ"v—ώώG]Tlώ]xώBV2A@SKaυ"xšT nŽ$}‘$€€(Ž·]xΓ@SOfώ2AUnώAU@Scώ$} ύ$£ύ$~’ύ$~’ύ$~’ώ$~’ώ$~’$~’$~’ώ$~’ύ$£ύ$}‘ύf„ώF[EZI^ώa}ώ]wώDW\vΗ(Œ΄$€€ o"v—\BUϋ@SQiώ;LWqώBVb~ώ$~’ύ$~’ύ$~’ύ$~’ύ$~’$~’²$~’•$~’Ω$~’•$~’τ$~’ώ$~’ύ$~£ύ$~£ύf„ώEZa}ώWpώDXQhFZό!t•akŠ.€b±1@0>QhώXrώF[Unώ$} ύ$~’ύ$| ύ$~’ύ$~’ώ$~’ό$~’V$~’*$~’~$~’$~’Ψ$~’#{žώ#zώ$~’ύ$}‘ύώRjώKaώ7H7G2A`|Ά,žΛ %ƒ©1Ofζ,:-;/>4DAU!r“ώ$€ύ"t•ώa~#x›ώ$~’ώ$~’ν$~’4$~’$~’.$~’ $~’Γ$£ mώg†ώ$~’ύ$£ύ"u—ώKaFZ0>+9+8Ndι%¦6"v˜g@Sϋ+8/=0?6FUnώ$~’ύ#|Ÿύ`}Wq"u–ώ$£$~’Ρ$~’4$~’3$~’$~’$~’ͺ$£ k‹ώeƒώ$~’ύ$~’ύ$~’ύZuώ6F0>-;+8?Rό"u–mlŒ–7H+9.<2A:Kg„ώ$€ύ mŒώ]y\x"t–ώ$£$~’ͺ$~’L$~’{$~’"$~’E$~’$£ l‹ώeƒώ$~’ύ$~’ύ$£ύkŠώ;M1@.;+86GkŠœfƒ΄2A-;Q!q‘ώ#zώ_{!nώ`|"u–ώ$£$~’~$~’m$~’α$~’»$~’z$~’p$£ l‹ώe‚ώ$~’ύ$~’ύ$£ύ"t–ώAU2A6F0>1@d»cΓ0?0?_{ώDXAT"u–ώ$|Ÿώ!s”ώ#zώ_|!p‘ώ#zœϋ$~£V$~’—$~’$~’$~’™$~’W$| ϋ kŠώe‚ώ$~’ύ$~’ύ$~£ύ"xšώEY5E`{ώBU/=a}Ιc€Α1?-:4D5EBU!t–ώ$£ύ$£ύ#{žώ^z\w l‹λ%€₯<$~’Α$~’$~’$~’³#{ŸEf„τ^{eƒώ$~’ύ$~’ύ$~£ύ"xšώEZ2B:K1?0>b~Θg„±3B,:.=2B>Q pώ$£ύ$~’ύ#{žώ\x\x#xšΞ$€8$~’β$~’$~’$~’Λ$€€: mŒηVpe‚ώ$~’ύ$~’ύ$£ύ!t•ώAT1A.<,92Ae‚· n8I+9.<2A:Keƒώ$€ύ$~£ύ#xšώZv nŽ$£§$~’K$~’φ$~’ώ$~’$~’ί$£8#|ŸΤa}a~$}‘ύ$~’ύ$£ύj‰ώ;M1?.<+98Hl‹–"xš^BVω+8.<1@6FSlώ$}‘ύ$~’ύ kŠώ`}#{Ÿ$~£z$~’o$~’$~’ύ$~’ώ$~’ξ$~’?$£½!s”\w"v˜ώ$~£ύ$~’ύYsώ6F0?-:+8AUϊ"v˜d&†¬)Rjΰ+9.</>3CAT p‘ώ$£ύ!oώ"s•ώ$~£ϊ$~’S$~’›$~’$~’ύ$~’ώ$~’ψ$~’O$~’€$}‘h‡ώ!q’ώ$€ύ!t•ώDX3B/>-:*7Qhγ&„ͺ-4Ίοe‚₯4C,9.<1@7HRkώ#|Ÿύ$£ύ$~’$~’η$~’8$~’Δ$~’$~’ύ$~’ύ$~’ώ$~’d$~’‡$~’$}‘ύ$~’ύ$} ύWqώ7H1@.<,92Ac€«1―ΰ"u–#yœNG\χ*8-;/>3B;M^zώ$~‘ύ$~’$~’γ$~’o$~’θ$~’$~’ύ$~’ύ$~’$~’$~’„$~’$~’ύ$~’ύc€ώPgκ,:,:.<0?4D;MRjώ pώ$}‘ώ$£ύ$£ύ$£ύ$£ύ$£ύ$£ώ$~‘!r“ώVoώ.<-:+8CVό q‘zT%ƒ©$~’$~’$~’%‚§*•Ώ lŠ“@Sώ+8,:.</>1?:LMdF[BVCWCVBVEY?Q3C1@/=.<,:+8?Rk‰—)“Ό %‚¨$~’$~’$~’$~’$~’%₯(·l‹‘DYϊ,:,9-;-;EZ\vώPgώOfώRjώCW]xώTlώ^yώ6G.<-;+9,9CWϋkŠ–(΅$€€$~’$~’$~’$~’$~’$~’$~’%¦*–Α!r“rQhθ4C+8+8SkώAT-:6Fώ=OcώQiώ^yώ9J+8+83CPgκ!q’v*”Ώ $€€$}‘$~’$~’$~’$~’$~’$~’$~’$~’%‚§$~’:d­I^τ6FOf3C*71@Yrώ3C^yώQhώWp8I3CH]υc€°$}‘=%ƒ¨$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’&…ͺ"x›+šΖ #{žGg…WqΪFZφ;L8HEY5EH^OfMdφTlΫf„Ÿ#zI+™Δ #y›%ƒ©$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’$~’%€₯"w™@ι&‡"#zR piˆ’d²fƒ²h…’ m‚"x›T'ˆ―#=ά"w™$€€$~’$~’$~’$~’$~’$~’$~’$~’(0 ;;$~’$~’$~’$~’ p#{ž%‚§i‡c\v€SkΞNeαOfαSkΟ\v₯jˆd%ƒ¨ #zkŠ$~’$~’$~’$~’$~’$~’$~’+™Δe‚%„©b~zNdΤI_ωG[1@.<EY0?4DATϊI_Υb|%ƒ¨c*–ΐ$~’$~’$~’$~’$~’)Έ '3!r’?RjΖCW8IXrώDY0?4D\vώCW7HPgH]@SQhΙ!r“B (΅$~’$~’$~’+˜Γ1@ nOLcγ6F\vώJ_ώZtώRjώAT9JSlώMcώ?Q_zώMcώ@SBUG\ε nR **”Ύ$~’!t•g„!s”=G\β6FRjώUmώJ`J`TmώYsώ^zώ_{ώZtώKbEZ;MZtώRjώDXH]δ!r“@d p#|Ÿ&…«TmΓFZMdώOfώPhώEZe‚ώ"xšώ$~’ώ$£ώ$£ώ$~’ώ#yœύg„ώNeQiώXqώ;L.<VnΕRjΣ-;Mcώ@SZtώ#{Ÿώ!r“ώ lŒώ kŠ#{žά$~’`$~’ρ$~’ρ$~’a$|Ÿάh†!r”ώ$£ύ$£ύ^zώ7GPgώ2BQiΧSkΡ-;3C6GZtώ$£ύ$£ύ mŒώ\w!o»$€s$~’ώ$~’ϋ$£kiˆΘ]y"s”ώ$£ύ$£ύ^zώ4D7H.<RiΦWqΌ/=.<3BRjώ$~‘ύ$£ύ j‰ώb#{ž•$~’•$~’$~’$£}"t•±\w!r“ώ$£ύ$~’ύVoώ2A-;.<VpΑa}3C-;1@DX"w™ώ$| ύd"s”ώ$€s$~’»$~’$~’$~’’$~’™ kŠiˆώ$~£ύ#y›ώG\0?,:3B`|• p‘P>Pτ,:0>7Hb~ώ$} ύ!r“$}‘ρ$~’_$~’ά$~’$~’$~’ͺ$£‚#z nŽώ$~’ύfƒώ8I/>+84DI_!q’ώ$£χ$£ε$~’ύ$~’ύ$~’ώ$~’π$£Τ$£ύ!s•ώLb4C/=,99Jύg…jDX$~’(΅Vo΅0?-:0>4DCWb~ώ"v˜$}‘ύ$£ύ$£ύ$~’ώ"xšdώEY4C/>-:0>UnΉ'‹³$~’#yœ o"xš/McΦ.<-:/>2A9KKaTmώZtώώUnώH]8H1A/=-:.<LbΩ"w™2 m#yœ$~’NZt!s•=MdΥ0?,9-;?RUnώKaJ_G\SkώSlώ5E-;,90?LbΨ!r“@Um9Ο$~’$~’$~’-’Π#y›.Wp²;Lϋ,:H]F[;MTmNeDXςPhΒi‡c(Ž· oŽBπ$~’$~’$~’$~’$~’$~’$~’#z$£Sk)‘Ί pHb†Zt²WpΖUnΗ\w²b‡ q‘J)ΉQh$~£#z$~’$~’$~’$~’(  ;;$~’ p!s”f„3WpŒLcΝBUιF[ιF[ΞRje‚4!r“ o$~’ pmŒ%ƒ© VowF[βLb@S3BKa9JH]H]γTmy$£ j‰ oŽ!r“%ƒ¨ Of–CWύQiPgώNeώDXSkώG\OfώG\G[ύQh˜$~’ !r’YruEYύMdMcώWpώ nŽώ"v˜"v˜ nώVoώQhώOf@TύXrwg„/H^ίH]Ka`|ώ$} ώ$£ϊ$£Ρ$£Τ$£υ$}‘ώd€ώOfώQiLbαf„1Tl…4D@RWpώ#xšώ"v—$~’λ$~’K$~’@$}‘Φ"u–#{Ÿύ]yώ>Q4DSkˆH]Ε.<6Fj‰ώ kŠώi‡$~’Σ$~’Q$~’2$} Ε l‹$} ύ mώ7H-:G\ΘBUα:KDX!q’ώ nŽώ kŠ#{ž΄$~’±$~’«#z² k‹$| ύ"v˜ώAU;MBVγCVΰ1??R"t–ώ#zžώb"s”›$~£Ϊ$£Σ nŽ’d$} ύ"v˜ώ?R2BBVβH^Α.<6Gk‰ώ"w™ώ kŠχ$}‘Ž$~’ο$~’ΰ#z•h†ώ#zώ mŒώ7G-:H]ΔUn~2Aώ0>Phώ#xš#{žζ$~£‘$~’ϋ$~’ν$£#xšψ#y›ώSkώ0>1@ώTm n)?QΪ-;6F]x#|Ÿο$€Φ$£ώ$£ω$€Ζ$} ψ_{ώ6G-;>QάlŒ+Wpj5Eϊ-;6FPhk‰!t•ώ!t•ώkŠQi6G-;5EϋWpl"x›)“ΌQiˆ5Eϊ,:9JMcώKbNeώMdώ4C-:5EϊQhŠ)Ή"xš!t•!q’*”ΎXqh>QΨAUύ9JAUMdTm:Kύ>QΩWpj)‘»!q‘!s•$~’!t•#y› nŽ&yJ`»J`ΩNeΩWqΌXqz n'"x›!t•$~’libjwt-3.3.3/include/000077500000000000000000000000001517612317300144445ustar00rootroot00000000000000libjwt-3.3.3/include/jwt.h000066400000000000000000001441061517612317300154270ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * @file jwt.h * @brief The C JSON Web Token Library +JWK + JWKS * * @include{doc} mainpage.dox */ #ifndef JWT_H #define JWT_H #include #include #include #ifdef __cplusplus extern "C" { #endif #if JWT_USES_LONG_LONG typedef long long jwt_long_t; #else typedef long jwt_long_t; #endif /* JWT_USES_LONG_LONG */ /** @ingroup jwt_object_grp * @brief Opaque JWT object * * Used in callbacks when generating or verifying a JWT */ typedef struct jwt jwt_t; /** @ingroup jwks_core_grp * @brief Opaque JWKS object * * Used for working with JSON Web Keys and JWK Sets (JWKS). * * @remark All JWK operations require that you import your JWK into a jwk_set_t * first. Internal, LibJWT creates a jwk_set_t even for single keys. This makes * code pretty much the same whether working with one JWK or a set of them. */ typedef struct jwk_set jwk_set_t; /** @ingroup jwt_alg_grp * @brief JWT algorithm types * * These are the supported algorithm types for LibJWT. * * @rfc{7518,3.1} */ typedef enum { JWT_ALG_NONE = 0, /**< No signature */ JWT_ALG_HS256, /**< HMAC using SHA-256 */ JWT_ALG_HS384, /**< HMAC using SHA-384 */ JWT_ALG_HS512, /**< HMAC using SHA-512 */ JWT_ALG_RS256, /**< RSASSA-PKCS1-v1_5 using SHA-256 */ JWT_ALG_RS384, /**< RSASSA-PKCS1-v1_5 using SHA-384 */ JWT_ALG_RS512, /**< RSASSA-PKCS1-v1_5 using SHA-512 */ JWT_ALG_ES256, /**< ECDSA using P-256 and SHA-256 */ JWT_ALG_ES384, /**< ECDSA using P-384 and SHA-384 */ JWT_ALG_ES512, /**< ECDSA using P-521 and SHA-512 */ JWT_ALG_PS256, /**< RSASSA-PSS using SHA-256 and MGF1 with SHA-256 */ JWT_ALG_PS384, /**< RSASSA-PSS using SHA-384 and MGF1 with SHA-384 */ JWT_ALG_PS512, /**< RSASSA-PSS using SHA-512 and MGF1 with SHA-512 */ JWT_ALG_ES256K, /**< ECDSA using secp256k1 and SHA-256 */ JWT_ALG_EDDSA, /**< EdDSA using Ed25519 */ JWT_ALG_INVAL, /**< An invalid algorithm from the caller or the token */ } jwt_alg_t; /** @ingroup jwt_crypto_grp * @brief Different providers for crypto operations * * Used to set or test the underlying cryptographic library provider. * * @remark These being present are not a guarantee that the JWT library * has been compiled to support it. Also, certain functions of the * library may not be supported by each. For example, not all of them * support JWKS operations. **/ typedef enum { JWT_CRYPTO_OPS_NONE = 0, /**< Used for error handling */ JWT_CRYPTO_OPS_OPENSSL, /**< OpenSSL Library */ JWT_CRYPTO_OPS_GNUTLS, /**< GnuTLS Library */ JWT_CRYPTO_OPS_MBEDTLS, /**< MBedTLS embedded library */ JWT_CRYPTO_OPS_ANY, /**< Used internally for hmac keys */ } jwt_crypto_provider_t; /** @ingroup jwks_item_grp * @brief JWK Key Types * * Corresponds to the ``"kty"`` attribute of the JWK. * * @rfc{7517,4.1} * @rfc{7518,6.1} */ typedef enum { JWK_KEY_TYPE_NONE = 0, /**< Unused on valid keys */ JWK_KEY_TYPE_EC, /**< Elliptic Curve keys */ JWK_KEY_TYPE_RSA, /**< RSA keys (RSA and RSA-PSS) */ JWK_KEY_TYPE_OKP, /**< Octet Key Pair (e.g. EdDSA) */ JWK_KEY_TYPE_OCT, /**< Octet sequence (e.g. HS256) */ } jwk_key_type_t; /** @ingroup jwks_item_grp * @brief Usage types for JWK public keys * * Corresponds to the ``"use"`` attribute in a JWK the represents a public key. * * @rfc{7517,4.2} **/ typedef enum { JWK_PUB_KEY_USE_NONE = 0, /**< No usable attribute was set */ JWK_PUB_KEY_USE_SIG, /**< Signature key (JWS) */ JWK_PUB_KEY_USE_ENC, /**< Encryption key (JWE) */ } jwk_pub_key_use_t; /** @ingroup jwks_item_grp * @brief Allowed key operations for JWK private keys * * Corresponds to the ``"key_ops"`` attribute in a JWK that represents a private * key. These can be bitwise compares to the key_ops attribute of a jwk_item_t. * These flags are used internally to decide if a JWK can be used * for certain operations. * * @code * if (jwk_item_t.key_ops & (JWK_KEY_OP_SIGN | JWK_KEY_OP_ENCRYPT)) { * ... * } * @endcode * * @rfc{7517,4.3} **/ typedef enum { JWK_KEY_OP_NONE = 0x0000, /**< No key_op set */ JWK_KEY_OP_SIGN = 0x0001, /**< Signing */ JWK_KEY_OP_VERIFY = 0x0002, /**< Signature verification */ JWK_KEY_OP_ENCRYPT = 0x0004, /**< Used for encryption */ JWK_KEY_OP_DECRYPT = 0x0008, /**< Used for decrypting */ JWK_KEY_OP_WRAP = 0x0010, /**< For wrapping other keys */ JWK_KEY_OP_UNWRAP = 0x0020, /**< For unwrappng other keys */ JWK_KEY_OP_DERIVE_KEY = 0x0040, /**< Key derivation */ JWK_KEY_OP_DERIVE_BITS = 0x0080, /**< Bits derivation */ JWK_KEY_OP_INVALID = 0xffff, /**< Invalid key_ops in JWK */ } jwk_key_op_t; /** @ingroup jwt_claims_helpers_grp * @brief Value types for claims and headers */ typedef enum { JWT_VALUE_NONE = 0, /**< No type (do not use this) */ JWT_VALUE_INT, /**< Integer */ JWT_VALUE_STR, /**< String */ JWT_VALUE_BOOL, /**< Boolean */ JWT_VALUE_JSON, /**< JSON String (``{..}`` or ``[..]``) */ JWT_VALUE_INVALID, /**< Invalid (used internally) */ } jwt_value_type_t; /** @ingroup jwt_claims_helpers_grp * @brief Error values for header and claim requests */ typedef enum { JWT_VALUE_ERR_NONE = 0, /**< No error, success */ JWT_VALUE_ERR_EXIST, /**< Item exists (when setting) */ JWT_VALUE_ERR_NOEXIST, /**< Item doesn't exist (when getting) */ JWT_VALUE_ERR_TYPE, /**< Item is not of the type requested */ JWT_VALUE_ERR_INVALID, /**< Invalid request (general error) */ JWT_VALUE_ERR_NOMEM, /**< Memory allocation error */ } jwt_value_error_t; /** @ingroup jwt_claims_helpers_grp * @brief Data type for get and set actions for JWT headers and claims * * This is used for both set and get requests. Specific rules for each type is * described in more detail for the set and get requests. * * @note There are helper macros to simplify setting this structure properly and * reducing common mistakes. See the jwt_set_{SET,GET}_{INT,STR,BOOL,JSON} * definitions. */ typedef struct { jwt_value_type_t type; const char *name; union { jwt_long_t int_val; const char *str_val; int bool_val; char *json_val; }; int replace; int pretty; jwt_value_error_t error; } jwt_value_t; /** @ingroup jwks_item_grp * @brief Object representation of a JWK * * This object is produced by importing a JWK or JWKS into a @ref jwk_set_t * object. It represents single key and is used when generating or verifying * JWT. */ typedef struct jwk_item jwk_item_t; /** @ingroup jwt_memory_grp * @brief Prototype for malloc(3) */ typedef void *(*jwt_malloc_t)(size_t); /** @ingroup jwt_memory_grp * @brief Prototype for free(3) */ typedef void (*jwt_free_t)(void *); /** @ingroup jwt_alg_grp * Get the jwt_alg_t set for this JWT object. * * Returns the jwt_alg_t type for this JWT object. * * @param jwt Pointer to a JWT object. * @returns Returns a jwt_alg_t type for this object. */ JWT_EXPORT jwt_alg_t jwt_get_alg(const jwt_t *jwt); /** @ingroup jwt_object_grp * @brief Structure used to pass state with a user callback */ typedef struct { const jwk_item_t *key; /**< A JWK to use for key */ jwt_alg_t alg; /**< For algorithm matching */ void *ctx; /**< User controlled context */ } jwt_config_t; /** @ingroup jwt_object_grp * @brief General callback for generation and verification of JWT */ typedef int (*jwt_callback_t)(jwt_t *, jwt_config_t *); /** @ingroup jwt_claims_helpers_grp * @brief WFC defined claims */ typedef enum { JWT_CLAIM_ISS = 0x0001, /**< @rfc_t{7519,4.1.1} ``"iss"`` */ JWT_CLAIM_SUB = 0x0002, /**< @rfc_t{7519,4.1.2} ``"sub"`` */ JWT_CLAIM_AUD = 0x0004, /**< @rfc_t{7519,4.1.3} ``"aud"`` */ JWT_CLAIM_EXP = 0x0008, /**< @rfc_t{7519,4.1.4} ``"exp"`` */ JWT_CLAIM_NBF = 0x0010, /**< @rfc_t{7519,4.1.5} ``"nbf"`` */ JWT_CLAIM_IAT = 0x0020, /**< @rfc_t{7519,4.1.6} ``"iat"`` */ JWT_CLAIM_JTI = 0x0040, /**< @rfc_t{7519,4.1.7} ``"jti"`` */ } jwt_claims_t; /** * @defgroup jwt_grp JSON Web Token * @{ */ /** * @defgroup jwt_builder_grp Builder * * Creating a JWT token involves several steps. First is creating a * jwt_builder_t object, which can be thought of as a JWT factory. Once * configured, you can use it to create tokens with pre-defined claims. * @{ */ /** * @brief Opaque Builder Object */ typedef struct jwt_builder jwt_builder_t; /** * @brief Function to create a new builder instance * * @return Pointer to a builder object on success, NULL on failure */ JWT_EXPORT jwt_builder_t *jwt_builder_new(void); /** * @brief Frees a previously created builder object * * @param builder Pointer to a builder object */ JWT_EXPORT void jwt_builder_free(jwt_builder_t *builder); #if defined(__GNUC__) || defined(__clang__) /** * @brief Helper function to free a builder and set the pointer to NULL * * This is mainly to use with the jwt_builder_auto_t type. * * @param Pointer to a pointer for a jwt_builder_t object */ static inline void jwt_builder_freep(jwt_builder_t **builder) { if (builder) { jwt_builder_free(*builder); *builder = NULL; } } #define jwt_builder_auto_t jwt_builder_t \ __attribute__((cleanup(jwt_builder_freep))) #endif /** * @brief Checks error state of builder object * * @param builder Pointer to a builder object * @return 0 if no errors exist, non-zero otherwise */ JWT_EXPORT int jwt_builder_error(const jwt_builder_t *builder); /** * @brief Get the error message contained in a builder object * * @param builder Pointer to a builder object * @return Pointer to a string with the error message. Can be an empty string * if there is no error. Never returns NULL. */ JWT_EXPORT const char *jwt_builder_error_msg(const jwt_builder_t *builder); /** * @brief Clear error state in a builder object * * @param builder Pointer to a builder object */ JWT_EXPORT void jwt_builder_error_clear(jwt_builder_t *builder); /** * @brief Sets a key and algorithm for a builder * * The values here must make sense. This table shows what will or won't pass as * far as algorithm matching between the alg param and the alg in jwk_item_t. * Where ``alg-A`` means one specific algorithm (not none) and ``alg-B`` * represents another (also not none). The ``none`` is used to represent no * algorithm being set. ``NULL`` represents that jwk_item_t pointer is NULL. * * alg | jwt_item_t | Result * :-------: | :--------: | :-----------------------: * ``alg-A`` | ``alg-A`` | \emoji :white_check_mark: * ``none`` | ``alg-A`` | \emoji :white_check_mark: * ``alg-A`` | ``none`` | \emoji :white_check_mark: * ``none`` | ``NULL`` | \emoji :warning: * ``alg-A`` | ``alg-B`` | \emoji :x: * ``alg-A`` | ``NULL`` | \emoji :x: * * @warning The warning represents an insecure token. Using insecure tokens is * not very useful and strongly discouraged. * * @param builder Pointer to a builder object * @param alg A valid jwt_alg_t type * @param key A JWK key object * @return 0 on success, non-zero otherwise with error set in the builder */ JWT_EXPORT int jwt_builder_setkey(jwt_builder_t *builder, const jwt_alg_t alg, const jwk_item_t *key); /** * @brief Set IssuedAt usage on builder * * By default, the builder will set the ``iat`` claim to all tokens. You can * enable or disable this using this function. * * @param builder Pointer to a builder object * @param enable 0 to disable, any other value to enable * @return Previous value (0 or 1), or -1 on error */ JWT_EXPORT int jwt_builder_enable_iat(jwt_builder_t *builder, int enable); /** * @brief Set a callback for generating tokens * * When generating a token, this callback will be run after jwt_t has been * created, but before the token is encoded. During this, the callback can set, * change, or remove claims and header attributes. It can also use the * jwt_value_t structure to set a key and alg to use when signing the token. * * The ctx value is also passed to the callback as part of the jwt_value_t * struct. * * @note Calling this with a NULL cb param and a new ctx param after already * setting the callback will allow updating the ctx passed to the callback. * Calling with both values as NULL will disable the callback completely. * * @param builder Pointer to a builder object * @param cb Pointer to a callback function * @param ctx Pointer to data to pass to the callback function * @return 0 on success, non-zero otherwise with error set in the builder */ JWT_EXPORT int jwt_builder_setcb(jwt_builder_t *builder, jwt_callback_t cb, void *ctx); /** * @brief Retrieve the callback context that was previously set * * This is useful for accessing the context that was previously passed in the * setcb function. * * @param builder Pointer to a builder object * @return Pointer to the context or NULL */ JWT_EXPORT void *jwt_builder_getctx(jwt_builder_t *builder); /** * @brief Generate a token * * The result of this function is to generate a string containing a JWT. A * token is represetned by 3 parts: ``header``.``payload``.``sig``. Each part is * Base64url Encoded. An example would be: * * @code * eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3MzY0MzI0MzR9.iDn6N9JsAdUPF11ow0skIfc9eJc2wGRIq30RSRZ8_68 * @endcode * * When decoded, the header and payload would look like this (excluding the * signature block):: * * @code * {"alg":"HS256","typ":"JWT"}.{"iat":1736432434} * @endcode * * If pretty printed: * * @code * { * "alg": "HS256", * "typ": "JWT" * } * . * { * "iat": 1736432434 * } * @endcode * * The signature block is a cryptographic hash. Its length and format is * dependent on the algorithm being used. * * A simple usage with no signature or payload would be: * * @code * jwt_builder_t *builder = NULL; * * builder = jwt_builder_new(); * * if (builder) { * char *out = jwt_builder_generate(builder); * * if (out) { * printf("%s\n", out); * free(out); * } * } * * jwt_builder_free(builder); * @endcode * * @note If you set a callback for this builder, this is when it will be called. * * @param builder Pointer to a builder object * @return A string containing a JWT. Caller is respondible for freeing the * memory for this string. On error, NULL is returned and error is set in * the builder object. */ JWT_EXPORT char *jwt_builder_generate(jwt_builder_t *builder); /** * @} * @noop jwt_builder_grp */ /** * @defgroup jwt_checker_grp Checker * * Validating a JWT involves decoding the Base64url parts of the JWT then * verifying claims and the signature hash. The checker object allows you to * configure how you want to perform these steps so you can easily process * tokens with one simple call. * @{ */ /** * @brief Opaque Checker object */ typedef struct jwt_checker jwt_checker_t; /** * @brief Function to create a new checker instance * * @return Pointer to a checker object on success, NULL on failure */ JWT_EXPORT jwt_checker_t *jwt_checker_new(void); /** * @brief Frees a previously created checker object * * @param checker Pointer to a checker object */ JWT_EXPORT void jwt_checker_free(jwt_checker_t *checker); #if defined(__GNUC__) || defined(__clang__) /** * @brief Helper function to free a checker and set the pointer to NULL * * This is mainly to use with the jwt checker_auto_t type. Example usage: * * @code * int run_check (const char *token) * { * jwt_checker_auto_t *checker = NULL; // This is important to set to NULL * * checker = jwt_checker_new(); * // Do some things * * return 0; // checker is freed here * } * @endcode * * @param Pointer to a pointer for a jwt checker_t object */ static inline void jwt_checker_freep(jwt_checker_t **checker) { if (checker) { jwt_checker_free(*checker); *checker = NULL; } } #define jwt_checker_auto_t jwt_checker_t \ __attribute__((cleanup(jwt_checker_freep))) #endif /** * @brief Checks error state of checker object * * @param checker Pointer to a checker object * @return 0 if no errors exist, non-zero otherwise */ JWT_EXPORT int jwt_checker_error(const jwt_checker_t *checker); /** * @brief Get the error message contained in a checker object * * @param checker Pointer to a checker object * @return Pointer to a string with the error message. Can be an empty string * if there is no error. Never returns NULL. */ JWT_EXPORT const char *jwt_checker_error_msg(const jwt_checker_t *checker); /** * @brief Clear error state in a checker object * * @param checker Pointer to a checker object */ JWT_EXPORT void jwt_checker_error_clear(jwt_checker_t *checker); /** * @brief Sets a key and algorithm for a checker * * See @ref jwt_builder_setkey for detailed information. * * @param checker Pointer to a checker object * @param alg A valid jwt_alg_t type * @param key A JWK key object * @return 0 on success, non-zero otherwise with error set in the checker */ JWT_EXPORT int jwt_checker_setkey(jwt_checker_t *checker, const jwt_alg_t alg, const jwk_item_t *key); /** * @brief Set a callback for generating tokens * * When verifying a token, this callback will be run after jwt_t has been * parsed, but before the token is verified (including signature * verification). During this, the callback should only inspect the header or * claims in the JWT. Any attempts to make changes to the jwt_t object will not * change the rest of the process. * * The callback can also set the key and algorithm used to verify the signature. * If the callback returns non-zero, then processing will stop and return an * error. * * The ctx value is also passed to the callback as part of the jwt_value_t * struct. * * @note Calling this with a NULL cb param and a new ctx param after already * setting the callback will allow updating the ctx passed to the callback. * Calling with both values as NULL will disable the callback completely. * * @param checker Pointer to a checker object * @param cb Pointer to a callback function * @param ctx Pointer to data to pass to the callback function * @return 0 on success, non-zero otherwise with error set in the checker */ JWT_EXPORT int jwt_checker_setcb(jwt_checker_t *checker, jwt_callback_t cb, void *ctx); /** * @brief Retrieve the callback context that was previously set * * This is useful for accessing the context that was previously passed in the * setcb function. * * @param checker Pointer to a checker object * @return Pointer to the context or NULL */ JWT_EXPORT void *jwt_checker_getctx(jwt_checker_t *checker); /** * @brief Verify a token * * @note If you set a callback for this checker, this is when it will be called. * * @param checker Pointer to a checker object * @param token A string containing a token to be verified * @return 0 on success, non-zero otherwise with error set in the checker */ JWT_EXPORT int jwt_checker_verify(jwt_checker_t *checker, const char *token); /** * @} * @noop jwt_checker_grp */ /** * @defgroup jwt_claims_grp Claims and Headers * * Working with claims and header elements across checker and builder * objects is similar, but the usage for it is not. * * @{ */ /** * @defgroup jwt_claims_helpers_grp Utility Functions * @{ */ /** * @defgroup jwt_helpers_get_grp Getters * * When getting a value, you must set type and name. On a successful return, the * the value specific to the type will be filled in. Common error responses for * this function are JWT_VALUE_ERR_NOEXIST when the name does not exist, and * JWT_VALUE_ERR_TYPE, when the named object is not of the type you requested * (e.g. you requested a string, but it's an integer value). * * @remarks When getting a JSON value, you can set value.name = NULL, in which * case the entire header is returned. Also, the resulting value.json_val * will be using allocated memory and must be freed by the caller. * * @note Normally JSON is retrieved in compact form. If you set * jwt_value_t.pretty, then you will get a tabbed format suitable for human * viewing. This must be set after calling jwt_set_GET_JSON(). * * @code * jwt_value_error_t ret; * jwt_value_t jval; * * jwt_set_GET_INT(&jval, "h1"); * ret = jwt_builder_claim_get(builder, &jval); * if (ret == JWT_VALUE_ERR_NONE) * printf("h1 = %d\n", jval.int_val); * @endcode * * @{ */ /** * @brief Setup a jwt_value_t to get an integer value * * @param __v Pointer to a jwt_value_t object * @param __n Name of the value * @return No return value */ #define jwt_set_GET_INT(__v, __n) ({ \ (__v)->type=JWT_VALUE_INT; \ (__v)->name=(__n);(__v)->int_val=0;(__v)->error=0;\ (__v);}) /** * @brief Setup a jwt_value_t to get a string value * * @param __v Pointer to a jwt_value_t object * @param __n Name of the value * @return No return value */ #define jwt_set_GET_STR(__v, __n) ({ \ (__v)->type=JWT_VALUE_STR; \ (__v)->name=(__n);(__v)->str_val=NULL;(__v)->error=0;\ (__v);}) /** * @brief Setup a jwt_value_t to get a boolean value * * @param __v Pointer to a jwt_value_t object * @param __n Name of the value * @return No return value */ #define jwt_set_GET_BOOL(__v, __n) ({ \ (__v)->type=JWT_VALUE_BOOL; \ (__v)->name=(__n);(__v)->bool_val=0;(__v)->error=0;\ (__v);}) /** * @brief Setup a jwt_value_t to get a JSON string * * @param __v Pointer to a jwt_value_t object * @param __n Name of the value * @return No return value */ #define jwt_set_GET_JSON(__v, __n) ({ \ (__v)->type=JWT_VALUE_JSON;(__v)->pretty=0; \ (__v)->name=(__n);(__v)->json_val=NULL;(__v)->error=0;\ (__v);}) /** * @} * @noop jwt_helpers_get_grp */ /** * @defgroup jwt_helpers_set_grp Setters * * When setting a value, you must set the type, name, and the specific val for * the type. If the value already exists, then the function will return * JWT_VALUE_ERR_EXISTS and value.error will be set the same. If value.replace * is non-zero, then any existing value will be overwritten. * * @remarks When setting a JSON value, you can set value.name = NULL, in which case * the entire header will be set to the JSON string pointed to by * value.json_val. If value.replace is not set, only values that do not already * exist will be set. If replace is set, then existing values will also be * updated. There is no indication of which values are or aren't updated in * either case. * * @note The replace flag must be set after calling jwt_set_SET_*() macro, as * the macros will reset it back to 0. * * @code * jwt_value_error_t ret; * jwt_value_t jval; * * jwt_set_SET_STR(&jval, "iss", "foo.example.com"); * ret = jwt_builder_header_set(jwt, &jval); * * if (ret == JWT_VALUE_ERR_NONE) * printf("iss updated to: %s\n", jval.str_val); * @endcode * * @{ */ /** * @brief Setup a jwt_value_t to set an integer value * * @param __v Pointer to a jwt_value_t object * @param __n Name of the value * @param __x Value to set * @return No return value */ #define jwt_set_SET_INT(__v, __n, __x) ({ \ (__v)->type=JWT_VALUE_INT;(__v)->replace=0; \ (__v)->name=(__n);(__v)->int_val=(__x);(__v)->error=0;\ (__v);}) /** * @brief Setup a jwt_value_t to set a string value * * @param __v Pointer to a jwt_value_t object * @param __n Name of the value * @param __x Value to set * @return No return value */ #define jwt_set_SET_STR(__v, __n, __x) ({ \ (__v)->type=JWT_VALUE_STR;(__v)->replace=0; \ (__v)->name=(__n);(__v)->str_val=(__x);(__v)->error=0;\ (__v);}) /** * @brief Setup a jwt_value_t to set a boolean value * * @param __v Pointer to a jwt_value_t object * @param __n Name of the value * @param __x Value to set * @return No return value */ #define jwt_set_SET_BOOL(__v, __n, __x) ({ \ (__v)->type=JWT_VALUE_BOOL;(__v)->replace=0; \ (__v)->name=(__n);(__v)->bool_val=(__x);(__v)->error=0;\ (__v);}) /** * @brief Setup a jwt_value_t to set a JSON string * * @param __v Pointer to a jwt_value_t object * @param __n Name of the value * @param __x Value to set * @return No return value */ #define jwt_set_SET_JSON(__v, __n, __x) ({ \ (__v)->type=JWT_VALUE_JSON;(__v)->replace=0; \ (__v)->name=(__n);(__v)->json_val=(__x);(__v)->error=0; \ (__v);}) /** * @} * @noop jwt_helpers_set_grp */ /** * @} * @noop jwt_claims_helpers_grp */ /** * @defgroup jwt_claims_builder_grp Builder Functions * * For the builder function, you can create a set of values in the header and * payload that will be copied verbatim to any token generated from it. The * special claims, ``nbf`` and ``exp``, can be handled more dynamically by * LibJWT, if they are enabled (see jwt_builder_time_offset). * * For any claims that you want to handle on a per token basis (e.g. you may * want a different ``sub`` depending on the user context), this can be done in * a callback on the jwt_t object. * * These functions rely on the @ref jwt_helpers_set_grp macros to better handle * the data being passed to them. * * @{ */ /** * @brief Set a header in a builder object * * @param builder Pointer to a builder object * @param value Pointer to a jwt_value_t object representing the value to set * @return JWT_VALUE_ERR_NONE on success, one of the jwt_value_error_t return * on error. */ JWT_EXPORT jwt_value_error_t jwt_builder_header_set(jwt_builder_t *builder, jwt_value_t *value); /** * @brief Get a header from a builder object * * @param builder Pointer to a builder object * @param value Pointer to a jwt_value_t object representing the value to get * @return JWT_VALUE_ERR_NONE on success, one of the jwt_value_error_t return * on error. Also, the relevant value.*_val will be set on success. */ JWT_EXPORT jwt_value_error_t jwt_builder_header_get(jwt_builder_t *builder, jwt_value_t *value); /** * @brief Delete a header from a builder object * * @param builder Pointer to a builder object * @param header Name of the header delete * @return JWT_VALUE_ERR_NONE on success, one of the jwt_value_error_t return * on error. */ JWT_EXPORT jwt_value_error_t jwt_builder_header_del(jwt_builder_t *builder, const char *header); /** * @brief Set a claim in a builder object * * @param builder Pointer to a builder object * @param value Pointer to a jwt_value_t object representing the value to set * @return JWT_VALUE_ERR_NONE on success, one of the jwt_value_error_t return * on error. */ JWT_EXPORT jwt_value_error_t jwt_builder_claim_set(jwt_builder_t *builder, jwt_value_t *value); /** * @brief Get a claim from a builder object * * @param builder Pointer to a builder object * @param value Pointer to a jwt_value_t object representing the value to get * @return JWT_VALUE_ERR_NONE on success, one of the jwt_value_error_t return * on error. Also, the relevant value.*_val will be set on success. */ JWT_EXPORT jwt_value_error_t jwt_builder_claim_get(jwt_builder_t *builder, jwt_value_t *value); /** * @brief Delete a header from a builder object * * @param builder Pointer to a builder object * @param claim Name of the claim delete * @return JWT_VALUE_ERR_NONE on success, one of the jwt_value_error_t return * on error. */ JWT_EXPORT jwt_value_error_t jwt_builder_claim_del(jwt_builder_t *builder, const char *claim); /** * @brief Disable, or enable and set the ``nbf`` or ``exp`` time offsets * * The time offset is in seconds and will be added to ``now`` when a token is * created. Negative values are not allowed. Setting the secs to 0 or less will * disable adding the specified claim to the token. * * @param builder Pointer to a builder object * @param claim One of JWT_CLAIM_NBF or JWT_CLAIM_EXP * @param secs Seconds of offset to add to ``now`` when generating the * specified claim * @return 0 on success, any other value for an error */ JWT_EXPORT int jwt_builder_time_offset(jwt_builder_t *builder, jwt_claims_t claim, time_t secs); /** * @} * @noop jwt_claims_builder_grp */ /** * @defgroup jwt_claims_checker_grp Checker Functions * * For a checker object, claims will be used to verify the token. This * verification is very simplistic and only supports standards-defined * claims like ``nbf``, ``iss``, etc. Even for some of these, LibJWT can * only perform simple time or string comparison. For example, if you wanted * to accept tokens from multiple issuers, you would need to handle that * yourself, most likely in a callback. * * This is a list of the claims that LibJWT can check on its own, and the * method that is used to decide success: * * Claim | Type | Comparison for Validation * ------- | --------- | ----------------------------- * ``exp`` | Timestamp | ``exp`` > (now + leeway) * ``nbf`` | Timestamp | ``nbf`` <= (now - leeway) * ``iss`` | String | !strcmp(``iss``, ``userval``) * ``aud`` | String | !strcmp(``aud``, ``userval``) * ``sub`` | String | !strcmp(``sub``, ``userval``) * * @note The checker object does not evaluate any values in the header with * the exception of the ``alg`` element when validating a token. Anything you * need to do there can be done in a callback with the jwt_t. * * @{ */ /** * @brief Get the value of a validation claim * * @param checker Pointer to a checker object * @param type One of JWT_CLAIM_ISS, JWT_CLAIM_AUD, or JWT_CLAIM_SUB * @return A string representation of the claim, or NULL if it isn't set */ JWT_EXPORT const char *jwt_checker_claim_get(jwt_checker_t *checker, jwt_claims_t type); /** * @brief Set the value of a validation claim * * @param checker Pointer to a checker object * @param type One of JWT_CLAIM_ISS, JWT_CLAIM_AUD, or JWT_CLAIM_SUB * @param value A string to set as the new value of the validation * @return 0 on success, any other value is an error */ JWT_EXPORT int jwt_checker_claim_set(jwt_checker_t *checker, jwt_claims_t type, const char *value); /** * @brief Delete the value of a validation claim * * @param checker Pointer to a checker object * @param type One of JWT_CLAIM_ISS, JWT_CLAIM_AUD, or JWT_CLAIM_SUB * @return 0 on success, any other value is an error */ JWT_EXPORT int jwt_checker_claim_del(jwt_checker_t *checker, jwt_claims_t type); /** * @brief Setup the exp or nbf claim leeway values * * This allows you to set a leeway for exp and nbf claims to account for any * skew. The value is in seconds. * * To disable either one, set the secs to -1. * * @param checker Pointer to a checker object * @param claim One of JWT_CLAIM_NBF or JWT_CLAIM_EXP * @param secs The number of seconds of leeway to account for being valid * @return 0 on success, any other value is an error */ JWT_EXPORT int jwt_checker_time_leeway(jwt_checker_t *checker, jwt_claims_t claim, time_t secs); /** * @} * @noop jwt_claims_checker_grp */ /** * @defgroup jwt_object_grp JWT Functions * * For most usage, setting values in the builder object is enough to provide * all the information you would like set in a JWT token. However, if some * information is dynamic, meaning it is only known at the time the token is * created, then you can provide this during the builder callback on the jwt_t * object. * * When verifying a token, the checker callback should not modify the jwt_t * object at all. Access to the jwt_t is provided only to allow additional * validation beyond LibJWT's internal checks. * @{ */ /** * @brief Set a value in the header of a JWT * * @param jwt Pointer to a jwt_t token, previously created with jwt_create() * @param value A jwt_value_t structure with relevant actions filled in * @return A jwt_value_error_t value, JWT_VALUE_ERR_NONE being success. The * value.error field will match this return value. */ JWT_EXPORT jwt_value_error_t jwt_header_set(jwt_t *jwt, jwt_value_t *value); /** * @brief Get a value from the header of a JWT * * @param jwt Pointer to a jwt_t token, previously created with jwt_create() * @param value A jwt_value_t structure with relevant actions filled in * @return A jwt_value_error_t value, JWT_VALUE_ERR_NONE being success. The * value.error field will match this return value. */ JWT_EXPORT jwt_value_error_t jwt_header_get(jwt_t *jwt, jwt_value_t *value); /** * @brief Delete a value from the header of a JWT * * @param jwt Pointer to a jwt_t token, previously created with jwt_create() * @param header The name of the header to delete, or NULL to clear the entire * header * @return A jwt_value_error_t value, JWT_VALUE_ERR_NONE being success. */ JWT_EXPORT jwt_value_error_t jwt_header_del(jwt_t *jwt, const char *header); /** * @brief Set a value in the claims of a JWT * * @param jwt Pointer to a jwt_t token, previously created with jwt_create() * @param value A jwt_value_t structure with relevant actions filled in * @return A jwt_value_error_t value, JWT_VALUE_ERR_NONE being success. The * value.error field will match this return value. */ JWT_EXPORT jwt_value_error_t jwt_claim_set(jwt_t *jwt, jwt_value_t *value); /** * @brief Get a value from the claims of a JWT * * @param jwt Pointer to a jwt_t token, previously created with jwt_create() * @param value A jwt_value_t structure with relevant actions filled in * @return A jwt_value_error_t value, JWT_VALUE_ERR_NONE being success. The * value.error field will match this return value. */ JWT_EXPORT jwt_value_error_t jwt_claim_get(jwt_t *jwt, jwt_value_t *value); /** * @brief Delete a value from the claims of a JWT * * @param jwt Pointer to a jwt_t token, previously created with jwt_create() * @param claim The name of the claim to delete, or NULL to clear all claims * @return A jwt_value_error_t value, JWT_VALUE_ERR_NONE being success. */ JWT_EXPORT jwt_value_error_t jwt_claim_del(jwt_t *jwt, const char *claim); /** * @} * @noop jwt_object_grp */ /** * @} * @noop jwt_claims_grp */ /** * @defgroup jwt_alg_grp Algorithms * * Utility functions to convert between string and type for ``alg`` * @{ */ /** * Convert alg type to it's string representation. * * Returns a string that matches the alg type provided. * * @param alg A valid jwt_alg_t specifier. * @returns Returns a string (e.g. "RS256") matching the alg or NULL for * invalid alg. */ JWT_EXPORT const char *jwt_alg_str(jwt_alg_t alg); /** * Convert alg string to type. * * Returns an alg type based on the string representation. * * @rfc{7518,3.1} * * @param alg A valid string for algorithm type (e.g. "RS256"). * @returns Returns a @ref jwt_alg_t matching the string * or @ref JWT_ALG_INVAL if no matches were found. * * @note This only works for algorithms that LibJWT supports or knows about. */ JWT_EXPORT jwt_alg_t jwt_str_alg(const char *alg); /** * @} * @noop jwt_alg_grp */ /** * @} * @noop jwt_grp */ /** * @defgroup jwks_grp JSON Web Keys * @{ */ /** * @defgroup jwks_core_grp JWK Management * * Functions to handle JSON that represents JWK and JWKS for use in validating * or signing JWT objects. * * @note The jwks_create functions are convenience wrappers around the same-named * jwks_load functions. They explicitly create a keyring. * * @note If you want to create an empty keyring, simply call jwks_create(NULL) * * @{ */ /** * @brief Create or add to a keyring from a null terminated string * * This function, and the utility versions, allow you to create a keyring * used to verify and/or create JSON Web Tokens. It accepts either single * JWK or a JWKS (JSON Web Token Set). * * If you want to create a new set, then pass NULL as the first argument. If * you want to add to an existing keyring, then pass that as the first * argument. * * If non-NULL is returned, you should then check to make sure there * is no error with jwks_error(). There may be errors on individual * JWK items in the set. You can check if there are any with * jwks_error_any(). * * @param jwk_set Either NULL to create a new set, or an existing jwt_set * to add new keys to it. * @param jwk_json_str JSON string representation of a single key * or array of "keys". * @return A valid jwt_set_t on success. On failure, either NULL * or a jwt_set_t with error set. NULL generally means ENOMEM. */ JWT_EXPORT jwk_set_t *jwks_load(jwk_set_t *jwk_set, const char *jwk_json_str); /** * @brief Create or add to a keyring from a string of known length * * Useful if the string is not null terminated. Otherwise, it works the same * as jwks_load(). * * @param jwk_set Either NULL to create a new set, or an existing jwt_set * to add new keys to it. * @param jwk_json_str JSON string representation of a single key * or array of "keys". * @param len The length of jwk_json_str that represents the key(s) being * read. * @return A valid jwt_set_t on success. On failure, either NULL * or a jwt_set_t with error set. NULL generally means ENOMEM. */ JWT_EXPORT jwk_set_t *jwks_load_strn(jwk_set_t *jwk_set, const char *jwk_json_str, const size_t len); /** * @brief Create or add to a keyring from a file * * The JSON will be read from a file on the system. Must be readable by the * running process. The end result of this function is the same as jwks_load. * * @param jwk_set Either NULL to create a new set, or an existing jwt_set * to add new keys to it. * @param file_name A file containing a JSON representation of a single key * or array of "keys". * @return A valid jwt_set_t on success. On failure, either NULL * or a jwt_set_t with error set. NULL generally means ENOMEM. */ JWT_EXPORT jwk_set_t *jwks_load_fromfile(jwk_set_t *jwk_set, const char *file_name); /** * @brief Create or add to a keyring from a FILE pointer * * The JSON will be read from a FILE pointer. The end result of this function * is the same as jwks_load. The FILE pointer must be set to the starting * position of the JWK data. This function will read until it reaches EOF or * invalid JSON data. * * @param jwk_set Either NULL to create a new set, or an existing jwt_set * to add new keys to it. * @param input A FILE pointer where the JSON representation of a single key * or array of "keys" can be fread() from. * @return A valid jwt_set_t on success. On failure, either NULL * or a jwt_set_t with error set. NULL generally means ENOMEM. */ JWT_EXPORT jwk_set_t *jwks_load_fromfp(jwk_set_t *jwk_set, FILE *input); /** * @brief Create or add to a keyring from a URL * * The JSON will be retrieved from a URL. This can be any URL understood by * by Libcurl. * * Example: https://example.com/.well-known/jwks.json * * @warning You should not have private keys available on public web sites. * * @param jwk_set Either NULL to create a new set, or an existing jwt_set * to add new keys to it. * @param url A string URL to where the JSON representation of a single key * or array of "keys" can be retrieved from. Generally a json file. * @param verify Set to 1 to verify the Host, 2 to verify Host and Peer. * 2 is recommended unless you really need to disable with 0. * @return A valid jwt_set_t on success. On failure, either NULL * or a jwt_set_t with error set. NULL generally means ENOMEM. */ JWT_EXPORT jwk_set_t *jwks_load_fromurl(jwk_set_t *jwk_set, const char *url, int verify); /** * @brief Wrapper around jwks_load() that explicitly creates a new keyring */ JWT_EXPORT jwk_set_t *jwks_create(const char *jwk_json_str); /** * @brief Wrapper around jwks_load_strn() that explicitly creates a new keyring */ JWT_EXPORT jwk_set_t *jwks_create_strn(const char *jwk_json_str, const size_t len); /** * @brief Wrapper around jwks_load_fromfile() that explicitly creates a new * keyring */ JWT_EXPORT jwk_set_t *jwks_create_fromfile(const char *file_name); /** * @brief Wrapper around jwks_load_fromfp() that explicitly creates a new * keyring */ JWT_EXPORT jwk_set_t *jwks_create_fromfp(FILE *input); /** * @brief Wrapper around jwks_load_fromurl() that explicitly creates a new * keyring */ JWT_EXPORT jwk_set_t *jwks_create_fromurl(const char *url, int verify); /** * @brief Check if there is an error with a jwk_set * * An Error in a jwk_set is usually passive and generally means there was an * issue loading the JWK(S) data. * * To get a string describing the error, use jwks_error_msg(). You can clear * the error with jwks_error_clear(). * * @param jwk_set An existing jwk_set_t * @return 0 if no error exists, 1 if it does exists. */ JWT_EXPORT int jwks_error(const jwk_set_t *jwk_set); /** * @brief Check if there is an error within the jwk_set and any of * the jwk_item_t in the set. * * @param jwk_set An existing jwk_set_t * @return 0 if no error exists, or the number of errors in the set */ JWT_EXPORT int jwks_error_any(const jwk_set_t *jwk_set); /** * @brief Retrieve an error message from a jwk_set * * @note A zero length string is valid even if jwks_error() returns non-zero. * * @param jwk_set An existing jwk_set_t * @return A string message. The string may be empty. */ JWT_EXPORT const char *jwks_error_msg(const jwk_set_t *jwk_set); /** * @brief Clear an error condition in a jwk_set * * @param jwk_set An existing jwk_set_t */ JWT_EXPORT void jwks_error_clear(jwk_set_t *jwk_set); /** * Free all memory associated with a jwt_set_t, including any jwk_item_t in * the set. * * @param jwk_set An existing jwk_set_t */ JWT_EXPORT void jwks_free(jwk_set_t *jwk_set); #if defined(__GNUC__) || defined(__clang__) /** * @brief Helper function to free a JWK Set and set the pointer to NULL * * This is mainly to use with the jwt_set_auto_t type. * * @param Pointer to a pointer for a jwt_set_t object */ static inline void jwks_freep(jwk_set_t **jwks) { if (jwks) { jwks_free(*jwks); *jwks = NULL; } } #define jwk_set_auto_t jwk_set_t __attribute__((cleanup(jwks_freep))) #endif /** * @} * @noop jwks_core_grp */ /** * @defgroup jwks_item_grp JSON Web Key Usage * * Functionality for using a JWK (represented as a jwk_item_t) to sign and * validate JWT objects. * * @{ */ /** * @brief Return the index'th jwk_item in the jwk_set * * Allows you to obtain the raw jwk_item. NOTE, this is not a copy of the item, * which means if the jwk_set is freed, then this data is freed and cannot be * used. * * @param jwk_set An existing jwk_set_t * @param index Index of the jwk_set * @return A valid jwk_item_t or NULL if it doesn't exist * * @warning The index of an item in a keyring can change if items are deleted. * Effort is made to add new JWK to the end of the set, so this should not * affect the index of previous items. */ JWT_EXPORT const jwk_item_t *jwks_item_get(const jwk_set_t *jwk_set, size_t index); /** * @brief Find a jwk_item_t with a specific kid (Key ID) * * LibJWT does not ensure that kid's are unique in a given keyring, so care * must be taken. This will return the first match. * * @param jwk_set An existing jwk_set_t * @param kid String representing a ``kid`` to find * @return A jwk_item_t object or NULL if none found */ JWT_EXPORT jwk_item_t *jwks_find_bykid(jwk_set_t *jwk_set, const char *kid); /** * @brief Whether this key is private (or public) * * @param item A JWK Item * @return 1 for true, 0 for false */ JWT_EXPORT int jwks_item_is_private(const jwk_item_t *item); /** * @brief Check the error condition for this JWK * * @param item A JWK Item * @return 1 for true, 0 for false */ JWT_EXPORT int jwks_item_error(const jwk_item_t *item); /** * @brief Check the error message for a JWK Item * * @param item A JWK Item * @return A string message. Empty string if no error. */ JWT_EXPORT const char *jwks_item_error_msg(const jwk_item_t *item); /** * @brief A curve name, if applicable, for this key * * Mainly applies to EC and OKP (EdDSA) type keys. * * @param item A JWK Item * @return A string of the curve name if one exists. NULL otherwise. */ JWT_EXPORT const char *jwks_item_curve(const jwk_item_t *item); /** * @brief A kid (Key ID) for this JWK * * @param item A JWK Item * @return A string of the kid if one exists. NULL otherwise. */ JWT_EXPORT const char *jwks_item_kid(const jwk_item_t *item); /** * @brief The algorithm for this JWK * * It is perfectly valid for this to be JWT_ALG_NONE. * * @param item A JWK Item * @return A jwt_alg_t type of this key */ JWT_EXPORT jwt_alg_t jwks_item_alg(const jwk_item_t *item); /** * @brief The Key Type of this JWK * * @param item A JWK Item * @return A jwk_key_type_t type for this key */ JWT_EXPORT jwk_key_type_t jwks_item_kty(const jwk_item_t *item); /** * @brief The ``"use"`` field for this JWK * * @param item A JWK Item * @return A jwk_pub_key_use_t type for this key */ JWT_EXPORT jwk_pub_key_use_t jwks_item_use(const jwk_item_t *item); /** * @brief The ``"key_ops"`` field for this JWK * * @param item A JWK Item * @return A jwk_key_op_t type for this key which represents all of the * ``"key_ops"`` supported as a bit field. */ JWT_EXPORT jwk_key_op_t jwks_item_key_ops(const jwk_item_t *item); /** * @brief The PEM generated for the JWK * * This is an optional field that may or may not be supported depending on * which crypto backend is in use. It is provided as a courtesy. * * @param item A JWK Item * @return A string of the PEM file for this key or NULL if none exists */ JWT_EXPORT const char *jwks_item_pem(const jwk_item_t *item); /** * @brief Retrieve binary octet data of a key * * Only valid for JWT_KEY_TYPE_OCT. * * @param item A JWK Item * @param buf Pointer to a pointer buffer * @param len Pointer to a length * @return 0 on success. @p buf will point to data of @c len length. Non-zero on * error. */ JWT_EXPORT int jwks_item_key_oct(const jwk_item_t *item, const unsigned char **buf, size_t *len); /** * @brief The number of bits in this JWK * * This is relevant to the key type (kty). E.g. an RSA key would have at least * 2048 bits, and an EC key would be 256, 384, or 521 bits, etc. * * @param item A JWK Item * @return The number of bits for the key */ JWT_EXPORT int jwks_item_key_bits(const jwk_item_t *item); /** * @brief Free remove and free the nth jwk_item_t in a jwk_set * * @param jwk_set Pointer to a JWKS object * @param index the position of the item in the index * @return 0 if no item was was deleted (found), 1 if it was */ JWT_EXPORT int jwks_item_free(jwk_set_t *jwk_set, size_t index); /** * @brief Remove and free all jwk_item_t in a jwk_set_t * * The jwk_set_t becomes an empty set. * * @param jwk_set Pointer to a JWKS object * @return The number of items deleted */ JWT_EXPORT int jwks_item_free_all(jwk_set_t *jwk_set); /** * @brief Free all keys marked with an error in a jwk_set_t * * The jwk_set_t becomes an empty set. * * @param jwk_set Pointer to a JWKS object * @return The number of items with an error that were deleted */ JWT_EXPORT int jwks_item_free_bad(jwk_set_t *jwk_set); /** * @brief Return the number of keys in a jwk_set_t * * @param jwk_set Pointer to a JWKS object * @return The number of items in the set */ JWT_EXPORT size_t jwks_item_count(const jwk_set_t *jwk_set); /** * @} * @noop jwks_item_grp */ /** * @} * @noop jwks_grp */ /** * @defgroup jwt_advanced_grp Advanced Functionality * @{ */ /** * @defgroup jwt_memory_grp Memory Handlers * These functions allow you to get or set memory allocation functions. * @{ */ /** * @brief Set functions to be used for memory management * * By default, LibJWT uses malloc and free for memory * management. This function allows the user of the library to * specify its own memory management functions. This is especially * useful on Windows where mismatches in runtimes across DLLs can * cause problems. * * The caller can specify either a valid function pointer for * any of the parameters or NULL to use the corresponding default * allocator function. * * @note This function will also set the memory allocator for the Jansson * library. * * @param pmalloc The function to use for allocating memory or * NULL to use malloc * @param pfree The function to use for freeing memory or * NULL to use free * @returns 0 on success or errno otherwise. */ JWT_EXPORT int jwt_set_alloc(jwt_malloc_t pmalloc, jwt_free_t pfree); /** * Get functions used for allocating and freeing memory. * * @param pmalloc Pointer to malloc function output variable, or NULL * @param pfree Pointer to free function output variable, or NULL */ JWT_EXPORT void jwt_get_alloc(jwt_malloc_t *pmalloc, jwt_free_t *pfree); /** * @} * @noop jwt_memory_grp */ /** * @defgroup jwt_crypto_grp Cryptographic Ops * Functions used to set and get which crypto operations are used * * LibJWT supports several crypto libraries, mainly "openssl", "gnutls", * and "mbedtls". By default, "openssl" is used. * * @warning Changing the crypto operations is not thread safe. You must * protect changing them with some sort of lock, including locking * around usage of the operations themselves. Ideally, you should only * perform this at the start of your application before using any of * LibJWTs functions. Failing to follow this guide can lead to crashes * in certain situations. * * @remark ENVIRONMENT: You can set JWT_CRYPTO to the default operations you * wish to use. If JWT_CRYPTO is invalid, an error message will be * printed to the console when LibJWT is loaded by the application. * @{ */ /** * Retrieve the name of the current crypto operations being used. * * @return name of the crypto operation set */ JWT_EXPORT const char *jwt_get_crypto_ops(void); /** * Retrieve the type of the current crypto operations being used. * * @return jwt_crypto_provider_t of the crypto operation set */ JWT_EXPORT jwt_crypto_provider_t jwt_get_crypto_ops_t(void); /** * Set the crypto operations to the named set. * * The opname is one of the available operators in the compiled version * of LibJWT. Most times, this is either "openssl" or "gnutls". * * @param opname the name of the crypto operation to set * @return 0 on success, 1 for error */ JWT_EXPORT int jwt_set_crypto_ops(const char *opname); /** * Set the crypto operations to a jwt_crypto_provider_t type * * The same as jwt_set_crypto_ops(), but uses the type as opname * * @param opname A valid jwt_crypto_provider_t type * @return 0 on success, 1 for error */ JWT_EXPORT int jwt_set_crypto_ops_t(jwt_crypto_provider_t opname); /** * Check if the current crypto operations support JWK usage * * @return 1 if it does, 0 if not */ JWT_EXPORT int jwt_crypto_ops_supports_jwk(void); /** * @} * @noop jwt_crypto_grp */ /** * @} * @noop jwt_advanced_grp */ #ifdef __cplusplus } #endif #endif /* JWT_H */ libjwt-3.3.3/include/jwt_export.h.in000066400000000000000000000037151517612317300174350ustar00rootroot00000000000000/* Copyright (C) 2024-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef @INCLUDE_GUARD_NAME@ #define @INCLUDE_GUARD_NAME@ /* Version macros for LibJWT */ #define @VERSION_MAJOR_NAME@ @DEFINE_MAJOR@ #define @VERSION_MINOR_NAME@ @DEFINE_MINOR@ #define @VERSION_MICRO_NAME@ @DEFINE_MICRO@ #define @VERSION_STRING_NAME@ @DEFINE_VERSION@ /* Whether the system supports "long long". This is primarily to sync * with jansson's json_int_t when working with JSON integers. */ #define @USE_LONG_LONG_NAME@ @DEFINE_LONG_LONG@ #ifdef @STATIC_DEFINE@ # define @EXPORT_MACRO_NAME@ # define @NO_EXPORT_MACRO_NAME@ #else # ifndef @EXPORT_MACRO_NAME@ # ifdef @EXPORT_IMPORT_CONDITION@ /* We are building this library */ # define @EXPORT_MACRO_NAME@ @DEFINE_EXPORT@ # else /* We are using this library */ # define @EXPORT_MACRO_NAME@ @DEFINE_IMPORT@ # endif # endif # ifndef @NO_EXPORT_MACRO_NAME@ # define @NO_EXPORT_MACRO_NAME@ @DEFINE_NO_EXPORT@ # endif #endif #ifndef @CONSTRUCTOR_MACRO_NAME@ # define @CONSTRUCTOR_MACRO_NAME@ @DEFINE_CONSTRUCTOR@ #endif #ifndef @DEPRECATED_MACRO_NAME@ # define @DEPRECATED_MACRO_NAME@ @DEFINE_DEPRECATED@ #endif #ifndef @DEPRECATED_MACRO_NAME@_EXPORT # define @DEPRECATED_MACRO_NAME@_EXPORT @EXPORT_MACRO_NAME@ @DEPRECATED_MACRO_NAME@ #endif #ifndef @DEPRECATED_MACRO_NAME@_NO_EXPORT # define @DEPRECATED_MACRO_NAME@_NO_EXPORT @NO_EXPORT_MACRO_NAME@ @DEPRECATED_MACRO_NAME@ #endif /* NOLINTNEXTLINE(readability-avoid-unconditional-preprocessor-if) */ #if @DEFINE_NO_DEPRECATED@ /* DEFINE_NO_DEPRECATED */ # ifndef @NO_DEPRECATED_MACRO_NAME@ # define @NO_DEPRECATED_MACRO_NAME@ # endif #endif #endif /* @INCLUDE_GUARD_NAME@ */ libjwt-3.3.3/libjwt/000077500000000000000000000000001517612317300143145ustar00rootroot00000000000000libjwt-3.3.3/libjwt/gnutls/000077500000000000000000000000001517612317300156305ustar00rootroot00000000000000libjwt-3.3.3/libjwt/gnutls/jwk-parse.c000066400000000000000000000021131517612317300176740ustar00rootroot00000000000000/* Copyright (C) 2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include "jwt-private.h" static const char not_implemented[] = "GnuTLS does not yet implement JWK"; JWT_NO_EXPORT int gnutls_process_eddsa(jwt_json_t *jwk, jwk_item_t *item) { jwt_write_error(item, not_implemented); return -1; } JWT_NO_EXPORT int gnutls_process_rsa(jwt_json_t *jwk, jwk_item_t *item) { jwt_write_error(item, not_implemented); return -1; } JWT_NO_EXPORT int gnutls_process_ec(jwt_json_t *jwk, jwk_item_t *item) { jwt_write_error(item, not_implemented); return -1; } JWT_NO_EXPORT void gnutls_process_item_free(jwk_item_t *item) { return; } libjwt-3.3.3/libjwt/gnutls/jwt-gnutls.h000066400000000000000000000016421517612317300201220ustar00rootroot00000000000000/* Copyright (C) 2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef JWT_GNUTLS_H #define JWT_GNUTLS_H /* Until we have our own routines, we rely on OpenSSL */ int openssl_process_eddsa(jwt_json_t *jwk, jwk_item_t *item); int openssl_process_rsa(jwt_json_t *jwk, jwk_item_t *item); int openssl_process_ec(jwt_json_t *jwk, jwk_item_t *item); void openssl_process_item_free(jwk_item_t *item); int gnutls_process_eddsa(jwt_json_t *jwk, jwk_item_t *item); int gnutls_process_rsa(jwt_json_t *jwk, jwk_item_t *item); int gnutls_process_ec(jwt_json_t *jwk, jwk_item_t *item); void gnutls_process_item_free(jwk_item_t *item); #endif /* JWT_GNUTLS_H */ libjwt-3.3.3/libjwt/gnutls/sign-verify.c000066400000000000000000000240561517612317300202450ustar00rootroot00000000000000/* Copyright (C) 2017 Nicolas Mora Copyright (C) 2024-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include "jwt-private.h" #include "jwt-gnutls.h" /** * libjwt Cryptographic Signature/Verification function definitions */ static int gnutls_sign_sha_hmac(jwt_t *jwt, char **out, unsigned int *len, const char *str, unsigned int str_len) { int alg; void *key; size_t key_len; key = jwt->key->oct.key; key_len = jwt->key->oct.len; switch (jwt->alg) { case JWT_ALG_HS256: alg = GNUTLS_DIG_SHA256; break; case JWT_ALG_HS384: alg = GNUTLS_DIG_SHA384; break; case JWT_ALG_HS512: alg = GNUTLS_DIG_SHA512; break; // LCOV_EXCL_START default: return 1; // LCOV_EXCL_STOP } *len = gnutls_hmac_get_len(alg); *out = jwt_malloc(*len); if (*out == NULL) return 1; // LCOV_EXCL_LINE if (gnutls_hmac_fast(alg, key, key_len, str, str_len, *out)) { // LCOV_EXCL_START jwt_freemem(*out); return 1; // LCOV_EXCL_STOP } return 0; } #define SIGN_ERROR(_msg) { jwt_write_error(jwt, "JWT[GnuTLS]: " _msg); goto sign_clean_privkey; } static int gnutls_sign_sha_pem(jwt_t *jwt, char **out, unsigned int *len, const char *str, unsigned int str_len) { /* For EC handling. */ int r_padding = 0, s_padding = 0, r_out_padding = 0, s_out_padding = 0; gnutls_privkey_t privkey; size_t out_size; gnutls_datum_t sig_dat, r, s; gnutls_digest_algorithm_t alg; int pk_alg, flags = 0; unsigned int adj = 0; if (gnutls_privkey_init(&privkey)) SIGN_ERROR("Error initializing privkey"); // LCOV_EXCL_LINE if (jwt->alg == JWT_ALG_ES256K) SIGN_ERROR("ES256K not supported"); // LCOV_EXCL_LINE if (jwt->key->pem == NULL) SIGN_ERROR("No PEM to load"); // LCOV_EXCL_LINE gnutls_datum_t key_dat = { (unsigned char *)jwt->key->pem, strlen(jwt->key->pem) }; gnutls_datum_t body_dat = { (unsigned char *)str, str_len }; /* Try loading as a private key, and extracting the pubkey */ if (gnutls_privkey_import_x509_raw(privkey, &key_dat, GNUTLS_X509_FMT_PEM, NULL, 0)) { SIGN_ERROR("Could not import private key"); // LCOV_EXCL_LINE } /* Initialize for checking later. */ *out = NULL; switch (jwt->alg) { /* RSA */ case JWT_ALG_RS256: alg = GNUTLS_DIG_SHA256; pk_alg = GNUTLS_PK_RSA; break; case JWT_ALG_RS384: alg = GNUTLS_DIG_SHA384; pk_alg = GNUTLS_PK_RSA; break; case JWT_ALG_RS512: alg = GNUTLS_DIG_SHA512; pk_alg = GNUTLS_PK_RSA; break; /* RSA-PSS */ case JWT_ALG_PS256: alg = GNUTLS_DIG_SHA256; pk_alg = GNUTLS_PK_RSA_PSS; break; case JWT_ALG_PS384: alg = GNUTLS_DIG_SHA384; pk_alg = GNUTLS_PK_RSA_PSS; break; case JWT_ALG_PS512: alg = GNUTLS_DIG_SHA512; pk_alg = GNUTLS_PK_RSA_PSS; break; /* EC */ case JWT_ALG_ES256: case JWT_ALG_ES256K: alg = GNUTLS_DIG_SHA256; pk_alg = GNUTLS_PK_EC; break; case JWT_ALG_ES384: alg = GNUTLS_DIG_SHA384; pk_alg = GNUTLS_PK_EC; break; case JWT_ALG_ES512: alg = GNUTLS_DIG_SHA512; pk_alg = GNUTLS_PK_EC; break; /* EdDSA */ case JWT_ALG_EDDSA: pk_alg = gnutls_privkey_get_pk_algorithm(privkey, NULL); if (pk_alg == GNUTLS_PK_EDDSA_ED25519) alg = GNUTLS_DIG_SHA512; else if (pk_alg == GNUTLS_PK_EDDSA_ED448) { alg = GNUTLS_DIG_SHAKE_256; } else { SIGN_ERROR("Unknown EdDSA key"); // LCOV_EXCL_LINE } break; // LCOV_EXCL_START default: SIGN_ERROR("Unknown signing alg"); // LCOV_EXCL_STOP } if (pk_alg == GNUTLS_PK_RSA_PSS) { int ck = gnutls_privkey_get_pk_algorithm(privkey, NULL); if (ck != GNUTLS_PK_RSA_PSS && ck != GNUTLS_PK_RSA) SIGN_ERROR("RSASSA-PSS alg mismatch"); // LCOV_EXCL_LINE flags |= GNUTLS_PRIVKEY_SIGN_FLAG_RSA_PSS; } else if (pk_alg != gnutls_privkey_get_pk_algorithm(privkey, NULL)) { SIGN_ERROR("Alg mismatch with signing key"); // LCOV_EXCL_LINE } if (gnutls_privkey_sign_data(privkey, alg, flags, &body_dat, &sig_dat)) SIGN_ERROR("Failed to sign token"); // LCOV_EXCL_LINE if (pk_alg == GNUTLS_PK_EC) { /* Start EC handling. */ if (gnutls_decode_rs_value(&sig_dat, &r, &s)) SIGN_ERROR("Error decoding EC key"); // LCOV_EXCL_LINE /* Check r and s size */ if (jwt->alg == JWT_ALG_ES256 || jwt->alg == JWT_ALG_ES256K) adj = 32; else if (jwt->alg == JWT_ALG_ES384) adj = 48; else if (jwt->alg == JWT_ALG_ES512) adj = 66; else SIGN_ERROR("Unknown EC algorithm"); if (r.size > adj) r_padding = r.size - adj; else if (r.size < adj) r_out_padding = adj - r.size; if (s.size > adj) s_padding = s.size - adj; else if (s.size < adj) s_out_padding = adj - s.size; out_size = adj << 1; *out = jwt_malloc(out_size); if (*out == NULL) SIGN_ERROR("Out of memory"); // LCOV_EXCL_LINE memset(*out, 0, out_size); memcpy(*out + r_out_padding, r.data + r_padding, r.size - r_padding); memcpy(*out + (r.size - r_padding + r_out_padding) + s_out_padding, s.data + s_padding, (s.size - s_padding)); *len = (r.size - r_padding + r_out_padding) + (s.size - s_padding + s_out_padding); gnutls_free(r.data); gnutls_free(s.data); } else { /* All others that aren't EC */ *out = jwt_malloc(sig_dat.size); if (*out == NULL) SIGN_ERROR("Out of memory"); // LCOV_EXCL_LINE /* Copy signature to out */ memcpy(*out, sig_dat.data, sig_dat.size); *len = sig_dat.size; } /* Clean and exit */ gnutls_free(sig_dat.data); sign_clean_privkey: gnutls_privkey_deinit(privkey); if (jwt->error) jwt_freemem(*out); // LCOV_EXCL_LINE return jwt->error; } #define VERIFY_ERROR(_msg) { jwt_write_error(jwt, "JWT[GnuTLS]: " _msg); goto verify_clean_sig; } static int gnutls_verify_sha_pem(jwt_t *jwt, const char *head, unsigned int head_len, unsigned char *sig, int sig_len) { gnutls_datum_t r, s; gnutls_datum_t data = { (unsigned char *)head, head_len }; gnutls_datum_t sig_dat = { NULL, 0 }; gnutls_pubkey_t pubkey; int alg, ret = 0; if (gnutls_pubkey_init(&pubkey)) VERIFY_ERROR("Failed initializing pubkey"); // LCOV_EXCL_LINE if (jwt->key->pem == NULL) VERIFY_ERROR("No PEM to load"); // LCOV_EXCL_LINE gnutls_datum_t cert_dat = { (unsigned char *)jwt->key->pem, strlen(jwt->key->pem) }; if (jwt->alg == JWT_ALG_ES256K) VERIFY_ERROR("ES256K not supported"); // LCOV_EXCL_LINE ret = gnutls_pubkey_import(pubkey, &cert_dat, GNUTLS_X509_FMT_PEM); if (ret) { gnutls_privkey_t privkey; /* Try loading as a private key, and extracting the pubkey. * This is perfectly legit. A JWK can have a private key with * key_ops of SIGN and VERIFY. */ if (gnutls_privkey_init(&privkey)) VERIFY_ERROR("Failed initializing privkey"); // LCOV_EXCL_LINE /* Try loading as a private key, and extracting the pubkey */ if (gnutls_privkey_import_x509_raw(privkey, &cert_dat, GNUTLS_X509_FMT_PEM, NULL, 0)) { VERIFY_ERROR("Failed importing key"); // LCOV_EXCL_LINE } ret = gnutls_pubkey_import_privkey(pubkey, privkey, 0, 0); gnutls_privkey_deinit(privkey); if (ret) VERIFY_ERROR("Failed to import key"); // LCOV_EXCL_LINE } switch (jwt->alg) { /* RSA */ case JWT_ALG_RS256: alg = GNUTLS_SIGN_RSA_SHA256; break; case JWT_ALG_RS384: alg = GNUTLS_SIGN_RSA_SHA384; break; case JWT_ALG_RS512: alg = GNUTLS_SIGN_RSA_SHA512; break; /* RSA-PSS */ case JWT_ALG_PS256: alg = GNUTLS_SIGN_RSA_PSS_SHA256; break; case JWT_ALG_PS384: alg = GNUTLS_SIGN_RSA_PSS_SHA384; break; case JWT_ALG_PS512: alg = GNUTLS_SIGN_RSA_PSS_SHA512; break; /* EC */ case JWT_ALG_ES256: case JWT_ALG_ES256K: alg = GNUTLS_SIGN_ECDSA_SHA256; break; case JWT_ALG_ES384: alg = GNUTLS_SIGN_ECDSA_SHA384; break; case JWT_ALG_ES512: alg = GNUTLS_SIGN_ECDSA_SHA512; break; /* EdDSA */ case JWT_ALG_EDDSA: alg = gnutls_pubkey_get_pk_algorithm(pubkey, NULL); if (alg == GNUTLS_PK_EDDSA_ED25519) alg = GNUTLS_SIGN_EDDSA_ED25519; else if (alg == GNUTLS_PK_EDDSA_ED448) { alg = GNUTLS_SIGN_EDDSA_ED448; } else { VERIFY_ERROR("Unknown EdDSA key type"); // LCOV_EXCL_LINE } break; // LCOV_EXCL_START default: VERIFY_ERROR("Unknown alg"); // LCOV_EXCL_STOP } /* Rebuild signature using r and s extracted from sig when jwt->alg * is ESxxx. */ switch (jwt->alg) { case JWT_ALG_ES256: case JWT_ALG_ES256K: case JWT_ALG_ES384: case JWT_ALG_ES512: /* XXX Gotta be a better way. */ if (sig_len == 64) { r.size = 32; r.data = sig; s.size = 32; s.data = sig + 32; } else if (sig_len == 96) { r.size = 48; r.data = sig; s.size = 48; s.data = sig + 48; } else if (sig_len == 132) { r.size = 66; r.data = sig; s.size = 66; s.data = sig + 66; } else { VERIFY_ERROR("Irregular sig_len for ECDHA"); // LCOV_EXCL_LINE } if (gnutls_encode_rs_value(&sig_dat, &r, &s) || gnutls_pubkey_verify_data2(pubkey, alg, 0, &data, &sig_dat)) ret = 1; // LCOV_EXCL_LINE if (sig_dat.data != NULL) gnutls_free(sig_dat.data); if (ret) VERIFY_ERROR("Could not encode R/S values for ECDHA"); // LCOV_EXCL_LINE break; default: /* Use simple signature verification. */ sig_dat.size = sig_len; sig_dat.data = sig; if (gnutls_pubkey_verify_data2(pubkey, alg, 0, &data, &sig_dat)) VERIFY_ERROR("Failed to verify signature"); // LCOV_EXCL_LINE } verify_clean_sig: gnutls_pubkey_deinit(pubkey); return ret; } /* Export our ops */ struct jwt_crypto_ops jwt_gnutls_ops = { .name = "gnutls", .provider = JWT_CRYPTO_OPS_GNUTLS, .sign_sha_hmac = gnutls_sign_sha_hmac, .sign_sha_pem = gnutls_sign_sha_pem, .verify_sha_pem = gnutls_verify_sha_pem, /* Needs to be implemented */ .jwk_implemented = 1, .process_eddsa = openssl_process_eddsa, .process_rsa = openssl_process_rsa, .process_ec = openssl_process_ec, .process_item_free = openssl_process_item_free, }; libjwt-3.3.3/libjwt/jansson/000077500000000000000000000000001517612317300157675ustar00rootroot00000000000000libjwt-3.3.3/libjwt/jansson/jwt-jansson.c000066400000000000000000000164241517612317300204170ustar00rootroot00000000000000/* Copyright (C) 2026 Ramin Seyed Moussavi, Yacoub Automation GmbH This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * Jansson JSON backend for libjwt. * * Implements the jwt_json_* abstraction using jansson. */ #include #include "jwt-json-ops.h" #include /* ================================================================ * Memory allocator override * ================================================================ */ void jwt_json_set_alloc(void *(*alloc_func)(size_t), void (*free_func)(void *)) { json_set_alloc_funcs(alloc_func, free_func); } /* ================================================================ * Internal helpers: cast between opaque jwt_json_t and json_t * ================================================================ */ static inline json_t *to_json(const jwt_json_t *j) { return (json_t *)j; } static inline jwt_json_t *from_json(json_t *j) { return (jwt_json_t *)j; } /* ================================================================ * Internal: translate jwt_json flags to native jansson flags * ================================================================ */ static size_t encode_flags(size_t flags) { size_t jflags = 0; int indent = flags & 0x1F; if (indent > 0) jflags |= JSON_INDENT(indent); if (flags & JWT_JSON_COMPACT) jflags |= JSON_COMPACT; if (flags & JWT_JSON_SORT_KEYS) jflags |= JSON_SORT_KEYS; return jflags; } static size_t decode_flags(size_t flags) { size_t jflags = 0; if (flags & JWT_JSON_REJECT_DUPLICATES) jflags |= JSON_REJECT_DUPLICATES; if (flags & JWT_JSON_DECODE_ANY) jflags |= JSON_DECODE_ANY; return jflags; } /* ================================================================ * Internal: map jansson json_error_t to jwt_json_error_t * ================================================================ */ static void map_error(jwt_json_error_t *dst, const json_error_t *src) { if (!dst) return; memset(dst, 0, sizeof(*dst)); if (src) { snprintf(dst->text, JWT_JSON_ERROR_TEXT_LENGTH, "%s", src->text); snprintf(dst->source, JWT_JSON_ERROR_SOURCE_LENGTH, "%s", src->source); dst->line = src->line; dst->column = src->column; dst->position = src->position; } } /* ================================================================ * Reference counting * ================================================================ */ void jwt_json_releasep(jwt_json_t **json) { if (json) { json_t *j = to_json(*json); json_decref(j); *json = NULL; } } void jwt_json_release(jwt_json_t *json) { json_decref(to_json(json)); } /* ================================================================ * Object creation * ================================================================ */ jwt_json_t *jwt_json_create(void) { return from_json(json_object()); } jwt_json_t *jwt_json_create_arr(void) { return from_json(json_array()); } jwt_json_t *jwt_json_create_str(const char *value) { return from_json(json_string(value)); } jwt_json_t *jwt_json_create_int(jwt_json_int_t value) { return from_json(json_integer(value)); } jwt_json_t *jwt_json_create_bool(int value) { return from_json(json_boolean(value)); } /* ================================================================ * Object operations * ================================================================ */ jwt_json_t *jwt_json_obj_get(const jwt_json_t *object, const char *key) { return from_json(json_object_get(to_json(object), key)); } int jwt_json_obj_set(jwt_json_t *object, const char *key, jwt_json_t *value) { return json_object_set_new(to_json(object), key, to_json(value)); } int jwt_json_obj_del(jwt_json_t *object, const char *key) { return json_object_del(to_json(object), key); } int jwt_json_obj_clear(jwt_json_t *object) { return json_object_clear(to_json(object)); } int jwt_json_obj_merge(jwt_json_t *object, jwt_json_t *other) { return json_object_update(to_json(object), to_json(other)); } int jwt_json_obj_merge_new(jwt_json_t *object, jwt_json_t *other) { return json_object_update_missing(to_json(object), to_json(other)); } /* ================================================================ * Array operations * ================================================================ */ size_t jwt_json_arr_size(const jwt_json_t *array) { return json_array_size(to_json(array)); } jwt_json_t *jwt_json_arr_get(const jwt_json_t *array, size_t index) { return from_json(json_array_get(to_json(array), index)); } int jwt_json_arr_append(jwt_json_t *array, jwt_json_t *value) { return json_array_append_new(to_json(array), to_json(value)); } /* ================================================================ * Type checking * ================================================================ */ int jwt_json_is_array(const jwt_json_t *json) { return json_is_array(to_json(json)); } int jwt_json_is_string(const jwt_json_t *json) { return json_is_string(to_json(json)); } int jwt_json_is_int(const jwt_json_t *json) { return json_is_integer(to_json(json)); } int jwt_json_is_bool(const jwt_json_t *json) { return json_is_boolean(to_json(json)); } int jwt_json_is_true(const jwt_json_t *json) { return json_is_true(to_json(json)); } /* ================================================================ * Value extraction * ================================================================ */ const char *jwt_json_str_val(const jwt_json_t *json) { return json_string_value(to_json(json)); } jwt_json_int_t jwt_json_int_val(const jwt_json_t *json) { return json_integer_value(to_json(json)); } /* ================================================================ * Deep copy * ================================================================ */ jwt_json_t *jwt_json_clone(const jwt_json_t *value) { return from_json(json_deep_copy(to_json(value))); } /* ================================================================ * Serialization / Parsing * ================================================================ */ char *jwt_json_serialize(const jwt_json_t *json, size_t flags) { return json_dumps(to_json(json), encode_flags(flags)); } jwt_json_t *jwt_json_parse(const char *input, size_t flags, jwt_json_error_t *error) { json_error_t jerr; json_t *obj = json_loads(input, decode_flags(flags), &jerr); if (!obj && error) map_error(error, &jerr); return from_json(obj); } jwt_json_t *jwt_json_parse_buf(const char *buffer, size_t buflen, size_t flags, jwt_json_error_t *error) { json_error_t jerr; json_t *obj = json_loadb(buffer, buflen, decode_flags(flags), &jerr); if (!obj && error) map_error(error, &jerr); return from_json(obj); } jwt_json_t *jwt_json_parse_file(const char *path, size_t flags, jwt_json_error_t *error) { json_error_t jerr; json_t *obj = json_load_file(path, decode_flags(flags), &jerr); if (!obj && error) map_error(error, &jerr); return from_json(obj); } jwt_json_t *jwt_json_parse_fp(FILE *input, size_t flags, jwt_json_error_t *error) { json_error_t jerr; json_t *obj = json_loadf(input, decode_flags(flags), &jerr); if (!obj && error) map_error(error, &jerr); return from_json(obj); } libjwt-3.3.3/libjwt/json-c/000077500000000000000000000000001517612317300155055ustar00rootroot00000000000000libjwt-3.3.3/libjwt/json-c/jwt-json-c.c000066400000000000000000000366011517612317300176520ustar00rootroot00000000000000/* Copyright (C) 2026 Ramin Seyed Moussavi, Yacoub Automation GmbH This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * json-c JSON backend for libjwt. * * Implements the jwt_json_* abstraction using json-c. */ #include #include "jwt-json-ops.h" #include #include #include /* From jwt-memory.c - declared here to avoid pulling in jwt-private.h * which requires the full jwt.h public header. */ extern void *jwt_malloc(size_t size); /* ================================================================ * Internal helpers: cast between opaque jwt_json_t and json_object * ================================================================ */ static inline struct json_object *to_jc(const jwt_json_t *j) { return (struct json_object *)j; } static inline jwt_json_t *from_jc(struct json_object *j) { return (jwt_json_t *)j; } /* ================================================================ * Memory allocator override * ================================================================ */ void jwt_json_set_alloc(void *(*alloc_func)(size_t), void (*free_func)(void *)) { /* json-c does not support custom allocators */ (void)alloc_func; (void)free_func; } /* Internal flag masks - must match jwt-json-ops.h */ #define INDENT_MASK 0x1F #define FLAG_COMPACT 0x20 #define FLAG_SORT_KEYS 0x80 /* ================================================================ * Reference counting * ================================================================ */ void jwt_json_releasep(jwt_json_t **json) { if (json && *json) { json_object_put(to_jc(*json)); *json = NULL; } } void jwt_json_release(jwt_json_t *json) { if (json) json_object_put(to_jc(json)); } /* ================================================================ * Object creation * ================================================================ */ jwt_json_t *jwt_json_create(void) { return from_jc(json_object_new_object()); } jwt_json_t *jwt_json_create_arr(void) { return from_jc(json_object_new_array()); } jwt_json_t *jwt_json_create_str(const char *value) { if (!value) return NULL; return from_jc(json_object_new_string(value)); } jwt_json_t *jwt_json_create_int(jwt_json_int_t value) { return from_jc(json_object_new_int64(value)); } jwt_json_t *jwt_json_create_bool(int value) { return from_jc(json_object_new_boolean(value)); } /* ================================================================ * Object operations * ================================================================ */ jwt_json_t *jwt_json_obj_get(const jwt_json_t *object, const char *key) { if (!object || !key) return NULL; return from_jc(json_object_object_get(to_jc(object), key)); } int jwt_json_obj_set(jwt_json_t *object, const char *key, jwt_json_t *value) { if (!object || !key || !value) return -1; return json_object_object_add(to_jc(object), key, to_jc(value)); } int jwt_json_obj_del(jwt_json_t *object, const char *key) { if (!object || !key) return -1; json_object_object_del(to_jc(object), key); return 0; } int jwt_json_obj_clear(jwt_json_t *object) { const char **keys; int n = 0, i = 0; if (!object) return -1; json_object_object_foreach(to_jc(object), key, val) { (void)key; (void)val; n++; } if (n == 0) return 0; keys = malloc(n * sizeof(char *)); if (!keys) return -1; json_object_object_foreach(to_jc(object), key2, val2) { (void)val2; keys[i++] = key2; } for (i = 0; i < n; i++) json_object_object_del(to_jc(object), keys[i]); free(keys); return 0; } int jwt_json_obj_merge(jwt_json_t *object, jwt_json_t *other) { if (!object || !other) return -1; json_object_object_foreach(to_jc(other), key, val) { json_object_object_add(to_jc(object), key, json_object_get(val)); } return 0; } int jwt_json_obj_merge_new(jwt_json_t *object, jwt_json_t *other) { if (!object || !other) return -1; json_object_object_foreach(to_jc(other), key, val) { struct json_object *existing; if (!json_object_object_get_ex(to_jc(object), key, &existing)) json_object_object_add(to_jc(object), key, json_object_get(val)); } return 0; } /* ================================================================ * Array operations * ================================================================ */ size_t jwt_json_arr_size(const jwt_json_t *array) { if (!array) return 0; return json_object_array_length(to_jc(array)); } jwt_json_t *jwt_json_arr_get(const jwt_json_t *array, size_t index) { if (!array) return NULL; return from_jc(json_object_array_get_idx(to_jc(array), index)); } int jwt_json_arr_append(jwt_json_t *array, jwt_json_t *value) { if (!array) return -1; return json_object_array_add(to_jc(array), to_jc(value)); } /* ================================================================ * Type checking * ================================================================ */ int jwt_json_is_array(const jwt_json_t *json) { return json && json_object_is_type(to_jc(json), json_type_array); } int jwt_json_is_string(const jwt_json_t *json) { return json && json_object_is_type(to_jc(json), json_type_string); } int jwt_json_is_int(const jwt_json_t *json) { return json && json_object_is_type(to_jc(json), json_type_int); } int jwt_json_is_bool(const jwt_json_t *json) { return json && json_object_is_type(to_jc(json), json_type_boolean); } int jwt_json_is_true(const jwt_json_t *json) { return json && json_object_is_type(to_jc(json), json_type_boolean) && json_object_get_boolean(to_jc(json)); } /* ================================================================ * Value extraction * ================================================================ */ const char *jwt_json_str_val(const jwt_json_t *json) { if (!json) return NULL; return json_object_get_string(to_jc(json)); } jwt_json_int_t jwt_json_int_val(const jwt_json_t *json) { if (!json) return 0; return json_object_get_int64(to_jc(json)); } /* ================================================================ * Deep copy * ================================================================ */ jwt_json_t *jwt_json_clone(const jwt_json_t *value) { struct json_object *dst = NULL; if (!value) return NULL; if (json_object_deep_copy(to_jc(value), &dst, NULL) != 0) return NULL; return from_jc(dst); } /* ================================================================ * Sorted-key serialization * * json-c does not support sorted keys natively. We implement it * here because JWT requires deterministic output (RFC 7515). * ================================================================ */ static int key_cmp(const void *a, const void *b) { return strcmp(*(const char **)a, *(const char **)b); } static int append_str(char **buf, size_t *len, size_t *cap, const char *str) { size_t slen = strlen(str); while (*len + slen + 1 > *cap) { *cap *= 2; char *tmp = realloc(*buf, *cap); if (!tmp) return -1; *buf = tmp; } memcpy(*buf + *len, str, slen); *len += slen; (*buf)[*len] = '\0'; return 0; } static int serialize_value_sorted(struct json_object *json, int compact, char **buf, size_t *len, size_t *cap) { if (!json) return append_str(buf, len, cap, "null"); enum json_type type = json_object_get_type(json); if (type == json_type_object) { int n = json_object_object_length(json); const char **keys = NULL; int i = 0; if (append_str(buf, len, cap, "{")) return -1; if (n > 0) { keys = malloc(n * sizeof(char *)); if (!keys) return -1; json_object_object_foreach(json, key, val) { (void)val; keys[i++] = key; } qsort(keys, n, sizeof(char *), key_cmp); for (i = 0; i < n; i++) { struct json_object *v; const char *escaped; struct json_object *str_obj; if (i > 0) { if (append_str(buf, len, cap, compact ? "," : ", ")) { free(keys); return -1; } } str_obj = json_object_new_string(keys[i]); escaped = json_object_to_json_string_ext( str_obj, JSON_C_TO_STRING_PLAIN); if (append_str(buf, len, cap, escaped)) { json_object_put(str_obj); free(keys); return -1; } json_object_put(str_obj); if (append_str(buf, len, cap, compact ? ":" : ": ")) { free(keys); return -1; } json_object_object_get_ex(json, keys[i], &v); if (serialize_value_sorted(v, compact, buf, len, cap)) { free(keys); return -1; } } free(keys); } return append_str(buf, len, cap, "}"); } else if (type == json_type_array) { size_t arr_len = json_object_array_length(json); if (append_str(buf, len, cap, "[")) return -1; for (size_t idx = 0; idx < arr_len; idx++) { struct json_object *elem; if (idx > 0) { if (append_str(buf, len, cap, compact ? "," : ", ")) return -1; } elem = json_object_array_get_idx(json, idx); if (serialize_value_sorted(elem, compact, buf, len, cap)) return -1; } return append_str(buf, len, cap, "]"); } else { const char *str = json_object_to_json_string_ext( json, JSON_C_TO_STRING_PLAIN); return append_str(buf, len, cap, str); } } static int serialize_sorted(const jwt_json_t *json, int compact, char **out) { size_t len = 0; size_t cap = 256; char *buf = malloc(cap); if (!buf) return -1; buf[0] = '\0'; if (serialize_value_sorted(to_jc(json), compact, &buf, &len, &cap)) { free(buf); return -1; } *out = buf; return 0; } /* ================================================================ * Serialization / Parsing * ================================================================ */ /** * Copy a libc-allocated string into a jwt_malloc-allocated buffer. * The caller is expected to free the result with jwt_freemem(). */ static char *to_jwt_alloc(char *libc_str) { size_t len; char *out; if (!libc_str) return NULL; len = strlen(libc_str) + 1; out = jwt_malloc(len); if (!out) { free(libc_str); return NULL; } memcpy(out, libc_str, len); free(libc_str); return out; } char *jwt_json_serialize(const jwt_json_t *json, size_t flags) { char *result; if (!json) return NULL; if (flags & FLAG_SORT_KEYS) { int compact = (flags & FLAG_COMPACT) ? 1 : 0; if (serialize_sorted(json, compact, &result)) return NULL; return to_jwt_alloc(result); } int jc_flags = JSON_C_TO_STRING_PLAIN; int indent = flags & INDENT_MASK; if (indent > 0) jc_flags = JSON_C_TO_STRING_PRETTY; const char *str = json_object_to_json_string_ext(to_jc(json), jc_flags); if (!str) return NULL; size_t len = strlen(str) + 1; result = jwt_malloc(len); if (!result) return NULL; memcpy(result, str, len); return result; } static void set_error(jwt_json_error_t *error, const char *source, const char *text) { if (!error) return; memset(error, 0, sizeof(*error)); if (text) snprintf(error->text, JWT_JSON_ERROR_TEXT_LENGTH, "%s", text); if (source) snprintf(error->source, JWT_JSON_ERROR_SOURCE_LENGTH, "%s", source); } /* * NOTE: json-c does not support JWT_JSON_REJECT_DUPLICATES. * Duplicate keys are silently accepted (last value wins). * This only affects jwt_set_json() where users manually set * JSON claims - it does not affect JWT verification of * received tokens. */ /** * Common post-parse validation for all parse functions. * Checks trailing garbage and enforces DECODE_ANY semantics. */ static jwt_json_t *validate_parsed(struct json_tokener *tok, struct json_object *obj, size_t input_len, size_t flags, const char *source, jwt_json_error_t *error) { /* Reject trailing garbage */ if (json_tokener_get_parse_end(tok) < input_len) { set_error(error, source, "Trailing data after JSON value"); json_tokener_free(tok); if (obj) json_object_put(obj); return NULL; } json_tokener_free(tok); /* Without DECODE_ANY, only accept objects and arrays * (matches jansson default behavior) */ if (!(flags & JWT_JSON_DECODE_ANY)) { if (!json_object_is_type(obj, json_type_object) && !json_object_is_type(obj, json_type_array)) { set_error(error, source, "Expected JSON object or array"); json_object_put(obj); return NULL; } } return from_jc(obj); } jwt_json_t *jwt_json_parse(const char *input, size_t flags, jwt_json_error_t *error) { struct json_tokener *tok; struct json_object *obj; enum json_tokener_error jerr; if (!input) { set_error(error, "", "NULL input"); return NULL; } size_t slen = strlen(input); if (slen > INT_MAX) { set_error(error, "", "Input too large"); return NULL; } tok = json_tokener_new(); if (!tok) { set_error(error, "", "Failed to create tokener"); return NULL; } obj = json_tokener_parse_ex(tok, input, (int)slen); jerr = json_tokener_get_error(tok); if (jerr != json_tokener_success) { set_error(error, "", json_tokener_error_desc(jerr)); json_tokener_free(tok); if (obj) json_object_put(obj); return NULL; } return validate_parsed(tok, obj, slen, flags, "", error); } jwt_json_t *jwt_json_parse_buf(const char *buffer, size_t buflen, size_t flags, jwt_json_error_t *error) { struct json_tokener *tok; struct json_object *obj; enum json_tokener_error jerr; if (!buffer) { set_error(error, "", "NULL buffer"); return NULL; } if (buflen > INT_MAX) { set_error(error, "", "Buffer too large"); return NULL; } tok = json_tokener_new(); if (!tok) { set_error(error, "", "Failed to create tokener"); return NULL; } obj = json_tokener_parse_ex(tok, buffer, (int)buflen); jerr = json_tokener_get_error(tok); if (jerr != json_tokener_success) { set_error(error, "", json_tokener_error_desc(jerr)); json_tokener_free(tok); if (obj) json_object_put(obj); return NULL; } return validate_parsed(tok, obj, buflen, flags, "", error); } jwt_json_t *jwt_json_parse_file(const char *path, size_t flags, jwt_json_error_t *error) { struct json_object *obj; if (!path) { set_error(error, "", "NULL path"); return NULL; } obj = json_object_from_file(path); if (!obj) { set_error(error, path, "Failed to parse file"); return NULL; } if (!(flags & JWT_JSON_DECODE_ANY)) { if (!json_object_is_type(obj, json_type_object) && !json_object_is_type(obj, json_type_array)) { set_error(error, path, "Expected JSON object or array"); json_object_put(obj); return NULL; } } return from_jc(obj); } jwt_json_t *jwt_json_parse_fp(FILE *input, size_t flags, jwt_json_error_t *error) { char *buf = NULL; size_t len = 0, cap = 0; char chunk[4096]; size_t nread; jwt_json_t *result; if (!input) { set_error(error, "", "NULL FILE pointer"); return NULL; } while ((nread = fread(chunk, 1, sizeof(chunk), input)) > 0) { if (len + nread + 1 > cap) { cap = (cap == 0) ? 8192 : cap * 2; if (cap < len + nread + 1) cap = len + nread + 1; char *tmp = realloc(buf, cap); if (!tmp) { free(buf); set_error(error, "", "Memory allocation failed"); return NULL; } buf = tmp; } memcpy(buf + len, chunk, nread); len += nread; } if (!buf) { set_error(error, "", "Empty input"); return NULL; } buf[len] = '\0'; result = jwt_json_parse(buf, flags, error); free(buf); return result; } libjwt-3.3.3/libjwt/jwks-curl.c000066400000000000000000000063671517612317300164150ustar00rootroot00000000000000/* Copyright (C) 2024-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include "jwt-private.h" #ifdef HAVE_LIBCURL #include struct jwks_data { char *buf; size_t size; size_t alloc_size; }; /* Maximum size we will accept for a JWKS response (1 MiB). */ #define JWKS_MAX_RESPONSE_SIZE (1024 * 1024) static size_t header_cb(char *buf, size_t size, size_t nmemb, void *ctx) { size_t total_size = size * nmemb; struct jwks_data *data = ctx; long content_length; char *endptr; if (strncasecmp(buf, "Content-Length:", 15)) return total_size; content_length = strtol(buf + 15, &endptr, 10); if (endptr == buf + 15 || content_length <= 0 || content_length > JWKS_MAX_RESPONSE_SIZE) return 0; data->alloc_size = (size_t)content_length; data->buf = jwt_malloc(data->alloc_size + 1); if (!data->buf) return 0; // LCOV_EXCL_LINE data->size = 0; data->buf[0] = '\0'; return total_size; } static size_t write_cb(void *contents, size_t size, size_t nmemb, void *ctx) { size_t total_size = size * nmemb; struct jwks_data *data = ctx; if (data->size + total_size > data->alloc_size) return 0; // LCOV_EXCL_LINE memcpy(&(data->buf[data->size]), contents, total_size); data->size += total_size; data->buf[data->size] = '\0'; return total_size; } static char *__curl_get(jwk_set_t *jwk_set, const char *url, size_t *len, int verify) { CURL *curl; CURLcode res; struct jwks_data data; memset(&data, 0, sizeof(data)); curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if (curl == NULL) { // LCOV_EXCL_START curl_global_cleanup(); return NULL; // LCOV_EXCL_STOP } curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_cb); curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void *)&data); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&data); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, (verify > 0) ? 2L : 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, (verify > 1) ? 1L : 0L); res = curl_easy_perform(curl); curl_easy_cleanup(curl); curl_global_cleanup(); if (res != CURLE_OK) { jwt_write_error(jwk_set, "%s", curl_easy_strerror(res)); return NULL; } *len = data.size; return data.buf; } jwk_set_t *jwks_load_fromurl(jwk_set_t *jwk_set, const char *url, int verify) { char *str = NULL; size_t len; if (url == NULL) return NULL; if (jwk_set == NULL) jwk_set = jwks_create(NULL); if (jwk_set == NULL) return NULL; // LCOV_EXCL_LINE str = __curl_get(jwk_set, url, &len, verify); if (str != NULL) { jwk_set = jwks_load_strn(jwk_set, str, len); jwt_freemem(str); } return jwk_set; } #else jwk_set_t *jwks_load_fromurl(jwk_set_t *jwk_set, const char *url, int verify) { (void)jwk_set; (void)url; (void)verify; return NULL; } #endif jwk_set_t *jwks_create_fromurl(const char *url, int verify) { return jwks_load_fromurl(NULL, url, verify); } libjwt-3.3.3/libjwt/jwks.c000066400000000000000000000275141517612317300154470ustar00rootroot00000000000000/* Copyright (C) 2024-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include "jwt-private.h" /* RFC-7517 4.3 */ static jwk_key_op_t jwk_key_op_j(jwt_json_t *j_op) { const char *op; if (!j_op || !jwt_json_is_string(j_op)) return JWK_KEY_OP_NONE; op = jwt_json_str_val(j_op); /* Should not be possible for this to happen. */ if (op == NULL) return JWK_KEY_OP_NONE; // LCOV_EXCL_LINE if (!strcmp(op, "sign")) return JWK_KEY_OP_SIGN; else if (!strcmp(op, "verify")) return JWK_KEY_OP_VERIFY; else if (!strcmp(op, "encrypt")) return JWK_KEY_OP_ENCRYPT; else if (!strcmp(op, "decrypt")) return JWK_KEY_OP_DECRYPT; else if (!strcmp(op, "wrapKey")) return JWK_KEY_OP_WRAP; else if (!strcmp(op, "unwrapKey")) return JWK_KEY_OP_UNWRAP; else if (!strcmp(op, "deriveKey")) return JWK_KEY_OP_DERIVE_KEY; else if (!strcmp(op, "deriveBits")) return JWK_KEY_OP_DERIVE_BITS; /* Ignore all others as the spec says other values may be used. */ return JWK_KEY_OP_NONE; } static void jwk_process_values(jwt_json_t *jwk, jwk_item_t *item) { jwt_json_t *j_use, *j_ops_a, *j_kid, *j_alg; /* Start with the ALG (4.4). */ j_alg = jwt_json_obj_get(jwk, "alg"); if (j_alg) { if (!jwt_json_is_string(j_alg)) { jwt_write_error(item, "Invalid alg type"); return; } item->alg = jwt_str_alg(jwt_json_str_val(j_alg)); } /* Check for use (4.2). */ j_use = jwt_json_obj_get(jwk, "use"); if (j_use && jwt_json_is_string(j_use)) { const char *use = jwt_json_str_val(j_use); if (!strcmp(use, "sig")) item->use = JWK_PUB_KEY_USE_SIG; else if (!strcmp(use, "enc")) item->use = JWK_PUB_KEY_USE_ENC; } /* Check for key_ops (4.3). */ j_ops_a = jwt_json_obj_get(jwk, "key_ops"); if (j_ops_a && jwt_json_is_array(j_ops_a)) { jwt_json_t *j_op; size_t i; jwt_json_arr_foreach(j_ops_a, i, j_op) item->key_ops |= jwk_key_op_j(j_op);; } /* Key ID (4.5). */ j_kid = jwt_json_obj_get(jwk, "kid"); if (j_kid && jwt_json_is_string(j_kid)) { const char *kid = jwt_json_str_val(j_kid); int len = strlen(kid); if (len) { item->kid = jwt_malloc(len + 1); if (item->kid == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error allocating memory for kid"); // LCOV_EXCL_STOP } else { // LCOV_EXCL_LINE strcpy(item->kid, kid); } } } } static int process_octet(jwt_json_t *jwk, jwk_item_t *item) { unsigned char *bin_k = NULL; const char *str_k; jwt_json_t *k; int len_k = 0; k = jwt_json_obj_get(jwk, "k"); if (k == NULL || !jwt_json_is_string(k)) { jwt_write_error(item, "Invalid JWK: missing `k`"); return -1; } str_k = jwt_json_str_val(k); if (str_k == NULL || !strlen(str_k)) { jwt_write_error(item, "Invalid JWK: invalid `k`"); return -1; } bin_k = jwt_base64uri_decode(str_k, &len_k); if (bin_k == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Invalid JWK: failed to decode `k`"); return -1; // LCOV_EXCL_STOP } item->is_private_key = 1; item->provider = JWT_CRYPTO_OPS_ANY; item->oct.key = bin_k; item->oct.len = len_k; item->bits = len_k * 8; return 0; } static jwk_item_t *jwk_process_one(jwk_set_t *jwk_set, jwt_json_t *jwk) { const char *kty; jwt_json_t *val; jwk_item_t *item; item = jwt_malloc(sizeof(*item)); if (item == NULL) { // LCOV_EXCL_START jwt_write_error(jwk_set, "Error allocating memory for jwk_item_t"); return NULL; // LCOV_EXCL_STOP } memset(item, 0, sizeof(*item)); item->json = jwt_json_clone(jwk); if (item->json == NULL) { // LCOV_EXCL_START jwt_freemem(jwk); jwt_write_error(jwk_set, "Error allocating memory for jwk_item_t"); return NULL; // LCOV_EXCL_STOP } val = jwt_json_obj_get(item->json, "kty"); if (val == NULL || !jwt_json_is_string(val)) { jwt_write_error(item, "Invalid JWK: missing kty value"); return item; } kty = jwt_json_str_val(val); if (!strcmp(kty, "EC")) { item->kty = JWK_KEY_TYPE_EC; jwt_ops->process_ec(item->json, item); } else if (!strcmp(kty, "RSA")) { item->kty = JWK_KEY_TYPE_RSA; jwt_ops->process_rsa(item->json, item); } else if (!strcmp(kty, "OKP")) { item->kty = JWK_KEY_TYPE_OKP; jwt_ops->process_eddsa(item->json, item); } else if (!strcmp(kty, "oct")) { item->kty = JWK_KEY_TYPE_OCT; process_octet(item->json, item); } else { jwt_write_error(item, "Unknown or unsupported kty type '%s'", kty); return item; } jwk_process_values(item->json, item); return item; } const jwk_item_t *jwks_item_get(const jwk_set_t *jwk_set, size_t index) { jwk_item_t *item = NULL; size_t i = 0; if (jwk_set == NULL) return NULL; list_for_each_entry(item, &jwk_set->head, node) { if (i == index) return item; i++; } return NULL; } int jwks_error_any(const jwk_set_t *jwk_set) { jwk_item_t *item = NULL; int count; if (jwk_set == NULL) return 1; count = jwk_set->error; list_for_each_entry(item, &jwk_set->head, node) { if (item->error) count++; } return count; } int jwks_item_is_private(const jwk_item_t *item) { return item->is_private_key ? 1 : 0; } int jwks_item_error(const jwk_item_t *item) { return item->error; } const char *jwks_item_error_msg(const jwk_item_t *item) { return item->error_msg; } const char *jwks_item_curve(const jwk_item_t *item) { return item->curve[0] ? item->curve : NULL; } const char *jwks_item_kid(const jwk_item_t *item) { return item->kid; } jwt_alg_t jwks_item_alg(const jwk_item_t *item) { return item->alg; } jwk_key_type_t jwks_item_kty(const jwk_item_t *item) { return item->kty; } jwk_pub_key_use_t jwks_item_use(const jwk_item_t *item) { return item->use; } jwk_key_op_t jwks_item_key_ops(const jwk_item_t *item) { return item->key_ops; } const char *jwks_item_pem(const jwk_item_t *item) { return item->pem; } int jwks_item_key_bits(const jwk_item_t *item) { return item->bits; } int jwks_item_key_oct(const jwk_item_t *item, const unsigned char **buf, size_t *len) { if (!item->oct.key || !item->oct.len) return 1; *buf = item->oct.key; *len = item->oct.len; return 0; } int jwks_error(const jwk_set_t *jwk_set) { if (jwk_set == NULL) return 1; return jwk_set->error ? 1 : 0; } const char *jwks_error_msg(const jwk_set_t *jwk_set) { if (jwk_set == NULL) return NULL; return jwk_set->error_msg; } void jwks_error_clear(jwk_set_t *jwk_set) { if (jwk_set == NULL) return; jwk_set->error = 0; memset(jwk_set->error_msg, 0, sizeof(jwk_set->error_msg)); } static int jwks_item_add(jwk_set_t *jwk_set, jwk_item_t *item) { list_add_tail(&item->node, &jwk_set->head); return 0; } jwk_item_t *jwks_find_bykid(jwk_set_t *jwk_set, const char *kid) { jwk_item_t *item = NULL; list_for_each_entry(item, &jwk_set->head, node) { if (item->kid == NULL || strcmp(item->kid, kid)) continue; return item; } return NULL; } static void __item_free(jwk_item_t *todel) { if (todel->provider == JWT_CRYPTO_OPS_ANY) jwt_scrub_and_free(todel->oct.key, todel->oct.len); else jwt_ops->process_item_free(todel); /* A few non-crypto specific things. */ jwt_freemem(todel->kid); jwt_json_releasep(&todel->json); list_del(&todel->node); /* Free the container and the item itself. */ jwt_freemem(todel); } int jwks_item_free(jwk_set_t *jwk_set, const size_t index) { jwk_item_t *item = NULL, *todel = NULL; size_t i = 0; if (jwk_set == NULL) return 0; list_for_each_entry(item, &jwk_set->head, node) { if (i == index) { todel = item; break; } i++; } if (todel == NULL) return 0; __item_free(todel); return 1; } size_t jwks_item_count(const jwk_set_t *jwk_set) { size_t count = 0; jwk_item_t *item = NULL; list_for_each_entry(item, &jwk_set->head, node) count++; return count; } int jwks_item_free_bad(jwk_set_t *jwk_set) { jwk_item_t *item, *pos; int count = 0; list_for_each_entry_safe(item, pos, &jwk_set->head, node) { if (!item->error) continue; __item_free(item); count++; } return count; } int jwks_item_free_all(jwk_set_t *jwk_set) { int i; if (jwk_set == NULL) return 0; for (i = 0; jwks_item_free(jwk_set, 0); i++) /* do nothing */; return i; } void jwks_free(jwk_set_t *jwk_set) { if (jwk_set == NULL) return; jwks_item_free_all(jwk_set); jwt_freemem(jwk_set); } static jwk_set_t *jwks_new(void) { jwk_set_t *jwk_set; jwk_set = jwt_malloc(sizeof *jwk_set); if (jwk_set == NULL) return NULL; // LCOV_EXCL_LINE memset(jwk_set, 0, sizeof(*jwk_set)); INIT_LIST_HEAD(&jwk_set->head); return jwk_set; } static jwk_set_t *jwks_process(jwk_set_t *jwk_set, jwt_json_t *j_all, jwt_json_error_t *error) { jwt_json_t *j_array = NULL, *j_item = NULL; jwk_item_t *jwk_item; size_t i; if (j_all == NULL) { jwt_write_error(jwk_set, "%s: %s", error->source, error->text); return jwk_set; } /* Check for "keys" as in a JWKS */ j_array = jwt_json_obj_get(j_all, "keys"); if (j_array == NULL) { /* Assume a single JSON Object for one JWK */ jwk_item = jwk_process_one(jwk_set, j_all); if (jwk_item != NULL) jwks_item_add(jwk_set, jwk_item); } else { /* We have a list, so parse them all. */ jwt_json_arr_foreach(j_array, i, j_item) { jwk_item = jwk_process_one(jwk_set, j_item); if (jwk_item != NULL) jwks_item_add(jwk_set, jwk_item); } } return jwk_set; } static jwk_set_t *__jwks_load_strn(jwk_set_t *jwk_set, const char *jwk_json_str, const size_t len, int empty_allowed) { jwt_json_auto_t *j_all = NULL; jwt_json_error_t error; if (jwk_json_str == NULL && !empty_allowed) return NULL; if (jwk_set == NULL) jwk_set = jwks_new(); if (jwk_set == NULL) return NULL; // LCOV_EXCL_LINE /* Just an empty set */ if (jwk_json_str == NULL) return jwk_set; /* Parse the JSON string. */ j_all = jwt_json_parse_buf(jwk_json_str, len, JWT_JSON_DECODE_ANY, &error); return jwks_process(jwk_set, j_all, &error); } jwk_set_t *jwks_load_strn(jwk_set_t *jwk_set, const char *jwk_json_str, const size_t len) { return __jwks_load_strn(jwk_set, jwk_json_str, len, 0); } jwk_set_t *jwks_load(jwk_set_t *jwk_set, const char *jwk_json_str) { size_t len; if (jwk_json_str == NULL) return NULL; len = strlen(jwk_json_str); return __jwks_load_strn(jwk_set, jwk_json_str, len, 0); } jwk_set_t *jwks_load_fromfile(jwk_set_t *jwk_set, const char *file_name) { jwt_json_auto_t *j_all = NULL; jwt_json_error_t error; if (file_name == NULL) return NULL; if (jwk_set == NULL) jwk_set = jwks_new(); if (jwk_set == NULL) return NULL; // LCOV_EXCL_LINE /* Parse the JSON string. */ j_all = jwt_json_parse_file(file_name, JWT_JSON_DECODE_ANY, &error); return jwks_process(jwk_set, j_all, &error); } jwk_set_t *jwks_load_fromfp(jwk_set_t *jwk_set, FILE *input) { jwt_json_auto_t *j_all = NULL; jwt_json_error_t error; if (input == NULL) return NULL; if (jwk_set == NULL) jwk_set = jwks_new(); if (jwk_set == NULL) return NULL; // LCOV_EXCL_LINE /* Parse the JSON string. */ j_all = jwt_json_parse_fp(input, JWT_JSON_DECODE_ANY, &error); return jwks_process(jwk_set, j_all, &error); } jwk_set_t *jwks_create(const char *jwk_json_str) { int len = 0; if (jwk_json_str != NULL) len = strlen(jwk_json_str); return __jwks_load_strn(NULL, jwk_json_str, len, 1); } jwk_set_t *jwks_create_strn(const char *jwk_json_str, const size_t len) { return jwks_load_strn(NULL, jwk_json_str, len); } jwk_set_t *jwks_create_fromfile(const char *file_name) { return jwks_load_fromfile(NULL, file_name); } jwk_set_t *jwks_create_fromfp(FILE *input) { return jwks_load_fromfp(NULL, input); } libjwt-3.3.3/libjwt/jwt-builder.c000066400000000000000000000007131517612317300167110ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include "jwt-private.h" #include "jwt-builder.i" libjwt-3.3.3/libjwt/jwt-checker.c000066400000000000000000000007131517612317300166670ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include "jwt-private.h" #include "jwt-checker.i" libjwt-3.3.3/libjwt/jwt-common.c000066400000000000000000000237021517612317300165560ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* XXX This file is used to generate jwt-builder.i and jwt-checker.i */ #ifdef JWT_BUILDER #define jwt_common_t jwt_builder_t #define FUNC(__x) jwt_builder_##__x #define CLAIMS_DEF JWT_CLAIM_IAT #define __DISABLE 0 #endif #ifdef JWT_CHECKER #define jwt_common_t jwt_checker_t #define FUNC(__x) jwt_checker_##__x #define CLAIMS_DEF (JWT_CLAIM_EXP | JWT_CLAIM_NBF) #define __DISABLE -1 #endif #ifndef jwt_common_t #error Must have target defined #endif void FUNC(free)(jwt_common_t *__cmd) { if (__cmd == NULL) return; jwt_json_release(__cmd->c.payload); jwt_json_release(__cmd->c.headers); memset(__cmd, 0, sizeof(*__cmd)); jwt_freemem(__cmd); } jwt_common_t *FUNC(new)(void) { jwt_common_t *__cmd = jwt_malloc(sizeof(*__cmd)); if (__cmd == NULL) return NULL; // LCOV_EXCL_LINE memset(__cmd, 0, sizeof(*__cmd)); __cmd->c.payload = jwt_json_create(); __cmd->c.headers = jwt_json_create(); __cmd->c.claims = CLAIMS_DEF; if (!__cmd->c.payload || !__cmd->c.headers) { // LCOV_EXCL_START jwt_json_release(__cmd->c.payload); jwt_json_release(__cmd->c.headers); jwt_freemem(__cmd); // LCOV_EXCL_STOP } return __cmd; } static int __setkey_check(jwt_common_t *__cmd, const jwt_alg_t alg, const jwk_item_t *key) { if (__cmd == NULL) return 1; #ifdef JWT_BUILDER if (key && !key->is_private_key) { jwt_write_error(__cmd, "Signing requires a private key"); return 1; } #endif /* TODO: Check key_ops and use */ if (key == NULL) { if (alg == JWT_ALG_NONE) return 0; jwt_write_error(__cmd, "Cannot set alg without a key"); return 1; } /* Bind algorithm to the JWK's actual key type, not just the * optional "alg" hint. The "alg" parameter on a JWK is optional * (RFC 7517 4.4), so we must never let its absence widen what a * key can be used for. */ if (alg != JWT_ALG_NONE && jwt_alg_required_kty(alg) != key->kty) { jwt_write_error(__cmd, "Key type does not match algorithm"); return 1; } if (key->alg == JWT_ALG_NONE) { if (alg != JWT_ALG_NONE) return 0; jwt_write_error(__cmd, "Key provided, but could not find alg"); } else { if (alg == JWT_ALG_NONE) return 0; if (alg == key->alg) return 0; jwt_write_error(__cmd, "Alg mismatch"); } return 1; } int FUNC(setkey)(jwt_common_t *__cmd, const jwt_alg_t alg, const jwk_item_t *key) { if (__setkey_check(__cmd, alg, key)) return 1; __cmd->c.alg = alg; __cmd->c.key = key; return 0; } int FUNC(error)(const jwt_common_t *__cmd) { if (__cmd == NULL) return 1; return __cmd->error ? 1 : 0; } const char *FUNC(error_msg)(const jwt_common_t *__cmd) { if (__cmd == NULL) return NULL; return __cmd->error_msg; } void FUNC(error_clear)(jwt_common_t *__cmd) { if (__cmd == NULL) return; __cmd->error = 0; __cmd->error_msg[0] = '\0'; } #ifdef JWT_BUILDER int FUNC(enable_iat)(jwt_common_t *__cmd, int enable) { int orig; if (!__cmd) return -1; orig = __cmd->c.claims & JWT_CLAIM_IAT ? 1 : 0; if (enable) __cmd->c.claims |= JWT_CLAIM_IAT; else __cmd->c.claims &= ~JWT_CLAIM_IAT; return orig; } #endif int FUNC(setcb)(jwt_common_t *__cmd, jwt_callback_t cb, void *ctx) { if (__cmd == NULL) return 1; /* This just updates the CTX */ if (cb == NULL && __cmd->c.cb != NULL && ctx != NULL) { __cmd->c.cb_ctx = ctx; return 0; } if (cb == NULL && ctx != NULL) { jwt_write_error(__cmd, "Setting ctx without a cb won't work"); return 1; } __cmd->c.cb = cb; __cmd->c.cb_ctx = ctx; return 0; } void *FUNC(getctx)(jwt_common_t *__cmd) { if (__cmd == NULL) return NULL; return __cmd->c.cb_ctx; } typedef enum { __HEADER, __CLAIM, } _setget_type_t; typedef jwt_value_error_t (*__doer_t)(jwt_json_t *, jwt_value_t *); static jwt_value_error_t __run_it(jwt_common_t *__cmd, _setget_type_t type, jwt_value_t *value, __doer_t doer) { jwt_json_t *which = NULL; #ifdef JWT_BUILDER if (!__cmd || !value) { if (value) return value->error = JWT_VALUE_ERR_INVALID; return JWT_VALUE_ERR_INVALID; } #endif switch (type) { #ifdef JWT_BUILDER case __HEADER: which = __cmd->c.headers; break; #endif case __CLAIM: which = __cmd->c.payload; break; // LCOV_EXCL_START default: return value->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_STOP } return doer(which, value); } #ifdef JWT_BUILDER /* Claims */ jwt_value_error_t FUNC(claim_get)(jwt_common_t *__cmd, jwt_value_t *value) { return __run_it(__cmd, __CLAIM, value, __getter); } jwt_value_error_t FUNC(claim_set)(jwt_common_t *__cmd, jwt_value_t *value) { return __run_it(__cmd, __CLAIM, value, __setter); } jwt_value_error_t FUNC(claim_del)(jwt_common_t *__cmd, const char *claim) { if (!__cmd) return JWT_VALUE_ERR_INVALID; return __deleter(__cmd->c.payload, claim); } /* Headers */ jwt_value_error_t FUNC(header_get)(jwt_common_t *__cmd, jwt_value_t *value) { return __run_it(__cmd, __HEADER, value, __getter); } jwt_value_error_t FUNC(header_set)(jwt_common_t *__cmd, jwt_value_t *value) { return __run_it(__cmd, __HEADER, value, __setter); } jwt_value_error_t FUNC(header_del)(jwt_common_t *__cmd, const char *header) { if (!__cmd) return JWT_VALUE_ERR_INVALID; return __deleter(__cmd->c.headers, header); } #endif #ifdef JWT_CHECKER /* Just a few types of claims */ static const char *__get_name(jwt_claims_t type) { if (type == JWT_CLAIM_ISS) return "iss"; else if (type == JWT_CLAIM_AUD) return "aud"; else if (type == JWT_CLAIM_SUB) return "sub"; return NULL; } const char *FUNC(claim_get)(jwt_common_t *__cmd, jwt_claims_t type) { const char *name = NULL; jwt_value_t jval; if (!__cmd) return NULL; name = __get_name(type); if (name == NULL) return NULL; jwt_set_GET_STR(&jval, name); __run_it(__cmd, __CLAIM, &jval, __getter); /* Ignore errors, just return a string or NULL */ return jval.str_val; } int FUNC(claim_set)(jwt_common_t *__cmd, jwt_claims_t type, const char *value) { const char *name = NULL; jwt_value_t jval; if (!__cmd || !value) return 1; name = __get_name(type); if (name == NULL) return 1; __cmd->c.claims |= type; jwt_set_SET_STR(&jval, name, value); jval.replace = 1; return __run_it(__cmd, __CLAIM, &jval, __setter) ? 1 : 0; } int FUNC(claim_del)(jwt_common_t *__cmd, jwt_claims_t type) { const char *name = NULL; if (!__cmd) return 1; name = __get_name(type); if (name == NULL) return 1; __cmd->c.claims &= ~type; return __deleter(__cmd->c.payload, name); } #endif /* Time offsets */ #ifdef JWT_BUILDER int FUNC(time_offset)(jwt_common_t *__cmd, jwt_claims_t claim, time_t secs) #endif #ifdef JWT_CHECKER int FUNC(time_leeway)(jwt_common_t *__cmd, jwt_claims_t claim, time_t secs) #endif { if (!__cmd) return 1; switch (claim) { case JWT_CLAIM_EXP: __cmd->c.exp = secs; break; case JWT_CLAIM_NBF: __cmd->c.nbf = secs; break; default: return 1; } if (secs <= __DISABLE) __cmd->c.claims &= ~claim; else __cmd->c.claims |= claim; return 0; } #ifdef JWT_CHECKER int FUNC(verify)(jwt_common_t *__cmd, const char *token) { JWT_CONFIG_DECLARE(config); unsigned int payload_len; jwt_auto_t *jwt = NULL; if (__cmd == NULL) return 1; if (token == NULL || !strlen(token)) { jwt_write_error(__cmd, "Must pass a token"); return 1; } jwt = jwt_new(); if (jwt == NULL) { // LCOV_EXCL_START jwt_write_error(__cmd, "Could not allocate JWT object"); return 1; // LCOV_EXCL_STOP } /* First parsing pass, error will be set for us */ if (jwt_parse(jwt, token, &payload_len)) { jwt_copy_error(__cmd, jwt); return 1; }; config.key = __cmd->c.key; config.alg = __cmd->c.alg; config.ctx = __cmd->c.cb_ctx; /* Let the user handle this and update config */ if (__cmd->c.cb && __cmd->c.cb(jwt, &config)) { jwt_write_error(__cmd, "User callback returned error"); return 1; } /* Callback may have changed this */ if (__setkey_check(__cmd, config.alg, config.key)) return 1; jwt->key = config.key; jwt->checker = __cmd; /* Finish it up */ jwt = jwt_verify_complete(jwt, &config, token, payload_len); /* Copy any errors back */ jwt_copy_error(__cmd, jwt); return __cmd->error; } #endif #ifdef JWT_BUILDER char *FUNC(generate)(jwt_common_t *__cmd) { JWT_CONFIG_DECLARE(config); jwt_auto_t *jwt = NULL; char *out = NULL; jwt_value_t jval; time_t tm = time(NULL); if (__cmd == NULL) return NULL; jwt = jwt_malloc(sizeof(*jwt)); if (jwt == NULL) return NULL; // LCOV_EXCL_LINE memset(jwt, 0, sizeof(*jwt)); jwt->headers = jwt_json_clone(__cmd->c.headers); jwt->claims = jwt_json_clone(__cmd->c.payload); /* Our internal work first */ if (__cmd->c.claims & JWT_CLAIM_IAT) { jwt_set_SET_INT(&jval, "iat", (jwt_long_t)tm); jval.replace = 1; jwt_claim_set(jwt, &jval); } if (__cmd->c.claims & JWT_CLAIM_NBF) { jwt_set_SET_INT(&jval, "nbf", (jwt_long_t)(tm + __cmd->c.nbf)); jval.replace = 1; jwt_claim_set(jwt, &jval); } if (__cmd->c.claims & JWT_CLAIM_EXP) { jwt_set_SET_INT(&jval, "exp", (jwt_long_t)(tm + __cmd->c.exp)); jval.replace = 1; jwt_claim_set(jwt, &jval); } /* Alg and key checks */ config.alg = __cmd->c.alg; if (config.alg == JWT_ALG_NONE && __cmd->c.key) config.alg = __cmd->c.key->alg; config.key = __cmd->c.key; config.ctx = __cmd->c.cb_ctx; /* Let the callback do it's thing */ if (__cmd->c.cb && __cmd->c.cb(jwt, &config)) { jwt_write_error(__cmd, "User callback returned error"); return NULL; } /* Callback may have changed this */ if (__setkey_check(__cmd, config.alg, config.key)) { jwt_write_error(__cmd, "Algorithm and key returned by callback invalid"); return NULL; } jwt->alg = config.alg; jwt->key = config.key; if (jwt_head_setup(jwt)) return NULL; // LCOV_EXCL_LINE out = jwt_encode_str(jwt); jwt_copy_error(__cmd, jwt); return out; } #endif libjwt-3.3.3/libjwt/jwt-crypto-ops.c000066400000000000000000000046151517612317300174070ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include "jwt-private.h" /* Library init functionality */ static struct jwt_crypto_ops *jwt_ops_available[] = { #ifdef HAVE_OPENSSL &jwt_openssl_ops, #endif #ifdef HAVE_GNUTLS &jwt_gnutls_ops, #endif #ifdef HAVE_MBEDTLS &jwt_mbedtls_ops, #endif NULL, }; JWT_NO_EXPORT #if defined HAVE_OPENSSL struct jwt_crypto_ops *jwt_ops = &jwt_openssl_ops; #elif defined HAVE_GNUTLS struct jwt_crypto_ops *jwt_ops = &jwt_gnutls_ops; #elif defined HAVE_MBEDTLS struct jwt_crypto_ops *jwt_ops = &jwt_mbedtls_ops; #else #error No crypto ops providers are enabled #endif const char *jwt_get_crypto_ops(void) { if (jwt_ops == NULL) return "(unknown)"; // LCOV_EXCL_LINE return jwt_ops->name; } jwt_crypto_provider_t jwt_get_crypto_ops_t(void) { if (jwt_ops == NULL) return JWT_CRYPTO_OPS_NONE; // LCOV_EXCL_LINE return jwt_ops->provider; } int jwt_set_crypto_ops_t(jwt_crypto_provider_t opname) { int i; /* The user asked for something, let's give it a try */ for (i = 0; jwt_ops_available[i] != NULL; i++) { if (jwt_ops_available[i]->provider != opname) continue; jwt_ops = jwt_ops_available[i]; return 0; } return 1; } int jwt_set_crypto_ops(const char *opname) { int i; /* The user asked for something, let's give it a try */ for (i = 0; jwt_ops_available[i] != NULL; i++) { if (strcmp(jwt_ops_available[i]->name, opname)) continue; jwt_ops = jwt_ops_available[i]; return 0; } return 1; } int jwt_crypto_ops_supports_jwk(void) { return jwt_ops->jwk_implemented ? 1 : 0; } JWT_CONSTRUCTOR void jwt_init() { #if defined(__GLIBC__) const char *opname = secure_getenv("JWT_CRYPTO"); #else const char *opname = getenv("JWT_CRYPTO"); #endif /* By default, we choose the top spot */ if (opname == NULL || opname[0] == '\0') { jwt_ops = jwt_ops_available[0]; return; } /* Attempt to set ops */ if (jwt_set_crypto_ops(opname)) { jwt_ops = jwt_ops_available[0]; fprintf(stderr, "LibJWT: No such crypto ops [%s], falling back to [%s]\n", opname, jwt_ops->name); } } libjwt-3.3.3/libjwt/jwt-encode.c000066400000000000000000000075161517612317300165300ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include "jwt-private.h" static int write_js(const jwt_json_t *js, char **buf) { *buf = jwt_json_serialize(js, JWT_JSON_SORT_KEYS | JWT_JSON_COMPACT); return *buf == NULL ? 1 : 0; } int jwt_head_setup(jwt_t *jwt) { jwt_value_t jval; if (jwt->alg != JWT_ALG_NONE) { /* Only set default 'typ' header if it has not been defined, * allowing for any value of it. This allows for signaling * of application specific extensions to JWT, such as PASSporT, * RFC 8225. */ jwt_set_SET_STR(&jval, "typ", "JWT"); if (jwt_header_set(jwt, &jval)) { if (jval.error != JWT_VALUE_ERR_EXIST) { // LCOV_EXCL_START jwt_write_error(jwt, "Error setting \"typ\" in header"); return 1; // LCOV_EXCL_STOP } } } jwt_set_SET_STR(&jval, "alg", jwt_alg_str(jwt->alg)); jval.replace = 1; if (jwt_header_set(jwt, &jval)) { // LCOV_EXCL_START jwt_write_error(jwt, "Error setting \"alg\" in header"); return 1; // LCOV_EXCL_STOP } return 0; } static int jwt_encode(jwt_t *jwt, char **out) { char_auto *head = NULL, *payload = NULL, *sig = NULL; char *buf = NULL; int ret, head_len, payload_len; unsigned int sig_len; if (out == NULL) { // LCOV_EXCL_START jwt_write_error(jwt, "No string passed to write out to"); return 1; // LCOV_EXCL_STOP } *out = NULL; /* First the header. */ ret = write_js(jwt->headers, &buf); if (ret) return 1; // LCOV_EXCL_LINE /* Encode it */ head_len = jwt_base64uri_encode(&head, buf, (int)strlen(buf)); jwt_freemem(buf); if (head_len <= 0) { // LCOV_EXCL_START jwt_write_error(jwt, "Error encoding header"); return 1; // LCOV_EXCL_STOP } /* Now the payload. */ ret = write_js(jwt->claims, &buf); if (ret) { // LCOV_EXCL_START jwt_write_error(jwt, "Error writing payload"); return 1; // LCOV_EXCL_STOP } payload_len = jwt_base64uri_encode(&payload, buf, (int)strlen(buf)); jwt_freemem(buf); if (payload_len <= 0) { // LCOV_EXCL_START jwt_write_error(jwt, "Error encoding payload"); return 1; // LCOV_EXCL_STOP } /* The part we need to sign, but add space for 2 dots and a nil */ buf = jwt_malloc(head_len + payload_len + 3); if (buf == NULL) { // LCOV_EXCL_START jwt_write_error(jwt, "Error allocating memory"); return 1; // LCOV_EXCL_STOP } strcpy(buf, head); strcat(buf, "."); strcat(buf, payload); if (jwt->alg == JWT_ALG_NONE) { /* Add the trailing dot, and send it back */ strcat(buf, "."); *out = buf; return 0; } /* At this point buf has "head.payload" */ /* Now the signature. */ ret = jwt_sign(jwt, &sig, &sig_len, buf, strlen(buf)); jwt_freemem(buf); if (ret) { // LCOV_EXCL_START jwt_write_error(jwt, "Error allocating memory"); return ret; // LCOV_EXCL_STOP } ret = jwt_base64uri_encode(&buf, sig, sig_len); /* At this point buf has b64 of sig and ret is size of it */ if (ret < 0) { // LCOV_EXCL_START jwt_write_error(jwt, "Error allocating memory"); return 1; // LCOV_EXCL_STOP } /* plus 2 dots and a nil */ ret = strlen(head) + strlen(payload) + strlen(buf) + 3; /* We're good, so let's get it all together */ *out = jwt_malloc(ret); // LCOV_EXCL_START if (*out == NULL) { jwt_write_error(jwt, "Error allocating memory"); ret = 1; } else { sprintf(*out, "%s.%s.%s", head, payload, buf); ret = 0; } // LCOV_EXCL_STOP jwt_freemem(buf); return ret; } char *jwt_encode_str(jwt_t *jwt) { char *str = NULL; if (jwt_encode(jwt, &str)) jwt_freemem(str); return str; } libjwt-3.3.3/libjwt/jwt-json-ops.h000066400000000000000000000127371517612317300170510ustar00rootroot00000000000000/* Copyright (C) 2026 Ramin Seyed Moussavi, Yacoub Automation GmbH This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * JSON backend abstraction for libjwt. * * Common interface header for all JSON backends (jansson, json-c). * Each backend provides a .c file implementing these functions. */ #ifndef JWT_JSON_OPS_H #define JWT_JSON_OPS_H #include #include #include #include /* ================================================================ * Types * ================================================================ */ /** Opaque JSON type - backends cast internally to the real lib struct */ typedef struct jwt_json_s jwt_json_t; typedef int64_t jwt_json_int_t; #define JWT_JSON_ERROR_TEXT_LENGTH 160 #define JWT_JSON_ERROR_SOURCE_LENGTH 80 typedef struct { char text[JWT_JSON_ERROR_TEXT_LENGTH]; char source[JWT_JSON_ERROR_SOURCE_LENGTH]; int line; int column; size_t position; } jwt_json_error_t; /* ================================================================ * Flags * ================================================================ */ /* Encoding */ #define JWT_JSON_INDENT(n) ((n) & 0x1F) #define JWT_JSON_COMPACT 0x20 #define JWT_JSON_SORT_KEYS 0x80 /* Decoding */ #define JWT_JSON_REJECT_DUPLICATES 0x01 #define JWT_JSON_DECODE_ANY 0x08 /* ================================================================ * Memory allocator override * ================================================================ */ JWT_NO_EXPORT void jwt_json_set_alloc(void *(*alloc_func)(size_t), void (*free_func)(void *)); /* ================================================================ * Reference counting & auto cleanup * ================================================================ */ JWT_NO_EXPORT void jwt_json_releasep(jwt_json_t **json); #define jwt_json_auto_t jwt_json_t __attribute__((cleanup(jwt_json_releasep))) JWT_NO_EXPORT void jwt_json_release(jwt_json_t *json); /* ================================================================ * Object creation * ================================================================ */ JWT_NO_EXPORT jwt_json_t *jwt_json_create(void); JWT_NO_EXPORT jwt_json_t *jwt_json_create_arr(void); JWT_NO_EXPORT jwt_json_t *jwt_json_create_str(const char *value); JWT_NO_EXPORT jwt_json_t *jwt_json_create_int(jwt_json_int_t value); JWT_NO_EXPORT jwt_json_t *jwt_json_create_bool(int value); /* ================================================================ * Object operations * ================================================================ */ JWT_NO_EXPORT jwt_json_t *jwt_json_obj_get(const jwt_json_t *object, const char *key); JWT_NO_EXPORT int jwt_json_obj_set(jwt_json_t *object, const char *key, jwt_json_t *value); JWT_NO_EXPORT int jwt_json_obj_del(jwt_json_t *object, const char *key); JWT_NO_EXPORT int jwt_json_obj_clear(jwt_json_t *object); JWT_NO_EXPORT int jwt_json_obj_merge(jwt_json_t *object, jwt_json_t *other); JWT_NO_EXPORT int jwt_json_obj_merge_new(jwt_json_t *object, jwt_json_t *other); /* ================================================================ * Array operations * ================================================================ */ JWT_NO_EXPORT size_t jwt_json_arr_size(const jwt_json_t *array); JWT_NO_EXPORT jwt_json_t *jwt_json_arr_get(const jwt_json_t *array, size_t index); JWT_NO_EXPORT int jwt_json_arr_append(jwt_json_t *array, jwt_json_t *value); #define jwt_json_arr_foreach(array, index, value) \ for ((index) = 0; \ (index) < jwt_json_arr_size(array) && \ ((value) = jwt_json_arr_get((array), (index))); \ (index)++) /* ================================================================ * Type checking * ================================================================ */ JWT_NO_EXPORT int jwt_json_is_array(const jwt_json_t *json); JWT_NO_EXPORT int jwt_json_is_string(const jwt_json_t *json); JWT_NO_EXPORT int jwt_json_is_int(const jwt_json_t *json); JWT_NO_EXPORT int jwt_json_is_bool(const jwt_json_t *json); JWT_NO_EXPORT int jwt_json_is_true(const jwt_json_t *json); /* ================================================================ * Value extraction * ================================================================ */ JWT_NO_EXPORT const char *jwt_json_str_val(const jwt_json_t *json); JWT_NO_EXPORT jwt_json_int_t jwt_json_int_val(const jwt_json_t *json); /* ================================================================ * Deep copy * ================================================================ */ JWT_NO_EXPORT jwt_json_t *jwt_json_clone(const jwt_json_t *value); /* ================================================================ * Serialization / Parsing * ================================================================ */ JWT_NO_EXPORT char *jwt_json_serialize(const jwt_json_t *json, size_t flags); JWT_NO_EXPORT jwt_json_t *jwt_json_parse(const char *input, size_t flags, jwt_json_error_t *error); JWT_NO_EXPORT jwt_json_t *jwt_json_parse_buf(const char *buffer, size_t buflen, size_t flags, jwt_json_error_t *error); JWT_NO_EXPORT jwt_json_t *jwt_json_parse_file(const char *path, size_t flags, jwt_json_error_t *error); JWT_NO_EXPORT jwt_json_t *jwt_json_parse_fp(FILE *input, size_t flags, jwt_json_error_t *error); #endif /* JWT_JSON_OPS_H */ libjwt-3.3.3/libjwt/jwt-memory.c000066400000000000000000000021641517612317300165750ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include "jwt-private.h" static jwt_malloc_t pfn_malloc; static jwt_free_t pfn_free; void *jwt_malloc(size_t size) { if (pfn_malloc) return pfn_malloc(size); return malloc(size); } int jwt_set_alloc(jwt_malloc_t pmalloc, jwt_free_t pfree) { /* Set allocator functions for LibJWT. */ pfn_malloc = pmalloc; pfn_free = pfree; /* Set same allocator functions for JSON backend. */ jwt_json_set_alloc(jwt_malloc, __jwt_freemem); return 0; } void jwt_get_alloc(jwt_malloc_t *pmalloc, jwt_free_t *pfree) { if (pmalloc) *pmalloc = pfn_malloc; if (pfree) *pfree = pfn_free; } /* Should call the macros instead */ void __jwt_freemem(void *ptr) { if (pfn_free) pfn_free(ptr); else free(ptr); } libjwt-3.3.3/libjwt/jwt-private.h000066400000000000000000000175271517612317300167550ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef JWT_PRIVATE_H #define JWT_PRIVATE_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "jwt-json-ops.h" #include #include #include #include "ll.h" #ifndef ARRAY_SIZE # ifdef __GNUC__ # define ARRAY_SIZE(__arr) (sizeof(__arr) / sizeof((__arr)[0]) + \ __builtin_types_compatible_p(typeof(__arr), typeof(&(__arr)[0])) * 0) # else # define ARRAY_SIZE(__arr) (sizeof(__arr) / sizeof((__arr)[0])) # endif #endif #define JWT_CONFIG_DECLARE(__name) \ jwt_config_t __name = { NULL, JWT_ALG_NONE, NULL} #define JWT_ERR_LEN 256 JWT_NO_EXPORT extern struct jwt_crypto_ops *jwt_ops; /* This can be used on anything with an error and error_msg field */ #define jwt_write_error(__obj, __fmt, __args...) \ ({ \ if (!strlen((__obj)->error_msg)) \ snprintf((__obj)->error_msg, \ sizeof((__obj)->error_msg), \ __fmt, ##__args); \ (__obj)->error = 1; \ }) #define jwt_copy_error(__dst, __src) \ ({ \ strncpy((__dst)->error_msg, (__src)->error_msg, \ sizeof((__dst)->error_msg) - 1); \ (__dst)->error_msg[sizeof((__dst)->error_msg) - 1] = '\0'; \ (__dst)->error = (__src)->error; \ }) /******************************/ struct jwt_common { jwt_alg_t alg; const jwk_item_t *key; jwt_json_t *payload; jwt_json_t *headers; jwt_claims_t claims; jwt_callback_t cb; void *cb_ctx; /* For builder, this is offset into the future. * For checker, this is the leeway. * Both are in seconds. */ time_t exp; time_t nbf; }; struct jwt_builder { struct jwt_common c; int error; char error_msg[JWT_ERR_LEN]; }; struct jwt_checker { struct jwt_common c; int error; char error_msg[JWT_ERR_LEN]; }; /*****************************/ struct jwt { const jwk_item_t *key; jwt_json_t *claims; jwt_json_t *headers; jwt_alg_t alg; int error; char error_msg[JWT_ERR_LEN]; union { struct jwt_checker *checker; struct jwt_builder *builder; }; }; struct jwk_set { ll_t head; int error; char error_msg[JWT_ERR_LEN]; }; /** * This data structure is produced by importing a JWK or JWKS into a * @ref jwk_set_t object. Generally, you would not change any values here * and only use this to probe the internal parser and possibly to * decide whether a key applies to certain jwt_t for verification * or signing. * * If the jwk_item_t.pem field is not NULL, then it contains a nil terminated * string of the key. The underlying crypto algorithm may or may not support * this. It's provided as a convenience. */ struct jwk_item { ll_t node; char *pem; /**< If not NULL, contains PEM string of this key */ jwt_crypto_provider_t provider; /**< Crypto provider that owns this key */ union { void *provider_data; /**< Internal data used by the provider */ struct { void *key; /**< Used for HMAC key material */ size_t len; /**< Length of HMAC key material */ } oct; }; int is_private_key; /**< Whether this is a public or private key */ char curve[256]; /**< Curve name of an ``"EC"`` or ``"OKP"`` key */ size_t bits; /**< The number of bits in the key (may be 0) */ int error; /**< There was an error parsing this key (unusable) */ char error_msg[JWT_ERR_LEN];/**< Descriptive message for @ref jwk_item_t.error */ jwk_key_type_t kty; /**< @rfc{7517,4.1} The key type of this key */ jwk_pub_key_use_t use; /**< @rfc{7517,4.2} How this key can be used */ jwk_key_op_t key_ops; /**< @rfc{7517,4.3} Key operations supported */ jwt_alg_t alg; /**< @rfc{7517,4.4} JWA Algorithm supported */ char *kid; /**< @rfc{7517,4.5} Key ID */ jwt_json_t *json; /**< The jwt_json_t for this key */ }; /* Crypto operations */ struct jwt_crypto_ops { const char *name; jwt_crypto_provider_t provider; /* Signing/Verifying */ int (*sign_sha_hmac)(jwt_t *jwt, char **out, unsigned int *len, const char *str, unsigned int str_len); /* Verifying hmac is basically signing the current token and cmparing * the signatures. */ int (*sign_sha_pem)(jwt_t *jwt, char **out, unsigned int *len, const char *str, unsigned int str_len); int (*verify_sha_pem)(jwt_t *jwt, const char *head, unsigned int head_len, unsigned char *sig, int sig_len); /* Parsing a JWK to prepare it for use */ int jwk_implemented; int (*process_eddsa)(jwt_json_t *jwk, jwk_item_t *item); int (*process_rsa)(jwt_json_t *jwk, jwk_item_t *item); int (*process_ec)(jwt_json_t *jwk, jwk_item_t *item); void (*process_item_free)(jwk_item_t *item); }; #ifdef HAVE_OPENSSL JWT_NO_EXPORT extern struct jwt_crypto_ops jwt_openssl_ops; #endif #ifdef HAVE_GNUTLS JWT_NO_EXPORT extern struct jwt_crypto_ops jwt_gnutls_ops; #endif #ifdef HAVE_MBEDTLS JWT_NO_EXPORT extern struct jwt_crypto_ops jwt_mbedtls_ops; #endif /* Memory allocators. */ JWT_NO_EXPORT void *jwt_malloc(size_t size); JWT_NO_EXPORT void __jwt_freemem(void *ptr); JWT_NO_EXPORT jwt_t *jwt_new(void); #define jwt_freemem(__ptr) ({ \ if (__ptr) { \ __jwt_freemem(__ptr); \ __ptr = NULL; \ } \ }) /* Scrub and free sensitive key material. Uses OPENSSL_cleanse which is * available on all platforms (OpenSSL >= 3.0 is always required). */ #define jwt_scrub_and_free(__ptr, __len) ({ \ if (__ptr) \ OPENSSL_cleanse(__ptr, __len); \ jwt_freemem(__ptr); \ }) static inline void jwt_freememp(char **mem) { jwt_freemem(*mem); } #define char_auto char __attribute__((cleanup(jwt_freememp))) JWT_NO_EXPORT void jwt_free(jwt_t *jwt); static inline void jwt_freep(jwt_t **jwt) { if (jwt) { jwt_free(*jwt); *jwt = NULL; } } #define jwt_auto_t jwt_t __attribute__((cleanup(jwt_freep))) /* Helper routines to handle base64url encoding without percent padding * as defined in RFC-4648. */ JWT_NO_EXPORT int jwt_base64uri_encode(char **_dst, const char *plain, int plain_len); JWT_NO_EXPORT void *jwt_base64uri_decode(const char *src, int *ret_len); JWT_NO_EXPORT jwt_t *jwt_verify_sig(jwt_t *jwt, const char *head, unsigned int head_len, const char *sig); JWT_NO_EXPORT int jwt_sign(jwt_t *jwt, char **out, unsigned int *len, const char *str, unsigned int str_len); JWT_NO_EXPORT jwt_value_error_t __deleter(jwt_json_t *which, const char *field); JWT_NO_EXPORT jwt_value_error_t __setter(jwt_json_t *which, jwt_value_t *value); JWT_NO_EXPORT jwt_value_error_t __getter(jwt_json_t *which, jwt_value_t *value); JWT_NO_EXPORT int jwt_parse(jwt_t *jwt, const char *token, unsigned int *len); JWT_NO_EXPORT jwt_t *jwt_verify_complete(jwt_t *jwt, const jwt_config_t *config, const char *token, unsigned int payload_len); JWT_NO_EXPORT char *jwt_encode_str(jwt_t *jwt); JWT_NO_EXPORT int jwt_head_setup(jwt_t *jwt); #define __trace() fprintf(stderr, "%s:%d\n", __func__, __LINE__) /* Returns the jwk_key_type_t that the given JWA algorithm requires, or * JWK_KEY_TYPE_NONE for JWT_ALG_NONE / unknown values. This is the * authoritative kty<->alg mapping used to prevent algorithm confusion * attacks (e.g. GHSA-q843-6q5f-w55g): an RSA JWK must never be usable * for an HS* token, regardless of whether the JWK carries an alg hint. */ static inline jwk_key_type_t jwt_alg_required_kty(jwt_alg_t alg) { switch (alg) { case JWT_ALG_HS256: case JWT_ALG_HS384: case JWT_ALG_HS512: return JWK_KEY_TYPE_OCT; case JWT_ALG_RS256: case JWT_ALG_RS384: case JWT_ALG_RS512: case JWT_ALG_PS256: case JWT_ALG_PS384: case JWT_ALG_PS512: return JWK_KEY_TYPE_RSA; case JWT_ALG_ES256: case JWT_ALG_ES256K: case JWT_ALG_ES384: case JWT_ALG_ES512: return JWK_KEY_TYPE_EC; case JWT_ALG_EDDSA: return JWK_KEY_TYPE_OKP; // LCOV_EXCL_START default: return JWK_KEY_TYPE_NONE; // LCOV_EXCL_STOP } } #endif /* JWT_PRIVATE_H */ libjwt-3.3.3/libjwt/jwt-setget.c000066400000000000000000000170051517612317300165600ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include "jwt-private.h" static jwt_value_error_t jwt_get_str(jwt_json_t *which, jwt_value_t *jval) { jwt_json_t *val; if (!jval->name || !strlen(jval->name)) return jval->error = JWT_VALUE_ERR_INVALID; val = jwt_json_obj_get(which, jval->name); if (val == NULL) return jval->error = JWT_VALUE_ERR_NOEXIST; else if (!jwt_json_is_string(val)) return jval->error = JWT_VALUE_ERR_TYPE; jval->str_val = jwt_json_str_val(val); if (jval->str_val == NULL) jval->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_LINE return jval->error; } static jwt_value_error_t jwt_get_int(jwt_json_t *which, jwt_value_t *jval) { jwt_json_t *val; if (!jval->name || !strlen(jval->name)) return jval->error = JWT_VALUE_ERR_INVALID; val = jwt_json_obj_get(which, jval->name); if (val == NULL) return jval->error = JWT_VALUE_ERR_NOEXIST; else if (!jwt_json_is_int(val)) return jval->error = JWT_VALUE_ERR_TYPE; jval->int_val = jwt_json_int_val(val); return jval->error; } static jwt_value_error_t jwt_get_bool(jwt_json_t *which, jwt_value_t *jval) { jwt_json_t *val; if (!jval->name || !strlen(jval->name)) return jval->error = JWT_VALUE_ERR_INVALID; val = jwt_json_obj_get(which, jval->name); if (val == NULL) return jval->error = JWT_VALUE_ERR_NOEXIST; else if (!jwt_json_is_bool(val)) return jval->error = JWT_VALUE_ERR_TYPE; jval->bool_val = jwt_json_is_true(val) ? 1 : 0; return jval->error; } static jwt_value_error_t jwt_get_json(jwt_json_t *which, jwt_value_t *jval) { jwt_json_t *json_val = NULL; size_t flags = JWT_JSON_SORT_KEYS; if (jval->pretty) flags |= JWT_JSON_INDENT(4); else flags |= JWT_JSON_COMPACT; if (jval->name && strlen(jval->name)) json_val = jwt_json_obj_get(which, jval->name); else json_val = which; if (json_val == NULL) return jval->error = JWT_VALUE_ERR_NOEXIST; jval->json_val = jwt_json_serialize(json_val, flags); if (jval->json_val == NULL) jval->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_LINE return jval->error; } static jwt_value_error_t jwt_obj_check(jwt_json_t *which, jwt_value_t *jval) { if (jwt_json_obj_get(which, jval->name)) { if (jval->replace) jwt_json_obj_del(which, jval->name); else return jval->error = JWT_VALUE_ERR_EXIST; } return JWT_VALUE_ERR_NONE; } static jwt_value_error_t jwt_set_str(jwt_json_t *which, jwt_value_t *jval) { if (!jval->name || !strlen(jval->name) || !jval->str_val) return jval->error = JWT_VALUE_ERR_INVALID; if (jwt_obj_check(which, jval)) return jval->error; if (jwt_json_obj_set(which, jval->name, jwt_json_create_str(jval->str_val))) jval->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_LINE return jval->error; } static jwt_value_error_t jwt_set_int(jwt_json_t *which, jwt_value_t *jval) { if (!jval->name || !strlen(jval->name)) return jval->error = JWT_VALUE_ERR_INVALID; if (jwt_obj_check(which, jval)) return jval->error; if (jwt_json_obj_set(which, jval->name, jwt_json_create_int((jwt_json_int_t)jval->int_val))) jval->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_LINE return jval->error; } static jwt_value_error_t jwt_set_bool(jwt_json_t *which, jwt_value_t *jval) { if (!jval->name || !strlen(jval->name)) return jval->error = JWT_VALUE_ERR_INVALID; if (jwt_obj_check(which, jval)) return jval->error; if (jwt_json_obj_set(which, jval->name, jwt_json_create_bool(jval->bool_val))) jval->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_LINE return jval->error; } static jwt_value_error_t jwt_set_json(jwt_json_t *which, jwt_value_t *jval) { size_t flags = JWT_JSON_REJECT_DUPLICATES; jwt_json_t *json_val = NULL; int ret; json_val = jwt_json_parse(jval->json_val, flags, NULL); /* Because we didn't set JSON_DECODE_ANY, we are guaranteed an array or * object here. */ if (!json_val) return jval->error = JWT_VALUE_ERR_INVALID; if (jval->name == NULL || !strlen(jval->name)) { /* Update the whole thing */ if (jval->replace) ret = jwt_json_obj_merge(which, json_val); else ret = jwt_json_obj_merge_new(which, json_val); /* Done with this. */ jwt_json_releasep(&json_val); if (ret) jval->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_LINE } else { /* Add object at name */ if (!jwt_obj_check(which, jval)) { if (jwt_json_obj_set(which, jval->name, json_val)) jval->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_LINE } /* If things failed, it means we're responsible for this ref */ if (jval->error != JWT_VALUE_ERR_NONE) jwt_json_releasep(&json_val); } return jval->error; } jwt_value_error_t __deleter(jwt_json_t *which, const char *field) { if (field == NULL || !strlen(field)) jwt_json_obj_clear(which); else jwt_json_obj_del(which, field); return JWT_VALUE_ERR_NONE; } jwt_value_error_t __setter(jwt_json_t *which, jwt_value_t *value) { if (!which) return value->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_LINE value->error = JWT_VALUE_ERR_NONE; switch (value->type) { case JWT_VALUE_INT: return jwt_set_int(which, value); case JWT_VALUE_STR: return jwt_set_str(which, value); case JWT_VALUE_BOOL: return jwt_set_bool(which, value); case JWT_VALUE_JSON: return jwt_set_json(which, value); // LCOV_EXCL_START default: return value->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_STOP } } jwt_value_error_t __getter(jwt_json_t *which, jwt_value_t *value) { if (!which) return value->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_LINE value->error = JWT_VALUE_ERR_NONE; switch (value->type) { case JWT_VALUE_INT: return jwt_get_int(which, value); case JWT_VALUE_STR: return jwt_get_str(which, value); case JWT_VALUE_BOOL: return jwt_get_bool(which, value); case JWT_VALUE_JSON: return jwt_get_json(which, value); // LCOV_EXCL_START default: return value->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_STOP } } typedef enum { __HEADER, __CLAIM, } _setget_type_t; typedef jwt_value_error_t (*__doer_t)(jwt_json_t *, jwt_value_t *); static jwt_value_error_t __run_it(jwt_t *jwt, _setget_type_t type, jwt_value_t *value, __doer_t doer) { jwt_json_t *which = NULL; if (!jwt || !value) { if (value) return value->error = JWT_VALUE_ERR_INVALID; return JWT_VALUE_ERR_INVALID; } switch (type) { case __HEADER: which = jwt->headers; break; case __CLAIM: which = jwt->claims; break; // LCOV_EXCL_START default: return value->error = JWT_VALUE_ERR_INVALID; // LCOV_EXCL_STOP } return doer(which, value); } /* Headers */ jwt_value_error_t jwt_header_get(jwt_t *jwt, jwt_value_t *value) { return __run_it(jwt, __HEADER, value, __getter); } jwt_value_error_t jwt_header_set(jwt_t *jwt, jwt_value_t *value) { return __run_it(jwt, __HEADER, value, __setter); } jwt_value_error_t jwt_header_del(jwt_t *jwt, const char *header) { if (!jwt) return JWT_VALUE_ERR_INVALID; return __deleter(jwt->headers, header); } /* Claims */ jwt_value_error_t jwt_claim_get(jwt_t *jwt, jwt_value_t *value) { return __run_it(jwt, __CLAIM, value, __getter); } jwt_value_error_t jwt_claim_set(jwt_t *jwt, jwt_value_t *value) { return __run_it(jwt, __CLAIM, value, __setter); } jwt_value_error_t jwt_claim_del(jwt_t *jwt, const char *claim) { if (!jwt) return JWT_VALUE_ERR_INVALID; return __deleter(jwt->claims, claim); } libjwt-3.3.3/libjwt/jwt-verify.c000066400000000000000000000152241517612317300165720ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include "jwt-private.h" static jwt_json_t *jwt_base64uri_decode_to_json(char *src) { jwt_json_t *js; char *buf; int len; buf = jwt_base64uri_decode(src, &len); if (buf == NULL) return NULL; // LCOV_EXCL_LINE buf[len] = '\0'; js = jwt_json_parse(buf, 0, NULL); jwt_freemem(buf); return js; } static int jwt_parse_payload(jwt_t *jwt, char *payload) { if (jwt->claims) jwt_json_releasep(&(jwt->claims)); jwt->claims = jwt_base64uri_decode_to_json(payload); if (!jwt->claims) { jwt_write_error(jwt, "Error parsing payload"); return 1; } return 0; } static int jwt_parse_head(jwt_t *jwt, char *head) { jwt_json_t *jalg; if (jwt->headers) jwt_json_releasep(&(jwt->headers)); jwt->headers = jwt_base64uri_decode_to_json(head); if (!jwt->headers) { jwt_write_error(jwt, "Error parsing header"); return 1; } jwt->alg = JWT_ALG_NONE; jalg = jwt_json_obj_get(jwt->headers, "alg"); if (jalg && jwt_json_is_string(jalg)) { const char *alg = jwt_json_str_val(jalg); jwt->alg = jwt_str_alg(alg); if (jwt->alg >= JWT_ALG_INVAL) { jwt_write_error(jwt, "Invalid ALG: [%s]", alg); return 1; } return 0; } jwt_write_error(jwt, "Missing or invalid \"alg\" header"); return 1; } int jwt_parse(jwt_t *jwt, const char *token, unsigned int *len) { char_auto *head = NULL; char *payload, *sig; int head_len = strlen(token) + 1; head = jwt_malloc(head_len); if (!head) { // LCOV_EXCL_START jwt_write_error(jwt, "Error allocating memory"); return 1; // LCOV_EXCL_STOP } /* head_len includes nil */ memcpy(head, token, head_len); /* Find the components. */ for (payload = head; payload[0] != '.'; payload++) { if (payload[0] == '\0') { jwt_write_error(jwt, "No dot found looking for end of header"); return 1; } } payload[0] = '\0'; payload++; for (sig = payload; sig[0] != '.'; sig++) { if (sig[0] == '\0') { jwt_write_error(jwt, "No dot found looking for end of payload"); return 1; } } sig[0] = '\0'; /* Now that we have everything split up, let's check out the * header. */ if (jwt_parse_head(jwt, head)) return 1; if (jwt_parse_payload(jwt, payload)) return 1; *len = sig - head; return 0; } static int __check_str_claim(jwt_t *jwt, jwt_claims_t claim, char *claim_str) { jwt_checker_t *checker = jwt->checker; jwt_value_t jval; const char *str; jwt_value_error_t err; if (!(checker->c.claims & claim)) return 0; str = jwt_checker_claim_get(checker, claim); if (str == NULL) return 1; // LCOV_EXCL_LINE // Check above makes this nearly impossible to hit jwt_set_GET_STR(&jval, claim_str); err = jwt_claim_get(jwt, &jval); if (err != JWT_VALUE_ERR_NONE || strcmp(str, jval.str_val)) return 1; return 0; } static jwt_claims_t __verify_claims(jwt_t *jwt) { jwt_checker_t *checker = jwt->checker; jwt_value_t jval; time_t now = time(NULL); jwt_value_error_t err; jwt_claims_t failed = 0; /* expiration in past */ if (checker->c.claims & JWT_CLAIM_EXP) { jwt_set_GET_INT(&jval, "exp"); err = jwt_claim_get(jwt, &jval); if (err == JWT_VALUE_ERR_NONE) { if (jval.int_val <= (now - checker->c.exp)) { failed |= JWT_CLAIM_EXP; } } else if (err != JWT_VALUE_ERR_NOEXIST) failed |= JWT_CLAIM_EXP; // LCOV_EXCL_LINE } /* not valid before now */ if (checker->c.claims & JWT_CLAIM_NBF) { jwt_set_GET_INT(&jval, "nbf"); err = jwt_claim_get(jwt, &jval); if (err == JWT_VALUE_ERR_NONE) { if (jval.int_val > (now + checker->c.nbf)) { failed |= JWT_CLAIM_NBF; } } else if (err != JWT_VALUE_ERR_NOEXIST) failed |= JWT_CLAIM_NBF; // LCOV_EXCL_LINE } /* issuer doesn't match */ if (__check_str_claim(jwt, JWT_CLAIM_ISS, "iss")) failed |= JWT_CLAIM_ISS; /* subject doesn't match */ if (__check_str_claim(jwt, JWT_CLAIM_SUB, "sub")) failed |= JWT_CLAIM_SUB; /* audience doesn't match */ if (__check_str_claim(jwt, JWT_CLAIM_AUD, "aud")) failed |= JWT_CLAIM_AUD; return failed; } /* This is after parsing and possibly a user callback. */ static int __verify_config_post(jwt_t *jwt, const jwt_config_t *config, unsigned int sig_len) { /* Yes, we do this before checking a signature. */ if (__verify_claims(jwt)) { /* TODO Pass back the ORd list of claims failed. */ jwt_write_error(jwt, "Failed one or more claims"); return 1; } if (!sig_len) { if (config->key || config->alg != JWT_ALG_NONE || jwt->alg != JWT_ALG_NONE) { jwt_write_error(jwt, "Expected a signature, but JWT has none"); return 1; } return 0; } /* Signature is known to be present from this point */ if (jwt->alg == JWT_ALG_NONE) { jwt_write_error(jwt, "JWT has signature block, but no alg set"); return 1; } if (config->key == NULL) { jwt_write_error(jwt, "JWT has signature, but no key was given"); return 1; } /* Key is known to be given at this point */ if (config->alg == JWT_ALG_NONE) { if (config->key->alg != jwt->alg) { jwt_write_error(jwt, "Key alg does not match JWT"); return 1; } } else if (config->key->alg == JWT_ALG_NONE) { if (config->alg != jwt->alg) { jwt_write_error(jwt, "Config alg does not match JWT"); return 1; } } else if (config->alg != config->key->alg) { /* It's not really possible to get here due to checks in setkey */ // LCOV_EXCL_START jwt_write_error(jwt, "Config and key alg does not match"); return 1; // LCOV_EXCL_STOP } /* Algorithm is now bound (jwt->alg). Defensively confirm that the * JWK's actual key type can carry it. This blocks algorithm * confusion (GHSA-q843-6q5f-w55g) even if a malformed JWK has an * "alg" hint that disagrees with its "kty". */ if (jwt_alg_required_kty(jwt->alg) != config->key->kty) { jwt_write_error(jwt, "Key type does not match JWT alg"); return 1; } return 0; } jwt_t *jwt_verify_complete(jwt_t *jwt, const jwt_config_t *config, const char *token, unsigned int payload_len) { const char *sig; unsigned int sig_len; sig = token + (payload_len + 1); sig_len = strlen(sig); /* Check for conflicts in user request and JWT */ if (__verify_config_post(jwt, config, sig_len)) return jwt; /* After all the checks, if we don't have a sig, we can move on. */ if (!sig_len) return jwt; /* At this point, config is never NULL */ jwt->key = config->key; return jwt_verify_sig(jwt, token, payload_len, sig); } libjwt-3.3.3/libjwt/jwt.c000066400000000000000000000360441517612317300152730ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #ifdef USE_KCAPI_MD #include #define KCAPI_MAX_MD_SIZE 64 #endif #include "jwt-private.h" const char *jwt_alg_str(jwt_alg_t alg) { switch (alg) { case JWT_ALG_NONE: return "none"; case JWT_ALG_HS256: return "HS256"; case JWT_ALG_HS384: return "HS384"; case JWT_ALG_HS512: return "HS512"; case JWT_ALG_RS256: return "RS256"; case JWT_ALG_RS384: return "RS384"; case JWT_ALG_RS512: return "RS512"; case JWT_ALG_ES256: return "ES256"; case JWT_ALG_ES256K: return "ES256K"; case JWT_ALG_ES384: return "ES384"; case JWT_ALG_ES512: return "ES512"; case JWT_ALG_PS256: return "PS256"; case JWT_ALG_PS384: return "PS384"; case JWT_ALG_PS512: return "PS512"; case JWT_ALG_EDDSA: return "EdDSA"; default: return NULL; } } jwt_alg_t jwt_str_alg(const char *alg) { if (alg == NULL) return JWT_ALG_INVAL; if (!strcmp(alg, "none")) return JWT_ALG_NONE; else if (!strcmp(alg, "HS256")) return JWT_ALG_HS256; else if (!strcmp(alg, "HS384")) return JWT_ALG_HS384; else if (!strcmp(alg, "HS512")) return JWT_ALG_HS512; else if (!strcmp(alg, "RS256")) return JWT_ALG_RS256; else if (!strcmp(alg, "RS384")) return JWT_ALG_RS384; else if (!strcmp(alg, "RS512")) return JWT_ALG_RS512; else if (!strcmp(alg, "ES256")) return JWT_ALG_ES256; else if (!strcmp(alg, "ES256K")) return JWT_ALG_ES256K; else if (!strcmp(alg, "ES384")) return JWT_ALG_ES384; else if (!strcmp(alg, "ES512")) return JWT_ALG_ES512; else if (!strcmp(alg, "PS256")) return JWT_ALG_PS256; else if (!strcmp(alg, "PS384")) return JWT_ALG_PS384; else if (!strcmp(alg, "PS512")) return JWT_ALG_PS512; else if (!strcmp(alg, "EdDSA")) return JWT_ALG_EDDSA; return JWT_ALG_INVAL; } JWT_NO_EXPORT jwt_t *jwt_new(void) { jwt_t *jwt = jwt_malloc(sizeof(*jwt)); if (!jwt) return NULL; // LCOV_EXCL_LINE memset(jwt, 0, sizeof(*jwt)); jwt->claims = jwt_json_create(); jwt->headers = jwt_json_create(); if (!jwt->claims || !jwt->headers) jwt_freep(&jwt); // LCOV_EXCL_LINE return jwt; } jwt_alg_t jwt_get_alg(const jwt_t *jwt) { if (jwt == NULL) return JWT_ALG_INVAL; return jwt->alg; } void jwt_free(jwt_t *jwt) { if (!jwt) return; jwt_json_release(jwt->claims); jwt_json_release(jwt->headers); memset(jwt, 0, sizeof(*jwt)); jwt_freemem(jwt); } static int __check_hmac(jwt_t *jwt) { int key_bits = jwt->key->bits; /* Defensive: an HMAC algorithm requires an octet key. Without this * check, an RSA/EC/OKP key reaches the backend's HMAC routines, which * read jwt->key->oct.{key,len} from a union shared with provider_data * and would HMAC against a zero-length key (GHSA-q843-6q5f-w55g). * The earlier __setkey_check / __verify_config_post bindings make * this unreachable in practice, but keep the check as a backstop. */ // LCOV_EXCL_START if (jwt->key->kty != JWK_KEY_TYPE_OCT) { jwt_write_error(jwt, "Key type does not match HMAC alg"); return 1; } // LCOV_EXCL_STOP switch (jwt->alg) { case JWT_ALG_HS256: if (key_bits >= 256) return 0; jwt_write_error(jwt, "Key too short for HS256: %d bits", key_bits); break; case JWT_ALG_HS384: if (key_bits >= 384) return 0; jwt_write_error(jwt, "Key too short for HS384: %d bits", key_bits); break; case JWT_ALG_HS512: if (key_bits >= 512) return 0; jwt_write_error(jwt, "Key too short for HS512: %d bits", key_bits); break; // LCOV_EXCL_START default: return 1; // LCOV_EXCL_STOP } return 1; } static int __check_key_bits(jwt_t *jwt) { int key_bits = jwt->key->bits; switch (jwt->alg) { case JWT_ALG_RS256: case JWT_ALG_RS384: case JWT_ALG_RS512: case JWT_ALG_PS256: case JWT_ALG_PS384: case JWT_ALG_PS512: if (key_bits >= 2048) return 0; jwt_write_error(jwt, "Key too short for RSA algs: %d bits", key_bits); break; case JWT_ALG_EDDSA: if (key_bits == 256 || key_bits == 456) return 0; jwt_write_error(jwt, "Key needs to be 256 or 456 bits: %d bits", key_bits); break; case JWT_ALG_ES256K: case JWT_ALG_ES256: if (key_bits == 256) return 0; jwt_write_error(jwt, "Key needs to be 256 bits: %d bits", key_bits); break; case JWT_ALG_ES384: if (key_bits == 384) return 0; jwt_write_error(jwt, "Key needs to be 384 bits: %d bits", key_bits); break; case JWT_ALG_ES512: if (key_bits == 521) return 0; jwt_write_error(jwt, "Key needs to be 521 bits: %d bits", key_bits); break; // LCOV_EXCL_START default: break; // LCOV_EXCL_STOP } return 1; // LCOV_EXCL_LINE } static int sign_sha_hmac(jwt_t *jwt, char **out, unsigned int *len, const char *str, unsigned int str_len) { #ifdef USE_KCAPI_MD static int skip_kcapi = 0; size_t key_len; void *key; int ret; /* If kcapi fails once, we don't try again. */ if (skip_kcapi) goto fallback_ops; // LCOV_EXCL_LINE key = jwt->key->oct.key; key_len = jwt->key->oct.len; *out = jwt_malloc(KCAPI_MAX_MD_SIZE); if (*out == NULL) return 1; // LCOV_EXCL_LINE switch (jwt->alg) { /* HMAC */ case JWT_ALG_HS256: ret = kcapi_md_hmac_sha256(key, key_len, (uint8_t *)str, str_len, (uint8_t *)*out, KCAPI_MAX_MD_SIZE); break; case JWT_ALG_HS384: ret = kcapi_md_hmac_sha384(key, key_len, (uint8_t *)str, str_len, (uint8_t *)*out, KCAPI_MAX_MD_SIZE); break; case JWT_ALG_HS512: ret = kcapi_md_hmac_sha512(key, key_len, (uint8_t *)str, str_len, (uint8_t *)*out, KCAPI_MAX_MD_SIZE); break; // LCOV_EXCL_START default: /* This isn't a failure in kcapi, so just error out */ jwt_freemem(out); return 1; // LCOV_EXCL_STOP } if (ret > 0) { *len = ret; return 0; } /* Fallthrough to normal ops */ // LCOV_EXCL_START jwt_freemem(*out); skip_kcapi = 1; // LCOV_EXCL_STOP fallback_ops: #endif return jwt_ops->sign_sha_hmac(jwt, out, len, str, str_len); } int jwt_sign(jwt_t *jwt, char **out, unsigned int *len, const char *str, unsigned int str_len) { switch (jwt->alg) { /* HMAC */ case JWT_ALG_HS256: case JWT_ALG_HS384: case JWT_ALG_HS512: if (__check_hmac(jwt)) return 1; if (sign_sha_hmac(jwt, out, len, str, str_len)) { /* There's not really a way to induce failure here, * and there's not really much of a chance this can fail * other than an internal fatal error in the crypto * library. */ // LCOV_EXCL_START jwt_write_error(jwt, "Token failed signing"); return 1; // LCOV_EXCL_STOP } else { return 0; } /* RSA */ case JWT_ALG_RS256: case JWT_ALG_RS384: case JWT_ALG_RS512: /* RSA-PSS */ case JWT_ALG_PS256: case JWT_ALG_PS384: case JWT_ALG_PS512: /* ECC */ case JWT_ALG_ES256: case JWT_ALG_ES256K: case JWT_ALG_ES384: case JWT_ALG_ES512: /* EdDSA */ case JWT_ALG_EDDSA: if (__check_key_bits(jwt)) return 1; if (jwt_ops->sign_sha_pem(jwt, out, len, str, str_len)) { jwt_write_error(jwt, "Token failed signing"); return 1; } else { return 0; } /* You wut, mate? */ // LCOV_EXCL_START default: jwt_write_error(jwt, "Unknown algorigthm"); return 1; // LCOV_EXCL_STOP } } /* A time-safe strcmp function */ static int _crypto_strcmp(const char *str1, const char *str2) { /* Get the LONGEST length */ int len1 = strlen(str1); int len2 = strlen(str2); int len_max = len1 >= len2 ? len1 : len2; int i; volatile int ret = 0; /* Iterate the entire longest string no matter what. Only testing * the shortest string would still allow attacks for * "a" == "aKJSDHkjashaaHJASJ", adding a character each time one * is found. */ for (i = 0; i < len_max; i++) { char c1, c2; c1 = (i < len1) ? str1[i] : 0; c2 = (i < len2) ? str2[i] : 0; ret |= c1 ^ c2; } /* Don't forget to check length */ ret |= len1 ^ len2; return ret; } static int _verify_sha_hmac(jwt_t *jwt, const char *head, unsigned int head_len, const char *sig) { char_auto *res = NULL; char_auto *buf = NULL; unsigned int res_len; int ret; ret = jwt_sign(jwt, &res, &res_len, head, head_len); if (ret) return 1; // LCOV_EXCL_LINE ret = jwt_base64uri_encode(&buf, res, res_len); if (ret <= 0) return 1; // LCOV_EXCL_LINE return _crypto_strcmp(buf, sig) ? 1 : 0; } jwt_t *jwt_verify_sig(jwt_t *jwt, const char *head, unsigned int head_len, const char *sig_b64) { int sig_len; char_auto *sig = NULL; switch (jwt->alg) { /* HMAC */ case JWT_ALG_HS256: case JWT_ALG_HS384: case JWT_ALG_HS512: if (_verify_sha_hmac(jwt, head, head_len, sig_b64)) jwt_write_error(jwt, "Token failed verification"); break; /* RSA */ case JWT_ALG_RS256: case JWT_ALG_RS384: case JWT_ALG_RS512: /* RSA-PSS */ case JWT_ALG_PS256: case JWT_ALG_PS384: case JWT_ALG_PS512: /* ECC */ case JWT_ALG_ES256: case JWT_ALG_ES256K: case JWT_ALG_ES384: case JWT_ALG_ES512: /* EdDSA */ case JWT_ALG_EDDSA: if (__check_key_bits(jwt)) break; sig = jwt_base64uri_decode(sig_b64, &sig_len); if (sig == NULL) { jwt_write_error(jwt, "Error decoding signature"); break; } if (jwt_ops->verify_sha_pem(jwt, head, head_len, (unsigned char *)sig, sig_len)) jwt_write_error(jwt, "Token failed verification"); break; /* You wut, mate? */ // LCOV_EXCL_START default: jwt_write_error(jwt, "Unknown algorigthm"); } // LCOV_EXCL_STOP return jwt; } /* This is a public domain base64 implementation written by WEI Zhicheng. https://github.com/zhicheng/base64 */ #define BASE64_ENCODE_OUT_SIZE(s) ((unsigned int)((((s) + 2) / 3) * 4 + 1)) #define BASE64_DECODE_OUT_SIZE(s) ((unsigned int)(((s) / 4) * 3)) #define BASE64_PAD '=' #define BASE64DE_FIRST '+' #define BASE64DE_LAST 'z' /* BASE 64 encode table */ static const char base64en[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', }; /* ASCII order for BASE 64 decode, 255 in unused character */ static const unsigned char base64de[] = { /* nul, soh, stx, etx, eot, enq, ack, bel, */ 255, 255, 255, 255, 255, 255, 255, 255, /* bs, ht, nl, vt, np, cr, so, si, */ 255, 255, 255, 255, 255, 255, 255, 255, /* dle, dc1, dc2, dc3, dc4, nak, syn, etb, */ 255, 255, 255, 255, 255, 255, 255, 255, /* can, em, sub, esc, fs, gs, rs, us, */ 255, 255, 255, 255, 255, 255, 255, 255, /* sp, '!', '"', '#', '$', '%', '&', ''', */ 255, 255, 255, 255, 255, 255, 255, 255, /* '(', ')', '*', '+', ',', '-', '.', '/', */ 255, 255, 255, 62, 255, 255, 255, 63, /* '0', '1', '2', '3', '4', '5', '6', '7', */ 52, 53, 54, 55, 56, 57, 58, 59, /* '8', '9', ':', ';', '<', '=', '>', '?', */ 60, 61, 255, 255, 255, 255, 255, 255, /* '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', */ 255, 0, 1, 2, 3, 4, 5, 6, /* 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', */ 7, 8, 9, 10, 11, 12, 13, 14, /* 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', */ 15, 16, 17, 18, 19, 20, 21, 22, /* 'X', 'Y', 'Z', '[', '\', ']', '^', '_', */ 23, 24, 25, 255, 255, 255, 255, 255, /* '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', */ 255, 26, 27, 28, 29, 30, 31, 32, /* 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', */ 33, 34, 35, 36, 37, 38, 39, 40, /* 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', */ 41, 42, 43, 44, 45, 46, 47, 48, /* 'x', 'y', 'z', '{', '|', '}', '~', del, */ 49, 50, 51, 255, 255, 255, 255, 255 }; static unsigned int base64_encode(const unsigned char *in, unsigned int inlen, char *out) { int s; unsigned int i; unsigned int j; unsigned char c; unsigned char l; s = 0; l = 0; for (i = j = 0; i < inlen; i++) { c = in[i]; switch (s) { case 0: s = 1; out[j++] = base64en[(c >> 2) & 0x3F]; break; case 1: s = 2; out[j++] = base64en[((l & 0x3) << 4) | ((c >> 4) & 0xF)]; break; case 2: s = 0; out[j++] = base64en[((l & 0xF) << 2) | ((c >> 6) & 0x3)]; out[j++] = base64en[c & 0x3F]; break; } l = c; } switch (s) { case 1: out[j++] = base64en[(l & 0x3) << 4]; out[j++] = BASE64_PAD; out[j++] = BASE64_PAD; break; case 2: out[j++] = base64en[(l & 0xF) << 2]; out[j++] = BASE64_PAD; break; } out[j] = 0; return j; } static unsigned int base64_decode(const char *in, unsigned int inlen, unsigned char *out) { unsigned int i; unsigned int j; unsigned char c; if (inlen & 0x3) { /* We sanitize the input to where this never gets hit */ return 0; // LCOV_EXCL_LINE } for (i = j = 0; i < inlen; i++) { if (in[i] == BASE64_PAD) { break; } if (in[i] < BASE64DE_FIRST || in[i] > BASE64DE_LAST) { return 0; } c = base64de[(unsigned char)in[i]]; if (c == 255) { return 0; } switch (i & 0x3) { case 0: out[j] = (c << 2) & 0xFF; break; case 1: out[j++] |= (c >> 4) & 0x3; out[j] = (c & 0xF) << 4; break; case 2: out[j++] |= (c >> 2) & 0xF; out[j] = (c & 0x3) << 6; break; case 3: out[j++] |= c; break; } } return j; } void *jwt_base64uri_decode(const char *src, int *ret_len) { void *buf; char *new; int len, i, z; if (src == NULL || ret_len == NULL) return NULL; // LCOV_EXCL_LINE // Should really be an abort /* Decode based on RFC-4648 URI safe encoding. */ len = (int)strlen(src); /* Validate length */ z = (len % 4); switch (z) { case 0: /* No added padding */ break; case 2: /* 2 added = for padding */ break; case 3: /* 1 added = for padding */ z = 1; break; default: /* Something bad */ return NULL; } new = jwt_malloc(len + z + 1); if (!new) return NULL; // LCOV_EXCL_LINE for (i = 0; i < len; i++) { switch (src[i]) { case '-': new[i] = '+'; break; case '_': new[i] = '/'; break; default: new[i] = src[i]; } } for (; z > 0; z--) new[i++] = '='; new[i] = '\0'; len = i; /* Now we have a standard base64 encoded string. */ buf = jwt_malloc(BASE64_DECODE_OUT_SIZE(len) + 1); if (buf == NULL) { // LCOV_EXCL_START jwt_freemem(new); return NULL; // LCOV_EXCL_STOP } *ret_len = base64_decode(new, len, buf); jwt_freemem(new); if (*ret_len <= 0) jwt_freemem(buf); return buf; } int jwt_base64uri_encode(char **_dst, const char *plain, int plain_len) { int len, i; char *dst; len = BASE64_ENCODE_OUT_SIZE(plain_len); dst = jwt_malloc(len + 1); if (dst == NULL) return -1; // LCOV_EXCL_LINE *_dst = dst; /* First, a normal base64 encoding */ len = base64_encode((const unsigned char *)plain, plain_len, dst); /* Now for the URI encoding */ for (i = 0; i < len; i++) { switch (dst[i]) { case '+': dst[i] = '-'; break; case '/': dst[i] = '_'; break; case '=': dst[i] = '\0'; break; } } /* Just in case there's no padding. */ dst[i] = '\0'; return i; } libjwt-3.3.3/libjwt/libjwt.pc.in000066400000000000000000000005631517612317300165440ustar00rootroot00000000000000prefix=@CMAKE_INSTALL_PREFIX@ libdir=${prefix}/lib includedir=${prefix}/include Name: @CMAKE_PROJECT_NAME@ Description: @CMAKE_PROJECT_DESCRIPTION@ Version: @CMAKE_PROJECT_VERSION@ URL: @CMAKE_PROJECT_HOMEPAGE_URL@ Requires: @JANSSON_MODULE_NAME@ @OPENSSL_MODULE_NAME@ @GNUTLS_MODULE_NAME@ Cflags: -I${includedir} Libs: -L${libdir} -ljwt Libs.private: @LIBJWT_LDFLAGS@ libjwt-3.3.3/libjwt/ll.h000066400000000000000000000260571517612317300151060ustar00rootroot00000000000000#ifndef LL_H__ #define LL_H__ /* * Copyright 2022 Embedded Artistry LLC * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include //size_t, NULL /** @defgroup linkedlist-C C Linked List Interface * A linked list library for C modules * * @ingroup FrameworkUtils * @{ */ /** * Define offsetof if we don't have it already */ #ifndef offsetof #ifdef __compiler_offsetof #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER) #else #define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE*)0)->MEMBER) #endif #endif // offsetof /** * Define container_of if we don't have it already */ #ifndef container_of #ifdef __GNUC__ #ifndef __clang__ // Isolate the GNU-specific expression #define container_of(ptr, type, member) \ ({ \ const __typeof__(((type*)0)->member)* __mptr = (ptr); \ (type*)((uintptr_t)__mptr - offsetof(type, member)); \ }) #else // we are clang - avoid GNU expression #define container_of(ptr, type, member) ((type*)((uintptr_t)(ptr)-offsetof(type, member))) #endif // GNU and not clang #else #define container_of(ptr, type, member) ((type*)((uintptr_t)(ptr)-offsetof(type, member))) #endif // not GNU #endif // container_of #ifdef __cplusplus extern "C" { #endif //__cplusplus /** Linked list struct * * This is a doubly linked list structure. * The ll_t structure should be embedded in a container structure that you want to list. * * Example: * * @code * typedef struct * { * ll_t node; * size_t size; * char* block; * } alloc_node_t; * @endcode */ typedef struct ll_head { /// Pointer to the next element in the list. struct ll_head* next; /// Pointer to the previous element in the list. struct ll_head* prev; } ll_t; /// @name Get Containers /// @{ /** Get the container for a list entry * * @param[in] ptr The pointer to the target ll_t node. * @param[in] type The struct type which contains the ll_t node. For this example struct, * type would refer to alloc_node_t: * @code * typedef struct * { * ll_t node; * size_t size; * char* block; * } alloc_node_t; * @endcode * * @param[in] member The member which corresponds to the member name of the ll_t entry. For this * example struct, member would refer to `node`. * @code * typedef struct * { * ll_t node; * size_t size; * char* block; * } alloc_node_t; * @endcode * * @returns a pointer to the struct containing the linked list node at `ptr`, cast to type `type`. */ #define list_entry(ptr, type, member) container_of(ptr, type, member) /** Get the container for the first item in the list * * @param[in] head The pointer to the head of the list. * @param[in] type The struct type which contains the ll_t node. For this example struct, * type would refer to alloc_node_t: * @code * typedef struct * { * ll_t node; * size_t size; * char* block; * } alloc_node_t; * @endcode * @param[in] member The member which corresponds to the member name of the ll_t entry. For this * example struct, member would refer to `node`. * @code * typedef struct * { * ll_t node; * size_t size; * char* block; * } alloc_node_t; * @endcode * * @returns a pointer to the struct containing the linked list node at `ptr`, cast to type `type`. */ #define list_first_entry(head, type, member) list_entry((head)->next, type, member) /// @} // Get containers /// @name Foreach Operations /// @{ /** Declare a foreach loop which iterates over the list * * list_for_each() will run as long as the current object's next pointer is not equal to the * head of the list. It's possible for a malformed list to loop forever. * * @param[in] pos The variable which will hold the current iteration's position value. * This variable must be a pointer and should be pre-declared before instantiating the loop. * @code * ll_t *b; * list_for_each(b, &free_list) * { * ... * } * @endcode * @param[in] head The head of the linked list. Input should be a pointer. */ #define list_for_each(pos, head) for(pos = (head)->next; pos != (head); pos = pos->next) /** Declare a foreach loop which iterates over the list, copy current node pointer. * * list_for_each_safe() will run as long as the current object's next pointer is not equal to the * head of the list. It's possible for a malformed list to loop forever. * * The list_for_each_safe() variant makes a copy of the current node pointer, enabling the loop * to get to the next pointer if there is a deletion. * * @param[in] pos The variable which will hold the current iteration's position value. * This variable must be a pointer should be pre-declared before instantiating the loop. * @code * ll_t *b, *t; * list_for_each_safe(b, t, &free_list) * { * ... * } * @endcode * @param[in] n The variable which will hold the current iteration's position value **copy**. * This variable must be a pointer and should be pre-declared before instantiating the loop. * @code * alloc_node_t *b, *t; * list_for_each_safe(b, t, &free_list) * { * ... * } * @endcode * @param[in] head The head of the linked list. Input should be a pointer. */ #define list_for_each_safe(pos, n, head) \ for(pos = (head)->next, n = pos->next; pos != (head); pos = n, n = pos->next) /** Declare a for loop which operates on each node in the list using the container value. * * @param[in] pos The variable which will hold the current iteration's position value. * This variable must be a pointer and should be pre-declared before instantiating the loop. * The `pos` variable must be the container type. * @code * alloc_node_t *b, *t; * list_for_each_entry(b, &free_list, node) * { * ... * } * @endcode * * @param[in] head The head of the linked list. Input should be a pointer. * * @param[in] member The member which corresponds to the member name of the ll_t entry. For this * example struct, member would refer to `node`. * @code * typedef struct * { * ll_t node; * size_t size; * char* block; * } alloc_node_t; * @endcode */ #define list_for_each_entry(pos, head, member) \ for(pos = list_entry((head)->next, __typeof__(*pos), member); &pos->member != (head); \ pos = list_entry(pos->member.next, __typeof__(*pos), member)) /** Declare a for loop which operates on each node in the list using a copy of the container value. * * @param[in] pos The variable which will hold the current iteration's position value. * This variable must be a pointer and should be pre-declared before instantiating the loop. * The `pos` variable must be the container type. * @code * alloc_node_t *b, *t; * list_for_each_entry(b, &free_list, node) * { * ... * } * @endcode * @param[in] n The variable which will hold the current iteration's position value **copy**. * This variable must be a pointer and should be pre-declared before instantiating the loop. * The `n` variable must be the container type. * @code * typedef struct * { * ll_t node; * size_t size; * char* block; * } alloc_node_t; * * alloc_node_t *b, *t; * list_for_each_entrysafe(b, t, &free_list, node) * { * ... * } * @endcode * @param[in] head The head of the linked list. Input should be a pointer. * @param[in] member The member which corresponds to the member name of the ll_t entry. For this * example struct, member would refer to `node`. * @code * typedef struct * { * ll_t node; * size_t size; * char* block; * } alloc_node_t; * @endcode */ #define list_for_each_entry_safe(pos, n, head, member) \ for(pos = list_entry((head)->next, __typeof__(*pos), member), \ n = list_entry(pos->member.next, __typeof__(*pos), member); \ &pos->member != (head); pos = n, n = list_entry(n->member.next, __typeof__(*n), member)) /// @} // End foreach /// @name Initialization /// @{ /// Initialize a linked list so it points to itself /// @param[in] name of the linked list object #define ll_head_INIT(name) \ { \ &(name), &(name) \ } // Added by BenC static inline void INIT_LIST_HEAD(ll_t *list) { list->next = list; list->prev = list; } /** Initialize a linked list * * @code * // This macro declares and initializes our linked list * static LIST_INIT(free_list); * @endcode * @param[in] name The name of the linked list object to declare */ #define LIST_INIT(name) struct ll_head name = ll_head_INIT(name) /// @} /// @name Addition /// @{ /// Insert a new element between two existing elements. /// @param[in] n The node to add to the list. /// @param[in] prev The pointer to the node before where the new node will be inserted. /// @param[in] next The pointer to the new node after where the new node will be inserted. static inline void list_insert(struct ll_head* n, struct ll_head* prev, struct ll_head* next) { next->prev = n; n->next = next; n->prev = prev; prev->next = n; } /// Add a node to the front of the list /// @param[in] n The node to add to the list. /// @param[in] head The head of the list. static inline void list_add(struct ll_head* n, struct ll_head* head) { list_insert(n, head, head->next); } /// Add a node to the end of the list /// @param[in] n The node to add to the list. /// @param[in] head The head of the list. static inline void list_add_tail(struct ll_head* n, struct ll_head* head) { list_insert(n, head->prev, head); } /// @} /// @name Deletion /// @{ /// Remove the node between two element pointers. /// /// Joins the `prev` and `next` elements together, effectively removing /// the element in the middle. /// /// @param[in] prev The previous element in the list, which will now be joined to next. /// @param[in] next The next element in the list, which will now be joined to prev. static inline void list_join_nodes(struct ll_head* prev, struct ll_head* next) { next->prev = prev; prev->next = next; } /// Remove an entry from the list /// @param[in] entry The pointer to the entry to remove from the list. static inline void list_del(struct ll_head* entry) { list_join_nodes(entry->prev, entry->next); entry->next = NULL; entry->prev = NULL; } /// @} /// @} // end group #ifdef __cplusplus } #endif //__cplusplus #endif // LL_H__ libjwt-3.3.3/libjwt/mbedtls/000077500000000000000000000000001517612317300157465ustar00rootroot00000000000000libjwt-3.3.3/libjwt/mbedtls/jwk-parse.c000066400000000000000000000016541517612317300200230ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include "jwt-private.h" static const char not_implemented[] = "MBedTLS does not yet implement JWK"; JWT_NO_EXPORT int mbedtls_process_eddsa(jwt_json_t *jwk, jwk_item_t *item) { jwt_write_error(item, not_implemented); return -1; } JWT_NO_EXPORT int mbedtls_process_rsa(jwt_json_t *jwk, jwk_item_t *item) { jwt_write_error(item, not_implemented); return -1; } JWT_NO_EXPORT int mbedtls_process_ec(jwt_json_t *jwk, jwk_item_t *item) { jwt_write_error(item, not_implemented); return -1; } JWT_NO_EXPORT void mbedtls_process_item_free(jwk_item_t *item) { return; } libjwt-3.3.3/libjwt/mbedtls/jwt-mbedtls.h000066400000000000000000000016511517612317300203560ustar00rootroot00000000000000/* Copyright (C) 2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef JWT_MBEDTLS_H #define JWT_MBEDTLS_H /* Until we have our own routines, we rely on OpenSSL */ int openssl_process_eddsa(jwt_json_t *jwk, jwk_item_t *item); int openssl_process_rsa(jwt_json_t *jwk, jwk_item_t *item); int openssl_process_ec(jwt_json_t *jwk, jwk_item_t *item); void openssl_process_item_free(jwk_item_t *item); int mbedtls_process_eddsa(jwt_json_t *jwk, jwk_item_t *item); int gmbedls_process_rsa(jwt_json_t *jwk, jwk_item_t *item); int mbedtls_process_ec(jwt_json_t *jwk, jwk_item_t *item); void mbedtls_process_item_free(jwk_item_t *item); #endif /* JWT_MBEDTLS_H */ libjwt-3.3.3/libjwt/mbedtls/sign-verify.c000066400000000000000000000240501517612317300203550ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include "jwt-private.h" #include "jwt-mbedtls.h" static int mbedtls_sign_sha_hmac(jwt_t *jwt, char **out, unsigned int *len, const char *str, unsigned int str_len) { mbedtls_md_context_t ctx; const mbedtls_md_info_t *md_info; void *key; size_t key_len; int ret = 1; key = jwt->key->oct.key; key_len = jwt->key->oct.len; *out = NULL; /* Determine the HMAC algorithm based on jwt->alg */ switch (jwt->alg) { case JWT_ALG_HS256: md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); break; case JWT_ALG_HS384: md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA384); break; case JWT_ALG_HS512: md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA512); break; default: return 1; } *out = jwt_malloc(mbedtls_md_get_size(md_info)); if (*out == NULL) return 1; mbedtls_md_init(&ctx); ret = mbedtls_md_setup(&ctx, md_info, 1); if (ret) { mbedtls_md_free(&ctx); jwt_freemem(*out); return 1; } /* Start HMAC calculation */ ret = mbedtls_md_hmac_starts(&ctx, key, key_len); if (!ret) ret = mbedtls_md_hmac_update(&ctx, (const unsigned char *)str, str_len); if (!ret) ret = mbedtls_md_hmac_finish(&ctx, (unsigned char *)*out); if (ret) { mbedtls_md_free(&ctx); jwt_freemem(*out); return 1; } /* Get the output size */ *len = mbedtls_md_get_size(md_info); mbedtls_md_free(&ctx); return 0; } #define SIGN_ERROR(_msg) { jwt_write_error(jwt, "JWT[MbedTLS]: " _msg); goto sign_clean_key; } static int mbedtls_sign_sha_pem(jwt_t *jwt, char **out, unsigned int *len, const char *str, unsigned int str_len) { size_t out_size; mbedtls_pk_context pk; const mbedtls_md_info_t *md_info; unsigned char hash[MBEDTLS_MD_MAX_SIZE]; unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE]; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; size_t sig_len = 0; const char *pers = "libjwt_ecdsa_sign"; if (jwt->key->pem == NULL) SIGN_ERROR("Key is not compatible"); // LCOV_EXCL_LINE mbedtls_pk_init(&pk); mbedtls_entropy_init(&entropy); mbedtls_ctr_drbg_init(&ctr_drbg); if (mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *)pers, strlen(pers))) SIGN_ERROR("Failed RNG setup"); // LCOV_EXCL_LINE /* Load the private key */ if (mbedtls_pk_parse_key(&pk, (unsigned char *)jwt->key->pem, strlen(jwt->key->pem) + 1, NULL, 0, NULL, NULL)) SIGN_ERROR("Error parsing private key"); // LCOV_EXCL_LINE /* Determine the hash algorithm */ switch (jwt->alg) { case JWT_ALG_RS256: case JWT_ALG_PS256: case JWT_ALG_ES256: case JWT_ALG_ES256K: md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); break; case JWT_ALG_RS384: case JWT_ALG_PS384: case JWT_ALG_ES384: md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA384); break; case JWT_ALG_RS512: case JWT_ALG_PS512: case JWT_ALG_ES512: md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA512); break; default: SIGN_ERROR("Unsupported algorithm"); // LCOV_EXCL_LINE } /* Compute the hash of the input string */ if (mbedtls_md(md_info, (unsigned char *)str, str_len, hash)) SIGN_ERROR("Error initializing md context"); // LCOV_EXCL_LINE /* For EC keys, convert signature to R/S format */ if (mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECDSA)) { mbedtls_mpi r, s; mbedtls_ecdsa_context ecdsa; int adj; mbedtls_ecdsa_init(&ecdsa); mbedtls_mpi_init(&r); mbedtls_mpi_init(&s); /* Extract ECDSA key */ if (mbedtls_ecdsa_from_keypair(&ecdsa, mbedtls_pk_ec(pk))) SIGN_ERROR("Error getting ECDSA keypair"); // LCOV_EXCL_LINE if (mbedtls_ecdsa_sign(&ecdsa.private_grp, &r, &s, &ecdsa.private_d, hash, mbedtls_md_get_size(md_info), mbedtls_ctr_drbg_random, &ctr_drbg)) SIGN_ERROR("Error signing token"); // LCOV_EXCL_LINE /* Determine R/S sizes based on algorithm */ switch (jwt->alg) { case JWT_ALG_ES256: case JWT_ALG_ES256K: adj = 32; break; case JWT_ALG_ES384: adj = 48; break; case JWT_ALG_ES512: adj = 66; break; default: SIGN_ERROR("Unknown EC alg"); // LCOV_EXCL_LINE } out_size = adj * 2; *out = jwt_malloc(out_size); if (*out == NULL) SIGN_ERROR("Out of memory"); // LCOV_EXCL_LINE memset(*out, 0, out_size); mbedtls_mpi_write_binary(&r, (unsigned char *)(*out), adj); mbedtls_mpi_write_binary(&s, (unsigned char *)(*out) + adj, adj); *len = out_size; mbedtls_mpi_free(&r); mbedtls_mpi_free(&s); mbedtls_ecdsa_free(&ecdsa); } else { switch (jwt->alg) { case JWT_ALG_PS256: case JWT_ALG_PS384: case JWT_ALG_PS512: if (mbedtls_rsa_set_padding(mbedtls_pk_rsa(pk), MBEDTLS_RSA_PKCS_V21, mbedtls_md_get_type(md_info))) SIGN_ERROR("Failed setting RSASSA-PSS padding"); // LCOV_EXCL_LINE if (mbedtls_rsa_rsassa_pss_sign(mbedtls_pk_rsa(pk), mbedtls_ctr_drbg_random, &ctr_drbg, mbedtls_md_get_type(md_info), mbedtls_md_get_size(md_info), hash, sig)) SIGN_ERROR("Failed signing RSASSA-PSS"); // LCOV_EXCL_LINE break; case JWT_ALG_RS256: case JWT_ALG_RS384: case JWT_ALG_RS512: if (mbedtls_rsa_pkcs1_sign(mbedtls_pk_rsa(pk), mbedtls_ctr_drbg_random, &ctr_drbg, mbedtls_md_get_type(md_info), mbedtls_md_get_size(md_info), hash, sig)) SIGN_ERROR("Error signing token"); // LCOV_EXCL_LINE break; default: SIGN_ERROR("Unexpected algorithm"); // LCOV_EXCL_LINE } sig_len = mbedtls_pk_rsa(pk)->private_len; *out = jwt_malloc(sig_len); if (*out == NULL) SIGN_ERROR("Out of memory"); // LCOV_EXCL_LINE memcpy(*out, sig, sig_len); *len = sig_len; } sign_clean_key: mbedtls_pk_free(&pk); mbedtls_ctr_drbg_free(&ctr_drbg); mbedtls_entropy_free(&entropy); return jwt->error; } #define VERIFY_ERROR(_msg) { jwt_write_error(jwt, "JWT[MbedTLS]: " _msg); goto verify_clean_key; } static int mbedtls_verify_sha_pem(jwt_t *jwt, const char *head, unsigned int head_len, unsigned char *sig, int sig_len) { mbedtls_pk_context pk; unsigned char hash[MBEDTLS_MD_MAX_SIZE]; const mbedtls_md_info_t *md_info = NULL; int ret = 1; mbedtls_pk_init(&pk); if (jwt->key->pem == NULL) return 1; /* Attempt to parse the key as a public key */ ret = mbedtls_pk_parse_public_key(&pk, (const unsigned char *) jwt->key->pem, strlen(jwt->key->pem) + 1); if (ret) { /* Try loading as private key... */ if (mbedtls_pk_parse_key(&pk, (const unsigned char *) jwt->key->pem, strlen(jwt->key->pem) + 1, NULL, 0, NULL, NULL)) VERIFY_ERROR("Failed to parse key"); // LCOV_EXCL_LINE } /* Determine the hash algorithm */ switch (jwt->alg) { case JWT_ALG_RS256: case JWT_ALG_PS256: case JWT_ALG_ES256: case JWT_ALG_ES256K: md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); break; case JWT_ALG_RS384: case JWT_ALG_PS384: case JWT_ALG_ES384: md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA384); break; case JWT_ALG_RS512: case JWT_ALG_PS512: case JWT_ALG_ES512: md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA512); break; default: VERIFY_ERROR("Unsupported algorithm"); // LCOV_EXCL_LINE } if (md_info == NULL) VERIFY_ERROR("Failed to get hash alg info"); // LCOV_EXCL_LINE /* Compute the hash of the input string */ if ((ret = mbedtls_md(md_info, (const unsigned char *)head, head_len, hash))) VERIFY_ERROR("Failed to computer hash"); // LCOV_EXCL_LINE /* Handle ECDSA R/S format conversion */ if (mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECDSA)) { mbedtls_mpi r, s; mbedtls_ecdsa_context ecdsa; mbedtls_ecdsa_init(&ecdsa); mbedtls_mpi_init(&r); mbedtls_mpi_init(&s); /* Split R/S from the signature */ if (sig_len == 64 || sig_len == 96 || sig_len == 132) { size_t r_size = sig_len / 2; mbedtls_mpi_read_binary(&r, sig, r_size); mbedtls_mpi_read_binary(&s, sig + r_size, r_size); } else { VERIFY_ERROR("Invalid ECDSA sig size"); // LCOV_EXCL_LINE } /* Extract ECDSA public key */ if (mbedtls_ecdsa_from_keypair(&ecdsa, mbedtls_pk_ec(pk))) VERIFY_ERROR("Failed to extract ECDSA public key"); // LCOV_EXCL_LINE /* Verify ECDSA signature */ if (mbedtls_ecdsa_verify(&ecdsa.private_grp, hash, mbedtls_md_get_size(md_info), &ecdsa.private_Q, &r, &s)) VERIFY_ERROR("Failed to verify signature"); // LCOV_EXCL_LINE /* Free ECDSA resources */ mbedtls_mpi_free(&r); mbedtls_mpi_free(&s); mbedtls_ecdsa_free(&ecdsa); } else if (mbedtls_pk_can_do(&pk, MBEDTLS_PK_RSA)) { /* Verify RSA or RSA-PSS signature */ if (jwt->alg == JWT_ALG_PS256 || jwt->alg == JWT_ALG_PS384 || jwt->alg == JWT_ALG_PS512) { if (mbedtls_rsa_rsassa_pss_verify(mbedtls_pk_rsa(pk), mbedtls_md_get_type(md_info), mbedtls_md_get_size(md_info), hash, sig)) VERIFY_ERROR("Failed to verify signature"); // LCOV_EXCL_LINE } else { if (mbedtls_rsa_pkcs1_verify(mbedtls_pk_rsa(pk), mbedtls_md_get_type(md_info), mbedtls_md_get_size(md_info), hash, sig)) VERIFY_ERROR("Failed to verify signature"); // LCOV_EXCL_LINE } } else { VERIFY_ERROR("Unexpected key typ"); // LCOV_EXCL_LINE } verify_clean_key: mbedtls_pk_free(&pk); return jwt->error; } /* Export our ops */ struct jwt_crypto_ops jwt_mbedtls_ops = { .name = "mbedtls", .provider = JWT_CRYPTO_OPS_MBEDTLS, .sign_sha_hmac = mbedtls_sign_sha_hmac, .sign_sha_pem = mbedtls_sign_sha_pem, .verify_sha_pem = mbedtls_verify_sha_pem, /* Needs to be implemented */ .jwk_implemented = 1, .process_eddsa = openssl_process_eddsa, .process_rsa = openssl_process_rsa, .process_ec = openssl_process_ec, .process_item_free = openssl_process_item_free, }; libjwt-3.3.3/libjwt/openssl/000077500000000000000000000000001517612317300157775ustar00rootroot00000000000000libjwt-3.3.3/libjwt/openssl/jwk-parse.c000066400000000000000000000326471517612317300200620ustar00rootroot00000000000000/* Copyright (C) 2024-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include "jwt-private.h" #include #include #include #include #include #include #include #include #include "openssl/jwt-openssl.h" /* Sets a param for the public EC key */ static void *set_ec_pub_key(OSSL_PARAM_BLD *build, jwt_json_t *jx, jwt_json_t *jy, const char *curve_name) { EC_GROUP *group = NULL; EC_POINT *point = NULL; unsigned char *bin_x = NULL, *bin_y = NULL; int len_x, len_y; const char *str_x, *str_y; BIGNUM *x = NULL, *y = NULL; int nid; size_t pub_key_len = 0; unsigned char *pub_key = NULL; /* First, base64url decode */ str_x = jwt_json_str_val(jx); str_y = jwt_json_str_val(jy); bin_x = jwt_base64uri_decode(str_x, &len_x); bin_y = jwt_base64uri_decode(str_y, &len_y); if (bin_x == NULL || bin_y == NULL) goto ec_pub_key_cleanup; /* Convert to BN */ x = BN_bin2bn(bin_x, len_x, NULL); y = BN_bin2bn(bin_y, len_y, NULL); if (x == NULL || y == NULL) goto ec_pub_key_cleanup; // LCOV_EXCL_LINE /* Create the EC group and point */ nid = OBJ_sn2nid(curve_name); group = EC_GROUP_new_by_curve_name(nid); if (group == NULL) goto ec_pub_key_cleanup; point = EC_POINT_new(group); if (point == NULL) goto ec_pub_key_cleanup; // LCOV_EXCL_LINE if (!EC_POINT_set_affine_coordinates(group, point, x, y, NULL)) goto ec_pub_key_cleanup; pub_key_len = EC_POINT_point2buf(group, point, POINT_CONVERSION_UNCOMPRESSED, &pub_key, NULL); if (pub_key_len == 0) goto ec_pub_key_cleanup; // LCOV_EXCL_LINE OSSL_PARAM_BLD_push_octet_string(build, OSSL_PKEY_PARAM_PUB_KEY, pub_key, pub_key_len); ec_pub_key_cleanup: EC_POINT_free(point); EC_GROUP_free(group); BN_free(x); BN_free(y); jwt_freemem(bin_x); jwt_freemem(bin_y); /* Return this to be freed. */ return pub_key; } /* b64url-decodes a single OSSL BIGNUM and sets the OSSL param. */ static BIGNUM *set_one_bn(OSSL_PARAM_BLD *build, const char *ossl_name, jwt_json_t *val) { unsigned char *bin; const char *str; int len = 0; BIGNUM *bn; /* decode it */ str = jwt_json_str_val(val); if (str == NULL) return NULL; bin = jwt_base64uri_decode(str, &len); if (bin == NULL || len <= 0) return NULL; bn = BN_bin2bn(bin, len, NULL); jwt_freemem(bin); if (bn == NULL) return NULL; // LCOV_EXCL_LINE OSSL_PARAM_BLD_push_BN(build, ossl_name, bn); return bn; } /* Sets a single OSSL string param. */ static void set_one_string(OSSL_PARAM_BLD *build, const char *ossl_name, const char *str) { OSSL_PARAM_BLD_push_utf8_string(build, ossl_name, str, strlen(str)); } /* b64url-decodes a single octet and creates an OSSL param. */ static unsigned char *set_one_octet(OSSL_PARAM_BLD *build, const char *ossl_name, jwt_json_t *val) { unsigned char *bin; const char *str; int len = 0; /* decode it */ str = jwt_json_str_val(val); if (str == NULL) return NULL; bin = jwt_base64uri_decode(str, &len); if (bin == NULL || len <= 0) return NULL; OSSL_PARAM_BLD_push_octet_string(build, ossl_name, bin, len); return bin; } static int pctx_to_pem(EVP_PKEY_CTX *pctx, OSSL_PARAM *params, jwk_item_t *item, int priv) { BIO *bio = NULL; EVP_PKEY *pkey = NULL; char *src = NULL, *dest = NULL; long len; int ret = -1; ret = EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR, params); if (ret <= 0 || pkey == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Unable to create PEM from pkey"); goto cleanup_pem; // LCOV_EXCL_STOP } item->provider = JWT_CRYPTO_OPS_OPENSSL; item->provider_data = pkey; EVP_PKEY_get_size_t_param(pkey, OSSL_PKEY_PARAM_BITS, &item->bits); /* From here after, we don't fail. PEM is optional. */ ret = 0; bio = BIO_new(BIO_s_mem()); if (bio == NULL) goto cleanup_pem; // LCOV_EXCL_LINE if (priv) ret = PEM_write_bio_PrivateKey(bio, pkey, NULL, NULL, 0, NULL, NULL); else ret = PEM_write_bio_PUBKEY(bio, pkey); if (!ret) { // LCOV_EXCL_START ret = 0; goto cleanup_pem; // LCOV_EXCL_STOP } len = BIO_get_mem_data(bio, &src); dest = OPENSSL_malloc(len + 1); if (dest == NULL) goto cleanup_pem; // LCOV_EXCL_LINE memcpy(dest, src, len); dest[len] = '\0'; item->pem = dest; ret = 0; cleanup_pem: BIO_free(bio); return ret; } /* For EdDSA keys */ JWT_NO_EXPORT int openssl_process_eddsa(jwt_json_t *jwk, jwk_item_t *item) { unsigned char *pub_bin = NULL, *priv_bin = NULL; OSSL_PARAM *params = NULL; OSSL_PARAM_BLD *build = NULL; EVP_PKEY_CTX *pctx = NULL; jwt_json_t *x, *d, *crv; const char *crv_str; int priv = 0; int ret = -1; /* EdDSA only need one or the other. */ x = jwt_json_obj_get(jwk, "x"); d = jwt_json_obj_get(jwk, "d"); crv = jwt_json_obj_get(jwk, "crv"); if (x == NULL && d == NULL) { jwt_write_error(item, "Need an 'x' or 'd' component and found neither"); goto cleanup_eddsa; } if (crv == NULL || !jwt_json_is_string(crv)) { jwt_write_error(item, "No curve component found for EdDSA key"); goto cleanup_eddsa; } if (d != NULL) item->is_private_key = priv = 1; crv_str = jwt_json_str_val(crv); if (!strcmp(crv_str, "Ed25519")) pctx = EVP_PKEY_CTX_new_from_name(NULL, "ED25519", NULL); else if (!strcmp(crv_str, "Ed448")) pctx = EVP_PKEY_CTX_new_from_name(NULL, "ED448", NULL); else { jwt_write_error(item, "Unknown curve [%s] (note, curves are case sensitive)", crv_str); goto cleanup_eddsa; } strncpy(item->curve, crv_str, sizeof(item->curve) - 1); item->curve[sizeof(item->curve) - 1] = '\0'; if (pctx == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error creating pkey context"); goto cleanup_eddsa; // LCOV_EXCL_STOP } if (EVP_PKEY_fromdata_init(pctx) <= 0) { // LCOV_EXCL_START jwt_write_error(item, "Error starting pkey init from data"); goto cleanup_eddsa; // LCOV_EXCL_STOP } build = OSSL_PARAM_BLD_new(); if (build == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error allocating params build"); goto cleanup_eddsa; // LCOV_EXCL_STOP } if (!priv) { pub_bin = set_one_octet(build, OSSL_PKEY_PARAM_PUB_KEY, x); if (pub_bin == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error parsing pub key"); goto cleanup_eddsa; // LCOV_EXCL_STOP } } else { priv_bin = set_one_octet(build, OSSL_PKEY_PARAM_PRIV_KEY, d); if (priv_bin == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error parsing private key"); goto cleanup_eddsa; // LCOV_EXCL_STOP } } params = OSSL_PARAM_BLD_to_param(build); if (params == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error creating build params"); goto cleanup_eddsa; // LCOV_EXCL_STOP } /* Create PEM from params */ ret = pctx_to_pem(pctx, params, item, priv); cleanup_eddsa: OSSL_PARAM_free(params); OSSL_PARAM_BLD_free(build); EVP_PKEY_CTX_free(pctx); jwt_freemem(pub_bin); jwt_freemem(priv_bin); return ret; } /* For RSA keys (RS256, RS384, RS512). Also works for RSA-PSS * (PS256, PS384, PS512) */ JWT_NO_EXPORT int openssl_process_rsa(jwt_json_t *jwk, jwk_item_t *item) { OSSL_PARAM_BLD *build = NULL; jwt_json_t *n, *e, *d, *p, *q, *dp, *dq, *qi, *alg; BIGNUM *bn_n = NULL, *bn_e = NULL, *bn_d = NULL, *bn_p = NULL, *bn_q = NULL, *bn_dp = NULL, *bn_dq = NULL, *bn_qi = NULL; int is_rsa_pss = 0, priv = 0, ret = -1; OSSL_PARAM *params = NULL; EVP_PKEY_CTX *pctx = NULL; const char *alg_str = NULL; alg = jwt_json_obj_get(jwk, "alg"); n = jwt_json_obj_get(jwk, "n"); e = jwt_json_obj_get(jwk, "e"); d = jwt_json_obj_get(jwk, "d"); p = jwt_json_obj_get(jwk, "p"); q = jwt_json_obj_get(jwk, "q"); dp = jwt_json_obj_get(jwk, "dp"); dq = jwt_json_obj_get(jwk, "dq"); qi = jwt_json_obj_get(jwk, "qi"); if (n == NULL || e == NULL) { jwt_write_error(item, "Missing required RSA component: n or e"); goto cleanup_rsa; } /* Check alg to see if we can sniff RSA vs RSA-PSS */ if (alg && jwt_json_is_string(alg)) { alg_str = jwt_json_str_val(alg); if (alg_str && alg_str[0] == 'P') is_rsa_pss = 1; } /* Priv vs PUB */ if (d && p && q && dp && dq && qi) { item->is_private_key = priv = 1; } else if (!d && !p && !q && !dp && !dq && !qi) { priv = 0; } else { jwt_write_error(item, "Some priv key components exist, but some are missing"); goto cleanup_rsa; } pctx = EVP_PKEY_CTX_new_from_name(NULL, is_rsa_pss ? "RSA-PSS" : "RSA", NULL); if (pctx == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error creating pkey context"); goto cleanup_rsa; // LCOV_EXCL_STOP } if (EVP_PKEY_fromdata_init(pctx) <= 0) { // LCOV_EXCL_START jwt_write_error(item, "Error preparing context for data"); goto cleanup_rsa; // LCOV_EXCL_STOP } /* Set params */ build = OSSL_PARAM_BLD_new(); if (build == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error creating param build"); goto cleanup_rsa; // LCOV_EXCL_STOP } bn_n = set_one_bn(build, OSSL_PKEY_PARAM_RSA_N, n); bn_e = set_one_bn(build, OSSL_PKEY_PARAM_RSA_E, e); if (!bn_n || !bn_e) { jwt_write_error(item, "Error decoding pub components"); goto cleanup_rsa; } if (priv) { bn_d = set_one_bn(build, OSSL_PKEY_PARAM_RSA_D, d); bn_p = set_one_bn(build, OSSL_PKEY_PARAM_RSA_FACTOR1, p); bn_q = set_one_bn(build, OSSL_PKEY_PARAM_RSA_FACTOR2, q); bn_dp = set_one_bn(build, OSSL_PKEY_PARAM_RSA_EXPONENT1, dp); bn_dq = set_one_bn(build, OSSL_PKEY_PARAM_RSA_EXPONENT2, dq); bn_qi = set_one_bn(build, OSSL_PKEY_PARAM_RSA_COEFFICIENT1, qi); if (!bn_d || !bn_p || !bn_q || !bn_dp || !bn_dq || !bn_qi) { jwt_write_error(item, "Error decoding priv components"); goto cleanup_rsa; } } params = OSSL_PARAM_BLD_to_param(build); if (params == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error building params"); goto cleanup_rsa; // LCOV_EXCL_STOP } /* Create PEM from params */ ret = pctx_to_pem(pctx, params, item, priv); cleanup_rsa: OSSL_PARAM_free(params); OSSL_PARAM_BLD_free(build); EVP_PKEY_CTX_free(pctx); BN_free(bn_n); BN_free(bn_e); BN_free(bn_d); BN_free(bn_p); BN_free(bn_q); BN_free(bn_dp); BN_free(bn_dq); BN_free(bn_qi); return ret; } static const char *ec_crv_to_ossl_name(const char *crv) { const char *ret = crv; if (!strcmp(crv, "P-256")) ret = "prime256v1"; else if (!strcmp(crv, "P-384")) ret = "secp384r1"; else if (!strcmp(crv, "P-521")) ret = "secp521r1"; return ret; } /* For EC Keys (ES256, ES384, ES512) */ JWT_NO_EXPORT int openssl_process_ec(jwt_json_t *jwk, jwk_item_t *item) { OSSL_PARAM *params = NULL; OSSL_PARAM_BLD *build = NULL; jwt_json_t *crv, *x, *y, *d; EVP_PKEY_CTX *pctx = NULL; const char *crv_str; const char *ossl_crv; BIGNUM *bn = NULL; int priv = 0, ret = -1; void *pub_key = NULL; crv = jwt_json_obj_get(jwk, "crv"); x = jwt_json_obj_get(jwk, "x"); y = jwt_json_obj_get(jwk, "y"); d = jwt_json_obj_get(jwk, "d"); /* Check the minimal for pub key */ if (crv == NULL || x == NULL || y == NULL || !jwt_json_is_string(crv) || !jwt_json_is_string(x) || !jwt_json_is_string(y)) { jwt_write_error(item, "Missing or invalid type for one of crv, x, or y for pub key"); goto cleanup_ec; } crv_str = jwt_json_str_val(crv); strncpy(item->curve, crv_str, sizeof(item->curve) - 1); item->curve[sizeof(item->curve) - 1] = '\0'; /* Only private keys contain this field */ if (d != NULL) item->is_private_key = priv = 1; pctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL); if (pctx == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error creating pkey context"); goto cleanup_ec; // LCOV_EXCL_STOP } if (EVP_PKEY_fromdata_init(pctx) <= 0) { // LCOV_EXCL_START jwt_write_error(item, "Error preparing context for data"); goto cleanup_ec; // LCOV_EXCL_STOP } /* Set params */ build = OSSL_PARAM_BLD_new(); if (build == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error allocating param build"); goto cleanup_ec; // LCOV_EXCL_STOP } ossl_crv = ec_crv_to_ossl_name(crv_str); set_one_string(build, OSSL_PKEY_PARAM_GROUP_NAME, ossl_crv); pub_key = set_ec_pub_key(build, x, y, ossl_crv); if (pub_key == NULL) { jwt_write_error(item, "Error generating pub key from components"); goto cleanup_ec; } if (priv) { bn = set_one_bn(build, OSSL_PKEY_PARAM_PRIV_KEY, d); if (bn == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error parsing component d"); goto cleanup_ec; // LCOV_EXCL_STOP } } params = OSSL_PARAM_BLD_to_param(build); if (params == NULL) { // LCOV_EXCL_START jwt_write_error(item, "Error build params"); goto cleanup_ec; // LCOV_EXCL_STOP } /* Create PEM from params */ ret = pctx_to_pem(pctx, params, item, priv); cleanup_ec: OSSL_PARAM_free(params); OSSL_PARAM_BLD_free(build); OPENSSL_free(pub_key); EVP_PKEY_CTX_free(pctx); BN_free(bn); return ret; } JWT_NO_EXPORT void openssl_process_item_free(jwk_item_t *item) { if (item == NULL || item->provider != JWT_CRYPTO_OPS_OPENSSL) return; EVP_PKEY_free(item->provider_data); if (item->pem) { OPENSSL_cleanse(item->pem, strlen(item->pem)); OPENSSL_free(item->pem); } item->pem = NULL; item->provider_data = NULL; item->provider = JWT_CRYPTO_OPS_NONE; } libjwt-3.3.3/libjwt/openssl/jwt-openssl.h000066400000000000000000000012101517612317300204270ustar00rootroot00000000000000/* Copyright (C) 2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef JWT_OPENSSL_H #define JWT_OPENSSL_H int openssl_process_eddsa(jwt_json_t *jwk, jwk_item_t *item); int openssl_process_rsa(jwt_json_t *jwk, jwk_item_t *item); int openssl_process_ec(jwt_json_t *jwk, jwk_item_t *item); void openssl_process_item_free(jwk_item_t *item); #endif /* JWT_OPENSSL_H */ libjwt-3.3.3/libjwt/openssl/sign-verify.c000066400000000000000000000246021517612317300204110ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "jwt-private.h" #include "openssl/jwt-openssl.h" /* Routines to support crypto in LibJWT using OpenSSL. */ static int openssl_sign_sha_hmac(jwt_t *jwt, char **out, unsigned int *len, const char *str, unsigned int str_len) { const EVP_MD *alg; void *key; size_t key_len; key = jwt->key->oct.key; key_len = jwt->key->oct.len; *out = NULL; switch (jwt->alg) { /* HMAC */ case JWT_ALG_HS256: alg = EVP_sha256(); break; case JWT_ALG_HS384: alg = EVP_sha384(); break; case JWT_ALG_HS512: alg = EVP_sha512(); break; // LCOV_EXCL_START default: return 1; // LCOV_EXCL_STOP } *out = jwt_malloc(EVP_MAX_MD_SIZE); if (*out == NULL) return 1; // LCOV_EXCL_LINE if (HMAC(alg, key, key_len, (const unsigned char *)str, str_len, (unsigned char *)*out, len) == NULL) { // LCOV_EXCL_START jwt_freemem(*out); *out = NULL; return 1; // LCOV_EXCL_STOP } return 0; } static int jwt_ec_d2i(jwt_t *jwt, char **out, unsigned int *len, unsigned char *sig, unsigned int slen) { unsigned int bn_len, r_len, s_len, buf_len; ECDSA_SIG *ec_sig = NULL; const BIGNUM *ec_sig_r; const BIGNUM *ec_sig_s; unsigned char *buf; /* Get the sig from the DER encoded version. */ ec_sig = d2i_ECDSA_SIG(NULL, (const unsigned char **)&sig, slen); if (ec_sig == NULL) return 1; // LCOV_EXCL_LINE ECDSA_SIG_get0(ec_sig, &ec_sig_r, &ec_sig_s); r_len = BN_num_bytes(ec_sig_r); s_len = BN_num_bytes(ec_sig_s); bn_len = (jwt->key->bits + 7) / 8; if ((r_len > bn_len) || (s_len > bn_len)) { // LCOV_EXCL_START ECDSA_SIG_free(ec_sig); return 1; // LCOV_EXCL_STOP } buf_len = 2 * bn_len; buf = jwt_malloc(buf_len); if (buf == NULL) { // LCOV_EXCL_START ECDSA_SIG_free(ec_sig); return 1; // LCOV_EXCL_STOP } /* Pad the bignums with leading zeroes. Ends up looking sort * of like this "0000rrrrrrrSSSSS". */ memset(buf, 0, buf_len); BN_bn2bin(ec_sig_r, buf + (bn_len - r_len)); BN_bn2bin(ec_sig_s, buf + (buf_len - s_len)); ECDSA_SIG_free(ec_sig); *out = (char *)buf; *len = buf_len; return 0; } #define SIGN_ERROR(_msg) { jwt_write_error(jwt, "JWT[OpenSSL]: " _msg); goto jwt_sign_sha_pem_done; } static int openssl_sign_sha_pem(jwt_t *jwt, char **out, unsigned int *len, const char *str, unsigned int str_len) { EVP_MD_CTX *mdctx = NULL; EVP_PKEY_CTX *pkey_ctx = NULL; BIO *bufkey = NULL; const EVP_MD *alg; int type; EVP_PKEY *pkey = NULL; unsigned char *sig = NULL; size_t slen; pkey = jwt->key->provider_data; switch (jwt->alg) { /* RSA */ case JWT_ALG_RS256: alg = EVP_sha256(); type = EVP_PKEY_RSA; break; case JWT_ALG_RS384: alg = EVP_sha384(); type = EVP_PKEY_RSA; break; case JWT_ALG_RS512: alg = EVP_sha512(); type = EVP_PKEY_RSA; break; /* RSA-PSS */ case JWT_ALG_PS256: alg = EVP_sha256(); type = EVP_PKEY_RSA_PSS; break; case JWT_ALG_PS384: alg = EVP_sha384(); type = EVP_PKEY_RSA_PSS; break; case JWT_ALG_PS512: alg = EVP_sha512(); type = EVP_PKEY_RSA_PSS; break; /* ECC */ case JWT_ALG_ES256: case JWT_ALG_ES256K: alg = EVP_sha256(); type = EVP_PKEY_EC; break; case JWT_ALG_ES384: alg = EVP_sha384(); type = EVP_PKEY_EC; break; case JWT_ALG_ES512: alg = EVP_sha512(); type = EVP_PKEY_EC; break; /* EdDSA */ case JWT_ALG_EDDSA: /* Technically this is sha512 for ED25519 and * shake256 for ED448 */ alg = EVP_md_null(); type = EVP_PKEY_id(pkey); if (type != EVP_PKEY_ED25519 && type != EVP_PKEY_ED448) SIGN_ERROR("Unknown EdDSA curve"); // LCOV_EXCL_LINE break; // LCOV_EXCL_START default: return 1; // LCOV_EXCL_STOP } if (type == EVP_PKEY_RSA_PSS) { if (EVP_PKEY_id(pkey) != EVP_PKEY_RSA && EVP_PKEY_id(pkey) != EVP_PKEY_RSA_PSS) { SIGN_ERROR("Incompatible key for RSASSA-PSS"); // LCOV_EXCL_LINE } } else if (type != EVP_PKEY_id(pkey)) { SIGN_ERROR("Incompatible key"); // LCOV_EXCL_LINE } mdctx = EVP_MD_CTX_create(); if (mdctx == NULL) SIGN_ERROR("Error creating MD context"); // LCOV_EXCL_LINE /* Initialize the DigestSign operation using alg */ if (EVP_DigestSignInit(mdctx, &pkey_ctx, alg, NULL, pkey) != 1) SIGN_ERROR("Failued to initialize digest"); // LCOV_EXCL_LINE /* Required for RSA-PSS */ if (type == EVP_PKEY_RSA_PSS) { if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING) < 0) SIGN_ERROR("Error setting RSASSA-PSS padding"); // LCOV_EXCL_LINE if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, RSA_PSS_SALTLEN_DIGEST) < 0) SIGN_ERROR("Error setting RSASSA-PSS salt length"); // LCOV_EXCL_LINE } /* Get the size of sig first */ if (EVP_DigestSign(mdctx, NULL, &slen, (const unsigned char *)str, str_len) != 1) SIGN_ERROR("Error checking sig size"); // LCOV_EXCL_LINE /* Allocate memory for signature based on returned size */ sig = jwt_malloc(slen); if (sig == NULL) SIGN_ERROR("Out of memory"); // LCOV_EXCL_LINE /* Actual signing */ if (EVP_DigestSign(mdctx, sig, &slen, (const unsigned char *)str, str_len) != 1) SIGN_ERROR("Error singing token") // LCOV_EXCL_LINE; if (type == EVP_PKEY_EC) { /* For EC we need to convert to a raw format of R/S. */ if (jwt_ec_d2i(jwt, out, len, sig, slen)) SIGN_ERROR("ECDSA failed d2i"); // LCOV_EXCL_LINE /* jwt_ec_d2i has updated the out and len pointers on * success. Either way, we're done with this buffer. */ jwt_freemem(sig); sig = NULL; } else { /* Everything else, just pass back the original sig. */ *out = (char *)sig; *len = slen; } jwt_sign_sha_pem_done: if (jwt->error) jwt_freemem(sig); // LCOV_EXCL_LINE BIO_free(bufkey); EVP_MD_CTX_destroy(mdctx); return jwt->error; } #define VERIFY_ERROR(_msg) { jwt_write_error(jwt, "JWT[OpenSSL]: " _msg); goto jwt_verify_sha_pem_done; } static int openssl_verify_sha_pem(jwt_t *jwt, const char *head, unsigned int head_len, unsigned char *sig, int slen) { EVP_MD_CTX *mdctx = NULL; EVP_PKEY_CTX *pkey_ctx = NULL; ECDSA_SIG *ec_sig = NULL; BIGNUM *ec_sig_r = NULL; BIGNUM *ec_sig_s = NULL; EVP_PKEY *pkey = NULL; const EVP_MD *alg; int type; unsigned char *old_sig = NULL; BIO *bufkey = NULL; pkey = jwt->key->provider_data; switch (jwt->alg) { /* RSA */ case JWT_ALG_RS256: alg = EVP_sha256(); type = EVP_PKEY_RSA; break; case JWT_ALG_RS384: alg = EVP_sha384(); type = EVP_PKEY_RSA; break; case JWT_ALG_RS512: alg = EVP_sha512(); type = EVP_PKEY_RSA; break; /* RSA-PSS */ case JWT_ALG_PS256: alg = EVP_sha256(); type = EVP_PKEY_RSA_PSS; break; case JWT_ALG_PS384: alg = EVP_sha384(); type = EVP_PKEY_RSA_PSS; break; case JWT_ALG_PS512: alg = EVP_sha512(); type = EVP_PKEY_RSA_PSS; break; /* ECC */ case JWT_ALG_ES256: case JWT_ALG_ES256K: alg = EVP_sha256(); type = EVP_PKEY_EC; break; case JWT_ALG_ES384: alg = EVP_sha384(); type = EVP_PKEY_EC; break; case JWT_ALG_ES512: alg = EVP_sha512(); type = EVP_PKEY_EC; break; /* EdDSA */ case JWT_ALG_EDDSA: alg = NULL; if (EVP_PKEY_id(pkey) == EVP_PKEY_ED25519 || EVP_PKEY_id(pkey) == EVP_PKEY_ED448) type = EVP_PKEY_id(pkey); else VERIFY_ERROR("Unknown EdDSA curve"); // LCOV_EXCL_LINE break; // LCOV_EXCL_START default: VERIFY_ERROR("Unknown algorithm"); // LCOV_EXCL_STOP } if (type == EVP_PKEY_RSA_PSS) { if (EVP_PKEY_id(pkey) != EVP_PKEY_RSA_PSS && EVP_PKEY_id(pkey) != EVP_PKEY_RSA) VERIFY_ERROR("Incompatible key for RSASSA-PSS"); // LCOV_EXCL_LINE } else if (type != EVP_PKEY_id(pkey)) VERIFY_ERROR("Incompatible key for algorithm"); if (type == EVP_PKEY_EC) { /* Convert EC sigs back to ASN1. */ unsigned int bn_len; unsigned char *p; ec_sig = ECDSA_SIG_new(); if (ec_sig == NULL) VERIFY_ERROR("Failed to allocate ECDSA sig"); // LCOV_EXCL_LINE bn_len = (jwt->key->bits + 7) / 8; if ((bn_len * 2) != (unsigned int)slen) VERIFY_ERROR("ECDSA micmatch with sig len"); // LCOV_EXCL_LINE ec_sig_r = BN_bin2bn(sig, bn_len, NULL); ec_sig_s = BN_bin2bn(sig + bn_len, bn_len, NULL); if (ec_sig_r == NULL || ec_sig_s == NULL) VERIFY_ERROR("Error allocating R/S params"); // LCOV_EXCL_LINE ECDSA_SIG_set0(ec_sig, ec_sig_r, ec_sig_s); slen = i2d_ECDSA_SIG(ec_sig, NULL); /* Reset this with the new information */ old_sig = sig; sig = jwt_malloc(slen); if (sig == NULL) VERIFY_ERROR("Out of memory"); // LCOV_EXCL_LINE p = sig; slen = i2d_ECDSA_SIG(ec_sig, &p); if (slen == 0) VERIFY_ERROR("Error calculating ECDSA sig"); // LCOV_EXCL_LINE } mdctx = EVP_MD_CTX_create(); if (mdctx == NULL) VERIFY_ERROR("Error creatign MD context"); // LCOV_EXCL_LINE /* Initialize the DigestVerify operation using alg */ if (EVP_DigestVerifyInit(mdctx, &pkey_ctx, alg, NULL, pkey) != 1) VERIFY_ERROR("Error initializing mdctx"); // LCOV_EXCL_LINE if (type == EVP_PKEY_RSA_PSS) { if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING) < 0) VERIFY_ERROR("Error setting RSASSA-PSS padding"); // LCOV_EXCL_LINE if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, RSA_PSS_SALTLEN_AUTO) < 0) VERIFY_ERROR("Error setting RSASSA-PSS salt length"); // LCOV_EXCL_LINE } /* One-shot update and verify */ if (EVP_DigestVerify(mdctx, sig, slen, (const unsigned char *)head, head_len) != 1) VERIFY_ERROR("Failed to verify signature"); jwt_verify_sha_pem_done: if (old_sig != NULL) jwt_freemem(sig); BIO_free(bufkey); EVP_MD_CTX_destroy(mdctx); ECDSA_SIG_free(ec_sig); return jwt->error; } /* Export our ops */ struct jwt_crypto_ops jwt_openssl_ops = { .name = "openssl", .provider = JWT_CRYPTO_OPS_OPENSSL, .sign_sha_hmac = openssl_sign_sha_hmac, .sign_sha_pem = openssl_sign_sha_pem, .verify_sha_pem = openssl_verify_sha_pem, .jwk_implemented = 1, .process_eddsa = openssl_process_eddsa, .process_rsa = openssl_process_rsa, .process_ec = openssl_process_ec, .process_item_free = openssl_process_item_free, }; libjwt-3.3.3/libjwt/wincrypt/000077500000000000000000000000001517612317300161735ustar00rootroot00000000000000libjwt-3.3.3/libjwt/wincrypt/sign-verify.c000066400000000000000000000517441517612317300206140ustar00rootroot00000000000000/* Copyright (C) 2015-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include "jwt-private.h" /* Routines to support crypto in LibJWT using Windows crypto APIs. */ #define CERT_THUMBPRINT_STR_LEN 40 #define CERT_THUMBPRINT_HASH_LEN 20 #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) #define PEM_PUBLIC_KEY_HEADER "-----BEGIN PUBLIC KEY-----" #define CERT_STORE_PREFIX "cert:\\" static int get_cert_location( char *uri, int uri_len, DWORD *store_name, wchar_t **store_path, CRYPT_HASH_BLOB *thumbprint) { char *path; int path_len; char *sep; size_t store_name_len; size_t remainder_len; size_t thumbprint_len; char* thumbprint_str; char* store_path_mbs = NULL; size_t wchar_count; wchar_t* wchar_buf = NULL; errno_t ret; /* Certificate store path starts with cert:\ */ if (strncmp(uri, CERT_STORE_PREFIX, strlen(CERT_STORE_PREFIX))) return EINVAL; path = uri + strlen(CERT_STORE_PREFIX); path_len = uri_len - (int)strlen(CERT_STORE_PREFIX); sep = memchr(path, '\\', path_len); if (!sep) { ret = EINVAL; goto get_cert_location_done; } store_name_len = sep - path; if (!strncmp(path, "CurrentUser", store_name_len)) *store_name = CERT_SYSTEM_STORE_CURRENT_USER; else if (!strncmp(path, "LocalMachine", store_name_len)) *store_name = CERT_SYSTEM_STORE_LOCAL_MACHINE; else if (!strncmp(path, "CurrentService", store_name_len)) *store_name = CERT_SYSTEM_STORE_CURRENT_SERVICE; else if (!strncmp(path, "Services", store_name_len)) *store_name = CERT_SYSTEM_STORE_SERVICES; else if (!strncmp(path, "Users", store_name_len)) *store_name = CERT_SYSTEM_STORE_USERS; else if (!strncmp(path, "CurrentUserGroupPolicy", store_name_len)) *store_name = CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY; else if (!strncmp(path, "LocalMachineGroupPolicy", store_name_len)) *store_name = CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY; else if (!strncmp(path, "LocalMachineEnterprise", store_name_len)) *store_name = CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE; else { ret = EINVAL; goto get_cert_location_done; } remainder_len = path_len - (store_name_len + 1); store_path_mbs = (char*)jwt_malloc(remainder_len); if (!store_path_mbs) { ret = ENOMEM; goto get_cert_location_done; } if (memcpy_s(store_path_mbs, remainder_len, sep + 1, remainder_len)) { ret = EINVAL; goto get_cert_location_done; } sep = memchr(store_path_mbs, '\\', remainder_len); if (!sep) { ret = EINVAL; goto get_cert_location_done; } *sep = 0; thumbprint_str = sep + 1; thumbprint_len = remainder_len - (thumbprint_str - store_path_mbs); if (thumbprint_len != CERT_THUMBPRINT_STR_LEN) { ret = EINVAL; goto get_cert_location_done; } if (!CryptStringToBinaryA( thumbprint_str, CERT_THUMBPRINT_STR_LEN, CRYPT_STRING_HEX, thumbprint->pbData, &thumbprint->cbData, NULL, NULL)) { ret = EINVAL; goto get_cert_location_done; } /* Convert store_name to wide chars, which cert API requires. */ if (mbstowcs_s(&wchar_count, NULL, 0, store_path_mbs, 0)) { ret = EINVAL; goto get_cert_location_done; } wchar_buf = (wchar_t*)jwt_malloc(wchar_count * sizeof(wchar_t)); if (!wchar_buf) { ret = ENOMEM; goto get_cert_location_done; } if (mbstowcs_s(NULL, wchar_buf, wchar_count, store_path_mbs, _TRUNCATE)) { ret = EINVAL; goto get_cert_location_done; } *store_path = wchar_buf; ret = 0; get_cert_location_done: if (store_path_mbs) jwt_freemem(store_path_mbs); if (ret && wchar_buf) jwt_freemem(wchar_buf); return ret; } #define OPEN_PRIVATE_STORE_ERROR(__err) { ret = __err; goto open_private_key_from_store_done; } static int open_private_key_from_store( unsigned char* key, int key_len, HCERTSTORE* hCertStore_out, PCCERT_CONTEXT* pSignerCert_out, NCRYPT_PROV_HANDLE* hStorageProv_out, NCRYPT_KEY_HANDLE* hKey_out) { int ret = EINVAL; DWORD store_name; wchar_t* store_path = NULL; CRYPT_HASH_BLOB thumbprint; BYTE thumbprint_buf[CERT_THUMBPRINT_HASH_LEN]; DWORD keyProvInfoSize; HCERTSTORE hCertStore = NULL; PCCERT_CONTEXT pSignerCert = NULL; CRYPT_KEY_PROV_INFO *pKeyProvInfo = NULL; DWORD dwKeyFlags; NCRYPT_PROV_HANDLE hStorageProv = (NCRYPT_PROV_HANDLE)NULL; NCRYPT_KEY_HANDLE hKey = (NCRYPT_KEY_HANDLE)NULL; *hCertStore_out = NULL; *pSignerCert_out = NULL; *hStorageProv_out = (NCRYPT_PROV_HANDLE)NULL; *hKey_out = (NCRYPT_KEY_HANDLE)NULL; /* Break down cert path. */ thumbprint.pbData = thumbprint_buf; thumbprint.cbData = CERT_THUMBPRINT_HASH_LEN; ret = get_cert_location(key, key_len, &store_name, &store_path, &thumbprint); if (ret) goto open_private_key_from_store_done; /* Open the certificate store. */ if (!(hCertStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, (HCRYPTPROV_LEGACY)NULL, store_name | CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG, store_path))) OPEN_PRIVATE_STORE_ERROR(ENOENT); /* * Get a pointer to the signer's certificate. * This certificate must have access to the signer's private key. */ if (!(pSignerCert = CertFindCertificateInStore( hCertStore, MY_ENCODING_TYPE, 0, CERT_FIND_HASH, &thumbprint, NULL))) OPEN_PRIVATE_STORE_ERROR(ENOENT); /* Get private key provider info. */ if (!(CertGetCertificateContextProperty( pSignerCert, CERT_KEY_PROV_INFO_PROP_ID, NULL, &keyProvInfoSize))) OPEN_PRIVATE_STORE_ERROR(ENOENT); if (!(pKeyProvInfo = (CRYPT_KEY_PROV_INFO *)jwt_malloc(keyProvInfoSize))) OPEN_PRIVATE_STORE_ERROR(ENOMEM); if (!CertGetCertificateContextProperty( pSignerCert, CERT_KEY_PROV_INFO_PROP_ID, pKeyProvInfo, &keyProvInfoSize)) OPEN_PRIVATE_STORE_ERROR(ENOENT); /* Open key using NCrypt. */ if (NCryptOpenStorageProvider( &hStorageProv, pKeyProvInfo->pwszProvName, 0) != ERROR_SUCCESS) OPEN_PRIVATE_STORE_ERROR(ENOENT); dwKeyFlags = NCRYPT_SILENT_FLAG | ((store_name == CERT_SYSTEM_STORE_LOCAL_MACHINE) ? NCRYPT_MACHINE_KEY_FLAG : 0); if (NCryptOpenKey( hStorageProv, &hKey, pKeyProvInfo->pwszContainerName, 0, dwKeyFlags) != ERROR_SUCCESS) OPEN_PRIVATE_STORE_ERROR(ENOENT); ret = 0; open_private_key_from_store_done: if (store_path) jwt_freemem(store_path); if (pKeyProvInfo) jwt_freemem(pKeyProvInfo); if (ret) { if (pSignerCert) CertFreeCertificateContext(pSignerCert); if (hCertStore) CertCloseStore(hCertStore, CERT_CLOSE_STORE_CHECK_FLAG); if (hKey) NCryptFreeObject(hKey); if (hStorageProv) NCryptFreeObject(hStorageProv); } else { *pSignerCert_out = pSignerCert; *hCertStore_out = hCertStore; *hKey_out = hKey; *hStorageProv_out = hStorageProv; } return ret; } #define OPEN_PUBLIC_STORE_ERROR(__err) { ret = __err; goto open_public_key_from_store_done; } static int open_public_key_from_store( unsigned char* key, int key_len, HCERTSTORE* hCertStore_out, PCCERT_CONTEXT* pSignerCert_out, BCRYPT_KEY_HANDLE* hKey_out) { int ret = EINVAL; DWORD store_name; wchar_t* store_path = NULL; CRYPT_HASH_BLOB thumbprint; BYTE thumbprint_buf[CERT_THUMBPRINT_HASH_LEN]; HCERTSTORE hCertStore = NULL; PCCERT_CONTEXT pSignerCert = NULL; BCRYPT_KEY_HANDLE hKey = (BCRYPT_KEY_HANDLE)NULL; *hCertStore_out = NULL; *pSignerCert_out = NULL; *hKey_out = (BCRYPT_KEY_HANDLE)NULL; /* Break down cert path. */ thumbprint.pbData = thumbprint_buf; thumbprint.cbData = CERT_THUMBPRINT_HASH_LEN; ret = get_cert_location(key, key_len, &store_name, &store_path, &thumbprint); if (ret) goto open_public_key_from_store_done; /* Open the certificate store. */ if (!(hCertStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, (HCRYPTPROV_LEGACY)NULL, store_name | CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG, store_path))) OPEN_PUBLIC_STORE_ERROR(ENOENT); /* * Get a pointer to the signer's certificate. * This certificate must have access to the signer's private key. */ if (!(pSignerCert = CertFindCertificateInStore( hCertStore, MY_ENCODING_TYPE, 0, CERT_FIND_HASH, &thumbprint, NULL))) OPEN_PUBLIC_STORE_ERROR(ENOENT); if (!CryptImportPublicKeyInfoEx2(X509_ASN_ENCODING, &pSignerCert->pCertInfo->SubjectPublicKeyInfo, 0, NULL, &hKey)) OPEN_PUBLIC_STORE_ERROR(EINVAL); ret = 0; open_public_key_from_store_done: if (store_path) jwt_freemem(store_path); if (ret) { if (pSignerCert) CertFreeCertificateContext(pSignerCert); if (hCertStore) CertCloseStore(hCertStore, CERT_CLOSE_STORE_CHECK_FLAG); if (hKey) BCryptDestroyKey(hKey); } else { *pSignerCert_out = pSignerCert; *hCertStore_out = hCertStore; *hKey_out = hKey; } return ret; } #define OPEN_PUBLIC_PEM_ERROR(__err) { ret = __err; goto open_public_key_from_pem_done; } static int open_public_key_from_pem( unsigned char* key, int key_len, BCRYPT_KEY_HANDLE* hKey_out) { int ret = EINVAL; BYTE* pbPublicKeyDer = NULL; DWORD cbPublicKeyDer; PCERT_PUBLIC_KEY_INFO pbPublicKeyInfo = NULL; DWORD cbPublicKeyInfo; BCRYPT_KEY_HANDLE hKey = (BCRYPT_KEY_HANDLE)NULL; /* Convert public key from PEM to DER. */ if (!CryptStringToBinaryA( key, key_len, CRYPT_STRING_BASE64HEADER, NULL, &cbPublicKeyDer, NULL, NULL)) OPEN_PUBLIC_PEM_ERROR(EINVAL); if (!(pbPublicKeyDer = (BYTE *)jwt_malloc(cbPublicKeyDer))) OPEN_PUBLIC_PEM_ERROR(ENOMEM); if (!CryptStringToBinaryA( key, key_len, CRYPT_STRING_BASE64HEADER, pbPublicKeyDer, &cbPublicKeyDer, NULL, NULL)) OPEN_PUBLIC_PEM_ERROR(EINVAL); /* Create public key info. */ if (!CryptDecodeObjectEx( X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, pbPublicKeyDer, cbPublicKeyDer, 0, NULL, NULL, &cbPublicKeyInfo)) OPEN_PUBLIC_PEM_ERROR(EINVAL); if (!(pbPublicKeyInfo = (PCERT_PUBLIC_KEY_INFO)jwt_malloc(cbPublicKeyInfo))) OPEN_PUBLIC_PEM_ERROR(ENOMEM); if (!CryptDecodeObjectEx( X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, pbPublicKeyDer, cbPublicKeyDer, 0, NULL, pbPublicKeyInfo, &cbPublicKeyInfo)) OPEN_PUBLIC_PEM_ERROR(EINVAL); /* Import public key into CNG. */ if (!CryptImportPublicKeyInfoEx2( X509_ASN_ENCODING, pbPublicKeyInfo, 0, NULL, &hKey)) OPEN_PUBLIC_PEM_ERROR(EINVAL); *hKey_out = hKey; ret = 0; open_public_key_from_pem_done: if (pbPublicKeyDer) jwt_freemem(pbPublicKeyDer); if (pbPublicKeyInfo) jwt_freemem(pbPublicKeyInfo); if (ret) { if (hKey) BCryptDestroyKey(hKey); } else { *hKey_out = hKey; } return ret; } static int is_public_key_pem(unsigned char* key, int key_len) { if (key_len < strlen(PEM_PUBLIC_KEY_HEADER)) return 0; return !memcmp(key, PEM_PUBLIC_KEY_HEADER, strlen(PEM_PUBLIC_KEY_HEADER)); } #define SIGN_HMAC_ERROR(__err) { ret = __err; goto jwt_sign_sha_hmac_done; } static int wincrypt_sign_sha_hmac(jwt_t *jwt, char **out, unsigned int *len, const char *str) { int ret = EINVAL; LPCWSTR alg; BCRYPT_ALG_HANDLE hAlg = (BCRYPT_ALG_HANDLE)NULL; BCRYPT_HASH_HANDLE hHash = (BCRYPT_HASH_HANDLE)NULL; BYTE* pbHashObject = NULL; DWORD cbHashObject; BYTE* pbHashValue = NULL; DWORD cbHashValue; DWORD cbDummy; /* Lookup algorithm type. */ switch (jwt->alg) { /* HMAC */ case JWT_ALG_HS256: alg = BCRYPT_SHA256_ALGORITHM; break; case JWT_ALG_HS384: alg = BCRYPT_SHA384_ALGORITHM; break; case JWT_ALG_HS512: alg = BCRYPT_SHA512_ALGORITHM; break; default: /* For now, do not support ECC on Windows */ SIGN_HMAC_ERROR(EINVAL); } /* Hash the JWT using the selected algorithm, and with MAC. */ if (BCryptOpenAlgorithmProvider( &hAlg, alg, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG) != ERROR_SUCCESS) SIGN_HMAC_ERROR(EINVAL); if (BCryptGetProperty( hAlg, BCRYPT_OBJECT_LENGTH, (PBYTE)&cbHashObject, sizeof(DWORD), &cbDummy, 0) != ERROR_SUCCESS) SIGN_HMAC_ERROR(EINVAL); if (!(pbHashObject = (BYTE*)jwt_malloc(cbHashObject))) SIGN_HMAC_ERROR(ENOMEM); if (BCryptCreateHash( hAlg, &hHash, pbHashObject, cbHashObject, jwt->key, jwt->key_len, 0) != ERROR_SUCCESS) SIGN_HMAC_ERROR(EINVAL); if (BCryptGetProperty( hAlg, BCRYPT_HASH_LENGTH, (PBYTE)&cbHashValue, sizeof(DWORD), &cbDummy, 0) != ERROR_SUCCESS) SIGN_HMAC_ERROR(EINVAL); if (!(pbHashValue = (BYTE*)jwt_malloc(cbHashValue))) SIGN_HMAC_ERROR(ENOMEM); if (BCryptHashData( hHash, (PUCHAR)str, (ULONG)strlen(str), 0) != ERROR_SUCCESS) SIGN_HMAC_ERROR(EINVAL); if (BCryptFinishHash( hHash, pbHashValue, cbHashValue, 0) != ERROR_SUCCESS) SIGN_HMAC_ERROR(EINVAL); /* Done! */ *out = pbHashValue; *len = cbHashValue; ret = 0; jwt_sign_sha_hmac_done: if (hHash) BCryptDestroyHash(hHash); if (hAlg) BCryptCloseAlgorithmProvider(hAlg, 0); if (pbHashObject) jwt_freemem(pbHashObject); /* Only free result string if function failed. */ if (ret && pbHashValue) jwt_freemem(pbHashValue); return ret; } #define SIGN_PEM_ERROR(__err) { ret = __err; goto jwt_sign_sha_pem_done; } static int wincrypt_sign_sha_pem(jwt_t *jwt, char **out, unsigned int *len, const char *str) { int ret = EINVAL; LPCWSTR alg; int isECDSA = 0; HCERTSTORE hCertStore = NULL; PCCERT_CONTEXT pSignerCert = NULL; NCRYPT_PROV_HANDLE hStorageProv = (NCRYPT_PROV_HANDLE)NULL; NCRYPT_KEY_HANDLE hStoreKey = (NCRYPT_KEY_HANDLE)NULL; BCRYPT_ALG_HANDLE hAlg = (BCRYPT_ALG_HANDLE)NULL; BCRYPT_HASH_HANDLE hHash = (BCRYPT_HASH_HANDLE)NULL; BYTE* pbHashObject = NULL; DWORD cbHashObject; BYTE* pbHashValue = NULL; DWORD cbHashValue; DWORD cbDummy; BCRYPT_PKCS1_PADDING_INFO paddingInfo; BYTE* pbSignature = NULL; DWORD cbSignature; DWORD ncryptSignFlags; /* Lookup algorithm type. */ switch (jwt->alg) { /* RSA */ case JWT_ALG_RS256: alg = BCRYPT_SHA256_ALGORITHM; isECDSA = 0; break; case JWT_ALG_RS384: alg = BCRYPT_SHA384_ALGORITHM; isECDSA = 0; break; case JWT_ALG_RS512: alg = BCRYPT_SHA512_ALGORITHM; isECDSA = 0; break; /* ECC */ case JWT_ALG_ES256: case JWT_ALG_ES256K: alg = BCRYPT_SHA256_ALGORITHM; isECDSA = 1; break; case JWT_ALG_ES384: alg = BCRYPT_SHA384_ALGORITHM; isECDSA = 1; break; case JWT_ALG_ES512: alg = BCRYPT_SHA512_ALGORITHM; isECDSA = 1; break; default: SIGN_PEM_ERROR(EINVAL); } /* * Open private key in certificate store. * * Note that in Windows crypto APIs, there are no obvious ways to * import a generic private key from a PEM encoded string, nor is * it desirable on Windows platforms to have private keys outside * of the Windows certificate store. Therefore, only support keys * in the certificate store. */ ret = open_private_key_from_store( jwt->key, jwt->key_len, &hCertStore, &pSignerCert, &hStorageProv, &hStoreKey); if (ret) goto jwt_sign_sha_pem_done; /* Hash the JWT using the selected algorithm. */ if (BCryptOpenAlgorithmProvider( &hAlg, alg, NULL, 0) != ERROR_SUCCESS) SIGN_PEM_ERROR(EINVAL); if (BCryptGetProperty( hAlg, BCRYPT_OBJECT_LENGTH, (PBYTE)&cbHashObject, sizeof(DWORD), &cbDummy, 0) != ERROR_SUCCESS) SIGN_PEM_ERROR(EINVAL); if (!(pbHashObject = (BYTE*)jwt_malloc(cbHashObject))) SIGN_PEM_ERROR(ENOMEM); if (BCryptCreateHash( hAlg, &hHash, pbHashObject, cbHashObject, NULL, 0, 0) != ERROR_SUCCESS) SIGN_PEM_ERROR(EINVAL); if (BCryptGetProperty( hAlg, BCRYPT_HASH_LENGTH, (PBYTE)&cbHashValue, sizeof(DWORD), &cbDummy, 0) != ERROR_SUCCESS) SIGN_PEM_ERROR(EINVAL); if (!(pbHashValue = (BYTE*)jwt_malloc(cbHashValue))) SIGN_PEM_ERROR(ENOMEM); if (BCryptHashData( hHash, (PUCHAR)str, (ULONG)strlen(str), 0) != ERROR_SUCCESS) SIGN_PEM_ERROR(EINVAL); if (BCryptFinishHash( hHash, pbHashValue, cbHashValue, 0) != ERROR_SUCCESS) SIGN_PEM_ERROR(EINVAL); /* Sign the hash using the private key. */ ncryptSignFlags = NCRYPT_SILENT_FLAG | (isECDSA ? 0 : NCRYPT_PAD_PKCS1_FLAG); paddingInfo.pszAlgId = alg; if (NCryptSignHash( hStoreKey, (isECDSA ? NULL : &paddingInfo), pbHashValue, cbHashValue, NULL, 0, &cbSignature, ncryptSignFlags) != ERROR_SUCCESS) SIGN_PEM_ERROR(EINVAL); if (!(pbSignature = (BYTE*)jwt_malloc(cbSignature))) SIGN_PEM_ERROR(ENOMEM); paddingInfo.pszAlgId = alg; if (NCryptSignHash( hStoreKey, (isECDSA ? NULL : &paddingInfo), pbHashValue, cbHashValue, pbSignature, cbSignature, &cbDummy, ncryptSignFlags) != ERROR_SUCCESS) SIGN_PEM_ERROR(EINVAL); /* Done! */ *out = pbSignature; *len = cbSignature; ret = 0; jwt_sign_sha_pem_done: if (hHash) BCryptDestroyHash(hHash); if (hAlg) BCryptCloseAlgorithmProvider(hAlg, 0); if (hStoreKey) NCryptFreeObject(hStoreKey); if (hStorageProv) NCryptFreeObject(hStorageProv); if (pSignerCert) CertFreeCertificateContext(pSignerCert); if (hCertStore) CertCloseStore(hCertStore, CERT_CLOSE_STORE_CHECK_FLAG); if (pbHashObject) jwt_freemem(pbHashObject); if (pbHashValue) jwt_freemem(pbHashValue); /* Only free result string if function failed. */ if (ret && pbSignature) jwt_freemem(pbSignature); return ret; } #define VERIFY_PEM_ERROR(__err) { ret = __err; goto jwt_verify_sha_pem_done; } static int wincrypt_verify_sha_pem(jwt_t *jwt, const char *head, unsigned char *sig, int sig_len) { int ret = EINVAL; LPCWSTR alg; int isECDSA = 0; BYTE* pbSignature = NULL; DWORD cbSignature; HCERTSTORE hCertStore = NULL; PCCERT_CONTEXT pSignerCert = NULL; BCRYPT_ALG_HANDLE hHashAlg = (BCRYPT_ALG_HANDLE)NULL; BCRYPT_KEY_HANDLE hKey = (BCRYPT_KEY_HANDLE)NULL; BCRYPT_HASH_HANDLE hHash = (BCRYPT_HASH_HANDLE)NULL; BYTE* pbHashObject = NULL; DWORD cbHashObject; BYTE* pbHashValue = NULL; DWORD cbHashValue; DWORD cbDummy; BCRYPT_PKCS1_PADDING_INFO paddingInfo; /* Lookup algorithm type. */ switch (jwt->alg) { /* RSA */ case JWT_ALG_RS256: alg = BCRYPT_SHA256_ALGORITHM; isECDSA = 0; break; case JWT_ALG_RS384: alg = BCRYPT_SHA384_ALGORITHM; isECDSA = 0; break; case JWT_ALG_RS512: alg = BCRYPT_SHA512_ALGORITHM; isECDSA = 0; break; /* ECC */ case JWT_ALG_ES256: case JWT_ALG_ES256K: alg = BCRYPT_SHA256_ALGORITHM; isECDSA = 1; break; case JWT_ALG_ES384: alg = BCRYPT_SHA384_ALGORITHM; isECDSA = 1; break; case JWT_ALG_ES512: alg = BCRYPT_SHA512_ALGORITHM; isECDSA = 1; break; default: VERIFY_PEM_ERROR(EINVAL); } pbSignature = sig; cbSignature = sig_len; /* Open handle to public key. */ if (is_public_key_pem(jwt->key, jwt->key_len)) { ret = open_public_key_from_pem( jwt->key, jwt->key_len, &hKey); } else { ret = open_public_key_from_store( jwt->key, jwt->key_len, &hCertStore, &pSignerCert, &hKey); } if (ret) goto jwt_verify_sha_pem_done; /* Hash data. */ if (BCryptOpenAlgorithmProvider( &hHashAlg, alg, NULL, 0) != ERROR_SUCCESS) VERIFY_PEM_ERROR(EINVAL); if (BCryptGetProperty( hHashAlg, BCRYPT_OBJECT_LENGTH, (PBYTE)&cbHashObject, sizeof(DWORD), &cbDummy, 0) != ERROR_SUCCESS) VERIFY_PEM_ERROR(EINVAL); if (!(pbHashObject = (BYTE*)jwt_malloc(cbHashObject))) VERIFY_PEM_ERROR(ENOMEM); if (BCryptCreateHash( hHashAlg, &hHash, pbHashObject, cbHashObject, NULL, 0, 0) != ERROR_SUCCESS) VERIFY_PEM_ERROR(EINVAL); if (BCryptGetProperty( hHashAlg, BCRYPT_HASH_LENGTH, (PBYTE)&cbHashValue, sizeof(DWORD), &cbDummy, 0) != ERROR_SUCCESS) VERIFY_PEM_ERROR(EINVAL); if (!(pbHashValue = (BYTE*)jwt_malloc(cbHashValue))) VERIFY_PEM_ERROR(ENOMEM); if (BCryptHashData( hHash, (PUCHAR)head, (ULONG)strlen(head), 0) != ERROR_SUCCESS) VERIFY_PEM_ERROR(EINVAL); if (BCryptFinishHash( hHash, pbHashValue, cbHashValue, 0) != ERROR_SUCCESS) VERIFY_PEM_ERROR(EINVAL); /* Verify hash against signature. */ paddingInfo.pszAlgId = alg; if (BCryptVerifySignature( hKey, (isECDSA ? NULL : &paddingInfo), pbHashValue, cbHashValue, pbSignature, cbSignature, (isECDSA ? 0 : BCRYPT_PAD_PKCS1)) != ERROR_SUCCESS) VERIFY_PEM_ERROR(EINVAL); /* Signature valid! */ ret = 0; jwt_verify_sha_pem_done: if (pbHashObject) jwt_freemem(pbHashObject); if (pbHashValue) jwt_freemem(pbHashValue); if (hHash) BCryptDestroyHash(hHash); if (hKey) BCryptDestroyKey(hKey); if (hHashAlg) BCryptCloseAlgorithmProvider(hHashAlg, 0); if (pSignerCert) CertFreeCertificateContext(pSignerCert); if (hCertStore) CertCloseStore(hCertStore, CERT_CLOSE_STORE_CHECK_FLAG); return ret; } int wincrypt_process_eddsa(jwt_json_t *jwk, jwk_item_t *item); int wincrypt_process_rsa(jwt_json_t *jwk, jwk_item_t *item); int wincrypt_process_ec(jwt_json_t *jwk, jwk_item_t *item); void wincrypt_process_item_free(jwk_item_t *item); /* Export our ops */ struct jwt_crypto_ops jwt_gnutls_ops = { .name = "wincrypt", .provider = JWT_CRYPTO_OPS_WINCRYPT, .sign_sha_hmac = wincrypt_sign_sha_hmac, .sign_sha_pem = wincrypt_sign_sha_pem, .verify_sha_pem = wincrypt_verify_sha_pem, /* Needs to be implemented */ .jwk_implemented = 0, .process_eddsa = wincrypt_process_eddsa, .process_rsa = wincrypt_process_rsa, .process_ec = wincrypt_process_ec, .process_item_free = wincrypt_process_item_free, }; libjwt-3.3.3/tests/000077500000000000000000000000001517612317300141635ustar00rootroot00000000000000libjwt-3.3.3/tests/cli/000077500000000000000000000000001517612317300147325ustar00rootroot00000000000000libjwt-3.3.3/tests/cli/all.json000066400000000000000000000564701517612317300164110ustar00rootroot00000000000000{ "keys": [ { "key_ops": [ "sign" ], "kty": "oct", "k": "LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1JR2tBZ0VCQkRCZUxDZ2FwalptdlRhdE1IYVlYM0EwMiswWXMzVHI4a2RhK0U5REZubUNTaUNPRWlnNTE5ZlQKMTNlZGVVOFlkRHVnQndJQW1Db3JuaG9saW9OaUFBU2liRUwzSnh6d0NSZExCWkNtN1dRM2tXYURMK3dQOG9tbwo0bUR2MCs5ZTR1SlZRZjN4d0V2K2p5d05VSCt3YlBNPQotLS0tLUVORCBFQyBQUklWQVRFIEtFWS0tLS0tCg", "alg": "HS512" }, { "key_ops": [ "sign" ], "kty": "oct", "k": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUhZd0VBWUlBbUNvcm5ob2xpb0ZLNEVFQUNJRFlnQUVvbXhDOXljYzhBa1hTd1dRcHUxa041Rm1neS9zRC9LSgowZUpnNzlQdlh1TGlWVUg5OGNCTC9vOHNEVkIvc0d6egotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0K", "alg": "HS512" }, { "key_ops": [ "sign" ], "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "_bSTCXlDeU-pZZbOKDUVLANspSIeuKZfTM8rtXFG_RU", "d": "wDvSCv8kxkqIVTYPpgEm4Efs6lKzf-95W8Qej4F1yEM" }, { "use": "sig", "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "_bSTCXlDeU-pZZbOKDUVLANspSIeuKZfTM8rtXFG_RU" }, { "key_ops": [ "sign" ], "kty": "EC", "alg": "ES256K", "crv": "secp256k1", "x": "7xdE1j-vQLoWBnhP7Mn70yNhPDCO6pytCqMJTeJ7_90", "y": "795Zo2s891l9E7Jb57g9CEvRVGk_LJ7Hy0ixzGcV8UE", "d": "zTih0G_1ZdZupZhb7SgOyqsoe2dudSWNPtM4Vt2OYJk" }, { "use": "sig", "kty": "EC", "alg": "ES256K", "crv": "secp256k1", "x": "7xdE1j-vQLoWBnhP7Mn70yNhPDCO6pytCqMJTeJ7_90", "y": "795Zo2s891l9E7Jb57g9CEvRVGk_LJ7Hy0ixzGcV8UE" }, { "key_ops": [ "sign" ], "kty": "EC", "alg": "ES384", "crv": "P-384", "x": "omxC9ycc8AkXSwWQpu1kN5Fmgy_sD_KJqN3tlSZmUEZ3w3c6KYJfK97PMOSZQaUd", "y": "eydBoq_IOglQQOj8zLqubq5IpaaUiDQ50eJg79PvXuLiVUH98cBL_o8sDVB_sGzz", "d": "XiwoGqY2Zr02rTB2mF9wNNvtGLN06_JHWvhPQxZ5gkogjhIoOdfX09d3nXlPGHQ7" }, { "use": "sig", "kty": "EC", "alg": "ES384", "crv": "P-384", "x": "omxC9ycc8AkXSwWQpu1kN5Fmgy_sD_KJqN3tlSZmUEZ3w3c6KYJfK97PMOSZQaUd", "y": "eydBoq_IOglQQOj8zLqubq5IpaaUiDQ50eJg79PvXuLiVUH98cBL_o8sDVB_sGzz" }, { "key_ops": [ "sign" ], "kty": "EC", "alg": "ES512", "crv": "P-521", "x": "_axE26pXWXesAjcTP_2Tfe4EcF4A3LuqgpIFzrftiztViq0-5deUvfcxuPIFk-ANVinlAOzgZWpFS0kheI7KJAY", "y": "3fOHn5ZTU08AAjau0CoZe9GSPUC4cnSy1nqetiKBW0YpBvhaY5FXnngvfHUHdmkFSVLCS6N-LXoi_dm0Fbo6snE", "d": "p6rxb2PoAISjCCTxpTQOxv5arJ_N6Xibr0eyOAnlWcVk34m1W5323_6TcPGTtFQgEX9TWjNcp9W8HIuIyRdLnsI" }, { "use": "sig", "kty": "EC", "alg": "ES512", "crv": "P-521", "x": "_axE26pXWXesAjcTP_2Tfe4EcF4A3LuqgpIFzrftiztViq0-5deUvfcxuPIFk-ANVinlAOzgZWpFS0kheI7KJAY", "y": "3fOHn5ZTU08AAjau0CoZe9GSPUC4cnSy1nqetiKBW0YpBvhaY5FXnngvfHUHdmkFSVLCS6N-LXoi_dm0Fbo6snE" }, { "key_ops": [ "sign" ], "kty": "OKP", "crv": "Ed25519", "alg": "EdDSA", "d": "XY5oUZqGWVZhX7J09hG-rRnAKXiw1g_aBh-Bc52KZ_Y" }, { "use": "sig", "kty": "OKP", "crv": "Ed25519", "alg": "EdDSA", "x": "HUj-14kN6N4i5qNVkfEhwKiCf-tSrvRHstQdtV8a5QM" }, { "key_ops": [ "sign" ], "kty": "OKP", "crv": "Ed448", "alg": "EdDSA", "d": "nsYcSyibFeqtBBmVUh3S_xGTNQJr0IGwVmU6gTd8Xn-gtb-PxxzPhJnUXZ_UdkPRsz2SY0d8On-t" }, { "use": "sig", "kty": "OKP", "crv": "Ed448", "alg": "EdDSA", "x": "J5dXafOvQWBrUabIHVqTbiDU4Jq7RtozL5jopRdiUGp-rs0Kz-f0-2r7scLjclKO9q8r3m9_YGAA" }, { "key_ops": [ "sign" ], "kty": "RSA", "n": "tY1EN770i5YmM04J-5TJr4eVjTtmJ7qVZdg46RjMVL9kXmNUSjRZKOoI798IoGhHCOSUOs26lxnegazKIeADuFOpgWXWwcC9jGrCly30zho_pUAHA8LEZjaQtuZatT9XyRSQC6inHIyRZrqq7hzhyFpcL-7sqwITtTSPADVRjPk", "e": "AQAB", "d": "QcjNVjHAJLAkaWS2o013gz3qx8ElM_Ic3klp3bSZnX-4W6c8TKMJR5T95gT3-D-wtZ01xNT07nl2MaCtoXatgcku7vPaarOqO_VGE99RFEenHKNg90mx1DqXglqGbGwUSHUleZpNzsbHzn5Kp9G9F-pNPxiR2uGWY6GKq2JAPfE", "p": "6l9vSEey8h7zq3utvd62pfGrWbPeCIdN4qs_YtfAL2ZOQqBySZVB82wS73q_6EXCcFByMek5UZ6BiXczxIxgHQ", "q": "xk4MF3FBTRsG7V-LFZYMJg6QMYhRx40TMRbtcGwJ9bqPICMT6dyer4p_YJ-M-JBn2V3ykFcjNvM148tNZTqBjQ", "dp": "nSUcElSwsRL7wpEMr3Ay-xUNFPo693DxUfgMahPLMnzgIGBAAQJo0_Q0xgmBvxV3B6OIzdpYqlci967LMRAGKQ", "dq": "t4O4quUTYnC1i2yUwOg32-w0QrJ9w-bpMM-f8h75ZJ8-HqZ3oj-Z1qeb02Yzxj-U61KGzE7nds3CPEmDGT_4bQ", "qi": "3ckWVl2ALDerVMOZTBBjcUpiGH9a43WhU5_od7OE-F24XDWZlbr3AFlFh1FmS8eWk-wrxs9pXPZG7eBpKlJYGg" }, { "key_ops": [ "sign" ], "kty": "RSA", "n": "wtpMAM4l1H995oqlqdMhuqNuffp4-4aUCwuFE9B5s9MJr63gyf8jW0oDr7Mb1Xb8y9iGkWfhouZqNJbMFry-iBs-z2TtJF06vbHQZzajDsdux3XVfXv9v6dDIImyU24MsGNkpNt0GISaaiqv51NMZQX0miOXXWdkQvWTZFXhmsFCmJLE67oQFSar4hzfAaCulaMD-b3Mcsjlh0yvSq7g6swiIasEU3qNLKaJAZEzfywroVYr3BwM1IiVbQeKgIkyPS_85M4Y6Ss_T-OWi1OeK49NdYBvFP-hNVEoeZzJz5K_nd6C35IX0t2bN5CVXchUFmaUMYk2iPdhXdsC720tBw", "e": "AQAB", "d": "D8dTnkETSSjlzhRuI9loAtAXM3Zj86JLPLW7GgaoxEoTn7lJ2bGicFMHB2ROnbOb9vnas82gtOtJsGaBslmoaCckp_C5T1eJWTEb-i-vdpPpwZcmKZovyyRFSE4-NYlU17fEv6DRvuaGBpDcW7QgHJIl45F8QWEM-msee2KE-V4Gz_9vAQ-sOlvsb4mJP1tJIBx9Lb5loVREwCRy2Ha9tnWdDNar8EYkOn8si4snPT-E3ZCy8mlcZyUkZeiS_HdtydxZfoiwrSRYamd1diQpPhWCeRteQ802a7ds0Y2YzgfFUaYjNuRQm7zA__hwbXS7ELPyNMU15N00bajlG0tUOQ", "p": "5y8tNZdtDp3lugNnCAyA8mIcuTu7rpbGhLSUXlJXIxAzJIp_G--u6tlWR2__92R_oqZ0WAclFMmFIXTrNg2ERhngHm5x_MKU0-BQmMVLCFKQ3we0cH3QTjYGinsEyc_xT7MMtWHtG-R9nOr1YpthWd9x0HKGd8LxRashlZzM6Ts", "q": "18S_ecqMVBimvLzM3BNwp9NbM4dHRatLKnBaTPh1i1a_OAiLbhvR-i9CmkrRBCDoibMTlaXF3xRYbCbzhoTAOA0E8B-Frl5l6dT6FTA5VeuT2Kr4c8C-PkIb2Ttm7KxLpyE1zplOwiOpIpZwDdy7j-B26mYKF_ZajyN9VWMy7qU", "dp": "YRhyT3DSz_HHG1H0gu_ldGd6kt2gnNocdH33VooUqNhT8oPskMog1-gCEazbf4cJCEIK2THfBBUDQiL96szQgjS56W4Pl84NfdNXZmJuegdbayCsSxa8VyzfoGe8ghpAym1z5_ZCBJX5n98awphp0bpD7f07tq78cHtIdrLNaSM", "dq": "yC0XOyWn1Old32IFaPN8I6cZSI_rln4ZaRD9JcWoP5JGKvT6bjfPMZ2g28Ynbf4d3opN1BsMnS6h7gyhB56nOhkSCLgl7KRVRn-5V-j6eHTrICtV_wXFObtZXMsYbOBX-4D7C2X9xG0TICyTXrj3Jb8oc8Qg_yQl1gAl6g7zFKU", "qi": "ERMrkFR7KGYZG1eFNRdVmJMq-Ibxyw8ks_CbiI-n3yUyk1U8962ol2Q0T4qjBmb26L5rrhNQhneM4e8mo9FXLlQapYkPvkdrqW0Bp72A_UNAvcGTmN7z5OCJGMUutx2hmEAlrYmpLKS8pM_p9zpKtEOtzsP5GMDYVlEp1jYSjzQ" }, { "use": "sig", "kty": "RSA", "n": "wtpMAM4l1H995oqlqdMhuqNuffp4-4aUCwuFE9B5s9MJr63gyf8jW0oDr7Mb1Xb8y9iGkWfhouZqNJbMFry-iBs-z2TtJF06vbHQZzajDsdux3XVfXv9v6dDIImyU24MsGNkpNt0GISaaiqv51NMZQX0miOXXWdkQvWTZFXhmsFCmJLE67oQFSar4hzfAaCulaMD-b3Mcsjlh0yvSq7g6swiIasEU3qNLKaJAZEzfywroVYr3BwM1IiVbQeKgIkyPS_85M4Y6Ss_T-OWi1OeK49NdYBvFP-hNVEoeZzJz5K_nd6C35IX0t2bN5CVXchUFmaUMYk2iPdhXdsC720tBw", "e": "AQAB" }, { "key_ops": [ "sign" ], "kty": "RSA", "n": "ybi_3guc70NLoGecAdyAo0dJYLRXCYFdx7Iaq20REXb5SsyqSjGV_KEr8sdyFhr_PasKb1XbV7G8_gdtxU-Sl5dGI9h8mymIQ7VzbyEhwQqjzdyCKoz2levKPgjsTDN93IQiNfSOfc4qUux5viWQaPWt3bzpvOZXHcMUbzEz_jahKZPU_hMq_N3DroE6xFYB91fb74qHOC5RGMPjskUYKOjCtj-v-sZqznuckf2x0a2r5X--gsqGZT8dHaX9smyrpBbV9Y_g1VZ-CO8XFdRiHWth98FnlbEeHsrXbho9CE2GEACWvRRApMn1uSpghpENbkefpbYCIN7tq6X4lKvSYQZARiLkD1ELHcmWCX-cpIlfxihrKpVnRR4iLJNl33VtOBIPaMvtifojkLxsi3dtyJkcEFQI_kXbKW8Kdw5Fd-UOcsQf8PKk7k9LgFaH8GZRFhbwT0bLjjy0UIV5NDHcSozydV2uQh-ON6BsygCSvME8V4lu9z74Rq3T7eP25pC-Q0mN-1n7QGQL4zKshkKNh6Rx-QCP0hVGNosL6MoLzseluapTqnHrQEHTbG1Jm-WL_ces3thH7PySyWKJcUQ_iWBD0FFkya0KTvTfWvBg_WPdqBHLIQh6ie_7lOFyE56FbRYuRU0cF8-NykA_6HN247pFtw1PSgQ68Dqtv9bZMFU", "e": "AQAB", "d": "IwY78h7MEdL6Z5B1yvDxOOhgujS1xAW9NbYb4VXfl8uzfyRIEPfJFgMZ8V5l1aa8WIXBGxGqMvC-YtEBYzfsuPtgB0tIX1x3t2Hi-BGlnbHuPQkjZKXzDpbRF7JO7PAn00jx87JRp1BLkvhSLwywpTi7BnwNjWnlCFrdymydnW74zpJHchH77cnHdx4jCQHx93M-0bmYvs1z8TvZ5hMPHdNEM4adVIps8wsNZV_KJyDjbsaeWnE1opCxynsOsJMjvirk3W0s2X3aBk0VEgo9OuRxLyZaiOgm1avcedZ-cFmdhFvF0HCaxMH4Mz1DYzn-Pf6bnpcaiYCLfbkkjxPCRB1bUjsCsQsRs33os8VBvfKePK_B_Y5bDsJTh_vfJiVflqgckdr2R_RDQ50BLL-Ep44oAjt3wh9X85ccAQXoVKbfSwLADh2LsZFV_gsiVLWjGavvV43zfRzwubVsH_2w2H7gfXO3JoXHuNX3O-5W3hfrMxFQ7Ozjb3rcq28rkajTloG7fBVSlNmQc33cfvvKCLddN-eL6xK4k_xqd92DC-DEfqQgTKsVszDlmViRMOMX2Ebnnve5xsuAyhddFdRamrrrZ2gWO-WvTR5NMo91viluqWxbDWWqAnzpvY2XpAeWvcyNux57UIqWsbuJ6RDBjAyVsbvFRIzBxNbKfEzR5uE", "p": "8FFVC2zHBS8-o3i8niu3NY5ncJtmkT-5hpag567rWfP5Vzrvuih0BAW4t0gHCQCcS8ur_pQ7m72Cf8FA60a8S2djetTq8xbf1jQ0aSuqmJtRBH1DT2qKZT6OHY9EOhKZpOQzFPk_rscHHVH9q8PDvHVaz85dwRbb1D8EqRDDcvbqpyWwwMWkgndx0I6qV9GTcK6HzCtJIZHQsTl1k2IEdheawhZrXYlPEI1YQbR44lxxeBVH-P-1dEhiEnQQwj9dzlfPseqY5kf81ST4YZZPosZeQ4FyOu_IxsJqBmO27puOkmYXfbbhTMkSJSdeS7BatqQnbUBi10rpZCP2vDbV2Q", "q": "1uKlFl2FfsEQfq7d7GiNqNrEYnxK52lH19Yvgvfy27LtnDppBESr5ULPZcCFZ9kdY-8UxYoNZjGnZ-HVBEFhbOI1X606eLsvI4rnM-HG33cEYSVIuceUfc-OHkKuWLvOS2fE98ULgjVNItYAvN1FfiUpkt05ojp_4OPZMWHmdDV24u4_BDzqr9p6A-tmhKPHtyxdaX2yIXM6nFNx4vlmhgLZ-62xprLWVuT5SCo30PonKtsbgpkJ_bE_x_gacMH8J-NEGstt_oDsvHvvT3RGJiGveNTQPZ2mKmkZaZ5x8TTpk7LEw56PCn21pftBuH0bg_aMvC4fWfh47uVTgJa03Q", "dp": "FjmfYOAdg9g7tcibwREP748M9_gXQ0WeddkGZobh0z7iB3Q26YOGPzz8OU8a_3Uj_0qFzJSO8rdTE1efFmNDVMHqDFkWpYavCtNnKXbVXym2E3E2QWj8BaMEZ61xROGlff9wzfbDMfnMKaUEjdccChjcXi2atBnWGMn_N1eKi95UE0NEFn_w1_QN_ZjEHj0OorQxcOtr5wPiRhGnUwsUmItUT7DdGxhwzHoV-HWlXGHqSI3HSzry4B81mrlLN3u-xC-Q0MZ-f4WW12uE4RmSod4wp5OYKeU1L1SZk5-zMlwGknmIoKLCMWTDHdaHPP7BVPTXhJ4YxgpyjUVaM0vq-Q", "dq": "NOGRvu9E6uyYIpTmCEeylNtBePsdc9V02KjdCF38ZhSiZM_7CBHeO401fNTj_6pukSlE81gF9CBEEkyBH4r3btQ8Tk9TFGL8NsL4IsxtJJElgsKqIw36fPuW_dtrDGsrWWMwFcloC6MSWIBRrijF8UUz9fB7PnEnBzELQhvVmsONfksjNufG2X_qhwxnLj0f6PQCCPPl4lV5Fv9yB2lY0aHiAw27qkpYdQnkTt4U3lixStqg6oK-8q-sAooL97PFWguTtwRZDUis-bWGLwduO_QOOq4kkQU63zT-C__yCmn7EV3tDjb2_J3zFeW_RqeDHfaOq8Ct9nYvTJsi8YIl", "qi": "z-UlWCzIiVTW6D8OZ4ZlCa2HQlB2SBWyTu_EzrvfL_SzIvEzdaT_UFvJJD-VwhyQU3jeQBnN71sc49i2Iu--pvcRmkryKXXfctqDN13Oxe8qIzzG70YSUZNJxoag2bJWTm8vyzpwod7EHQJ7TLVGLbcrLANjpFSCpyVjJWnIFFlisCbgTbi-hGtYg65xhvTKM54wlXimYTObx434-q3pBzrRmX6LO-UMhryoyruSwVVyQHRFHfiKqRrzLQCErhXXNm9D1kQ2U7a5SP9ZH78Lg1ZZFi1-wphTzhe5LLci5R_BoEcfJyGbKdrV6eKd-Jy0Ie9NleUNZiWnlR_wgNet3g" }, { "use": "sig", "kty": "RSA", "n": "ybi_3guc70NLoGecAdyAo0dJYLRXCYFdx7Iaq20REXb5SsyqSjGV_KEr8sdyFhr_PasKb1XbV7G8_gdtxU-Sl5dGI9h8mymIQ7VzbyEhwQqjzdyCKoz2levKPgjsTDN93IQiNfSOfc4qUux5viWQaPWt3bzpvOZXHcMUbzEz_jahKZPU_hMq_N3DroE6xFYB91fb74qHOC5RGMPjskUYKOjCtj-v-sZqznuckf2x0a2r5X--gsqGZT8dHaX9smyrpBbV9Y_g1VZ-CO8XFdRiHWth98FnlbEeHsrXbho9CE2GEACWvRRApMn1uSpghpENbkefpbYCIN7tq6X4lKvSYQZARiLkD1ELHcmWCX-cpIlfxihrKpVnRR4iLJNl33VtOBIPaMvtifojkLxsi3dtyJkcEFQI_kXbKW8Kdw5Fd-UOcsQf8PKk7k9LgFaH8GZRFhbwT0bLjjy0UIV5NDHcSozydV2uQh-ON6BsygCSvME8V4lu9z74Rq3T7eP25pC-Q0mN-1n7QGQL4zKshkKNh6Rx-QCP0hVGNosL6MoLzseluapTqnHrQEHTbG1Jm-WL_ces3thH7PySyWKJcUQ_iWBD0FFkya0KTvTfWvBg_WPdqBHLIQh6ie_7lOFyE56FbRYuRU0cF8-NykA_6HN247pFtw1PSgQ68Dqtv9bZMFU", "e": "AQAB" }, { "key_ops": [ "sign" ], "kty": "RSA", "n": "s0XMckvY06KW80N_Fz5rBJUN3BlsUoViZYjpZy5UbhNAt96tdnoMMXJw6vd9-_DWwBEgpq7cRUsWq1qRkqSLz8dxTQ8OGsxauFVTWRTX3ZMQ_YtZJDGa1-snkxhsLxnvpXx_KPgYU1WTqB46GV-itwsZ69S0nq-cNMjIFiz6TJMNVNwI5yEdYUildxb0YmGu_ZBQMihcrYesAJSQezNu10YvioSIQUASHjfVcFMMLtZRYvi7idIfejb7iW2rPlO7sF4ZNhTaSoszB03BvnNZjikORBnDz71AgMKqW_Itlq_uMuMb0XlPCiLZgS83oLfSvMQQspeOks3yv5w3Hv-sEFXrSZyyt3SPxHuc3gggSqLcfzCV4PG_p2H7y5Q6i9VHPaA89ZQXlKWQC46sripPOtkSAkyJU9NJ_WkYNnnXzQiKA3kfN2mLCOzpv62SGoUrEssycTuVLUKTzM76LaYQ_lGbpbSrTGvZEmm3OJjjFr5r2JSPmzGw-5dOUpJ-i3r9-um-iUKKpOkTISYyCXY17w9yf13W4Gms7l5XJU-pRIlBlb3H2QFN2u9wp7mEXYOJzGNGpA3oHFKUmn40jlz509dNpGaG4SXzJG8Uku-mWrjWWsnh9VcZQhgLKVobJsmmSIkqcpJCityl21LAk7DoUB0GeMCFOjzPhZ0ncD7RVBwq762A6rcowuuY8Lwbrp9auNgzzhHHr-c01aFvqZbUT4oaxSFInyrocsyCqJYQEG3sDK6NMxNIPs9NIyC-IWPbqvxESOGJK6rLmh2WCaD0irCvboW5yxfxEaCuu3WWUFFEecR0KvHRQig_dFb2Jyo4fypzqdSRtAu0R7_qOn6pLsEO9XseQh7uRzdagwb9CjdBB8nKB5zVQ79gswBDY2-gDl1UphywtT-ISr4kLUm3tvOFQZjj1SNaZdLTDQbxO9GWjwaijIQbAdMU0f9kE7FHIR3vPEMLfwNgpo6hEyukTBfBTT1cq8eHQt0WbDLDYFcuA1fFa9XGrZPmmGCoV8AFKQaUNRcIbfRWnykPs9oJKi60gKbhoIStIq_DkV_B8OPTMRTbFranSJDaO2P6O0A5Y7Rezhjnqyb0oiJsKg74-_TcgL_tZB-YB3AG3gdElVnu9cWuR2FpY35L1WAk9zA46Z4dxQyL7nNpQDg5pX4Q8sXK2x3Ov1VmYy1TmUxpv1eLTMxts0yXYDQFGcDS4VuDfZZNkIXMOMEo4y5fQw11OOcElpvyVMUkYl0LgJvIqbUCzCulkrruKKPPdHrtJvhImysgT46lbjKPGDT4D_6qIt4UqV9B969PNbqfqFORnmgaH3oF3xxbAQfcasfUxCPxChYpOPs25ldtAASAAqDORw", "e": "AQAB", "d": "azXNy3iyhfZRIc_2vFbWt1nQfRUzI7KjIqebNdqOIXogFRX1VMouao_PGaXC0R25wAk-JpCiKEp8lyNFtZX0CuFyT6w2Oi6F_oEApGCDq_3chlSEjdGgkYoPE7fiUtTG7YejoEOmgIfIEx1oj24TKDZaXR_KmK_a0fJVPnXNhmfW7C3eoSK7qEdCtRKkOgXDGd7pJuXebuSZJ4uxUAx1OAbAPa1-ss73Rt0LJu5zdbsz1uV7ejOQIY2qJgjRBSgcMaBEoYQc-8F9VdvZhuUC5LKG1pE1-hFq9tXz_aK6QsiZwhLxuvc6Hoyy2L_9G39zZvI2LifW2tKRXqe0izRJmUdYu6AbfP0XUWC_ckUX0qrNBL9wkqLgg-BkLd5KmP-GaENg0VisNXhBybeca1fgJAhW7csJwXi1Yfgsw79gID0AFI2l7oSO4lqUe834dyW2mbmtQ-xnDTconq4VDaGnvf_d_l4qpzxEB-_y48UC4cIlStOlgiFYf02ASH9VcGKwaxLIoNuLgI3mo8ds2x23qWzqg2MCMxjfk3oV0blvOA6Bi2SAlLVj8w-IprWahDY6_WFNiKTMb8uvFSluksjlmxvCUhQCi7kfTGWlvy3UpaKuhoL_P7LD5zPr0OITJMIpUG2_Vd9ELjlAcwZtJqYAeJCzIxm3Uxm03WobgNQAabShrQCpUF-sZEqOPfQIa4bpRk-IzboCzdBBuQw9S8H1-yI_R718EvbmS3QhKAG6C6BRbafo-SLTfMGKARMACqq68w2FNYLblodBYGOdSf7LeSc8g6uA9UPncMfg06HOmkw_lIaOVseJG006u9LsUE6obCzNKGy5vtz0gCawbuc-S5ZaR3tE18Nu3ukNtZVv-L-UThAlVn_QDm4uMUmNy6Uxn7rta98auPE18InaVKJEDAFJ_pljX_XI6M0Nnz-lJfrlYTqPWjQtazaoohJt-OaVeK8MLOzRfu1FLllv8w2I1VXZR2rEW0UiwOC7-q5PgZE2qo7pHFnG_XfnP64vxa3I4Bv-a6zAbga1fgBbvTooRgqf6EExklZyfipMCtpnbG4cGht__zwUOvhUn6POHCgGO3OYhXjr8ArUhg2oQwGyUkGlzQGLGeopocFCbDMb7i-kGMhuigwKLjBMUF6U3TdC532wse0DPyDHBCLyxD4dPiPvFspgcNaw7x6sVWB9vN2JxXUJVGtnIrHAZQ2evGDtIeJnyFhmQ3Fa8RF-519xHYyX6Vu1KGEI1yT-ALSkUvYycUip4zyT70-GdknExutxIWtEMVpfXzxIJVt9S6gm8pUZ73OHVByUV92FgQCWPXnkjVPRBU_nnmav05YqCikvPx5SOVV_r64h5eNklhelmQ", "p": "586CvRRJQLPsOzFOjH6k0aCQOdvi5MwuLkdaBnAKOZRGiXtVFV_QwnXELmIiDCcPCLXagZ5R9XKwQp8HnzgvbGii2EjOFZ0GQC9FtOXX-E5vpFrg8eYRrjCAHB2yZ-B_1QrLOYbJhZZfaSZ58WC0jrrJqa1zvauBjy2EdtWykIbCV29UWdzIm0kH3Tgi0f3chgt7voOMHJ87jknE4jGLYbRM4Gje92Gi3WWymTSwN3ZuqWZvWdjPTuz2dk2T6sGusyN4cXTjmRy8yDMgxifJkhyxshW1ZHIK_6RacDi0w562rhz9kRRvbwtK9copeNaudQpvUJL-aPtVWc4fKNNatpaFhhsHo1jTOdMvx2Mn7AxDreUiTuUO2gDEJu7_LR7MhSdaXBVUUQVFNZXwHm0tVM1OH7rylU-OBNUOjb14zaClRtZ_97GoQIgRXQRqJ4K6nXFwGXycyYc4bZt2-tS4HVjUPViT4hZr4JXKeUSfY_rzE3i9QjLhguKaRXJexh8TxGMKg1DxMUv8kEYS4Dt5V1ZHQnGwN_lRR91B8OoreelOQTX4YIfi7ZWBaeNqBK4YRTQ5k2pHIi3THpFKhyQQGXXuAcwUcxhdOOWoVmlM37Qmfty_P-Jac8z7Gos4aXDRS0NXfkLLCFGWzhoQZ0jh_p34xiF3cO0J94Wu_xHJPsM", "q": "xfuqeOX2Q_KoDxhlQUd7_yYVhIJs9fn-59W3nkNLAD3CxxqKsbZ8RMo7bF67ibTM72JKE6_MTJ1OzZIMy2XW1Id_iHjcd1suDV6R88wOZTvqk-ew87RsIf5z7WQ--FpcuEBQ8E0GOFTdK5owfm9EYEkikKsDO7i0IqcA_npBmgnvTYIAC29tT9lQaX2VXXqZyATQFWNBVWqzWyuejRZO1Xpi7gnihE7PwojsF9u-rpSFoSs2lvSbUFvkgTF1s2OHjcSi38Xv5aig4pKH2TOnLwrOuCuYjSQJFHpuJuH3WhjrpIMkybCw1CLhqMqs1SY_SqVAdGhfDhDU632R5r8MJqubSi7qPCE2VLKXnU82tkyA3XpIlHWwCyh5HW1KZB1BWK7yJxiO8itpYOLFJfKL3zpz4onlAFGjUYzHEO4ZVqFJOOjVyPU-z-yqr4lGociTCW3wng66OXDPGPL2mv-iZnDj2IXUYa4LAgAolkynnbpOQBihXMLAIQu_5kZ1VF-mjY0Sov0nx-_8T34Ulu9u-zFMguOGSS3ZdMaWrO3Uxxvn-JebOZ7pZ3RLbaLYwb67kWV5TcLaoB6c5Tv-XViBJsx7ewnpJAN--kIs_Sdky_ZwzazRmvmay9-qpFoNsyyGBxjaFWAguHEgX7gU_BnJ9_WUMqk1Nysby0Qf91N7wi0", "dp": "XpSQG33Pdarz1CMGHaT-stmEf1cMeLYmkZNjVAUa5uts7GN6D8KMdwt-BD7eDX9STweEJCbo4fDtogEpJvnRv7Xh28W48HClQEMJegnd2N6IBtNdvNVWmXAIlXA4ftHG1rIUwWARkYQNYeXlE2uVwDbOWYEAHH-B2V2FEseWmAmj-fDexdujrlhZ8RUaf_vIopjE4LLj1DnUHvZScsgsSq06QMYJU35u6U65VHF_BOI5vLyi6lHgJB_jX9m_ZKWqFkV-uywqQSrMjBLwaGmLgSZcCoF5BYbSngP9MpSwjLCRcPE7NJrV7MT6zNaznS5a-D5NtN6FF2iVJpNHe2zhMmawDEuzDh8L8CgO8peujk1iv-0h1nb3XFO7tPcG_u32HM41vCSnxncUCg0ncAKz4En0elXY7LsNA0O7MHICfEPzq7eRdwrxz4K1MvK-LWjVo6_JQVzqy_90MqSgIy_v_2ljD7S4giML2RLFDj3FmxGlZGh7MCt6f-DdeUB1EvlTI2oVvAamoqqSXnt48CzUEaKOaLniYLRFScEpSpcBLjjXSRwwP5KyMKYzq3SyqT4vgO0SIOfYJkX0QiCd_A3m07yeY_VU0rE6OCDcUoWcbBohKtn-3p4Isf8M5YOwfLUfcEoFxOqT1M0VbvqLftjp_O2Pt6eoCFdvHaNaB5DGP-k", "dq": "wSicVX_nGLvyg2fFwj7AF1tMuw-Uxxe1PvMgRmRZFE8tbZvTnTbxXxv_heeXCO9A0n0O0M4_gLApZh8MJJWjV48rOjbQwhJPh_Owai-4C8S9RLhTyDFLHo9nA0E-vodK1ujJDunXG7aQYi35CiH8kARKmOKAMRAvj29oZN9aibMPqosfCAkamUDoV0OTKrSmvKMVcQh5gaCshFK2Seht2ZGiW6OBQJyzzpRP46cdDq8RAQFsLTNRJMHC2tkqgG6mngYu8ivntiUjcmqL57mhbyAYN08xcuKpiTU5qu3jqh-OJ99bUPv2ScIOb-PtY7gBIA7CJ9B8jPiXA3prkrjqXgAnbeT_2tJ8c34atfvG4W0afPsFPPLlYr2GDNPINIzmaGOnFcW8EUGRellFB5TwKkaZMXhf2EPOF45F2ZqzVfXdvoxLp9i-A5ZfoQtJwiYyboy4qTytK8WICEtjli26gD-7zFAluXdYfgcxkhIPpq9SEO72382SLauM-lnbtwnrMUdl22cqHMNjYxsbc3b-zEx43WqmZVc6RdhKwUT4x5nOZJdldn44MhsgTEMJP12bGmvqQZfOPVIguPYjYWcr-nKeNpigweY3SGqwAf0hNm2l-MSXa6ADCs2ZaugBXcIesWXpv9kdk1WrxDeRIbT3e9g5UoQLy1tfrp00otTsdbE", "qi": "g9n-wQtZ60IWCxAuc4uHUofpCQoIeGrZ9xLnH0tmFRJnJ5ufNxzHj5oWwKSxpm90bDMnWutfirGHh5RQ7y44IbYUV2Pbhz7-gwSjNlhLec37PCWuVyUmkHLma07N2ZspUOT21_uJ4WD1XazuP-gA4sGiVcLs73q21mUqVgXR-s-bCM0tG1ZrwgoYsKg5Dek34HsdlzYpWYMsqXgKmwJ691ZXlRR_HOLOKsfNfoprW9QQ2kVGfXO_0lKK5p9f7CceOPguLqHn0zk7CB09OVjCv6eTUL8UzswQMo67nO210Q7JKuXAWxGYApQB4HubNe5Ic-pdiHz8IwbmfcTYyOGs4RtQZY3qzB8z9p66y62rzasPnUXSYs3w4nrKtfphC8b5voJB-QDJGe1yWqL95dHYJxdGHa4Kcjc8jQtOCty8pItvGdrVkmuzr0P5LziY1jJz_sPj5b4l2jJB56g1UnKzBmaxgPIQrIdqlDiuEBOerdYKVLiq7np2JC5rKfoYQhdTCj12Nwm8cpOP3jymz1XYEUqYc46oggBPor09edLwhOqr-30Bv8QCAsvwaBYG0Ru2P5l5mgCOmf--dW50xYg-MPHJr9WK38x65kAi-vG9yHeoS--bm26CbVkSGrwKPZI34Fku6i_FUayWEtoiU3WKndSOrpIVOqOQTQU54puQoOE" }, { "use": "sig", "kty": "RSA", "n": "s0XMckvY06KW80N_Fz5rBJUN3BlsUoViZYjpZy5UbhNAt96tdnoMMXJw6vd9-_DWwBEgpq7cRUsWq1qRkqSLz8dxTQ8OGsxauFVTWRTX3ZMQ_YtZJDGa1-snkxhsLxnvpXx_KPgYU1WTqB46GV-itwsZ69S0nq-cNMjIFiz6TJMNVNwI5yEdYUildxb0YmGu_ZBQMihcrYesAJSQezNu10YvioSIQUASHjfVcFMMLtZRYvi7idIfejb7iW2rPlO7sF4ZNhTaSoszB03BvnNZjikORBnDz71AgMKqW_Itlq_uMuMb0XlPCiLZgS83oLfSvMQQspeOks3yv5w3Hv-sEFXrSZyyt3SPxHuc3gggSqLcfzCV4PG_p2H7y5Q6i9VHPaA89ZQXlKWQC46sripPOtkSAkyJU9NJ_WkYNnnXzQiKA3kfN2mLCOzpv62SGoUrEssycTuVLUKTzM76LaYQ_lGbpbSrTGvZEmm3OJjjFr5r2JSPmzGw-5dOUpJ-i3r9-um-iUKKpOkTISYyCXY17w9yf13W4Gms7l5XJU-pRIlBlb3H2QFN2u9wp7mEXYOJzGNGpA3oHFKUmn40jlz509dNpGaG4SXzJG8Uku-mWrjWWsnh9VcZQhgLKVobJsmmSIkqcpJCityl21LAk7DoUB0GeMCFOjzPhZ0ncD7RVBwq762A6rcowuuY8Lwbrp9auNgzzhHHr-c01aFvqZbUT4oaxSFInyrocsyCqJYQEG3sDK6NMxNIPs9NIyC-IWPbqvxESOGJK6rLmh2WCaD0irCvboW5yxfxEaCuu3WWUFFEecR0KvHRQig_dFb2Jyo4fypzqdSRtAu0R7_qOn6pLsEO9XseQh7uRzdagwb9CjdBB8nKB5zVQ79gswBDY2-gDl1UphywtT-ISr4kLUm3tvOFQZjj1SNaZdLTDQbxO9GWjwaijIQbAdMU0f9kE7FHIR3vPEMLfwNgpo6hEyukTBfBTT1cq8eHQt0WbDLDYFcuA1fFa9XGrZPmmGCoV8AFKQaUNRcIbfRWnykPs9oJKi60gKbhoIStIq_DkV_B8OPTMRTbFranSJDaO2P6O0A5Y7Rezhjnqyb0oiJsKg74-_TcgL_tZB-YB3AG3gdElVnu9cWuR2FpY35L1WAk9zA46Z4dxQyL7nNpQDg5pX4Q8sXK2x3Ov1VmYy1TmUxpv1eLTMxts0yXYDQFGcDS4VuDfZZNkIXMOMEo4y5fQw11OOcElpvyVMUkYl0LgJvIqbUCzCulkrruKKPPdHrtJvhImysgT46lbjKPGDT4D_6qIt4UqV9B969PNbqfqFORnmgaH3oF3xxbAQfcasfUxCPxChYpOPs25ldtAASAAqDORw", "e": "AQAB" }, { "use": "sig", "kty": "RSA", "n": "n_7RTQX1xlllgo-aqo5zd_-wqaRZwFWp3JJIUXryJ4d153J1gEYdz4RkjFO0X8kpv8qb5hdzWhhZHSItD-07LaQXP4lSUuiK1lJAT_YW51D37nCkWm839gAqEGdsWsYQCvqJKSJr4pWCZTEx2MEfikmmnaXPR_VOVgZSj9kIoKo-kFwlw9LGVBHYAeR_W-l5DJQK6Yha8Igi36hnvZqqHcQ4gkGUqEc__Tq2nyYNwvAN3ieZvtvL71rFW26FnuA4OwDER-TYSkAr8Z4wH2EdGno1GZQAegIm-yWblleCaBVOnlk8VcDO9PecTiAFjjWAbQiaFKlkf_plD7KE4tAamQ", "e": "AQAB" }, { "key_ops": [ "sign" ], "kty": "oct", "k": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRREMya3dBemlYVWYzM20KaXFXcDB5RzZvMjU5K25qN2hwUUxDNFVUMEhtejB3bXZyZURKL3lOYlNnT3ZzeHZWZHZ6TDJJYVJaK0dpNW1vMApsc3dXdkw2SUd6N1BaTzBrWFRxOXNkQm5OcU1PeDI3SGRkVjllLzIvcDBNZ2liSlRiZ3l3WTJTazIzUVloSnBxCktxL25VMHhsQmZTYUk1ZGRaMlJDOVpOa1ZlR2F3VUtZa3NUcnVoQVZKcXZpSE44Qm9LNlZvd1A1dmN4eXlPV0gKVEs5S3J1RHF6Q0locXdSVGVvMHNwb2tCa1ROL0xDdWhWaXZjSEF6VWlKVnRCNHFBaVRJOUwvemt6aGpwS3o5UAo0NWFMVTU0cmowMTFnRzhVLzZFMVVTaElBbUNvcm5ob2xpb2ZraGZTM1pzM2tKVmR5RlFXWnBReGlUYUk5MkZkCjJ3THZiUzBIQWdNQkFBRUNnZ0VBRDhkVG5rRVRTU2psemhSdUk5bG9BdEFYTTNaajg2SkxQTFc3R2dhb3hFb1QKbjdsSjJiR2ljRk1IQjJST25iT2I5dm5hczgyZ3RPdEpzR2FCc2xtb2FDY2twL0M1VDFlSldURWIraSt2ZHBQcAp3WmNtS1pvdnl5UkZTRTQrTllsVTE3ZkV2NkRSdnVhR0JwRGNXN1FnSEpJbDQ1RjhRV0VNK21zZWUyS0UrVjRHCkZ6c2xwOVRwWGQ5aUJXanpmQ09uR1VpUDY1WitHV2tRL1NYRnFEK1NSaXIwK200M3p6R2RvTnZHSjIzK0hkNksKVGRRYkRKMHVvZTRNb1FlZXB6b1pFZ2k0SmV5a1ZVWi91VmZvK25oMDZ5QXJWZjhGeFRtN1dWekxHR3pnVi91QQord3RsL2NSdEV5QXNrMTY0OXlXL0tIUEVJUDhrSmRZQUplb084eFNsQW9HQUVSTXJrRlI3S0dZWkcxZUZOUmRWCm1KTXErSWJ4eXc4a3MvQ2JpSStuM3lVeWsxVTg5NjJvbDJRMFQ0cWpCbWIyNkw1cnJoTlFobmVNNGU4bW85RlgKTGxRYXBZa1B2a2RycVcwQnA3MkEvVU5BdmNHVG1ON3o1T0NKR01VdXR4MmhtRUFsclltcExLUzhwTS9wOXpwSwp0RU90enNQNUdNRFlWbEVwMWpZU2p6UT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo", "alg": "HS512" }, { "key_ops": [ "sign" ], "kty": "oct", "k": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF3dHBNQU00bDFIOTk1b3FscWRNaAp1cU51ZmZwNCs0YVVDd3VGRTlCNXM5TUpySUFtQ29ybmhvbGlvN01iMVhiOHk5aUdrV2Zob3VacU5KYk1GcnkrCmlCcyt6MlR0SkYwNnZiSFFaemFqRHNkdXgzWFZmWHY5djZkRElJbXlVMjRNc0dOa3BOdDBHSVNhYWlxdjUxTk0KQndJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg", "alg": "HS512" }, { "key_ops": [ "sign" ], "kty": "RSA", "alg": "PS256", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB", "d": "DHjrOhthnAdtWVF_mi9sxen0_wKkbqQiZniWIu3jhZdGCpOVEKbWxhuq-B4FvlAqr9r1vMENtfFBDZNIVO6gtL7hoYOCJu-Fpertxp8eh0xZDbH96_M-e1JxSR_dmwyxCoix0xbdbbHmHmzvg05s_TL1NuRbNJYSNUJXZLWxK2NKmlw-lPRb360n7H5KFSXECNWBsI9rkJuPvO_HmEYotiAotpxlC3N9cYmFc-G-W6JHTcF7CR2DZOauE3MI5jJpa-qzLXKKCphTq-PkbeM0jwgXciQ11RaC39KVy4YquWDTptilb4LgGQCMDqVIeW5VnBBmhtJvAJhPo_E5RK-MCw", "p": "y6sKp6asFY-kv8hFEh_MPx-eTmZqr-g-CDEq7xgap9fI4LFGvemJv3isQcYJjPAFWreB0PF3uz6XlcK6x1CwjqWlNecQYUmDWq0kyJSvQ7Gn2txsIF6An5lkhSG_AQ-qLWay_WPmyjPXsxaF9aFM-QjTSW12wWcIKGCP0KSrhsM", "q": "uUCYSXKi-4h0Z43Ol_jqy1mCD-yaICt4CtJeZTMbC7CI9qVPUaNHni3fUBxTDgOdH6xJGMZ1XuUFn68fjPB_mPmKUimYCrqlBzhRh7axT6tdD4WQc8rpEHvaucGjp2dBXrCDve_RPyMI8HYRS5kKGmvqhVpnwT0iVq5KRCERgQs", "dp": "HFEzsguicXz_UwrtT4_MPhqPUCc9Pif0N_9eENAxJJUEAPmk9FK8LDsC-EIoocfddrd8_SgVlZsmSFRC0-OMKMkvJ0dxJ5WpBbp9GsZReAADbpKnFfkNuSMCrt_6RpN-_cEBselp9UMwAl5nUbeTlCx98_-cO1ev8q06UbATiTE", "dq": "bmEPnAvDEs6OVTlIVILLG5jchzJ57xsXbpNEDVZzEfcA1L1Q0prQTG6WtXv6_MmocDvOXgW5323keO32hZqy3GorQaNo5VOqiu_CnHN9mLPJQjtaA7RuRBUYEUBQi6lZaNsR1DU1X0I3zFb9HSc1vuJ4HTbtxVTwxecZdxig_ls", "qi": "RhNgmhA5ZNiHU0DoDoMzeaXVpwGxUZ_QkAmC1mc11SROp0khJmM-XfQBW5x6f8sYmX0zAj9EUh01dk1cKrg0dPX42c5nYItgo6ynFSJoSUkl_nu4tJysoCSh-3HtUtstooogDPQKUf4A9UAzgf1vrl95SRl-oL8MaVXlHm_o1KQ" }, { "use": "sig", "kty": "RSA", "alg": "PS256", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB" }, { "key_ops": [ "sign" ], "kty": "oct", "k": "lPf00IQpLKLqA1kR6k12ikyQOAEwF6z-JIolceIAiEg", "alg": "HS256" }, { "key_ops": [ "sign" ], "kty": "oct", "k": "jj5mgVA2xlgLTyg7Xir7_GLEtfhOPkrN07DOgopCgo76IuZh-TXfFIWyL_aC9s-E", "alg": "HS384" }, { "key_ops": [ "sign" ], "kty": "oct", "k": "GsBflhmn9Ypy-ctcZrXuXuMDk1LWEzs--YVJfHizjuSVUnnFparUdtPDWKcJ8e56LYI6tWnKWaWUYQCFHxDSgw", "alg": "HS512" } ] } libjwt-3.3.3/tests/cli/oct_384.bin000066400000000000000000000000601517612317300166030ustar00rootroot00000000000000:ή³"P©ˆπkΚXYŒ6Αwπλ€”A5Τ-c<+yvUΑc¨–«ν"±½0RΆ/…#libjwt-3.3.3/tests/jwt-cli.bats000077500000000000000000000044641517612317300164220ustar00rootroot00000000000000#!/usr/bin/env bats BASIC_RES="eyJhbGciOiJub25lIn0.e30." @test "Generate a JWT with alg none" { result="$(./tools/jwt-generate -v -a none -n)" [ "$result" = ${BASIC_RES} ] } @test "Verify a JWT with alg none" { ./tools/jwt-verify -v ${BASIC_RES} } HS256_RES="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds" HS256_KEY="../tests/keys/oct_key_256.json" @test "Generate a JWT with alg HS256" { result="$(./tools/jwt-generate -v -a HS256 -n -k ${HS256_KEY})" [ "$result" = ${HS256_RES} ] } @test "Verify a JWT with alg HS256" { ./tools/jwt-verify -v -k ${HS256_KEY} ${HS256_RES} } CLAIM_RES="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ZmFsc2UsImV4cCI6MTgzOTMxNzU2MiwiZm9vIjoiYmFyIiwiZ3JvdXAiOiJzdGFmZiIsImlzcyI6ImRpc2suc3dpc3NkaXNrLmNvbSIsInVzZXIiOiJiY29sbGlucyJ9.9RCEoB3XXGZrlU3JAx21x6p8mZguZS_NviKgJqEu330" @test "Generate a JWT with alg HS256 and claims" { result="$(./tools/jwt-generate -v -n \ -k ${HS256_KEY} \ -c s:group=staff \ -c b:admin=false \ -c s:iss=disk.swissdisk.com \ -c s:user=bcollins \ -c i:exp=1839317562 \ -j '{"foo":"bar"}')" [ "$result" = ${CLAIM_RES} ] } @test "Verify a JWT with alg HS256 with claims" { ./tools/jwt-verify -v -k ${HS256_KEY} ${CLAIM_RES} } @test "Generate JWKS from PEM Files" { ./tools/key2jwk --disable-kid -o - \ ${SRCDIR}/tests/keys/pem-files/*.pem \ ${SRCDIR}/tests/keys/pem-files/*.bin | \ grep -v libjwt.io: > output.json jq -r -n --slurpfile A ${SRCDIR}/tests/cli/all.json \ --slurpfile B output.json -f <(cat<<"EOF" def walk(f): . as $in | if type == "object" then reduce keys[] as $key ( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f elif type == "array" then map( walk(f) ) | f else f end; def normalize: walk(if type == "array" then sort else . end); def equiv(x): normalize == (x | normalize); if $A | equiv($B) then empty else halt_error(1) end EOF ) } @test "Convert JWK to PEM - RSA" { rm -f rsa_1024_0023a6e1-f093-448d-9038-9ff168611b86.pem ./tools/jwk2key -d . ${SRCDIR}/tests/keys/rsa_key_1024.json cmp rsa_1024_0023a6e1-f093-448d-9038-9ff168611b86.pem ${SRCDIR}/tests/keys/pem-files/rsa_key_1024.pem } @test "Convert JWK to PEM - OCT" { rm -f oct_384.bin ./tools/jwk2key -d . ${SRCDIR}/tests/keys/oct_key_384.json cmp oct_384.bin ${SRCDIR}/tests/cli/oct_384.bin } libjwt-3.3.3/tests/jwt_builder.c000066400000000000000000000547721517612317300166600ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include "jwt_tests.h" START_TEST(new) { jwt_builder_auto_t *builder = NULL; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); } END_TEST START_TEST(gen) { const char exp[] = "eyJhbGciOiJub25lIn0."; jwt_builder_auto_t *builder = NULL; char_auto *out = NULL; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_mem_eq(out, exp, strlen(exp)); } END_TEST static int __gen_wcb(jwt_t *jwt, jwt_config_t *config) { jwt_value_t jval; ck_assert_ptr_nonnull(jwt); ck_assert_ptr_nonnull(config); ck_assert_str_eq(config->ctx, "testing"); jwt_set_SET_INT(&jval, "exp", TS_CONST + 480); jwt_claim_set(jwt, &jval); return 0; } START_TEST(gen_wcb) { const char exp[] = "eyJhbGciOiJub25lIn0.eyJleHAiOjE0NzU5ODEwMjV9."; jwt_builder_auto_t *builder = NULL; char_auto *out = NULL; const char *ctx; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 1); ck_assert_int_eq(ret, 1); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); ret = jwt_builder_setcb(builder, __gen_wcb, "testing"); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_str_eq(out, exp); ctx = jwt_builder_getctx(builder); ck_assert_str_eq(ctx, "testing"); } END_TEST static int __set_alg_cb(jwt_t *jwt, jwt_config_t *config) { jwt_value_t jval; int ret; ck_assert_ptr_nonnull(jwt); ck_assert_ptr_nonnull(config); /* Clear the whole header */ ret = jwt_header_del(jwt, NULL); ck_assert_int_eq(ret, JWT_VALUE_ERR_NONE); /* This will get overwritten */ jwt_set_SET_INT(&jval, "alg", JWT_ALG_HS256); jwt_header_set(jwt, &jval); /* This wont */ jwt_set_SET_STR(&jval, "typ", "NOTJWT"); jwt_header_set(jwt, &jval); return 0; } START_TEST(set_alg) { jwt_builder_auto_t *builder = NULL; const char *exp = "eyJhbGciOiJIUzI1NiIsInR5cCI6Ik5PVEpXVCJ9.e30.GsBNaD" "rcrck5dXU9za1MrrOxpz8KQXjq-JHmeCyFhAA"; char_auto *out = NULL; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); ret = jwt_builder_setcb(builder, __set_alg_cb, NULL); ck_assert_int_eq(ret, 0); read_json("oct_key_256.json"); ret = jwt_builder_setkey(builder, JWT_ALG_HS256, g_item); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_str_eq(out, exp); } END_TEST static int __just_fail_cb(jwt_t *jwt, jwt_config_t *config) { (void)jwt; (void)config; return 1; } START_TEST(just_fail_wcb) { jwt_builder_auto_t *builder = NULL; char *out; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_setcb(builder, __just_fail_cb, "testing"); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); ck_assert_ptr_null(out); free_key(); } END_TEST START_TEST(gen_stress) { const char exp[] = "eyJhbGciOiJub25lIn0."; jwt_builder_auto_t *builder = NULL; int i; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); for (i = 0; i < 1000; i++) { char_auto *out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_mem_eq(out, exp, strlen(exp)); } ck_assert_int_eq(i, 1000); } END_TEST START_TEST(null_handling) { jwt_builder_auto_t *builder = NULL; jwt_value_t jval; const char *out; jwk_item_t *key = NULL; int ret; builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); jwt_builder_free(NULL); ret = jwt_builder_setkey(NULL, JWT_ALG_HS256, NULL); ck_assert_int_ne(ret, 0); jwt_set_GET_STR(&jval, ""); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_INVALID); jwt_set_GET_INT(&jval, ""); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_INVALID); jwt_set_GET_BOOL(&jval, ""); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_INVALID); jwt_set_GET_JSON(&jval, ""); jval.pretty = 1; ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_NONE); ck_assert_ptr_nonnull(jval.json_val); free(jval.json_val); jwt_set_SET_STR(&jval, "", ""); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_INVALID); jwt_set_SET_INT(&jval, "", 0); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_INVALID); jwt_set_SET_BOOL(&jval, "", 0); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_INVALID); jwt_set_SET_JSON(&jval, "", "{}"); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_NONE); jwt_set_SET_JSON(&jval, "", ""); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_INVALID); jwt_set_SET_JSON(&jval, "", "{}"); jval.replace = 1; ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_NONE); /* Create and clear an error */ ret = jwt_builder_setkey(builder, JWT_ALG_HS256, NULL); ck_assert_int_ne(ret, 0); /* Check error exists */ ck_assert_int_ne(jwt_builder_error(builder), 0); out = jwt_builder_error_msg(builder); ck_assert_ptr_nonnull(out); ck_assert_int_ne(strlen(out), 0); /* Clear it */ jwt_builder_error_clear(builder); /* Check that its cleared */ ck_assert_int_eq(jwt_builder_error(builder), 0); out = jwt_builder_error_msg(builder); ck_assert_ptr_nonnull(out); ck_assert_int_eq(strlen(out), 0); /* Fake it */ key = (void *)builder; ret = jwt_builder_setkey(NULL, 0, key); ck_assert_int_ne(ret, 0); ret = jwt_builder_error(NULL); ck_assert_int_ne(ret, 0); out = jwt_builder_error_msg(NULL); ck_assert_ptr_null(out); out = jwt_builder_error_msg(builder); ck_assert_ptr_nonnull(out); ck_assert_int_eq(strlen(out), 0); jwt_builder_error_clear(NULL); out = jwt_builder_generate(NULL); ck_assert_ptr_null(out); /* Some alg mismatches */ read_json("eddsa_key_ed25519.json"); ret = jwt_builder_setkey(builder, JWT_ALG_NONE, g_item); ck_assert_int_ne(ret, 0); free_key(); jwt_builder_error_clear(builder); read_json("oct_key_256.json"); ret = jwt_builder_setkey(builder, JWT_ALG_ES256, g_item); ck_assert_int_ne(ret, 0); jwt_builder_error_clear(builder); ret = jwt_builder_setcb(builder, NULL, "test"); ck_assert_int_ne(ret, 0); ret = jwt_builder_header_del(NULL, NULL); ck_assert_int_ne(ret, 0); ret = jwt_checker_claim_del(NULL, JWT_CLAIM_ISS); ck_assert_int_ne(ret, 0); ret = jwt_checker_claim_set(NULL, JWT_CLAIM_ISS, "goo"); ck_assert_int_ne(ret, 0); out = jwt_checker_claim_get(NULL, JWT_CLAIM_ISS); ck_assert_ptr_null(out); /* Random */ ck_assert_int_eq(jwt_str_alg(NULL), JWT_ALG_INVAL); out = jwt_alg_str(JWT_ALG_ES256K); ck_assert_str_eq(out, "ES256K"); ck_assert_ptr_null(jwt_alg_str(JWT_ALG_INVAL)); ck_assert_int_eq(jwt_get_alg(NULL), JWT_ALG_INVAL); ret = jwt_builder_setcb(NULL, NULL, NULL); ck_assert_int_ne(ret, 0); ck_assert_int_eq(jwt_header_del(NULL, NULL), JWT_VALUE_ERR_INVALID); ck_assert_int_eq(jwt_claim_del(NULL, NULL), JWT_VALUE_ERR_INVALID); ck_assert_int_eq(jwt_header_get(NULL, NULL), JWT_VALUE_ERR_INVALID); ck_assert_int_eq(jwt_header_get(NULL, &jval), JWT_VALUE_ERR_INVALID); ck_assert_int_eq(jval.error, JWT_VALUE_ERR_INVALID); ck_assert_int_eq(jwt_builder_enable_iat(NULL, 1), -1); ck_assert_ptr_null(jwt_builder_getctx(NULL)); ck_assert_int_eq(jwt_builder_claim_del(NULL, NULL), JWT_VALUE_ERR_INVALID); ck_assert_int_eq(jwt_builder_claim_get(NULL, &jval), JWT_VALUE_ERR_INVALID); ck_assert_int_eq(jwt_builder_claim_get(builder, NULL), JWT_VALUE_ERR_INVALID); ck_assert_int_eq(jwt_builder_time_offset(NULL, JWT_CLAIM_NBF, 0), 1); ck_assert_int_eq(jwt_builder_time_offset(builder, JWT_CLAIM_SUB, 0), 1); ck_assert_int_eq(jwt_builder_time_offset(builder, JWT_CLAIM_NBF, 0), 0); free_key(); } END_TEST START_TEST(gen_hs256) { jwt_builder_auto_t *builder = NULL; char_auto *out = NULL; const char exp[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); read_json("oct_key_256.json"); ret = jwt_builder_setkey(builder, JWT_ALG_HS256, g_item); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_str_eq(out, exp); free_key(); } END_TEST START_TEST(gen_hs256_bits) { jwt_builder_auto_t *builder = NULL; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); read_json("oct_key_256.json"); ret = jwt_builder_setkey(builder, JWT_ALG_HS384, g_item); ck_assert_int_ne(ret, 0); free_key(); } END_TEST START_TEST(gen_es384_pub) { jwt_builder_auto_t *builder = NULL; const unsigned char *buf = NULL; jwk_key_type_t kty; const char *crv; size_t len = 0; int ret, bits; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); /* Pub key */ read_json("ec_key_secp384r1_pub.json"); /* Check the curve */ crv = jwks_item_curve(g_item); ck_assert_str_eq(crv, "P-384"); /* Check kty */ kty = jwks_item_kty(g_item); ck_assert_int_eq(kty, JWK_KEY_TYPE_EC); /* Check bits */ bits = jwks_item_key_bits(g_item); ck_assert_int_eq(bits, 384); /* Check that these aren't there */ ret = jwks_item_key_oct(g_item, &buf, &len); ck_assert_int_ne(ret, 0); ck_assert_ptr_null(buf); ck_assert_int_eq(len, 0); /* Pub key will fail to set */ ret = jwt_builder_setkey(builder, JWT_ALG_ES384, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_builder_error_msg(builder), "Signing requires a private key"); free_key(); } END_TEST static int __gen_hs256_wcb(jwt_t *jwt, jwt_config_t *config) { ck_assert_ptr_nonnull(jwt); ck_assert_ptr_nonnull(config); ck_assert_int_eq(jwt_get_alg(jwt), JWT_ALG_NONE); if (config->ctx != NULL) { ck_assert_int_eq(jwt_get_alg(jwt), JWT_ALG_NONE); config->key = g_item; config->alg = JWT_ALG_HS256; } else { config->key = NULL; config->alg = JWT_ALG_HS256; } return 0; } START_TEST(gen_hs256_wcb) { jwt_builder_auto_t *builder = NULL; char *out = NULL; const char exp[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); read_json("oct_key_256.json"); ret = jwt_builder_setcb(builder, __gen_hs256_wcb, "testing"); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_str_eq(out, exp); free(out); ret = jwt_builder_setcb(builder, __gen_hs256_wcb, NULL); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); ck_assert_ptr_null(out); ck_assert_int_eq(jwt_builder_error(builder), 1); free_key(); } END_TEST START_TEST(gen_ec_stress) { jwt_builder_auto_t *builder = NULL; const char exp[] = "eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9.e30."; int ret, i; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); read_json("ec_key_secp384r1.json"); ret = jwt_builder_setkey(builder, JWT_ALG_ES384, g_item); ck_assert_int_eq(ret, 0); for (i = 0; i < 1000; i++) { char_auto *out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_mem_eq(out, exp, strlen(exp)); ck_assert_int_eq(strlen(out), 169); } free_key(); } END_TEST START_TEST(claim_str_setgetdel) { const char exp[] = "eyJhbGciOiJub25lIn0.eyJzdWIiOiJteS1mcmllbmQifQ."; jwt_builder_auto_t *builder = NULL; char_auto *out = NULL; jwt_value_t jval; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); jwt_set_SET_STR(&jval, "sub", "my-friend"); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_SET_STR(&jval, "aud", "public"); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_SET_STR(&jval, "aud", "private"); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_EXIST); jwt_set_SET_STR(&jval, "aud", "employees"); jval.replace = 1; ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_GET_STR(&jval, "aud"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, 0); ck_assert_ptr_nonnull(jval.str_val); ck_assert_str_eq(jval.str_val, "employees"); jwt_set_GET_INT(&jval, "aud"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_TYPE); jwt_set_GET_BOOL(&jval, "aud"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_TYPE); ret = jwt_builder_claim_del(builder, "aud"); ck_assert_int_eq(ret, 0); jwt_set_GET_STR(&jval, "aud"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_NOEXIST); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_str_eq(out, exp); } END_TEST START_TEST(claim_int_setgetdel) { const char exp[] = "eyJhbGciOiJub25lIn0.eyJuYmYiOjE0NzU5ODA1NDV9."; jwt_builder_auto_t *builder = NULL; char_auto *out = NULL; jwt_value_t jval; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); jwt_set_SET_INT(&jval, "nbf", TS_CONST); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_SET_INT(&jval, "exp", TS_CONST); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_SET_INT(&jval, "exp", TS_CONST + 360); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_EXIST); jwt_set_SET_INT(&jval, "exp", TS_CONST + 480); jval.replace = 1; ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_GET_INT(&jval, "exp"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, 0); ck_assert_int_eq(jval.int_val, TS_CONST + 480); jwt_set_GET_STR(&jval, "exp"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_TYPE); jwt_set_GET_BOOL(&jval, "exp"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_TYPE); ret = jwt_builder_claim_del(builder, "exp"); ck_assert_int_eq(ret, 0); jwt_set_GET_INT(&jval, "exp"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_NOEXIST); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_str_eq(out, exp); } END_TEST START_TEST(claim_bool_setgetdel) { const char exp[] = "eyJhbGciOiJub25lIn0.eyJhZG1pbiI6dHJ1ZX0."; jwt_builder_auto_t *builder = NULL; char_auto *out = NULL; jwt_value_t jval; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); jwt_set_SET_BOOL(&jval, "admin", 1); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_SET_BOOL(&jval, "sudo", 1); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_SET_BOOL(&jval, "sudo", 0); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_EXIST); jwt_set_SET_BOOL(&jval, "sudo", 0); jval.replace = 1; ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_GET_BOOL(&jval, "sudo"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, 0); ck_assert_int_eq(jval.bool_val, 0); jwt_set_GET_STR(&jval, "sudo"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_TYPE); jwt_set_GET_INT(&jval, "sudo"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_TYPE); ret = jwt_builder_claim_del(builder, "sudo"); ck_assert_int_eq(ret, 0); jwt_set_GET_BOOL(&jval, "sudo"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_NOEXIST); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_str_eq(out, exp); } END_TEST START_TEST(claim_json_setgetdel) { const char exp[] = "eyJhbGciOiJub25lIn0.eyJyb29tcyI6WyJvZ" "mZpY2UiLCJ3YXItcm9vbSJdfQ."; jwt_builder_auto_t *builder = NULL; char_auto *out = NULL; jwt_value_t jval; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); jwt_set_SET_JSON(&jval, "rooms", "[\"office\",\"war-room\"]"); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_GET_JSON(&jval, "rooms"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, 0); ck_assert_ptr_nonnull(jval.json_val); ck_assert_str_eq(jval.json_val, "[\"office\",\"war-room\"]"); free(jval.json_val); jwt_set_SET_JSON(&jval, "buildings", "{\"main\":\"dallas\",\"accounting\":\"houston\"}"); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_SET_JSON(&jval, "buildings", "{\"hq\": 0}"); ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_EXIST); jwt_set_SET_JSON(&jval, "buildings", "{\"hq\": 1}"); jval.replace = 1; ret = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(ret, 0); jwt_set_GET_JSON(&jval, "buildings"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, 0); ck_assert_ptr_nonnull(jval.json_val); ck_assert_str_eq(jval.json_val, "{\"hq\":1}"); free(jval.json_val); jwt_set_GET_STR(&jval, "buildings"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_TYPE); jwt_set_GET_INT(&jval, "buildings"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_TYPE); ret = jwt_builder_claim_del(builder, "buildings"); ck_assert_int_eq(ret, 0); jwt_set_GET_JSON(&jval, "buildings"); ret = jwt_builder_claim_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_NOEXIST); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_str_eq(out, exp); } END_TEST START_TEST(header_str_setgetdel) { const char exp[] = "eyJhbGciOiJub25lIiwidHlwIjoiQ3VzdG9tIn0.e30."; jwt_builder_auto_t *builder = NULL; char_auto *out = NULL; jwt_value_t jval; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); jwt_set_SET_STR(&jval, "typ", "Custom"); ret = jwt_builder_header_set(builder, &jval); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_str_eq(out, exp); jwt_set_GET_STR(&jval, "typ"); ret = jwt_builder_header_get(builder, &jval); ck_assert_int_eq(ret, 0); ck_assert_ptr_nonnull(jval.str_val); ck_assert_str_eq(jval.str_val, "Custom"); ret = jwt_builder_header_del(builder, "typ"); jwt_set_GET_STR(&jval, "typ"); ret = jwt_builder_header_get(builder, &jval); ck_assert_int_eq(ret, JWT_VALUE_ERR_NOEXIST); } END_TEST START_TEST(sign_es256_bad_sig) { jwt_builder_auto_t *builder = NULL; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); /* Algorithm confusion: an OKP/EdDSA JWK must not be settable for * an EC algorithm like ES256 (GHSA-q843-6q5f-w55g). setkey rejects * up front before any signing is attempted. */ read_json("eddsa_key_ed25519_fake_es256.json"); ret = jwt_builder_setkey(builder, JWT_ALG_ES256, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_builder_error_msg(builder), "Key type does not match algorithm"); free_key(); } END_TEST static Suite *libjwt_suite(const char *title) { Suite *s; TCase *tc_core; int i = ARRAY_SIZE(jwt_test_ops); s = suite_create(title); tc_core = tcase_create("New"); tcase_add_loop_test(tc_core, new, 0, i); tcase_set_timeout(tc_core, 60); suite_add_tcase(s, tc_core); tc_core = tcase_create("Gen"); tcase_add_loop_test(tc_core, gen, 0, i); tcase_add_loop_test(tc_core, gen_stress, 0, i); tcase_add_loop_test(tc_core, gen_wcb, 0, i); tcase_add_loop_test(tc_core, gen_es384_pub, 0, i); tcase_add_loop_test(tc_core, set_alg, 0, i); tcase_add_loop_test(tc_core, gen_ec_stress, 0, i); tcase_set_timeout(tc_core, 120); suite_add_tcase(s, tc_core); tc_core = tcase_create("Error Handling"); tcase_add_loop_test(tc_core, null_handling, 0, i); tcase_add_loop_test(tc_core, just_fail_wcb, 0, i); tcase_add_loop_test(tc_core, sign_es256_bad_sig, 0, i); tcase_set_timeout(tc_core, 60); suite_add_tcase(s, tc_core); tc_core = tcase_create("HS256 Key Gen"); tcase_add_loop_test(tc_core, gen_hs256, 0, i); tcase_add_loop_test(tc_core, gen_hs256_bits, 0, i); tcase_add_loop_test(tc_core, gen_hs256_wcb, 0, i); tcase_set_timeout(tc_core, 60); suite_add_tcase(s, tc_core); tc_core = tcase_create("Claims SetGetDel"); tcase_add_loop_test(tc_core, claim_str_setgetdel, 0, i); tcase_add_loop_test(tc_core, claim_int_setgetdel, 0, i); tcase_add_loop_test(tc_core, claim_bool_setgetdel, 0, i); tcase_add_loop_test(tc_core, claim_json_setgetdel, 0, i); tcase_set_timeout(tc_core, 60); suite_add_tcase(s, tc_core); tc_core = tcase_create("Header SetGetDel"); /* All of the code paths for str/int/bool/json have been covered. We * just run this to ensure set/get/del works on headers */ tcase_add_loop_test(tc_core, header_str_setgetdel, 0, i); tcase_set_timeout(tc_core, 60); suite_add_tcase(s, tc_core); return s; } int main(void) { JWT_TEST_MAIN("LibJWT Builder"); } libjwt-3.3.3/tests/jwt_checker.c000066400000000000000000000601741517612317300166270ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include "jwt_tests.h" START_TEST(new) { jwt_checker_auto_t *checker = NULL; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); } END_TEST START_TEST(verify) { const char token[] = "eyJhbGciOiJub25lIn0.eyJpc3MiOiJka" "XNrLnN3aXNzZGlzay5jb20ifQ."; jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_verify(checker, token); ck_assert_int_eq(ret, 0); } END_TEST START_TEST(alg_none_with_sig) { const char token[] = "eyJhbGciOiJub25lIn0.eyJpc3MiOiJka" "XNrLnN3aXNzZGlzay5jb20ifQ.XNrLnN3aXNzZGlzay5jb20ifQ"; jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "JWT has signature block, but no alg set"); } END_TEST START_TEST(bad_alg) { const char token[] = "eyJhbGciOiJmb28ifQo.e30K."; jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); } END_TEST START_TEST(no_alg) { const char token[] = "eyJub3RhbGciOiJmb28ifQo.e30K."; jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); } END_TEST START_TEST(no_first_dot) { const char token[] = "eyJub3RhbGciOiJmb28ifQo"; jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); } END_TEST START_TEST(no_second_dot) { const char token[] = "eyJub3RhbGciOiJmb28ifQo.e30K"; jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); } END_TEST START_TEST(verify_bad_header) { const char token[] = "eyJhbGcOiJub25lIn0.eyJpc3MiOiJka" "XNrLnN3aXNzZGlzay5jb20ifQ."; jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Error parsing header"); } END_TEST START_TEST(verify_bad_payload) { const char token[] = "eyJhbGciOiJub25lIn0.eyJpc3MiOiJka" "XNrLnN3aXNzZGlzay5jb0ifQ."; jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Error parsing payload"); } END_TEST static int __verify_wcb(jwt_t *jwt, jwt_config_t *config) { jwt_value_error_t err; jwt_value_t jval; ck_assert_ptr_nonnull(jwt); ck_assert_ptr_nonnull(config); jwt_set_GET_STR(&jval, "alg"); err = jwt_header_get(jwt, &jval); ck_assert_int_eq(err, JWT_VALUE_ERR_NONE); ck_assert_int_eq(jval.error, JWT_VALUE_ERR_NONE); ck_assert_ptr_nonnull(jval.str_val); ck_assert_str_eq(jval.str_val, "none"); jwt_set_GET_INT(&jval, "iat"); err = jwt_claim_get(jwt, &jval); ck_assert_int_eq(err, JWT_VALUE_ERR_NOEXIST); ck_assert_int_eq(jval.error, JWT_VALUE_ERR_NOEXIST); ck_assert_int_eq(jval.int_val, 0); err = jwt_header_del(jwt, "alg"); ck_assert_int_eq(err, JWT_VALUE_ERR_NONE); err = jwt_claim_del(jwt, "iat"); ck_assert_int_eq(err, JWT_VALUE_ERR_NONE); ck_assert_str_eq(config->ctx, "testing"); return 0; } START_TEST(verify_wcb) { const char token[] = "eyJhbGciOiJub25lIn0.eyJpc3MiOiJkaXNrLnN3aXNzZGlz" "ay5jb20iLCJhdWQiOiJwdWJsaWMiLCJzdWIiOiJteS1mcmllbmQifQ."; jwt_checker_auto_t *checker = NULL; const char *ctx; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_claim_set(checker, JWT_CLAIM_SUB, "my-friend"); ck_assert_int_eq(ret, 0); ret = jwt_checker_claim_set(checker, JWT_CLAIM_AUD, "public"); ck_assert_int_eq(ret, 0); ret = jwt_checker_claim_set(checker, JWT_CLAIM_ISS, "disk.swissdisk.com"); ck_assert_int_eq(ret, 0); ret = jwt_checker_setcb(checker, __verify_wcb, "testing"); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_eq(ret, 0); ctx = jwt_checker_getctx(checker); ck_assert_ptr_nonnull(ctx); ck_assert_str_eq(ctx, "testing"); } END_TEST START_TEST(verify_stress) { const char token[] = "eyJhbGciOiJub25lIn0.eyJpc3MiOiJkaXNrLnN3aXNzZGlz" "ay5jb20iLCJhdWQiOiJwdWJsaWMiLCJzdWIiOiJteS1mcmllbmQifQ."; jwt_checker_auto_t *checker = NULL; int i; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); for (i = 0; i < 1000; i++) { int ret = jwt_checker_verify(checker, token); ck_assert_int_eq(ret, 0); } } END_TEST START_TEST(null_handling) { jwt_checker_auto_t *checker = NULL; const char *out; jwk_item_t *key = NULL; int ret; checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); jwt_checker_free(NULL); ret = jwt_checker_setkey(NULL, JWT_ALG_HS256, NULL); ck_assert_int_ne(ret, 0); /* Create and clear an error */ ret = jwt_checker_setkey(checker, JWT_ALG_HS256, NULL); ck_assert_int_ne(ret, 0); /* Check error exists */ ck_assert_int_ne(jwt_checker_error(checker), 0); out = jwt_checker_error_msg(checker); ck_assert_ptr_nonnull(out); ck_assert_int_ne(strlen(out), 0); /* Clear it */ jwt_checker_error_clear(checker); /* Check that its cleared */ ck_assert_int_eq(jwt_checker_error(checker), 0); out = jwt_checker_error_msg(checker); ck_assert_ptr_nonnull(out); ck_assert_int_eq(strlen(out), 0); /* Fake it */ key = (void *)checker; ret = jwt_checker_setkey(NULL, 0, key); ck_assert_int_ne(ret, 0); ret = jwt_checker_error(NULL); ck_assert_int_ne(ret, 0); out = jwt_checker_error_msg(NULL); ck_assert_ptr_null(out); out = jwt_checker_error_msg(checker); ck_assert_ptr_nonnull(out); ck_assert_int_eq(strlen(out), 0); jwt_checker_error_clear(NULL); ret = jwt_checker_verify(NULL, NULL); ck_assert_int_ne(ret, 0); ret = jwt_checker_verify(checker, NULL); ck_assert_int_ne(ret, 0); ck_assert_int_ne(jwt_checker_error(checker), 0); /* Fake it */ out = (void *)checker; ret = jwt_checker_verify(NULL, out);; ck_assert_int_ne(ret, 0); ck_assert_int_ne(jwt_checker_error(checker), 0); out = jwt_checker_claim_get(checker, JWT_CLAIM_IAT); ck_assert_ptr_null(out); ret = jwt_checker_claim_set(checker, JWT_CLAIM_IAT, "foo"); ck_assert_int_ne(ret, 0); ret = jwt_checker_claim_del(checker, JWT_CLAIM_IAT); ck_assert_int_ne(ret, 0); ret = jwt_checker_time_leeway(NULL, JWT_CLAIM_IAT, 0); ck_assert_int_ne(ret, 0); ret = jwt_checker_time_leeway(checker, JWT_CLAIM_IAT, 0); /* Some alg mismatches */ read_json("eddsa_key_ed25519_pub.json"); ret = jwt_checker_setkey(checker, JWT_ALG_NONE, g_item); ck_assert_int_ne(ret, 0); free_key(); jwt_checker_error_clear(checker); read_json("oct_key_256.json"); ret = jwt_checker_setkey(checker, JWT_ALG_ES256, g_item); ck_assert_int_ne(ret, 0); free_key(); /* Callbacks */ ck_assert_int_ne(jwt_checker_setcb(NULL, NULL, NULL), 0); ck_assert_int_ne(jwt_checker_setcb(checker, NULL, "foo"), 0); ck_assert_ptr_null(jwt_checker_getctx(NULL)); /* Changing ctx for cb */ ret = jwt_checker_setcb(checker, __verify_wcb, NULL); ck_assert_int_eq(ret, 0); ck_assert_ptr_null(jwt_checker_getctx(checker)); ret = jwt_checker_setcb(checker, NULL, "foo"); ck_assert_int_eq(ret, 0); ck_assert_ptr_nonnull(jwt_checker_getctx(checker)); ret = jwt_checker_setcb(checker, NULL, NULL); ck_assert_int_eq(ret, 0); ck_assert_ptr_null(jwt_checker_getctx(checker)); /* Some claims stuff */ ck_assert_ptr_null(jwt_checker_claim_get(NULL, JWT_CLAIM_SUB)); ck_assert_ptr_null(jwt_checker_claim_get(checker, JWT_CLAIM_IAT)); } END_TEST START_TEST(verify_hs256) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("oct_key_256.json"); ret = jwt_checker_setkey(checker, JWT_ALG_HS256, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_eq(ret, 0); free_key(); } END_TEST START_TEST(hs256_no_key) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "JWT has signature, but no key was given"); } END_TEST START_TEST(hs256_wrong_key) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("ec_key_secp384r1_pub.json"); ret = jwt_checker_setkey(checker, JWT_ALG_NONE, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key alg does not match JWT"); free_key(); } END_TEST START_TEST(hs256_token_failed) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); /* Algorithm confusion: an OKP/EdDSA JWK must not be settable for * HS256 (GHSA-q843-6q5f-w55g). setkey rejects up front. */ read_json("eddsa_key_ed25519_pub.json"); ret = jwt_checker_setkey(checker, JWT_ALG_HS256, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key type does not match algorithm"); free_key(); } END_TEST START_TEST(hs256_wrong_key_alg) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("eddsa_key_ed25519_pub.json"); ret = jwt_checker_setkey(checker, JWT_ALG_EDDSA, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Config alg does not match JWT"); free_key(); } END_TEST START_TEST(verify_rsapss384) { jwt_checker_auto_t *checker = NULL; // GnuTLS created const char *token1 = "eyJhbGciOiJQUzM4NCIsInR5cCI6IkpXVCJ9.e30.g_OJbEk" "tbb721dPDZ5hDZHnf8Uk6PiZ8IoatdEGxRc3GBW8xef1jRm_jZYfWh5cEz9Mg" "mzN0xN3q9wYCjoBrB_UUV4sonbUX4QEmUW5B5M0JJ3KyFhzJtcVrl9pVGT6ZB" "FLV-Pwmlus7cq73xDVNrdIX0CkZQ-3pkesiOuUsPK62cs6cQS_TrRQe58JWk0" "CoLIIpaiwZ56uerdPK2uAyDaxRzlVQ_2uKkLjSRCnz4eDHRYJriGtR_bfqIWo" "_gQHowDh_tTeGcWiMugtp9aU6_ES7VSuS7cQuH_-oYEKwnIcM4O8zV5J9EuYl" "JDx0M3C2E13dyUxFEKw3nGEcdiZhcA"; // OpenSSL created const char *token2 = "eyJhbGciOiJQUzM4NCIsInR5cCI6IkpXVCJ9.e30.gNMKG8F" "GbaYNmH5CHHfr-ApOoD5AdtCyasjGaIdphyTrfBXZEqMBet3-C3-Bw1N3hPta" "eN-HpFj5XlDQAy3mmyO0oAiP--NHPKMo09pNNGU18BsAH5ht9SE5Y50AB8Wr1" "vArRZnds3MDmAVwjcG-YBAy8q8jdUP1G9DyItd32bETq-5xlixCW1Jqk8n5Px" "6jMalpbYIwGYYr1vcUUbwOSagVu8crtmRaXt_PSy4kUpI4sKtggIYTjoezwy5" "_B0Tu_cO9xgBe-uOYvJ5rEQk5jen84pBcJ5G8OLorrefX81Vw-AKdD5kdbbqh" "UXSooe803Mt5G2IpDHAXmOwvVBixjA"; // JWT.io created const char *token3 = "eyJhbGciOiJQUzM4NCIsInR5cCI6IkpXVCJ9.e30.XZN5m3p" "HZnDsdRlR8bmZ1XuSqRBALy5Ikl12KtmtFSCYF22eeIJVwuk_DpKLyhZsiXF_" "FIQqoKU8wOO984vK1r8nlQyv_6C0TbC-fH5bjdZ8w5esBOyihEjtG5AScbjpw" "FYCPz_6kayusQqA_FUS_fsjHtg3gKb6viyotlMD6CCengg9aV6TyFMchBL-0_" "S6u-gBZC_1IJ6-ibPy8ILSVKgi6D8ucI2ZcSP79z8BZv8-HWPSJU70Ef4CEVn" "Owo3Grx7zAaAuzDEBELggZeW51bOypBCmmaTy3G2txeYhBE5TI88IeYOh-lrE" "KVQ-ZwOB8dGr0g8wbPl_i9WPdaJV7Q"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("rsa_pss_key_2048_384_pub.json"); ret = jwt_checker_setkey(checker, JWT_ALG_PS384, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token3); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token2); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token1); ck_assert_int_eq(ret, 0); free_key(); } END_TEST static int __verify_hs256_wcb(jwt_t *jwt, jwt_config_t *config) { ck_assert_ptr_nonnull(jwt); ck_assert_ptr_nonnull(config); ck_assert_int_eq(jwt_get_alg(jwt), JWT_ALG_HS256); if (config->ctx != NULL) { config->key = g_item; config->alg = JWT_ALG_HS256; } else { config->key = NULL; config->alg = JWT_ALG_HS256; } return 0; } START_TEST(verify_hs256_wcb) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("oct_key_256.json"); ret = jwt_checker_setcb(checker, __verify_hs256_wcb, "testing"); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_eq(ret, 0); ret = jwt_checker_setcb(checker, __verify_hs256_wcb, NULL); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); free_key(); } END_TEST static int __just_fail_cb(jwt_t *jwt, jwt_config_t *config) { (void)jwt; (void)config; return 1; } START_TEST(just_fail_wcb) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("oct_key_256.json"); ret = jwt_checker_setcb(checker, __just_fail_cb, "testing"); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); free_key(); } END_TEST START_TEST(verify_hs256_stress) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; int ret, i; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("oct_key_256.json"); ret = jwt_checker_setkey(checker, JWT_ALG_HS256, g_item); ck_assert_int_eq(ret, 0); for (i = 0; i < 1000; i++) { ret = jwt_checker_verify(checker, token); ck_assert_int_eq(ret, 0); } free_key(); } END_TEST START_TEST(verify_hs256_fail) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("oct_key_256_issue1.json"); ret = jwt_checker_setkey(checker, JWT_ALG_HS256, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Token failed verification"); free_key(); } END_TEST START_TEST(verify_hs256_fail_stress) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; int ret, i; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("oct_key_256_issue1.json"); ret = jwt_checker_setkey(checker, JWT_ALG_HS256, g_item); ck_assert_int_eq(ret, 0); for (i = 0; i < 1000; i++) { ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Token failed verification"); } free_key(); } END_TEST START_TEST(claim_setgetdel) { jwt_checker_auto_t *checker = NULL; const char *out = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_claim_set(checker, JWT_CLAIM_ISS, "disk.swissdisk.com"); ck_assert_int_eq(ret, 0); ret = jwt_checker_claim_set(checker, JWT_CLAIM_AUD, "public"); ck_assert_int_eq(ret, 0); ret = jwt_checker_claim_set(checker, JWT_CLAIM_AUD, "employees"); ck_assert_int_eq(ret, 0); out = jwt_checker_claim_get(checker, JWT_CLAIM_AUD); ck_assert_ptr_nonnull(out); ck_assert_str_eq(out, "employees"); ret = jwt_checker_claim_del(checker, JWT_CLAIM_AUD); ck_assert_int_eq(ret, 0); out = jwt_checker_claim_get(checker, JWT_CLAIM_AUD); ck_assert_ptr_null(out); } END_TEST START_TEST(claim_time_set) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_time_leeway(checker, JWT_CLAIM_NBF, -1); ck_assert_int_eq(ret, 0); ret = jwt_checker_time_leeway(checker, JWT_CLAIM_NBF, 360); ck_assert_int_eq(ret, 0); ret = jwt_checker_time_leeway(checker, JWT_CLAIM_NBF, 480); ck_assert_int_eq(ret, 0); ret = jwt_checker_time_leeway(checker, JWT_CLAIM_EXP, -1); ck_assert_int_eq(ret, 0); ret = jwt_checker_time_leeway(checker, JWT_CLAIM_EXP, 360); ck_assert_int_eq(ret, 0); ret = jwt_checker_time_leeway(checker, JWT_CLAIM_EXP, 480); ck_assert_int_eq(ret, 0); } END_TEST START_TEST(verify_ps256_nosig) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI" "6ZmFsc2UsImlhdCI6MTczNjY5NDU5NCwiaXNzIjoiaHR0cHM6Ly9zd2lzc2Rp" "c2suY29tIiwidXNlciI6ImJlbmNvbGxpbnMifQ."; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("rsa_pss_key_2048.json"); ret = jwt_checker_setkey(checker, JWT_ALG_PS256, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Expected a signature, but JWT has none"); free_key(); } END_TEST START_TEST(verify_ps256_bad_b64_sig) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI" "6ZmFsc2UsImlhdCI6MTczNjY5NDU5NCwiaXNzIjoiaHR0cHM6Ly9zd2lzc2Rp" "c2suY29tIiwidXNlciI6ImJlbmNvbGxpbnMifQ.eyJhbGciOiJQUzI1N*IsIn" "R5cCI6I!pXVCJ9"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("rsa_pss_key_2048.json"); ret = jwt_checker_setkey(checker, JWT_ALG_PS256, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Error decoding signature"); free_key(); } END_TEST START_TEST(verify_ps256_bad_b64_sig_255) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI" "6ZmFsc2UsImlhdCI6MTczNjY5NDU5NCwiaXNzIjoiaHR0cHM6Ly9zd2lzc2Rp" "c2suY29tIiwidXNlciI6ImJlbmNvbGxpbnMifQ.eyJhbGciOiJQUzI1N[IsIn" "R5cCI6I!pXVCJ9"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("rsa_pss_key_2048.json"); ret = jwt_checker_setkey(checker, JWT_ALG_PS256, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Error decoding signature"); free_key(); } END_TEST START_TEST(verify_ps256_bad_sig) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI" "6ZmFsc2UsImlhdCI6MTczNjY5NDU5NCwiaXNzIjoiaHR0cHM6Ly9zd2lzc2Rp" "c2suY29tIiwidXNlciI6ImJlbmNvbGxpbnMifQ.eyJhbGciOiJQUzI1NiIsIn" "R5cCI6IkpXVCJ9"; const char *err; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json("rsa_pss_key_2048.json"); ret = jwt_checker_setkey(checker, JWT_ALG_PS256, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); err = jwt_checker_error_msg(checker); ck_assert_ptr_nonnull(err); ck_assert_ptr_nonnull(strstr(err, "Failed to verify signature")); free_key(); } END_TEST START_TEST(verify_es256_bad_sig) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); /* Algorithm confusion: an OKP/EdDSA JWK must not be settable for * an EC algorithm like ES256 (GHSA-q843-6q5f-w55g). setkey rejects * up front before the broken-signature path is ever reached. */ read_json("eddsa_key_ed25519_pub_fake_es256.json"); ret = jwt_checker_setkey(checker, JWT_ALG_ES256, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key type does not match algorithm"); free_key(); } END_TEST static Suite *libjwt_suite(const char *title) { Suite *s; TCase *tc_core; int i = ARRAY_SIZE(jwt_test_ops); s = suite_create(title); tc_core = tcase_create("New"); tcase_add_loop_test(tc_core, new, 0, i); suite_add_tcase(s, tc_core); tc_core = tcase_create("Verify"); tcase_add_loop_test(tc_core, verify, 0, i); tcase_add_loop_test(tc_core, verify_bad_header, 0, i); tcase_add_loop_test(tc_core, verify_bad_payload, 0, i); tcase_add_loop_test(tc_core, verify_rsapss384, 0, i); tcase_add_loop_test(tc_core, verify_wcb, 0, i); tcase_add_loop_test(tc_core, just_fail_wcb, 0, i); tcase_add_loop_test(tc_core, verify_stress, 0, i); suite_add_tcase(s, tc_core); tc_core = tcase_create("Error Handling"); tcase_add_loop_test(tc_core, null_handling, 0, i); tcase_add_loop_test(tc_core, bad_alg, 0, i); tcase_add_loop_test(tc_core, no_alg, 0, i); tcase_add_loop_test(tc_core, no_first_dot, 0, i); tcase_add_loop_test(tc_core, no_second_dot, 0, i); tcase_add_loop_test(tc_core, alg_none_with_sig, 0, i); tcase_add_loop_test(tc_core, hs256_no_key, 0, i); tcase_add_loop_test(tc_core, hs256_wrong_key, 0, i); tcase_add_loop_test(tc_core, hs256_wrong_key_alg, 0, i); tcase_add_loop_test(tc_core, hs256_token_failed, 0, i); suite_add_tcase(s, tc_core); tc_core = tcase_create("HS256 Key Verify"); tcase_add_loop_test(tc_core, verify_hs256, 0, i); tcase_add_loop_test(tc_core, verify_hs256_wcb, 0, i); tcase_add_loop_test(tc_core, verify_hs256_stress, 0, i); tcase_add_loop_test(tc_core, verify_hs256_fail, 0, i); tcase_add_loop_test(tc_core, verify_hs256_fail_stress, 0, i); suite_add_tcase(s, tc_core); tc_core = tcase_create("Claims"); tcase_add_loop_test(tc_core, claim_setgetdel, 0, i); tcase_add_loop_test(tc_core, claim_time_set, 0, i); suite_add_tcase(s, tc_core); tc_core = tcase_create("Corner cases"); tcase_add_loop_test(tc_core, verify_ps256_nosig, 0, i); tcase_add_loop_test(tc_core, verify_ps256_bad_b64_sig, 0, i); tcase_add_loop_test(tc_core, verify_ps256_bad_b64_sig_255, 0, i); tcase_add_loop_test(tc_core, verify_ps256_bad_sig, 0, i); tcase_add_loop_test(tc_core, verify_es256_bad_sig, 0, i); suite_add_tcase(s, tc_core); return s; } int main(void) { JWT_TEST_MAIN("LibJWT Checker"); } libjwt-3.3.3/tests/jwt_claims.c000066400000000000000000000113161517612317300164650ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include "jwt_tests.h" static void __get_set(jwt_builder_t **builder, jwt_checker_t **checker) { int ret; read_json("oct_key_256.json"); /* One to build */ *builder = jwt_builder_new(); ck_assert_ptr_nonnull(*builder); ck_assert_int_eq(jwt_builder_error(*builder), 0); /* One to check */ *checker = jwt_checker_new(); ck_assert_ptr_nonnull(*checker); ck_assert_int_eq(jwt_checker_error(*checker), 0); /* Set the same key for both */ ret = jwt_builder_setkey(*builder, JWT_ALG_HS256, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_setkey(*checker, JWT_ALG_HS256, g_item); ck_assert_int_eq(ret, 0); } START_TEST(claims_nbf_leeway) { jwt_builder_auto_t *builder = NULL; jwt_checker_auto_t *checker = NULL; char *out = NULL; int ret; SET_OPS(); __get_set(&builder, &checker); /* Set nbf +10 */ ret = jwt_builder_time_offset(builder, JWT_CLAIM_NBF, 10); ck_assert_int_eq(ret, 0); /* Gen with "nbf" claim */ out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); /* Small leeway */ ret = jwt_checker_time_leeway(checker, JWT_CLAIM_NBF, 1);; ck_assert_int_eq(ret, 0); /* Too soon */ ret = jwt_checker_verify(checker, out); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Failed one or more claims"); jwt_checker_error_clear(checker); /* Bigger leeway */ ret = jwt_checker_time_leeway(checker, JWT_CLAIM_NBF, 10);; ck_assert_int_eq(ret, 0); /* Should pass */ ret = jwt_checker_verify(checker, out); ck_assert_int_eq(ret, 0); /* We clear the check */ ret = jwt_checker_time_leeway(checker, JWT_CLAIM_NBF, -1); ck_assert_int_eq(ret, 0); /* Should pass */ ret = jwt_checker_verify(checker, out); ck_assert_int_eq(ret, 0); free(out); free_key(); } END_TEST START_TEST(claims_exp_leeway) { jwt_builder_auto_t *builder = NULL; jwt_checker_auto_t *checker = NULL; char *out = NULL; int ret; SET_OPS(); __get_set(&builder, &checker); /* Set exp */ ret = jwt_builder_time_offset(builder, JWT_CLAIM_EXP, 1); ck_assert_int_eq(ret, 0); /* Gen with "exp" claim */ out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); /* We gotta sleep for this to work */ sleep(1); /* No leeway */ ret = jwt_checker_time_leeway(checker, JWT_CLAIM_EXP, 0);; ck_assert_int_eq(ret, 0); /* Too late */ ret = jwt_checker_verify(checker, out); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Failed one or more claims"); jwt_checker_error_clear(checker); /* Bigger leeway */ ret = jwt_checker_time_leeway(checker, JWT_CLAIM_EXP, 10);; ck_assert_int_eq(ret, 0); /* Should pass */ ret = jwt_checker_verify(checker, out); ck_assert_int_eq(ret, 0); /* We clear the check */ ret = jwt_checker_time_leeway(checker, JWT_CLAIM_EXP, -1);; ck_assert_int_eq(ret, 0); free(out); free_key(); } END_TEST static void __test_claim(const char *cstr, jwt_claims_t claim) { jwt_builder_auto_t *builder = NULL; jwt_checker_auto_t *checker = NULL; jwt_value_error_t jerr; jwt_value_t jval; char *out = NULL; int ret; __get_set(&builder, &checker); /* Gen with claim */ out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); /* Set what to expect */ ret = jwt_checker_claim_set(checker, claim, "foo.example.com");; ck_assert_int_eq(ret, 0); /* Should fail, because it's missing */ ret = jwt_checker_verify(checker, out); ck_assert_int_ne(ret, 0); /* Set claim string */ jwt_set_SET_STR(&jval, cstr, "disk.swissdisk.com"); jerr = jwt_builder_claim_set(builder, &jval); ck_assert_int_eq(jerr, JWT_VALUE_ERR_NONE); /* Gen new with claim set */ free(out); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); /* Should fail, because of mismatch */ ret = jwt_checker_verify(checker, out); ck_assert_int_ne(ret, 0); free(out); free_key(); } START_TEST(claims_iss) { SET_OPS(); __test_claim("iss", JWT_CLAIM_ISS); } END_TEST START_TEST(claims_aud) { SET_OPS(); __test_claim("aud", JWT_CLAIM_AUD); } END_TEST START_TEST(claims_sub) { SET_OPS(); __test_claim("sub", JWT_CLAIM_SUB); } END_TEST static Suite *libjwt_suite(const char *title) { Suite *s; TCase *tc_core; int i = ARRAY_SIZE(jwt_test_ops); s = suite_create(title); tc_core = tcase_create("Claims Build/Check"); tcase_add_loop_test(tc_core, claims_nbf_leeway, 0, i); tcase_add_loop_test(tc_core, claims_exp_leeway, 0, i); tcase_add_loop_test(tc_core, claims_iss, 0, i); tcase_add_loop_test(tc_core, claims_aud, 0, i); tcase_add_loop_test(tc_core, claims_sub, 0, i); suite_add_tcase(s, tc_core); return s; } int main(void) { JWT_TEST_MAIN("LibJWT Claims Handling"); } libjwt-3.3.3/tests/jwt_crypto.c000066400000000000000000000021471517612317300165370ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include "jwt_tests.h" START_TEST(test_jwt_ops) { size_t i; for (i = 0; i < ARRAY_SIZE(jwt_test_ops); i++) { jwt_test_op_t *op = &jwt_test_ops[i]; const char *name; jwt_crypto_provider_t type; ck_assert(!jwt_set_crypto_ops(op->name)); name = jwt_get_crypto_ops(); ck_assert_str_eq(name, op->name); ck_assert(!jwt_set_crypto_ops_t(op->type)); type = jwt_get_crypto_ops_t(); ck_assert_int_eq(type, op->type); ck_assert_int_ne(jwt_crypto_ops_supports_jwk(), 0); } /* Assert that this fails */ ck_assert(jwt_set_crypto_ops("ALWAYS FAIL")); ck_assert(jwt_set_crypto_ops_t((jwt_crypto_provider_t)919192)); } END_TEST static Suite *libjwt_suite(const char *title) { Suite *s; TCase *tc_core; s = suite_create(title); tc_core = tcase_create("jwt_crypto"); tcase_add_test(tc_core, test_jwt_ops); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(void) { JWT_TEST_MAIN("LibJWT Crypto Operations"); } libjwt-3.3.3/tests/jwt_ec.c000066400000000000000000000057271517612317300156150ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include "jwt_tests.h" START_TEST(test_jwks_ec_pub_missing) { const char *json = "{\"kty\":\"EC\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; const char exp[] = "Missing or invalid type for one of crv, x, or y for pub key"; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); ck_assert_str_eq(exp, jwks_item_error_msg(item)); jwks_free(jwk_set); } END_TEST START_TEST(test_jwks_ec_pub_bad_type) { const char *json = "{\"kty\":\"EC\",\"crv\":\"prime6v1\",\"x\":\"sd+#(@#($(ada\",\"y\":1}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; const char exp[] = "Missing or invalid type for one of crv, x, or y for pub key"; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); ck_assert_str_eq(exp, jwks_item_error_msg(item)); jwks_free(jwk_set); } END_TEST START_TEST(test_jwks_ec_pub_bad64) { const char *json = "{\"kty\":\"EC\",\"crv\":\"prime6v1\",\"x\":\"\",\"y\":\"asaad\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; const char exp[] = "Error generating pub key from components"; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); ck_assert_str_eq(exp, jwks_item_error_msg(item)); jwks_free(jwk_set); } END_TEST START_TEST(test_jwks_ec_pub_bad_points) { const char *json = "{\"kty\":\"EC\",\"crv\":\"prime256v1\",\"x\":\"YmFkdmFsdWUK\",\"y\":\"YmFkdmFsdWUK\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; const char exp[] = "Error generating pub key from components"; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); ck_assert_str_eq(exp, jwks_item_error_msg(item)); jwks_free(jwk_set); } END_TEST static Suite *libjwt_suite(const char *title) { Suite *s; TCase *tc_core; int i = ARRAY_SIZE(jwt_test_ops); s = suite_create(title); tc_core = tcase_create("jwt_jwks_ec"); /* EC specific error path tests */ tcase_add_loop_test(tc_core, test_jwks_ec_pub_missing, 0, i); tcase_add_loop_test(tc_core, test_jwks_ec_pub_bad64, 0, i); tcase_add_loop_test(tc_core, test_jwks_ec_pub_bad_type, 0, i); tcase_add_loop_test(tc_core, test_jwks_ec_pub_bad_points, 0, i); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(void) { JWT_TEST_MAIN("LibJWT JWKS Error Path Testing EC"); } libjwt-3.3.3/tests/jwt_flipflop.c000066400000000000000000000142401517612317300170270ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include "jwt_tests.h" static void *test_malloc(size_t size) { return malloc(size); } static void test_free(void *ptr) { free(ptr); } static int test_set_alloc(void) { return jwt_set_alloc(test_malloc, test_free); } #ifdef JWT_CONSTRUCTOR START_TEST(test_jwt_crypto_ops) { const char *msg = getenv("JWT_CRYPTO"); ck_assert_str_eq(msg, "NONEXISTENT"); } END_TEST #endif START_TEST(test_alloc_funcs) { jwt_malloc_t m = NULL; jwt_free_t f = NULL; int ret; SET_OPS(); jwt_get_alloc(&m, &f); ck_assert_ptr_null(m); ck_assert_ptr_null(f); ret = test_set_alloc(); ck_assert_int_eq(ret, 0); jwt_get_alloc(&m, &f); ck_assert(m == test_malloc); ck_assert(f == test_free); /* XXX Need to do a build/verify to exercise the functions */ } END_TEST static char *__builder(const char *cops, const char *priv, jwt_alg_t alg) { jwt_builder_auto_t *builder; jwt_alg_t a_check = JWT_ALG_NONE; char *out; int ret; ret = jwt_set_crypto_ops(cops); ck_assert_int_eq(ret, 0); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); read_json(priv); if (jwks_item_alg(g_item) == JWT_ALG_NONE) a_check = alg; ret = jwt_builder_setkey(builder, a_check, g_item); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); if (out == NULL) fprintf(stderr, "BuildErr[%s]: %s\n", jwt_alg_str(alg), jwt_builder_error_msg(builder)); ck_assert_ptr_nonnull(out); free_key(); return out; } static void __checker(const char *cops, const char *pub, jwt_alg_t alg, char *token) { jwt_checker_auto_t *checker; int ret; ret = jwt_set_crypto_ops(cops); ck_assert_int_eq(ret, 0); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); read_json(pub); ret = jwt_checker_setkey(checker, alg, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); if (ret) fprintf(stderr, "CheckErr[%s]: %s\n", jwt_alg_str(alg), jwt_checker_error_msg(checker)); ck_assert_int_eq(ret, 0); free_key(); } static void __flip_one(const char *priv, const char *pub, jwt_alg_t alg) { char *out = NULL; size_t i; for (i = 0; i < ARRAY_SIZE(jwt_test_ops); i++) { size_t c; /* Generate on Here */ out = __builder(jwt_test_ops[i].name, priv, alg); if (out == NULL) continue; for (c = 0; c < ARRAY_SIZE(jwt_test_ops); c++) { /* Test everywhere */ __checker(jwt_test_ops[c].name, pub, alg, out); } free(out); test_set_alloc(); } } #define FLIPFLOP_KEY(__name, __pub, __alg) \ START_TEST(__name) \ { \ __flip_one(#__name ".json", \ #__pub ".json", __alg); \ } \ END_TEST #define FLIPFLOP_KEY2(__name, __pub, __alg) \ START_TEST(rsa_no_alg_ ## __alg) \ { \ __flip_one(#__name ".json", \ #__pub ".json", __alg); \ } \ END_TEST FLIPFLOP_KEY(ec_key_prime256v1, ec_key_prime256v1_pub, JWT_ALG_ES256); FLIPFLOP_KEY(ec_key_secp384r1, ec_key_secp384r1_pub, JWT_ALG_ES384); FLIPFLOP_KEY(ec_key_secp521r1, ec_key_secp521r1, JWT_ALG_ES512); FLIPFLOP_KEY(eddsa_key_ed25519, eddsa_key_ed25519, JWT_ALG_EDDSA); FLIPFLOP_KEY(eddsa_key_ed448, eddsa_key_ed448_pub, JWT_ALG_EDDSA); FLIPFLOP_KEY(rsa_key_2048, rsa_key_2048_pub, JWT_ALG_RS256); FLIPFLOP_KEY(rsa_key_4096, rsa_key_4096, JWT_ALG_RS384); FLIPFLOP_KEY(rsa_key_8192, rsa_key_8192_pub, JWT_ALG_RS512); FLIPFLOP_KEY(rsa_pss_key_2048, rsa_pss_key_2048, JWT_ALG_PS256); FLIPFLOP_KEY(rsa_pss_key_2048_384, rsa_pss_key_2048_384_pub, JWT_ALG_PS384); FLIPFLOP_KEY(rsa_pss_key_2048_512, rsa_pss_key_2048_512_pub, JWT_ALG_PS512); /* This key is RSA and does not have an alg set. It can be used for any of the * PS and RS algorithms, so test and make sure that works. */ FLIPFLOP_KEY2(rsa_pss_key_2048_notpss, rsa_pss_key_2048_notpss_pub, JWT_ALG_PS256); FLIPFLOP_KEY2(rsa_pss_key_2048_notpss, rsa_pss_key_2048_notpss_pub, JWT_ALG_PS384); FLIPFLOP_KEY2(rsa_pss_key_2048_notpss, rsa_pss_key_2048_notpss_pub, JWT_ALG_PS512); FLIPFLOP_KEY2(rsa_pss_key_2048_notpss, rsa_pss_key_2048_notpss_pub, JWT_ALG_RS256); FLIPFLOP_KEY2(rsa_pss_key_2048_notpss, rsa_pss_key_2048_notpss_pub, JWT_ALG_RS384); FLIPFLOP_KEY2(rsa_pss_key_2048_notpss, rsa_pss_key_2048_notpss_pub, JWT_ALG_RS512); FLIPFLOP_KEY(oct_key_256, oct_key_256, JWT_ALG_HS256); FLIPFLOP_KEY(oct_key_384, oct_key_384, JWT_ALG_HS384); FLIPFLOP_KEY(oct_key_512, oct_key_512, JWT_ALG_HS512); static Suite *libjwt_suite(const char *title) { Suite *s; TCase *tc_core; s = suite_create(title); tc_core = tcase_create("Keys"); tcase_add_test(tc_core, ec_key_prime256v1); tcase_add_test(tc_core, ec_key_secp384r1); tcase_add_test(tc_core, ec_key_secp521r1); tcase_add_test(tc_core, eddsa_key_ed25519); tcase_add_test(tc_core, eddsa_key_ed448); tcase_add_test(tc_core, rsa_key_2048); tcase_add_test(tc_core, rsa_key_4096); tcase_add_test(tc_core, rsa_key_8192); tcase_add_test(tc_core, rsa_pss_key_2048); tcase_add_test(tc_core, rsa_pss_key_2048_384); tcase_add_test(tc_core, rsa_pss_key_2048_512); /* A set of checks */ tcase_add_test(tc_core, rsa_no_alg_JWT_ALG_PS256); tcase_add_test(tc_core, rsa_no_alg_JWT_ALG_PS384); tcase_add_test(tc_core, rsa_no_alg_JWT_ALG_PS512); tcase_add_test(tc_core, rsa_no_alg_JWT_ALG_RS256); tcase_add_test(tc_core, rsa_no_alg_JWT_ALG_RS384); tcase_add_test(tc_core, rsa_no_alg_JWT_ALG_RS512); tcase_add_test(tc_core, oct_key_256); tcase_add_test(tc_core, oct_key_384); tcase_add_test(tc_core, oct_key_512); tcase_set_timeout(tc_core, 60); suite_add_tcase(s, tc_core); /* We run this here so we get some usage out of it */ tc_core = tcase_create("Utility"); #ifdef JWT_CONSTRUCTOR tcase_add_test(tc_core, test_jwt_crypto_ops); #endif tcase_add_test(tc_core, test_alloc_funcs); suite_add_tcase(s, tc_core); return s; } int main(void) { JWT_TEST_MAIN("OpenSSL, GnuTLS, MbedTLS Cross Testing"); } libjwt-3.3.3/tests/jwt_hs.c000066400000000000000000000063021517612317300156260ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include "jwt_tests.h" static void __verify_token(const char *token, jwt_alg_t alg) { jwt_checker_auto_t *checker = NULL; int ret; checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_setkey(checker, alg, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_eq(ret, 0); } static void __test_alg(const char *key_file, jwt_alg_t alg, const char *expected) { jwt_builder_auto_t *builder = NULL; const unsigned char *buf = NULL; char *out = NULL; size_t len = 0; int ret; builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); ret = jwt_builder_enable_iat(builder, 0); ck_assert_int_eq(ret, 1); read_json(key_file); ret = jwt_builder_setkey(builder, alg, g_item); ck_assert_int_eq(ret, 0); /* Check the values */ ret = jwks_item_key_oct(g_item, &buf, &len); ck_assert_int_eq(ret, 0); ck_assert_ptr_nonnull(buf); ck_assert_int_ge(len, 32); out = jwt_builder_generate(builder); ck_assert_ptr_nonnull(out); ck_assert_str_eq(out, expected); __verify_token(out, alg); free(out); free_key(); } START_TEST(hs_too_small) { jwt_builder_auto_t *builder = NULL; int ret; const char *out = NULL; builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); read_json("oct_key_128_too_small.json"); ret = jwt_builder_setkey(builder, JWT_ALG_HS256, g_item); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); ck_assert_ptr_null(out); ret = jwt_builder_setkey(builder, JWT_ALG_HS384, g_item); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); ck_assert_ptr_null(out); ret = jwt_builder_setkey(builder, JWT_ALG_HS512, g_item); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); ck_assert_ptr_null(out); free_key(); } END_TEST START_TEST(hs256) { const char exp[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.CM4dD95Nj" "0vSfMGtDas432AUW1HAo7feCiAbt5Yjuds"; SET_OPS(); __test_alg("oct_key_256.json", JWT_ALG_HS256, exp); } END_TEST START_TEST(hs384) { const char exp[] = "eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9.e30.GKapA5V0" "PiRn-pNHK1Vj-E01pYv1Gx0VOkzzgp-SbfWQaOz6q6MiiCyVM0P69idm"; SET_OPS(); __test_alg("oct_key_384.json", JWT_ALG_HS384, exp); } END_TEST START_TEST(hs512) { const char exp[] = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.e30.yeSPkrpAm" "_6UGtg2SpdPUV0tsrhVosfxKLuUIqMRwhEEyg6jAWe4J-qKiPdJZfC1MVeMwk" "zwB_k-o9RDi_gSbA"; SET_OPS(); __test_alg("oct_key_512.json", JWT_ALG_HS512, exp); } END_TEST static Suite *libjwt_suite(const char *title) { Suite *s; TCase *tc_core; int i = ARRAY_SIZE(jwt_test_ops); s = suite_create(title); tc_core = tcase_create("HS Key Gen/Ver"); tcase_add_loop_test(tc_core, hs256, 0, i); tcase_add_loop_test(tc_core, hs384, 0, i); tcase_add_loop_test(tc_core, hs512, 0, i); tcase_add_loop_test(tc_core, hs_too_small, 0, i); suite_add_tcase(s, tc_core); return s; } int main(void) { JWT_TEST_MAIN("LibJWT HMAC Algorithms"); } libjwt-3.3.3/tests/jwt_jwks.c000066400000000000000000000111601517612317300161700ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include "jwt_tests.h" START_TEST(test_jwks_keyring_load) { const jwk_item_t *item; int i, ret; int fails = 0; SET_OPS(); read_json("jwks_keyring.json"); for (i = 0; (item = jwks_item_get(g_jwk_set, i)); i++) { jwt_builder_auto_t *builder = NULL; char_auto *out = NULL; jwt_alg_t alg; if (jwks_item_error(item)) { fprintf(stderr, "Err KID: %s\n", jwks_item_kid(item)); } ck_assert_int_eq(jwks_item_error(item), 0); alg = jwks_item_alg(item); if (alg == JWT_ALG_ES256K) continue; if (alg == JWT_ALG_NONE || !jwks_item_is_private(item)) continue; builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ret = jwt_builder_setkey(builder, alg, item); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); if (out == NULL) { fprintf(stderr, "Gen KID(%d/%s): %s\n", i, jwt_alg_str(alg), jwt_builder_error_msg(builder)); fails++; } } ck_assert_int_eq(fails, 0); item = jwks_find_bykid(g_jwk_set, "SDSDS"); ck_assert_ptr_null(item); item = jwks_find_bykid(g_jwk_set, "354912a0-b90a-435e-886a-1629f7b2665e"); ck_assert_ptr_nonnull(item); ck_assert_int_eq(i, 27); i = jwks_item_count(g_jwk_set); ck_assert_int_eq(i, 27); ck_assert(jwks_item_free(g_jwk_set, 3)); i = jwks_item_count(g_jwk_set); ck_assert_int_eq(i, 26); i = jwks_item_free_bad(g_jwk_set); ck_assert_int_eq(i, 0); i = jwks_item_count(g_jwk_set); ck_assert_int_eq(i, 26); free_key(); } END_TEST #ifdef HAVE_LIBCURL START_TEST(load_fromurl) { jwk_set_auto_t *jwk_set = NULL; const char *test_url; SET_OPS(); jwk_set = jwks_create_fromurl(NULL, 1); ck_assert_ptr_null(jwk_set); jwk_set = jwks_create_fromurl("file:///DOESNOTEXIST", 1); ck_assert_ptr_nonnull(jwk_set); ck_assert_int_ne(jwks_error(jwk_set), 0); jwks_error_clear(jwk_set); test_url = getenv("LIBJWT_TEST_URL"); if (!test_url || !test_url[0]) test_url = "file://" KEYDIR "/jwks_keyring.json"; jwk_set = jwks_load_fromurl(jwk_set, test_url, 2); ck_assert_ptr_nonnull(jwk_set); ck_assert_int_gt(jwks_item_count(jwk_set), 0); } #else START_TEST(load_fromurl) { ck_assert_ptr_null(jwks_create_fromurl("file:///", 1)); } END_TEST #endif START_TEST(test_jwks_keyring_all_bad) { const jwk_item_t *item; jwk_set_auto_t *jwk_set; int i; SET_OPS(); jwk_set = jwks_create_fromfile(KEYDIR "/bad_keys.json"); ck_assert_ptr_nonnull(jwk_set); i = jwks_error_any(jwk_set); ck_assert_int_eq(i, 14); for (i = 0; (item = jwks_item_get(jwk_set, i)); i++) { if (!jwks_item_error(item)) { fprintf(stderr, "KID: %s\n", jwks_item_kid(item)); } ck_assert_int_ne(jwks_item_error(item), 0); } ck_assert_int_eq(i, 14); i = jwks_item_free_bad(jwk_set); ck_assert_int_eq(i, 14); i = jwks_item_count(jwk_set); ck_assert_int_eq(i, 0); } END_TEST START_TEST(test_jwks_key_op_all_types) { jwk_key_op_t key_ops = JWK_KEY_OP_SIGN | JWK_KEY_OP_VERIFY | JWK_KEY_OP_ENCRYPT | JWK_KEY_OP_DECRYPT | JWK_KEY_OP_WRAP | JWK_KEY_OP_UNWRAP | JWK_KEY_OP_DERIVE_KEY | JWK_KEY_OP_DERIVE_BITS; const jwk_item_t *item; SET_OPS(); read_jsonfp("jwks_test-1.json"); item = jwks_item_get(g_jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert(!jwks_item_error(item)); ck_assert_int_eq(jwks_item_key_ops(item), key_ops); free_key(); } END_TEST START_TEST(test_jwks_key_op_bad_type) { const jwk_item_t *item; const char *kid = "264265c2-4ef0-4751-adbd-9739550afe5b"; SET_OPS(); read_json("jwks_test-2.json"); item = jwks_item_get(g_jwk_set, 0); ck_assert_ptr_nonnull(item); /* The bad key_op is ignored. */ ck_assert(!jwks_item_error(item)); /* Only these ops set. */ ck_assert_int_eq(jwks_item_key_ops(item), JWK_KEY_OP_VERIFY | JWK_KEY_OP_DERIVE_BITS); ck_assert_int_eq(jwks_item_use(item), JWK_PUB_KEY_USE_ENC); /* Check this key ID. */ ck_assert_str_eq(jwks_item_kid(item), kid); free_key(); } END_TEST static Suite *libjwt_suite(const char *title) { Suite *s; TCase *tc_core; int i = ARRAY_SIZE(jwt_test_ops); s = suite_create(title); tc_core = tcase_create("jwt_jwks"); /* Load a whole keyring */ tcase_add_loop_test(tc_core, test_jwks_keyring_load, 0, i); tcase_add_loop_test(tc_core, test_jwks_keyring_all_bad, 0, i); tcase_add_loop_test(tc_core, load_fromurl, 0, i); /* Some coverage attempts */ tcase_add_loop_test(tc_core, test_jwks_key_op_all_types, 0, i); tcase_add_loop_test(tc_core, test_jwks_key_op_bad_type, 0, i); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(void) { JWT_TEST_MAIN("LibJWT JWKS"); } libjwt-3.3.3/tests/jwt_jwks_errors.c000066400000000000000000000054331517612317300175720ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include "jwt_tests.h" START_TEST(test_jwks_bad_json) { const char *json = "INVALID"; jwk_set_t *jwk_set = NULL; const char *msg; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(jwks_error(jwk_set)); msg = jwks_error_msg(jwk_set); ck_assert_ptr_nonnull(jwk_set); ck_assert(msg[0] != '\0'); jwks_free(jwk_set); } END_TEST START_TEST(test_jwks_unknown_kty) { const char *json = "{\"kty\":\"INVALID\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; const char exp[] = "Unknown or unsupported kty type"; int ret; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); ret = strncmp(exp, jwks_item_error_msg(item), strlen(exp)); ck_assert_int_eq(ret, 0); jwks_free(jwk_set); } END_TEST START_TEST(test_jwks_missing_kty) { const char *json = "{\"NOT-kty\":\"INVALID\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; const char exp[] = "Invalid JWK: missing kty value"; int ret; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); ret = strncmp(exp, jwks_item_error_msg(item), strlen(exp)); ck_assert_int_eq(ret, 0); jwks_free(jwk_set); } END_TEST START_TEST(test_jwks_empty) { jwk_set_t *jwk_set = NULL; const jwk_item_t *item = NULL; int ret; SET_OPS(); jwk_set = jwks_create(NULL); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_null(item); /* Try some null things */ ret = jwks_item_free(NULL, 0); ck_assert_int_eq(ret, 0); ret = jwks_item_free_all(NULL); ck_assert_int_eq(ret, 0); jwks_free(NULL); ck_assert_ptr_null(jwks_create_strn(NULL, 0)); ck_assert_ptr_null(jwks_create_fromfile(NULL)); ck_assert_ptr_null(jwks_create_fromfp(NULL)); jwks_free(jwk_set); } END_TEST static Suite *libjwt_suite(const char *title) { Suite *s; TCase *tc_core; int i = ARRAY_SIZE(jwt_test_ops); s = suite_create(title); tc_core = tcase_create("jwt_jwks_errors"); /* Core JWKS Error path tests */ tcase_add_loop_test(tc_core, test_jwks_bad_json, 0, i); tcase_add_loop_test(tc_core, test_jwks_empty, 0, i); tcase_add_loop_test(tc_core, test_jwks_unknown_kty, 0, i); tcase_add_loop_test(tc_core, test_jwks_missing_kty, 0, i); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(void) { JWT_TEST_MAIN("LibJWT JWKS Error Path Testing"); } libjwt-3.3.3/tests/jwt_rsa.c000066400000000000000000000157161517612317300160120ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include "jwt_tests.h" START_TEST(rsa_pub_missing) { const char *json = "{\"kty\":\"RSA\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; const char exp[] = "Missing required RSA component: n or e"; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); ck_assert_str_eq(exp, jwks_item_error_msg(item)); jwks_free(jwk_set); } END_TEST START_TEST(rsa_pub_bad_type) { const char *json = "{\"kty\":\"RSA\",\"n\":\"YmFkdmFsdWUK\",\"e\":1}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; const char exp[] = "Error decoding pub components"; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); ck_assert_str_eq(exp, jwks_item_error_msg(item)); jwks_free(jwk_set); } END_TEST START_TEST(rsa_pub_bad64) { const char *json = "{\"kty\":\"RSA\",\"n\":\"\",\"e\":\"asaadaaaaaa\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; const char exp[] = "Error decoding pub components"; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); ck_assert_str_eq(exp, jwks_item_error_msg(item)); jwks_free(jwk_set); } END_TEST START_TEST(rsa_pub_binary64) { const char *json = "{\"kty\":\"RSA\",\"n\":" "\"2fyxRFHaYP2a4pbdTK/s9x4YWV7qAWwJMXMkbRmy51w\"," "\"e\":\"2fyxRFHaYP2a4pbdTK/s9x4YWV7qAWwJMXMkbRmy51w\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_ptr_nonnull(jwks_item_pem(item)); ck_assert_int_eq(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST START_TEST(rsa_priv_missing) { const char *json = "{\"kty\":\"RSA\",\"n\":\"YmFkdmFsdWUK\"," "\"e\":\"YmFkdmFsdWUK\",\"d\":\"YmFkdmFsdWUK\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; const char exp[] = "Some priv key components exist, but some are missing"; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); ck_assert_str_eq(exp, jwks_item_error_msg(item)); jwks_free(jwk_set); } END_TEST START_TEST(rsa_priv_bad64) { const char *json = "{\"kty\":\"RSA\",\"n\":\"YmFkdmFsdWUK\"," "\"e\":\"YmFkdmFsdWUK\",\"d\":" "\"2fyxRFHaYP2a4pbdTK/s9x4YWV7qAWwJMXMkbRmy51w\"," "\"p\":\"\",\"q\":\"=\",\"dp\":\"\",\"dq\":\"\",\"qi\":\"\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; const char exp[] = "Error decoding priv components"; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); ck_assert_str_eq(exp, jwks_item_error_msg(item)); jwks_free(jwk_set); } END_TEST START_TEST(rsa_short) { const char token[] = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI" "xMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlh" "dCI6MTUxNjIzOTAyMn0.NHVaYe26MbtOYhSKkoKYdFVomg4i8ZJd8_-RU8VNb" "ftc4TSMb4bXP3l3YlNWACwyXPGffz5aXHc6lty1Y2t4SWRqGteragsVdZufDn" "5BlnJl9pdR_kdVFUsra2rWKEofkZeIC4yWytE58sMIihvo9H1ScmmVwBcQP6X" "ETqYd0aSHp1gOa9RdUPDvoXQ5oqygTqVtxaDr6wUFKrKItgBMzWIdNZ6y7O9E" "0DhEPTbE9rfBo6KTFsHAZnMg4k68CDp2woYIaXbmYTWcvbzIuHO7_37GT79Xd" "Iwkm95QJ7hYC9RiwrV7mesbY4PAahERJawntho0my942XheVLmGwLMBkQ"; jwt_builder_auto_t *builder = NULL; jwt_checker_auto_t *checker = NULL; char *out = NULL; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); read_json("rsa_key_1024.json"); ret = jwt_builder_setkey(builder, JWT_ALG_RS256, g_item); ck_assert_int_eq(ret, 0); out = jwt_builder_generate(builder); ck_assert_ptr_null(out); ck_assert_str_eq(jwt_builder_error_msg(builder), "Key too short for RSA algs: 1024 bits"); ret = jwt_builder_setkey(builder, JWT_ALG_RS256, g_item); ck_assert_int_eq(ret, 0); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_setkey(checker, JWT_ALG_RS256, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key too short for RSA algs: 1024 bits"); free_key(); } END_TEST START_TEST(rsa_ec_short) { jwt_builder_auto_t *builder = NULL; int ret; SET_OPS(); builder = jwt_builder_new(); ck_assert_ptr_nonnull(builder); ck_assert_int_eq(jwt_builder_error(builder), 0); /* Algorithm confusion: an RSA JWK must not be settable for EC or * EdDSA algorithms (GHSA-q843-6q5f-w55g). setkey rejects up front * regardless of which incompatible alg is requested. */ read_json("rsa_key_1024.json"); ret = jwt_builder_setkey(builder, JWT_ALG_ES256, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_builder_error_msg(builder), "Key type does not match algorithm"); jwt_builder_error_clear(builder); ret = jwt_builder_setkey(builder, JWT_ALG_EDDSA, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_builder_error_msg(builder), "Key type does not match algorithm"); jwt_builder_error_clear(builder); ret = jwt_builder_setkey(builder, JWT_ALG_ES384, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_builder_error_msg(builder), "Key type does not match algorithm"); jwt_builder_error_clear(builder); ret = jwt_builder_setkey(builder, JWT_ALG_ES512, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_builder_error_msg(builder), "Key type does not match algorithm"); free_key(); } END_TEST static Suite *libjwt_suite(const char *title) { Suite *s; TCase *tc_core; int i = ARRAY_SIZE(jwt_test_ops); s = suite_create(title); tc_core = tcase_create("jwt_jwks_rsa"); /* RSA specific error path tests */ tcase_add_loop_test(tc_core, rsa_pub_missing, 0, i); tcase_add_loop_test(tc_core, rsa_pub_bad64, 0, i); tcase_add_loop_test(tc_core, rsa_pub_bad_type, 0, i); tcase_add_loop_test(tc_core, rsa_pub_binary64, 0, i); tcase_add_loop_test(tc_core, rsa_priv_missing, 0, i); tcase_add_loop_test(tc_core, rsa_priv_bad64, 0, i); tcase_add_loop_test(tc_core, rsa_short, 0, i); tcase_add_loop_test(tc_core, rsa_ec_short, 0, i); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(void) { JWT_TEST_MAIN("LibJWT JWKS Error Path Testing RSA"); } libjwt-3.3.3/tests/jwt_security.c000066400000000000000000000703551517612317300170740ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ /* Security regression tests for libjwt. * * These tests validate fixes for security vulnerabilities including: * - Ill-structured JSON for JWT and JWKS parsing * - Malformed base64 inputs * - Missing or invalid header fields * - Type confusion in JWK fields * - Truncated and oversized tokens * - NULL and empty input handling */ #include #include #include #include #include #include "jwt_tests.h" /* * === JWKS Ill-Structured JSON Tests === * * These test malformed JWK/JWKS JSON documents to ensure the parser * handles them gracefully without crashes or undefined behavior. */ /* JWK with "alg" as a non-string type (integer) - tests alg_str NULL deref fix */ START_TEST(test_jwks_rsa_alg_integer) { const char *json = "{\"kty\":\"RSA\"," "\"n\":\"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtV" "T86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsG" "Y4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqz" "s8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQ" "FH6wAvvL6F_\"," "\"e\":\"AQAB\"," "\"alg\":256}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); /* Should parse without crashing even though alg is not a string */ item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); jwks_free(jwk_set); } END_TEST /* JWK with "alg" as JSON null */ START_TEST(test_jwks_rsa_alg_null) { const char *json = "{\"kty\":\"RSA\"," "\"n\":\"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtV" "T86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsG" "Y4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqz" "s8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQ" "FH6wAvvL6F_\"," "\"e\":\"AQAB\"," "\"alg\":null}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); jwks_free(jwk_set); } END_TEST /* JWK with "alg" as a boolean */ START_TEST(test_jwks_rsa_alg_boolean) { const char *json = "{\"kty\":\"RSA\"," "\"n\":\"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtV" "T86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsG" "Y4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqz" "s8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQ" "FH6wAvvL6F_\"," "\"e\":\"AQAB\"," "\"alg\":true}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); jwks_free(jwk_set); } END_TEST /* JWK with "kty" as non-string type */ START_TEST(test_jwks_kty_integer) { const char *json = "{\"kty\":123}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* JWKS with empty "keys" array */ START_TEST(test_jwks_empty_keys_array) { const char *json = "{\"keys\":[]}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(!jwks_error(jwk_set)); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_null(item); jwks_free(jwk_set); } END_TEST /* JWKS with "keys" as a string instead of array */ START_TEST(test_jwks_keys_not_array) { const char *json = "{\"keys\":\"not an array\"}"; jwk_set_t *jwk_set = NULL; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); /* Should handle gracefully */ jwks_free(jwk_set); } END_TEST /* JWK with missing required EC components */ START_TEST(test_jwks_ec_missing_x) { const char *json = "{\"kty\":\"EC\"," "\"crv\":\"P-256\"," "\"y\":\"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM\"," "\"alg\":\"ES256\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* JWK with missing required EC curve */ START_TEST(test_jwks_ec_missing_crv) { const char *json = "{\"kty\":\"EC\"," "\"x\":\"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU\"," "\"y\":\"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM\"," "\"alg\":\"ES256\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* JWK with RSA missing 'n' component */ START_TEST(test_jwks_rsa_missing_n) { const char *json = "{\"kty\":\"RSA\"," "\"e\":\"AQAB\"," "\"alg\":\"RS256\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* JWK with RSA missing 'e' component */ START_TEST(test_jwks_rsa_missing_e) { const char *json = "{\"kty\":\"RSA\"," "\"n\":\"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtV" "T86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsG" "Y4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqz" "s8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQ" "FH6wAvvL6F_\"," "\"alg\":\"RS256\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* EdDSA JWK with missing 'x' (public key) */ START_TEST(test_jwks_eddsa_missing_x) { const char *json = "{\"kty\":\"OKP\"," "\"crv\":\"Ed25519\"," "\"alg\":\"EdDSA\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* RSA JWK with partial private key (some but not all components) */ START_TEST(test_jwks_rsa_partial_private_key) { const char *json = "{\"kty\":\"RSA\"," "\"n\":\"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtV" "T86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsG" "Y4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqz" "s8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQ" "FH6wAvvL6F_\"," "\"e\":\"AQAB\"," "\"d\":\"X4cTteJY_gn4FYPsXB8rdXix5vwsg1FLN5E3EaG6RJoVH-HLLKD9M7dx5oo7GURknchnrRweUkC7hT5fJLM0WbFAKNLWY2vv7B6NqXSzUvxT0_YSfqijwp3RTzlBaCxWp4doFk5N2o8Gy_nHNKroADIkJ46pRUohsXywbReAdYaMwFs9tv8d_cPVY3i07a3t8MN6TNwm0dSawm9v47UiCl3Sk5ZiG7xojPLu4sbg1U2jx4IBTNBznbJSzFHK66jT8bgkuqsk0GjskDJk19Z4qwjwbsnn4j2WBii3RL-Us2lGVkY8fkFzme1z0HbIkfz0Y6mqnOYjqxn\"," "\"p\":\"83i-7IvMGXoMXCskv73TKr8637FiO7Z27zv8oj6pbWUQyLPQBQxtPVnwD20R-60eTDmD2ujnMt5PoqMrm8RfmNhVWDtjjMmCMjOpSXicFHj7XOuVIYQyqVWlWEh6dN36GVZYk93N8Bc9vY41xy8B9RzzOGVQzXvNEvn7O0nVbfs\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); /* Should detect missing q, dp, dq, qi */ ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* JWK with values as wrong types (n as integer, e as array) */ START_TEST(test_jwks_rsa_wrong_value_types) { const char *json = "{\"kty\":\"RSA\"," "\"n\":12345," "\"e\":[1,2,3]," "\"alg\":\"RS256\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* Deeply nested JSON object */ START_TEST(test_jwks_deeply_nested) { const char *json = "{\"kty\":\"RSA\"," "\"n\":{\"a\":{\"b\":{\"c\":\"deep\"}}}," "\"e\":\"AQAB\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* Empty JSON object */ START_TEST(test_jwks_empty_object) { const char *json = "{}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* Empty string as JWK */ START_TEST(test_jwks_empty_string) { const char *json = ""; jwk_set_t *jwk_set = NULL; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); ck_assert(jwks_error(jwk_set)); jwks_free(jwk_set); } END_TEST /* JSON array at top level (not object) */ START_TEST(test_jwks_top_level_array) { const char *json = "[{\"kty\":\"RSA\",\"n\":\"abc\",\"e\":\"AQAB\"}]"; jwk_set_t *jwk_set = NULL; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); /* Should not crash regardless of how it handles this */ jwks_free(jwk_set); } END_TEST /* JWKS with mixed valid and invalid keys */ START_TEST(test_jwks_mixed_valid_invalid) { const char *json = "{\"keys\":[" "{\"kty\":\"RSA\",\"n\":\"bad\"}," "{\"kty\":\"INVALID\"}," "{\"NOT-kty\":\"missing\"}" "]}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; int i; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); /* All items should have errors but none should crash */ for (i = 0; (item = jwks_item_get(jwk_set, i)) != NULL; i++) ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* OCT key with invalid base64 in "k" */ START_TEST(test_jwks_oct_invalid_base64) { const char *json = "{\"kty\":\"oct\"," "\"k\":\"!!!not-valid-base64!!!\"," "\"alg\":\"HS256\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); ck_assert_int_ne(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* JWK with extra unexpected fields (should be ignored) */ START_TEST(test_jwks_extra_fields) { const char *json = "{\"kty\":\"oct\"," "\"k\":\"AyM32fcIOpOGAyXWTiHs\"," "\"alg\":\"HS256\"," "\"malicious_field\":\"should be ignored\"," "\"x5c\":[\"not a cert\"]," "\"nested\":{\"deep\":true}}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); /* Key should parse; extra fields ignored */ jwks_free(jwk_set); } END_TEST /* * === JWT Parsing Security Tests === * * These test malformed JWT token strings to ensure the parser * handles them gracefully. */ /* Token with no dots at all */ START_TEST(test_jwt_no_dots) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ret = jwt_checker_verify(checker, "nodotshere"); ck_assert_int_ne(ret, 0); } END_TEST /* Token with only one dot */ START_TEST(test_jwt_one_dot) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ret = jwt_checker_verify(checker, "one.dot"); ck_assert_int_ne(ret, 0); } END_TEST /* Empty token */ START_TEST(test_jwt_empty_token) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ret = jwt_checker_verify(checker, ""); ck_assert_int_ne(ret, 0); } END_TEST /* NULL token */ START_TEST(test_jwt_null_token) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ret = jwt_checker_verify(checker, NULL); ck_assert_int_ne(ret, 0); } END_TEST /* Token with empty header (..payload.sig) */ START_TEST(test_jwt_empty_header) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); /* Empty string before first dot */ ret = jwt_checker_verify(checker, ".eyJ0ZXN0IjoiMSJ9."); ck_assert_int_ne(ret, 0); } END_TEST /* Token with header that is valid base64 but not JSON */ START_TEST(test_jwt_header_not_json) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); /* "not json" in base64url = "bm90IGpzb24" */ ret = jwt_checker_verify(checker, "bm90IGpzb24.eyJ0ZXN0IjoiMSJ9."); ck_assert_int_ne(ret, 0); } END_TEST /* Token with header missing alg field */ START_TEST(test_jwt_header_missing_alg) { jwt_checker_auto_t *checker = NULL; int ret; const char *msg; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); /* {"typ":"JWT"} in base64url (no alg field) */ ret = jwt_checker_verify(checker, "eyJ0eXAiOiJKV1QifQ.eyJ0ZXN0IjoiMSJ9."); ck_assert_int_ne(ret, 0); msg = jwt_checker_error_msg(checker); ck_assert_ptr_nonnull(msg); ck_assert(strlen(msg) > 0); } END_TEST /* Token with invalid alg value */ START_TEST(test_jwt_header_invalid_alg) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); /* {"alg":"BOGUS"} in base64url */ ret = jwt_checker_verify(checker, "eyJhbGciOiJCT0dVUyJ9.eyJ0ZXN0IjoiMSJ9."); ck_assert_int_ne(ret, 0); } END_TEST /* Token with alg as integer in header */ START_TEST(test_jwt_header_alg_integer) { jwt_checker_auto_t *checker = NULL; int ret; const char *msg; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); /* {"alg":256} in base64url */ ret = jwt_checker_verify(checker, "eyJhbGciOjI1Nn0.eyJ0ZXN0IjoiMSJ9."); ck_assert_int_ne(ret, 0); msg = jwt_checker_error_msg(checker); ck_assert_ptr_nonnull(msg); ck_assert(strlen(msg) > 0); } END_TEST /* Token with many dots */ START_TEST(test_jwt_many_dots) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ret = jwt_checker_verify(checker, "a.b.c.d.e.f"); ck_assert_int_ne(ret, 0); } END_TEST /* Token with invalid base64 in payload */ START_TEST(test_jwt_invalid_base64_payload) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); /* Valid header {"alg":"none"}, garbage payload, empty sig */ ret = jwt_checker_verify(checker, "eyJhbGciOiJub25lIn0.!!!invalid!!!."); ck_assert_int_ne(ret, 0); } END_TEST /* Token with empty payload and empty signature (alg:none) */ START_TEST(test_jwt_alg_none_empty) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); /* {"alg":"none"} . {} . (empty sig) */ ret = jwt_checker_verify(checker, "eyJhbGciOiJub25lIn0.e30."); ck_assert_int_eq(ret, 0); } END_TEST /* * === JWKS load_strn boundary tests === */ /* Zero length string to jwks_load_strn */ START_TEST(test_jwks_load_strn_zero_len) { jwk_set_t *jwk_set = NULL; SET_OPS(); jwk_set = jwks_create_strn("{}", 0); ck_assert_ptr_nonnull(jwk_set); jwks_free(jwk_set); } END_TEST /* Truncated JSON to jwks_load_strn */ START_TEST(test_jwks_load_strn_truncated) { const char *json = "{\"kty\":\"RSA\",\"n\":\"abc\",\"e\":\"AQAB\"}"; jwk_set_t *jwk_set = NULL; SET_OPS(); /* Pass only half the string */ jwk_set = jwks_create_strn(json, 10); ck_assert_ptr_nonnull(jwk_set); ck_assert(jwks_error(jwk_set)); jwks_free(jwk_set); } END_TEST /* * === JWKS NULL and edge case handling === */ /* Multiple operations on NULL jwk_set */ START_TEST(test_jwks_null_operations) { SET_OPS(); /* These are documented as NULL-safe and must not crash */ ck_assert_ptr_null(jwks_item_get(NULL, 0)); ck_assert_int_eq(jwks_item_free(NULL, 0), 0); ck_assert_int_eq(jwks_item_free_all(NULL), 0); jwks_free(NULL); ck_assert_ptr_null(jwks_create_strn(NULL, 0)); ck_assert_ptr_null(jwks_create_fromfile(NULL)); ck_assert_ptr_null(jwks_create_fromfp(NULL)); } END_TEST /* Checker NULL safety */ START_TEST(test_checker_null_safety) { int ret; const char *msg; SET_OPS(); jwt_checker_free(NULL); ret = jwt_checker_error(NULL); ck_assert_int_ne(ret, 0); msg = jwt_checker_error_msg(NULL); ck_assert_ptr_null(msg); ret = jwt_checker_setkey(NULL, JWT_ALG_NONE, NULL); ck_assert_int_ne(ret, 0); ret = jwt_checker_verify(NULL, "test"); ck_assert_int_ne(ret, 0); } END_TEST /* Builder NULL safety */ START_TEST(test_builder_null_safety) { char *out; int ret; const char *msg; SET_OPS(); jwt_builder_free(NULL); ret = jwt_builder_error(NULL); ck_assert_int_ne(ret, 0); msg = jwt_builder_error_msg(NULL); ck_assert_ptr_null(msg); ret = jwt_builder_setkey(NULL, JWT_ALG_NONE, NULL); ck_assert_int_ne(ret, 0); out = jwt_builder_generate(NULL); ck_assert_ptr_null(out); } END_TEST /* * === JWK with PSS alg sniffing === * * Tests the alg_str dereference fix specifically. */ START_TEST(test_jwks_rsa_pss_alg_string) { const char *json = "{\"kty\":\"RSA\"," "\"n\":\"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtV" "T86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsG" "Y4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqz" "s8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQ" "FH6wAvvL6F_\"," "\"e\":\"AQAB\"," "\"alg\":\"PS256\"}"; jwk_set_t *jwk_set = NULL; const jwk_item_t *item; SET_OPS(); jwk_set = jwks_create(json); ck_assert_ptr_nonnull(jwk_set); item = jwks_item_get(jwk_set, 0); ck_assert_ptr_nonnull(item); /* Should parse successfully with PS256 */ ck_assert_int_eq(jwks_item_error(item), 0); jwks_free(jwk_set); } END_TEST /* * === Algorithm Confusion Regression (GHSA-q843-6q5f-w55g) === * * An RSA JWK with no "alg" hint must not be usable for any HMAC * algorithm. Without the fix, libjwt would accept the RSA JWK for * HS256/384/512 and run HMAC against a zero-length key * (oct.key/oct.len read from the union shared with provider_data). * That allowed an attacker who only knows the public JWKS to forge * tokens that verify successfully. */ /* The exact PoC from the advisory: RSA public JWK without "alg", * verifying an HS256 token whose signature is HMAC-SHA256("", header.payload). * Must be rejected before the HMAC ever runs. */ START_TEST(test_alg_confusion_rsa_no_alg_hs256) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); read_json("rsa_key_2048_pub_no_alg.json"); /* The setkey call itself must reject the kty/alg mismatch. */ ret = jwt_checker_setkey(checker, JWT_ALG_HS256, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key type does not match algorithm"); free_key(); } END_TEST /* Same defense for HS384 and HS512. */ START_TEST(test_alg_confusion_rsa_no_alg_hs384) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); read_json("rsa_key_2048_pub_no_alg.json"); ret = jwt_checker_setkey(checker, JWT_ALG_HS384, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key type does not match algorithm"); free_key(); } END_TEST START_TEST(test_alg_confusion_rsa_no_alg_hs512) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); read_json("rsa_key_2048_pub_no_alg.json"); ret = jwt_checker_setkey(checker, JWT_ALG_HS512, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key type does not match algorithm"); free_key(); } END_TEST /* RSA JWK that DOES carry an "alg" hint of RS256 must still be rejected * for HS256: the prior code allowed it whenever the JWK alg matched the * caller alg, but here the kty would still be RSA. We assert the broader * invariant: HS* requires kty=oct period. */ START_TEST(test_alg_confusion_rsa_with_alg_hs256) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); read_json("rsa_key_2048_pub.json"); ret = jwt_checker_setkey(checker, JWT_ALG_HS256, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key type does not match algorithm"); free_key(); } END_TEST /* EC JWK must not be usable for an HMAC algorithm either. */ START_TEST(test_alg_confusion_ec_hs256) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); read_json("ec_key_prime256v1_pub.json"); ret = jwt_checker_setkey(checker, JWT_ALG_HS256, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key type does not match algorithm"); free_key(); } END_TEST /* OKP/EdDSA JWK must not be usable for an HMAC algorithm either. */ START_TEST(test_alg_confusion_okp_hs256) { jwt_checker_auto_t *checker = NULL; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); read_json("eddsa_key_ed25519_pub.json"); ret = jwt_checker_setkey(checker, JWT_ALG_HS256, g_item); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key type does not match algorithm"); free_key(); } END_TEST /* The realistic application pattern: a JWKS callback that picks a key * by "kid" and copies the JWT header alg into config->alg. The attacker * controls the header alg. With the fix, the verify path's __setkey_check * (run after the callback) rejects the kty/alg mismatch. */ static int alg_confusion_cb(jwt_t *jwt, jwt_config_t *config) { /* g_item is the RSA-no-alg JWK loaded by the test. */ config->key = g_item; config->alg = jwt_get_alg(jwt); return 0; } START_TEST(test_alg_confusion_callback_rsa_no_alg) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJIUzI1NiIsImtpZCI6InJzYS1uby1hbGcifQ" ".eyJzdWIiOiJhZG1pbiJ9" ".I2Ey63EMS9lOFEL93tQM8eB8cCnH6QJy0rIe1HVEI3I"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); read_json("rsa_key_2048_pub_no_alg.json"); ret = jwt_checker_setcb(checker, alg_confusion_cb, NULL); ck_assert_int_eq(ret, 0); /* The forged token must NOT verify. */ ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key type does not match algorithm"); free_key(); } END_TEST /* Defense in depth: a malformed JWK whose "alg" hint disagrees with its * "kty" (here kty=RSA, alg=HS256) must not be usable for HMAC. The caller * sets alg=NONE so __setkey_check defers to the JWK's alg hint, but the * verify path then double-checks kty against the bound algorithm. */ START_TEST(test_alg_confusion_malformed_jwk_kty_alg) { jwt_checker_auto_t *checker = NULL; const char token[] = "eyJhbGciOiJIUzI1NiIsImtpZCI6InJzYS1uby1hbGcifQ" ".eyJzdWIiOiJhZG1pbiJ9" ".I2Ey63EMS9lOFEL93tQM8eB8cCnH6QJy0rIe1HVEI3I"; int ret; SET_OPS(); checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); read_json("rsa_key_2048_pub_alg_hs256.json"); /* alg=NONE: caller trusts whatever the JWK says. The JWK lies * (kty=RSA, alg=HS256). __setkey_check accepts because alg=NONE, * but the verify path's defensive kty switch must reject. */ ret = jwt_checker_setkey(checker, JWT_ALG_NONE, g_item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, token); ck_assert_int_ne(ret, 0); ck_assert_str_eq(jwt_checker_error_msg(checker), "Key type does not match JWT alg"); free_key(); } END_TEST /* * === Suite Setup === */ static Suite *libjwt_suite(const char *title) { Suite *s; TCase *tc_jwks_json; TCase *tc_jwt_parse; TCase *tc_null_safety; TCase *tc_alg_confusion; int i = ARRAY_SIZE(jwt_test_ops); s = suite_create(title); /* JWKS ill-structured JSON tests */ tc_jwks_json = tcase_create("jwks_malformed_json"); tcase_add_loop_test(tc_jwks_json, test_jwks_rsa_alg_integer, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_rsa_alg_null, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_rsa_alg_boolean, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_kty_integer, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_empty_keys_array, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_keys_not_array, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_ec_missing_x, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_ec_missing_crv, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_rsa_missing_n, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_rsa_missing_e, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_eddsa_missing_x, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_rsa_partial_private_key, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_rsa_wrong_value_types, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_deeply_nested, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_empty_object, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_empty_string, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_top_level_array, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_mixed_valid_invalid, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_oct_invalid_base64, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_extra_fields, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_rsa_pss_alg_string, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_load_strn_zero_len, 0, i); tcase_add_loop_test(tc_jwks_json, test_jwks_load_strn_truncated, 0, i); tcase_set_timeout(tc_jwks_json, 30); suite_add_tcase(s, tc_jwks_json); /* JWT token parsing tests */ tc_jwt_parse = tcase_create("jwt_malformed_tokens"); tcase_add_loop_test(tc_jwt_parse, test_jwt_no_dots, 0, i); tcase_add_loop_test(tc_jwt_parse, test_jwt_one_dot, 0, i); tcase_add_loop_test(tc_jwt_parse, test_jwt_empty_token, 0, i); tcase_add_loop_test(tc_jwt_parse, test_jwt_null_token, 0, i); tcase_add_loop_test(tc_jwt_parse, test_jwt_empty_header, 0, i); tcase_add_loop_test(tc_jwt_parse, test_jwt_header_not_json, 0, i); tcase_add_loop_test(tc_jwt_parse, test_jwt_header_missing_alg, 0, i); tcase_add_loop_test(tc_jwt_parse, test_jwt_header_invalid_alg, 0, i); tcase_add_loop_test(tc_jwt_parse, test_jwt_header_alg_integer, 0, i); tcase_add_loop_test(tc_jwt_parse, test_jwt_many_dots, 0, i); tcase_add_loop_test(tc_jwt_parse, test_jwt_invalid_base64_payload, 0, i); tcase_add_loop_test(tc_jwt_parse, test_jwt_alg_none_empty, 0, i); tcase_set_timeout(tc_jwt_parse, 30); suite_add_tcase(s, tc_jwt_parse); /* NULL safety tests */ tc_null_safety = tcase_create("null_safety"); tcase_add_loop_test(tc_null_safety, test_jwks_null_operations, 0, i); tcase_add_loop_test(tc_null_safety, test_checker_null_safety, 0, i); tcase_add_loop_test(tc_null_safety, test_builder_null_safety, 0, i); tcase_set_timeout(tc_null_safety, 30); suite_add_tcase(s, tc_null_safety); /* Algorithm confusion regression (GHSA-q843-6q5f-w55g) */ tc_alg_confusion = tcase_create("alg_confusion"); tcase_add_loop_test(tc_alg_confusion, test_alg_confusion_rsa_no_alg_hs256, 0, i); tcase_add_loop_test(tc_alg_confusion, test_alg_confusion_rsa_no_alg_hs384, 0, i); tcase_add_loop_test(tc_alg_confusion, test_alg_confusion_rsa_no_alg_hs512, 0, i); tcase_add_loop_test(tc_alg_confusion, test_alg_confusion_rsa_with_alg_hs256, 0, i); tcase_add_loop_test(tc_alg_confusion, test_alg_confusion_ec_hs256, 0, i); tcase_add_loop_test(tc_alg_confusion, test_alg_confusion_okp_hs256, 0, i); tcase_add_loop_test(tc_alg_confusion, test_alg_confusion_callback_rsa_no_alg, 0, i); tcase_add_loop_test(tc_alg_confusion, test_alg_confusion_malformed_jwk_kty_alg, 0, i); tcase_set_timeout(tc_alg_confusion, 30); suite_add_tcase(s, tc_alg_confusion); return s; } int main(void) { JWT_TEST_MAIN("LibJWT Security Regression Tests"); } libjwt-3.3.3/tests/jwt_tests.h000066400000000000000000000107561517612317300163730ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #ifndef JWT_TESTS_H #define JWT_TESTS_H #include #include #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef ARRAY_SIZE # ifdef __GNUC__ # define ARRAY_SIZE(__arr) (sizeof(__arr) / sizeof((__arr)[0]) + \ __builtin_types_compatible_p(typeof(__arr), typeof(&(__arr)[0])) * 0) # else # define ARRAY_SIZE(__arr) (sizeof(__arr) / sizeof((__arr)[0])) # endif #endif /* Compatibility with older libCheck versions */ #ifndef ck_assert_ptr_null #define ck_assert_ptr_null(__X) ck_assert_ptr_eq(__X, NULL) #define ck_assert_ptr_nonnull(__X) ck_assert_ptr_ne(__X, NULL) #endif /* Constant time to make tests consistent. */ #define TS_CONST 1475980545L typedef struct { const char *name; jwt_crypto_provider_t type; } jwt_test_op_t; __attribute__((unused)) static jwt_test_op_t jwt_test_ops[] = { #ifdef HAVE_OPENSSL { .name = "openssl", .type = JWT_CRYPTO_OPS_OPENSSL }, #endif #ifdef HAVE_GNUTLS { .name ="gnutls", .type = JWT_CRYPTO_OPS_GNUTLS }, #endif #ifdef HAVE_MBEDTLS { .name ="mbedtls", .type = JWT_CRYPTO_OPS_MBEDTLS }, #endif }; #define JWT_TEST_MAIN(__title) ({ \ int number_failed = 0; \ SRunner *sr; \ Suite *s; \ \ s = libjwt_suite(__title); \ sr = srunner_create(s); \ \ srunner_run_all(sr, CK_VERBOSE); \ number_failed += srunner_ntests_failed(sr); \ srunner_free(sr); \ \ return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; \ }) #define SET_OPS() ({ \ int r = jwt_set_crypto_ops(jwt_test_ops[_i].name); \ ck_assert_int_eq(r, 0); \ const char *ops = jwt_get_crypto_ops(); \ ck_assert_str_eq(ops, jwt_test_ops[_i].name); \ }) #define jwt_freemem(__ptr) ({ \ if (__ptr) { \ free(__ptr); \ __ptr = NULL; \ } \ }) static inline void jwt_freememp(char **mem) { jwt_freemem(*mem); } #define char_auto char __attribute__((cleanup(jwt_freememp))) __attribute__((unused)) static jwk_set_t *g_jwk_set; __attribute__((unused)) static const jwk_item_t *g_item; __attribute__((unused)) static struct { char *key; size_t key_len; } test_data; __attribute__((unused)) static void read_json(const char *key_file) { char *key_path; int ret; ret = asprintf(&key_path, KEYDIR "/%s", key_file); ck_assert_int_gt(ret, 0); g_jwk_set = jwks_create_fromfile(key_path); free(key_path); ck_assert_ptr_nonnull(g_jwk_set); ck_assert(!jwks_error(g_jwk_set)); /* Just to cover the code path */ jwks_error_clear(g_jwk_set); g_item = jwks_item_get(g_jwk_set, 0); ck_assert_ptr_nonnull(g_item); } __attribute__((unused)) static void read_jsonfp(const char *key_file) { FILE *fp = NULL; char *key_path; int ret; ret = asprintf(&key_path, KEYDIR "/%s", key_file); ck_assert_int_gt(ret, 0); fp = fopen(key_path, "r"); ck_assert_ptr_nonnull(fp); free(key_path); g_jwk_set = jwks_create_fromfp(fp); fclose(fp); ck_assert_ptr_nonnull(g_jwk_set); ck_assert(!jwks_error(g_jwk_set)); g_item = jwks_item_get(g_jwk_set, 0); ck_assert_ptr_nonnull(g_item); } __attribute__((unused)) static void read_key(const char *key_file) { FILE *fp = NULL; char *key_path; int ret = 0; /* This can cause cascading failures if CK_FORK=no */ ck_assert_ptr_null(g_jwk_set); ret = asprintf(&key_path, KEYDIR "/%s", key_file); ck_assert_int_gt(ret, 0); fp = fopen(key_path, "r"); free(key_path); ck_assert_ptr_nonnull(fp); ret = fseek(fp, 0, SEEK_END); ck_assert_int_eq(ret, 0); test_data.key_len = ftell(fp); test_data.key = malloc(test_data.key_len + 1); ck_assert_ptr_nonnull(test_data.key); rewind(fp); test_data.key_len = fread(test_data.key, 1, test_data.key_len, fp); ck_assert_int_ne(test_data.key_len, 0); test_data.key[test_data.key_len] = '\0'; ck_assert_int_eq(ferror(fp), 0); fclose(fp); } __attribute__((unused)) static void free_key(void) { jwks_free(g_jwk_set); g_jwk_set = NULL; g_item = NULL; test_data.key_len = 0; free(test_data.key); test_data.key = NULL; } __attribute__((unused)) static void __verify_jwk(const char *jwt_str, const jwk_item_t *item) { jwt_checker_auto_t *checker = NULL; jwt_alg_t alg = JWT_ALG_NONE; // jwks_item_alg(item); int ret; checker = jwt_checker_new(); ck_assert_ptr_nonnull(checker); ck_assert_int_eq(jwt_checker_error(checker), 0); ret = jwt_checker_setkey(checker, alg, item); ck_assert_int_eq(ret, 0); ret = jwt_checker_verify(checker, jwt_str); ck_assert_int_eq(ret, 0); } #endif /* JWT_TESTS_H */ libjwt-3.3.3/tests/keys/000077500000000000000000000000001517612317300151365ustar00rootroot00000000000000libjwt-3.3.3/tests/keys/bad_keys.json000066400000000000000000000056231517612317300176200ustar00rootroot00000000000000{ "keys": [ { "kid": "Missing k", "kty": "oct", "alg": "HS256" }, { "kid": "Empty k", "kty": "oct", "alg": "HS256", "k": "" }, { "kod": "Wrong type for k", "kty": "oct", "alg": "HS256", "k": 1 }, { "kid": "Wrong type in key_ops", "use": "sig", "key_ops": [ "verify", 1 ], "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "_bSTCXlDeU-pZZbOKDUVLAN===spSIeuKZfTM8rtXFG_RU" }, { "kid": "Invalid curve name", "use": "sig", "key_ops": [ "verify" ], "kty": "EC", "alg": "ES256", "crv": "BAD CURVE", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "_bSTCXlDeU-pZZbOKDUVLAN===spSIeuKZfTM8rtXFG_RU" }, { "kid": "Invalid ALG", "use": "sig", "key_ops": [ "verify" ], "kty": "EC", "alg": "ES256-ASAD", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "_bSTCXlDeU-pZZbOKDUVLAN===spSIeuKZfTM8rtXFG_RU" }, { "kid": "Invalid kty", "kty": "octSSS", "alg": "HS256", "k": "0gmNspkRljssLSrldySnYUS-zhtCo5sqeqo_yl7n2XA" }, { "kid": "Invalid type for kty", "kty": true, "alg": "HS256", "k": "0gmNspkRljssLSrldySnYUS-zhtCo5sqeqo_yl7n2XA" }, { "kid": "Invalid type for alg", "kty": "oct", "alg": 8384, "k": "0gmNspkRljssLSrldySnYUS-zhtCo5sqeqo_yl7n2XA" }, { "kid": "Mismatched x and y components", "use": "sig", "key_ops": [ "verify" ], "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "795Zo2s891l9E7Jb57g9CEvRVGk_LJ7Hy0ixzGcV8UE" }, { "kid": "EC key missing component", "use": "sig", "key_ops": [ "verify" ], "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM" }, { "kid": "Missing both components", "use": "sig", "key_ops": [ "verify", "sign" ], "kty": "OKP", "crv": "Ed25519", "alg": "EdDSA" }, { "kid": "EdDSA bad curve name", "use": "sig", "key_ops": [ "verify", "sign" ], "kty": "OKP", "crv": "Ed25519-BAD", "alg": "EdDSA", "x": "HUj-14kN6N4i5qNVkfEhwKiCf-tSrvRHstQdtV8a5QM", "d": "XY5oUZqGWVZhX7J09hG-rRnAKXiw1g_aBh-Bc52KZ_Y" }, { "kid": "EdDSA missing curve", "use": "sig", "key_ops": [ "verify", "sign" ], "kty": "OKP", "alg": "EdDSA", "x": "HUj-14kN6N4i5qNVkfEhwKiCf-tSrvRHstQdtV8a5QM", "d": "XY5oUZqGWVZhX7J09hG-rRnAKXiw1g_aBh-Bc52KZ_Y" } ] } libjwt-3.3.3/tests/keys/ec_key_prime256v1.json000066400000000000000000000005761517612317300212000ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "264265c2-4ef0-4751-adbd-9739550afe5b", "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "_bSTCXlDeU-pZZbOKDUVLANspSIeuKZfTM8rtXFG_RU", "d": "wDvSCv8kxkqIVTYPpgEm4Efs6lKzf-95W8Qej4F1yEM" } libjwt-3.3.3/tests/keys/ec_key_prime256v1_pub.json000066400000000000000000000004641517612317300220420ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify" ], "kid": "5b999b7c-2ba8-4654-ba82-1a56a1fdd377", "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "_bSTCXlDeU-pZZbOKDUVLANspSIeuKZfTM8rtXFG_RU" } libjwt-3.3.3/tests/keys/ec_key_secp256k1.json000066400000000000000000000006031517612317300207720ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "0e8d6d95-27e8-45b7-b2b1-f0ca95f378ef", "kty": "EC", "alg": "ES256K", "crv": "secp256k1", "x": "7xdE1j-vQLoWBnhP7Mn70yNhPDCO6pytCqMJTeJ7_90", "y": "795Zo2s891l9E7Jb57g9CEvRVGk_LJ7Hy0ixzGcV8UE", "d": "zTih0G_1ZdZupZhb7SgOyqsoe2dudSWNPtM4Vt2OYJk" } libjwt-3.3.3/tests/keys/ec_key_secp256k1_pub.json000066400000000000000000000004711517612317300216430ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify" ], "kid": "91976096-7044-4c28-963b-5b2026691e85", "kty": "EC", "alg": "ES256K", "crv": "secp256k1", "x": "7xdE1j-vQLoWBnhP7Mn70yNhPDCO6pytCqMJTeJ7_90", "y": "795Zo2s891l9E7Jb57g9CEvRVGk_LJ7Hy0ixzGcV8UE" } libjwt-3.3.3/tests/keys/ec_key_secp384r1.json000066400000000000000000000007211517612317300210040ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "591f06c3-66e7-492f-a243-1eb3b33087f7", "kty": "EC", "alg": "ES384", "crv": "P-384", "x": "omxC9ycc8AkXSwWQpu1kN5Fmgy_sD_KJqN3tlSZmUEZ3w3c6KYJfK97PMOSZQaUd", "y": "eydBoq_IOglQQOj8zLqubq5IpaaUiDQ50eJg79PvXuLiVUH98cBL_o8sDVB_sGzz", "d": "XiwoGqY2Zr02rTB2mF9wNNvtGLN06_JHWvhPQxZ5gkogjhIoOdfX09d3nXlPGHQ7" } ] } libjwt-3.3.3/tests/keys/ec_key_secp384r1_pub.json000066400000000000000000000005621517612317300216550ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify" ], "kid": "7da8d800-65ae-458f-af82-f692c478605f", "kty": "EC", "alg": "ES384", "crv": "P-384", "x": "omxC9ycc8AkXSwWQpu1kN5Fmgy_sD_KJqN3tlSZmUEZ3w3c6KYJfK97PMOSZQaUd", "y": "eydBoq_IOglQQOj8zLqubq5IpaaUiDQ50eJg79PvXuLiVUH98cBL_o8sDVB_sGzz" } ] } libjwt-3.3.3/tests/keys/ec_key_secp521r1.json000066400000000000000000000010261517612317300207740ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "6fd54644-c491-4800-9676-cd823ef5aefc", "kty": "EC", "alg": "ES512", "crv": "P-521", "x": "_axE26pXWXesAjcTP_2Tfe4EcF4A3LuqgpIFzrftiztViq0-5deUvfcxuPIFk-ANVinlAOzgZWpFS0kheI7KJAY", "y": "3fOHn5ZTU08AAjau0CoZe9GSPUC4cnSy1nqetiKBW0YpBvhaY5FXnngvfHUHdmkFSVLCS6N-LXoi_dm0Fbo6snE", "d": "p6rxb2PoAISjCCTxpTQOxv5arJ_N6Xibr0eyOAnlWcVk34m1W5323_6TcPGTtFQgEX9TWjNcp9W8HIuIyRdLnsI" } ] } libjwt-3.3.3/tests/keys/ec_key_secp521r1_pub.json000066400000000000000000000006401517612317300216430ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify" ], "kid": "84b6e8b5-fa05-4669-bf38-0f78f5d1cc10", "kty": "EC", "alg": "ES512", "crv": "P-521", "x": "_axE26pXWXesAjcTP_2Tfe4EcF4A3LuqgpIFzrftiztViq0-5deUvfcxuPIFk-ANVinlAOzgZWpFS0kheI7KJAY", "y": "3fOHn5ZTU08AAjau0CoZe9GSPUC4cnSy1nqetiKBW0YpBvhaY5FXnngvfHUHdmkFSVLCS6N-LXoi_dm0Fbo6snE" } ] } libjwt-3.3.3/tests/keys/eddsa_key_ed25519.json000066400000000000000000000005051517612317300210370ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "7dc4a07e-51b6-47dd-ae8c-2da0ef921818", "kty": "OKP", "crv": "Ed25519", "x": "HUj-14kN6N4i5qNVkfEhwKiCf-tSrvRHstQdtV8a5QM", "d": "XY5oUZqGWVZhX7J09hG-rRnAKXiw1g_aBh-Bc52KZ_Y" } ] } libjwt-3.3.3/tests/keys/eddsa_key_ed25519_fake_es256.json000066400000000000000000000005051517612317300227510ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "7dc4a07e-51b6-47dd-ae8c-2da0ef921818", "kty": "OKP", "crv": "Ed25519", "x": "HUj-14kN6N4i5qNVkfEhwKiCf-tSrvRHstQdtV8a5QM", "d": "XY5oUZqGWVZhX7J09hG-rRnAKXiw1g_aBh-Bc52KZ_Y" } ] } libjwt-3.3.3/tests/keys/eddsa_key_ed25519_pub.json000066400000000000000000000003731517612317300217100ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify" ], "kid": "bf160513-a400-4bc9-ba52-bc90c5e55f60", "kty": "OKP", "crv": "Ed25519", "x": "HUj-14kN6N4i5qNVkfEhwKiCf-tSrvRHstQdtV8a5QM" } ] } libjwt-3.3.3/tests/keys/eddsa_key_ed25519_pub_fake_es256.json000066400000000000000000000003731517612317300236220ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify" ], "kid": "bf160513-a400-4bc9-ba52-bc90c5e55f60", "kty": "OKP", "crv": "Ed25519", "x": "HUj-14kN6N4i5qNVkfEhwKiCf-tSrvRHstQdtV8a5QM" } ] } libjwt-3.3.3/tests/keys/eddsa_key_ed448.json000066400000000000000000000004321517612317300206700ustar00rootroot00000000000000{ "keys": [ { "key_ops": [ "sign" ], "kid": "9f3c8176-d381-4dc5-a868-8b07d70c0124", "kty": "OKP", "crv": "Ed448", "alg": "EdDSA", "d": "nsYcSyibFeqtBBmVUh3S_xGTNQJr0IGwVmU6gTd8Xn-gtb-PxxzPhJnUXZ_UdkPRsz2SY0d8On-t" } ] } libjwt-3.3.3/tests/keys/eddsa_key_ed448_pub.json000066400000000000000000000003571517612317300215440ustar00rootroot00000000000000 { "use": "sig", "kid": "dadc0d66-e2ea-4d58-a2ea-3595d29bb604", "kty": "OKP", "crv": "Ed448", "alg": "EdDSA", "x": "J5dXafOvQWBrUabIHVqTbiDU4Jq7RtozL5jopRdiUGp-rs0Kz-f0-2r7scLjclKO9q8r3m9_YGAA" } libjwt-3.3.3/tests/keys/jwks_keyring.json000066400000000000000000000617401517612317300205470ustar00rootroot00000000000000{ "keys": [ { "key_ops": [ "sign" ], "kid": "ee30e68c-a5e9-4067-864e-cf7dc9ffd2c1", "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "_bSTCXlDeU-pZZbOKDUVLANspSIeuKZfTM8rtXFG_RU", "d": "wDvSCv8kxkqIVTYPpgEm4Efs6lKzf-95W8Qej4F1yEM" }, { "use": "sig", "kid": "308e712a-2366-41f0-a236-b410736b4dc7", "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "_bSTCXlDeU-pZZbOKDUVLANspSIeuKZfTM8rtXFG_RU" }, { "key_ops": [ "sign" ], "kid": "354912a0-b90a-435e-886a-1629f7b2665e", "kty": "EC", "alg": "ES256K", "crv": "secp256k1", "x": "7xdE1j-vQLoWBnhP7Mn70yNhPDCO6pytCqMJTeJ7_90", "y": "795Zo2s891l9E7Jb57g9CEvRVGk_LJ7Hy0ixzGcV8UE", "d": "zTih0G_1ZdZupZhb7SgOyqsoe2dudSWNPtM4Vt2OYJk" }, { "use": "sig", "kid": "863e696b-80fe-44b3-8e5b-87a3bdd72447", "kty": "EC", "alg": "ES256K", "crv": "secp256k1", "x": "7xdE1j-vQLoWBnhP7Mn70yNhPDCO6pytCqMJTeJ7_90", "y": "795Zo2s891l9E7Jb57g9CEvRVGk_LJ7Hy0ixzGcV8UE" }, { "key_ops": [ "sign" ], "kid": "cf9d2031-eb21-494f-9272-2c74b574f3ab", "kty": "EC", "alg": "ES384", "crv": "P-384", "x": "omxC9ycc8AkXSwWQpu1kN5Fmgy_sD_KJqN3tlSZmUEZ3w3c6KYJfK97PMOSZQaUd", "y": "eydBoq_IOglQQOj8zLqubq5IpaaUiDQ50eJg79PvXuLiVUH98cBL_o8sDVB_sGzz", "d": "XiwoGqY2Zr02rTB2mF9wNNvtGLN06_JHWvhPQxZ5gkogjhIoOdfX09d3nXlPGHQ7" }, { "use": "sig", "kid": "7d9e8a8d-3fa0-4ae5-83e3-6044b8aa05bb", "kty": "EC", "alg": "ES384", "crv": "P-384", "x": "omxC9ycc8AkXSwWQpu1kN5Fmgy_sD_KJqN3tlSZmUEZ3w3c6KYJfK97PMOSZQaUd", "y": "eydBoq_IOglQQOj8zLqubq5IpaaUiDQ50eJg79PvXuLiVUH98cBL_o8sDVB_sGzz" }, { "key_ops": [ "sign" ], "kid": "77ca2a99-ae2c-4032-9ca9-dae0300dee67", "kty": "EC", "alg": "ES512", "crv": "P-521", "x": "_axE26pXWXesAjcTP_2Tfe4EcF4A3LuqgpIFzrftiztViq0-5deUvfcxuPIFk-ANVinlAOzgZWpFS0kheI7KJAY", "y": "3fOHn5ZTU08AAjau0CoZe9GSPUC4cnSy1nqetiKBW0YpBvhaY5FXnngvfHUHdmkFSVLCS6N-LXoi_dm0Fbo6snE", "d": "p6rxb2PoAISjCCTxpTQOxv5arJ_N6Xibr0eyOAnlWcVk34m1W5323_6TcPGTtFQgEX9TWjNcp9W8HIuIyRdLnsI" }, { "use": "sig", "kid": "6daea4ce-3c0a-44b5-880f-a3ed5e31d178", "kty": "EC", "alg": "ES512", "crv": "P-521", "x": "_axE26pXWXesAjcTP_2Tfe4EcF4A3LuqgpIFzrftiztViq0-5deUvfcxuPIFk-ANVinlAOzgZWpFS0kheI7KJAY", "y": "3fOHn5ZTU08AAjau0CoZe9GSPUC4cnSy1nqetiKBW0YpBvhaY5FXnngvfHUHdmkFSVLCS6N-LXoi_dm0Fbo6snE" }, { "key_ops": [ "sign" ], "kid": "487ce5ea-f077-4db8-8002-1ef2ad8dff85", "kty": "OKP", "crv": "Ed25519", "alg": "EdDSA", "d": "XY5oUZqGWVZhX7J09hG-rRnAKXiw1g_aBh-Bc52KZ_Y" }, { "use": "sig", "kid": "afdb09c9-29fe-48cd-b2d7-a026bc7835ee", "kty": "OKP", "crv": "Ed25519", "alg": "EdDSA", "x": "HUj-14kN6N4i5qNVkfEhwKiCf-tSrvRHstQdtV8a5QM" }, { "key_ops": [ "sign" ], "kid": "4dc10a5f-be67-4368-99fa-2570a8b3cdca", "kty": "OKP", "crv": "Ed448", "alg": "EdDSA", "d": "nsYcSyibFeqtBBmVUh3S_xGTNQJr0IGwVmU6gTd8Xn-gtb-PxxzPhJnUXZ_UdkPRsz2SY0d8On-t" }, { "use": "sig", "kid": "48a53109-9823-47b7-af08-1de48ef04cd3", "kty": "OKP", "crv": "Ed448", "alg": "EdDSA", "x": "J5dXafOvQWBrUabIHVqTbiDU4Jq7RtozL5jopRdiUGp-rs0Kz-f0-2r7scLjclKO9q8r3m9_YGAA" }, { "key_ops": [ "sign" ], "kid": "1971c0aa-4369-435f-aaf3-d4ca34a23ddb", "kty": "RSA", "alg": "RS256", "n": "wtpMAM4l1H995oqlqdMhuqNuffp4-4aUCwuFE9B5s9MJr63gyf8jW0oDr7Mb1Xb8y9iGkWfhouZqNJbMFry-iBs-z2TtJF06vbHQZzajDsdux3XVfXv9v6dDIImyU24MsGNkpNt0GISaaiqv51NMZQX0miOXXWdkQvWTZFXhmsFCmJLE67oQFSar4hzfAaCulaMD-b3Mcsjlh0yvSq7g6swiIasEU3qNLKaJAZEzfywroVYr3BwM1IiVbQeKgIkyPS_85M4Y6Ss_T-OWi1OeK49NdYBvFP-hNVEoeZzJz5K_nd6C35IX0t2bN5CVXchUFmaUMYk2iPdhXdsC720tBw", "e": "AQAB", "d": "D8dTnkETSSjlzhRuI9loAtAXM3Zj86JLPLW7GgaoxEoTn7lJ2bGicFMHB2ROnbOb9vnas82gtOtJsGaBslmoaCckp_C5T1eJWTEb-i-vdpPpwZcmKZovyyRFSE4-NYlU17fEv6DRvuaGBpDcW7QgHJIl45F8QWEM-msee2KE-V4Gz_9vAQ-sOlvsb4mJP1tJIBx9Lb5loVREwCRy2Ha9tnWdDNar8EYkOn8si4snPT-E3ZCy8mlcZyUkZeiS_HdtydxZfoiwrSRYamd1diQpPhWCeRteQ802a7ds0Y2YzgfFUaYjNuRQm7zA__hwbXS7ELPyNMU15N00bajlG0tUOQ", "p": "5y8tNZdtDp3lugNnCAyA8mIcuTu7rpbGhLSUXlJXIxAzJIp_G--u6tlWR2__92R_oqZ0WAclFMmFIXTrNg2ERhngHm5x_MKU0-BQmMVLCFKQ3we0cH3QTjYGinsEyc_xT7MMtWHtG-R9nOr1YpthWd9x0HKGd8LxRashlZzM6Ts", "q": "18S_ecqMVBimvLzM3BNwp9NbM4dHRatLKnBaTPh1i1a_OAiLbhvR-i9CmkrRBCDoibMTlaXF3xRYbCbzhoTAOA0E8B-Frl5l6dT6FTA5VeuT2Kr4c8C-PkIb2Ttm7KxLpyE1zplOwiOpIpZwDdy7j-B26mYKF_ZajyN9VWMy7qU", "dp": "YRhyT3DSz_HHG1H0gu_ldGd6kt2gnNocdH33VooUqNhT8oPskMog1-gCEazbf4cJCEIK2THfBBUDQiL96szQgjS56W4Pl84NfdNXZmJuegdbayCsSxa8VyzfoGe8ghpAym1z5_ZCBJX5n98awphp0bpD7f07tq78cHtIdrLNaSM", "dq": "yC0XOyWn1Old32IFaPN8I6cZSI_rln4ZaRD9JcWoP5JGKvT6bjfPMZ2g28Ynbf4d3opN1BsMnS6h7gyhB56nOhkSCLgl7KRVRn-5V-j6eHTrICtV_wXFObtZXMsYbOBX-4D7C2X9xG0TICyTXrj3Jb8oc8Qg_yQl1gAl6g7zFKU", "qi": "ERMrkFR7KGYZG1eFNRdVmJMq-Ibxyw8ks_CbiI-n3yUyk1U8962ol2Q0T4qjBmb26L5rrhNQhneM4e8mo9FXLlQapYkPvkdrqW0Bp72A_UNAvcGTmN7z5OCJGMUutx2hmEAlrYmpLKS8pM_p9zpKtEOtzsP5GMDYVlEp1jYSjzQ" }, { "key_ops": [ "sign" ], "kid": "318ca000-36ca-4b0f-8d18-0ac315d2b271", "kty": "RSA", "alg": "RS384", "n": "ybi_3guc70NLoGecAdyAo0dJYLRXCYFdx7Iaq20REXb5SsyqSjGV_KEr8sdyFhr_PasKb1XbV7G8_gdtxU-Sl5dGI9h8mymIQ7VzbyEhwQqjzdyCKoz2levKPgjsTDN93IQiNfSOfc4qUux5viWQaPWt3bzpvOZXHcMUbzEz_jahKZPU_hMq_N3DroE6xFYB91fb74qHOC5RGMPjskUYKOjCtj-v-sZqznuckf2x0a2r5X--gsqGZT8dHaX9smyrpBbV9Y_g1VZ-CO8XFdRiHWth98FnlbEeHsrXbho9CE2GEACWvRRApMn1uSpghpENbkefpbYCIN7tq6X4lKvSYQZARiLkD1ELHcmWCX-cpIlfxihrKpVnRR4iLJNl33VtOBIPaMvtifojkLxsi3dtyJkcEFQI_kXbKW8Kdw5Fd-UOcsQf8PKk7k9LgFaH8GZRFhbwT0bLjjy0UIV5NDHcSozydV2uQh-ON6BsygCSvME8V4lu9z74Rq3T7eP25pC-Q0mN-1n7QGQL4zKshkKNh6Rx-QCP0hVGNosL6MoLzseluapTqnHrQEHTbG1Jm-WL_ces3thH7PySyWKJcUQ_iWBD0FFkya0KTvTfWvBg_WPdqBHLIQh6ie_7lOFyE56FbRYuRU0cF8-NykA_6HN247pFtw1PSgQ68Dqtv9bZMFU", "e": "AQAB", "d": "IwY78h7MEdL6Z5B1yvDxOOhgujS1xAW9NbYb4VXfl8uzfyRIEPfJFgMZ8V5l1aa8WIXBGxGqMvC-YtEBYzfsuPtgB0tIX1x3t2Hi-BGlnbHuPQkjZKXzDpbRF7JO7PAn00jx87JRp1BLkvhSLwywpTi7BnwNjWnlCFrdymydnW74zpJHchH77cnHdx4jCQHx93M-0bmYvs1z8TvZ5hMPHdNEM4adVIps8wsNZV_KJyDjbsaeWnE1opCxynsOsJMjvirk3W0s2X3aBk0VEgo9OuRxLyZaiOgm1avcedZ-cFmdhFvF0HCaxMH4Mz1DYzn-Pf6bnpcaiYCLfbkkjxPCRB1bUjsCsQsRs33os8VBvfKePK_B_Y5bDsJTh_vfJiVflqgckdr2R_RDQ50BLL-Ep44oAjt3wh9X85ccAQXoVKbfSwLADh2LsZFV_gsiVLWjGavvV43zfRzwubVsH_2w2H7gfXO3JoXHuNX3O-5W3hfrMxFQ7Ozjb3rcq28rkajTloG7fBVSlNmQc33cfvvKCLddN-eL6xK4k_xqd92DC-DEfqQgTKsVszDlmViRMOMX2Ebnnve5xsuAyhddFdRamrrrZ2gWO-WvTR5NMo91viluqWxbDWWqAnzpvY2XpAeWvcyNux57UIqWsbuJ6RDBjAyVsbvFRIzBxNbKfEzR5uE", "p": "8FFVC2zHBS8-o3i8niu3NY5ncJtmkT-5hpag567rWfP5Vzrvuih0BAW4t0gHCQCcS8ur_pQ7m72Cf8FA60a8S2djetTq8xbf1jQ0aSuqmJtRBH1DT2qKZT6OHY9EOhKZpOQzFPk_rscHHVH9q8PDvHVaz85dwRbb1D8EqRDDcvbqpyWwwMWkgndx0I6qV9GTcK6HzCtJIZHQsTl1k2IEdheawhZrXYlPEI1YQbR44lxxeBVH-P-1dEhiEnQQwj9dzlfPseqY5kf81ST4YZZPosZeQ4FyOu_IxsJqBmO27puOkmYXfbbhTMkSJSdeS7BatqQnbUBi10rpZCP2vDbV2Q", "q": "1uKlFl2FfsEQfq7d7GiNqNrEYnxK52lH19Yvgvfy27LtnDppBESr5ULPZcCFZ9kdY-8UxYoNZjGnZ-HVBEFhbOI1X606eLsvI4rnM-HG33cEYSVIuceUfc-OHkKuWLvOS2fE98ULgjVNItYAvN1FfiUpkt05ojp_4OPZMWHmdDV24u4_BDzqr9p6A-tmhKPHtyxdaX2yIXM6nFNx4vlmhgLZ-62xprLWVuT5SCo30PonKtsbgpkJ_bE_x_gacMH8J-NEGstt_oDsvHvvT3RGJiGveNTQPZ2mKmkZaZ5x8TTpk7LEw56PCn21pftBuH0bg_aMvC4fWfh47uVTgJa03Q", "dp": "FjmfYOAdg9g7tcibwREP748M9_gXQ0WeddkGZobh0z7iB3Q26YOGPzz8OU8a_3Uj_0qFzJSO8rdTE1efFmNDVMHqDFkWpYavCtNnKXbVXym2E3E2QWj8BaMEZ61xROGlff9wzfbDMfnMKaUEjdccChjcXi2atBnWGMn_N1eKi95UE0NEFn_w1_QN_ZjEHj0OorQxcOtr5wPiRhGnUwsUmItUT7DdGxhwzHoV-HWlXGHqSI3HSzry4B81mrlLN3u-xC-Q0MZ-f4WW12uE4RmSod4wp5OYKeU1L1SZk5-zMlwGknmIoKLCMWTDHdaHPP7BVPTXhJ4YxgpyjUVaM0vq-Q", "dq": "NOGRvu9E6uyYIpTmCEeylNtBePsdc9V02KjdCF38ZhSiZM_7CBHeO401fNTj_6pukSlE81gF9CBEEkyBH4r3btQ8Tk9TFGL8NsL4IsxtJJElgsKqIw36fPuW_dtrDGsrWWMwFcloC6MSWIBRrijF8UUz9fB7PnEnBzELQhvVmsONfksjNufG2X_qhwxnLj0f6PQCCPPl4lV5Fv9yB2lY0aHiAw27qkpYdQnkTt4U3lixStqg6oK-8q-sAooL97PFWguTtwRZDUis-bWGLwduO_QOOq4kkQU63zT-C__yCmn7EV3tDjb2_J3zFeW_RqeDHfaOq8Ct9nYvTJsi8YIl", "qi": "z-UlWCzIiVTW6D8OZ4ZlCa2HQlB2SBWyTu_EzrvfL_SzIvEzdaT_UFvJJD-VwhyQU3jeQBnN71sc49i2Iu--pvcRmkryKXXfctqDN13Oxe8qIzzG70YSUZNJxoag2bJWTm8vyzpwod7EHQJ7TLVGLbcrLANjpFSCpyVjJWnIFFlisCbgTbi-hGtYg65xhvTKM54wlXimYTObx434-q3pBzrRmX6LO-UMhryoyruSwVVyQHRFHfiKqRrzLQCErhXXNm9D1kQ2U7a5SP9ZH78Lg1ZZFi1-wphTzhe5LLci5R_BoEcfJyGbKdrV6eKd-Jy0Ie9NleUNZiWnlR_wgNet3g" }, { "key_ops": [ "sign" ], "kid": "f9c70e1e-a1da-4cec-a5db-6cf84a4abc9d", "kty": "RSA", "alg": "RS512", "n": "s0XMckvY06KW80N_Fz5rBJUN3BlsUoViZYjpZy5UbhNAt96tdnoMMXJw6vd9-_DWwBEgpq7cRUsWq1qRkqSLz8dxTQ8OGsxauFVTWRTX3ZMQ_YtZJDGa1-snkxhsLxnvpXx_KPgYU1WTqB46GV-itwsZ69S0nq-cNMjIFiz6TJMNVNwI5yEdYUildxb0YmGu_ZBQMihcrYesAJSQezNu10YvioSIQUASHjfVcFMMLtZRYvi7idIfejb7iW2rPlO7sF4ZNhTaSoszB03BvnNZjikORBnDz71AgMKqW_Itlq_uMuMb0XlPCiLZgS83oLfSvMQQspeOks3yv5w3Hv-sEFXrSZyyt3SPxHuc3gggSqLcfzCV4PG_p2H7y5Q6i9VHPaA89ZQXlKWQC46sripPOtkSAkyJU9NJ_WkYNnnXzQiKA3kfN2mLCOzpv62SGoUrEssycTuVLUKTzM76LaYQ_lGbpbSrTGvZEmm3OJjjFr5r2JSPmzGw-5dOUpJ-i3r9-um-iUKKpOkTISYyCXY17w9yf13W4Gms7l5XJU-pRIlBlb3H2QFN2u9wp7mEXYOJzGNGpA3oHFKUmn40jlz509dNpGaG4SXzJG8Uku-mWrjWWsnh9VcZQhgLKVobJsmmSIkqcpJCityl21LAk7DoUB0GeMCFOjzPhZ0ncD7RVBwq762A6rcowuuY8Lwbrp9auNgzzhHHr-c01aFvqZbUT4oaxSFInyrocsyCqJYQEG3sDK6NMxNIPs9NIyC-IWPbqvxESOGJK6rLmh2WCaD0irCvboW5yxfxEaCuu3WWUFFEecR0KvHRQig_dFb2Jyo4fypzqdSRtAu0R7_qOn6pLsEO9XseQh7uRzdagwb9CjdBB8nKB5zVQ79gswBDY2-gDl1UphywtT-ISr4kLUm3tvOFQZjj1SNaZdLTDQbxO9GWjwaijIQbAdMU0f9kE7FHIR3vPEMLfwNgpo6hEyukTBfBTT1cq8eHQt0WbDLDYFcuA1fFa9XGrZPmmGCoV8AFKQaUNRcIbfRWnykPs9oJKi60gKbhoIStIq_DkV_B8OPTMRTbFranSJDaO2P6O0A5Y7Rezhjnqyb0oiJsKg74-_TcgL_tZB-YB3AG3gdElVnu9cWuR2FpY35L1WAk9zA46Z4dxQyL7nNpQDg5pX4Q8sXK2x3Ov1VmYy1TmUxpv1eLTMxts0yXYDQFGcDS4VuDfZZNkIXMOMEo4y5fQw11OOcElpvyVMUkYl0LgJvIqbUCzCulkrruKKPPdHrtJvhImysgT46lbjKPGDT4D_6qIt4UqV9B969PNbqfqFORnmgaH3oF3xxbAQfcasfUxCPxChYpOPs25ldtAASAAqDORw", "e": "AQAB", "d": "azXNy3iyhfZRIc_2vFbWt1nQfRUzI7KjIqebNdqOIXogFRX1VMouao_PGaXC0R25wAk-JpCiKEp8lyNFtZX0CuFyT6w2Oi6F_oEApGCDq_3chlSEjdGgkYoPE7fiUtTG7YejoEOmgIfIEx1oj24TKDZaXR_KmK_a0fJVPnXNhmfW7C3eoSK7qEdCtRKkOgXDGd7pJuXebuSZJ4uxUAx1OAbAPa1-ss73Rt0LJu5zdbsz1uV7ejOQIY2qJgjRBSgcMaBEoYQc-8F9VdvZhuUC5LKG1pE1-hFq9tXz_aK6QsiZwhLxuvc6Hoyy2L_9G39zZvI2LifW2tKRXqe0izRJmUdYu6AbfP0XUWC_ckUX0qrNBL9wkqLgg-BkLd5KmP-GaENg0VisNXhBybeca1fgJAhW7csJwXi1Yfgsw79gID0AFI2l7oSO4lqUe834dyW2mbmtQ-xnDTconq4VDaGnvf_d_l4qpzxEB-_y48UC4cIlStOlgiFYf02ASH9VcGKwaxLIoNuLgI3mo8ds2x23qWzqg2MCMxjfk3oV0blvOA6Bi2SAlLVj8w-IprWahDY6_WFNiKTMb8uvFSluksjlmxvCUhQCi7kfTGWlvy3UpaKuhoL_P7LD5zPr0OITJMIpUG2_Vd9ELjlAcwZtJqYAeJCzIxm3Uxm03WobgNQAabShrQCpUF-sZEqOPfQIa4bpRk-IzboCzdBBuQw9S8H1-yI_R718EvbmS3QhKAG6C6BRbafo-SLTfMGKARMACqq68w2FNYLblodBYGOdSf7LeSc8g6uA9UPncMfg06HOmkw_lIaOVseJG006u9LsUE6obCzNKGy5vtz0gCawbuc-S5ZaR3tE18Nu3ukNtZVv-L-UThAlVn_QDm4uMUmNy6Uxn7rta98auPE18InaVKJEDAFJ_pljX_XI6M0Nnz-lJfrlYTqPWjQtazaoohJt-OaVeK8MLOzRfu1FLllv8w2I1VXZR2rEW0UiwOC7-q5PgZE2qo7pHFnG_XfnP64vxa3I4Bv-a6zAbga1fgBbvTooRgqf6EExklZyfipMCtpnbG4cGht__zwUOvhUn6POHCgGO3OYhXjr8ArUhg2oQwGyUkGlzQGLGeopocFCbDMb7i-kGMhuigwKLjBMUF6U3TdC532wse0DPyDHBCLyxD4dPiPvFspgcNaw7x6sVWB9vN2JxXUJVGtnIrHAZQ2evGDtIeJnyFhmQ3Fa8RF-519xHYyX6Vu1KGEI1yT-ALSkUvYycUip4zyT70-GdknExutxIWtEMVpfXzxIJVt9S6gm8pUZ73OHVByUV92FgQCWPXnkjVPRBU_nnmav05YqCikvPx5SOVV_r64h5eNklhelmQ", "p": "586CvRRJQLPsOzFOjH6k0aCQOdvi5MwuLkdaBnAKOZRGiXtVFV_QwnXELmIiDCcPCLXagZ5R9XKwQp8HnzgvbGii2EjOFZ0GQC9FtOXX-E5vpFrg8eYRrjCAHB2yZ-B_1QrLOYbJhZZfaSZ58WC0jrrJqa1zvauBjy2EdtWykIbCV29UWdzIm0kH3Tgi0f3chgt7voOMHJ87jknE4jGLYbRM4Gje92Gi3WWymTSwN3ZuqWZvWdjPTuz2dk2T6sGusyN4cXTjmRy8yDMgxifJkhyxshW1ZHIK_6RacDi0w562rhz9kRRvbwtK9copeNaudQpvUJL-aPtVWc4fKNNatpaFhhsHo1jTOdMvx2Mn7AxDreUiTuUO2gDEJu7_LR7MhSdaXBVUUQVFNZXwHm0tVM1OH7rylU-OBNUOjb14zaClRtZ_97GoQIgRXQRqJ4K6nXFwGXycyYc4bZt2-tS4HVjUPViT4hZr4JXKeUSfY_rzE3i9QjLhguKaRXJexh8TxGMKg1DxMUv8kEYS4Dt5V1ZHQnGwN_lRR91B8OoreelOQTX4YIfi7ZWBaeNqBK4YRTQ5k2pHIi3THpFKhyQQGXXuAcwUcxhdOOWoVmlM37Qmfty_P-Jac8z7Gos4aXDRS0NXfkLLCFGWzhoQZ0jh_p34xiF3cO0J94Wu_xHJPsM", "q": "xfuqeOX2Q_KoDxhlQUd7_yYVhIJs9fn-59W3nkNLAD3CxxqKsbZ8RMo7bF67ibTM72JKE6_MTJ1OzZIMy2XW1Id_iHjcd1suDV6R88wOZTvqk-ew87RsIf5z7WQ--FpcuEBQ8E0GOFTdK5owfm9EYEkikKsDO7i0IqcA_npBmgnvTYIAC29tT9lQaX2VXXqZyATQFWNBVWqzWyuejRZO1Xpi7gnihE7PwojsF9u-rpSFoSs2lvSbUFvkgTF1s2OHjcSi38Xv5aig4pKH2TOnLwrOuCuYjSQJFHpuJuH3WhjrpIMkybCw1CLhqMqs1SY_SqVAdGhfDhDU632R5r8MJqubSi7qPCE2VLKXnU82tkyA3XpIlHWwCyh5HW1KZB1BWK7yJxiO8itpYOLFJfKL3zpz4onlAFGjUYzHEO4ZVqFJOOjVyPU-z-yqr4lGociTCW3wng66OXDPGPL2mv-iZnDj2IXUYa4LAgAolkynnbpOQBihXMLAIQu_5kZ1VF-mjY0Sov0nx-_8T34Ulu9u-zFMguOGSS3ZdMaWrO3Uxxvn-JebOZ7pZ3RLbaLYwb67kWV5TcLaoB6c5Tv-XViBJsx7ewnpJAN--kIs_Sdky_ZwzazRmvmay9-qpFoNsyyGBxjaFWAguHEgX7gU_BnJ9_WUMqk1Nysby0Qf91N7wi0", "dp": "XpSQG33Pdarz1CMGHaT-stmEf1cMeLYmkZNjVAUa5uts7GN6D8KMdwt-BD7eDX9STweEJCbo4fDtogEpJvnRv7Xh28W48HClQEMJegnd2N6IBtNdvNVWmXAIlXA4ftHG1rIUwWARkYQNYeXlE2uVwDbOWYEAHH-B2V2FEseWmAmj-fDexdujrlhZ8RUaf_vIopjE4LLj1DnUHvZScsgsSq06QMYJU35u6U65VHF_BOI5vLyi6lHgJB_jX9m_ZKWqFkV-uywqQSrMjBLwaGmLgSZcCoF5BYbSngP9MpSwjLCRcPE7NJrV7MT6zNaznS5a-D5NtN6FF2iVJpNHe2zhMmawDEuzDh8L8CgO8peujk1iv-0h1nb3XFO7tPcG_u32HM41vCSnxncUCg0ncAKz4En0elXY7LsNA0O7MHICfEPzq7eRdwrxz4K1MvK-LWjVo6_JQVzqy_90MqSgIy_v_2ljD7S4giML2RLFDj3FmxGlZGh7MCt6f-DdeUB1EvlTI2oVvAamoqqSXnt48CzUEaKOaLniYLRFScEpSpcBLjjXSRwwP5KyMKYzq3SyqT4vgO0SIOfYJkX0QiCd_A3m07yeY_VU0rE6OCDcUoWcbBohKtn-3p4Isf8M5YOwfLUfcEoFxOqT1M0VbvqLftjp_O2Pt6eoCFdvHaNaB5DGP-k", "dq": "wSicVX_nGLvyg2fFwj7AF1tMuw-Uxxe1PvMgRmRZFE8tbZvTnTbxXxv_heeXCO9A0n0O0M4_gLApZh8MJJWjV48rOjbQwhJPh_Owai-4C8S9RLhTyDFLHo9nA0E-vodK1ujJDunXG7aQYi35CiH8kARKmOKAMRAvj29oZN9aibMPqosfCAkamUDoV0OTKrSmvKMVcQh5gaCshFK2Seht2ZGiW6OBQJyzzpRP46cdDq8RAQFsLTNRJMHC2tkqgG6mngYu8ivntiUjcmqL57mhbyAYN08xcuKpiTU5qu3jqh-OJ99bUPv2ScIOb-PtY7gBIA7CJ9B8jPiXA3prkrjqXgAnbeT_2tJ8c34atfvG4W0afPsFPPLlYr2GDNPINIzmaGOnFcW8EUGRellFB5TwKkaZMXhf2EPOF45F2ZqzVfXdvoxLp9i-A5ZfoQtJwiYyboy4qTytK8WICEtjli26gD-7zFAluXdYfgcxkhIPpq9SEO72382SLauM-lnbtwnrMUdl22cqHMNjYxsbc3b-zEx43WqmZVc6RdhKwUT4x5nOZJdldn44MhsgTEMJP12bGmvqQZfOPVIguPYjYWcr-nKeNpigweY3SGqwAf0hNm2l-MSXa6ADCs2ZaugBXcIesWXpv9kdk1WrxDeRIbT3e9g5UoQLy1tfrp00otTsdbE", "qi": "g9n-wQtZ60IWCxAuc4uHUofpCQoIeGrZ9xLnH0tmFRJnJ5ufNxzHj5oWwKSxpm90bDMnWutfirGHh5RQ7y44IbYUV2Pbhz7-gwSjNlhLec37PCWuVyUmkHLma07N2ZspUOT21_uJ4WD1XazuP-gA4sGiVcLs73q21mUqVgXR-s-bCM0tG1ZrwgoYsKg5Dek34HsdlzYpWYMsqXgKmwJ691ZXlRR_HOLOKsfNfoprW9QQ2kVGfXO_0lKK5p9f7CceOPguLqHn0zk7CB09OVjCv6eTUL8UzswQMo67nO210Q7JKuXAWxGYApQB4HubNe5Ic-pdiHz8IwbmfcTYyOGs4RtQZY3qzB8z9p66y62rzasPnUXSYs3w4nrKtfphC8b5voJB-QDJGe1yWqL95dHYJxdGHa4Kcjc8jQtOCty8pItvGdrVkmuzr0P5LziY1jJz_sPj5b4l2jJB56g1UnKzBmaxgPIQrIdqlDiuEBOerdYKVLiq7np2JC5rKfoYQhdTCj12Nwm8cpOP3jymz1XYEUqYc46oggBPor09edLwhOqr-30Bv8QCAsvwaBYG0Ru2P5l5mgCOmf--dW50xYg-MPHJr9WK38x65kAi-vG9yHeoS--bm26CbVkSGrwKPZI34Fku6i_FUayWEtoiU3WKndSOrpIVOqOQTQU54puQoOE" }, { "use": "sig", "kid": "e763fcd7-e0a8-435e-87f9-01bc4a46c596", "kty": "RSA", "alg": "RS256", "n": "wtpMAM4l1H995oqlqdMhuqNuffp4-4aUCwuFE9B5s9MJr63gyf8jW0oDr7Mb1Xb8y9iGkWfhouZqNJbMFry-iBs-z2TtJF06vbHQZzajDsdux3XVfXv9v6dDIImyU24MsGNkpNt0GISaaiqv51NMZQX0miOXXWdkQvWTZFXhmsFCmJLE67oQFSar4hzfAaCulaMD-b3Mcsjlh0yvSq7g6swiIasEU3qNLKaJAZEzfywroVYr3BwM1IiVbQeKgIkyPS_85M4Y6Ss_T-OWi1OeK49NdYBvFP-hNVEoeZzJz5K_nd6C35IX0t2bN5CVXchUFmaUMYk2iPdhXdsC720tBw", "e": "AQAB" }, { "use": "sig", "kid": "9debb1f4-7cc8-4700-bb93-6aff4539cc2b", "kty": "RSA", "alg": "RS384", "n": "ybi_3guc70NLoGecAdyAo0dJYLRXCYFdx7Iaq20REXb5SsyqSjGV_KEr8sdyFhr_PasKb1XbV7G8_gdtxU-Sl5dGI9h8mymIQ7VzbyEhwQqjzdyCKoz2levKPgjsTDN93IQiNfSOfc4qUux5viWQaPWt3bzpvOZXHcMUbzEz_jahKZPU_hMq_N3DroE6xFYB91fb74qHOC5RGMPjskUYKOjCtj-v-sZqznuckf2x0a2r5X--gsqGZT8dHaX9smyrpBbV9Y_g1VZ-CO8XFdRiHWth98FnlbEeHsrXbho9CE2GEACWvRRApMn1uSpghpENbkefpbYCIN7tq6X4lKvSYQZARiLkD1ELHcmWCX-cpIlfxihrKpVnRR4iLJNl33VtOBIPaMvtifojkLxsi3dtyJkcEFQI_kXbKW8Kdw5Fd-UOcsQf8PKk7k9LgFaH8GZRFhbwT0bLjjy0UIV5NDHcSozydV2uQh-ON6BsygCSvME8V4lu9z74Rq3T7eP25pC-Q0mN-1n7QGQL4zKshkKNh6Rx-QCP0hVGNosL6MoLzseluapTqnHrQEHTbG1Jm-WL_ces3thH7PySyWKJcUQ_iWBD0FFkya0KTvTfWvBg_WPdqBHLIQh6ie_7lOFyE56FbRYuRU0cF8-NykA_6HN247pFtw1PSgQ68Dqtv9bZMFU", "e": "AQAB" }, { "use": "sig", "kid": "a187f864-4c89-4bab-8025-8f8ec0678139", "kty": "RSA", "alg": "RS512", "n": "s0XMckvY06KW80N_Fz5rBJUN3BlsUoViZYjpZy5UbhNAt96tdnoMMXJw6vd9-_DWwBEgpq7cRUsWq1qRkqSLz8dxTQ8OGsxauFVTWRTX3ZMQ_YtZJDGa1-snkxhsLxnvpXx_KPgYU1WTqB46GV-itwsZ69S0nq-cNMjIFiz6TJMNVNwI5yEdYUildxb0YmGu_ZBQMihcrYesAJSQezNu10YvioSIQUASHjfVcFMMLtZRYvi7idIfejb7iW2rPlO7sF4ZNhTaSoszB03BvnNZjikORBnDz71AgMKqW_Itlq_uMuMb0XlPCiLZgS83oLfSvMQQspeOks3yv5w3Hv-sEFXrSZyyt3SPxHuc3gggSqLcfzCV4PG_p2H7y5Q6i9VHPaA89ZQXlKWQC46sripPOtkSAkyJU9NJ_WkYNnnXzQiKA3kfN2mLCOzpv62SGoUrEssycTuVLUKTzM76LaYQ_lGbpbSrTGvZEmm3OJjjFr5r2JSPmzGw-5dOUpJ-i3r9-um-iUKKpOkTISYyCXY17w9yf13W4Gms7l5XJU-pRIlBlb3H2QFN2u9wp7mEXYOJzGNGpA3oHFKUmn40jlz509dNpGaG4SXzJG8Uku-mWrjWWsnh9VcZQhgLKVobJsmmSIkqcpJCityl21LAk7DoUB0GeMCFOjzPhZ0ncD7RVBwq762A6rcowuuY8Lwbrp9auNgzzhHHr-c01aFvqZbUT4oaxSFInyrocsyCqJYQEG3sDK6NMxNIPs9NIyC-IWPbqvxESOGJK6rLmh2WCaD0irCvboW5yxfxEaCuu3WWUFFEecR0KvHRQig_dFb2Jyo4fypzqdSRtAu0R7_qOn6pLsEO9XseQh7uRzdagwb9CjdBB8nKB5zVQ79gswBDY2-gDl1UphywtT-ISr4kLUm3tvOFQZjj1SNaZdLTDQbxO9GWjwaijIQbAdMU0f9kE7FHIR3vPEMLfwNgpo6hEyukTBfBTT1cq8eHQt0WbDLDYFcuA1fFa9XGrZPmmGCoV8AFKQaUNRcIbfRWnykPs9oJKi60gKbhoIStIq_DkV_B8OPTMRTbFranSJDaO2P6O0A5Y7Rezhjnqyb0oiJsKg74-_TcgL_tZB-YB3AG3gdElVnu9cWuR2FpY35L1WAk9zA46Z4dxQyL7nNpQDg5pX4Q8sXK2x3Ov1VmYy1TmUxpv1eLTMxts0yXYDQFGcDS4VuDfZZNkIXMOMEo4y5fQw11OOcElpvyVMUkYl0LgJvIqbUCzCulkrruKKPPdHrtJvhImysgT46lbjKPGDT4D_6qIt4UqV9B969PNbqfqFORnmgaH3oF3xxbAQfcasfUxCPxChYpOPs25ldtAASAAqDORw", "e": "AQAB" }, { "key_ops": [ "sign" ], "kid": "17f68701-270a-44c8-a81e-da1e5203ab9b-1", "kty": "RSA", "alg": "PS256", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB", "d": "DHjrOhthnAdtWVF_mi9sxen0_wKkbqQiZniWIu3jhZdGCpOVEKbWxhuq-B4FvlAqr9r1vMENtfFBDZNIVO6gtL7hoYOCJu-Fpertxp8eh0xZDbH96_M-e1JxSR_dmwyxCoix0xbdbbHmHmzvg05s_TL1NuRbNJYSNUJXZLWxK2NKmlw-lPRb360n7H5KFSXECNWBsI9rkJuPvO_HmEYotiAotpxlC3N9cYmFc-G-W6JHTcF7CR2DZOauE3MI5jJpa-qzLXKKCphTq-PkbeM0jwgXciQ11RaC39KVy4YquWDTptilb4LgGQCMDqVIeW5VnBBmhtJvAJhPo_E5RK-MCw", "p": "y6sKp6asFY-kv8hFEh_MPx-eTmZqr-g-CDEq7xgap9fI4LFGvemJv3isQcYJjPAFWreB0PF3uz6XlcK6x1CwjqWlNecQYUmDWq0kyJSvQ7Gn2txsIF6An5lkhSG_AQ-qLWay_WPmyjPXsxaF9aFM-QjTSW12wWcIKGCP0KSrhsM", "q": "uUCYSXKi-4h0Z43Ol_jqy1mCD-yaICt4CtJeZTMbC7CI9qVPUaNHni3fUBxTDgOdH6xJGMZ1XuUFn68fjPB_mPmKUimYCrqlBzhRh7axT6tdD4WQc8rpEHvaucGjp2dBXrCDve_RPyMI8HYRS5kKGmvqhVpnwT0iVq5KRCERgQs", "dp": "HFEzsguicXz_UwrtT4_MPhqPUCc9Pif0N_9eENAxJJUEAPmk9FK8LDsC-EIoocfddrd8_SgVlZsmSFRC0-OMKMkvJ0dxJ5WpBbp9GsZReAADbpKnFfkNuSMCrt_6RpN-_cEBselp9UMwAl5nUbeTlCx98_-cO1ev8q06UbATiTE", "dq": "bmEPnAvDEs6OVTlIVILLG5jchzJ57xsXbpNEDVZzEfcA1L1Q0prQTG6WtXv6_MmocDvOXgW5323keO32hZqy3GorQaNo5VOqiu_CnHN9mLPJQjtaA7RuRBUYEUBQi6lZaNsR1DU1X0I3zFb9HSc1vuJ4HTbtxVTwxecZdxig_ls", "qi": "RhNgmhA5ZNiHU0DoDoMzeaXVpwGxUZ_QkAmC1mc11SROp0khJmM-XfQBW5x6f8sYmX0zAj9EUh01dk1cKrg0dPX42c5nYItgo6ynFSJoSUkl_nu4tJysoCSh-3HtUtstooogDPQKUf4A9UAzgf1vrl95SRl-oL8MaVXlHm_o1KQ" }, { "use": "sig", "kid": "15c927a8-e1c2-40d0-a325-410423370e55-1", "kty": "RSA", "alg": "PS256", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB" }, { "key_ops": [ "sign" ], "kid": "17f68701-270a-44c8-a81e-da1e5203ab9b-2", "kty": "RSA", "alg": "PS384", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB", "d": "DHjrOhthnAdtWVF_mi9sxen0_wKkbqQiZniWIu3jhZdGCpOVEKbWxhuq-B4FvlAqr9r1vMENtfFBDZNIVO6gtL7hoYOCJu-Fpertxp8eh0xZDbH96_M-e1JxSR_dmwyxCoix0xbdbbHmHmzvg05s_TL1NuRbNJYSNUJXZLWxK2NKmlw-lPRb360n7H5KFSXECNWBsI9rkJuPvO_HmEYotiAotpxlC3N9cYmFc-G-W6JHTcF7CR2DZOauE3MI5jJpa-qzLXKKCphTq-PkbeM0jwgXciQ11RaC39KVy4YquWDTptilb4LgGQCMDqVIeW5VnBBmhtJvAJhPo_E5RK-MCw", "p": "y6sKp6asFY-kv8hFEh_MPx-eTmZqr-g-CDEq7xgap9fI4LFGvemJv3isQcYJjPAFWreB0PF3uz6XlcK6x1CwjqWlNecQYUmDWq0kyJSvQ7Gn2txsIF6An5lkhSG_AQ-qLWay_WPmyjPXsxaF9aFM-QjTSW12wWcIKGCP0KSrhsM", "q": "uUCYSXKi-4h0Z43Ol_jqy1mCD-yaICt4CtJeZTMbC7CI9qVPUaNHni3fUBxTDgOdH6xJGMZ1XuUFn68fjPB_mPmKUimYCrqlBzhRh7axT6tdD4WQc8rpEHvaucGjp2dBXrCDve_RPyMI8HYRS5kKGmvqhVpnwT0iVq5KRCERgQs", "dp": "HFEzsguicXz_UwrtT4_MPhqPUCc9Pif0N_9eENAxJJUEAPmk9FK8LDsC-EIoocfddrd8_SgVlZsmSFRC0-OMKMkvJ0dxJ5WpBbp9GsZReAADbpKnFfkNuSMCrt_6RpN-_cEBselp9UMwAl5nUbeTlCx98_-cO1ev8q06UbATiTE", "dq": "bmEPnAvDEs6OVTlIVILLG5jchzJ57xsXbpNEDVZzEfcA1L1Q0prQTG6WtXv6_MmocDvOXgW5323keO32hZqy3GorQaNo5VOqiu_CnHN9mLPJQjtaA7RuRBUYEUBQi6lZaNsR1DU1X0I3zFb9HSc1vuJ4HTbtxVTwxecZdxig_ls", "qi": "RhNgmhA5ZNiHU0DoDoMzeaXVpwGxUZ_QkAmC1mc11SROp0khJmM-XfQBW5x6f8sYmX0zAj9EUh01dk1cKrg0dPX42c5nYItgo6ynFSJoSUkl_nu4tJysoCSh-3HtUtstooogDPQKUf4A9UAzgf1vrl95SRl-oL8MaVXlHm_o1KQ" }, { "use": "sig", "kid": "15c927a8-e1c2-40d0-a325-410423370e55-2", "kty": "RSA", "alg": "PS384", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB" }, { "key_ops": [ "sign" ], "kid": "17f68701-270a-44c8-a81e-da1e5203ab9b-3", "kty": "RSA", "alg": "PS512", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB", "d": "DHjrOhthnAdtWVF_mi9sxen0_wKkbqQiZniWIu3jhZdGCpOVEKbWxhuq-B4FvlAqr9r1vMENtfFBDZNIVO6gtL7hoYOCJu-Fpertxp8eh0xZDbH96_M-e1JxSR_dmwyxCoix0xbdbbHmHmzvg05s_TL1NuRbNJYSNUJXZLWxK2NKmlw-lPRb360n7H5KFSXECNWBsI9rkJuPvO_HmEYotiAotpxlC3N9cYmFc-G-W6JHTcF7CR2DZOauE3MI5jJpa-qzLXKKCphTq-PkbeM0jwgXciQ11RaC39KVy4YquWDTptilb4LgGQCMDqVIeW5VnBBmhtJvAJhPo_E5RK-MCw", "p": "y6sKp6asFY-kv8hFEh_MPx-eTmZqr-g-CDEq7xgap9fI4LFGvemJv3isQcYJjPAFWreB0PF3uz6XlcK6x1CwjqWlNecQYUmDWq0kyJSvQ7Gn2txsIF6An5lkhSG_AQ-qLWay_WPmyjPXsxaF9aFM-QjTSW12wWcIKGCP0KSrhsM", "q": "uUCYSXKi-4h0Z43Ol_jqy1mCD-yaICt4CtJeZTMbC7CI9qVPUaNHni3fUBxTDgOdH6xJGMZ1XuUFn68fjPB_mPmKUimYCrqlBzhRh7axT6tdD4WQc8rpEHvaucGjp2dBXrCDve_RPyMI8HYRS5kKGmvqhVpnwT0iVq5KRCERgQs", "dp": "HFEzsguicXz_UwrtT4_MPhqPUCc9Pif0N_9eENAxJJUEAPmk9FK8LDsC-EIoocfddrd8_SgVlZsmSFRC0-OMKMkvJ0dxJ5WpBbp9GsZReAADbpKnFfkNuSMCrt_6RpN-_cEBselp9UMwAl5nUbeTlCx98_-cO1ev8q06UbATiTE", "dq": "bmEPnAvDEs6OVTlIVILLG5jchzJ57xsXbpNEDVZzEfcA1L1Q0prQTG6WtXv6_MmocDvOXgW5323keO32hZqy3GorQaNo5VOqiu_CnHN9mLPJQjtaA7RuRBUYEUBQi6lZaNsR1DU1X0I3zFb9HSc1vuJ4HTbtxVTwxecZdxig_ls", "qi": "RhNgmhA5ZNiHU0DoDoMzeaXVpwGxUZ_QkAmC1mc11SROp0khJmM-XfQBW5x6f8sYmX0zAj9EUh01dk1cKrg0dPX42c5nYItgo6ynFSJoSUkl_nu4tJysoCSh-3HtUtstooogDPQKUf4A9UAzgf1vrl95SRl-oL8MaVXlHm_o1KQ" }, { "use": "sig", "kid": "15c927a8-e1c2-40d0-a325-410423370e55-3", "kty": "RSA", "alg": "PS512", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB" }, { "kty": "oct", "alg": "HS256", "k": "0gmNspkRljssLSrldySnYUS-zhtCo5sqeqo_yl7n2XA" }, { "kty": "oct", "alg": "HS384", "k": "Ot6zIlCpH4jwa8pYWYw2wXfwruuAlEE11C1jPCt5dlXBY6iWq-0isRy9MFK2L4Uj" }, { "kty": "oct", "alg": "HS512", "k": "vPnfAG10Y09YGh+DQQwQ-n1lye8hfaO1PYdh8qr5oOI5gxKaX1GNBgwtSWsFyt7txFpuMs4kf_3wPWIefC2rQg" } ] } libjwt-3.3.3/tests/keys/jwks_test-1.json000066400000000000000000000007151517612317300202070ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify", "sign", "encrypt", "decrypt", "wrapKey", "unwrapKey", "deriveKey", "deriveBits" ], "kid": "264265c2-4ef0-4751-adbd-9739550afe5b", "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "_bSTCXlDeU-pZZbOKDUVLANspSIeuKZfTM8rtXFG_RU", "d": "wDvSCv8kxkqIVTYPpgEm4Efs6lKzf-95W8Qej4F1yEM" } libjwt-3.3.3/tests/keys/jwks_test-2.json000066400000000000000000000006221517612317300202050ustar00rootroot00000000000000 { "use": "enc", "key_ops": [ "verify", "deriveKeyBAD", "deriveBits", 0 ], "kid": "264265c2-4ef0-4751-adbd-9739550afe5b", "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "Y--DdSpCZ5oF3j__h-SdNJIwvB5aI4AXzpRErGUjWrM", "y": "_bSTCXlDeU-pZZbOKDUVLANspSIeuKZfTM8rtXFG_RU", "d": "wDvSCv8kxkqIVTYPpgEm4Efs6lKzf-95W8Qej4F1yEM" } libjwt-3.3.3/tests/keys/oct_key_128_too_small.json000066400000000000000000000003461517612317300221340ustar00rootroot00000000000000{ "libjwt.io:comment": "Generated by LibJWT 2.9.99", "libjwt.io:date": "Thu Feb 6 17:12:41 2025", "libjwt.io:hostname": "maClara.local", "keys": [ { "kty": "oct", "k": "CS6sW6VYNv8wx24ovqmUrQ" } ] } libjwt-3.3.3/tests/keys/oct_key_256.json000066400000000000000000000002031517612317300200550ustar00rootroot00000000000000{ "keys": [ { "kty": "oct", "alg": "HS256", "k": "0gmNspkRljssLSrldySnYUS-zhtCo5sqeqo_yl7n2XA" } ] } libjwt-3.3.3/tests/keys/oct_key_256_invalid_base64.json000066400000000000000000000003221517612317300227310ustar00rootroot00000000000000{ "keys": [ { "key_ops": [ "sign" ], "kid": "test:invalid-base64", "kty": "oct", "k": "MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5WFk", "alg": "HS256" } ] } libjwt-3.3.3/tests/keys/oct_key_256_issue1.json000066400000000000000000000003431517612317300213530ustar00rootroot00000000000000{ "keys": [ { "key_ops": [ "sign" ], "kid": "987cd169-c39c-42d4-a918-d444668a3ba7", "kty": "oct", "k": "ABEiM0RVZneImaq7zN3u_wARIjNEVWZ3iJmqu8zd7v8", "alg": "HS256" } ] } libjwt-3.3.3/tests/keys/oct_key_256_issue2.json000066400000000000000000000004161517612317300213550ustar00rootroot00000000000000{ "keys": [ { "key_ops": [ "sign" ], "kid": "53d9966a-bf73-44ff-ba8b-d8ae6895a834", "kty": "oct", "k": "MDAxMTIyMzM0NDU1NjY3Nzg4OTlBQUJCQ0NEREVFRkYwMDExMjIzMzQ0NTU2Njc3ODg5OUFBQkJDQ0RERUVGRg", "alg": "HS256" } ] } libjwt-3.3.3/tests/keys/oct_key_384.json000066400000000000000000000002301517612317300200570ustar00rootroot00000000000000{ "keys": [ { "kty": "oct", "alg": "HS384", "k": "Ot6zIlCpH4jwa8pYWYw2wXfwruuAlEE11C1jPCt5dlXBY6iWq-0isRy9MFK2L4Uj" } ] } libjwt-3.3.3/tests/keys/oct_key_512.json000066400000000000000000000002561517612317300200600ustar00rootroot00000000000000{ "keys": [ { "kty": "oct", "alg": "HS512", "k": "vPnfAG10Y09YGh+DQQwQ-n1lye8hfaO1PYdh8qr5oOI5gxKaX1GNBgwtSWsFyt7txFpuMs4kf_3wPWIefC2rQg" } ] } libjwt-3.3.3/tests/keys/oct_key_512_bad.json000066400000000000000000000002031517612317300206560ustar00rootroot00000000000000{ "keys": [ { "kty": "oct", "alg": "HS512", "k": "0gmNspkRljssLSrldySnYUS-zhtCo5sqeqo_yl7n2XA" } ] } libjwt-3.3.3/tests/keys/oct_key_512_small.json000066400000000000000000000002031517612317300212400ustar00rootroot00000000000000{ "keys": [ { "kty": "oct", "alg": "HS256", "k": "0gmNspkRljssLSrldySnYUS-zhtCo5sqeqo_yl7n2XA" } ] } libjwt-3.3.3/tests/keys/oct_key_512_wcb.json000066400000000000000000000004161517612317300207110ustar00rootroot00000000000000{ "keys": [ { "key_ops": [ "sign" ], "kid": "b41ea82e-d2f8-48cc-8771-d8887c1d619e", "kty": "oct", "k": "MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5WFkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlYWQ", "alg": "HS512" } ] } libjwt-3.3.3/tests/keys/pem-files/000077500000000000000000000000001517612317300170175ustar00rootroot00000000000000libjwt-3.3.3/tests/keys/pem-files/ec_key_invalid.pem000066400000000000000000000003371517612317300224720ustar00rootroot00000000000000-----BEGIN EC PRIVATE KEY----- MIGkAgEBBDBeLCgapjZmvTatMHaYX3A02+0Ys3Tr8kda+E9DFnmCSiCOEig519fT 13edeU8YdDugBwIAmCornholioNiAASibEL3JxzwCRdLBZCm7WQ3kWaDL+wP8omo 4mDv0+9e4uJVQf3xwEv+jywNUH+wbPM= -----END EC PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/ec_key_invalid_pub.pem000066400000000000000000000002261517612317300233350ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MHYwEAYIAmCornholioFK4EEACIDYgAEomxC9ycc8AkXSwWQpu1kN5Fmgy/sD/KJ 0eJg79PvXuLiVUH98cBL/o8sDVB/sGzz -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/ec_key_prime256v1.pem000066400000000000000000000003611517612317300226610ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgwDvSCv8kxkqIVTYP pgEm4Efs6lKzf+95W8Qej4F1yEOhRANCAARj74N1KkJnmgXeP/+H5J00kjC8Hloj gBfOlESsZSNas/20kwl5Q3lPqWWWzig1FSwDbKUiHrimX0zPK7VxRv0V -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/ec_key_prime256v1_pub.pem000066400000000000000000000002621517612317300235270ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEY++DdSpCZ5oF3j//h+SdNJIwvB5a I4AXzpRErGUjWrP9tJMJeUN5T6llls4oNRUsA2ylIh64pl9Mzyu1cUb9FQ== -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/ec_key_secp256k1.pem000066400000000000000000000003551517612317300224670ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgzTih0G/1ZdZupZhb7SgO yqsoe2dudSWNPtM4Vt2OYJmhRANCAATvF0TWP69AuhYGeE/syfvTI2E8MI7qnK0K owlN4nv/3e/eWaNrPPdZfROyW+e4PQhL0VRpPyyex8tIscxnFfFB -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/ec_key_secp256k1_pub.pem000066400000000000000000000002561517612317300233350ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE7xdE1j+vQLoWBnhP7Mn70yNhPDCO6pyt CqMJTeJ7/93v3lmjazz3WX0TslvnuD0IS9FUaT8snsfLSLHMZxXxQQ== -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/ec_key_secp384r1.pem000066400000000000000000000004621517612317300224770ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDBeLCgapjZmvTatMHaY X3A02+0Ys3Tr8kda+E9DFnmCSiCOEig519fT13edeU8YdDuhZANiAASibEL3Jxzw CRdLBZCm7WQ3kWaDL+wP8omo3e2VJmZQRnfDdzopgl8r3s8w5JlBpR17J0Gir8g6 CVBA6PzMuq5urkilppSINDnR4mDv0+9e4uJVQf3xwEv+jywNUH+wbPM= -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/ec_key_secp384r1_pub.pem000066400000000000000000000003271517612317300233450ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEomxC9ycc8AkXSwWQpu1kN5Fmgy/sD/KJ qN3tlSZmUEZ3w3c6KYJfK97PMOSZQaUdeydBoq/IOglQQOj8zLqubq5IpaaUiDQ5 0eJg79PvXuLiVUH98cBL/o8sDVB/sGzz -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/ec_key_secp521r1.pem000066400000000000000000000006001517612317300224620ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIHuAgEAMBAGByqGSM49AgEGBSuBBAAjBIHWMIHTAgEBBEIAp6rxb2PoAISjCCTx pTQOxv5arJ/N6Xibr0eyOAnlWcVk34m1W5323/6TcPGTtFQgEX9TWjNcp9W8HIuI yRdLnsKhgYkDgYYABAD9rETbqldZd6wCNxM//ZN97gRwXgDcu6qCkgXOt+2LO1WK rT7l15S99zG48gWT4A1WKeUA7OBlakVLSSF4jsokBgDd84efllNTTwACNq7QKhl7 0ZI9QLhydLLWep62IoFbRikG+FpjkVeeeC98dQd2aQVJUsJLo34teiL92bQVujqy cQ== -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/ec_key_secp521r1_pub.pem000066400000000000000000000004141517612317300233330ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA/axE26pXWXesAjcTP/2Tfe4EcF4A 3LuqgpIFzrftiztViq0+5deUvfcxuPIFk+ANVinlAOzgZWpFS0kheI7KJAYA3fOH n5ZTU08AAjau0CoZe9GSPUC4cnSy1nqetiKBW0YpBvhaY5FXnngvfHUHdmkFSVLC S6N+LXoi/dm0Fbo6snE= -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/eddsa_key_ed25519.pem000066400000000000000000000001671517612317300225340ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MC4CAQAwBQYDK2VwBCIEIF2OaFGahllWYV+ydPYRvq0ZwCl4sNYP2gYfgXOdimf2 -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/eddsa_key_ed25519_pub.pem000066400000000000000000000001611517612317300233740ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MCowBQYDK2VwAyEAHUj+14kN6N4i5qNVkfEhwKiCf+tSrvRHstQdtV8a5QM= -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/eddsa_key_ed448.pem000066400000000000000000000002341517612317300223610ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MEcCAQAwBQYDK2VxBDsEOZ7GHEsomxXqrQQZlVId0v8RkzUCa9CBsFZlOoE3fF5/ oLW/j8ccz4SZ1F2f1HZD0bM9kmNHfDp/rQ== -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/eddsa_key_ed448_pub.pem000066400000000000000000000002221517612317300232240ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MEMwBQYDK2VxAzoAJ5dXafOvQWBrUabIHVqTbiDU4Jq7RtozL5jopRdiUGp+rs0K z+f0+2r7scLjclKO9q8r3m9/YGAA -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/oct_key_hs256.bin000066400000000000000000000000401517612317300220670ustar00rootroot00000000000000”χτΠ„),’κYκMvŠL80¬ώ$Š%qβˆHlibjwt-3.3.3/tests/keys/pem-files/oct_key_hs384.bin000066400000000000000000000000601517612317300220730ustar00rootroot00000000000000Ž>fP6ΖX O(;^*ϋόbΔ΅ψN>JΝΣ°Ξ‚ŠB‚Žϊ"ζaω5ί…²/φ‚φΟ„libjwt-3.3.3/tests/keys/pem-files/oct_key_hs512.bin000066400000000000000000000001001517612317300220570ustar00rootroot00000000000000ΐ_–§υŠrωΛ\f΅ξ^γ“RΦ;>ω…I|x³Žδ•RyΕ₯ͺΤvΣΓX§ ρξz-‚:΅iΚY₯”a…ƒlibjwt-3.3.3/tests/keys/pem-files/rsa_key_1024.pem000066400000000000000000000016241517612317300216300ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALWNRDe+9IuWJjNO CfuUya+HlY07Zie6lWXYOOkYzFS/ZF5jVEo0WSjqCO/fCKBoRwjklDrNupcZ3oGs yiHgA7hTqYFl1sHAvYxqwpct9M4aP6VABwPCxGY2kLbmWrU/V8kUkAuopxyMkWa6 qu4c4chaXC/u7KsCE7U0jwA1UYz5AgMBAAECgYBByM1WMcAksCRpZLajTXeDPerH wSUz8hzeSWndtJmdf7hbpzxMowlHlP3mBPf4P7C1nTXE1PTueXYxoK2hdq2ByS7u 89pqs6o79UYT31EUR6cco2D3SbHUOpeCWoZsbBRIdSV5mk3OxsfOfkqn0b0X6k0/ GJHa4ZZjoYqrYkA98QJBAOpfb0hHsvIe86t7rb3etqXxq1mz3giHTeKrP2LXwC9m TkKgckmVQfNsEu96v+hFwnBQcjHpOVGegYl3M8SMYB0CQQDGTgwXcUFNGwbtX4sV lgwmDpAxiFHHjRMxFu1wbAn1uo8gIxPp3J6vin9gn4z4kGfZXfKQVyM28zXjy01l OoGNAkEAnSUcElSwsRL7wpEMr3Ay+xUNFPo693DxUfgMahPLMnzgIGBAAQJo0/Q0 xgmBvxV3B6OIzdpYqlci967LMRAGKQJBALeDuKrlE2JwtYtslMDoN9vsNEKyfcPm 6TDPn/Ie+WSfPh6md6I/mdanm9NmM8Y/lOtShsxO53bNwjxJgxk/+G0CQQDdyRZW XYAsN6tUw5lMEGNxSmIYf1rjdaFTn+h3s4T4XbhcNZmVuvcAWUWHUWZLx5aT7CvG z2lc9kbt4GkqUlga -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/rsa_key_2048.pem000066400000000000000000000032501517612317300216340ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDC2kwAziXUf33m iqWp0yG6o259+nj7hpQLC4UT0Hmz0wmvreDJ/yNbSgOvsxvVdvzL2IaRZ+Gi5mo0 lswWvL6IGz7PZO0kXTq9sdBnNqMOx27HddV9e/2/p0MgibJTbgywY2Sk23QYhJpq Kq/nU0xlBfSaI5ddZ2RC9ZNkVeGawUKYksTruhAVJqviHN8BoK6VowP5vcxyyOWH TK9KruDqzCIhqwRTeo0spokBkTN/LCuhVivcHAzUiJVtB4qAiTI9L/zkzhjpKz9P 45aLU54rj011gG8U/6E1USh5nMnPkr+d3oLfkhfS3Zs3kJVdyFQWZpQxiTaI92Fd 2wLvbS0HAgMBAAECggEAD8dTnkETSSjlzhRuI9loAtAXM3Zj86JLPLW7GgaoxEoT n7lJ2bGicFMHB2ROnbOb9vnas82gtOtJsGaBslmoaCckp/C5T1eJWTEb+i+vdpPp wZcmKZovyyRFSE4+NYlU17fEv6DRvuaGBpDcW7QgHJIl45F8QWEM+msee2KE+V4G z/9vAQ+sOlvsb4mJP1tJIBx9Lb5loVREwCRy2Ha9tnWdDNar8EYkOn8si4snPT+E 3ZCy8mlcZyUkZeiS/HdtydxZfoiwrSRYamd1diQpPhWCeRteQ802a7ds0Y2YzgfF UaYjNuRQm7zA//hwbXS7ELPyNMU15N00bajlG0tUOQKBgQDnLy01l20OneW6A2cI DIDyYhy5O7uulsaEtJReUlcjEDMkin8b767q2VZHb//3ZH+ipnRYByUUyYUhdOs2 DYRGGeAebnH8wpTT4FCYxUsIUpDfB7RwfdBONgaKewTJz/FPswy1Ye0b5H2c6vVi m2FZ33HQcoZ3wvFFqyGVnMzpOwKBgQDXxL95yoxUGKa8vMzcE3Cn01szh0dFq0sq cFpM+HWLVr84CItuG9H6L0KaStEEIOiJsxOVpcXfFFhsJvOGhMA4DQTwH4WuXmXp 1PoVMDlV65PYqvhzwL4+QhvZO2bsrEunITXOmU7CI6kilnAN3LuP4HbqZgoX9lqP I31VYzLupQKBgGEYck9w0s/xxxtR9ILv5XRnepLdoJzaHHR991aKFKjYU/KD7JDK INfoAhGs23+HCQhCCtkx3wQVA0Ii/erM0II0ueluD5fODX3TV2ZibnoHW2sgrEsW vFcs36BnvIIaQMptc+f2QgSV+Z/fGsKYadG6Q+39O7au/HB7SHayzWkjAoGBAMgt Fzslp9TpXd9iBWjzfCOnGUiP65Z+GWkQ/SXFqD+SRir0+m43zzGdoNvGJ23+Hd6K TdQbDJ0uoe4MoQeepzoZEgi4JeykVUZ/uVfo+nh06yArVf8FxTm7WVzLGGzgV/uA +wtl/cRtEyAsk1649yW/KHPEIP8kJdYAJeoO8xSlAoGAERMrkFR7KGYZG1eFNRdV mJMq+Ibxyw8ks/CbiI+n3yUyk1U8962ol2Q0T4qjBmb26L5rrhNQhneM4e8mo9FX LlQapYkPvkdrqW0Bp72A/UNAvcGTmN7z5OCJGMUutx2hmEAlrYmpLKS8pM/p9zpK tEOtzsP5GMDYVlEp1jYSjzQ= -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/rsa_key_2048_pub.pem000066400000000000000000000007031517612317300225020ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwtpMAM4l1H995oqlqdMh uqNuffp4+4aUCwuFE9B5s9MJr63gyf8jW0oDr7Mb1Xb8y9iGkWfhouZqNJbMFry+ iBs+z2TtJF06vbHQZzajDsdux3XVfXv9v6dDIImyU24MsGNkpNt0GISaaiqv51NM ZQX0miOXXWdkQvWTZFXhmsFCmJLE67oQFSar4hzfAaCulaMD+b3Mcsjlh0yvSq7g 6swiIasEU3qNLKaJAZEzfywroVYr3BwM1IiVbQeKgIkyPS/85M4Y6Ss/T+OWi1Oe K49NdYBvFP+hNVEoeZzJz5K/nd6C35IX0t2bN5CVXchUFmaUMYk2iPdhXdsC720t BwIDAQAB -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/rsa_key_4096.pem000066400000000000000000000063041517612317300216440ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIJQAIBADANBgkqhkiG9w0BAQEFAASCCSowggkmAgEAAoICAQDJuL/eC5zvQ0ug Z5wB3ICjR0lgtFcJgV3HshqrbRERdvlKzKpKMZX8oSvyx3IWGv89qwpvVdtXsbz+ B23FT5KXl0Yj2HybKYhDtXNvISHBCqPN3IIqjPaV68o+COxMM33chCI19I59zipS 7Hm+JZBo9a3dvOm85lcdwxRvMTP+NqEpk9T+Eyr83cOugTrEVgH3V9vvioc4LlEY w+OyRRgo6MK2P6/6xmrOe5yR/bHRravlf76CyoZlPx0dpf2ybKukFtX1j+DVVn4I 7xcV1GIda2H3wWeVsR4eytduGj0ITYYQAJa9FECkyfW5KmCGkQ1uR5+ltgIg3u2r pfiUq9JhBkBGIuQPUQsdyZYJf5ykiV/GKGsqlWdFHiIsk2XfdW04Eg9oy+2J+iOQ vGyLd23ImRwQVAj+Rdspbwp3DkV35Q5yxB/w8qTuT0uAVofwZlEWFvBPRsuOPLRQ hXk0MdxKjPJ1Xa5CH443oGzKAJK8wTxXiW73PvhGrdPt4/bmkL5DSY37WftAZAvj MqyGQo2HpHH5AI/SFUY2iwvoygvOx6W5qlOqcetAQdNsbUmb5Yv9x6ze2Efs/JLJ YolxRD+JYEPQUWTJrQpO9N9a8GD9Y92oEcshCHqJ7/uU4XITnoVtFi5FTRwXz43K QD/oc3bjukW3DU9KBDrwOq2/1tkwVQIDAQABAoICACMGO/IezBHS+meQdcrw8Tjo YLo0tcQFvTW2G+FV35fLs38kSBD3yRYDGfFeZdWmvFiFwRsRqjLwvmLRAWM37Lj7 YAdLSF9cd7dh4vgRpZ2x7j0JI2Sl8w6W0ReyTuzwJ9NI8fOyUadQS5L4Ui8MsKU4 uwZ8DY1p5Qha3cpsnZ1u+M6SR3IR++3Jx3ceIwkB8fdzPtG5mL7Nc/E72eYTDx3T RDOGnVSKbPMLDWVfyicg427GnlpxNaKQscp7DrCTI74q5N1tLNl92gZNFRIKPTrk cS8mWojoJtWr3HnWfnBZnYRbxdBwmsTB+DM9Q2M5/j3+m56XGomAi325JI8TwkQd W1I7ArELEbN96LPFQb3ynjyvwf2OWw7CU4f73yYlX5aoHJHa9kf0Q0OdASy/hKeO KAI7d8IfV/OXHAEF6FSm30sCwA4di7GRVf4LIlS1oxmr71eN830c8Lm1bB/9sNh+ 4H1ztyaFx7jV9zvuVt4X6zMRUOzs42963KtvK5Go05aBu3wVUpTZkHN93H77ygi3 XTfni+sSuJP8anfdgwvgxH6kIEyrFbMw5ZlYkTDjF9hG5573ucbLgMoXXRXUWpq6 62doFjvlr00eTTKPdb4pbqlsWw1lqgJ86b2Nl6QHlr3Mjbsee1CKlrG7iekQwYwM lbG7xUSMwcTWynxM0ebhAoIBAQDwUVULbMcFLz6jeLyeK7c1jmdwm2aRP7mGlqDn rutZ8/lXOu+6KHQEBbi3SAcJAJxLy6v+lDubvYJ/wUDrRrxLZ2N61OrzFt/WNDRp K6qYm1EEfUNPaoplPo4dj0Q6Epmk5DMU+T+uxwcdUf2rw8O8dVrPzl3BFtvUPwSp EMNy9uqnJbDAxaSCd3HQjqpX0ZNwrofMK0khkdCxOXWTYgR2F5rCFmtdiU8QjVhB tHjiXHF4FUf4/7V0SGISdBDCP13OV8+x6pjmR/zVJPhhlk+ixl5DgXI678jGwmoG Y7bum46SZhd9tuFMyRIlJ15LsFq2pCdtQGLXSulkI/a8NtXZAoIBAQDW4qUWXYV+ wRB+rt3saI2o2sRifErnaUfX1i+C9/Lbsu2cOmkERKvlQs9lwIVn2R1j7xTFig1m Madn4dUEQWFs4jVfrTp4uy8jiucz4cbfdwRhJUi5x5R9z44eQq5Yu85LZ8T3xQuC NU0i1gC83UV+JSmS3TmiOn/g49kxYeZ0NXbi7j8EPOqv2noD62aEo8e3LF1pfbIh czqcU3Hi+WaGAtn7rbGmstZW5PlIKjfQ+icq2xuCmQn9sT/H+Bpwwfwn40Qay23+ gOy8e+9PdEYmIa941NA9naYqaRlpnnHxNOmTssTDno8KfbWl+0G4fRuD9oy8Lh9Z +Hju5VOAlrTdAoIBABY5n2DgHYPYO7XIm8ERD++PDPf4F0NFnnXZBmaG4dM+4gd0 NumDhj88/DlPGv91I/9KhcyUjvK3UxNXnxZjQ1TB6gxZFqWGrwrTZyl21V8pthNx NkFo/AWjBGetcUThpX3/cM32wzH5zCmlBI3XHAoY3F4tmrQZ1hjJ/zdXioveVBND RBZ/8Nf0Df2YxB49DqK0MXDra+cD4kYRp1MLFJiLVE+w3RsYcMx6Ffh1pVxh6kiN x0s68uAfNZq5Szd7vsQvkNDGfn+FltdrhOEZkqHeMKeTmCnlNS9UmZOfszJcBpJ5 iKCiwjFkwx3Whzz+wVT014SeGMYKco1FWjNL6vkCgf804ZG+70Tq7JgilOYIR7KU 20F4+x1z1XTYqN0IXfxmFKJkz/sIEd47jTV81OP/qm6RKUTzWAX0IEQSTIEfivdu 1DxOT1MUYvw2wvgizG0kkSWCwqojDfp8+5b922sMaytZYzAVyWgLoxJYgFGuKMXx RTP18Hs+cScHMQtCG9Waw41+SyM258bZf+qHDGcuPR/o9AII8+XiVXkW/3IHaVjR oeIDDbuqSlh1CeRO3hTeWLFK2qDqgr7yr6wCigv3s8VaC5O3BFkNSKz5tYYvB247 9A46riSRBTrfNP4L//IKafsRXe0ONvb8nfMV5b9Gp4Md9o6rwK32di9MmyLxgiUC ggEBAM/lJVgsyIlU1ug/DmeGZQmth0JQdkgVsk7vxM673y/0syLxM3Wk/1BbySQ/ lcIckFN43kAZze9bHOPYtiLvvqb3EZpK8il133LagzddzsXvKiM8xu9GElGTScaG oNmyVk5vL8s6cKHexB0Ce0y1Ri23KywDY6RUgqclYyVpyBRZYrAm4E24voRrWIOu cYb0yjOeMJV4pmEzm8eN+Pqt6Qc60Zl+izvlDIa8qMq7ksFVckB0RR34iqka8y0A hK4V1zZvQ9ZENlO2uUj/WR+/C4NWWRYtfsKYU84XuSy3IuUfwaBHHychmyna1eni nfictCHvTZXlDWYlp5Uf8IDXrd4= -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/rsa_key_4096_pub.pem000066400000000000000000000014401517612317300225060ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAybi/3guc70NLoGecAdyA o0dJYLRXCYFdx7Iaq20REXb5SsyqSjGV/KEr8sdyFhr/PasKb1XbV7G8/gdtxU+S l5dGI9h8mymIQ7VzbyEhwQqjzdyCKoz2levKPgjsTDN93IQiNfSOfc4qUux5viWQ aPWt3bzpvOZXHcMUbzEz/jahKZPU/hMq/N3DroE6xFYB91fb74qHOC5RGMPjskUY KOjCtj+v+sZqznuckf2x0a2r5X++gsqGZT8dHaX9smyrpBbV9Y/g1VZ+CO8XFdRi HWth98FnlbEeHsrXbho9CE2GEACWvRRApMn1uSpghpENbkefpbYCIN7tq6X4lKvS YQZARiLkD1ELHcmWCX+cpIlfxihrKpVnRR4iLJNl33VtOBIPaMvtifojkLxsi3dt yJkcEFQI/kXbKW8Kdw5Fd+UOcsQf8PKk7k9LgFaH8GZRFhbwT0bLjjy0UIV5NDHc SozydV2uQh+ON6BsygCSvME8V4lu9z74Rq3T7eP25pC+Q0mN+1n7QGQL4zKshkKN h6Rx+QCP0hVGNosL6MoLzseluapTqnHrQEHTbG1Jm+WL/ces3thH7PySyWKJcUQ/ iWBD0FFkya0KTvTfWvBg/WPdqBHLIQh6ie/7lOFyE56FbRYuRU0cF8+NykA/6HN2 47pFtw1PSgQ68Dqtv9bZMFUCAwEAAQ== -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/rsa_key_8192.pem000066400000000000000000000143701517612317300216470ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIISQwIBADANBgkqhkiG9w0BAQEFAASCEi0wghIpAgEAAoIEAQCzRcxyS9jTopbz Q38XPmsElQ3cGWxShWJliOlnLlRuE0C33q12egwxcnDq93378NbAESCmrtxFSxar WpGSpIvPx3FNDw4azFq4VVNZFNfdkxD9i1kkMZrX6yeTGGwvGe+lfH8o+BhTVZOo HjoZX6K3Cxnr1LSer5w0yMgWLPpMkw1U3AjnIR1hSKV3FvRiYa79kFAyKFyth6wA lJB7M27XRi+KhIhBQBIeN9VwUwwu1lFi+LuJ0h96NvuJbas+U7uwXhk2FNpKizMH TcG+c1mOKQ5EGcPPvUCAwqpb8i2Wr+4y4xvReU8KItmBLzegt9K8xBCyl46SzfK/ nDce/6wQVetJnLK3dI/Ee5zeCCBKotx/MJXg8b+nYfvLlDqL1Uc9oDz1lBeUpZAL jqyuKk862RICTIlT00n9aRg2edfNCIoDeR83aYsI7Om/rZIahSsSyzJxO5UtQpPM zvotphD+UZultKtMa9kSabc4mOMWvmvYlI+bMbD7l05Skn6Lev366b6JQoqk6RMh JjIJdjXvD3J/XdbgaazuXlclT6lEiUGVvcfZAU3a73CnuYRdg4nMY0akDegcUpSa fjSOXPnT102kZobhJfMkbxSS76ZauNZayeH1VxlCGAspWhsmyaZIiSpykkKK3KXb UsCTsOhQHQZ4wIU6PM+FnSdwPtFUHCrvrYDqtyjC65jwvBuun1q42DPOEcev5zTV oW+pltRPihrFIUifKuhyzIKolhAQbewMro0zE0g+z00jIL4hY9uq/ERI4Ykrqsua HZYJoPSKsK9uhbnLF/ERoK67dZZQUUR5xHQq8dFCKD90VvYnKjh/KnOp1JG0C7RH v+o6fqkuwQ71ex5CHu5HN1qDBv0KN0EHycoHnNVDv2CzAENjb6AOXVSmHLC1P4hK viQtSbe284VBmOPVI1pl0tMNBvE70ZaPBqKMhBsB0xTR/2QTsUchHe88Qwt/A2Cm jqETK6RMF8FNPVyrx4dC3RZsMsNgVy4DV8Vr1catk+aYYKhXwAUpBpQ1Fwht9Faf KQ+z2gkqLrSApuGghK0ir8ORX8Hw49MxFNsWtqdIkNo7Y/o7QDljtF7OGOerJvSi ImwqDvj79NyAv+1kH5gHcAbeB0SVWe71xa5HYWljfkvVYCT3MDjpnh3FDIvuc2lA ODmlfhDyxcrbHc6/VWZjLVOZTGm/V4tMzG2zTJdgNAUZwNLhW4N9lk2Qhcw4wSjj Ll9DDXU45wSWm/JUxSRiXQuAm8iptQLMK6WSuu4oo890eu0m+EibKyBPjqVuMo8Y NPgP/qoi3hSpX0H3r081up+oU5GeaBofegXfHFsBB9xqx9TEI/EKFik4+zbmV20A BIACoM5HAgMBAAECggQAazXNy3iyhfZRIc/2vFbWt1nQfRUzI7KjIqebNdqOIXog FRX1VMouao/PGaXC0R25wAk+JpCiKEp8lyNFtZX0CuFyT6w2Oi6F/oEApGCDq/3c hlSEjdGgkYoPE7fiUtTG7YejoEOmgIfIEx1oj24TKDZaXR/KmK/a0fJVPnXNhmfW 7C3eoSK7qEdCtRKkOgXDGd7pJuXebuSZJ4uxUAx1OAbAPa1+ss73Rt0LJu5zdbsz 1uV7ejOQIY2qJgjRBSgcMaBEoYQc+8F9VdvZhuUC5LKG1pE1+hFq9tXz/aK6QsiZ whLxuvc6Hoyy2L/9G39zZvI2LifW2tKRXqe0izRJmUdYu6AbfP0XUWC/ckUX0qrN BL9wkqLgg+BkLd5KmP+GaENg0VisNXhBybeca1fgJAhW7csJwXi1Yfgsw79gID0A FI2l7oSO4lqUe834dyW2mbmtQ+xnDTconq4VDaGnvf/d/l4qpzxEB+/y48UC4cIl StOlgiFYf02ASH9VcGKwaxLIoNuLgI3mo8ds2x23qWzqg2MCMxjfk3oV0blvOA6B i2SAlLVj8w+IprWahDY6/WFNiKTMb8uvFSluksjlmxvCUhQCi7kfTGWlvy3UpaKu hoL/P7LD5zPr0OITJMIpUG2/Vd9ELjlAcwZtJqYAeJCzIxm3Uxm03WobgNQAabSh rQCpUF+sZEqOPfQIa4bpRk+IzboCzdBBuQw9S8H1+yI/R718EvbmS3QhKAG6C6BR bafo+SLTfMGKARMACqq68w2FNYLblodBYGOdSf7LeSc8g6uA9UPncMfg06HOmkw/ lIaOVseJG006u9LsUE6obCzNKGy5vtz0gCawbuc+S5ZaR3tE18Nu3ukNtZVv+L+U ThAlVn/QDm4uMUmNy6Uxn7rta98auPE18InaVKJEDAFJ/pljX/XI6M0Nnz+lJfrl YTqPWjQtazaoohJt+OaVeK8MLOzRfu1FLllv8w2I1VXZR2rEW0UiwOC7+q5PgZE2 qo7pHFnG/XfnP64vxa3I4Bv+a6zAbga1fgBbvTooRgqf6EExklZyfipMCtpnbG4c Ght//zwUOvhUn6POHCgGO3OYhXjr8ArUhg2oQwGyUkGlzQGLGeopocFCbDMb7i+k GMhuigwKLjBMUF6U3TdC532wse0DPyDHBCLyxD4dPiPvFspgcNaw7x6sVWB9vN2J xXUJVGtnIrHAZQ2evGDtIeJnyFhmQ3Fa8RF+519xHYyX6Vu1KGEI1yT+ALSkUvYy cUip4zyT70+GdknExutxIWtEMVpfXzxIJVt9S6gm8pUZ73OHVByUV92FgQCWPXnk jVPRBU/nnmav05YqCikvPx5SOVV/r64h5eNklhelmQKCAgEA586CvRRJQLPsOzFO jH6k0aCQOdvi5MwuLkdaBnAKOZRGiXtVFV/QwnXELmIiDCcPCLXagZ5R9XKwQp8H nzgvbGii2EjOFZ0GQC9FtOXX+E5vpFrg8eYRrjCAHB2yZ+B/1QrLOYbJhZZfaSZ5 8WC0jrrJqa1zvauBjy2EdtWykIbCV29UWdzIm0kH3Tgi0f3chgt7voOMHJ87jknE 4jGLYbRM4Gje92Gi3WWymTSwN3ZuqWZvWdjPTuz2dk2T6sGusyN4cXTjmRy8yDMg xifJkhyxshW1ZHIK/6RacDi0w562rhz9kRRvbwtK9copeNaudQpvUJL+aPtVWc4f KNNatpaFhhsHo1jTOdMvx2Mn7AxDreUiTuUO2gDEJu7/LR7MhSdaXBVUUQVFNZXw Hm0tVM1OH7rylU+OBNUOjb14zaClRtZ/97GoQIgRXQRqJ4K6nXFwGXycyYc4bZt2 +tS4HVjUPViT4hZr4JXKeUSfY/rzE3i9QjLhguKaRXJexh8TxGMKg1DxMUv8kEYS 4Dt5V1ZHQnGwN/lRR91B8OoreelOQTX4YIfi7ZWBaeNqBK4YRTQ5k2pHIi3THpFK hyQQGXXuAcwUcxhdOOWoVmlM37Qmfty/P+Jac8z7Gos4aXDRS0NXfkLLCFGWzhoQ Z0jh/p34xiF3cO0J94Wu/xHJPsMCggIBAMX7qnjl9kPyqA8YZUFHe/8mFYSCbPX5 /ufVt55DSwA9wscairG2fETKO2xeu4m0zO9iShOvzEydTs2SDMtl1tSHf4h43Hdb Lg1ekfPMDmU76pPnsPO0bCH+c+1kPvhaXLhAUPBNBjhU3SuaMH5vRGBJIpCrAzu4 tCKnAP56QZoJ702CAAtvbU/ZUGl9lV16mcgE0BVjQVVqs1srno0WTtV6Yu4J4oRO z8KI7Bfbvq6UhaErNpb0m1Bb5IExdbNjh43Eot/F7+WooOKSh9kzpy8KzrgrmI0k CRR6bibh91oY66SDJMmwsNQi4ajKrNUmP0qlQHRoXw4Q1Ot9kea/DCarm0ou6jwh NlSyl51PNrZMgN16SJR1sAsoeR1tSmQdQViu8icYjvIraWDixSXyi986c+KJ5QBR o1GMxxDuGVahSTjo1cj1Ps/sqq+JRqHIkwlt8J4Oujlwzxjy9pr/omZw49iF1GGu CwIAKJZMp526TkAYoVzCwCELv+ZGdVRfpo2NEqL9J8fv/E9+FJbvbvsxTILjhkkt 2XTGlqzt1Mcb5/iXmzme6Wd0S22i2MG+u5FleU3C2qAenOU7/l1YgSbMe3sJ6SQD fvpCLP0nZMv2cM2s0Zr5msvfqqRaDbMshgcY2hVgILhxIF+4FPwZyff1lDKpNTcr G8tEH/dTe8ItAoICAF6UkBt9z3Wq89QjBh2k/rLZhH9XDHi2JpGTY1QFGubrbOxj eg/CjHcLfgQ+3g1/Uk8HhCQm6OHw7aIBKSb50b+14dvFuPBwpUBDCXoJ3djeiAbT XbzVVplwCJVwOH7RxtayFMFgEZGEDWHl5RNrlcA2zlmBABx/gdldhRLHlpgJo/nw 3sXbo65YWfEVGn/7yKKYxOCy49Q51B72UnLILEqtOkDGCVN+bulOuVRxfwTiOby8 oupR4CQf41/Zv2SlqhZFfrssKkEqzIwS8Ghpi4EmXAqBeQWG0p4D/TKUsIywkXDx OzSa1ezE+szWs50uWvg+TbTehRdolSaTR3ts4TJmsAxLsw4fC/AoDvKXro5NYr/t IdZ291xTu7T3Bv7t9hzONbwkp8Z3FAoNJ3ACs+BJ9HpV2Oy7DQNDuzByAnxD86u3 kXcK8c+CtTLyvi1o1aOvyUFc6sv/dDKkoCMv7/9pYw+0uIIjC9kSxQ49xZsRpWRo ezAren/g3XlAdRL5UyNqFbwGpqKqkl57ePAs1BGijmi54mC0RUnBKUqXAS4410kc MD+SsjCmM6t0sqk+L4DtEiDn2CZF9EIgnfwN5tO8nmP1VNKxOjgg3FKFnGwaISrZ /t6eCLH/DOWDsHy1H3BKBcTqk9TNFW76i37Y6fztj7enqAhXbx2jWgeQxj/pAoIC AQDBKJxVf+cYu/KDZ8XCPsAXW0y7D5THF7U+8yBGZFkUTy1tm9OdNvFfG/+F55cI 70DSfQ7Qzj+AsClmHwwklaNXjys6NtDCEk+H87BqL7gLxL1EuFPIMUsej2cDQT6+ h0rW6MkO6dcbtpBiLfkKIfyQBEqY4oAxEC+Pb2hk31qJsw+qix8ICRqZQOhXQ5Mq tKa8oxVxCHmBoKyEUrZJ6G3ZkaJbo4FAnLPOlE/jpx0OrxEBAWwtM1EkwcLa2SqA bqaeBi7yK+e2JSNyaovnuaFvIBg3TzFy4qmJNTmq7eOqH44n31tQ+/ZJwg5v4+1j uAEgDsIn0HyM+JcDemuSuOpeACdt5P/a0nxzfhq1+8bhbRp8+wU88uVivYYM08g0 jOZoY6cVxbwRQZF6WUUHlPAqRpkxeF/YQ84XjkXZmrNV9d2+jEun2L4Dll+hC0nC JjJujLipPK0rxYgIS2OWLbqAP7vMUCW5d1h+BzGSEg+mr1IQ7vbfzZItq4z6Wdu3 CesxR2XbZyocw2NjGxtzdv7MTHjdaqZlVzpF2ErBRPjHmc5kl2V2fjgyGyBMQwk/ XZsaa+pBl849UiC49iNhZyv6cp42mKDB5jdIarAB/SE2baX4xJdroAMKzZlq6AFd wh6xZem/2R2TVavEN5EhtPd72DlShAvLW1+unTSi1Ox1sQKCAgEAg9n+wQtZ60IW CxAuc4uHUofpCQoIeGrZ9xLnH0tmFRJnJ5ufNxzHj5oWwKSxpm90bDMnWutfirGH h5RQ7y44IbYUV2Pbhz7+gwSjNlhLec37PCWuVyUmkHLma07N2ZspUOT21/uJ4WD1 XazuP+gA4sGiVcLs73q21mUqVgXR+s+bCM0tG1ZrwgoYsKg5Dek34HsdlzYpWYMs qXgKmwJ691ZXlRR/HOLOKsfNfoprW9QQ2kVGfXO/0lKK5p9f7CceOPguLqHn0zk7 CB09OVjCv6eTUL8UzswQMo67nO210Q7JKuXAWxGYApQB4HubNe5Ic+pdiHz8Iwbm fcTYyOGs4RtQZY3qzB8z9p66y62rzasPnUXSYs3w4nrKtfphC8b5voJB+QDJGe1y WqL95dHYJxdGHa4Kcjc8jQtOCty8pItvGdrVkmuzr0P5LziY1jJz/sPj5b4l2jJB 56g1UnKzBmaxgPIQrIdqlDiuEBOerdYKVLiq7np2JC5rKfoYQhdTCj12Nwm8cpOP 3jymz1XYEUqYc46oggBPor09edLwhOqr+30Bv8QCAsvwaBYG0Ru2P5l5mgCOmf++ dW50xYg+MPHJr9WK38x65kAi+vG9yHeoS++bm26CbVkSGrwKPZI34Fku6i/FUayW EtoiU3WKndSOrpIVOqOQTQU54puQoOE= -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/rsa_key_8192_pub.pem000066400000000000000000000027231517612317300225140ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEAs0XMckvY06KW80N/Fz5r BJUN3BlsUoViZYjpZy5UbhNAt96tdnoMMXJw6vd9+/DWwBEgpq7cRUsWq1qRkqSL z8dxTQ8OGsxauFVTWRTX3ZMQ/YtZJDGa1+snkxhsLxnvpXx/KPgYU1WTqB46GV+i twsZ69S0nq+cNMjIFiz6TJMNVNwI5yEdYUildxb0YmGu/ZBQMihcrYesAJSQezNu 10YvioSIQUASHjfVcFMMLtZRYvi7idIfejb7iW2rPlO7sF4ZNhTaSoszB03BvnNZ jikORBnDz71AgMKqW/Itlq/uMuMb0XlPCiLZgS83oLfSvMQQspeOks3yv5w3Hv+s EFXrSZyyt3SPxHuc3gggSqLcfzCV4PG/p2H7y5Q6i9VHPaA89ZQXlKWQC46sripP OtkSAkyJU9NJ/WkYNnnXzQiKA3kfN2mLCOzpv62SGoUrEssycTuVLUKTzM76LaYQ /lGbpbSrTGvZEmm3OJjjFr5r2JSPmzGw+5dOUpJ+i3r9+um+iUKKpOkTISYyCXY1 7w9yf13W4Gms7l5XJU+pRIlBlb3H2QFN2u9wp7mEXYOJzGNGpA3oHFKUmn40jlz5 09dNpGaG4SXzJG8Uku+mWrjWWsnh9VcZQhgLKVobJsmmSIkqcpJCityl21LAk7Do UB0GeMCFOjzPhZ0ncD7RVBwq762A6rcowuuY8Lwbrp9auNgzzhHHr+c01aFvqZbU T4oaxSFInyrocsyCqJYQEG3sDK6NMxNIPs9NIyC+IWPbqvxESOGJK6rLmh2WCaD0 irCvboW5yxfxEaCuu3WWUFFEecR0KvHRQig/dFb2Jyo4fypzqdSRtAu0R7/qOn6p LsEO9XseQh7uRzdagwb9CjdBB8nKB5zVQ79gswBDY2+gDl1UphywtT+ISr4kLUm3 tvOFQZjj1SNaZdLTDQbxO9GWjwaijIQbAdMU0f9kE7FHIR3vPEMLfwNgpo6hEyuk TBfBTT1cq8eHQt0WbDLDYFcuA1fFa9XGrZPmmGCoV8AFKQaUNRcIbfRWnykPs9oJ Ki60gKbhoIStIq/DkV/B8OPTMRTbFranSJDaO2P6O0A5Y7Rezhjnqyb0oiJsKg74 +/TcgL/tZB+YB3AG3gdElVnu9cWuR2FpY35L1WAk9zA46Z4dxQyL7nNpQDg5pX4Q 8sXK2x3Ov1VmYy1TmUxpv1eLTMxts0yXYDQFGcDS4VuDfZZNkIXMOMEo4y5fQw11 OOcElpvyVMUkYl0LgJvIqbUCzCulkrruKKPPdHrtJvhImysgT46lbjKPGDT4D/6q It4UqV9B969PNbqfqFORnmgaH3oF3xxbAQfcasfUxCPxChYpOPs25ldtAASAAqDO RwIDAQAB -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/rsa_key_i37_pub.pem000066400000000000000000000007031517612317300225070ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn/7RTQX1xlllgo+aqo5z d/+wqaRZwFWp3JJIUXryJ4d153J1gEYdz4RkjFO0X8kpv8qb5hdzWhhZHSItD+07 LaQXP4lSUuiK1lJAT/YW51D37nCkWm839gAqEGdsWsYQCvqJKSJr4pWCZTEx2MEf ikmmnaXPR/VOVgZSj9kIoKo+kFwlw9LGVBHYAeR/W+l5DJQK6Yha8Igi36hnvZqq HcQ4gkGUqEc//Tq2nyYNwvAN3ieZvtvL71rFW26FnuA4OwDER+TYSkAr8Z4wH2Ed Gno1GZQAegIm+yWblleCaBVOnlk8VcDO9PecTiAFjjWAbQiaFKlkf/plD7KE4tAa mQIDAQAB -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/rsa_key_invalid.pem000066400000000000000000000017351517612317300226730ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDC2kwAziXUf33m iqWp0yG6o259+nj7hpQLC4UT0Hmz0wmvreDJ/yNbSgOvsxvVdvzL2IaRZ+Gi5mo0 lswWvL6IGz7PZO0kXTq9sdBnNqMOx27HddV9e/2/p0MgibJTbgywY2Sk23QYhJpq Kq/nU0xlBfSaI5ddZ2RC9ZNkVeGawUKYksTruhAVJqviHN8BoK6VowP5vcxyyOWH TK9KruDqzCIhqwRTeo0spokBkTN/LCuhVivcHAzUiJVtB4qAiTI9L/zkzhjpKz9P 45aLU54rj011gG8U/6E1UShIAmCornholiofkhfS3Zs3kJVdyFQWZpQxiTaI92Fd 2wLvbS0HAgMBAAECggEAD8dTnkETSSjlzhRuI9loAtAXM3Zj86JLPLW7GgaoxEoT n7lJ2bGicFMHB2ROnbOb9vnas82gtOtJsGaBslmoaCckp/C5T1eJWTEb+i+vdpPp wZcmKZovyyRFSE4+NYlU17fEv6DRvuaGBpDcW7QgHJIl45F8QWEM+msee2KE+V4G Fzslp9TpXd9iBWjzfCOnGUiP65Z+GWkQ/SXFqD+SRir0+m43zzGdoNvGJ23+Hd6K TdQbDJ0uoe4MoQeepzoZEgi4JeykVUZ/uVfo+nh06yArVf8FxTm7WVzLGGzgV/uA +wtl/cRtEyAsk1649yW/KHPEIP8kJdYAJeoO8xSlAoGAERMrkFR7KGYZG1eFNRdV mJMq+Ibxyw8ks/CbiI+n3yUyk1U8962ol2Q0T4qjBmb26L5rrhNQhneM4e8mo9FX LlQapYkPvkdrqW0Bp72A/UNAvcGTmN7z5OCJGMUutx2hmEAlrYmpLKS8pM/p9zpK tEOtzsP5GMDYVlEp1jYSjzQ= -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/rsa_key_invalid_pub.pem000066400000000000000000000004001517612317300235250ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwtpMAM4l1H995oqlqdMh uqNuffp4+4aUCwuFE9B5s9MJrIAmCornholio7Mb1Xb8y9iGkWfhouZqNJbMFry+ iBs+z2TtJF06vbHQZzajDsdux3XVfXv9v6dDIImyU24MsGNkpNt0GISaaiqv51NM BwIDAQAB -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/pem-files/rsa_pss_key_2048.pem000066400000000000000000000032441517612317300225240ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEugIBADALBgkqhkiG9w0BAQoEggSmMIIEogIBAAKCAQEAk2H+nc6pcHePEz7l iCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm/eFtY+zEh qgOTDipc/aXRhTZg71AHh+GgF7EtatrDwXs0Cs6M+dhF0MZpgqrUt2RgkjMD3Cfg ztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o/kEWNGJB4djr5iJe k2ZOO3Ij3iPw3bBx/nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWc Bp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaA mDoNYQIDAQABAoIBAAx46zobYZwHbVlRf5ovbMXp9P8CpG6kImZ4liLt44WXRgqT lRCm1sYbqvgeBb5QKq/a9bzBDbXxQQ2TSFTuoLS+4aGDgibvhaXq7cafHodMWQ2x /evzPntScUkf3ZsMsQqIsdMW3W2x5h5s74NObP0y9TbkWzSWEjVCV2S1sStjSppc PpT0W9+tJ+x+ShUlxAjVgbCPa5Cbj7zvx5hGKLYgKLacZQtzfXGJhXPhvluiR03B ewkdg2TmrhNzCOYyaWvqsy1yigqYU6vj5G3jNI8IF3IkNdUWgt/SlcuGKrlg06bY pW+C4BkAjA6lSHluVZwQZobSbwCYT6PxOUSvjAsCgYEAy6sKp6asFY+kv8hFEh/M Px+eTmZqr+g+CDEq7xgap9fI4LFGvemJv3isQcYJjPAFWreB0PF3uz6XlcK6x1Cw jqWlNecQYUmDWq0kyJSvQ7Gn2txsIF6An5lkhSG/AQ+qLWay/WPmyjPXsxaF9aFM +QjTSW12wWcIKGCP0KSrhsMCgYEAuUCYSXKi+4h0Z43Ol/jqy1mCD+yaICt4CtJe ZTMbC7CI9qVPUaNHni3fUBxTDgOdH6xJGMZ1XuUFn68fjPB/mPmKUimYCrqlBzhR h7axT6tdD4WQc8rpEHvaucGjp2dBXrCDve/RPyMI8HYRS5kKGmvqhVpnwT0iVq5K RCERgQsCgYAcUTOyC6JxfP9TCu1Pj8w+Go9QJz0+J/Q3/14Q0DEklQQA+aT0Urws OwL4Qiihx912t3z9KBWVmyZIVELT44woyS8nR3EnlakFun0axlF4AANukqcV+Q25 IwKu3/pGk379wQGx6Wn1QzACXmdRt5OULH3z/5w7V6/yrTpRsBOJMQKBgG5hD5wL wxLOjlU5SFSCyxuY3Icyee8bF26TRA1WcxH3ANS9UNKa0ExulrV7+vzJqHA7zl4F ud9t5Hjt9oWastxqK0GjaOVTqorvwpxzfZizyUI7WgO0bkQVGBFAUIupWWjbEdQ1 NV9CN8xW/R0nNb7ieB027cVU8MXnGXcYoP5bAoGARhNgmhA5ZNiHU0DoDoMzeaXV pwGxUZ/QkAmC1mc11SROp0khJmM+XfQBW5x6f8sYmX0zAj9EUh01dk1cKrg0dPX4 2c5nYItgo6ynFSJoSUkl/nu4tJysoCSh+3HtUtstooogDPQKUf4A9UAzgf1vrl95 SRl+oL8MaVXlHm/o1KQ= -----END PRIVATE KEY----- libjwt-3.3.3/tests/keys/pem-files/rsa_pss_key_2048_pub.pem000066400000000000000000000007031517612317300233670ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MIIBIDALBgkqhkiG9w0BAQoDggEPADCCAQoCggEBAJNh/p3OqXB3jxM+5YgscuLG FwW65LN44Jk8kKN58H6RCnnGz7vKq2l4OToI5vS83yGqZNyZv3hbWPsxIaoDkw4q XP2l0YU2YO9QB4fhoBexLWraw8F7NArOjPnYRdDGaYKq1LdkYJIzA9wn4M7XyVS4 uijnhHMH2e8247rxBnO6b0K4rzZLL6cZTlVQ2LRdKP5BFjRiQeHY6+YiXpNmTjty I94j8N2wcf5wTuKdjV2+4/JhXJ288gATTxsK/eEsl5lkzYbTGFK32KY1nAae/R+h cVx0btCWWo2AiHveUa8UNty9cwSGcIQ9VSYGFRnYTHwfZn26OxZsQ8GGgJg6DWEC AwEAAQ== -----END PUBLIC KEY----- libjwt-3.3.3/tests/keys/rsa_key_1024.json000066400000000000000000000017441517612317300201420ustar00rootroot00000000000000{ "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "0023a6e1-f093-448d-9038-9ff168611b86", "kty": "RSA", "n": "tY1EN770i5YmM04J-5TJr4eVjTtmJ7qVZdg46RjMVL9kXmNUSjRZKOoI798IoGhHCOSUOs26lxnegazKIeADuFOpgWXWwcC9jGrCly30zho_pUAHA8LEZjaQtuZatT9XyRSQC6inHIyRZrqq7hzhyFpcL-7sqwITtTSPADVRjPk", "e": "AQAB", "d": "QcjNVjHAJLAkaWS2o013gz3qx8ElM_Ic3klp3bSZnX-4W6c8TKMJR5T95gT3-D-wtZ01xNT07nl2MaCtoXatgcku7vPaarOqO_VGE99RFEenHKNg90mx1DqXglqGbGwUSHUleZpNzsbHzn5Kp9G9F-pNPxiR2uGWY6GKq2JAPfE", "p": "6l9vSEey8h7zq3utvd62pfGrWbPeCIdN4qs_YtfAL2ZOQqBySZVB82wS73q_6EXCcFByMek5UZ6BiXczxIxgHQ", "q": "xk4MF3FBTRsG7V-LFZYMJg6QMYhRx40TMRbtcGwJ9bqPICMT6dyer4p_YJ-M-JBn2V3ykFcjNvM148tNZTqBjQ", "dp": "nSUcElSwsRL7wpEMr3Ay-xUNFPo693DxUfgMahPLMnzgIGBAAQJo0_Q0xgmBvxV3B6OIzdpYqlci967LMRAGKQ", "dq": "t4O4quUTYnC1i2yUwOg32-w0QrJ9w-bpMM-f8h75ZJ8-HqZ3oj-Z1qeb02Yzxj-U61KGzE7nds3CPEmDGT_4bQ", "qi": "3ckWVl2ALDerVMOZTBBjcUpiGH9a43WhU5_od7OE-F24XDWZlbr3AFlFh1FmS8eWk-wrxs9pXPZG7eBpKlJYGg" } libjwt-3.3.3/tests/keys/rsa_key_2048.json000066400000000000000000000034751517612317300201540ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify", "sign" ], "alg": "RS256", "kid": "28c243a4-a9ac-473f-ab61-d3a68f408279", "kty": "RSA", "n": "wtpMAM4l1H995oqlqdMhuqNuffp4-4aUCwuFE9B5s9MJr63gyf8jW0oDr7Mb1Xb8y9iGkWfhouZqNJbMFry-iBs-z2TtJF06vbHQZzajDsdux3XVfXv9v6dDIImyU24MsGNkpNt0GISaaiqv51NMZQX0miOXXWdkQvWTZFXhmsFCmJLE67oQFSar4hzfAaCulaMD-b3Mcsjlh0yvSq7g6swiIasEU3qNLKaJAZEzfywroVYr3BwM1IiVbQeKgIkyPS_85M4Y6Ss_T-OWi1OeK49NdYBvFP-hNVEoeZzJz5K_nd6C35IX0t2bN5CVXchUFmaUMYk2iPdhXdsC720tBw", "e": "AQAB", "d": "D8dTnkETSSjlzhRuI9loAtAXM3Zj86JLPLW7GgaoxEoTn7lJ2bGicFMHB2ROnbOb9vnas82gtOtJsGaBslmoaCckp_C5T1eJWTEb-i-vdpPpwZcmKZovyyRFSE4-NYlU17fEv6DRvuaGBpDcW7QgHJIl45F8QWEM-msee2KE-V4Gz_9vAQ-sOlvsb4mJP1tJIBx9Lb5loVREwCRy2Ha9tnWdDNar8EYkOn8si4snPT-E3ZCy8mlcZyUkZeiS_HdtydxZfoiwrSRYamd1diQpPhWCeRteQ802a7ds0Y2YzgfFUaYjNuRQm7zA__hwbXS7ELPyNMU15N00bajlG0tUOQ", "p": "5y8tNZdtDp3lugNnCAyA8mIcuTu7rpbGhLSUXlJXIxAzJIp_G--u6tlWR2__92R_oqZ0WAclFMmFIXTrNg2ERhngHm5x_MKU0-BQmMVLCFKQ3we0cH3QTjYGinsEyc_xT7MMtWHtG-R9nOr1YpthWd9x0HKGd8LxRashlZzM6Ts", "q": "18S_ecqMVBimvLzM3BNwp9NbM4dHRatLKnBaTPh1i1a_OAiLbhvR-i9CmkrRBCDoibMTlaXF3xRYbCbzhoTAOA0E8B-Frl5l6dT6FTA5VeuT2Kr4c8C-PkIb2Ttm7KxLpyE1zplOwiOpIpZwDdy7j-B26mYKF_ZajyN9VWMy7qU", "dp": "YRhyT3DSz_HHG1H0gu_ldGd6kt2gnNocdH33VooUqNhT8oPskMog1-gCEazbf4cJCEIK2THfBBUDQiL96szQgjS56W4Pl84NfdNXZmJuegdbayCsSxa8VyzfoGe8ghpAym1z5_ZCBJX5n98awphp0bpD7f07tq78cHtIdrLNaSM", "dq": "yC0XOyWn1Old32IFaPN8I6cZSI_rln4ZaRD9JcWoP5JGKvT6bjfPMZ2g28Ynbf4d3opN1BsMnS6h7gyhB56nOhkSCLgl7KRVRn-5V-j6eHTrICtV_wXFObtZXMsYbOBX-4D7C2X9xG0TICyTXrj3Jb8oc8Qg_yQl1gAl6g7zFKU", "qi": "ERMrkFR7KGYZG1eFNRdVmJMq-Ibxyw8ks_CbiI-n3yUyk1U8962ol2Q0T4qjBmb26L5rrhNQhneM4e8mo9FXLlQapYkPvkdrqW0Bp72A_UNAvcGTmN7z5OCJGMUutx2hmEAlrYmpLKS8pM_p9zpKtEOtzsP5GMDYVlEp1jYSjzQ" } libjwt-3.3.3/tests/keys/rsa_key_2048_pub.json000066400000000000000000000010671517612317300210150ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify" ], "alg": "RS256", "kid": "e25ecf9f-b510-4c5d-963f-df115815f136", "kty": "RSA", "n": "wtpMAM4l1H995oqlqdMhuqNuffp4-4aUCwuFE9B5s9MJr63gyf8jW0oDr7Mb1Xb8y9iGkWfhouZqNJbMFry-iBs-z2TtJF06vbHQZzajDsdux3XVfXv9v6dDIImyU24MsGNkpNt0GISaaiqv51NMZQX0miOXXWdkQvWTZFXhmsFCmJLE67oQFSar4hzfAaCulaMD-b3Mcsjlh0yvSq7g6swiIasEU3qNLKaJAZEzfywroVYr3BwM1IiVbQeKgIkyPS_85M4Y6Ss_T-OWi1OeK49NdYBvFP-hNVEoeZzJz5K_nd6C35IX0t2bN5CVXchUFmaUMYk2iPdhXdsC720tBw", "e": "AQAB" } ] } libjwt-3.3.3/tests/keys/rsa_key_2048_pub_alg_hs256.json000066400000000000000000000010271517612317300225630ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": ["verify"], "alg": "HS256", "kid": "rsa-mislabeled-hs256", "kty": "RSA", "n": "wtpMAM4l1H995oqlqdMhuqNuffp4-4aUCwuFE9B5s9MJr63gyf8jW0oDr7Mb1Xb8y9iGkWfhouZqNJbMFry-iBs-z2TtJF06vbHQZzajDsdux3XVfXv9v6dDIImyU24MsGNkpNt0GISaaiqv51NMZQX0miOXXWdkQvWTZFXhmsFCmJLE67oQFSar4hzfAaCulaMD-b3Mcsjlh0yvSq7g6swiIasEU3qNLKaJAZEzfywroVYr3BwM1IiVbQeKgIkyPS_85M4Y6Ss_T-OWi1OeK49NdYBvFP-hNVEoeZzJz5K_nd6C35IX0t2bN5CVXchUFmaUMYk2iPdhXdsC720tBw", "e": "AQAB" } ] } libjwt-3.3.3/tests/keys/rsa_key_2048_pub_no_alg.json000066400000000000000000000007671517612317300223420ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": ["verify"], "kid": "rsa-no-alg", "kty": "RSA", "n": "wtpMAM4l1H995oqlqdMhuqNuffp4-4aUCwuFE9B5s9MJr63gyf8jW0oDr7Mb1Xb8y9iGkWfhouZqNJbMFry-iBs-z2TtJF06vbHQZzajDsdux3XVfXv9v6dDIImyU24MsGNkpNt0GISaaiqv51NMZQX0miOXXWdkQvWTZFXhmsFCmJLE67oQFSar4hzfAaCulaMD-b3Mcsjlh0yvSq7g6swiIasEU3qNLKaJAZEzfywroVYr3BwM1IiVbQeKgIkyPS_85M4Y6Ss_T-OWi1OeK49NdYBvFP-hNVEoeZzJz5K_nd6C35IX0t2bN5CVXchUFmaUMYk2iPdhXdsC720tBw", "e": "AQAB" } ] } libjwt-3.3.3/tests/keys/rsa_key_4096.json000066400000000000000000000065201517612317300201530ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify", "sign" ], "alg": "RS384", "kid": "9c10cd27-de4a-4ffe-8ad9-b9a1c4a07218", "kty": "RSA", "n": "ybi_3guc70NLoGecAdyAo0dJYLRXCYFdx7Iaq20REXb5SsyqSjGV_KEr8sdyFhr_PasKb1XbV7G8_gdtxU-Sl5dGI9h8mymIQ7VzbyEhwQqjzdyCKoz2levKPgjsTDN93IQiNfSOfc4qUux5viWQaPWt3bzpvOZXHcMUbzEz_jahKZPU_hMq_N3DroE6xFYB91fb74qHOC5RGMPjskUYKOjCtj-v-sZqznuckf2x0a2r5X--gsqGZT8dHaX9smyrpBbV9Y_g1VZ-CO8XFdRiHWth98FnlbEeHsrXbho9CE2GEACWvRRApMn1uSpghpENbkefpbYCIN7tq6X4lKvSYQZARiLkD1ELHcmWCX-cpIlfxihrKpVnRR4iLJNl33VtOBIPaMvtifojkLxsi3dtyJkcEFQI_kXbKW8Kdw5Fd-UOcsQf8PKk7k9LgFaH8GZRFhbwT0bLjjy0UIV5NDHcSozydV2uQh-ON6BsygCSvME8V4lu9z74Rq3T7eP25pC-Q0mN-1n7QGQL4zKshkKNh6Rx-QCP0hVGNosL6MoLzseluapTqnHrQEHTbG1Jm-WL_ces3thH7PySyWKJcUQ_iWBD0FFkya0KTvTfWvBg_WPdqBHLIQh6ie_7lOFyE56FbRYuRU0cF8-NykA_6HN247pFtw1PSgQ68Dqtv9bZMFU", "e": "AQAB", "d": "IwY78h7MEdL6Z5B1yvDxOOhgujS1xAW9NbYb4VXfl8uzfyRIEPfJFgMZ8V5l1aa8WIXBGxGqMvC-YtEBYzfsuPtgB0tIX1x3t2Hi-BGlnbHuPQkjZKXzDpbRF7JO7PAn00jx87JRp1BLkvhSLwywpTi7BnwNjWnlCFrdymydnW74zpJHchH77cnHdx4jCQHx93M-0bmYvs1z8TvZ5hMPHdNEM4adVIps8wsNZV_KJyDjbsaeWnE1opCxynsOsJMjvirk3W0s2X3aBk0VEgo9OuRxLyZaiOgm1avcedZ-cFmdhFvF0HCaxMH4Mz1DYzn-Pf6bnpcaiYCLfbkkjxPCRB1bUjsCsQsRs33os8VBvfKePK_B_Y5bDsJTh_vfJiVflqgckdr2R_RDQ50BLL-Ep44oAjt3wh9X85ccAQXoVKbfSwLADh2LsZFV_gsiVLWjGavvV43zfRzwubVsH_2w2H7gfXO3JoXHuNX3O-5W3hfrMxFQ7Ozjb3rcq28rkajTloG7fBVSlNmQc33cfvvKCLddN-eL6xK4k_xqd92DC-DEfqQgTKsVszDlmViRMOMX2Ebnnve5xsuAyhddFdRamrrrZ2gWO-WvTR5NMo91viluqWxbDWWqAnzpvY2XpAeWvcyNux57UIqWsbuJ6RDBjAyVsbvFRIzBxNbKfEzR5uE", "p": "8FFVC2zHBS8-o3i8niu3NY5ncJtmkT-5hpag567rWfP5Vzrvuih0BAW4t0gHCQCcS8ur_pQ7m72Cf8FA60a8S2djetTq8xbf1jQ0aSuqmJtRBH1DT2qKZT6OHY9EOhKZpOQzFPk_rscHHVH9q8PDvHVaz85dwRbb1D8EqRDDcvbqpyWwwMWkgndx0I6qV9GTcK6HzCtJIZHQsTl1k2IEdheawhZrXYlPEI1YQbR44lxxeBVH-P-1dEhiEnQQwj9dzlfPseqY5kf81ST4YZZPosZeQ4FyOu_IxsJqBmO27puOkmYXfbbhTMkSJSdeS7BatqQnbUBi10rpZCP2vDbV2Q", "q": "1uKlFl2FfsEQfq7d7GiNqNrEYnxK52lH19Yvgvfy27LtnDppBESr5ULPZcCFZ9kdY-8UxYoNZjGnZ-HVBEFhbOI1X606eLsvI4rnM-HG33cEYSVIuceUfc-OHkKuWLvOS2fE98ULgjVNItYAvN1FfiUpkt05ojp_4OPZMWHmdDV24u4_BDzqr9p6A-tmhKPHtyxdaX2yIXM6nFNx4vlmhgLZ-62xprLWVuT5SCo30PonKtsbgpkJ_bE_x_gacMH8J-NEGstt_oDsvHvvT3RGJiGveNTQPZ2mKmkZaZ5x8TTpk7LEw56PCn21pftBuH0bg_aMvC4fWfh47uVTgJa03Q", "dp": "FjmfYOAdg9g7tcibwREP748M9_gXQ0WeddkGZobh0z7iB3Q26YOGPzz8OU8a_3Uj_0qFzJSO8rdTE1efFmNDVMHqDFkWpYavCtNnKXbVXym2E3E2QWj8BaMEZ61xROGlff9wzfbDMfnMKaUEjdccChjcXi2atBnWGMn_N1eKi95UE0NEFn_w1_QN_ZjEHj0OorQxcOtr5wPiRhGnUwsUmItUT7DdGxhwzHoV-HWlXGHqSI3HSzry4B81mrlLN3u-xC-Q0MZ-f4WW12uE4RmSod4wp5OYKeU1L1SZk5-zMlwGknmIoKLCMWTDHdaHPP7BVPTXhJ4YxgpyjUVaM0vq-Q", "dq": "NOGRvu9E6uyYIpTmCEeylNtBePsdc9V02KjdCF38ZhSiZM_7CBHeO401fNTj_6pukSlE81gF9CBEEkyBH4r3btQ8Tk9TFGL8NsL4IsxtJJElgsKqIw36fPuW_dtrDGsrWWMwFcloC6MSWIBRrijF8UUz9fB7PnEnBzELQhvVmsONfksjNufG2X_qhwxnLj0f6PQCCPPl4lV5Fv9yB2lY0aHiAw27qkpYdQnkTt4U3lixStqg6oK-8q-sAooL97PFWguTtwRZDUis-bWGLwduO_QOOq4kkQU63zT-C__yCmn7EV3tDjb2_J3zFeW_RqeDHfaOq8Ct9nYvTJsi8YIl", "qi": "z-UlWCzIiVTW6D8OZ4ZlCa2HQlB2SBWyTu_EzrvfL_SzIvEzdaT_UFvJJD-VwhyQU3jeQBnN71sc49i2Iu--pvcRmkryKXXfctqDN13Oxe8qIzzG70YSUZNJxoag2bJWTm8vyzpwod7EHQJ7TLVGLbcrLANjpFSCpyVjJWnIFFlisCbgTbi-hGtYg65xhvTKM54wlXimYTObx434-q3pBzrRmX6LO-UMhryoyruSwVVyQHRFHfiKqRrzLQCErhXXNm9D1kQ2U7a5SP9ZH78Lg1ZZFi1-wphTzhe5LLci5R_BoEcfJyGbKdrV6eKd-Jy0Ie9NleUNZiWnlR_wgNet3g" } ] } libjwt-3.3.3/tests/keys/rsa_key_4096_pub.json000066400000000000000000000016141517612317300210200ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify" ], "alg": "RS384", "kid": "d5bf8cf1-bc4a-482f-920c-b90b8097f118", "kty": "RSA", "n": "ybi_3guc70NLoGecAdyAo0dJYLRXCYFdx7Iaq20REXb5SsyqSjGV_KEr8sdyFhr_PasKb1XbV7G8_gdtxU-Sl5dGI9h8mymIQ7VzbyEhwQqjzdyCKoz2levKPgjsTDN93IQiNfSOfc4qUux5viWQaPWt3bzpvOZXHcMUbzEz_jahKZPU_hMq_N3DroE6xFYB91fb74qHOC5RGMPjskUYKOjCtj-v-sZqznuckf2x0a2r5X--gsqGZT8dHaX9smyrpBbV9Y_g1VZ-CO8XFdRiHWth98FnlbEeHsrXbho9CE2GEACWvRRApMn1uSpghpENbkefpbYCIN7tq6X4lKvSYQZARiLkD1ELHcmWCX-cpIlfxihrKpVnRR4iLJNl33VtOBIPaMvtifojkLxsi3dtyJkcEFQI_kXbKW8Kdw5Fd-UOcsQf8PKk7k9LgFaH8GZRFhbwT0bLjjy0UIV5NDHcSozydV2uQh-ON6BsygCSvME8V4lu9z74Rq3T7eP25pC-Q0mN-1n7QGQL4zKshkKNh6Rx-QCP0hVGNosL6MoLzseluapTqnHrQEHTbG1Jm-WL_ces3thH7PySyWKJcUQ_iWBD0FFkya0KTvTfWvBg_WPdqBHLIQh6ie_7lOFyE56FbRYuRU0cF8-NykA_6HN247pFtw1PSgQ68Dqtv9bZMFU", "e": "AQAB" } ] } libjwt-3.3.3/tests/keys/rsa_key_8192.json000066400000000000000000000145211517612317300201540ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify", "sign" ], "alg": "RS512", "kid": "a2b26d8b-eff1-4147-bc71-65813c1d7241", "kty": "RSA", "n": "s0XMckvY06KW80N_Fz5rBJUN3BlsUoViZYjpZy5UbhNAt96tdnoMMXJw6vd9-_DWwBEgpq7cRUsWq1qRkqSLz8dxTQ8OGsxauFVTWRTX3ZMQ_YtZJDGa1-snkxhsLxnvpXx_KPgYU1WTqB46GV-itwsZ69S0nq-cNMjIFiz6TJMNVNwI5yEdYUildxb0YmGu_ZBQMihcrYesAJSQezNu10YvioSIQUASHjfVcFMMLtZRYvi7idIfejb7iW2rPlO7sF4ZNhTaSoszB03BvnNZjikORBnDz71AgMKqW_Itlq_uMuMb0XlPCiLZgS83oLfSvMQQspeOks3yv5w3Hv-sEFXrSZyyt3SPxHuc3gggSqLcfzCV4PG_p2H7y5Q6i9VHPaA89ZQXlKWQC46sripPOtkSAkyJU9NJ_WkYNnnXzQiKA3kfN2mLCOzpv62SGoUrEssycTuVLUKTzM76LaYQ_lGbpbSrTGvZEmm3OJjjFr5r2JSPmzGw-5dOUpJ-i3r9-um-iUKKpOkTISYyCXY17w9yf13W4Gms7l5XJU-pRIlBlb3H2QFN2u9wp7mEXYOJzGNGpA3oHFKUmn40jlz509dNpGaG4SXzJG8Uku-mWrjWWsnh9VcZQhgLKVobJsmmSIkqcpJCityl21LAk7DoUB0GeMCFOjzPhZ0ncD7RVBwq762A6rcowuuY8Lwbrp9auNgzzhHHr-c01aFvqZbUT4oaxSFInyrocsyCqJYQEG3sDK6NMxNIPs9NIyC-IWPbqvxESOGJK6rLmh2WCaD0irCvboW5yxfxEaCuu3WWUFFEecR0KvHRQig_dFb2Jyo4fypzqdSRtAu0R7_qOn6pLsEO9XseQh7uRzdagwb9CjdBB8nKB5zVQ79gswBDY2-gDl1UphywtT-ISr4kLUm3tvOFQZjj1SNaZdLTDQbxO9GWjwaijIQbAdMU0f9kE7FHIR3vPEMLfwNgpo6hEyukTBfBTT1cq8eHQt0WbDLDYFcuA1fFa9XGrZPmmGCoV8AFKQaUNRcIbfRWnykPs9oJKi60gKbhoIStIq_DkV_B8OPTMRTbFranSJDaO2P6O0A5Y7Rezhjnqyb0oiJsKg74-_TcgL_tZB-YB3AG3gdElVnu9cWuR2FpY35L1WAk9zA46Z4dxQyL7nNpQDg5pX4Q8sXK2x3Ov1VmYy1TmUxpv1eLTMxts0yXYDQFGcDS4VuDfZZNkIXMOMEo4y5fQw11OOcElpvyVMUkYl0LgJvIqbUCzCulkrruKKPPdHrtJvhImysgT46lbjKPGDT4D_6qIt4UqV9B969PNbqfqFORnmgaH3oF3xxbAQfcasfUxCPxChYpOPs25ldtAASAAqDORw", "e": "AQAB", "d": "azXNy3iyhfZRIc_2vFbWt1nQfRUzI7KjIqebNdqOIXogFRX1VMouao_PGaXC0R25wAk-JpCiKEp8lyNFtZX0CuFyT6w2Oi6F_oEApGCDq_3chlSEjdGgkYoPE7fiUtTG7YejoEOmgIfIEx1oj24TKDZaXR_KmK_a0fJVPnXNhmfW7C3eoSK7qEdCtRKkOgXDGd7pJuXebuSZJ4uxUAx1OAbAPa1-ss73Rt0LJu5zdbsz1uV7ejOQIY2qJgjRBSgcMaBEoYQc-8F9VdvZhuUC5LKG1pE1-hFq9tXz_aK6QsiZwhLxuvc6Hoyy2L_9G39zZvI2LifW2tKRXqe0izRJmUdYu6AbfP0XUWC_ckUX0qrNBL9wkqLgg-BkLd5KmP-GaENg0VisNXhBybeca1fgJAhW7csJwXi1Yfgsw79gID0AFI2l7oSO4lqUe834dyW2mbmtQ-xnDTconq4VDaGnvf_d_l4qpzxEB-_y48UC4cIlStOlgiFYf02ASH9VcGKwaxLIoNuLgI3mo8ds2x23qWzqg2MCMxjfk3oV0blvOA6Bi2SAlLVj8w-IprWahDY6_WFNiKTMb8uvFSluksjlmxvCUhQCi7kfTGWlvy3UpaKuhoL_P7LD5zPr0OITJMIpUG2_Vd9ELjlAcwZtJqYAeJCzIxm3Uxm03WobgNQAabShrQCpUF-sZEqOPfQIa4bpRk-IzboCzdBBuQw9S8H1-yI_R718EvbmS3QhKAG6C6BRbafo-SLTfMGKARMACqq68w2FNYLblodBYGOdSf7LeSc8g6uA9UPncMfg06HOmkw_lIaOVseJG006u9LsUE6obCzNKGy5vtz0gCawbuc-S5ZaR3tE18Nu3ukNtZVv-L-UThAlVn_QDm4uMUmNy6Uxn7rta98auPE18InaVKJEDAFJ_pljX_XI6M0Nnz-lJfrlYTqPWjQtazaoohJt-OaVeK8MLOzRfu1FLllv8w2I1VXZR2rEW0UiwOC7-q5PgZE2qo7pHFnG_XfnP64vxa3I4Bv-a6zAbga1fgBbvTooRgqf6EExklZyfipMCtpnbG4cGht__zwUOvhUn6POHCgGO3OYhXjr8ArUhg2oQwGyUkGlzQGLGeopocFCbDMb7i-kGMhuigwKLjBMUF6U3TdC532wse0DPyDHBCLyxD4dPiPvFspgcNaw7x6sVWB9vN2JxXUJVGtnIrHAZQ2evGDtIeJnyFhmQ3Fa8RF-519xHYyX6Vu1KGEI1yT-ALSkUvYycUip4zyT70-GdknExutxIWtEMVpfXzxIJVt9S6gm8pUZ73OHVByUV92FgQCWPXnkjVPRBU_nnmav05YqCikvPx5SOVV_r64h5eNklhelmQ", "p": "586CvRRJQLPsOzFOjH6k0aCQOdvi5MwuLkdaBnAKOZRGiXtVFV_QwnXELmIiDCcPCLXagZ5R9XKwQp8HnzgvbGii2EjOFZ0GQC9FtOXX-E5vpFrg8eYRrjCAHB2yZ-B_1QrLOYbJhZZfaSZ58WC0jrrJqa1zvauBjy2EdtWykIbCV29UWdzIm0kH3Tgi0f3chgt7voOMHJ87jknE4jGLYbRM4Gje92Gi3WWymTSwN3ZuqWZvWdjPTuz2dk2T6sGusyN4cXTjmRy8yDMgxifJkhyxshW1ZHIK_6RacDi0w562rhz9kRRvbwtK9copeNaudQpvUJL-aPtVWc4fKNNatpaFhhsHo1jTOdMvx2Mn7AxDreUiTuUO2gDEJu7_LR7MhSdaXBVUUQVFNZXwHm0tVM1OH7rylU-OBNUOjb14zaClRtZ_97GoQIgRXQRqJ4K6nXFwGXycyYc4bZt2-tS4HVjUPViT4hZr4JXKeUSfY_rzE3i9QjLhguKaRXJexh8TxGMKg1DxMUv8kEYS4Dt5V1ZHQnGwN_lRR91B8OoreelOQTX4YIfi7ZWBaeNqBK4YRTQ5k2pHIi3THpFKhyQQGXXuAcwUcxhdOOWoVmlM37Qmfty_P-Jac8z7Gos4aXDRS0NXfkLLCFGWzhoQZ0jh_p34xiF3cO0J94Wu_xHJPsM", "q": "xfuqeOX2Q_KoDxhlQUd7_yYVhIJs9fn-59W3nkNLAD3CxxqKsbZ8RMo7bF67ibTM72JKE6_MTJ1OzZIMy2XW1Id_iHjcd1suDV6R88wOZTvqk-ew87RsIf5z7WQ--FpcuEBQ8E0GOFTdK5owfm9EYEkikKsDO7i0IqcA_npBmgnvTYIAC29tT9lQaX2VXXqZyATQFWNBVWqzWyuejRZO1Xpi7gnihE7PwojsF9u-rpSFoSs2lvSbUFvkgTF1s2OHjcSi38Xv5aig4pKH2TOnLwrOuCuYjSQJFHpuJuH3WhjrpIMkybCw1CLhqMqs1SY_SqVAdGhfDhDU632R5r8MJqubSi7qPCE2VLKXnU82tkyA3XpIlHWwCyh5HW1KZB1BWK7yJxiO8itpYOLFJfKL3zpz4onlAFGjUYzHEO4ZVqFJOOjVyPU-z-yqr4lGociTCW3wng66OXDPGPL2mv-iZnDj2IXUYa4LAgAolkynnbpOQBihXMLAIQu_5kZ1VF-mjY0Sov0nx-_8T34Ulu9u-zFMguOGSS3ZdMaWrO3Uxxvn-JebOZ7pZ3RLbaLYwb67kWV5TcLaoB6c5Tv-XViBJsx7ewnpJAN--kIs_Sdky_ZwzazRmvmay9-qpFoNsyyGBxjaFWAguHEgX7gU_BnJ9_WUMqk1Nysby0Qf91N7wi0", "dp": "XpSQG33Pdarz1CMGHaT-stmEf1cMeLYmkZNjVAUa5uts7GN6D8KMdwt-BD7eDX9STweEJCbo4fDtogEpJvnRv7Xh28W48HClQEMJegnd2N6IBtNdvNVWmXAIlXA4ftHG1rIUwWARkYQNYeXlE2uVwDbOWYEAHH-B2V2FEseWmAmj-fDexdujrlhZ8RUaf_vIopjE4LLj1DnUHvZScsgsSq06QMYJU35u6U65VHF_BOI5vLyi6lHgJB_jX9m_ZKWqFkV-uywqQSrMjBLwaGmLgSZcCoF5BYbSngP9MpSwjLCRcPE7NJrV7MT6zNaznS5a-D5NtN6FF2iVJpNHe2zhMmawDEuzDh8L8CgO8peujk1iv-0h1nb3XFO7tPcG_u32HM41vCSnxncUCg0ncAKz4En0elXY7LsNA0O7MHICfEPzq7eRdwrxz4K1MvK-LWjVo6_JQVzqy_90MqSgIy_v_2ljD7S4giML2RLFDj3FmxGlZGh7MCt6f-DdeUB1EvlTI2oVvAamoqqSXnt48CzUEaKOaLniYLRFScEpSpcBLjjXSRwwP5KyMKYzq3SyqT4vgO0SIOfYJkX0QiCd_A3m07yeY_VU0rE6OCDcUoWcbBohKtn-3p4Isf8M5YOwfLUfcEoFxOqT1M0VbvqLftjp_O2Pt6eoCFdvHaNaB5DGP-k", "dq": "wSicVX_nGLvyg2fFwj7AF1tMuw-Uxxe1PvMgRmRZFE8tbZvTnTbxXxv_heeXCO9A0n0O0M4_gLApZh8MJJWjV48rOjbQwhJPh_Owai-4C8S9RLhTyDFLHo9nA0E-vodK1ujJDunXG7aQYi35CiH8kARKmOKAMRAvj29oZN9aibMPqosfCAkamUDoV0OTKrSmvKMVcQh5gaCshFK2Seht2ZGiW6OBQJyzzpRP46cdDq8RAQFsLTNRJMHC2tkqgG6mngYu8ivntiUjcmqL57mhbyAYN08xcuKpiTU5qu3jqh-OJ99bUPv2ScIOb-PtY7gBIA7CJ9B8jPiXA3prkrjqXgAnbeT_2tJ8c34atfvG4W0afPsFPPLlYr2GDNPINIzmaGOnFcW8EUGRellFB5TwKkaZMXhf2EPOF45F2ZqzVfXdvoxLp9i-A5ZfoQtJwiYyboy4qTytK8WICEtjli26gD-7zFAluXdYfgcxkhIPpq9SEO72382SLauM-lnbtwnrMUdl22cqHMNjYxsbc3b-zEx43WqmZVc6RdhKwUT4x5nOZJdldn44MhsgTEMJP12bGmvqQZfOPVIguPYjYWcr-nKeNpigweY3SGqwAf0hNm2l-MSXa6ADCs2ZaugBXcIesWXpv9kdk1WrxDeRIbT3e9g5UoQLy1tfrp00otTsdbE", "qi": "g9n-wQtZ60IWCxAuc4uHUofpCQoIeGrZ9xLnH0tmFRJnJ5ufNxzHj5oWwKSxpm90bDMnWutfirGHh5RQ7y44IbYUV2Pbhz7-gwSjNlhLec37PCWuVyUmkHLma07N2ZspUOT21_uJ4WD1XazuP-gA4sGiVcLs73q21mUqVgXR-s-bCM0tG1ZrwgoYsKg5Dek34HsdlzYpWYMsqXgKmwJ691ZXlRR_HOLOKsfNfoprW9QQ2kVGfXO_0lKK5p9f7CceOPguLqHn0zk7CB09OVjCv6eTUL8UzswQMo67nO210Q7JKuXAWxGYApQB4HubNe5Ic-pdiHz8IwbmfcTYyOGs4RtQZY3qzB8z9p66y62rzasPnUXSYs3w4nrKtfphC8b5voJB-QDJGe1yWqL95dHYJxdGHa4Kcjc8jQtOCty8pItvGdrVkmuzr0P5LziY1jJz_sPj5b4l2jJB56g1UnKzBmaxgPIQrIdqlDiuEBOerdYKVLiq7np2JC5rKfoYQhdTCj12Nwm8cpOP3jymz1XYEUqYc46oggBPor09edLwhOqr-30Bv8QCAsvwaBYG0Ru2P5l5mgCOmf--dW50xYg-MPHJr9WK38x65kAi-vG9yHeoS--bm26CbVkSGrwKPZI34Fku6i_FUayWEtoiU3WKndSOrpIVOqOQTQU54puQoOE" } ] } libjwt-3.3.3/tests/keys/rsa_key_8192_pub.json000066400000000000000000000030671517612317300210250ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify" ], "alg": "RS512", "kid": "83d430e4-5797-4ab0-b8e7-c620ea4ccb5e", "kty": "RSA", "n": "s0XMckvY06KW80N_Fz5rBJUN3BlsUoViZYjpZy5UbhNAt96tdnoMMXJw6vd9-_DWwBEgpq7cRUsWq1qRkqSLz8dxTQ8OGsxauFVTWRTX3ZMQ_YtZJDGa1-snkxhsLxnvpXx_KPgYU1WTqB46GV-itwsZ69S0nq-cNMjIFiz6TJMNVNwI5yEdYUildxb0YmGu_ZBQMihcrYesAJSQezNu10YvioSIQUASHjfVcFMMLtZRYvi7idIfejb7iW2rPlO7sF4ZNhTaSoszB03BvnNZjikORBnDz71AgMKqW_Itlq_uMuMb0XlPCiLZgS83oLfSvMQQspeOks3yv5w3Hv-sEFXrSZyyt3SPxHuc3gggSqLcfzCV4PG_p2H7y5Q6i9VHPaA89ZQXlKWQC46sripPOtkSAkyJU9NJ_WkYNnnXzQiKA3kfN2mLCOzpv62SGoUrEssycTuVLUKTzM76LaYQ_lGbpbSrTGvZEmm3OJjjFr5r2JSPmzGw-5dOUpJ-i3r9-um-iUKKpOkTISYyCXY17w9yf13W4Gms7l5XJU-pRIlBlb3H2QFN2u9wp7mEXYOJzGNGpA3oHFKUmn40jlz509dNpGaG4SXzJG8Uku-mWrjWWsnh9VcZQhgLKVobJsmmSIkqcpJCityl21LAk7DoUB0GeMCFOjzPhZ0ncD7RVBwq762A6rcowuuY8Lwbrp9auNgzzhHHr-c01aFvqZbUT4oaxSFInyrocsyCqJYQEG3sDK6NMxNIPs9NIyC-IWPbqvxESOGJK6rLmh2WCaD0irCvboW5yxfxEaCuu3WWUFFEecR0KvHRQig_dFb2Jyo4fypzqdSRtAu0R7_qOn6pLsEO9XseQh7uRzdagwb9CjdBB8nKB5zVQ79gswBDY2-gDl1UphywtT-ISr4kLUm3tvOFQZjj1SNaZdLTDQbxO9GWjwaijIQbAdMU0f9kE7FHIR3vPEMLfwNgpo6hEyukTBfBTT1cq8eHQt0WbDLDYFcuA1fFa9XGrZPmmGCoV8AFKQaUNRcIbfRWnykPs9oJKi60gKbhoIStIq_DkV_B8OPTMRTbFranSJDaO2P6O0A5Y7Rezhjnqyb0oiJsKg74-_TcgL_tZB-YB3AG3gdElVnu9cWuR2FpY35L1WAk9zA46Z4dxQyL7nNpQDg5pX4Q8sXK2x3Ov1VmYy1TmUxpv1eLTMxts0yXYDQFGcDS4VuDfZZNkIXMOMEo4y5fQw11OOcElpvyVMUkYl0LgJvIqbUCzCulkrruKKPPdHrtJvhImysgT46lbjKPGDT4D_6qIt4UqV9B969PNbqfqFORnmgaH3oF3xxbAQfcasfUxCPxChYpOPs25ldtAASAAqDORw", "e": "AQAB" } ] } libjwt-3.3.3/tests/keys/rsa_key_i37_pub.json000066400000000000000000000010411517612317300210120ustar00rootroot00000000000000{ "keys": [ { "use": "sig", "key_ops": [ "verify" ], "kid": "f2549e89-3ed6-4897-aab8-59ca42935941", "kty": "RSA", "n": "n_7RTQX1xlllgo-aqo5zd_-wqaRZwFWp3JJIUXryJ4d153J1gEYdz4RkjFO0X8kpv8qb5hdzWhhZHSItD-07LaQXP4lSUuiK1lJAT_YW51D37nCkWm839gAqEGdsWsYQCvqJKSJr4pWCZTEx2MEfikmmnaXPR_VOVgZSj9kIoKo-kFwlw9LGVBHYAeR_W-l5DJQK6Yha8Igi36hnvZqqHcQ4gkGUqEc__Tq2nyYNwvAN3ieZvtvL71rFW26FnuA4OwDER-TYSkAr8Z4wH2EdGno1GZQAegIm-yWblleCaBVOnlk8VcDO9PecTiAFjjWAbQiaFKlkf_plD7KE4tAamQ", "e": "AQAB" } ] } libjwt-3.3.3/tests/keys/rsa_pss_key_2048.json000066400000000000000000000034751517612317300210410ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "a9a0eb5b-67e9-4495-9030-a97d063d4bb4", "kty": "RSA", "alg": "PS256", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB", "d": "DHjrOhthnAdtWVF_mi9sxen0_wKkbqQiZniWIu3jhZdGCpOVEKbWxhuq-B4FvlAqr9r1vMENtfFBDZNIVO6gtL7hoYOCJu-Fpertxp8eh0xZDbH96_M-e1JxSR_dmwyxCoix0xbdbbHmHmzvg05s_TL1NuRbNJYSNUJXZLWxK2NKmlw-lPRb360n7H5KFSXECNWBsI9rkJuPvO_HmEYotiAotpxlC3N9cYmFc-G-W6JHTcF7CR2DZOauE3MI5jJpa-qzLXKKCphTq-PkbeM0jwgXciQ11RaC39KVy4YquWDTptilb4LgGQCMDqVIeW5VnBBmhtJvAJhPo_E5RK-MCw", "p": "y6sKp6asFY-kv8hFEh_MPx-eTmZqr-g-CDEq7xgap9fI4LFGvemJv3isQcYJjPAFWreB0PF3uz6XlcK6x1CwjqWlNecQYUmDWq0kyJSvQ7Gn2txsIF6An5lkhSG_AQ-qLWay_WPmyjPXsxaF9aFM-QjTSW12wWcIKGCP0KSrhsM", "q": "uUCYSXKi-4h0Z43Ol_jqy1mCD-yaICt4CtJeZTMbC7CI9qVPUaNHni3fUBxTDgOdH6xJGMZ1XuUFn68fjPB_mPmKUimYCrqlBzhRh7axT6tdD4WQc8rpEHvaucGjp2dBXrCDve_RPyMI8HYRS5kKGmvqhVpnwT0iVq5KRCERgQs", "dp": "HFEzsguicXz_UwrtT4_MPhqPUCc9Pif0N_9eENAxJJUEAPmk9FK8LDsC-EIoocfddrd8_SgVlZsmSFRC0-OMKMkvJ0dxJ5WpBbp9GsZReAADbpKnFfkNuSMCrt_6RpN-_cEBselp9UMwAl5nUbeTlCx98_-cO1ev8q06UbATiTE", "dq": "bmEPnAvDEs6OVTlIVILLG5jchzJ57xsXbpNEDVZzEfcA1L1Q0prQTG6WtXv6_MmocDvOXgW5323keO32hZqy3GorQaNo5VOqiu_CnHN9mLPJQjtaA7RuRBUYEUBQi6lZaNsR1DU1X0I3zFb9HSc1vuJ4HTbtxVTwxecZdxig_ls", "qi": "RhNgmhA5ZNiHU0DoDoMzeaXVpwGxUZ_QkAmC1mc11SROp0khJmM-XfQBW5x6f8sYmX0zAj9EUh01dk1cKrg0dPX42c5nYItgo6ynFSJoSUkl_nu4tJysoCSh-3HtUtstooogDPQKUf4A9UAzgf1vrl95SRl-oL8MaVXlHm_o1KQ" } libjwt-3.3.3/tests/keys/rsa_pss_key_2048_384.json000066400000000000000000000034751517612317300214370ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "a9a0eb5b-67e9-4495-9030-a97d063d4bb4", "kty": "RSA", "alg": "PS384", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB", "d": "DHjrOhthnAdtWVF_mi9sxen0_wKkbqQiZniWIu3jhZdGCpOVEKbWxhuq-B4FvlAqr9r1vMENtfFBDZNIVO6gtL7hoYOCJu-Fpertxp8eh0xZDbH96_M-e1JxSR_dmwyxCoix0xbdbbHmHmzvg05s_TL1NuRbNJYSNUJXZLWxK2NKmlw-lPRb360n7H5KFSXECNWBsI9rkJuPvO_HmEYotiAotpxlC3N9cYmFc-G-W6JHTcF7CR2DZOauE3MI5jJpa-qzLXKKCphTq-PkbeM0jwgXciQ11RaC39KVy4YquWDTptilb4LgGQCMDqVIeW5VnBBmhtJvAJhPo_E5RK-MCw", "p": "y6sKp6asFY-kv8hFEh_MPx-eTmZqr-g-CDEq7xgap9fI4LFGvemJv3isQcYJjPAFWreB0PF3uz6XlcK6x1CwjqWlNecQYUmDWq0kyJSvQ7Gn2txsIF6An5lkhSG_AQ-qLWay_WPmyjPXsxaF9aFM-QjTSW12wWcIKGCP0KSrhsM", "q": "uUCYSXKi-4h0Z43Ol_jqy1mCD-yaICt4CtJeZTMbC7CI9qVPUaNHni3fUBxTDgOdH6xJGMZ1XuUFn68fjPB_mPmKUimYCrqlBzhRh7axT6tdD4WQc8rpEHvaucGjp2dBXrCDve_RPyMI8HYRS5kKGmvqhVpnwT0iVq5KRCERgQs", "dp": "HFEzsguicXz_UwrtT4_MPhqPUCc9Pif0N_9eENAxJJUEAPmk9FK8LDsC-EIoocfddrd8_SgVlZsmSFRC0-OMKMkvJ0dxJ5WpBbp9GsZReAADbpKnFfkNuSMCrt_6RpN-_cEBselp9UMwAl5nUbeTlCx98_-cO1ev8q06UbATiTE", "dq": "bmEPnAvDEs6OVTlIVILLG5jchzJ57xsXbpNEDVZzEfcA1L1Q0prQTG6WtXv6_MmocDvOXgW5323keO32hZqy3GorQaNo5VOqiu_CnHN9mLPJQjtaA7RuRBUYEUBQi6lZaNsR1DU1X0I3zFb9HSc1vuJ4HTbtxVTwxecZdxig_ls", "qi": "RhNgmhA5ZNiHU0DoDoMzeaXVpwGxUZ_QkAmC1mc11SROp0khJmM-XfQBW5x6f8sYmX0zAj9EUh01dk1cKrg0dPX42c5nYItgo6ynFSJoSUkl_nu4tJysoCSh-3HtUtstooogDPQKUf4A9UAzgf1vrl95SRl-oL8MaVXlHm_o1KQ" } libjwt-3.3.3/tests/keys/rsa_pss_key_2048_384_pub.json000066400000000000000000000010431517612317300222720ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify" ], "kid": "9dd54a23-2662-41ac-b092-d75fc91412aa", "kty": "RSA", "alg": "PS384", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB" } libjwt-3.3.3/tests/keys/rsa_pss_key_2048_512.json000066400000000000000000000034751517612317300214300ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "a9a0eb5b-67e9-4495-9030-a97d063d4bb4", "kty": "RSA", "alg": "PS512", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB", "d": "DHjrOhthnAdtWVF_mi9sxen0_wKkbqQiZniWIu3jhZdGCpOVEKbWxhuq-B4FvlAqr9r1vMENtfFBDZNIVO6gtL7hoYOCJu-Fpertxp8eh0xZDbH96_M-e1JxSR_dmwyxCoix0xbdbbHmHmzvg05s_TL1NuRbNJYSNUJXZLWxK2NKmlw-lPRb360n7H5KFSXECNWBsI9rkJuPvO_HmEYotiAotpxlC3N9cYmFc-G-W6JHTcF7CR2DZOauE3MI5jJpa-qzLXKKCphTq-PkbeM0jwgXciQ11RaC39KVy4YquWDTptilb4LgGQCMDqVIeW5VnBBmhtJvAJhPo_E5RK-MCw", "p": "y6sKp6asFY-kv8hFEh_MPx-eTmZqr-g-CDEq7xgap9fI4LFGvemJv3isQcYJjPAFWreB0PF3uz6XlcK6x1CwjqWlNecQYUmDWq0kyJSvQ7Gn2txsIF6An5lkhSG_AQ-qLWay_WPmyjPXsxaF9aFM-QjTSW12wWcIKGCP0KSrhsM", "q": "uUCYSXKi-4h0Z43Ol_jqy1mCD-yaICt4CtJeZTMbC7CI9qVPUaNHni3fUBxTDgOdH6xJGMZ1XuUFn68fjPB_mPmKUimYCrqlBzhRh7axT6tdD4WQc8rpEHvaucGjp2dBXrCDve_RPyMI8HYRS5kKGmvqhVpnwT0iVq5KRCERgQs", "dp": "HFEzsguicXz_UwrtT4_MPhqPUCc9Pif0N_9eENAxJJUEAPmk9FK8LDsC-EIoocfddrd8_SgVlZsmSFRC0-OMKMkvJ0dxJ5WpBbp9GsZReAADbpKnFfkNuSMCrt_6RpN-_cEBselp9UMwAl5nUbeTlCx98_-cO1ev8q06UbATiTE", "dq": "bmEPnAvDEs6OVTlIVILLG5jchzJ57xsXbpNEDVZzEfcA1L1Q0prQTG6WtXv6_MmocDvOXgW5323keO32hZqy3GorQaNo5VOqiu_CnHN9mLPJQjtaA7RuRBUYEUBQi6lZaNsR1DU1X0I3zFb9HSc1vuJ4HTbtxVTwxecZdxig_ls", "qi": "RhNgmhA5ZNiHU0DoDoMzeaXVpwGxUZ_QkAmC1mc11SROp0khJmM-XfQBW5x6f8sYmX0zAj9EUh01dk1cKrg0dPX42c5nYItgo6ynFSJoSUkl_nu4tJysoCSh-3HtUtstooogDPQKUf4A9UAzgf1vrl95SRl-oL8MaVXlHm_o1KQ" } libjwt-3.3.3/tests/keys/rsa_pss_key_2048_512_pub.json000066400000000000000000000010431517612317300222630ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify" ], "kid": "9dd54a23-2662-41ac-b092-d75fc91412aa", "kty": "RSA", "alg": "PS512", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB" } libjwt-3.3.3/tests/keys/rsa_pss_key_2048_noalg.json000066400000000000000000000034751517612317300222210ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "a9a0eb5b-67e9-4495-9030-a97d063d4bb4", "kty": "RSA", "alg": "PS384", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB", "d": "DHjrOhthnAdtWVF_mi9sxen0_wKkbqQiZniWIu3jhZdGCpOVEKbWxhuq-B4FvlAqr9r1vMENtfFBDZNIVO6gtL7hoYOCJu-Fpertxp8eh0xZDbH96_M-e1JxSR_dmwyxCoix0xbdbbHmHmzvg05s_TL1NuRbNJYSNUJXZLWxK2NKmlw-lPRb360n7H5KFSXECNWBsI9rkJuPvO_HmEYotiAotpxlC3N9cYmFc-G-W6JHTcF7CR2DZOauE3MI5jJpa-qzLXKKCphTq-PkbeM0jwgXciQ11RaC39KVy4YquWDTptilb4LgGQCMDqVIeW5VnBBmhtJvAJhPo_E5RK-MCw", "p": "y6sKp6asFY-kv8hFEh_MPx-eTmZqr-g-CDEq7xgap9fI4LFGvemJv3isQcYJjPAFWreB0PF3uz6XlcK6x1CwjqWlNecQYUmDWq0kyJSvQ7Gn2txsIF6An5lkhSG_AQ-qLWay_WPmyjPXsxaF9aFM-QjTSW12wWcIKGCP0KSrhsM", "q": "uUCYSXKi-4h0Z43Ol_jqy1mCD-yaICt4CtJeZTMbC7CI9qVPUaNHni3fUBxTDgOdH6xJGMZ1XuUFn68fjPB_mPmKUimYCrqlBzhRh7axT6tdD4WQc8rpEHvaucGjp2dBXrCDve_RPyMI8HYRS5kKGmvqhVpnwT0iVq5KRCERgQs", "dp": "HFEzsguicXz_UwrtT4_MPhqPUCc9Pif0N_9eENAxJJUEAPmk9FK8LDsC-EIoocfddrd8_SgVlZsmSFRC0-OMKMkvJ0dxJ5WpBbp9GsZReAADbpKnFfkNuSMCrt_6RpN-_cEBselp9UMwAl5nUbeTlCx98_-cO1ev8q06UbATiTE", "dq": "bmEPnAvDEs6OVTlIVILLG5jchzJ57xsXbpNEDVZzEfcA1L1Q0prQTG6WtXv6_MmocDvOXgW5323keO32hZqy3GorQaNo5VOqiu_CnHN9mLPJQjtaA7RuRBUYEUBQi6lZaNsR1DU1X0I3zFb9HSc1vuJ4HTbtxVTwxecZdxig_ls", "qi": "RhNgmhA5ZNiHU0DoDoMzeaXVpwGxUZ_QkAmC1mc11SROp0khJmM-XfQBW5x6f8sYmX0zAj9EUh01dk1cKrg0dPX42c5nYItgo6ynFSJoSUkl_nu4tJysoCSh-3HtUtstooogDPQKUf4A9UAzgf1vrl95SRl-oL8MaVXlHm_o1KQ" } libjwt-3.3.3/tests/keys/rsa_pss_key_2048_notpss.json000066400000000000000000000065761517612317300224540ustar00rootroot00000000000000{ "libjwt.io:comment": "RSA key with no alg for use in RSASSA-PSS", "keys": [ { "use": "sig", "key_ops": [ "verify", "sign" ], "kid": "9c10cd27-de4a-4ffe-8ad9-b9a1c4a07218", "kty": "RSA", "n": "ybi_3guc70NLoGecAdyAo0dJYLRXCYFdx7Iaq20REXb5SsyqSjGV_KEr8sdyFhr_PasKb1XbV7G8_gdtxU-Sl5dGI9h8mymIQ7VzbyEhwQqjzdyCKoz2levKPgjsTDN93IQiNfSOfc4qUux5viWQaPWt3bzpvOZXHcMUbzEz_jahKZPU_hMq_N3DroE6xFYB91fb74qHOC5RGMPjskUYKOjCtj-v-sZqznuckf2x0a2r5X--gsqGZT8dHaX9smyrpBbV9Y_g1VZ-CO8XFdRiHWth98FnlbEeHsrXbho9CE2GEACWvRRApMn1uSpghpENbkefpbYCIN7tq6X4lKvSYQZARiLkD1ELHcmWCX-cpIlfxihrKpVnRR4iLJNl33VtOBIPaMvtifojkLxsi3dtyJkcEFQI_kXbKW8Kdw5Fd-UOcsQf8PKk7k9LgFaH8GZRFhbwT0bLjjy0UIV5NDHcSozydV2uQh-ON6BsygCSvME8V4lu9z74Rq3T7eP25pC-Q0mN-1n7QGQL4zKshkKNh6Rx-QCP0hVGNosL6MoLzseluapTqnHrQEHTbG1Jm-WL_ces3thH7PySyWKJcUQ_iWBD0FFkya0KTvTfWvBg_WPdqBHLIQh6ie_7lOFyE56FbRYuRU0cF8-NykA_6HN247pFtw1PSgQ68Dqtv9bZMFU", "e": "AQAB", "d": "IwY78h7MEdL6Z5B1yvDxOOhgujS1xAW9NbYb4VXfl8uzfyRIEPfJFgMZ8V5l1aa8WIXBGxGqMvC-YtEBYzfsuPtgB0tIX1x3t2Hi-BGlnbHuPQkjZKXzDpbRF7JO7PAn00jx87JRp1BLkvhSLwywpTi7BnwNjWnlCFrdymydnW74zpJHchH77cnHdx4jCQHx93M-0bmYvs1z8TvZ5hMPHdNEM4adVIps8wsNZV_KJyDjbsaeWnE1opCxynsOsJMjvirk3W0s2X3aBk0VEgo9OuRxLyZaiOgm1avcedZ-cFmdhFvF0HCaxMH4Mz1DYzn-Pf6bnpcaiYCLfbkkjxPCRB1bUjsCsQsRs33os8VBvfKePK_B_Y5bDsJTh_vfJiVflqgckdr2R_RDQ50BLL-Ep44oAjt3wh9X85ccAQXoVKbfSwLADh2LsZFV_gsiVLWjGavvV43zfRzwubVsH_2w2H7gfXO3JoXHuNX3O-5W3hfrMxFQ7Ozjb3rcq28rkajTloG7fBVSlNmQc33cfvvKCLddN-eL6xK4k_xqd92DC-DEfqQgTKsVszDlmViRMOMX2Ebnnve5xsuAyhddFdRamrrrZ2gWO-WvTR5NMo91viluqWxbDWWqAnzpvY2XpAeWvcyNux57UIqWsbuJ6RDBjAyVsbvFRIzBxNbKfEzR5uE", "p": "8FFVC2zHBS8-o3i8niu3NY5ncJtmkT-5hpag567rWfP5Vzrvuih0BAW4t0gHCQCcS8ur_pQ7m72Cf8FA60a8S2djetTq8xbf1jQ0aSuqmJtRBH1DT2qKZT6OHY9EOhKZpOQzFPk_rscHHVH9q8PDvHVaz85dwRbb1D8EqRDDcvbqpyWwwMWkgndx0I6qV9GTcK6HzCtJIZHQsTl1k2IEdheawhZrXYlPEI1YQbR44lxxeBVH-P-1dEhiEnQQwj9dzlfPseqY5kf81ST4YZZPosZeQ4FyOu_IxsJqBmO27puOkmYXfbbhTMkSJSdeS7BatqQnbUBi10rpZCP2vDbV2Q", "q": "1uKlFl2FfsEQfq7d7GiNqNrEYnxK52lH19Yvgvfy27LtnDppBESr5ULPZcCFZ9kdY-8UxYoNZjGnZ-HVBEFhbOI1X606eLsvI4rnM-HG33cEYSVIuceUfc-OHkKuWLvOS2fE98ULgjVNItYAvN1FfiUpkt05ojp_4OPZMWHmdDV24u4_BDzqr9p6A-tmhKPHtyxdaX2yIXM6nFNx4vlmhgLZ-62xprLWVuT5SCo30PonKtsbgpkJ_bE_x_gacMH8J-NEGstt_oDsvHvvT3RGJiGveNTQPZ2mKmkZaZ5x8TTpk7LEw56PCn21pftBuH0bg_aMvC4fWfh47uVTgJa03Q", "dp": "FjmfYOAdg9g7tcibwREP748M9_gXQ0WeddkGZobh0z7iB3Q26YOGPzz8OU8a_3Uj_0qFzJSO8rdTE1efFmNDVMHqDFkWpYavCtNnKXbVXym2E3E2QWj8BaMEZ61xROGlff9wzfbDMfnMKaUEjdccChjcXi2atBnWGMn_N1eKi95UE0NEFn_w1_QN_ZjEHj0OorQxcOtr5wPiRhGnUwsUmItUT7DdGxhwzHoV-HWlXGHqSI3HSzry4B81mrlLN3u-xC-Q0MZ-f4WW12uE4RmSod4wp5OYKeU1L1SZk5-zMlwGknmIoKLCMWTDHdaHPP7BVPTXhJ4YxgpyjUVaM0vq-Q", "dq": "NOGRvu9E6uyYIpTmCEeylNtBePsdc9V02KjdCF38ZhSiZM_7CBHeO401fNTj_6pukSlE81gF9CBEEkyBH4r3btQ8Tk9TFGL8NsL4IsxtJJElgsKqIw36fPuW_dtrDGsrWWMwFcloC6MSWIBRrijF8UUz9fB7PnEnBzELQhvVmsONfksjNufG2X_qhwxnLj0f6PQCCPPl4lV5Fv9yB2lY0aHiAw27qkpYdQnkTt4U3lixStqg6oK-8q-sAooL97PFWguTtwRZDUis-bWGLwduO_QOOq4kkQU63zT-C__yCmn7EV3tDjb2_J3zFeW_RqeDHfaOq8Ct9nYvTJsi8YIl", "qi": "z-UlWCzIiVTW6D8OZ4ZlCa2HQlB2SBWyTu_EzrvfL_SzIvEzdaT_UFvJJD-VwhyQU3jeQBnN71sc49i2Iu--pvcRmkryKXXfctqDN13Oxe8qIzzG70YSUZNJxoag2bJWTm8vyzpwod7EHQJ7TLVGLbcrLANjpFSCpyVjJWnIFFlisCbgTbi-hGtYg65xhvTKM54wlXimYTObx434-q3pBzrRmX6LO-UMhryoyruSwVVyQHRFHfiKqRrzLQCErhXXNm9D1kQ2U7a5SP9ZH78Lg1ZZFi1-wphTzhe5LLci5R_BoEcfJyGbKdrV6eKd-Jy0Ie9NleUNZiWnlR_wgNet3g" } ] } libjwt-3.3.3/tests/keys/rsa_pss_key_2048_notpss_pub.json000066400000000000000000000016721517612317300233120ustar00rootroot00000000000000{ "libjwt.io:comment": "RSA key with no alg for use in RSASSA-PSS", "keys": [ { "use": "sig", "key_ops": [ "verify" ], "kid": "d5bf8cf1-bc4a-482f-920c-b90b8097f118", "kty": "RSA", "n": "ybi_3guc70NLoGecAdyAo0dJYLRXCYFdx7Iaq20REXb5SsyqSjGV_KEr8sdyFhr_PasKb1XbV7G8_gdtxU-Sl5dGI9h8mymIQ7VzbyEhwQqjzdyCKoz2levKPgjsTDN93IQiNfSOfc4qUux5viWQaPWt3bzpvOZXHcMUbzEz_jahKZPU_hMq_N3DroE6xFYB91fb74qHOC5RGMPjskUYKOjCtj-v-sZqznuckf2x0a2r5X--gsqGZT8dHaX9smyrpBbV9Y_g1VZ-CO8XFdRiHWth98FnlbEeHsrXbho9CE2GEACWvRRApMn1uSpghpENbkefpbYCIN7tq6X4lKvSYQZARiLkD1ELHcmWCX-cpIlfxihrKpVnRR4iLJNl33VtOBIPaMvtifojkLxsi3dtyJkcEFQI_kXbKW8Kdw5Fd-UOcsQf8PKk7k9LgFaH8GZRFhbwT0bLjjy0UIV5NDHcSozydV2uQh-ON6BsygCSvME8V4lu9z74Rq3T7eP25pC-Q0mN-1n7QGQL4zKshkKNh6Rx-QCP0hVGNosL6MoLzseluapTqnHrQEHTbG1Jm-WL_ces3thH7PySyWKJcUQ_iWBD0FFkya0KTvTfWvBg_WPdqBHLIQh6ie_7lOFyE56FbRYuRU0cF8-NykA_6HN247pFtw1PSgQ68Dqtv9bZMFU", "e": "AQAB" } ] } libjwt-3.3.3/tests/keys/rsa_pss_key_2048_pub.json000066400000000000000000000010431517612317300216740ustar00rootroot00000000000000 { "use": "sig", "key_ops": [ "verify" ], "kid": "9dd54a23-2662-41ac-b092-d75fc91412aa", "kty": "RSA", "alg": "PS256", "n": "k2H-nc6pcHePEz7liCxy4sYXBbrks3jgmTyQo3nwfpEKecbPu8qraXg5Ogjm9LzfIapk3Jm_eFtY-zEhqgOTDipc_aXRhTZg71AHh-GgF7EtatrDwXs0Cs6M-dhF0MZpgqrUt2RgkjMD3CfgztfJVLi6KOeEcwfZ7zbjuvEGc7pvQrivNksvpxlOVVDYtF0o_kEWNGJB4djr5iJek2ZOO3Ij3iPw3bBx_nBO4p2NXb7j8mFcnbzyABNPGwr94SyXmWTNhtMYUrfYpjWcBp79H6FxXHRu0JZajYCIe95RrxQ23L1zBIZwhD1VJgYVGdhMfB9mfbo7FmxDwYaAmDoNYQ", "e": "AQAB" } libjwt-3.3.3/tests/misc/000077500000000000000000000000001517612317300151165ustar00rootroot00000000000000libjwt-3.3.3/tests/misc/ruby-eddsa.rb000077500000000000000000000015731517612317300175130ustar00rootroot00000000000000#!/usr/bin/env ruby # Public domain, no copyright. Use at your own risk. # gem install jwt-eddsa require "jwt/eddsa" # EdDSA Token generated by LibJWT # Key generated by OpenSSL (keys/eddsa_key_ed25519-pub.pem) # The pub key was converted to 32-bytes with some openssl and CLI magic token = "eyJhbGciOiJFRERTQSIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0NzU5ODA1NDUsImlzc" + "yI6ImZpbGVzLm1hY2xhcmEtbGxjLmNvbSIsInJlZiI6IlhYWFgtWVlZWS1aWlpaLUF" + "BQUEtQ0NDQyIsInN1YiI6InVzZXIwIn0.19ip2DFFjaZ_UFVCo0OtdwuzSmOYModle" + "JVeFcAjb_4hrAAf0pZSf8O78pivbXLJenEIsaZ9REFOauBeDxbTBw" pub_key = "\x1d\x48\xfe\xd7\x89\x0d\xe8\xde\x22\xe6\xa3\x55\x91\xf1\x21\xc0" + "\xa8\x82\x7f\xeb\x52\xae\xf4\x47\xb2\xd4\x1d\xb5\x5f\x1a\xe5\x03" verify_key = Ed25519::VerifyKey.new(pub_key) payload, header = JWT.decode(token, verify_key, true, algorithm: "EdDSA") puts payload puts header libjwt-3.3.3/tests/test-env.sh000066400000000000000000000002061517612317300162620ustar00rootroot00000000000000if [ "$TEST" = "jwt_new" ]; then export JWT_CRYPTO=openssl elif [ "$TEST" = "jwt_flipflop" ]; then export JWT_CRYPTO=NONEXISTENT fi libjwt-3.3.3/tools/000077500000000000000000000000001517612317300141615ustar00rootroot00000000000000libjwt-3.3.3/tools/Makefile000066400000000000000000000004101517612317300156140ustar00rootroot00000000000000PANDOC ?= pandoc MANSECTION ?= 1 MANPAGE.md = $(PANDOC) --standalone $(PANDOCFLAGS) --to man MAN_PAGES = jwt-verify.1 jwt-generate.1 key2jwk.1 jwk2key.1 all: $(MAN_PAGES) %.$(MANSECTION): %.$(MANSECTION).md $(MANPAGE.md) $< -o $@ clean: rm -f $(MAN_PAGES) libjwt-3.3.3/tools/TODO.md000066400000000000000000000003251517612317300152500ustar00rootroot00000000000000= TODO == jwt-generate - if we pass file:xxxx to -j, assume it is a file to read in the json from == Common === JWK handling - CLI option to select key the JWKS by index - CLI option to select key by ``kid`` libjwt-3.3.3/tools/example.sh000077500000000000000000000012661517612317300161600ustar00rootroot00000000000000#!/bin/bash if command -v jq > /dev/null; then JQ="--print=jq -C" fi KEY=jwt-test-key.bin JWK=jwk-test-key.json if [ ! -e "${KEY}" ]; then echo Creating 512 bit binary random key dd if=/dev/urandom bs=1 count=64 "of=${KEY}" fi if [ ! -e "$JWK" ]; then echo Converting key to JWK key2jwk -o "${JWK}" "${KEY}" if [ -n "$JQ" ]; then cat "${JWK}" | jq -C else cat "${JWK}" fi fi TOKEN=jwt-test-token EXP="$(date -d '+7 days' +%s)" echo Generating token jwt-generate -k "${JWK}" \ -c s:group=staff \ -c b:admin=false \ -c s:iss=disk.swissdisk.com \ -c s:user=bcollins \ -c i:exp=${EXP} > ${TOKEN} echo Verifying token cat ${TOKEN} | jwt-verify -k "${JWK}" "${JQ}" -v - libjwt-3.3.3/tools/jwk2key.1000066400000000000000000000043441517612317300156360ustar00rootroot00000000000000.\" Automatically generated by Pandoc 3.1.11.1 .\" .TH "JWK2KEY" "1" "" "jwk2key User Manual" "LibJWT C Library" .SH NAME \f[B]jwk2key\f[R] \- Export JSON Web Keys to PKCS8 .SH SYNOPSIS .PP \f[B]jwk2key\f[R] \f[B][options]\f[R] [FILE]\&... .SH DESCRIPTION \f[B]jwk2key\f[R] Takes JSON Web Key files and exports each key to a PKCS8 PEM file .PP This program will parse a JSON Web Key or Set and write out the individual files to DIR (by default `\f[B].\f[R]'). Output directory must exist. You should make sure the permissions on the output directory are such that they cannot be accessed by others. .PP JWK files must be listed after any options. A \f[B]\-\f[R] will be interpreted as \f[I]stdin\f[R]. .PP All \f[I]RSA\f[R] key types will be written as plain \f[I]RSA\f[R] keys, including \f[I]RSASSA\-PSS\f[R] keys, unless it has a \f[I]PS256\f[R], \f[I]PS384\f[R], or \f[I]PS512\f[R] \f[B]alg\f[R] attribute. .PP All keys are written in PKCS8 PEM format, except key type \f[I]OCT\f[R], which is written as a binary file (.bin extension). .PP By default, existing files will not be overwritten. If you use the \f[B]\-\-retry\f[R] option, an attempt will be made to add \-1 to the file name, up to \-9, in an attempt to create the file. .PP Output file naming is based on (hopefully) unique characteristics, including: .IP \[bu] 2 \f[B]Key type\f[R] E.g. \f[B]rsa\f[R], \f[B]ec\f[R], etc. .IP \[bu] 2 \f[B]Bits\f[R] in the key. E.g. 2048 for an \f[I]RSA\f[R] key, or 384 for an \f[I]EC\f[R] key. .IP \[bu] 2 \f[B]Private\f[R] vs \f[B]Public\f[R]. Public keys will have \f[B]_pub\f[R] added to the end of the filename (before the extension). .IP \[bu] 2 Most importantly, the \f[B]kid\f[R] attribute, which is supposed to be unique. .SS Options .TP \f[B]\-h\f[R], \f[B]\-\-help\f[R] Show common options and quit. .TP \f[B]\-r\f[R], \f[B]\-\-retry\f[R] Retry if output file exists. .TP \f[B]\-d\f[R] \f[I]DIR\f[R], \f[B]\-\-dir\f[R]=\f[I]DIR\f[R] Directory to write key files to (default is `\f[B].\f[R]'). .SH BUGS See GitHub Issues: \c .UR https://github.com/benmcollins/libjwt/issues .UE \c .SH AUTHOR \f[B]jwk2key\f[R] written by Ben Collins \c .MT bcollins@libjwt.io .ME \c \&. .SH SEE ALSO \f[B]jwt\-verify(1)\f[R], \f[B]jwt\-generate(1)\f[R], \f[B]key2jwk(1)\f[R] libjwt-3.3.3/tools/jwk2key.1.md000066400000000000000000000035201517612317300162300ustar00rootroot00000000000000% JWK2KEY(1) jwk2key User Manual | LibJWT C Library # NAME **jwk2key** - Export JSON Web Keys to PKCS8 # SYNOPSIS | **jwk2key** **\[options]** \ [FILE]... # DESCRIPTION **jwk2key** Takes JSON Web Key files and exports each key to a PKCS8 PEM file This program will parse a JSON Web Key or Set and write out the individual files to DIR (by default '**.**'). Output directory must exist. You should make sure the permissions on the output directory are such that they cannot be accessed by others. JWK files must be listed after any options. A **-** will be interpreted as _stdin_. All _RSA_ key types will be written as plain _RSA_ keys, including _RSASSA-PSS_ keys, unless it has a _PS256_, _PS384_, or _PS512_ **alg** attribute. All keys are written in PKCS8 PEM format, except key type _OCT_, which is written as a binary file (.bin extension). By default, existing files will not be overwritten. If you use the **\-\-retry** option, an attempt will be made to add -1 to the file name, up to -9, in an attempt to create the file. Output file naming is based on (hopefully) unique characteristics, including: - **Key type** E.g. **rsa**, **ec**, etc. - **Bits** in the key. E.g. 2048 for an _RSA_ key, or 384 for an _EC_ key. - **Private** vs **Public**. Public keys will have **\_pub** added to the end of the filename (before the extension). - Most importantly, the **kid** attribute, which is supposed to be unique. ## Options **\-h**, **\-\-help** ~ Show common options and quit. **\-r**, **\-\-retry** ~ Retry if output file exists. **\-d** _DIR_, **\-\-dir**=_DIR_ ~ Directory to write key files to (default is '**.**'). # BUGS See GitHub Issues: # AUTHOR **jwk2key** written by Ben Collins . # SEE ALSO **jwt-verify(1)**, **jwt-generate(1)**, **key2jwk(1)** libjwt-3.3.3/tools/jwk2key.c000066400000000000000000000131451517612317300157170ustar00rootroot00000000000000/* Copyright (C) 2024-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include "jwt-util.h" static char *out_dir; static int retry; /* Reject path components that could cause directory traversal */ static int is_safe_filename_part(const char *s) { if (s == NULL || s[0] == '\0') return 0; if (strstr(s, "..")) return 0; if (strchr(s, '/') || strchr(s, '\\')) return 0; return 1; } static void write_key_file(const jwk_item_t *item) { const char *pre, *name; int priv = jwks_item_is_private(item); char file_name[BUFSIZ]; char *ext = ".pem"; char bits[8]; FILE *fp; int i; if (jwks_item_error(item)) return; switch (jwks_item_kty(item)) { case JWK_KEY_TYPE_OCT: pre = "oct"; ext = ".bin"; sprintf(bits, "%d", jwks_item_key_bits(item)); name = bits; break; case JWK_KEY_TYPE_EC: pre = "ec"; name = jwks_item_curve(item); break; case JWK_KEY_TYPE_RSA: sprintf(bits, "%d", jwks_item_key_bits(item)); name = bits; switch (jwks_item_alg(item)) { case JWT_ALG_PS256: case JWT_ALG_PS384: case JWT_ALG_PS512: pre = "rsa_pss"; break; default: pre = "rsa"; } break; case JWK_KEY_TYPE_OKP: pre = "eddsa"; name = "ED25519"; break; default: fprintf(stderr, "Unknown kty\n"); return; } if (!is_safe_filename_part(name)) { fprintf(stderr, "Skipping key with unsafe name: %s\n", name ? name : "(null)"); return; } if (jwks_item_kid(item) == NULL) { snprintf(file_name, sizeof(file_name), "%s/%s_%s%s%s", out_dir, pre, name, priv ? "" : "_pub", ext); } else if (!is_safe_filename_part(jwks_item_kid(item))) { fprintf(stderr, "Skipping key with unsafe kid: %s\n", jwks_item_kid(item)); return; } else { snprintf(file_name, sizeof(file_name), "%s/%s_%s_%s%s%s", out_dir, pre, name, jwks_item_kid(item), priv ? "" : "_pub", ext); } for (i = 0; i < 10; i++) { char *p; fp = fopen(file_name, "wx"); if (fp || !retry || errno != EEXIST || i >= 9) break; p = file_name + strlen(file_name) - strlen(ext); if (i == 0) { *p++ = '-'; *p++ = '1'; strcpy(p, ext); } else { p = p - 1; *p = '1' + i; } } if (fp == NULL) { perror(file_name); return; } if (jwks_item_kty(item) == JWK_KEY_TYPE_OCT) { const unsigned char *buf; size_t len; jwks_item_key_oct(item, &buf, &len); fwrite(buf, 1, len, fp); } else { fputs(jwks_item_pem(item), fp); } fclose(fp); } static int check_directory(const char *path) { struct stat info; if (stat(path, &info) != 0) return 0; if (!(info.st_mode & S_IFDIR)) return 0; if (access(path, R_OK | X_OK) != 0) return 0; return 1; } _Noreturn static void usage(const char *error, int exit_state) { if (error) fprintf(stderr, "ERROR: %s\n\n", error); fprintf(stderr, "\ Usage: %s [OPTIONS] [FILE]...\n\ \n\ Parse JSON Web Key format and write out individual key files\n\ \n\ -h, --help This help information\n\ -r, --retry Retry if output file exists\n\ -d, --dir=DIR Directory to write key files to\n\ \n\ This program will parse a JSON Web Key or Set and write out the individual\n\ files to DIR (by default '.'). Output directory must exist. You should make\n\ sure the permissions on the output directory are such that they cannot be\n\ accessed by others.\n\ \n\ JWK files must be listed after any options. A '-' will be interpreted as\n\ stdin.\n\ \n\ All RSA key types will be written as plain RSA keys, including RSASSA-PSS\n\ keys, unless it has a PS256, PS384, or PS512 'alg' attribute.\n\ \n\ All keys are written in PKCS8 PEM format, except key type 'OCT', which is\n\ written as a binary file (.bin extension).\n\ \n\ By default, existing files will not be overwritten. If you use the --retry\n\ option, an attempt will be made to add -X to the file name, up to -9, in\n\ an attempt to create the file.\n", get_progname()); exit(exit_state); } int main(int argc, char **argv) { jwk_set_t *jwk_set = NULL; const jwk_item_t *item; int i, oc; char *optstr = "hd:r"; struct option opttbl[] = { { "help", no_argument, NULL, 'h' }, { "dir", required_argument, NULL, 'd' }, { "retry", no_argument, NULL, 'r' }, { NULL, 0, 0, 0 }, }; while ((oc = getopt_long(argc, argv, optstr, opttbl, NULL)) != -1) { switch (oc) { case 'h': usage(NULL, EXIT_SUCCESS); case 'd': out_dir = optarg; break; case 'r': retry = 1; break; default: /* '?' */ usage("Unknown option", EXIT_FAILURE); break; } } argc -= optind; argv += optind; if (argc == 0) usage("No files to read", EXIT_FAILURE); if (out_dir == NULL || out_dir[0] == '\0') out_dir = "."; if (!check_directory(out_dir)) { fprintf(stderr, "%s: doesn't exist or no access\n", out_dir); } jwk_set = jwks_create(NULL); if (jwk_set == NULL) { perror("Failed to create JWKS"); exit(EXIT_FAILURE); } for (i = 0; i < argc; i++) { char *file = argv[i]; if (file[0] == '-' && file[1] == '\0') jwks_load_fromfp(jwk_set, stdin); else jwks_load_fromfile(jwk_set, file); if (jwks_error(jwk_set)) { fprintf(stderr, "Error reading %s: %s\n", file, jwks_error_msg(jwk_set)); } } for (i = 0; (item = jwks_item_get(jwk_set, i)); i++) write_key_file(item); exit(EXIT_SUCCESS); } libjwt-3.3.3/tools/jwt-generate.1000066400000000000000000000076101517612317300166430ustar00rootroot00000000000000.\" Automatically generated by Pandoc 3.7.0.2 .\" .TH "JWT\-GENERATE" "1" "" "jwt\-generate User Manual" "LibJWT C Library" .SH NAME \f[B]jwt\-generate\f[R] \- Generate a JSON Web Token .SH SYNOPSIS .PP \f[B]jwt\-generate\f[R] \f[B][options]\f[R] .SH DESCRIPTION \f[B]jwt\-generate\f[R] Generates and (optionally) signs a JSON Web Token. .PP By default this will simply encode a JWT. If you want a signature, then you must give a JWK key with the \f[B]\-k\f[R] option. Generating a signature requires specifying the algorithm, so it must either be in the key file (as the \f[B]alg\f[R] attribute), or passed on the command line with the \f[B]\-a\f[R] argument. .PP If \f[B]\-a\f[R] is specified and the key has an \f[B]alg\f[R] attribute, they must match. .PP One token will be generated for each call. You can specify claims using the \f[B]\-c\f[R] option. By default, \f[B]jwt\-generate\f[R] will add the \f[B]iat\f[R] claim, which is \f[B]Issued At\f[R] and is the time in seconds since the \f[I]Unix Epcoch\f[R]. .PP When using the \f[B]\-\-verbose\f[R] option, \f[B]jwt\-generate\f[R] will print the JSON \f[I]HEADER\f[R] and \f[I]PAYLOAD\f[R] to \f[B]stdout\f[R]. .PP If used in conjunction with \f[B]\-\-print\f[R], the JSON will be piped to the command\(cqs \f[B]stdin\f[R]. It will be called twice: once for \f[I]HEAD\f[R] and once for \f[I]PAYLOAD\f[R]. .PP One use is to pass it through \f[B]jq \-C\f[R] for indenting and colorization. Another would be to use an external program to inspect the \f[I]PAYLOAD\f[R] contents. A non\-0 exit status from the program will cause generating the token to fail. .SS Options .TP \f[B]\-h\f[R], \f[B]\-\-help\f[R] Show common options and quit. .TP \f[B]\-l\f[R], \f[B]\-\-list\f[R] List all supported algorithms that can be passed to the \f[B]\-a\f[R] option and quit. .TP \f[B]\-v\f[R], \f[B]\-\-verbose\f[R] Show the contents of the \f[I]HEADER\f[R] and \f[I]PAYLOAD\f[R] of the JWT in addition to generating the token. \f[B]NOTE\f[R] the header will not show the \f[B]typ\f[R] or \f[B]alg\f[R] attributes since they do not get added until the final step. .TP \f[B]\-q\f[R], \f[B]\-\-quiet\f[R] Do not output anything except for hard errors. On success you will only see the token generared. .TP \f[B]\-n\f[R], \f[B]\-\-no\-iat\f[R] Do not add the iat (Issued\-At) time to the token. Useful for a slightly smaller token, and for reproducible output. .TP \f[B]\-a\f[R] \f[I]ALG\f[R], \f[B]\-\-algorithm\f[R]=\f[I]ALG\f[R] Specify the algorithm to be used when signing the token. .TP \f[B]\-k\f[R] \f[I]FILE\f[R], \f[B]\-\-key\f[R]=\f[I]FILE\f[R] Path to a file containing a key in JSON Web Key format. If your keys are in PEM or DER (or some other common format that \f[I]OpenSSL\f[R] understands), then you can convert it to a JWK with the \f[B]key2jwk(1)\f[R] tool. .TP \f[B]\-c\f[R] \f[I]CLAIM\f[R], \f[B]\-\-claim\f[R]=\f[I]CLAIM\f[R] Add a claim to the JWT. The format of \f[I]CLAIM\f[R] is \f[B]t\f[R]:\f[B]key\f[R]=\f[B]value\f[R] Where \f[B]t\f[R] is the type and is one of \f[B]i\f[R] for integer, \f[B]s\f[R] for string, or \f[B]b\f[R] for boolean. The value for integer must be parseable by \f[B]strtol(3)\f[R]. For boolean, any value starting with \f[B]0\f[R], \f[B]f\f[R], or \f[B]F\f[R] will be interpreted as \f[B]false\f[R]. Anything else will be considered \f[B]true\f[R]. They \f[B]key\f[R] is any \f[I]ASCII\f[R] string. .TP \f[B]\-j\f[R] \f[I]JSON\f[R], \f[B]\-\-json\f[R]=\f[I]JSON\f[R] Use JSON string as the payload of the token. This will not replace, but be added to the payload. The string must be in valid JSON, meaning either a \f[B]{}\f[R] object or a \f[B][]\f[R] array. .SH BUGS See GitHub Issues: \c .UR https://github.com/benmcollins/libjwt/issues .UE \c .SH AUTHOR \f[B]jwt\-generate\f[R] was originally written by Jeremy Thien. Major rewriting and man page by Ben Collins \c .MT bcollins@libjwt.io .ME \c \&. .SH SEE ALSO \f[B]jwt\-verify(1)\f[R], \f[B]key2jwk(1)\f[R], \f[B]jwk2key(1)\f[R] libjwt-3.3.3/tools/jwt-generate.1.md000066400000000000000000000064421517612317300172440ustar00rootroot00000000000000% JWT-GENERATE(1) jwt-generate User Manual | LibJWT C Library # NAME **jwt-generate** - Generate a JSON Web Token # SYNOPSIS | **jwt-generate** **\[options]** # DESCRIPTION **jwt-generate** Generates and (optionally) signs a JSON Web Token. By default this will simply encode a JWT. If you want a signature, then you must give a JWK key with the **-k** option. Generating a signature requires specifying the algorithm, so it must either be in the key file (as the **alg** attribute), or passed on the command line with the **-a** argument. If **-a** is specified and the key has an **alg** attribute, they must match. One token will be generated for each call. You can specify claims using the **-c** option. By default, **jwt-generate** will add the **iat** claim, which is **Issued At** and is the time in seconds since the *Unix Epcoch*. When using the **\-\-verbose** option, **jwt-generate** will print the JSON _HEADER_ and _PAYLOAD_ to **stdout**. If used in conjunction with **\-\-print**, the JSON will be piped to the command's **stdin**. It will be called twice: once for _HEAD_ and once for _PAYLOAD_. One use is to pass it through **jq -C** for indenting and colorization. Another would be to use an external program to inspect the _PAYLOAD_ contents. A non-0 exit status from the program will cause generating the token to fail. ## Options **\-h**, **\-\-help** ~ Show common options and quit. **\-l**, **\-\-list** ~ List all supported algorithms that can be passed to the **-a** option and quit. **\-v**, **\-\-verbose** ~ Show the contents of the _HEADER_ and _PAYLOAD_ of the JWT in addition to generating the token. **NOTE** the header will not show the **typ** or **alg** attributes since they do not get added until the final step. **\-q**, **\-\-quiet** ~ Do not output anything except for hard errors. On success you will only see the token generared. **\-n**, **\-\-no-iat** ~ Do not add the iat (Issued-At) time to the token. Useful for a slightly smaller token, and for reproducible output. **\-a** _ALG_, **\-\-algorithm**=_ALG_ ~ Specify the algorithm to be used when signing the token. **\-k** _FILE_, **\-\-key**=_FILE_ ~ Path to a file containing a key in JSON Web Key format. If your keys are in PEM or DER (or some other common format that _OpenSSL_ understands), then you can convert it to a JWK with the **key2jwk(1)** tool. **\-c** _CLAIM_, **\-\-claim**=_CLAIM_ ~ Add a claim to the JWT. The format of _CLAIM_ is **t**:**key**=**value** Where **t** is the type and is one of **i** for integer, **s** for string, or **b** for boolean. The value for integer must be parseable by **strtol(3)**. For boolean, any value starting with **0**, **f**, or **F** will be interpreted as **false**. Anything else will be considered **true**. They **key** is any *ASCII* string. **\-j** _JSON_, **\-\-json**=_JSON_ ~ Use JSON string as the payload of the token. This will not replace, but be added to the payload. The string must be in valid JSON, meaning either a **{}** object or a **[]** array. # BUGS See GitHub Issues: # AUTHOR **jwt-generate** was originally written by Jeremy Thien. Major rewriting and man page by Ben Collins . # SEE ALSO **jwt-verify(1)**, **key2jwk(1)**, **jwk2key(1)** libjwt-3.3.3/tools/jwt-generate.c000066400000000000000000000175251517612317300167330ustar00rootroot00000000000000/* Copyright (C) 2019 Jeremy Thien Copyright (C) 2024-2025 maClara, LLC This file is part of the JWT C Library This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include "jwt-util.h" _Noreturn static void usage(const char *error, int exit_state) { if (error) fprintf(stderr, "ERROR: %s\n\n", error); fprintf(stderr, "\ Usage: %s [OPTIONS]\n\ \n\ Generate and (optionally) sign a JSON Web Token\n\ \n\ -h, --help This help information\n\ -l, --list List supported algorithms and exit\n\ -a, --algorithm=ALG JWT algorithm to use (e.g. ES256). Only needed if the\n\ key provided with -k does not have an \"alg\"\n\ attribute\n\ -p, --print=CMD When printing JSON, pipe through CMD\n\ -n, --no-iat Disable adding iat (Issued-At) to token\n\ -k, --key=FILE Filename containing a JSON Web Key\n\ -c, --claim=t:k=v Add a claim to the JWT\n\ t One of i, s, or b for integer, string or boolean\n\ k The key for this claim\n\ v The value of the claim. For integer, must be parsable\n\ by strtol(). For boolean, if the value starts with 'f',\n\ 'F', or '0' it is taken as false. Anything else is true.\n\ -j, --json=STRING JSON string to be used as the body of the token.\n\ -q, --quiet No output other than the generated token\n\ -v, --verbose Show encoded header and payload while generating. Note that\n\ the header will not show the 'typ' and 'alg' attributes as\n\ they are not added until just before signing.\n\ \n\ This program will encode and sign a token in JWT format.\n\ \n\ For the --print option, output will be piped to the command's stdin. This\n\ is useful if you wanted to use something like `jq -C` to colorize it. A\n\ non-0 exit status will stop the token from getting generated.\n\ \n\ If you need to convert a key to JWT (e.g. from PEM or DER format) see\n\ key2jwk(1).\n", get_progname()); exit(exit_state); } int main(int argc, char *argv[]) { char *t = NULL, *k = NULL, *v = NULL; jwk_set_auto_t *jwk_set = NULL; const jwk_item_t *item = NULL; char* json = NULL; jwt_builder_auto_t *builder = NULL; jwt_value_t jval; char *token; char *key_file = NULL; jwt_alg_t alg = JWT_ALG_NONE; int oc = 0; int verbose = 0; int quiet = 0; int emit_iat = 1; char *optstr = "a:c:b:hj:k:lnp:qv"; struct option opttbl[] = { { "algorithm", required_argument, NULL, 'a' }, { "claim", required_argument, NULL, 'c' }, { "help", no_argument, NULL, 'h' }, { "json", required_argument, NULL, 'j' }, { "key", required_argument, NULL, 'k' }, { "list", no_argument, NULL, 'l' }, { "no-iat", no_argument, NULL, 'n' }, { "print", required_argument, NULL, 'p' }, { "quiet", no_argument, NULL, 'q' }, { "verbose", no_argument, NULL, 'v' }, { NULL, 0, 0, 0 }, }; builder = jwt_builder_new(); if (builder == NULL) { fprintf(stderr, "Could not allocate builder context\n"); exit(EXIT_FAILURE); } while ((oc = getopt_long(argc, argv, optstr, opttbl, NULL)) != -1) { switch (oc) { case 'q': if (verbose) usage("Using -q and -v makes no sense", EXIT_FAILURE); quiet = 1; break; case 'v': if (quiet) usage("Using -q and -v makes no sense", EXIT_FAILURE); verbose = 1; break; case 'p': pipe_cmd = optarg; break; case 'l': printf("Algorithms supported:\n"); for (alg = JWT_ALG_NONE; alg < JWT_ALG_INVAL; alg++) printf(" %s\n", jwt_alg_str(alg)); exit(EXIT_SUCCESS); break; case 'k': key_file = optarg; break; case 'n': emit_iat = 0; break; case 'a': alg = jwt_str_alg(optarg); if (alg >= JWT_ALG_INVAL) { usage("Unknown algorithm (use -l to see a list of " "supported algorithms)\n", EXIT_FAILURE); } break; case 'c': t = strtok(optarg, ":"); if (t == NULL) { fprintf(stderr, "Invalid claim format [%s]\n", optarg); exit(EXIT_FAILURE); } k = strtok(NULL, "="); if (k == NULL) { fprintf(stderr, "Invalid claim format [%s]\n", optarg); exit(EXIT_FAILURE); } v = strtok(NULL, "="); if (v == NULL) { fprintf(stderr, "Invalid claim format [%s]\n", optarg); exit(EXIT_FAILURE); } switch (t[0]) { case 's': jwt_set_SET_STR(&jval, k, v); break; case 'i': jwt_set_SET_INT(&jval, k, strtol(v, NULL, 0)); break; case 'b': if (v[0] == 'f' || v[0] == 'F' || v[0] == '0') jwt_set_SET_BOOL(&jval, k, 0); else jwt_set_SET_BOOL(&jval, k, 1); break; default: usage("Invalid --claim format", EXIT_FAILURE); } if (jwt_builder_claim_set(builder, &jval)) { fprintf(stderr, "Error setting %s:%s=%s\n", t, k, v); exit(EXIT_FAILURE); } break; case 'j': json = optarg; break; case 'h': usage(NULL, EXIT_SUCCESS); default: /* '?' */ usage("Unknown argument", EXIT_FAILURE); } } argc -= optind; argv += optind; if (argc) usage("Unknown extra arguments", EXIT_FAILURE); if (key_file == NULL && alg != JWT_ALG_NONE) usage("An algorithm other than 'none' requires a key", EXIT_FAILURE); if (alg != JWT_ALG_NONE && key_file == NULL) usage("Algorithm requires --key", EXIT_FAILURE); jwt_builder_enable_iat(builder, emit_iat); if (key_file) { jwk_set = jwks_create_fromfile(key_file); if (jwk_set == NULL || jwks_error(jwk_set)) { fprintf(stderr, "ERR: Could not read JWK: %s\n", jwks_error_msg(jwk_set)); exit(EXIT_FAILURE); } /* Get the first key */ item = jwks_item_get(jwk_set, 0); if (jwks_item_error(item)) { fprintf(stderr, "ERR: Could not read JWK: %s\n", jwks_item_error_msg(item)); exit(EXIT_FAILURE); } if (jwks_item_alg(item) == JWT_ALG_NONE && alg == JWT_ALG_NONE) { usage("No \"alg\" attribute in key and --alg not given", EXIT_FAILURE); } if (jwt_builder_setkey(builder, alg, item)) { fprintf(stderr, "ERR Loading key: %s\n", jwt_builder_error_msg(builder)); exit(EXIT_FAILURE); } } if (json) { if (jwt_builder_claim_set(builder, jwt_set_SET_JSON(&jval, NULL, json))) { fprintf(stderr, "Error setting JSON (%d)\n", jval.error); exit(EXIT_FAILURE); } } if (verbose && jwt_builder_setcb(builder, __jwt_wcb, NULL)) { fprintf(stderr, "ERR setting callback: %s\n", jwt_builder_error_msg(builder)); exit(EXIT_FAILURE); } json_fp = stderr; if (item && !quiet) fprintf(stderr, "\xF0\x9F\x94\x91 \033[0;92m[KEY]\033[0m %s\n", key_file); if (!quiet) { fprintf(stderr, "\xF0\x9F\x93\x83 "); if (item && jwks_item_alg(item) != JWT_ALG_NONE) { fprintf(stderr, "\033[0;92m[ALG]\033[0m %s (from key)", jwt_alg_str(jwks_item_alg(item))); alg = jwks_item_alg(item); } else if (alg != JWT_ALG_NONE) { fprintf(stderr, "\033[0;92m[ALG]\033[0m %s (from options)", jwt_alg_str(alg)); } else { fprintf(stderr, "\033[0;91m[ALG]\033[0m %s", jwt_alg_str(alg)); } fprintf(stderr, "\n"); } token = jwt_builder_generate(builder); if (token == NULL) { fprintf(stderr, "ERR Generating Token: %s\n", jwt_builder_error_msg(builder)); exit(EXIT_FAILURE); } if (quiet) { printf("%s\n", token); } else { fprintf(stderr, "%s %s[TOK]\033[0m \n", alg == JWT_ALG_NONE ? "\xF0\x9F\x94\x93" : "\xF0\x9F\x94\x90", alg == JWT_ALG_NONE ? "\033[0;93m" : "\033[0;92m"); printf("%s\n", token); } free(token); return 0; } libjwt-3.3.3/tools/jwt-util.h000066400000000000000000000047501517612317300161170ustar00rootroot00000000000000/* Copyright (C) 2024-2025 maClara, LLC This file is part of the JWT C Library This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include static char *pipe_cmd; static FILE *json_fp; #ifdef _WIN32 #include #else #include #endif static inline int write_json(const char *title, const char *str) { int exit_code = 0; if (json_fp == NULL) json_fp = stdout; fprintf(json_fp, "\033[0;95m[%s]\033[0m\n", title); #ifdef _WIN32 FILE *pipe_fp = NULL; if (pipe_cmd) { pipe_fp = _popen(pipe_cmd, "w"); if (!pipe_fp) { perror("popen"); return -1; } } if (pipe_fp) { if (fwrite(str, 1, strlen(str), pipe_fp) < strlen(str)) { perror("fwrite"); exit_code = -1; } _pclose(pipe_fp); } #else int pipe_fd[2]; int myfd = 0; pid_t pid; int status; if (pipe_cmd) { char *argv[4] = { "/bin/sh", "-c", NULL, NULL }; if (pipe(pipe_fd)) { perror(pipe_cmd); exit(EXIT_FAILURE); } argv[2] = pipe_cmd; pid = fork(); if (pid == 0) { close(pipe_fd[1]); if (json_fp == stderr) dup2(STDERR_FILENO, STDOUT_FILENO); dup2(pipe_fd[0], STDIN_FILENO); close(pipe_fd[0]); execvp(argv[0], argv); perror("execvp"); exit(EXIT_FAILURE); } else { close(pipe_fd[0]); myfd = pipe_fd[1]; } } if (myfd) { if (write(myfd, str, strlen(str)) < 0) { perror(pipe_cmd); exit(EXIT_FAILURE); } } #endif else { fprintf(json_fp, "\033[0;96m%s\033[0m\n", str); } #ifndef _WIN32 if (myfd) { close(myfd); waitpid(pid, &status, 0); exit_code = WEXITSTATUS(status); } #endif return exit_code; } static inline int __jwt_wcb(jwt_t *jwt, jwt_config_t *config) { jwt_value_t jval; int ret = 0, result = 0; if (config == NULL) return 1; jwt_set_GET_JSON(&jval, NULL); jval.pretty = 1; ret = jwt_header_get(jwt, &jval); if (!ret) { result |= write_json("HEADER", jval.json_val); free(jval.json_val); } jwt_set_GET_JSON(&jval, NULL); jval.pretty = 1; ret = jwt_claim_get(jwt, &jval); if (!ret) { result |= write_json("PAYLOAD", jval.json_val); free(jval.json_val); } return result; } #ifdef _WIN32 __declspec(dllimport) extern char **__argv; static inline const char *get_progname(void) { return __argv[0]; } #else extern const char *__progname; static inline const char *get_progname(void) { return __progname; } #endif libjwt-3.3.3/tools/jwt-verify.1000066400000000000000000000064221517612317300163550ustar00rootroot00000000000000.\" Automatically generated by Pandoc 3.7.0.2 .\" .TH "JWT\-VERIFY" "1" "" "jwt\-verify User Manual" "LibJWT C Library" .SH NAME \f[B]jwt\-verify\f[R] \- Verify a JSON Web Token .SH SYNOPSIS .PP \f[B]jwt\-verify\f[R] \f[B][options]\f[R] \f[I]token\f[R] \&... .PD 0 .P .PD \f[B]jwt\-verify\f[R] \f[B][options]\f[R] \- < \f[I]token\f[R] .SH DESCRIPTION \f[B]jwt\-verify\f[R] Decodes and (optionally) verifies the signature of a JSON Web Token. .PP By default, the token(s) will be decoded and verified. If there is a signature block on the JWT, then you must give a JWK key with the \f[B]\-k\f[R] option. Verifying a signature requires specifying the algorithm, so it must either be in the key file (as the \f[B]alg\f[R] attribute), or passed on the command line with the \f[B]\-a\f[R] argument. .PP \f[B]jwt\-verify\f[R] will not assume the algorithm from the JWT itself (for security reasons), however, the algorithm in the JWT must match what you provide to \f[B]jwt\-verify\f[R]. .PP Tokens may be passed on the command line, after any options, separated by spaces, or passed via \f[B]stdin\f[R], one per line. To use \f[B]stdin\f[R], you must pass \f[B]\-\f[R] as the last and only argument after any options. .PP When using the \f[B]\-\-verbose\f[R] option, \f[B]jwt\-verify\f[R] will print the JSON \f[I]HEADER\f[R] and \f[I]PAYLOAD\f[R] to \f[B]stdout\f[R]. .PP If used in conjunction with \f[B]\-\-print\f[R], the JSON will be piped to the command\(cqs \f[B]stdin\f[R]. It will be called twice: once for \f[I]HEAD\f[R] and once for \f[I]PAYLOAD\f[R]. .PP One use is to pass it through \f[B]jq \-C\f[R] for indenting and colorization. Another would be to use an external program to validate the \f[I]PAYLOAD\f[R] contents. A non\-0 exit status from the program will cause verification to fail. .SS Options .TP \f[B]\-h\f[R], \f[B]\-\-help\f[R] Show common options and quit. .TP \f[B]\-l\f[R], \f[B]\-\-list\f[R] List all supported algorithms that can be passed to the \f[B]\-a\f[R] option and quit. .TP \f[B]\-v\f[R], \f[B]\-\-verbose\f[R] Show the contents of the \f[I]HEADER\f[R] and \f[I]PAYLOAD\f[R] of the JWT in addition to verifying the token. .TP \f[B]\-q\f[R], \f[B]\-\-quiet\f[R] Do not output anything except for hard errors. The exit value will be the number of token validation failures. .TP \f[B]\-a\f[R] \f[I]ALG\f[R], \f[B]\-\-algorithm\f[R]=\f[I]ALG\f[R] Specify the algorithm to be used when verifying the signature block of any tokens passed to the program. See \f[B]\-l\f[R] for values of \f[I]ALG\f[R]. .TP \f[B]\-k\f[R] \f[I]FILE\f[R], \f[B]\-\-key\f[R]=\f[I]FILE\f[R] Path to a file containing a key in JSON Web Key format. If your keys are in PEM or DER (or some other common format that \f[I]OpenSSL\f[R] understands), then you can convert it to a JWK with the \f[B]key2jwk(1)\f[R] tool. .TP \f[B]\-p\f[R] \f[I]CMD\f[R], \f[B]\-\-print\f[R]=\f[I]CMD\f[R] Pipe JSON of header and payload to \f[I]CMD\f[R] through its \f[B]stdin\f[R]. This option only makes sense with \f[B]\-\-verbose\f[R]. .SH BUGS See GitHub Issues: \c .UR https://github.com/benmcollins/libjwt/issues .UE \c .SH AUTHOR \f[B]jwt\-verify\f[R] was originally written by Jeremy Thien. Major rewriting and man page by Ben Collins \c .MT bcollins@libjwt.io .ME \c \&. .SH SEE ALSO \f[B]jwt\-generate(1)\f[R], \f[B]key2jwk(1)\f[R], \f[B]jwk2key(1)\f[R] libjwt-3.3.3/tools/jwt-verify.1.md000066400000000000000000000054121517612317300167520ustar00rootroot00000000000000% JWT-VERIFY(1) jwt-verify User Manual | LibJWT C Library # NAME **jwt-verify** - Verify a JSON Web Token # SYNOPSIS | **jwt-verify** **\[options]** _token_ ... | **jwt-verify** **\[options]** - < _token_ # DESCRIPTION **jwt-verify** Decodes and (optionally) verifies the signature of a JSON Web Token. By default, the token(s) will be decoded and verified. If there is a signature block on the JWT, then you must give a JWK key with the **-k** option. Verifying a signature requires specifying the algorithm, so it must either be in the key file (as the **alg** attribute), or passed on the command line with the **-a** argument. **jwt-verify** will not assume the algorithm from the JWT itself (for security reasons), however, the algorithm in the JWT must match what you provide to **jwt-verify**. Tokens may be passed on the command line, after any options, separated by spaces, or passed via **stdin**, one per line. To use **stdin**, you must pass **-** as the last and only argument after any options. When using the **\-\-verbose** option, **jwt-verify** will print the JSON _HEADER_ and _PAYLOAD_ to **stdout**. If used in conjunction with **\-\-print**, the JSON will be piped to the command's **stdin**. It will be called twice: once for _HEAD_ and once for _PAYLOAD_. One use is to pass it through **jq -C** for indenting and colorization. Another would be to use an external program to validate the _PAYLOAD_ contents. A non-0 exit status from the program will cause verification to fail. ## Options **\-h**, **\-\-help** ~ Show common options and quit. **\-l**, **\-\-list** ~ List all supported algorithms that can be passed to the **-a** option and quit. **\-v**, **\-\-verbose** ~ Show the contents of the _HEADER_ and _PAYLOAD_ of the JWT in addition to verifying the token. **\-q**, **\-\-quiet** ~ Do not output anything except for hard errors. The exit value will be the number of token validation failures. **\-a** _ALG_, **\-\-algorithm**=_ALG_ ~ Specify the algorithm to be used when verifying the signature block of any tokens passed to the program. See **-l** for values of _ALG_. **\-k** _FILE_, **\-\-key**=_FILE_ ~ Path to a file containing a key in JSON Web Key format. If your keys are in PEM or DER (or some other common format that _OpenSSL_ understands), then you can convert it to a JWK with the **key2jwk(1)** tool. **\-p** _CMD_, **\-\-print**=_CMD_ ~ Pipe JSON of header and payload to _CMD_ through its **stdin**. This option only makes sense with **\-\-verbose**. # BUGS See GitHub Issues: # AUTHOR **jwt-verify** was originally written by Jeremy Thien. Major rewriting and man page by Ben Collins . # SEE ALSO **jwt-generate(1)**, **key2jwk(1)**, **jwk2key(1)** libjwt-3.3.3/tools/jwt-verify.c000066400000000000000000000156641517612317300164470ustar00rootroot00000000000000/* Copyright (C) 2019 Jeremy Thien Copyright (C) 2024-2025 maClara, LLC This file is part of the JWT C Library This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include "jwt-util.h" _Noreturn static void usage(const char *error, int exit_state) { if (error) fprintf(stderr, "ERROR: %s\n\n", error); fprintf(stderr, "\ Usage: %1$s [OPTIONS] [token(s)]\n\ %1$s [OPTIONS] -\n\ \n\ Decode and (optionally) verify the signature for a JSON Web Token\n\ \n\ -h, --help This help information\n\ -l, --list List supported algorithms and exit\n\ -a, --algorithm=ALG JWT algorithm to use (e.g. ES256). Only needed if the key\n\ provided with -k does not have an \"alg\" attribute\n\ -p, --print=CMD When printing JSON, pipe through CMD\n\ -k, --key=FILE Filename containing a JSON Web Key\n\ -q, --quiet No output. Exit value is number of errors\n\ -v, --verbose Show decoded header and payload while verifying\n\ \nThis program will decode and validate each token on the command line.\n\ If - is given as the only argument to token, then tokens will be read\n\ from stdin, one per line.\n\ \n\ For the --print option, output will be piped to the command's stdin. This\n\ is useful if you wanted to use something like `jq -C` to colorize it or\n\ another program to validate it. The program will be called twice; once\n\ for the HEAD, and once for the PAYLOAD. A non-0 exit status will cause\n\ the verification to fail.\n\ \n\ If you need to convert a key to JWK (e.g. from PEM or DER format) see\n\ key2jwk(1).\n", get_progname()); exit(exit_state); } static void print_token_trunc(const char *str, size_t max_len) { size_t len = strlen(str); if (len <= max_len) { printf("%s\n", str); } else { size_t part_len = (max_len - 3) / 2; printf("%.*s...%.*s\n", (int)part_len, str, (int)part_len, str + len - part_len); } } static int process_one(jwt_checker_t *checker, jwt_alg_t alg, const char *token, int quiet) { int err = 0; if (!quiet) { printf("\n%s %s[TOK]\033[0m ", alg == JWT_ALG_NONE ? "\xF0\x9F\x94\x93" : "\xF0\x9F\x94\x90", alg == JWT_ALG_NONE ? "\033[0;93m" : "\033[0;92m"); print_token_trunc(token, 60); } if (jwt_checker_verify(checker, token)) { if (!quiet) { printf("\xF0\x9F\x91\x8E \033[0;91m[BAD]\033[0m %s\n", jwt_checker_error_msg(checker)); } err = 1; } else if (!quiet) { printf("\xF0\x9F\x91\x8D \033[0;92m[YES]\033[0m Verified\n"); } return err; } int main(int argc, char *argv[]) { jwt_checker_auto_t *checker = NULL; const char *key_file = NULL; jwt_alg_t alg = JWT_ALG_NONE; jwk_set_auto_t *jwk_set = NULL; const jwk_item_t *item = NULL; int oc, err, verbose = 0; int quiet = 0; char *optstr = "hk:alvqp:"; struct option opttbl[] = { { "help", no_argument, NULL, 'h' }, { "key", required_argument, NULL, 'k' }, { "algorithm", required_argument, NULL, 'a' }, { "print", required_argument, NULL, 'p' }, { "list", no_argument, NULL, 'l' }, { "quiet", no_argument, NULL, 'q' }, { "verbose", no_argument, NULL, 'v' }, { NULL, 0, 0, 0 }, }; checker = jwt_checker_new(); if (checker == NULL) { fprintf(stderr, "Could not allocate checker context\n"); exit(EXIT_FAILURE); } while ((oc = getopt_long(argc, argv, optstr, opttbl, NULL)) != -1) { switch (oc) { case 'h': usage(NULL, EXIT_SUCCESS); case 'l': printf("Algorithms supported:\n"); for (alg = JWT_ALG_NONE; alg < JWT_ALG_INVAL; alg++) printf(" %s\n", jwt_alg_str(alg)); exit(EXIT_SUCCESS); break; case 'p': pipe_cmd = optarg; break; case 'q': if (verbose) usage("Using -q and -v makes no sense", EXIT_FAILURE); quiet = 1; break; case 'v': if (quiet) usage("Using -q and -v makes no sense", EXIT_FAILURE); verbose = 1; break; case 'k': key_file = optarg; break; case 'a': alg = jwt_str_alg(optarg); if (alg >= JWT_ALG_INVAL) { fprintf(stderr, "Unknown algorithm [%s]\nUse " "-l to see a list of supported " "algorithms)\n", optarg); exit(EXIT_FAILURE); } break; default: /* '?' */ usage("Unknown option", EXIT_FAILURE); break; } } argc -= optind; argv += optind; if (argc == 0) usage("No token(s) given", EXIT_FAILURE); if (key_file == NULL && alg != JWT_ALG_NONE) usage("An algorithm other than 'none' requires a key", EXIT_FAILURE); /* Load JWK key */ if (key_file) { jwk_set = jwks_create_fromfile(key_file); if (jwk_set == NULL || jwks_error(jwk_set)) { fprintf(stderr, "ERR: Could not read JWK: %s\n", jwks_error_msg(jwk_set)); exit(EXIT_FAILURE); } /* Get the first key */ item = jwks_item_get(jwk_set, 0); if (jwks_item_error(item)) { fprintf(stderr, "ERR: Could not read JWK: %s\n", jwks_item_error_msg(item)); exit(EXIT_FAILURE); } if (jwks_item_alg(item) == JWT_ALG_NONE && alg == JWT_ALG_NONE) { usage("Key does not contain an \"alg\" attribute and no --alg given", EXIT_FAILURE); } if (jwt_checker_setkey(checker, alg, item)) { fprintf(stderr, "ERR Loading key: %s\n", jwt_checker_error_msg(checker)); exit(EXIT_FAILURE); } } if (verbose && jwt_checker_setcb(checker, __jwt_wcb, NULL)) { fprintf(stderr, "ERR setting callback: %s\n", jwt_checker_error_msg(checker)); exit(EXIT_FAILURE); } if (item && !quiet) { printf("\xF0\x9F\x94\x91 \033[0;92m[KEY]\033[0m %s\n", key_file); } if (!quiet) printf("\xF0\x9F\x93\x83 "); if (item && jwks_item_alg(item) != JWT_ALG_NONE) { if (!quiet) { printf("\033[0;92m[ALG]\033[0m %s (from key)", jwt_alg_str(jwks_item_alg(item))); } alg = jwks_item_alg(item); } else if (!quiet){ if (alg == JWT_ALG_NONE) printf("\033[0;91m[ALG]\033[0m %s (from options)", jwt_alg_str(alg)); else printf("\033[0;92m[ALG]\033[0m %s (from options)", jwt_alg_str(alg)); } if (!quiet) printf("\n"); err = 0; if (!strcmp(argv[0], "-")) { char token[BUFSIZ]; while (fgets(token, sizeof(token), stdin) != NULL) { token[strcspn(token, "\n")] = '\0'; err += process_one(checker, alg, token, quiet); } } else { for (oc = 0; oc < argc; oc++) { const char *token = argv[oc]; err += process_one(checker, alg, token, quiet); } } exit(err); } libjwt-3.3.3/tools/key2jwk.1000066400000000000000000000063451517612317300156410ustar00rootroot00000000000000.\" Automatically generated by Pandoc 3.1.11.1 .\" .TH "KEY2JWK" "1" "" "key2jwk User Manual" "LibJWT C Library" .SH NAME \f[B]key2jwk\f[R] \- Generate a JSON Web Key Set .SH SYNOPSIS .PP \f[B]key2jwk\f[R] \f[B][options]\f[R] [FILE]\&... .SH DESCRIPTION \f[B]key2jwk\f[R] Generates a JSON Web Key Set from one or more keys in PEM or DER format. .PP This program will parse PEM/DER key files (public and private) into JSON Web Keys and output a JWK Set. Note that HMAC keys are \f[I]guessed\f[R] based on them not being parsed by OpenSSL. This may cause some issues. You can disable this with the \f[B]\-m\f[R] option. .PP \f[I]HS256\f[R], \f[I]HS384\f[R], and \f[I]HS512\f[R] are assumed based on the key size and are expected to be a file with binary data. Using file size in bytes: .PP \f[I]\f[BI]HS256\f[I]\f[R]: size >= 32 AND size < 48 .PP \f[I]\f[BI]HS384\f[I]\f[R]: size >= 48 AND size < 64 .PP \f[I]\f[BI]HS512\f[I]\f[R]: size >= 64 .PP The \f[B]\-o\f[R] options is required for output. If the file exists, it will not be overwritten. You can use \f[B]\-\-output \-\f[R] to write to \f[I]stdout\f[R]. If you write to \f[I]stdout\f[R], all other messages will be written to \f[I]stderr\f[R]. .PP RSA keys will not have an algorithm set as they are valid for \f[I]RS256\f[R], \f[I]RS384\f[R], and \f[I]RS512\f[R], however, RSA\-PSS keys will be set to \f[I]PS256\f[R], since otherwise they will look no different than an RSA key. RSA keys must be at least 1024 bits. .PP Private keys will have \f[B]sign\f[R] added to the \f[B]key_ops\f[R] array while public keys will have the \f[B]use\f[R] attribute set to \f[B]sig\f[R]. .PP All keys will get a generated randomized uuidv4 \f[B]kid\f[R] attribute unless you use the \f[B]\-k\f[R] option. .PP Example output: .IP .EX $ key2jwk \-q \-o \- eddsa_key_ed25519.pem { \[dq]libjwt.io:comment\[dq]: \[dq]Generated by LibJWT 2.9.99\[dq], \[dq]libjwt.io:date\[dq]: \[dq]Sun Jan 12 23:50:24 2025\[dq], \[dq]libjwt.io:hostname\[dq]: \[dq]maClara.local\[dq], \[dq]keys\[dq]: [ { \[dq]key_ops\[dq]: [ \[dq]sign\[dq] ], \[dq]kid\[dq]: \[dq]d74a55b0\-631a\-4dfb\-8842\-cecfcb50e728\[dq], \[dq]kty\[dq]: \[dq]OKP\[dq], \[dq]crv\[dq]: \[dq]Ed25519\[dq], \[dq]alg\[dq]: \[dq]EdDSA\[dq], \[dq]d\[dq]: \[dq]XY5oUZqGWVZhX7J09hG\-rRnAKXiw1g_aBh\-Bc52KZ_Y\[dq] } ] } .EE .SS Options .TP \f[B]\-h\f[R], \f[B]\-\-help\f[R] Show common options and quit. .TP \f[B]\-l\f[R], \f[B]\-\-list\f[R] List all supported algorithms that can be passed to the \f[B]\-a\f[R] option and quit. .TP \f[B]\-q\f[R], \f[B]\-\-quiet\f[R] Do not output anything except for hard errors (and the JWKS). .TP \f[B]\-k\f[R], \f[B]\-\-disable\-kid\f[R] Disable generating \f[B]kid\f[R] attribute. .TP \f[B]\-m\f[R], \f[B]\-\-disable\-hmac\f[R] Disable falling back to HAMC for key files that OpenSSL cannot read. .TP \f[B]\-o\f[R] \f[I]FILE\f[R], \f[B]\-\-output\f[R]=\f[I]FILE\f[R] Use \f[I]FILE\f[R] to write the JWKS. Use \f[B]\-\f[R] to write to stdout. .SH BUGS See GitHub Issues: \c .UR https://github.com/benmcollins/libjwt/issues .UE \c .SH AUTHOR \f[B]key2jwk\f[R] written by Ben Collins \c .MT bcollins@libjwt.io .ME \c \&. .SH SEE ALSO \f[B]jwt\-verify(1)\f[R], \f[B]jwt\-generate(1)\f[R], \f[B]jwk2key(1)\f[R] libjwt-3.3.3/tools/key2jwk.1.md000066400000000000000000000052521517612317300162340ustar00rootroot00000000000000% KEY2JWK(1) key2jwk User Manual | LibJWT C Library # NAME **key2jwk** - Generate a JSON Web Key Set # SYNOPSIS | **key2jwk** **\[options]** \ [FILE]... # DESCRIPTION **key2jwk** Generates a JSON Web Key Set from one or more keys in PEM or DER format. This program will parse PEM/DER key files (public and private) into JSON Web Keys and output a JWK Set. Note that HMAC keys are *guessed* based on them not being parsed by OpenSSL. This may cause some issues. You can disable this with the **-m** option. _HS256_, _HS384_, and _HS512_ are assumed based on the key size and are expected to be a file with binary data. Using file size in bytes: _**HS256**_: size >= 32 AND size < 48 _**HS384**_: size >= 48 AND size < 64 _**HS512**_: size >= 64 The **-o** options is required for output. If the file exists, it will not be overwritten. You can use **\-\-output -** to write to _stdout_. If you write to _stdout_, all other messages will be written to _stderr_. RSA keys will not have an algorithm set as they are valid for _RS256_, _RS384_, and _RS512_, however, RSA-PSS keys will be set to _PS256_, since otherwise they will look no different than an RSA key. RSA keys must be at least 1024 bits. Private keys will have **sign** added to the **key_ops** array while public keys will have the **use** attribute set to **sig**. All keys will get a generated randomized uuidv4 **kid** attribute unless you use the **-k** option. Example output: $ key2jwk -q -o - eddsa_key_ed25519.pem { "libjwt.io:comment": "Generated by LibJWT 2.9.99", "libjwt.io:date": "Sun Jan 12 23:50:24 2025", "libjwt.io:hostname": "maClara.local", "keys": [ { "key_ops": [ "sign" ], "kid": "d74a55b0-631a-4dfb-8842-cecfcb50e728", "kty": "OKP", "crv": "Ed25519", "alg": "EdDSA", "d": "XY5oUZqGWVZhX7J09hG-rRnAKXiw1g_aBh-Bc52KZ_Y" } ] } ## Options **\-h**, **\-\-help** ~ Show common options and quit. **\-l**, **\-\-list** ~ List all supported algorithms that can be passed to the **-a** option and quit. **\-q**, **\-\-quiet** ~ Do not output anything except for hard errors (and the JWKS). **\-k**, **\-\-disable-kid** ~ Disable generating **kid** attribute. **\-m**, **\-\-disable-hmac** ~ Disable falling back to HAMC for key files that OpenSSL cannot read. **\-o** _FILE_, **\-\-output**=_FILE_ ~ Use _FILE_ to write the JWKS. Use **-** to write to stdout. # BUGS See GitHub Issues: # AUTHOR **key2jwk** written by Ben Collins . # SEE ALSO **jwt-verify(1)**, **jwt-generate(1)**, **jwk2key(1)** libjwt-3.3.3/tools/key2jwk.c000066400000000000000000000313771517612317300157260ustar00rootroot00000000000000/* Copyright (C) 2024-2025 maClara, LLC This file is part of the JWT C Library SPDX-License-Identifier: MPL-2.0 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* XXX BIG FAT WARNING: There's not much error checking here. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "jwt-util.h" /* We make use of some LibJWT internals. Soon, this code will move into LibJWT * so it can be used to important PEM/DER keys into a JWK keyring. Until then, * we hack around it here. */ #include "jwt-private.h" static int ec_count, rsa_count, eddsa_count, rsa_pss_count, hmac_count; static void print_openssl_errors_and_exit() { ERR_print_errors_fp(stderr); exit(EXIT_FAILURE); } static int with_kid = 1; static int do_not_assume_hmac = 0; static const char *uuidv4(void) { uint8_t uuid_bytes[16]; static char uuid[37]; // Generate 16 random bytes if (RAND_bytes(uuid_bytes, sizeof(uuid_bytes)) != 1) { fprintf(stderr, "Error: Failed to generate random bytes.\n"); return NULL; } // Set the version to 4 (0100 in binary) uuid_bytes[6] = (uuid_bytes[6] & 0x0F) | 0x40; // Set the variant to RFC 4122 (10xx in binary) uuid_bytes[8] = (uuid_bytes[8] & 0x3F) | 0x80; // Format the UUID as a string snprintf(uuid, sizeof(uuid), "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", uuid_bytes[0], uuid_bytes[1], uuid_bytes[2], uuid_bytes[3], uuid_bytes[4], uuid_bytes[5], uuid_bytes[6], uuid_bytes[7], uuid_bytes[8], uuid_bytes[9], uuid_bytes[10], uuid_bytes[11], uuid_bytes[12], uuid_bytes[13], uuid_bytes[14], uuid_bytes[15]); return uuid; } /* Set the alg and crv for an EC key */ static void ec_alg_type(EVP_PKEY *pkey, char crv[32], char alg[32]) { char __named_crv[32]; char *__alg = NULL, *__crv = NULL; size_t bits; crv[0] = alg[0] = '\0'; EVP_PKEY_get_size_t_param(pkey, OSSL_PKEY_PARAM_BITS, &bits); EVP_PKEY_get_group_name(pkey, __named_crv, sizeof(__named_crv), NULL); switch (bits) { case 256: if (!strcmp(__named_crv, "secp256k1")) { __alg = "ES256K"; __crv = "secp256k1"; } else { __alg = "ES256"; __crv = "P-256"; } break; case 384: __alg = "ES384"; __crv = "P-384"; break; case 521: __alg = "ES512"; __crv = "P-521"; break; } if (!__alg || !__crv) { fprintf(stderr, "EC: Unknown curve %s with %d bits\n", __named_crv, (int)bits); return; } strcpy(crv, __crv); strcpy(alg, __alg); } /* Retrieves and b64url-encodes a single OSSL BIGNUM param and adds it to * the JSON object as a string. */ static void get_one_bn(EVP_PKEY *pkey, const char *ossl_param, jwt_json_t *jwk, const char *name) { /* Get param */ BIGNUM *bn = NULL; if (!EVP_PKEY_get_bn_param(pkey, ossl_param, &bn) || bn == NULL) return; /* Extract data */ int len = BN_num_bytes(bn); unsigned char *bin = OPENSSL_malloc(len); if (bin == NULL) { BN_free(bn); return; } BN_bn2bin(bn, bin); BN_free(bn); /* Encode */ char *b64; jwt_base64uri_encode(&b64, (char *)bin, len); OPENSSL_free(bin); jwt_json_obj_set(jwk, name, jwt_json_create_str(b64)); jwt_freemem(b64); } /* Retrieves and b64url-encodes a single OSSL octet param and adds it to * the JSON object as a string. */ static void get_one_octet(EVP_PKEY *pkey, const char *ossl_param, jwt_json_t *jwk, const char *name) { unsigned char buf[256]; size_t len = 0; if (!EVP_PKEY_get_octet_string_param(pkey, ossl_param, buf, sizeof(buf), &len) || len == 0) return; char *b64; jwt_base64uri_encode(&b64, (char *)buf, len); OPENSSL_cleanse(buf, len); jwt_json_obj_set(jwk, name, jwt_json_create_str(b64)); jwt_freemem(b64); } /* For ECC Keys (ES256, ES384, ES512) */ static void process_ec_key(EVP_PKEY *pkey, int priv, jwt_json_t *jwk) { char alg_type[32], crv[32]; ec_alg_type(pkey, crv, alg_type); jwt_json_obj_set(jwk, "alg", jwt_json_create_str(alg_type)); jwt_json_obj_set(jwk, "crv", jwt_json_create_str(crv)); get_one_bn(pkey, OSSL_PKEY_PARAM_EC_PUB_X, jwk, "x"); get_one_bn(pkey, OSSL_PKEY_PARAM_EC_PUB_Y, jwk, "y"); if (priv) get_one_bn(pkey, OSSL_PKEY_PARAM_PRIV_KEY, jwk, "d"); } /* For EdDSA keys */ static void process_eddsa_key(EVP_PKEY *pkey, int priv, jwt_json_t *jwk) { if (priv) get_one_octet(pkey, OSSL_PKEY_PARAM_PRIV_KEY, jwk, "d"); else get_one_octet(pkey, OSSL_PKEY_PARAM_PUB_KEY, jwk, "x"); } /* For RSA keys (RS256, RS384, RS512). Also works for RSA-PSS * (PS256, PS384, PS512) */ static void process_rsa_key(EVP_PKEY *pkey, int priv, jwt_json_t *jwk) { get_one_bn(pkey, OSSL_PKEY_PARAM_RSA_N, jwk, "n"); get_one_bn(pkey, OSSL_PKEY_PARAM_RSA_E, jwk, "e"); if (!priv) return; get_one_bn(pkey, OSSL_PKEY_PARAM_RSA_D, jwk, "d"); get_one_bn(pkey, OSSL_PKEY_PARAM_RSA_FACTOR1, jwk, "p"); get_one_bn(pkey, OSSL_PKEY_PARAM_RSA_FACTOR2, jwk, "q"); get_one_bn(pkey, OSSL_PKEY_PARAM_RSA_EXPONENT1, jwk, "dp"); get_one_bn(pkey, OSSL_PKEY_PARAM_RSA_EXPONENT2, jwk, "dq"); get_one_bn(pkey, OSSL_PKEY_PARAM_RSA_COEFFICIENT1, jwk, "qi"); } static void process_hmac_key(jwt_json_t *jwk, const unsigned char *key, size_t len) { char *b64; jwt_json_obj_set(jwk, "kty", jwt_json_create_str("oct")); jwt_base64uri_encode(&b64, (char *)key, len); jwt_json_obj_set(jwk, "k", jwt_json_create_str(b64)); jwt_freemem(b64); if (len >= 32 && len < 48) jwt_json_obj_set(jwk, "alg", jwt_json_create_str("HS256")); else if (len >= 48 && len < 64) jwt_json_obj_set(jwk, "alg", jwt_json_create_str("HS384")); else if (len >= 64) jwt_json_obj_set(jwk, "alg", jwt_json_create_str("HS512")); hmac_count++; } static jwt_json_t *parse_one_file(const char *file) { int priv = 0; FILE *fp; EVP_PKEY *pkey; jwt_json_t *jwk, *ops; size_t len = 0; unsigned char file_buf[BUFSIZ]; fp = fopen(file, "r"); if (!fp) { perror("Error opening file"); exit(EXIT_FAILURE); } /* Try public key first */ pkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL); if (pkey == NULL) { /* Retry with private key type */ rewind(fp); pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL); priv = 1; } if (pkey == NULL) { /* Check length to see if it can be HMAC */ fseek(fp, 0, SEEK_END); len = ftell(fp); if (do_not_assume_hmac || len < 32 || len > sizeof(file_buf)) { fprintf(stderr, "Error parsing key file\n"); print_openssl_errors_and_exit(); } rewind(fp); len = fread(file_buf, 1, len, fp); priv = 1; } fclose(fp); /* Setup json object */ jwk = jwt_json_create(); if (!priv) { /* Key use */ jwt_json_obj_set(jwk, "use", jwt_json_create_str("sig")); } else { /* Key ops */ ops = jwt_json_create_arr(); jwt_json_arr_append(ops, jwt_json_create_str("sign")); jwt_json_obj_set(jwk, "key_ops", ops); } /* Use uuidv4 for "kid" */ if (with_kid) jwt_json_obj_set(jwk, "kid", jwt_json_create_str(uuidv4())); if (len) { process_hmac_key(jwk, file_buf, len); OPENSSL_cleanse(file_buf, len); return jwk; } /* Process per key type params */ switch (EVP_PKEY_get_base_id(pkey)) { case EVP_PKEY_RSA: jwt_json_obj_set(jwk, "kty", jwt_json_create_str("RSA")); process_rsa_key(pkey, priv, jwk); rsa_count++; break; case EVP_PKEY_EC: jwt_json_obj_set(jwk, "kty", jwt_json_create_str("EC")); process_ec_key(pkey, priv, jwk); ec_count++; break; case EVP_PKEY_ED25519: jwt_json_obj_set(jwk, "kty", jwt_json_create_str("OKP")); jwt_json_obj_set(jwk, "crv", jwt_json_create_str("Ed25519")); jwt_json_obj_set(jwk, "alg", jwt_json_create_str("EdDSA")); process_eddsa_key(pkey, priv, jwk); eddsa_count++; break; case EVP_PKEY_ED448: jwt_json_obj_set(jwk, "kty", jwt_json_create_str("OKP")); jwt_json_obj_set(jwk, "crv", jwt_json_create_str("Ed448")); jwt_json_obj_set(jwk, "alg", jwt_json_create_str("EdDSA")); process_eddsa_key(pkey, priv, jwk); eddsa_count++; break; case EVP_PKEY_RSA_PSS: /* XXX We need a way to designate this for PS alg only ??? * For now, default to PS256. */ jwt_json_obj_set(jwk, "kty", jwt_json_create_str("RSA")); jwt_json_obj_set(jwk, "alg", jwt_json_create_str("PS256")); process_rsa_key(pkey, priv, jwk); rsa_pss_count++; break; default: fprintf(stderr, "Skipped unknown key type: %s\n", file); } EVP_PKEY_free(pkey); return jwk; } _Noreturn static void usage(const char *error, int exit_state) { if (error) fprintf(stderr, "ERROR: %s\n\n", error); fprintf(stderr, "\ Usage: %s [OPTIONS] [FILE]...\n\ \n\ Parse PEM/DER file(s) into JSON Web Key format.\n\ \n\ -h, --help This help information\n\ -q, --quiet No output other than JWKS file\n\ -l, --list List supported algorithms and exit\n\ -k, --disable-kid Disable generating \"kid\" attribute\n\ -m, --disable-hmac Disable fallback to HMAC\n\ -o, --output=FILE File to write JWKS to\n\ \n\ This program will parse PEM/DER key files (public and private) into JSON Web\n\ Keys and output a JWK Set. Note that HMAC keys are \"guessed\" based on them\n\ not being parsed by OpenSSL. This may cause some issues. You can disable\n\ this with the -m option.\n\ \n\ You can use '-' as the argument to the -o option to write to stdout.\n\ \n\ RSA keys will not have an algorithm set as they are valid for RS256, RS384,\n\ and RS512. RSA keys must be at least 1024 bits.\n\ \n\ RSA-PSS keys will be set to PS256, otherwise they will look no different\n\ than an RSA key.\n\ \n\ All keys will get a generated randomized uuidv4 \"kid\" attribute unless you\n\ use the -k option..\n", get_progname()); exit(exit_state); } int main(int argc, char **argv) { jwt_json_t *jwk_set, *jwk_array, *jwk; time_t now; char *time_str; char comment[256]; jwt_alg_t alg; int quiet = 0; char *jwk_str; FILE *outfp = NULL; FILE *msg = stdout; int i, oc; char *optstr = "hlqo:km"; struct option opttbl[] = { { "help", no_argument, NULL, 'h' }, { "list", no_argument, NULL, 'l' }, { "quiet", no_argument, NULL, 'q' }, { "output", required_argument, NULL, 'o' }, { "disable-kid", no_argument, NULL, 'k' }, { "disable-hmac", no_argument, NULL, 'm' }, { NULL, 0, 0, 0 }, }; while ((oc = getopt_long(argc, argv, optstr, opttbl, NULL)) != -1) { switch (oc) { case 'h': usage(NULL, EXIT_SUCCESS); case 'l': printf("Algorithms supported:\n"); for (alg = JWT_ALG_NONE; alg < JWT_ALG_INVAL; alg++) printf(" %s\n", jwt_alg_str(alg)); exit(EXIT_SUCCESS); break; case 'q': quiet = 1; break; case 'k': with_kid = 0; break; case 'm': do_not_assume_hmac = 1; break; case 'o': if (optarg[0] == '-') { outfp = stdout; msg = stderr; } else { outfp = fopen(optarg, "wx"); if (outfp == NULL) perror(optarg); } break; default: /* '?' */ usage("Unknown option", EXIT_FAILURE); break; } } argc -= optind; argv += optind; if (argc == 0) usage("No key(s) given", EXIT_FAILURE); if (outfp == NULL) usage("The --output argument is required", EXIT_FAILURE); if (!quiet) fprintf(msg, "Parsing %d files (", argc); jwk_array = jwt_json_create_arr(); for (i = 0; i < argc; i++) { jwk = parse_one_file(argv[i]); jwt_json_arr_append(jwk_array, jwk); if (!quiet) fprintf(msg, "."); } if (!quiet) { fprintf(msg, ") done\n"); fprintf(msg, "Parse results:\n"); if (ec_count) fprintf(msg, " EC : %d\n", ec_count); if (rsa_count) fprintf(msg, " RSA : %d\n", rsa_count); if (rsa_pss_count) fprintf(msg, " RSA-PSS: %d\n", rsa_pss_count); if (eddsa_count) fprintf(msg, " EdDSA : %d\n", eddsa_count); if (hmac_count) fprintf(msg, " HMAC : %d\n", hmac_count); fprintf(msg, "\n"); fprintf(msg, "Generating JWKS...\n"); } jwk_set = jwt_json_create(); snprintf(comment, sizeof(comment), "Generated by LibJWT %s", JWT_VERSION_STRING); comment[sizeof(comment) - 1] = '\0'; jwt_json_obj_set(jwk_set, "libjwt.io:comment", jwt_json_create_str(comment)); now = time(NULL); time_str = ctime(&now); time_str[strlen(time_str) - 1] = '\0'; jwt_json_obj_set(jwk_set, "libjwt.io:date", jwt_json_create_str(time_str)); #ifdef _WIN32 DWORD hostnamesize = sizeof(comment); GetComputerNameA(comment, &hostnamesize); #else gethostname(comment, sizeof(comment)); #endif comment[sizeof(comment) - 1] = '\0'; jwt_json_obj_set(jwk_set, "libjwt.io:hostname", jwt_json_create_str(comment)); jwt_json_obj_set(jwk_set, "keys", jwk_array); jwk_str = jwt_json_serialize(jwk_set, JWT_JSON_INDENT(2)); fprintf(outfp, "%s\n", jwk_str); jwt_freemem(jwk_str); exit(EXIT_SUCCESS); }